diff --git a/.gitignore b/.gitignore index eb24d72701..c3af907e97 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,8 @@ AssetProcessorTemp/** [Cc]ache/ Editor/EditorEventLog.xml Editor/EditorLayout.xml -Tools/**/*egg-info/** -Tools/**/*egg-link +**/*egg-info/** +**/*egg-link UserSettings.xml [Uu]ser/ FrameCapture/** diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py index 80f83b26e2..7ed47d0b58 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterCapsuleDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def CapsuleDamage(target_id, position0): position1 = azlmbr.object.construct('Vector3', position0.x + 1.0, position0.y, position0.z) @@ -30,4 +30,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterCapsuleDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py index d141cd3ce1..a75aae21f0 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def run(): +def ActorSplitsAfterCollision(): """ Summary: @@ -54,14 +54,14 @@ def run(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 - from Utils import CollisionHandler - from Utils import BlastNotificationHandler + from BlastUtils import CollisionHandler + from BlastUtils import BlastNotificationHandler # Constants TIMEOUT = 2.0 @@ -107,4 +107,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterCollision) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py index e991daebcd..d71f17c958 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def run(damage_func): +def base_run(damage_func): """ Summary: @@ -50,13 +50,13 @@ def run(damage_func): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 - from Utils import BlastNotificationHandler + from BlastUtils import BlastNotificationHandler # Constants TIMEOUT = 2.0 diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py index 9139fe02b1..e2783ef605 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterImpactSpreadDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def ImpactSpreadDamage(target_id, position): azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Impact Spread Damage", target_id, @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterImpactSpreadDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py index 77b942e95c..f89a322bec 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterRadialDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def RadialDamage(target_id, position): azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Radial Damage", target_id, @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterRadialDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py index 404e655d36..5d2b6db1f3 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterShearDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def ShearDamage(target_id, position): normal = azlmbr.object.construct('Vector3', 1.0, 0.0, 0.0) @@ -29,4 +29,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterShearDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py index be002d5451..bfbbde259a 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterStressDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def StressDamage(target_id, position): force = azlmbr.object.construct('Vector3', 0.0, 0.0, -100.0) # Should be enough to break `brittle` objects @@ -28,4 +28,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterStressDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py index 4635d67455..e8f44bbc77 100755 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py @@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from ActorSplitsAfterDamage import Tests -def run(): - from ActorSplitsAfterDamage import run as internal_run - from Utils import Constants +def ActorSplitsAfterTriangleDamage(): + from ActorSplitsAfterDamage import base_run as internal_run + from BlastUtils import Constants def TriangleDamage(target_id, position): # Some points that form a triangle that contains the given position @@ -32,4 +32,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(ActorSplitsAfterTriangleDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/Utils.py b/AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/Blast/Utils.py rename to AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt index c527aea98c..d31ea6334c 100644 --- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt @@ -16,39 +16,53 @@ ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) add_subdirectory(assetpipeline) +add_subdirectory(atom_renderer) ## Physics ## -# DISABLED - see LYN-2536 -#if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) -# ly_add_pytest( -# NAME AutomatedTesting::PhysicsTests -# TEST_SUITE main -# TEST_SERIAL -# PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Active.py -# TIMEOUT 3600 -# RUNTIME_DEPENDENCIES -# Legacy::Editor -# Legacy::CryRenderNULL -# AZ::AssetProcessor -# AutomatedTesting.Assets -# COMPONENT -# Physics -# ) -# ly_add_pytest( -# NAME AutomatedTesting::PhysicsTests_Sandbox -# TEST_SUITE sandbox -# TEST_SERIAL -# PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Sandbox.py -# TIMEOUT 3600 -# RUNTIME_DEPENDENCIES -# Legacy::Editor -# Legacy::CryRenderNULL -# AZ::AssetProcessor -# AutomatedTesting.Assets -# COMPONENT -# Physics -# ) -#endif() +if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) + ly_add_pytest( + NAME AutomatedTesting::PhysicsTests_Main + TEST_SUITE main + TEST_SERIAL + PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Main.py + TIMEOUT 3600 + RUNTIME_DEPENDENCIES + Legacy::Editor + Legacy::CryRenderNULL + AZ::AssetProcessor + AutomatedTesting.Assets + COMPONENT + Physics + ) + ly_add_pytest( + NAME AutomatedTesting::PhysicsTests_Periodic + TEST_SUITE periodic + TEST_SERIAL + PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Periodic.py + TIMEOUT 3600 + RUNTIME_DEPENDENCIES + Legacy::Editor + Legacy::CryRenderNULL + AZ::AssetProcessor + AutomatedTesting.Assets + COMPONENT + Physics + ) + ly_add_pytest( + NAME AutomatedTesting::PhysicsTests_Sandbox + TEST_SUITE sandbox + TEST_SERIAL + PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Sandbox.py + TIMEOUT 3600 + RUNTIME_DEPENDENCIES + Legacy::Editor + Legacy::CryRenderNULL + AZ::AssetProcessor + AutomatedTesting.Assets + COMPONENT + Physics + ) +endif() ## ScriptCanvas ## if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) @@ -81,23 +95,22 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) endif() ## White Box ## -# DISABLED - See LYN-2663 -#if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) -# ly_add_pytest( -# NAME AutomatedTesting::WhiteBoxTests -# TEST_SUITE main -# TEST_SERIAL -# PATH ${CMAKE_CURRENT_LIST_DIR}/WhiteBox/TestSuite_Active.py -# TIMEOUT 3600 -# RUNTIME_DEPENDENCIES -# Legacy::Editor -# Legacy::CryRenderNULL -# AZ::AssetProcessor -# AutomatedTesting.Assets -# COMPONENT -# WhiteBox -# ) -#endif() +if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) + ly_add_pytest( + NAME AutomatedTesting::WhiteBoxTests + TEST_SUITE main + TEST_SERIAL + PATH ${CMAKE_CURRENT_LIST_DIR}/WhiteBox/TestSuite_Active.py + TIMEOUT 3600 + RUNTIME_DEPENDENCIES + Legacy::Editor + Legacy::CryRenderNULL + AZ::AssetProcessor + AutomatedTesting.Assets + COMPONENT + WhiteBox + ) +endif() ## NvCloth ## # [TODO LYN-1928] Enable when AutomatedTesting runs with Atom @@ -157,7 +170,7 @@ endif() if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_pytest( NAME AutomatedTesting::BlastTests - TEST_SUITE sandbox + TEST_SUITE main TEST_SERIAL TRUE PATH ${CMAKE_CURRENT_LIST_DIR}/Blast/TestSuite_Active.py TIMEOUT 3600 @@ -165,6 +178,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) Legacy::Editor AZ::AssetProcessor AutomatedTesting.Assets + COMPONENT Blast ) endif() @@ -177,8 +191,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ## DynVeg ## ly_add_pytest( - NAME DynamicVegetationTests_Main_GPU - TEST_REQUIRES gpu + NAME AutomatedTesting::DynamicVegetationTests_Main TEST_SERIAL TEST_SUITE main PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg @@ -194,8 +207,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ) ly_add_pytest( - NAME DynamicVegetationTests_Sandbox_GPU - TEST_REQUIRES gpu + NAME AutomatedTesting::DynamicVegetationTests_Sandbox TEST_SERIAL TEST_SUITE sandbox PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg @@ -211,8 +223,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ) ly_add_pytest( - NAME DynamicVegetationTests_Periodic_GPU - TEST_REQUIRES gpu + NAME AutomatedTesting::DynamicVegetationTests_Periodic TEST_SERIAL TEST_SUITE periodic PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg @@ -228,8 +239,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ## LandscapeCanvas ## ly_add_pytest( - NAME LandscapeCanvasTests_Main - TEST_REQUIRES gpu + NAME AutomatedTesting::LandscapeCanvasTests_Main TEST_SERIAL TEST_SUITE main PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas @@ -244,8 +254,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ) ly_add_pytest( - NAME LandscapeCanvasTests_Periodic - TEST_REQUIRES gpu + NAME AutomatedTesting::LandscapeCanvasTests_Periodic TEST_SERIAL TEST_SUITE periodic PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas @@ -261,8 +270,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ ## GradientSignal ## ly_add_pytest( - NAME GradientSignalTests_Periodic - TEST_REQUIRES gpu + NAME AutomatedTesting::GradientSignalTests_Periodic TEST_SERIAL TEST_SUITE periodic PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/gradient_signal @@ -280,7 +288,7 @@ endif() ## Editor ## if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_FOUNDATION_TEST_SUPPORTED) ly_add_pytest( - NAME EditorTests_Periodic + NAME AutomatedTesting::EditorTests_Periodic TEST_SUITE periodic TEST_SERIAL PATH ${CMAKE_CURRENT_LIST_DIR}/editor @@ -298,7 +306,7 @@ endif() if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) # Unstable, SPEC-3838 will restore #ly_add_pytest( - # NAME asset_load_benchmark_test + # NAME AutomatedTesting::asset_load_benchmark_test # TEST_SERIAL # TEST_SUITE benchmark # PATH ${CMAKE_CURRENT_LIST_DIR}/streaming/benchmark/asset_load_benchmark_test.py diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentUpdateListProperty_test.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentUpdateListProperty_test.py index 3ac4832428..9ab83a0723 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentUpdateListProperty_test.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentUpdateListProperty_test.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_legacy_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_legacy_test_case.py index 9bb9ba5337..9160530ba4 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_legacy_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_legacy_test_case.py @@ -27,15 +27,6 @@ def testing_cvar(setMethod, methodName, label, value, compare): print('{} failed'.format(methodName)) -def testing_edit_mode(mode): - general.set_edit_mode(mode) - - if (general.get_edit_mode(mode)): - return True - - return False - - def testing_axis_constraints(constraint): general.set_axis_constraint(constraint) @@ -58,15 +49,6 @@ compare = lambda lhs, rhs: rhs == int(lhs) testing_cvar(general.set_cvar_integer, 'set_cvar_integer', 'sys_LocalMemoryGeometryLimit', 33, compare) -# ----- Test Edit Mode - -if (testing_edit_mode("SELECT") and testing_edit_mode('SELECTAREA') and - testing_edit_mode("MOVE") and testing_edit_mode("ROTATE") and - testing_edit_mode("SCALE") and testing_edit_mode("TOOL")): - - print("edit mode works") - - # ----- Test Axis Constraints if (testing_axis_constraints("X") and testing_axis_constraints("Y") and diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test.py index 6261312814..bc258cce3f 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test.py @@ -33,7 +33,6 @@ class TestEditorAutomation(object): "SetCVarFromFloat worked", "SetCVarFromString worked", "SetCVarFromInteger worked", - "edit mode works", "axis constraint works", "end of editor utility tests" ] @@ -48,7 +47,6 @@ class TestEditorAutomation(object): "set_cvar_float worked", "set_cvar_string worked", "set_cvar_integer worked", - "edit mode works", "axis constraint works", "end of editor utility tests" ] diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test_case.py index bae7da19b0..91dd883a10 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EditorUtilityCommands_test_case.py @@ -28,15 +28,6 @@ def testing_cvar(setMethod, methodName, label, value, compare): print('{} failed'.format(methodName)) -def testing_edit_mode(mode): - python_editor_funcs.PythonEditorBus(bus.Broadcast, 'SetEditMode', mode) - - if mode == python_editor_funcs.PythonEditorBus(bus.Broadcast, 'GetEditMode'): - return True - - return False - - def testing_axis_constraints(constraint): python_editor_funcs.PythonEditorBus(bus.Broadcast, 'SetAxisConstraint', constraint) @@ -57,13 +48,6 @@ testing_cvar('SetCVarFromString', 'SetCVarFromString', 'e_ScreenShotFileFormat', compare = lambda lhs, rhs: rhs == int(lhs) testing_cvar('SetCVarFromInteger', 'SetCVarFromInteger', 'sys_LocalMemoryGeometryLimit', 33, compare) -# ----- Test Edit Mode - -if (testing_edit_mode("SELECT") and testing_edit_mode('SELECTAREA') and - testing_edit_mode("MOVE") and testing_edit_mode("ROTATE") and - testing_edit_mode("SCALE") and testing_edit_mode("TOOL")): - print("edit mode works") - # ----- Test Axis Constraints if (testing_axis_constraints("X") and testing_axis_constraints("Y") and diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py index 8aba60e8e9..ed1c048fa6 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py @@ -25,7 +25,7 @@ import azlmbr.bus as bus import azlmbr.entity as entity import azlmbr.editor as editor import azlmbr.legacy.general as general -import pyside_component_utils +import editor_python_test_tools.pyside_component_utils as pysde_component_utils def PySide_Example_test_case(): diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/README.txt b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/README.txt new file mode 100644 index 0000000000..b7c6730faf --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/README.txt @@ -0,0 +1,46 @@ +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + + +INTRODUCTION +------------ + +EditorPythonBindings is a Python project that contains a collection of editor testing tools +developed by the Lumberyard feature teams. The project contains tools for system level +editor tests. + + +REQUIREMENTS +------------ + + * Python 3.7.5 (64-bit) + +It is recommended that you completely remove any other versions of Python +installed on your system. + + +INSTALL +----------- +It is recommended to set up these these tools with Lumberyard's CMake build commands. +Assuming CMake is already setup on your operating system, below are some sample build commands: + cd /path/to/od3e/ + mkdir windows_vs2019 + cd windows_vs2019 + cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DLY_3RDPARTY_PATH="%3RDPARTYPATH%" -DLY_PROJECTS=AutomatedTesting + +To manually install the project in development mode using your own installed Python interpreter: + cd /path/to/od3e/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools + /path/to/your/python -m pip install -e . + + +UNINSTALLATION +-------------- + +The preferred way to uninstall the project is: + /path/to/your/python -m pip uninstall editor_python_test_tools diff --git a/ctest_scripts/result_processing/__init__.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from ctest_scripts/result_processing/__init__.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/__init__.py diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/__init__.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/__init__.py new file mode 100644 index 0000000000..6ed3dc4bda --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/__init__.py @@ -0,0 +1,10 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_entity_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_entity_utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py index 3e009563b8..4dc71bf16b --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_entity_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py @@ -13,8 +13,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. from __future__ import annotations from typing import List, Tuple, Union -# Helper file Imports -import utils # Open 3D Engine Imports import azlmbr @@ -23,6 +21,8 @@ import azlmbr.editor as editor import azlmbr.math as math import azlmbr.legacy.general as general +# Helper file Imports +from editor_python_test_tools.utils import Report class EditorComponent: """ @@ -61,7 +61,7 @@ class EditorComponent: build_prop_tree_outcome.IsSuccess() ), f"Failure: Could not build property tree of component: '{self.get_component_name()}'" prop_tree = build_prop_tree_outcome.GetValue() - utils.Report.info(prop_tree.build_paths_list()) + Report.info(prop_tree.build_paths_list()) return prop_tree def get_component_property_value(self, component_property_path: str): @@ -291,7 +291,7 @@ class EditorEntity: status_text = "inactive" elif status == azlmbr.globals.property.EditorEntityStartStatus_EditorOnly: status_text = "editor" - utils.Report.info(f"The start status for {self.get_name} is {status_text}") + Report.info(f"The start status for {self.get_name} is {status_text}") self.start_status = status return status @@ -308,7 +308,7 @@ class EditorEntity: elif desired_start_status == "editor": status_to_set = azlmbr.globals.property.EditorEntityStartStatus_EditorOnly else: - utils.Report.info( + Report.info( f"Invalid desired_start_status argument for {self.get_name} set_start_status command;\ Use editor, active, or inactive" ) diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_test_helper.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_test_helper.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py index 64a19aafdf..74f34659c0 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/editor_test_helper.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py @@ -15,12 +15,13 @@ import sys import time from typing import Sequence -from .report import Report # Open 3D Engine specific imports import azlmbr.legacy.general as general import azlmbr.legacy.settings as settings +from editor_python_test_tools.utils import Report + class EditorTestHelper: def __init__(self, log_prefix: str, args: Sequence[str] = None) -> None: @@ -117,7 +118,8 @@ class EditorTestHelper: # Set the viewport back to whatever size it was at the start and restore the pane layout general.set_viewport_size(int(self.viewport_size.x), int(self.viewport_size.y)) general.set_viewport_expansion_policy("AutoExpand") - general.set_view_pane_layout(self.viewport_layout) + # Temporarily disabling reset of view pane layout: LYN-3120 + # general.set_view_pane_layout(self.viewport_layout) general.update_viewport() self.log("test finished") diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_editor_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_editor_utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py old mode 100755 new mode 100644 similarity index 90% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py index a796fd70da..9f498bbf50 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/hydra_test_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py @@ -12,10 +12,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import logging import os import tempfile + import ly_test_tools.log.log_monitor import ly_test_tools.environment.process_utils as process_utils import ly_test_tools.environment.waiter as waiter -from automatedtesting_shared.network_utils import check_for_listening_port from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole from ly_remote_console.remote_console_commands import send_command_and_expect_response as send_command_and_expect_response logger = logging.getLogger(__name__) @@ -32,7 +32,7 @@ def teardown_editor(editor): def launch_and_validate_results(request, test_directory, editor, editor_script, expected_lines, unexpected_lines=[], - halt_on_unexpected=False, run_python="--runpythontest", auto_test_mode=True, null_renderer=False, cfg_args=[], + halt_on_unexpected=False, run_python="--runpythontest", auto_test_mode=True, null_renderer=True, cfg_args=[], timeout=300): """ Runs the Editor with the specified script, and monitors for expected log lines. @@ -58,7 +58,7 @@ def launch_and_validate_results(request, test_directory, editor, editor_script, if auto_test_mode: editor.args.extend(["--autotest_mode"]) if null_renderer: - editor.args.extend(["-NullRenderer"]) + editor.args.extend(["-rhi=Null"]) with editor.start(): @@ -86,6 +86,19 @@ def launch_and_validate_results_launcher(launcher, level, remote_console_instanc :param log_monitor_timeout: Timeout for monitoring for lines in Game.log :param remote_console_port: The port used to communicate with the Remote Console. """ + + def _check_for_listening_port(port): + """ + Checks to see if the connection to the designated port was established. + :param port: Port to listen to. + :return: True if port is listening. + """ + port_listening = False + for conn in psutil.net_connections(): + if 'port={}'.format(port) in str(conn): + port_listening = True + return port_listening + if null_renderer: launcher.args.extend(["-NullRenderer"]) @@ -94,7 +107,7 @@ def launch_and_validate_results_launcher(launcher, level, remote_console_instanc # Ensure Remote Console can be reached waiter.wait_for( - lambda: check_for_listening_port(remote_console_port), + lambda: _check_for_listening_port(remote_console_port), port_listener_timeout, exc=AssertionError("Port {} not listening.".format(remote_console_port)), ) diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/pyside_component_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/pyside_component_utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py index 38e5800c53..0432d4ae25 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/pyside_component_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py @@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import PySide2 -import pyside_utils +import editor_python_test_tools.pyside_utils def get_component_combobox_values(component_name, property_name, log_fn=None): diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/pyside_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/pyside_utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py old mode 100755 new mode 100644 similarity index 94% rename from AutomatedTesting/Gem/PythonTests/automatedtesting_shared/utils.py rename to AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py index 6ca0ec16a7..a9f6d0aa02 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py @@ -278,6 +278,12 @@ class Tracer: self.function = args[3] self.message = args[4] + def __str__(self): + return f"Warning: [{self.filename}:{self.function}:{self.line}]: [{self.window}] {self.message}" + + def __repr__(self): + return f"[Warning: {self.message}]" + class ErrorInfo: def __init__(self, args): self.window = args[0] @@ -285,6 +291,12 @@ class Tracer: self.line = args[2] self.function = args[3] self.message = args[4] + + def __str__(self): + return f"Error: [{self.filename}:{self.function}:{self.line}]: [{self.window}] {self.message}" + + def __repr__(self): + return f"[Error: {self.message}]" class AssertInfo: def __init__(self, args): @@ -292,6 +304,12 @@ class Tracer: self.line = args[1] self.function = args[2] self.message = args[3] + + def __str__(self): + return f"Assert: [{self.filename}:{self.function}:{self.line}]: {self.message}" + + def __repr__(self): + return f"[Assert: {self.message}]" def _on_warning(self, args): warningInfo = Tracer.WarningInfo(args) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/setup.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/setup.py new file mode 100644 index 0000000000..20f4911bab --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/setup.py @@ -0,0 +1,43 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" +import os +import platform + +from setuptools import setup, find_packages +from setuptools.command.develop import develop +from setuptools.command.build_py import build_py + +PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__)) + +PYTHON_64 = platform.architecture()[0] == '64bit' + + +if __name__ == '__main__': + if not PYTHON_64: + raise RuntimeError("32-bit Python is not a supported platform.") + + with open(os.path.join(PACKAGE_ROOT, 'README.txt')) as f: + long_description = f.read() + + setup( + name="editor_python_test_tools", + version="1.0.0", + description='O3DE editor Python bindings test tools', + long_description=long_description, + packages=find_packages(where='Tools', exclude=['tests']), + install_requires=[ + "ly_test_tools" + ], + tests_require=[ + ], + entry_points={ + }, + ) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py index d54edc4cb3..2677ba5605 100755 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py @@ -47,14 +47,15 @@ def run(): import azlmbr.legacy.general as general + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + # Helper file Imports import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import TestHelper as helper + from editor_python_test_tools.utils import Tracer # Constants FRAMES_IN_GAME_MODE = 200 diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py index 2882ca6be2..2d4fa4e325 100755 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py @@ -47,14 +47,15 @@ def run(): import azlmbr.legacy.general as general + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + # Helper file Imports import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import TestHelper as helper + from editor_python_test_tools.utils import Tracer # Constants FRAMES_IN_GAME_MODE = 200 diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py index e914182542..818dc23079 100644 --- a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py +++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py @@ -22,7 +22,7 @@ import ly_test_tools.environment.file_system as file_system import ly_test_tools.log.log_monitor import ly_test_tools.environment.waiter as waiter -@pytest.mark.SUITE_sandbox +@pytest.mark.SUITE_periodic @pytest.mark.parametrize('launcher_platform', ['windows_editor']) @pytest.mark.parametrize('project', ['AutomatedTesting']) @pytest.mark.parametrize('level', ['auto_test']) @@ -31,14 +31,13 @@ class TestPythonAssetProcessing(object): unexpected_lines = [] expected_lines = [ 'Mock asset exists', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_X_negative.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_X_positive.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found', - 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found' + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative_1.azmodel) found', + 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center_1.azmodel) found' ] timeout = 180 halt_on_unexpected = False diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py index 54857c2067..cd9adfdbcf 100644 --- a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py @@ -26,8 +26,9 @@ assetId = azlmbr.asset.AssetCatalogRequestBus(azlmbr.bus.Broadcast, 'GetAssetIdB if (assetId.is_valid() is False): raise_and_stop(f'Mock AssetId is not valid! Got {assetId.to_string()} instead') -if (assetId.to_string().endswith(':54c06b89') is False): - raise_and_stop(f'Mock AssetId has unexpected sub-id for {mockAssetPath}!') +assetIdString = assetId.to_string() +if (assetIdString.endswith(':528cca58') is False): + raise_and_stop(f'Mock AssetId {assetIdString} has unexpected sub-id for {mockAssetPath}!') print ('Mock asset exists') @@ -41,12 +42,12 @@ def test_azmodel_product(generatedModelAssetPath, expectedSubId): else: print(f'Expected subId for asset ({generatedModelAssetPath}) found') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel', '10412075') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_X_positive.azmodel', '10d16e68') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_X_negative.azmodel', '10a71973') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_Y_positive.azmodel', '10130556') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_Y_negative.azmodel', '1065724d') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_Z_positive.azmodel', '1024be55') -test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_Z_negative.azmodel', '1052c94e') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive_1.azmodel', '10315ae0') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative_1.azmodel', '10661093') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive_1.azmodel', '10af8810') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative_1.azmodel', '10f8c263') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive_1.azmodel', '100ac47f') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative_1.azmodel', '105d8e0c') +test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center_1.azmodel', '1002d464') azlmbr.editor.EditorToolsApplicationRequestBus(azlmbr.bus.Broadcast, 'ExitNoPrompt') diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/export_chunks_builder.py b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/export_chunks_builder.py index ad68a486b1..7e1f108c28 100644 --- a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/export_chunks_builder.py +++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/export_chunks_builder.py @@ -1,7 +1,6 @@ """ All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or its licensors. - For complete copyright and license terms please see the LICENSE at the root of this distribution (the "License"). All use of this software is governed by the License, or, if provided, by the license below or the license accompanying this file. Do not @@ -27,7 +26,10 @@ def get_mesh_node_names(sceneGraph): nodeContent = sceneGraph.get_node_content(node) if nodeContent is not None and nodeContent.CastWithTypeName('MeshData'): if sceneGraph.is_node_end_point(node) is False: - meshDataList.append(sceneData.SceneGraphName(sceneGraph.get_node_name(node))) + nodeName = sceneData.SceneGraphName(sceneGraph.get_node_name(node)) + nodePath = nodeName.get_path() + if (len(nodeName.get_path())): + meshDataList.append(sceneData.SceneGraphName(sceneGraph.get_node_name(node))) # advance to next node if sceneGraph.has_node_sibling(node): @@ -54,17 +56,7 @@ def update_manifest(scene): meshGroup['id'] = '{' + str(uuid.uuid5(uuid.NAMESPACE_DNS, sourceFilenameOnly + chunkPath)) + '}' sceneManifest.mesh_group_add_comment(meshGroup, 'auto generated by scene manifest') sceneManifest.mesh_group_add_advanced_coordinate_system(meshGroup, None, None, None, 1.0) - - # create selection node list - pathSet = set() - for meshIndex in range(len(meshNameList)): - targetPath = meshNameList[meshIndex].get_path() - if (activeMeshIndex == meshIndex): - sceneManifest.mesh_group_select_node(meshGroup, targetPath) - else: - if targetPath not in pathSet: - pathSet.update(targetPath) - sceneManifest.mesh_group_unselect_node(meshGroup, targetPath) + sceneManifest.mesh_group_select_node(meshGroup, chunkPath) return sceneManifest.export() @@ -85,4 +77,4 @@ def main(): mySceneJobHandler.add_callback('OnUpdateManifest', on_update_manifest) if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py index 9438b9d546..dabc04575f 100755 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py @@ -22,10 +22,10 @@ class Tests(): # fmt:on -def run(): +def C28798177_WhiteBox_AddComponentToEntity(): import os import sys - import WhiteBoxInit as init + from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init import ImportPathHelper as imports imports.init() @@ -33,8 +33,9 @@ def run(): import azlmbr.editor as editor import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + + from editor_python_test_tools.utils import TestHelper as helper # open level helper.init_idle() @@ -57,4 +58,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(C28798177_WhiteBox_AddComponentToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py index 605361e071..18a5c3164e 100755 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py @@ -22,15 +22,15 @@ class Tests(): # fmt:on -def run(): +def C28798205_WhiteBox_SetInvisible(): # note: This automated test does not fully replicate the test case in Test Rail as it's # not currently possible using the Hydra API to get an EntityComponentIdPair at runtime, # in future game_mode will be activated and a runtime White Box Component queried import os import sys - import WhiteBoxInit as init + from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init import ImportPathHelper as imports - import Tests.ly_shared.hydra_editor_utils as hydra + import editor_python_test_tools.hydra_editor_utils as hydra imports.init() import azlmbr.whitebox.api as api @@ -40,8 +40,9 @@ def run(): import azlmbr.entity as entity import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + + from editor_python_test_tools.utils import TestHelper as helper # open level helper.init_idle() @@ -67,4 +68,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(C28798205_WhiteBox_SetInvisible) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py index 399a9f27d4..e892285dde 100755 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py @@ -26,10 +26,10 @@ class Tests(): critical_shape_check = ("Default shape has more than 0 sides", "default shape has 0 sides") -def run(): +def C29279329_WhiteBox_SetDefaultShape(): import os import sys - import WhiteBoxInit as init + from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init import ImportPathHelper as imports imports.init() @@ -37,8 +37,9 @@ def run(): import azlmbr.bus as bus import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + + from editor_python_test_tools.utils import TestHelper as helper def check_shape_result(success_fail_tuple, condition): result = Report.result(success_fail_tuple, condition) @@ -106,4 +107,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from editor_python_test_tools.utils import Report + Report.start_test(C29279329_WhiteBox_SetDefaultShape) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt new file mode 100644 index 0000000000..7ffc2072f1 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt @@ -0,0 +1,40 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +################################################################################ +# Atom Renderer: Automated Tests +# Runs EditorPythonBindings (hydra) scripts inside the Editor to verify test results for the Atom renderer. +################################################################################ + +if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedTesting IN_LIST LY_PROJECTS) + ly_add_pytest( + NAME AutomatedTesting::AtomRenderer_HydraTests_Main + TEST_SUITE main + PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_MainSuite.py + TEST_SERIAL + TIMEOUT 300 + RUNTIME_DEPENDENCIES + AssetProcessor + AutomatedTesting.Assets + Editor + ) + ly_add_pytest( + NAME AutomatedTesting::AtomRenderer_HydraTests_Sandbox + TEST_SUITE sandbox + PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_SandboxSuite.py + TEST_SERIAL + TIMEOUT 300 + RUNTIME_DEPENDENCIES + AssetProcessor + AutomatedTesting.Assets + Editor + ) +endif() diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py new file mode 100644 index 0000000000..79f8fa4422 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py @@ -0,0 +1,10 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py new file mode 100644 index 0000000000..79f8fa4422 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py @@ -0,0 +1,10 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py new file mode 100644 index 0000000000..062c449ab7 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py @@ -0,0 +1,233 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +Hydra script that creates an entity and attaches Atom components to it for test verification. +""" + +import os +import sys + +import azlmbr.math as math +import azlmbr.bus as bus +import azlmbr.paths +import azlmbr.asset as asset +import azlmbr.entity as entity +import azlmbr.legacy.general as general +import azlmbr.editor as editor + +sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) + +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.utils import TestHelper + + +def run(): + """ + Summary: + The below common tests are done for each of the components. + 1) Addition of component to the entity + 2) UNDO/REDO of addition of component + 3) Enter/Exit game mode + 4) Hide/Show entity containing component + 5) Deletion of component + 6) UNDO/REDO of deletion of component + Some additional tests for specific components include + 1) Assigning value to some properties of each component + 2) Verifying if the component is activated only when the required components are added + + Expected Result: + 1) Component can be added to an entity. + 2) The addition of component can be undone and redone. + 3) Game mode can be entered/exited without issue. + 4) Entity with component can be hidden/shown. + 5) Component can be deleted. + 6) The deletion of component can be undone and redone. + 7) Component is activated only when the required components are added + 8) Values can be assigned to the properties of the component + + :return: None + """ + + def create_entity_undo_redo_component_addition(component_name): + new_entity = hydra.Entity(f"{component_name}") + new_entity.create_entity(math.Vector3(512.0, 512.0, 34.0), [component_name]) + general.log(f"{component_name}_test: Component added to the entity: " + f"{hydra.has_components(new_entity.id, [component_name])}") + + # undo component addition + general.undo() + TestHelper.wait_for_condition(lambda: not hydra.has_components(new_entity.id, [component_name]), 2.0) + general.log(f"{component_name}_test: Component removed after UNDO: " + f"{not hydra.has_components(new_entity.id, [component_name])}") + + # redo component addition + general.redo() + TestHelper.wait_for_condition(lambda: hydra.has_components(new_entity.id, [component_name]), 2.0) + general.log(f"{component_name}_test: Component added after REDO: " + f"{hydra.has_components(new_entity.id, [component_name])}") + + return new_entity + + def verify_enter_exit_game_mode(component_name): + general.enter_game_mode() + TestHelper.wait_for_condition(lambda: general.is_in_game_mode(), 1.0) + general.log(f"{component_name}_test: Entered game mode: {general.is_in_game_mode()}") + general.exit_game_mode() + TestHelper.wait_for_condition(lambda: not general.is_in_game_mode(), 1.0) + general.log(f"{component_name}_test: Exit game mode: {not general.is_in_game_mode()}") + + def verify_hide_unhide_entity(component_name, entity_obj): + + def is_entity_hidden(entity_id): + return editor.EditorEntityInfoRequestBus(bus.Event, "IsHidden", entity_id) + + editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", entity_obj.id, False) + general.idle_wait_frames(1) + general.log(f"{component_name}_test: Entity is hidden: {is_entity_hidden(entity_obj.id)}") + editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", entity_obj.id, True) + general.idle_wait_frames(1) + general.log(f"{component_name}_test: Entity is shown: {not is_entity_hidden(entity_obj.id)}") + + def verify_deletion_undo_redo(component_name, entity_obj): + editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", entity_obj.id) + TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0) + general.log(f"{component_name}_test: Entity deleted: {not hydra.find_entity_by_name(entity_obj.name)}") + + general.undo() + TestHelper.wait_for_condition(lambda: hydra.find_entity_by_name(entity_obj.name) is not None, 1.0) + general.log(f"{component_name}_test: UNDO entity deletion works: " + f"{hydra.find_entity_by_name(entity_obj.name) is not None}") + + general.redo() + TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0) + general.log(f"{component_name}_test: REDO entity deletion works: " + f"{not hydra.find_entity_by_name(entity_obj.name)}") + + def verify_required_component_addition(entity_obj, components_to_add, component_name): + + def is_component_enabled(entity_componentid_pair): + return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", entity_componentid_pair) + + general.log( + f"{component_name}_test: Entity disabled initially: " + f"{not is_component_enabled(entity_obj.components[0])}") + for component in components_to_add: + entity_obj.add_component(component) + TestHelper.wait_for_condition(lambda: is_component_enabled(entity_obj.components[0]), 1.0) + general.log( + f"{component_name}_test: Entity enabled after adding " + f"required components: {is_component_enabled(entity_obj.components[0])}" + ) + + def verify_set_property(entity_obj, path, value): + entity_obj.get_set_test(0, path, value) + + # Wait for Editor idle loop before executing Python hydra scripts. + TestHelper.init_idle() + + # Delete all existing entities initially + search_filter = azlmbr.entity.SearchFilter() + all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter) + editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities) + + class ComponentTests: + """Test launcher for each component.""" + def __init__(self, component_name, *additional_tests): + self.component_name = component_name + self.additional_tests = additional_tests + self.run_component_tests() + + def run_component_tests(self): + # Run common and additional tests + entity_obj = create_entity_undo_redo_component_addition(self.component_name) + + # Enter/Exit game mode test + verify_enter_exit_game_mode(self.component_name) + + # Any additional tests are executed here + for test in self.additional_tests: + test(entity_obj) + + # Hide/Unhide entity test + verify_hide_unhide_entity(self.component_name, entity_obj) + + # Deletion/Undo/Redo test + verify_deletion_undo_redo(self.component_name, entity_obj) + + # Area Light Component + area_light = "Area Light" + ComponentTests( + area_light, lambda entity_obj: verify_required_component_addition( + entity_obj, ["Capsule Shape"], area_light)) + + # Decal Component + material_asset_path = os.path.join("AutomatedTesting", "Materials", "basic_grey.material") + material_asset = asset.AssetCatalogRequestBus( + bus.Broadcast, "GetAssetIdByPath", material_asset_path, math.Uuid(), False) + ComponentTests( + "Decal (Atom)", lambda entity_obj: verify_set_property( + entity_obj, "Controller|Configuration|Material", material_asset)) + + # DepthOfField Component + camera_entity = hydra.Entity("camera_entity") + camera_entity.create_entity(math.Vector3(512.0, 512.0, 34.0), ["Camera"]) + depth_of_field = "DepthOfField" + ComponentTests( + depth_of_field, + lambda entity_obj: verify_required_component_addition(entity_obj, ["PostFX Layer"], depth_of_field), + lambda entity_obj: verify_set_property( + entity_obj, "Controller|Configuration|Camera Entity", camera_entity.id)) + + # Directional Light Component + ComponentTests( + "Directional Light", + lambda entity_obj: verify_set_property( + entity_obj, "Controller|Configuration|Shadow|Camera", camera_entity.id)) + + # Exposure Control Component + ComponentTests( + "Exposure Control", lambda entity_obj: verify_required_component_addition( + entity_obj, ["PostFX Layer"], "Exposure Control")) + + # Global Skylight (IBL) Component + diffuse_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage") + diffuse_image_asset = asset.AssetCatalogRequestBus( + bus.Broadcast, "GetAssetIdByPath", diffuse_image_path, math.Uuid(), False) + specular_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage") + specular_image_asset = asset.AssetCatalogRequestBus( + bus.Broadcast, "GetAssetIdByPath", specular_image_path, math.Uuid(), False) + ComponentTests( + "Global Skylight (IBL)", + lambda entity_obj: verify_set_property( + entity_obj, "Controller|Configuration|Diffuse Image", diffuse_image_asset), + lambda entity_obj: verify_set_property( + entity_obj, "Controller|Configuration|Specular Image", specular_image_asset)) + + # Physical Sky Component + ComponentTests("Physical Sky") + + # Point Light Component + ComponentTests("Point Light") + + # PostFX Layer Component + ComponentTests("PostFX Layer") + + # Radius Weight Modifier Component + ComponentTests("Radius Weight Modifier") + + # Light Component + ComponentTests("Light") + + # Display Mapper Component + ComponentTests("Display Mapper") + + +if __name__ == "__main__": + run() diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py new file mode 100644 index 0000000000..16139e3f66 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -0,0 +1,220 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +Main suite tests for the Atom renderer. +""" +import logging +import os + +import pytest + +import editor_python_test_tools.hydra_test_utils as hydra + +logger = logging.getLogger(__name__) +EDITOR_TIMEOUT = 120 +TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts") + + +@pytest.mark.parametrize("project", ["AutomatedTesting"]) +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) +@pytest.mark.parametrize("level", ["auto_test"]) +class TestAtomEditorComponentsMain(object): + + @pytest.mark.test_case_id( + "C32078117", # Area Light + "C32078130", # Display Mapper + "C32078129", # Light + "C32078131", # Radius Weight Modifier + "C32078127", # PostFX Layer + "C32078126", # Point Light + "C32078125", # Physical Sky + "C32078115", # Global Skylight (IBL) + "C32078121", # Exposure Control + "C32078120", # Directional Light + "C32078119", # DepthOfField + "C32078118") # Decal + def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform): + cfg_args = [level] + + expected_lines = [ + # Area Light Component + "Area Light Entity successfully created", + "Area Light_test: Component added to the entity: True", + "Area Light_test: Component removed after UNDO: True", + "Area Light_test: Component added after REDO: True", + "Area Light_test: Entered game mode: True", + "Area Light_test: Entity enabled after adding required components: True", + "Area Light_test: Entity is hidden: True", + "Area Light_test: Entity is shown: True", + "Area Light_test: Entity deleted: True", + "Area Light_test: UNDO entity deletion works: True", + "Area Light_test: REDO entity deletion works: True", + # Decal Component + "Decal (Atom) Entity successfully created", + "Decal (Atom)_test: Component added to the entity: True", + "Decal (Atom)_test: Component removed after UNDO: True", + "Decal (Atom)_test: Component added after REDO: True", + "Decal (Atom)_test: Entered game mode: True", + "Decal (Atom)_test: Exit game mode: True", + "Decal (Atom) Controller|Configuration|Material: SUCCESS", + "Decal (Atom)_test: Entity is hidden: True", + "Decal (Atom)_test: Entity is shown: True", + "Decal (Atom)_test: Entity deleted: True", + "Decal (Atom)_test: UNDO entity deletion works: True", + "Decal (Atom)_test: REDO entity deletion works: True", + # DepthOfField Component + "DepthOfField Entity successfully created", + "DepthOfField_test: Component added to the entity: True", + "DepthOfField_test: Component removed after UNDO: True", + "DepthOfField_test: Component added after REDO: True", + "DepthOfField_test: Entered game mode: True", + "DepthOfField_test: Exit game mode: True", + "DepthOfField_test: Entity disabled initially: True", + "DepthOfField_test: Entity enabled after adding required components: True", + "DepthOfField Controller|Configuration|Camera Entity: SUCCESS", + "DepthOfField_test: Entity is hidden: True", + "DepthOfField_test: Entity is shown: True", + "DepthOfField_test: Entity deleted: True", + "DepthOfField_test: UNDO entity deletion works: True", + "DepthOfField_test: REDO entity deletion works: True", + # Directional Light Component + "Directional Light Entity successfully created", + "Directional Light_test: Component added to the entity: True", + "Directional Light_test: Component removed after UNDO: True", + "Directional Light_test: Component added after REDO: True", + "Directional Light_test: Entered game mode: True", + "Directional Light_test: Exit game mode: True", + "Directional Light Controller|Configuration|Shadow|Camera: SUCCESS", + "Directional Light_test: Entity is hidden: True", + "Directional Light_test: Entity is shown: True", + "Directional Light_test: Entity deleted: True", + "Directional Light_test: UNDO entity deletion works: True", + "Directional Light_test: REDO entity deletion works: True", + # Exposure Control Component + "Exposure Control Entity successfully created", + "Exposure Control_test: Component added to the entity: True", + "Exposure Control_test: Component removed after UNDO: True", + "Exposure Control_test: Component added after REDO: True", + "Exposure Control_test: Entered game mode: True", + "Exposure Control_test: Exit game mode: True", + "Exposure Control_test: Entity disabled initially: True", + "Exposure Control_test: Entity enabled after adding required components: True", + "Exposure Control_test: Entity is hidden: True", + "Exposure Control_test: Entity is shown: True", + "Exposure Control_test: Entity deleted: True", + "Exposure Control_test: UNDO entity deletion works: True", + "Exposure Control_test: REDO entity deletion works: True", + # Global Skylight (IBL) Component + "Global Skylight (IBL) Entity successfully created", + "Global Skylight (IBL)_test: Component added to the entity: True", + "Global Skylight (IBL)_test: Component removed after UNDO: True", + "Global Skylight (IBL)_test: Component added after REDO: True", + "Global Skylight (IBL)_test: Entered game mode: True", + "Global Skylight (IBL)_test: Exit game mode: True", + "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS", + "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS", + "Global Skylight (IBL)_test: Entity is hidden: True", + "Global Skylight (IBL)_test: Entity is shown: True", + "Global Skylight (IBL)_test: Entity deleted: True", + "Global Skylight (IBL)_test: UNDO entity deletion works: True", + "Global Skylight (IBL)_test: REDO entity deletion works: True", + # Physical Sky Component + "Physical Sky Entity successfully created", + "Physical Sky component was added to entity", + "Entity has a Physical Sky component", + "Physical Sky_test: Component added to the entity: True", + "Physical Sky_test: Component removed after UNDO: True", + "Physical Sky_test: Component added after REDO: True", + "Physical Sky_test: Entered game mode: True", + "Physical Sky_test: Exit game mode: True", + "Physical Sky_test: Entity is hidden: True", + "Physical Sky_test: Entity is shown: True", + "Physical Sky_test: Entity deleted: True", + "Physical Sky_test: UNDO entity deletion works: True", + "Physical Sky_test: REDO entity deletion works: True", + # Point Light Component + "Point Light Entity successfully created", + "Point Light_test: Component added to the entity: True", + "Point Light_test: Component removed after UNDO: True", + "Point Light_test: Component added after REDO: True", + "Point Light_test: Entered game mode: True", + "Point Light_test: Exit game mode: True", + "Point Light_test: Entity is hidden: True", + "Point Light_test: Entity is shown: True", + "Point Light_test: Entity deleted: True", + "Point Light_test: UNDO entity deletion works: True", + "Point Light_test: REDO entity deletion works: True", + # PostFX Layer Component + "PostFX Layer Entity successfully created", + "PostFX Layer_test: Component added to the entity: True", + "PostFX Layer_test: Component removed after UNDO: True", + "PostFX Layer_test: Component added after REDO: True", + "PostFX Layer_test: Entered game mode: True", + "PostFX Layer_test: Exit game mode: True", + "PostFX Layer_test: Entity is hidden: True", + "PostFX Layer_test: Entity is shown: True", + "PostFX Layer_test: Entity deleted: True", + "PostFX Layer_test: UNDO entity deletion works: True", + "PostFX Layer_test: REDO entity deletion works: True", + # Radius Weight Modifier Component + "Radius Weight Modifier Entity successfully created", + "Radius Weight Modifier_test: Component added to the entity: True", + "Radius Weight Modifier_test: Component removed after UNDO: True", + "Radius Weight Modifier_test: Component added after REDO: True", + "Radius Weight Modifier_test: Entered game mode: True", + "Radius Weight Modifier_test: Exit game mode: True", + "Radius Weight Modifier_test: Entity is hidden: True", + "Radius Weight Modifier_test: Entity is shown: True", + "Radius Weight Modifier_test: Entity deleted: True", + "Radius Weight Modifier_test: UNDO entity deletion works: True", + "Radius Weight Modifier_test: REDO entity deletion works: True", + # Light Component + "Light Entity successfully created", + "Light_test: Component added to the entity: True", + "Light_test: Component removed after UNDO: True", + "Light_test: Component added after REDO: True", + "Light_test: Entered game mode: True", + "Light_test: Exit game mode: True", + "Light_test: Entity is hidden: True", + "Light_test: Entity is shown: True", + "Light_test: Entity deleted: True", + "Light_test: UNDO entity deletion works: True", + "Light_test: REDO entity deletion works: True", + # Display Mapper Component + "Display Mapper Entity successfully created", + "Display Mapper_test: Component added to the entity: True", + "Display Mapper_test: Component removed after UNDO: True", + "Display Mapper_test: Component added after REDO: True", + "Display Mapper_test: Entered game mode: True", + "Display Mapper_test: Exit game mode: True", + "Display Mapper_test: Entity is hidden: True", + "Display Mapper_test: Entity is shown: True", + "Display Mapper_test: Entity deleted: True", + "Display Mapper_test: UNDO entity deletion works: True", + "Display Mapper_test: REDO entity deletion works: True", + ] + + unexpected_lines = [ + "failed to open", + "Traceback (most recent call last):", + ] + + hydra.launch_and_validate_results( + request, + TEST_DIRECTORY, + editor, + "hydra_AtomEditorComponents_AddedToEntity.py", + timeout=EDITOR_TIMEOUT, + expected_lines=expected_lines, + unexpected_lines=unexpected_lines, + halt_on_unexpected=True, + null_renderer=True, + cfg_args=cfg_args, + ) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py new file mode 100644 index 0000000000..0fb873e677 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py @@ -0,0 +1,24 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +Sandbox suite tests for the Atom renderer. +""" + +import pytest + + +@pytest.mark.parametrize("project", ["AutomatedTesting"]) +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) +@pytest.mark.parametrize("level", ["auto_test"]) +class TestAtomEditorComponentsSandbox(object): + + # It requires at least one test + def test_Dummy(self, request, editor, level, workspace, project, launcher_platform): + pass diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_utils.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_utils.py index 1fe2771370..4d78e4f28b 100755 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_utils.py +++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_utils.py @@ -22,7 +22,7 @@ class Asset: """ Used to find Asset Id by its path and path of asset by its Id If a component has any asset property, then this class object can be called as: - asset_id = editor_entity_utils.EditorComponent.get_component_property_value() + asset_id = editor_python_test_tools.editor_entity_utils.EditorComponent.get_component_property_value() asset = asset_utils.Asset(asset_id) """ def __init__(self, id: azasset.AssetId): diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py index 1887d5736e..f00227c47f 100755 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py +++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py @@ -94,13 +94,13 @@ class TestAutomationBase: editor_starttime = time.time() self.logger.debug("Running automated test") testcase_module_filepath = self._get_testcase_module_filepath(testcase_module) - pycmd = ["--runpythontest", testcase_module_filepath, "-BatchMode", "-autotest_mode", "-NullRenderer"] + extra_cmdline_args + pycmd = ["--runpythontest", testcase_module_filepath, "-BatchMode", "-autotest_mode", "-rhi=null"] + extra_cmdline_args editor.args.extend(pycmd) # args are added to the WinLauncher start command editor.start(backupFiles = False, launch_ap = False) try: editor.wait(TestAutomationBase.MAX_TIMEOUT) except WaitTimeoutError: - errors.append(TestRunError("TIMEOUT", "Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze")) + errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze")) editor.kill() output = editor.get_output() @@ -118,16 +118,16 @@ class TestAutomationBase: else: error_str = "Test failed, no output available..\n" errors.append(TestRunError("FAILED TEST", error_str)) - if return_code != TestAutomationBase.TEST_FAIL_RETCODE: # Crashed + if return_code and return_code != TestAutomationBase.TEST_FAIL_RETCODE: # Crashed crash_info = "-- No crash log available --" - error_log = os.path.join(workspace.paths.project_log(), 'error.log') + crash_log = os.path.join(workspace.paths.project_log(), 'error.log') try: - waiter.wait_for(lambda: os.path.exists(error_log), timeout=TestAutomationBase.WAIT_FOR_CRASH_LOG) + waiter.wait_for(lambda: os.path.exists(crash_log), timeout=TestAutomationBase.WAIT_FOR_CRASH_LOG) except AssertionError: pass try: - with open(error_log) as f: + with open(crash_log) as f: crash_info = f.read() except Exception as ex: crash_info += f"\n{str(ex)}" diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py index 6609e1a34f..d20dcabd73 100755 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py +++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py @@ -13,7 +13,7 @@ import azlmbr.bus as bus import azlmbr.editor as editor import azlmbr.landscapecanvas as landscapecanvas -from . import hydra_editor_utils as hydra +import editor_python_test_tools.hydra_editor_utils as hydra def find_nodes_matching_entity_component(component_name, entity_id): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_SearchFiltering.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_SearchFiltering.py index 6dc59d9be0..75c17b2a69 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_SearchFiltering.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_SearchFiltering.py @@ -22,9 +22,9 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +import editor_python_test_tools.hydra_editor_utils as hydra +import editor_python_test_tools.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper class AssetBrowserSearchFilteringTest(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py index dc0565d100..6019cdf247 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py @@ -21,8 +21,8 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper +import editor_python_test_tools.pyside_utils as pyside_utils class AssetBrowserTreeNavigationTest(EditorTestHelper): @@ -66,7 +66,7 @@ class AssetBrowserTreeNavigationTest(EditorTestHelper): return collapse_success and expand_success # This is the hierarchy we are expanding (4 steps inside) - self.file_path = ("AutomatedTesting", "Assets", "ImageGradients", "lumberyard_gsi.png") + self.file_path = ("AutomatedTesting", "Assets", "ImageGradients", "image_grad_test_gsi.png") # 1) Open a new level self.test_success = self.create_level( diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetPicker_UI_UX.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetPicker_UI_UX.py index c51e4ca55f..ce7dd33971 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetPicker_UI_UX.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetPicker_UI_UX.py @@ -25,9 +25,9 @@ import azlmbr.paths import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +import editor_python_test_tools.hydra_editor_utils as hydra +import editor_python_test_tools.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper class AssetPickerUIUXTest(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/ComponentCRUD_Add_Delete_Components.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/ComponentCRUD_Add_Delete_Components.py index cdc204043e..5e07a6df7d 100755 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/ComponentCRUD_Add_Delete_Components.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/ComponentCRUD_Add_Delete_Components.py @@ -26,9 +26,9 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +import editor_python_test_tools.hydra_editor_utils as hydra +import editor_python_test_tools.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper class AddDeleteComponentsTest(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py index b390b95c47..21d5a0ee30 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py @@ -22,8 +22,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper +import editor_python_test_tools.pyside_utils as pyside_utils class TestDockingBasicDockedTools(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/InputBindings_Add_Remove_Input_Events.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/InputBindings_Add_Remove_Input_Events.py index d6d284664a..dbc942f471 100755 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/InputBindings_Add_Remove_Input_Events.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/InputBindings_Add_Remove_Input_Events.py @@ -25,9 +25,9 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +import editor_python_test_tools.hydra_editor_utils as hydra +import editor_python_test_tools.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper class AddRemoveInputEventsTest(EditorTestHelper): def __init__(self): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py index c7fa19e372..208ef40d41 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py @@ -19,8 +19,8 @@ import sys import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper +import editor_python_test_tools.pyside_utils as pyside_utils class TestEditMenuOptions(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py index d8140c25c0..3e174af2bd 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py @@ -20,8 +20,8 @@ import sys import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper +import editor_python_test_tools.pyside_utils as pyside_utils class TestFileMenuOptions(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py index 1e364b5964..05ee802d19 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py +++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py @@ -19,8 +19,8 @@ import sys import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper -import automatedtesting_shared.pyside_utils as pyside_utils +from editor_python_test_tools.editor_test_helper import EditorTestHelper +import editor_python_test_tools.pyside_utils as pyside_utils class TestViewMenuOptions(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/editor/conftest.py b/AutomatedTesting/Gem/PythonTests/editor/conftest.py index 328c5ebad4..3260b8834a 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/conftest.py +++ b/AutomatedTesting/Gem/PythonTests/editor/conftest.py @@ -19,7 +19,7 @@ logger = logging.getLogger(__name__) layout = { - 'path': r'Software\Amazon\Lumberyard\Editor\fancyWindowLayouts', + 'path': r'Software\Amazon\O3DE\Editor\fancyWindowLayouts', 'value': 'last' } restore_camera = { diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_AssetBrowser.py b/AutomatedTesting/Gem/PythonTests/editor/test_AssetBrowser.py index 18dbee2424..48e65cd9fe 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/test_AssetBrowser.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_AssetBrowser.py @@ -15,10 +15,11 @@ C13660195: Asset Browser - File Tree Navigation import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 180 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py b/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py index b7b6280125..ac499d734f 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py @@ -15,10 +15,11 @@ C13751579: Asset Picker UI/UX import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 90 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_ComponentCRUD.py b/AutomatedTesting/Gem/PythonTests/editor/test_ComponentCRUD.py index 8ee24d9aac..f4ae57c338 100755 --- a/AutomatedTesting/Gem/PythonTests/editor/test_ComponentCRUD.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_ComponentCRUD.py @@ -15,10 +15,11 @@ C16929880: Add Delete Components import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 180 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py index 16cccca3fe..a75b3b36cd 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py @@ -13,10 +13,11 @@ C6376081: Basic Function: Docked/Undocked Tools import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 180 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_InputBindings.py b/AutomatedTesting/Gem/PythonTests/editor/test_InputBindings.py index f7e6a8ce5f..cdcfe86ef7 100755 --- a/AutomatedTesting/Gem/PythonTests/editor/test_InputBindings.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_InputBindings.py @@ -15,10 +15,11 @@ C1506881: Adding/Removing Event Groups import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 180 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py index 1df25dc593..251bd7cfed 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py @@ -13,10 +13,11 @@ C16780783: Base Edit Menu Options (New Viewport Interaction Model) import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") log_monitor_timeout = 180 diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py b/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py deleted file mode 100755 index fa8b143739..0000000000 --- a/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C13660194 : Asset Browser - Filtering -""" - -import os -import pytest -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip('ly_test_tools') -import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 90 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -@pytest.mark.usefixtures("automatic_process_killer") -@pytest.mark.parametrize("launcher_platform", ['windows_editor']) -class TestSearchFiltering(object): - - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, project, level): - def teardown(): - file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - - request.addfinalizer(teardown) - - file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C13660194") - @pytest.mark.SUITE_periodic - def test_SearchFiltering_Asset_Browser_Filtering(self, request, editor, level, launcher_platform): - expected_lines = [ - "cedar.fbx asset is filtered in Asset Browser", - "Animation file type(s) is present in the file tree: True", - "FileTag file type(s) and Animation file type(s) is present in the file tree: True", - "FileTag file type(s) is present in the file tree after removing Animation filter: True", - ] - - unexpected_lines = [ - "Asset Browser opened: False", - "Animation file type(s) is present in the file tree: False", - "FileTag file type(s) and Animation file type(s) is present in the file tree: False", - "FileTag file type(s) is present in the file tree after removing Animation filter: False", - ] - - hydra.launch_and_validate_results( - request, - test_directory, - editor, - "AssetBrowser_SearchFiltering.py", - expected_lines, - unexpected_lines=unexpected_lines, - cfg_args=[level], - auto_test_mode=False, - run_python="--runpython", - timeout=log_monitor_timeout, - ) diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py b/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py deleted file mode 100755 index a97e4696d5..0000000000 --- a/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -""" -C13660195: Asset Browser - File Tree Navigation -""" - -import os -import pytest -# Bail on the test if ly_test_tools doesn't exist. -pytest.importorskip('ly_test_tools') -import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra - -test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") -log_monitor_timeout = 90 - - -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('level', ['tmp_level']) -@pytest.mark.usefixtures("automatic_process_killer") -@pytest.mark.parametrize("launcher_platform", ['windows_editor']) -class TestTreeNavigation(object): - - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, project, level): - def teardown(): - file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - - request.addfinalizer(teardown) - - file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - - @pytest.mark.test_case_id("C13660195") - @pytest.mark.SUITE_periodic - def test_TreeNavigation_Asset_Browser(self, request, editor, level, launcher_platform): - expected_lines = [ - "Collapse/Expand tests: True", - "Asset visibility test: True", - "Scrollbar visibility test: True", - "TreeNavigation_Asset_Browser: result=SUCCESS" - ] - - hydra.launch_and_validate_results( - request, - test_directory, - editor, - "TreeNavigation_Asset_Browser.py", - expected_lines, - run_python="--runpython", - cfg_args=[level], - timeout=log_monitor_timeout, - ) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py index 673e473390..a0279aecec 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py @@ -25,8 +25,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py index 1c51cc9554..09f8bb9814 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -53,6 +53,8 @@ class TestAltitudeFilterFilterStageToggle(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # Create basic vegetation entity position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py index 7e76a80cc4..5d4154b030 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AreaComponentSlices_SliceCreationAndVisibilityToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AreaComponentSlices_SliceCreationAndVisibilityToggle.py index d1fe82e3f7..786a7e3502 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AreaComponentSlices_SliceCreationAndVisibilityToggle.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AreaComponentSlices_SliceCreationAndVisibilityToggle.py @@ -21,8 +21,8 @@ import azlmbr.asset as asset import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -59,6 +59,8 @@ class TestAreaComponentsSliceCreationAndVisibilityToggle(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) C2627900 Verifies if a slice containing the Vegetation Layer Spawner component can be created. # 2.1) Create basic vegetation entity position = math.Vector3(512.0, 512.0, 32.0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py index 786348bcc6..374813b298 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py @@ -21,8 +21,8 @@ import azlmbr.paths import azlmbr.vegetation as vegetation sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py index 85d4edfe6d..37bd47ed5d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/Debugger_DebugCVarsWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/Debugger_DebugCVarsWorks.py index 7d133f492d..aeb6170e43 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/Debugger_DebugCVarsWorks.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/Debugger_DebugCVarsWorks.py @@ -16,8 +16,8 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestDebuggerDebugCVarsWorks(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py index 82b2fc8407..1ccfc43585 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -63,6 +63,8 @@ class TestDistanceBetweenFilterComponentOverrides(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create a new entity with required vegetation area components spawner_center_point = math.Vector3(520.0, 520.0, 32.0) asset_path = os.path.join("Slices", "1m_cube.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py index 9f15215358..09c5fd63cf 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -61,6 +61,8 @@ class TestDistanceBetweenFilterComponent(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create a new entity with required vegetation area components spawner_center_point = math.Vector3(520.0, 520.0, 32.0) asset_path = os.path.join("Slices", "1m_cube.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py index b58c7488e5..0be220cad0 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py @@ -18,8 +18,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -43,6 +43,7 @@ class TestDynamicSliceInstanceSpawner(EditorTestHelper): use_terrain=False, ) general.idle_wait(1.0) + general.set_current_view_position(512.0, 480.0, 38.0) # Grab the UUID that we need for creating an Dynamic Slice Instance Spawner dynamic_slice_spawner_uuid = azlmbr.math.Uuid_CreateString('{BBA5CC1E-B4CA-4792-89F7-93711E98FBD1}', 0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py index f25fbb2b6d..f24909c08d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -65,6 +65,8 @@ class TestDynamicSliceInstanceSpawnerEmbeddedEditor(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create a new entity with required vegetation area components and Script Canvas component for launcher test center_point = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py index 8af75f2d17..447ac403fb 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -65,6 +65,8 @@ class TestDynamicSliceInstanceSpawnerExternalEditor(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create a new entity with required vegetation area components and switch the Vegetation Asset List Source # Type to External entity_position = math.Vector3(512.0, 512.0, 32.0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py index 4067de90fc..161ad038a5 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py @@ -18,8 +18,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -43,6 +43,7 @@ class TestEmptyInstanceSpawner(EditorTestHelper): use_terrain=False, ) general.idle_wait(1.0) + general.set_current_view_position(512.0, 480.0, 38.0) # Grab the UUID that we need for creating an Empty Spawner empty_spawner_uuid = azlmbr.math.Uuid_CreateString('{23C40FD4-A55F-4BD3-BE5B-DC5423F217C2}', 0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py index 507d8f505e..684ca70e38 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py @@ -21,8 +21,8 @@ import azlmbr.paths import azlmbr.vegetation as vegetation sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py index 2e6992d7e2..0da7acc987 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py @@ -29,8 +29,8 @@ import azlmbr.entity as EntityId import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py index 53c29344e1..a856d8c093 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py @@ -19,8 +19,8 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py index 01c5001642..d84cd575e7 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py @@ -19,8 +19,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py index f55243bc9c..0e4cabe3db 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py @@ -19,8 +19,8 @@ import azlmbr.surface_data as surface_data import azlmbr.vegetation as vegetation sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -60,6 +60,8 @@ class TestLayerSpawnerInheritBehavior(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # Create Emitter entity and add the required components position = math.Vector3(512.0, 512.0, 32.0) emitter_entity = dynveg.create_surface_entity("emitter_entity", position, 16.0, 16.0, 1.0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py index c124c631fd..add45d9671 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py @@ -19,8 +19,8 @@ import azlmbr.entity as EntityId import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py index 02dcc1f067..d366521304 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py @@ -20,8 +20,8 @@ import azlmbr.legacy.general as general import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -61,6 +61,9 @@ class test_MeshBlocker_InstancesBlockedByMesh(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(500.49, 498.69, 46.66) + general.set_current_view_rotation(-42.05, 0.00, -36.33) + # Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape" entity_position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py index 66250bf451..a7a0bc146b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py @@ -24,8 +24,8 @@ import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py index a5d04a3b6a..5757ed7559 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestMeshSurfaceTagEmitter(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py index e0011ea28f..ffa805cb41 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py @@ -18,8 +18,8 @@ import azlmbr.paths import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestMeshSurfaceTagEmitter(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py index 13003cdfcd..1826549a01 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py @@ -19,8 +19,8 @@ import azlmbr.bus as bus import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py index d2d112907a..a215e21a94 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py index bd2a2df16f..e3ee0e5313 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py index b63692527c..25b6c65ca3 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py @@ -24,8 +24,8 @@ import azlmbr.bus as bus import azlmbr.areasystem as areasystem sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -90,7 +90,7 @@ class TestRotationModifierOverrides_InstancesRotateWithinRange(EditorTestHelper) terrain_texture_resolution=4096, use_terrain=False, ) - general.run_console("e_WaterOcean=0") + general.set_current_view_position(512.0, 480.0, 38.0) # 2) Create vegetation entity and add components entity_position = math.Vector3(512.0, 512.0, 32.0) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py index a14363d5e9..087bf284e0 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py @@ -19,8 +19,8 @@ import azlmbr.bus as bus import azlmbr.areasystem as areasystem sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -103,7 +103,7 @@ class TestRotationModifier_InstancesRotateWithinRange(EditorTestHelper): terrain_texture_resolution=4096, use_terrain=False, ) - general.run_console("e_WaterOcean=0") + general.set_current_view_position(512.0, 480.0, 38.0) # 2) Set up vegetation entities asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py index 296ffe793b..2c9d33eae4 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py @@ -19,8 +19,8 @@ import azlmbr.legacy.general as general import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg # Constants diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py index 333bc92352..f81758b2dd 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py @@ -19,8 +19,8 @@ import azlmbr.legacy.general as general import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py index 4d904e9623..de1f50e481 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py @@ -24,8 +24,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py index cb96575a5d..ee5d79d6d2 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py index b358328886..400abf0212 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py @@ -23,8 +23,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py index 6f3b1d5629..2271ee51ce 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py @@ -24,8 +24,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_FilterStageToggle.py index a907c7a0af..d2ba85e41d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_FilterStageToggle.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_FilterStageToggle.py @@ -17,10 +17,11 @@ import azlmbr.paths import azlmbr.editor as editor import azlmbr.entity as EntityId import azlmbr.components as components +import azlmbr.legacy.general as general sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg class TestSlopeFilterFilterStageToggle(EditorTestHelper): @@ -48,6 +49,8 @@ class TestSlopeFilterFilterStageToggle(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # Create basic vegetation entity position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py index 5b6a421e49..04e748661b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py @@ -18,7 +18,7 @@ import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py index b164d34973..c1bf53b03a 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py @@ -22,8 +22,8 @@ import azlmbr.paths import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py index 101b84f4bb..4f58a23a19 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py @@ -15,7 +15,7 @@ import sys import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestSurfaceMaskFilter_BasicSurfaceTagCreation(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py index 1bec5e46ae..2beb8f17c2 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py @@ -25,8 +25,8 @@ import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -103,6 +103,8 @@ class TestExclusiveSurfaceMasksTag(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape" entity_position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py index fbaecf1972..f721bc4283 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py @@ -25,8 +25,8 @@ import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -104,6 +104,8 @@ class TestInclusiveSurfaceMasksTag(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # 2) Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape" entity_position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py index f1e6a93760..19750994ec 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py @@ -15,10 +15,11 @@ import azlmbr.math as math import azlmbr.paths import azlmbr.editor as editor import azlmbr.bus as bus +import azlmbr.legacy.general as general sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -52,6 +53,8 @@ class TestSystemSettingsSectorPointDensity(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # Create basic vegetation entity position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py index 5e80bd6b33..c4cec19a8f 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py @@ -15,10 +15,11 @@ import azlmbr.math as math import azlmbr.paths import azlmbr.editor as editor import azlmbr.bus as bus +import azlmbr.legacy.general as general sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg @@ -48,6 +49,8 @@ class TestSystemSettingsSectorSize(EditorTestHelper): use_terrain=False, ) + general.set_current_view_position(512.0, 480.0, 38.0) + # Create basic vegetation entity position = math.Vector3(512.0, 512.0, 32.0) asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py index 076dbd950b..c25761d655 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py @@ -24,7 +24,7 @@ import azlmbr.legacy.general as general import azlmbr.math as math sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py index 6378b36447..2db8534696 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py @@ -15,7 +15,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') @@ -85,7 +85,8 @@ class TestAltitudeFilter(object): @pytest.mark.test_case_id("C4847478") @pytest.mark.SUITE_periodic - def test_AltitudeFilterFilterStageToggle(self, request, editor, level, workspace, launcher_platform): + @pytest.mark.xfail # LYN-3275 + def test_AltitudeFilter_FilterStageToggle(self, request, editor, level, workspace, launcher_platform): cfg_args = [level] expected_lines = [ diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AreaComponentSlices.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AreaComponentSlices.py index 014655f966..1353efbf2e 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AreaComponentSlices.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AreaComponentSlices.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetListCombiner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetListCombiner.py index c36f36d58c..ad0917ca22 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetListCombiner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetListCombiner.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetWeightSelector.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetWeightSelector.py index cd383581cc..65472df3bc 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetWeightSelector.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AssetWeightSelector.py @@ -20,7 +20,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_Debugger.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_Debugger.py index 84709b59a4..45518b71fc 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_Debugger.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_Debugger.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py index 980d754d2b..3171cc032f 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynVeg_Regressions.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynVeg_Regressions.py index 4a8831542f..b3cf344b2b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynVeg_Regressions.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynVeg_Regressions.py @@ -15,7 +15,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py index 1183c0769c..f0673a9438 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole logger = logging.getLogger(__name__) @@ -41,7 +41,7 @@ class TestDynamicSliceInstanceSpawner(object): return console @pytest.mark.test_case_id("C28851763") - @pytest.mark.SUITE_main + @pytest.mark.SUITE_sandbox @pytest.mark.parametrize("launcher_platform", ['windows_editor']) def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, editor, level, workspace, project, launcher_platform): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py index 32e00cdeb9..fc8c31fc7b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py @@ -12,10 +12,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import os import pytest import logging + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') @@ -35,8 +36,13 @@ class TestEmptyInstanceSpawner(object): file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True) - @pytest.mark.test_case_id("C28851762") + # Main suite needs at least one test @pytest.mark.SUITE_main + def test_EmptyInstanceSpawner_Dummy(self, request, editor, level, workspace, project, launcher_platform): + pass + + @pytest.mark.test_case_id("C28851762") + @pytest.mark.SUITE_sandbox def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, editor, level, launcher_platform): cfg_args = [level] diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_InstanceSpawnerPriority.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_InstanceSpawnerPriority.py index 7ef4185faf..d04b827985 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_InstanceSpawnerPriority.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_InstanceSpawnerPriority.py @@ -21,7 +21,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlender.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlender.py index 5fa7f04179..2286238364 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlender.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlender.py @@ -22,14 +22,14 @@ pytest.importorskip("ly_test_tools") import time as time +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.launchers.launcher_helper as launcher_helper -import ly_remote_console.remote_console_commands as remote_console_commands -from ly_remote_console.remote_console_commands import send_command_and_expect_response as send_command_and_expect_response import ly_test_tools.environment.waiter as waiter import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra -import automatedtesting_shared.screenshot_utils as screenshot_utils +import ly_remote_console.remote_console_commands as remote_console_commands +from ly_remote_console.remote_console_commands import send_command_and_expect_response as send_command_and_expect_response +import automatedtesting_shared.screenshot_utils as screenshot_utils from automatedtesting_shared.network_utils import check_for_listening_port diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlocker.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlocker.py index 94fe4d2e48..6da0cdd6db 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlocker.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerBlocker.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py index ad08d7c214..93149c9490 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") @@ -101,6 +101,7 @@ class TestLayerSpawner(object): @pytest.mark.test_case_id("C4765973") @pytest.mark.SUITE_periodic + @pytest.mark.xfail # LYN-3275 def test_LayerSpawner_FilterStageToggle(self, request, editor, level, workspace, launcher_platform): expected_lines = [ diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py index 4437865a00..c04390e647 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py @@ -16,7 +16,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') @@ -46,6 +46,7 @@ class TestMeshBlocker(object): """ @pytest.mark.test_case_id("C3980834") @pytest.mark.SUITE_periodic + @pytest.mark.xfail # LYN-3273 def test_MeshBlocker_InstancesBlockedByMesh(self, request, editor, level, launcher_platform): expected_lines = [ "'Instance Spawner' created", @@ -69,6 +70,7 @@ class TestMeshBlocker(object): """ @pytest.mark.test_case_id("C4766030") @pytest.mark.SUITE_periodic + @pytest.mark.xfail # LYN-3273 def test_MeshBlocker_InstancesBlockedByMeshHeightTuning(self, request, editor, level, launcher_platform): expected_lines = [ "'Instance Spawner' created", diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshSurfaceTagEmitter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshSurfaceTagEmitter.py index 3a7a859b35..77638cb576 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshSurfaceTagEmitter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshSurfaceTagEmitter.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PhysXColliderSurfaceTagEmitter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PhysXColliderSurfaceTagEmitter.py index d46c15024a..ca4e30a719 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PhysXColliderSurfaceTagEmitter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PhysXColliderSurfaceTagEmitter.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py index e25820ed7e..ac3e0abb4f 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py @@ -12,10 +12,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import os import pytest import logging + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') @@ -59,6 +60,7 @@ class TestPositionModifier(object): @pytest.mark.test_case_id("C4874100") @pytest.mark.SUITE_sandbox + @pytest.mark.xfail # LYN-3275 def test_PositionModifier_AutoSnapToSurfaceWorks(self, request, editor, level, launcher_platform): expected_lines = [ diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_RotationModifier.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_RotationModifier.py index 1812c3c1b0..518949c0c0 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_RotationModifier.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_RotationModifier.py @@ -16,7 +16,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system logger = logging.getLogger(__name__) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ScaleModifier.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ScaleModifier.py index d6d9f5e991..6acd95e4f6 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ScaleModifier.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ScaleModifier.py @@ -19,7 +19,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ShapeIntersectionFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ShapeIntersectionFilter.py index 6b58ab23c5..ea90b67a7f 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ShapeIntersectionFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_ShapeIntersectionFilter.py @@ -12,10 +12,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import os import pytest import logging + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeAlignmentModifier.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeAlignmentModifier.py index 3134bafed9..563ac1dcc5 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeAlignmentModifier.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeAlignmentModifier.py @@ -16,9 +16,10 @@ C4814459 - Surface Alignment overrides function as expected import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeFilter.py index 991e82caf3..dc0f0e6514 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SlopeFilter.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SurfaceMaskFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SurfaceMaskFilter.py index dfc0878a41..20cab85293 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SurfaceMaskFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SurfaceMaskFilter.py @@ -15,7 +15,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra import ly_test_tools.environment.file_system as file_system test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SystemSettings.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SystemSettings.py index 8b6e95ea14..adf9a90587 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SystemSettings.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_SystemSettings.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py index c6f7a3c438..cc9a15bba0 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py @@ -17,8 +17,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientGeneratorIncompatibilities(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py index 7fb94dab50..b7d12d074a 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py @@ -17,8 +17,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientModifiersIncompatibilities(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py index 868d9d08e3..c37ee36265 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py @@ -33,8 +33,8 @@ import azlmbr.paths import azlmbr.entity as EntityId sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientPreviewSettings(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py index 30d224f8c4..5a758b9d89 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py @@ -18,8 +18,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class Scoped: diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py index d94c197fea..5d4e575e4e 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py @@ -18,8 +18,8 @@ import azlmbr.paths import azlmbr.entity as EntityId sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientSampling(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py index 7cdd029f3d..a16e37e0fc 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py @@ -16,9 +16,10 @@ import azlmbr.bus as bus import azlmbr.entity as entity import azlmbr.paths import azlmbr.editor as editor + sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientSurfaceTagEmitterDependencies(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py index a37ae97361..e150070281 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py @@ -18,8 +18,8 @@ import azlmbr.paths import azlmbr.surface_data as surface_data sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientSurfaceTagEmitter(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py index 31f0ee2693..41860ecaec 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py @@ -19,8 +19,8 @@ import azlmbr.math as math import azlmbr.entity as EntityId sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientTransform_ComponentIncompatibleWithExpectedGradients(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py index 0542e5e1b4..e2a7df6cf1 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py @@ -19,8 +19,8 @@ import azlmbr.math as math import azlmbr.entity as EntityId sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientTransform_ComponentIncompatibleWithSpawners(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py index 22518e61be..bd664a9424 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py @@ -24,8 +24,8 @@ import azlmbr.paths import azlmbr.entity as EntityId sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientTransformFrequencyZoom(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py index 3986076980..e1e901f2f7 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py @@ -17,8 +17,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestGradientTransformRequiresShape(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py index ccc8c3f101..b4ee512478 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestImageGradient(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py index 152f256266..dab8e6928a 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py @@ -17,8 +17,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestImageGradientRequiresShape(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientIncompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientIncompatibilities.py index 108bc79afd..1f16dbae97 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientIncompatibilities.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientIncompatibilities.py @@ -19,7 +19,7 @@ import pytest pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientPreviewSettings.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientPreviewSettings.py index fd886945af..6f755accb2 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientPreviewSettings.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientPreviewSettings.py @@ -11,10 +11,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSampling.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSampling.py index ac3ffaff06..315ec11986 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSampling.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSampling.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSurfaceTagEmitter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSurfaceTagEmitter.py index 91ae577b62..61e3832b24 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSurfaceTagEmitter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientSurfaceTagEmitter.py @@ -16,7 +16,7 @@ import logging # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra logger = logging.getLogger(__name__) test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientTransform.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientTransform.py index ecc4e5a027..7fb690c041 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientTransform.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_GradientTransform.py @@ -17,10 +17,11 @@ the same Entity that provides the ShapeService (e.g. box shape, or reference sha import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_ImageGradient.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_ImageGradient.py index 8fc582c2c8..d67616e48d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_ImageGradient.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/test_ImageGradient.py @@ -11,10 +11,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py index b8e61ab7f2..d1e0b68ef4 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py index f15301d180..4e429a192b 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py index d210bce7e2..38f8641b4c 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py @@ -21,7 +21,7 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID createdEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py index d8172c1be3..26062c01f8 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py @@ -41,8 +41,8 @@ import azlmbr.slice as slice import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestComponentUpdatesUpdateGraph(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py index 86f8f83201..5fed13985d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py @@ -19,8 +19,8 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID new_root_entity_id = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py index e25553b64a..7fd3f075e0 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py index f88ce893ba..27ab6fded3 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py @@ -35,8 +35,8 @@ import azlmbr.slice as slice import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestUndoNodeDeleteSlice(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py index 8883dc0d93..ca3bc04f47 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py index 9419322000..d40b19e7db 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py index 9fbcb1382f..dc263924d1 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py @@ -21,7 +21,7 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID createdEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py index 4315acac62..5e203e1892 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py index f2809b0cf2..6d4a2f58a7 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py @@ -20,8 +20,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py index c6147e8bb4..2b49e3a911 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py @@ -21,7 +21,7 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID createdEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py index b3eeafced7..d3ad5c1c1e 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py @@ -19,7 +19,7 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newRootEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py index 302cb9dcc0..b7b0008eb2 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py @@ -18,7 +18,7 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py index ea6bbb94ff..efd1cc5a55 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py @@ -18,7 +18,7 @@ import azlmbr.legacy.general as general import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py index 4149504aca..f350d37178 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py @@ -38,10 +38,11 @@ import azlmbr.math as math import azlmbr.slice as slice import azlmbr.paths +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper + sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra import automatedtesting_shared.landscape_canvas_utils as lc -from automatedtesting_shared.editor_test_helper import EditorTestHelper class TestGraphUpdatesUpdateComponents(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py index b6f9457f0e..176429885f 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py @@ -18,8 +18,8 @@ import azlmbr.entity as entity import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py index cfa685e875..e0f13adaa9 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py @@ -19,8 +19,8 @@ import azlmbr.asset as asset import azlmbr.slice as slice sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper class TestLandscapeCanvasSliceCreateInstantiate(EditorTestHelper): diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py index 6ed9b80dbe..ecc529b9b4 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py @@ -22,8 +22,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py index d65f86b77f..00fcb5170c 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py index e5d3c436c3..bd10e5f4c6 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py index db5542a3fd..f71f5ae906 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py @@ -21,7 +21,7 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -from automatedtesting_shared.editor_test_helper import EditorTestHelper +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID createdEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py index 346358641d..968f39c64d 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py @@ -21,8 +21,8 @@ import azlmbr.math as math import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra -from automatedtesting_shared.editor_test_helper import EditorTestHelper +import editor_python_test_tools.hydra_editor_utils as hydra +from editor_python_test_tools.editor_test_helper import EditorTestHelper editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID newEntityId = None diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py index 46ca74a3df..cb19b77088 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py @@ -18,10 +18,11 @@ C13815873 - All Filters/Modifiers/Selectors can be added to/removed from a Layer import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_EditFunctionality.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_EditFunctionality.py index dcb35e01fb..6899847d81 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_EditFunctionality.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_EditFunctionality.py @@ -16,10 +16,11 @@ C30813586 - Editor remains stable after Undoing deletion of a node on a slice en import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GeneralGraphFunctionality.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GeneralGraphFunctionality.py index edbd86a7a1..09235ca2ae 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GeneralGraphFunctionality.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GeneralGraphFunctionality.py @@ -21,7 +21,7 @@ import pytest # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip("ly_test_tools") import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts") diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientModifierNodes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientModifierNodes.py index 20961df4b0..bce57b6da8 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientModifierNodes.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientModifierNodes.py @@ -16,10 +16,11 @@ C18055051 - All Gradient Modifier nodes can be removed from a graph import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientNodes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientNodes.py index 83a2a9686c..639bec7827 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientNodes.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GradientNodes.py @@ -17,10 +17,11 @@ C17461363 - All Gradient nodes can be removed from a graph import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py index 33fbeeec1b..efeba3b74a 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py @@ -19,10 +19,11 @@ C21333743 - Vegetation Layer Blenders are properly setup when constructing in a import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_ShapeNodes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_ShapeNodes.py index b74c2a70bc..3705cdc94e 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_ShapeNodes.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_ShapeNodes.py @@ -16,10 +16,11 @@ C17412059 - All Shape nodes can be removed from a graph import os import pytest + # Bail on the test if ly_test_tools doesn't exist. pytest.importorskip('ly_test_tools') import ly_test_tools.environment.file_system as file_system -import automatedtesting_shared.hydra_test_utils as hydra +import editor_python_test_tools.hydra_test_utils as hydra test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py b/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py index 6123729b1c..5e4432eafc 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py @@ -21,7 +21,7 @@ import azlmbr.areasystem as areasystem import azlmbr.paths sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests')) -import automatedtesting_shared.hydra_editor_utils as hydra +import editor_python_test_tools.hydra_editor_utils as hydra def create_surface_entity(name, center_point, box_size_x, box_size_y, box_size_z): diff --git a/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py b/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py index 04ff07daa2..e0277180ae 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py @@ -34,8 +34,8 @@ def C100000_RigidBody_EnablingGravityWorksPoC(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -84,5 +84,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C100000_RigidBody_EnablingGravityWorksPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py b/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py index 031b3121ab..c7dd8debb9 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py @@ -34,8 +34,8 @@ def C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -93,5 +93,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py b/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py index e5cee76415..216a75233f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py @@ -76,14 +76,13 @@ def C12712452_ScriptCanvas_CollisionEvents(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components import azlmbr.entity import azlmbr.physics - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Constants TIME_OUT_SECONDS = 3.0 @@ -209,5 +208,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12712452_ScriptCanvas_CollisionEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py b/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py index bcbd0d6e0a..2adf30e65e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py @@ -81,8 +81,8 @@ def C12712453_ScriptCanvas_MultipleRaycastNode(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -203,6 +203,6 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report # Disabled until Script Canvas merges the new backend #Report.start_test(C12712453_ScriptCanvas_MultipleRaycastNode) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py b/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py index 808f1e4c31..94eed900ff 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py @@ -106,9 +106,8 @@ def C12712454_ScriptCanvas_OverlapNodeVerification(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -328,5 +327,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12712454_ScriptCanvas_OverlapNodeVerification) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py b/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py index a5c827edb9..61f26ebecb 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py @@ -76,9 +76,8 @@ def C12712455_ScriptCanvas_ShapeCastVerification(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -145,5 +144,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12712455_ScriptCanvas_ShapeCastVerification) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py b/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py index b84adcd246..4745927e89 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py @@ -95,9 +95,8 @@ def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -291,5 +290,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py b/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py index 481c1fa43c..937fdd85a6 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py @@ -83,8 +83,8 @@ def C12868580_ForceRegion_SplineModifiedTransform(): imports.init() - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import itertools import azlmbr @@ -175,5 +175,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12868580_ForceRegion_SplineModifiedTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py b/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py index a9fb92b4fa..0cb0a2f841 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py @@ -63,8 +63,8 @@ def C12905527_ForceRegion_MagnitudeDeviation(): imports.init() - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -150,5 +150,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C12905527_ForceRegion_MagnitudeDeviation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py b/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py index d3fe35b1cd..42565333f7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py @@ -50,11 +50,12 @@ def run(): # Helper file Imports import ImportPathHelper as imports + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity + 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 diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py b/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py index d4bbdca52f..828022ccf2 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py @@ -64,9 +64,8 @@ def C13351703_COM_NotIncludeTriggerShapes(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -101,5 +100,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C13351703_COM_NotIncludeTriggerShapes) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py index eb3429f852..77d93d9752 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py @@ -131,8 +131,8 @@ def C13352089_RigidBodies_MaxAngularVelocity(): imports.init() - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr.math as lymath import azlmbr.legacy.general as general import azlmbr.bus @@ -288,5 +288,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C13352089_RigidBodies_MaxAngularVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py b/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py index 943fb4d754..1c580bfbfe 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py @@ -48,7 +48,8 @@ def C13508019_Terrain_TerrainTexturePainterWorks(): imports.init() - from utils import Report, TestHelper as helper + 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 @@ -143,5 +144,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C13508019_Terrain_TerrainTexturePainterWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py b/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py index db497dabc6..61efe20dbd 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py @@ -67,9 +67,8 @@ def C13895144_Ragdoll_ChangeLevel(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -112,5 +111,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C13895144_Ragdoll_ChangeLevel) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py index 4837de3538..5668082f78 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py @@ -70,9 +70,8 @@ def C14195074_ScriptCanvas_PostUpdateEvent(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -190,5 +189,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14195074_ScriptCanvas_PostUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py index 0958a4bbbb..fd5653b801 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py @@ -62,8 +62,8 @@ def C14654881_CharacterController_SwitchLevels(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -100,5 +100,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14654881_CharacterController_SwitchLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py b/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py index 2bc620e0c1..03c18a5f1a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py @@ -78,9 +78,8 @@ def C14654882_Ragdoll_ragdollAPTest(): imports.init() - - from utils import TestHelper as helper - from utils import Report + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -137,5 +136,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14654882_Ragdoll_ragdollAPTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py b/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py index 9aac3ae91c..e52bdb7574 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py @@ -57,9 +57,9 @@ def C14861498_ConfirmError_NoPxMesh(): imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.legacy.general as general @@ -92,5 +92,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14861498_ConfirmError_NoPxMesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py index 43d4d0e905..7a65448dcd 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py @@ -47,9 +47,9 @@ def C14861500_DefaultSetting_ColliderShape(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -77,5 +77,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14861500_DefaultSetting_ColliderShape) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py index a7fc5cf3b5..904b5b0189 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py @@ -24,7 +24,7 @@ class Tests(): # fmt: on -def run(): +def C14861501_PhysXCollider_RenderMeshAutoAssigned(): """ Summary: Create entity with Mesh component and assign a render mesh to the Mesh component. Add Physics Collider component @@ -55,13 +55,13 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper from asset_utils import Asset # Asset paths - STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.cgf") + STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.azmodel") PHYSX_MESH = os.path.join( "assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.pxmesh" ) @@ -80,8 +80,8 @@ def run(): # 4) Assign a render mesh asset to Mesh component (the fbx mesh having both Static mesh and PhysX collision Mesh) mesh_asset = Asset.find_asset_by_path(STATIC_MESH) - mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id) - mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset") + mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) + mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) # 5) Add PhysX Collider component @@ -95,4 +95,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from utils import Report + Report.start_test(C14861501_PhysXCollider_RenderMeshAutoAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py index 94c1d8e404..075c3f5b61 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py @@ -54,16 +54,16 @@ def C14861502_PhysXCollider_AssetAutoAssigned(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper from asset_utils import Asset # Open 3D Engine Imports import azlmbr.legacy.general as general - MESH_ASSET_PATH = os.path.join("Objects", "SphereBot", "r0-b_body.cgf") - MESH_PROPERTY_PATH = "MeshComponentRenderNode|Mesh asset" + MESH_ASSET_PATH = os.path.join("Objects", "SphereBot", "r0-b_body.azmodel") + MESH_PROPERTY_PATH = "Controller|Configuration|Mesh Asset" TESTED_PROPERTY_PATH = "Shape Configuration|Asset|PhysX Mesh" helper.init_idle() @@ -100,5 +100,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14861502_PhysXCollider_AssetAutoAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py b/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py index 0a6962a31c..bbaabf67f6 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py @@ -59,17 +59,17 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + 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 from asset_utils import Asset # Open 3D Engine Imports import azlmbr.asset as azasset # Asset paths - STATIC_MESH = os.path.join("assets", "c14861504_rendermeshasset_withnopxasset", "test_asset.cgf") + STATIC_MESH = os.path.join("assets", "c14861504_rendermeshasset_withnopxasset", "test_asset.azmodel") helper.init_idle() # 1) Load the empty level @@ -85,8 +85,8 @@ def run(): # 4) Assign a render mesh asset to Mesh component (the fbx mesh having both Static mesh and PhysX collision Mesh) mesh_asset = Asset.find_asset_by_path(STATIC_MESH) - mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id) - mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset") + mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) + mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) # 5) Add PhysX Collider component diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py index ea62be9768..45557098f7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py @@ -72,9 +72,8 @@ def C14902097_ScriptCanvas_PreUpdateEvent(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -197,5 +196,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14902097_ScriptCanvas_PreUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py index fc3ae2bc18..19caaab4fe 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py @@ -84,9 +84,8 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -118,5 +117,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14902098_ScriptCanvas_PostPhysicsUpdate) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py b/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py index 33a26d9433..342ac6bdbd 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py @@ -69,9 +69,8 @@ def C14976307_Gravity_SetGravityWorks(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -130,5 +129,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14976307_Gravity_SetGravityWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py index ea01c71310..815e922a76 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py @@ -100,14 +100,13 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components import azlmbr.math import azlmbr.physics - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import itertools class Entity: @@ -228,5 +227,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C14976308_ScriptCanvas_SetKinematicTargetTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py b/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py index f637981b1d..76ea9475ff 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py @@ -108,9 +108,8 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -293,5 +292,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py b/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py index fcbc0ff723..748052db56 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py @@ -101,9 +101,8 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -245,5 +244,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py b/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py index f393ddf527..4c7949cc91 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py @@ -149,8 +149,8 @@ def C15096735_Materials_DefaultLibraryConsistency(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -424,5 +424,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15096735_Materials_DefaultLibraryConsistency) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py b/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py index cf849bbea8..cc7dc3c5e2 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py @@ -115,9 +115,8 @@ def C15096737_Materials_DefaultMaterialLibraryChanges(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 from Physmaterial_Editor import Physmaterial_Editor @@ -301,5 +300,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15096737_Materials_DefaultMaterialLibraryChanges) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py b/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py index c69b722e27..0f33f0858b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py @@ -58,9 +58,9 @@ def C15096740_Material_LibraryUpdatedCorrectly(): imports.init() # Helper file Imports - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity + 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 asset_utils import Asset # Open 3D Engine Imports @@ -107,5 +107,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15096740_Material_LibraryUpdatedCorrectly) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py b/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py index 998d21067b..625a8bfb4a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py @@ -71,9 +71,8 @@ def C15308217_NoCrash_LevelSwitch(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -114,5 +113,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15308217_NoCrash_LevelSwitch) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py b/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py index a6ddb73438..3f6457f15c 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py @@ -114,7 +114,6 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -122,8 +121,8 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): import azlmbr.math as lymath from Physmaterial_Editor import Physmaterial_Editor - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper TIMEOUT = 3.0 BOUNCE_TOLERANCE = 0.1 @@ -252,5 +251,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15308221_Material_ComponentsInSyncWithLibrary) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py b/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py index f5a1fcebc3..57a0e6a75e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py @@ -53,10 +53,9 @@ def C15425929_Undo_Redo(): imports.init() - - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.legacy.general as general @@ -99,5 +98,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15425929_Undo_Redo) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py b/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py index d2db2239c2..f61886ccd0 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py @@ -122,8 +122,8 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -314,5 +314,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15425935_Material_LibraryUpdatedAcrossLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py b/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py index cb38a8a768..99e0dcc669 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py @@ -88,8 +88,8 @@ def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -209,5 +209,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15556261_PhysXMaterials_CharacterControllerMaterialAssignment) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py b/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py index 8b0fba05b1..4572dd322a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py @@ -116,14 +116,13 @@ def C15563573_Material_AddModifyDeleteOnCharacterController(): imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath from Physmaterial_Editor import Physmaterial_Editor - from utils import Report - from utils import TestHelper as helper from AddModifyDelete_Utils import Box + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper FORCE_IMPULSE = lymath.Vector3(5.0, 0.0, 0.0) TIMEOUT = 3.0 @@ -205,5 +204,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15563573_Material_AddModifyDeleteOnCharacterController) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py b/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py index 2eb7759ead..52af7d8be5 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py @@ -65,9 +65,8 @@ def C15845879_ForceRegion_HighLinearDampingForce(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -177,5 +176,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C15845879_ForceRegion_HighLinearDampingForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py b/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py index a3115ceeab..68efd452b2 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py @@ -53,10 +53,10 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import TestHelper as helper + from editor_python_test_tools.utils import Tracer helper.init_idle() # 1) Load the level diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py index 76b05a4ce9..b13869ce12 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py @@ -58,9 +58,8 @@ def C18243580_Joints_Fixed2BodiesConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -107,5 +106,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243580_Joints_Fixed2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py index ffc48f6e3c..19feee575b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py @@ -57,9 +57,8 @@ def C18243581_Joints_FixedBreakable(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -106,5 +105,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243581_Joints_FixedBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py index 6c0f98b694..c9c90d35a7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py @@ -59,9 +59,8 @@ def C18243582_Joints_FixedLeadFollowerCollide(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -101,5 +100,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243582_Joints_FixedLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py index fd1fb02557..66343534a7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py @@ -61,9 +61,8 @@ def C18243583_Joints_Hinge2BodiesConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -124,5 +123,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243583_Joints_Hinge2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py index c1ed3328a7..3b335cc5c6 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py @@ -61,9 +61,8 @@ def C18243584_Joints_HingeSoftLimitsConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -120,5 +119,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243584_Joints_HingeSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py index 515c51eb0b..289522fcac 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py @@ -61,9 +61,8 @@ def C18243585_Joints_HingeNoLimitsConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -120,5 +119,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243585_Joints_HingeNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py index d673885ea1..60b9189c83 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py @@ -58,9 +58,8 @@ def C18243586_Joints_HingeLeadFollowerCollide(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -100,5 +99,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243586_Joints_HingeLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py index d58d618b99..af6fa8cbac 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py @@ -59,9 +59,8 @@ def C18243587_Joints_HingeBreakable(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -118,5 +117,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243587_Joints_HingeBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py index 1ead30c65e..074ca03000 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py @@ -60,9 +60,8 @@ def C18243588_Joints_Ball2BodiesConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -122,5 +121,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243588_Joints_Ball2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py index d29c472fcd..e038b33043 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py @@ -62,9 +62,8 @@ def C18243589_Joints_BallSoftLimitsConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -123,5 +122,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243589_Joints_BallSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py index d3a0c8e82c..ede46fd5c5 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py @@ -63,9 +63,8 @@ def C18243590_Joints_BallNoLimitsConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -121,5 +120,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243590_Joints_BallNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py index ba8967acab..c3e527956f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py @@ -58,9 +58,8 @@ def C18243591_Joints_BallLeadFollowerCollide(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -100,5 +99,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243591_Joints_BallLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py index 2b07d63a43..350fccd125 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py @@ -58,9 +58,8 @@ def C18243592_Joints_BallBreakable(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -116,5 +115,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243592_Joints_BallBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py index 1ebdaf73b3..4580a229ea 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py @@ -62,9 +62,8 @@ def C18243593_Joints_GlobalFrameConstrained(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -129,5 +128,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18243593_Joints_GlobalFrameConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py index 46f1535bf4..57dfc0f349 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py @@ -136,8 +136,8 @@ def C18977601_Material_FrictionCombinePriority(): imports.init() - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -364,5 +364,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18977601_Material_FrictionCombinePriority) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py index 800ad38264..9b7fea1ab9 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py @@ -135,9 +135,8 @@ def C18981526_Material_RestitutionCombinePriority(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -425,5 +424,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C18981526_Material_RestitutionCombinePriority) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py b/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py index 8dbee3cd4e..48c947aa1f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py @@ -50,9 +50,9 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import TestHelper as helper ACTIVE_STATUS = azlmbr.globals.property.EditorEntityStartStatus_StartActive diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py b/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py index 141c9fb4db..66e1302b5b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py @@ -50,9 +50,9 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import TestHelper as helper ACTIVE_STATUS = azlmbr.globals.property.EditorEntityStartStatus_StartActive diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py index 8910a4ded4..32ece8541c 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py @@ -56,9 +56,9 @@ def C19578018_ShapeColliderWithNoShapeComponent(): imports.init() # Helper Imports - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import TestHelper as helper # Open 3D Engine Imports import azlmbr.bus as bus @@ -99,5 +99,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C19578018_ShapeColliderWithNoShapeComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py b/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py index 5c940264ff..0c42f5457d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py @@ -51,10 +51,10 @@ def C19578021_ShapeCollider_CanBeAdded(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + 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 # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -97,5 +97,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C19578021_ShapeCollider_CanBeAdded) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py index 3296b32fc9..769f08e3c4 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py @@ -47,9 +47,9 @@ def C19723164_ShapeColliders_WontCrashEditor(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -103,5 +103,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C19723164_ShapeColliders_WontCrashEditor) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py index b879e37aa9..d8e0a6769c 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py @@ -57,8 +57,8 @@ def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Global time out TIME_OUT = 1.0 @@ -119,5 +119,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py b/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py index 9f595616e7..8980e68250 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py @@ -56,9 +56,9 @@ def C28978033_Ragdoll_WorldBodyBusTests(): import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper - from utils import vector3_str, aabb_str + 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 vector3_str, aabb_str # Global time out TIME_OUT = 1.0 @@ -123,5 +123,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C28978033_Ragdoll_WorldBodyBusTests) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py b/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py index 2dc9a306c7..be541e4bf9 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py @@ -94,9 +94,9 @@ def C29032500_EditorComponents_WorldBodyBusWorks(): import azlmbr.legacy.general as general import azlmbr.bus import math - from utils import Report - from utils import TestHelper as helper - from utils import vector3_str, aabb_str + 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 vector3_str, aabb_str AABB_THRESHOLD = 0.01 # Entities won't move in the simulation @@ -161,5 +161,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C29032500_EditorComponents_WorldBodyBusWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py index 086f045eec..3e3770adb9 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py @@ -74,12 +74,11 @@ def C3510642_Terrain_NotCollideWithTerrain(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Constants TIMEOUT = 2.0 @@ -176,5 +175,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C3510642_Terrain_NotCollideWithTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py b/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py index 765f7cbfe0..4ae10288bd 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py @@ -100,8 +100,8 @@ def C3510644_Collider_CollisionGroups(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -370,5 +370,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C3510644_Collider_CollisionGroups) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py b/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py index aae538527a..5f2c40f11e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py @@ -182,9 +182,8 @@ def C4044455_Material_libraryChangesInstantly(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -486,5 +485,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044455_Material_libraryChangesInstantly) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py index 80b7c6443f..b71c1e8ede 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py @@ -100,9 +100,8 @@ def C4044456_Material_FrictionCombine(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -221,5 +220,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044456_Material_FrictionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py index 856a663fe6..1ed2e8086c 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py @@ -105,9 +105,8 @@ def C4044457_Material_RestitutionCombine(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -253,5 +252,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044457_Material_RestitutionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py b/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py index ab4a8c1574..c420250dfa 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py @@ -91,9 +91,8 @@ def C4044459_Material_DynamicFriction(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -199,5 +198,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044459_Material_DynamicFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py b/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py index 9918c5fac6..4e330002ff 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py @@ -89,9 +89,8 @@ def C4044460_Material_StaticFriction(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -196,5 +195,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044460_Material_StaticFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py b/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py index a11cfd47f6..af8990d87f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py @@ -96,9 +96,8 @@ def C4044461_Material_Restitution(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -238,5 +237,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044461_Material_Restitution) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py b/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py index 3c3b777a69..a8375114d5 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py @@ -75,15 +75,14 @@ def C4044694_Material_EmptyLibraryUsesDefault(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components import azlmbr.physics import azlmbr.math as lymath - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper FORCE_IMPULSE = lymath.Vector3(5.0, 0.0, 0.0) TIMEOUT = 3.0 @@ -197,5 +196,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044694_Material_EmptyLibraryUsesDefault) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py index cc2caaf3b6..858e778f07 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py @@ -27,7 +27,7 @@ class Tests(): # fmt: on -def run(): +def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): """ Summary: Create entity with Mesh and PhysX Collider components and assign a fbx file in both the components. @@ -45,12 +45,7 @@ def run(): 4) Select the PhysicsAsset shape in the PhysX Collider component 5) Assign the fbx file in PhysX Mesh and Mesh component 6) Check if multiple material slots show up under Materials section in the PhysX Collider component - - Note: - - This test file must be called from the Open 3D Engine Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - + :return: None """ # Builtins @@ -60,9 +55,9 @@ def run(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper from asset_utils import Asset # Constants @@ -70,7 +65,7 @@ def run(): SURFACE_TAG_COUNT = 4 # Number of surface tags included in used asset # Asset paths - STATIC_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.cgf") + STATIC_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.azmodel") PHYSX_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.pxmesh") helper.init_idle() @@ -100,8 +95,8 @@ def run(): Report.result(Tests.assign_px_mesh_asset, px_asset.get_path() == PHYSX_MESH.replace(os.sep, "/")) mesh_asset = Asset.find_asset_by_path(STATIC_MESH) - mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id) - mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset") + mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) + mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) # 6) Check if multiple material slots show up under Materials section in the PhysX Collider component @@ -116,4 +111,8 @@ def run(): if __name__ == "__main__": - run() + import ImportPathHelper as imports + imports.init() + + from utils import Report + Report.start_test(C4044695_PhysXCollider_AddMultipleSurfaceFbx) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py b/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py index 46a6b04edf..dba759015f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py @@ -116,9 +116,8 @@ def C4044697_Material_PerfaceMaterialValidation(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -310,5 +309,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4044697_Material_PerfaceMaterialValidation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py b/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py index 49673da217..145a5e1b60 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py @@ -99,13 +99,12 @@ def C4888315_Material_AddModifyDeleteOnCollider(): imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath from Physmaterial_Editor import Physmaterial_Editor - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper from AddModifyDelete_Utils import Box FORCE_IMPULSE = lymath.Vector3(5.0, 0.0, 0.0) @@ -184,5 +183,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4888315_Material_AddModifyDeleteOnCollider) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py index 80a83e0222..59b6a3fdfc 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py @@ -85,9 +85,8 @@ def C4925577_Materials_MaterialAssignedToTerrain(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -313,5 +312,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4925577_Materials_MaterialAssignedToTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py index 87f94c6dd4..e0425c35be 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py @@ -100,13 +100,12 @@ def C4925579_Material_AddModifyDeleteOnTerrain(): imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath from Physmaterial_Editor import Physmaterial_Editor - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper from AddModifyDelete_Utils import Box FORCE_IMPULSE = lymath.Vector3(5.0, 0.0, 0.0) @@ -184,5 +183,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4925579_Material_AddModifyDeleteOnTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py b/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py index abb97da143..9944a033e3 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py @@ -75,13 +75,12 @@ def C4925580_Material_RagdollBonesMaterial(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components import azlmbr.physics - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Constants TIME_OUT_SECONDS = 3.0 @@ -202,5 +201,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4925580_Material_RagdollBonesMaterial) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py b/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py index 0a309133a4..ed872ae99e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py @@ -101,7 +101,6 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -109,8 +108,8 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): import azlmbr.math as lymath from Physmaterial_Editor import Physmaterial_Editor - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper TIMEOUT = 3.0 BOUNCE_TOLERANCE = 0.05 @@ -220,5 +219,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4925582_Material_AddModifyDeleteOnRagdollBones) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py b/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py index 90feb352b3..aa059eb224 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py @@ -62,9 +62,8 @@ def C4976194_RigidBody_PhysXComponentIsValid(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -118,5 +117,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976194_RigidBody_PhysXComponentIsValid) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py index 287bc75214..c5740b2798 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py @@ -67,8 +67,8 @@ def C4976195_RigidBodies_InitialLinearVelocity(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -139,5 +139,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976195_RigidBodies_InitialLinearVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py index 82b8df29f7..08e171269e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py @@ -80,8 +80,8 @@ def C4976197_RigidBodies_InitialAngularVelocity(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -184,5 +184,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976197_RigidBodies_InitialAngularVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py b/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py index 1660e71955..2e19b633c4 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py @@ -65,8 +65,8 @@ def C4976199_RigidBodies_LinearDampingObjectMotion(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -277,5 +277,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976199_RigidBodies_LinearDampingObjectMotion) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py b/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py index e5438cd132..b90b34be53 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py @@ -69,9 +69,9 @@ def C4976200_RigidBody_AngularDampingObjectRotation(): imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import AngleHelper + 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 AngleHelper import azlmbr.legacy.general as general import azlmbr.bus @@ -292,5 +292,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976200_RigidBody_AngularDampingObjectRotation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py index e8086e4965..7fb0ff84ce 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py @@ -110,13 +110,12 @@ def C4976201_RigidBody_MassIsAssigned(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper MOVEMENT_TIMEOUT = 7.0 COLLISION_TIMEOUT = 2.0 @@ -381,5 +380,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976201_RigidBody_MassIsAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py b/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py index f74119dd28..7d4cf1066e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py @@ -133,12 +133,11 @@ def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -334,5 +333,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976202_RigidBody_StopsWhenBelowKineticThreshold) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py b/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py index fae8ea9a3a..29fc2ec2a3 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py @@ -71,9 +71,8 @@ def C4976204_Verify_Start_Asleep_Condition(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -120,5 +119,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976204_Verify_Start_Asleep_Condition) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py b/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py index a8227b6b1f..b97c590a93 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py @@ -73,8 +73,8 @@ def C4976206_RigidBodies_GravityEnabledActive(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -152,5 +152,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976206_RigidBodies_GravityEnabledActive) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py b/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py index 8003f495c8..4481c00fc5 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py @@ -70,8 +70,8 @@ def C4976207_PhysXRigidBodies_KinematicBehavior(): import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Specific wait times in seconds TIME_OUT = 3.0 @@ -139,5 +139,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976207_PhysXRigidBodies_KinematicBehavior) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py b/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py index 9f67751d67..79ea6e5dc7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py @@ -95,9 +95,8 @@ def C4976209_RigidBody_ComputesCOM(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -181,5 +180,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976209_RigidBody_ComputesCOM) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py b/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py index 7cda1bf6f0..451081ba23 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py @@ -77,8 +77,8 @@ def C4976210_COM_ManualSetting(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 azlmbr @@ -305,5 +305,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976210_COM_ManualSetting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py b/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py index 289584ef51..63f0d382c3 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py @@ -47,13 +47,13 @@ def C4976218_RigidBodies_InertiaObjectsNotComputed(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components import azlmbr.physics - from utils import Report, TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper class UpperBox: def __init__(self, name): @@ -167,5 +167,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976218_RigidBodies_InertiaObjectsNotComputed) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py b/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py index c9b9dfb89f..8d9dc01396 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py @@ -60,9 +60,8 @@ def C4976227_Collider_NewGroup(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -92,5 +91,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976227_Collider_NewGroup) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py b/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py index 8c1527fc89..72442601e4 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py @@ -27,7 +27,7 @@ class Tests(): def C4976236_AddPhysxColliderComponent(): """ Summary: - Load level with Entity having PhysX Collider component. Verify that editor remains stable in Game mode. + Opens an empty level and creates an Entity with PhysX Collider. Verify that editor remains stable in Game mode. Expected Behavior: The Editor is stable there are no warnings or errors. @@ -37,16 +37,10 @@ def C4976236_AddPhysxColliderComponent(): 2) Create test entity 3) Start the Tracer to catch any errors and warnings 4) Add the PhysX Collider component and change shape to box - 5) Add Mesh component and an asset - 6) Enter game mode - 7) Verify there are no errors and warnings in the logs - 8) Exit game mode - 9) Close the editor - - Note: - - This test file must be called from the Open 3D Engine Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. + 5) Enter game mode + 6) Verify there are no errors and warnings in the logs + 7) Exit game mode + 8) Close the editor :return: None """ @@ -55,12 +49,12 @@ def C4976236_AddPhysxColliderComponent(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from utils import Tracer - from editor_entity_utils import EditorEntity + 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 from asset_utils import Asset - + helper.init_idle() # 1) Load the level helper.open_level("Physics", "Base") @@ -74,17 +68,12 @@ def C4976236_AddPhysxColliderComponent(): # 4) Add the PhysX Collider component and change shape to box collider_component = test_entity.add_component("PhysX Collider") Report.result(Tests.add_physx_collider, test_entity.has_component("PhysX Collider")) - collider_component.set_component_property_value('Shape Configuration|Shape', 1) + collider_component.set_component_property_value('Shape Configuration|Shape', azlmbr.physics.ShapeType_Box) - # 5) Add Mesh component and an asset - mesh_component = test_entity.add_component("Mesh") - asset = Asset.find_asset_by_path(r"Objects\default\primitive_cube.cgf") - mesh_component.set_component_property_value('MeshComponentRenderNode|Mesh asset', asset.id) - - # 6) Enter game mode + # 5) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) - # 7) Verify there are no errors and warnings in the logs + # 6) Verify there are no errors and warnings in the logs success_condition = not (section_tracer.has_errors or section_tracer.has_warnings) Report.result(Tests.no_errors_and_warnings_found, success_condition) if not success_condition: @@ -92,9 +81,8 @@ def C4976236_AddPhysxColliderComponent(): Report.info(f"Warnings found: {section_tracer.warnings}") if section_tracer.has_errors: Report.info(f"Errors found: {section_tracer.errors}") - Report.failure(Tests.no_errors_and_warnings_found) - # 8) Exit game mode + # 7) Exit game mode helper.exit_game_mode(Tests.exit_game_mode) @@ -103,5 +91,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976236_AddPhysxColliderComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py b/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py index 93d1981187..bb6234b69e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py @@ -71,9 +71,8 @@ def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -196,5 +195,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976242_Collision_SameCollisionlayerSameCollisiongroup) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py b/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py index a4a89fcdec..949ebb2b2a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py @@ -75,9 +75,8 @@ def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -135,5 +134,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976243_Collision_SameCollisionGroupDiffCollisionLayers) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py b/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py index 2770b0142c..c35b9fab81 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py @@ -71,8 +71,8 @@ def C4976244_Collider_SameGroupSameLayerCollision(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -192,5 +192,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976244_Collider_SameGroupSameLayerCollision) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py index c70154f0be..dafb8d9014 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py @@ -76,8 +76,8 @@ def C4976245_PhysXCollider_CollisionLayerTest(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -230,5 +230,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4976245_PhysXCollider_CollisionLayerTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py index a05550ba90..8d985de402 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py @@ -76,8 +76,8 @@ def C4982593_PhysXCollider_CollisionLayerTest(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -238,5 +238,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982593_PhysXCollider_CollisionLayerTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py b/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py index 86d862d547..8746996ca8 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py @@ -84,13 +84,12 @@ def C4982595_Collider_TriggerDisablesCollision(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components import azlmbr.physics - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper TIME_OUT_SECONDS = 3.0 SPHERE_RADIUS = 1.0 @@ -242,5 +241,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982595_Collider_TriggerDisablesCollision) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py b/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py index cbe8d7d47e..2bd4fc5adc 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py @@ -95,8 +95,8 @@ def C4982797_Collider_ColliderOffset(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 azlmbr @@ -339,5 +339,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982797_Collider_ColliderOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py b/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py index f64d762b3b..f86890d8bf 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py @@ -96,8 +96,8 @@ def C4982798_Collider_ColliderRotationOffset(): # Internal editor imports - from utils import Report - from utils import TestHelper as helper + 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 azlmbr @@ -307,5 +307,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982798_Collider_ColliderRotationOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py index d38bf780d4..c37ad2b2d2 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py @@ -50,9 +50,9 @@ def C4982800_PhysXColliderShape_CanBeSelected(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Open 3D Engine Imports import azlmbr.math as math @@ -98,5 +98,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982800_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py index 940f774088..19a835da18 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py @@ -50,9 +50,9 @@ def C4982801_PhysXColliderShape_CanBeSelected(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Open 3D Engine Imports import azlmbr.math as math @@ -110,5 +110,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982801_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py index eba549abde..e1365d0887 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py @@ -50,9 +50,9 @@ def C4982802_PhysXColliderShape_CanBeSelected(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Open 3D Engine Imports import azlmbr.math as math @@ -110,5 +110,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982802_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py b/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py index da201ddeda..4ae177934a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py @@ -63,9 +63,9 @@ def C4982803_Enable_PxMesh_Option(): import ImportPathHelper as imports imports.init() - from utils import Report - from utils import TestHelper as helper - from editor_entity_utils import EditorEntity + 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 asset_utils import Asset import azlmbr.math as math @@ -146,5 +146,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C4982803_Enable_PxMesh_Option) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py index cca768fb52..9d2a49ac70 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py @@ -69,8 +69,8 @@ def C5296614_PhysXMaterial_ColliderShape(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -159,5 +159,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5296614_PhysXMaterial_ColliderShape) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py b/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py index f012fe73c0..7617e41cad 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py @@ -76,11 +76,10 @@ def C5340400_RigidBody_ManualMomentOfInertia(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Specific wait time in seconds TIME_OUT = 3.0 @@ -168,5 +167,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5340400_RigidBody_ManualMomentOfInertia) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py index 359565402a..0686adf15d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py @@ -58,8 +58,8 @@ def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Global time out TIME_OUT = 1.0 @@ -120,5 +120,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689518_PhysXTerrain_CollidesWithPhysXTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py b/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py index 10ebcacdb7..ffafeaab34 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py @@ -67,12 +67,11 @@ def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): imports.init() - import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.bus @@ -113,5 +112,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689522_Physxterrain_AddPhysxterrainNoEditorCrash) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py b/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py index b00821343b..2b1a73f1f3 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py @@ -72,9 +72,9 @@ def C5689524_MultipleTerrains_CheckWarningInConsole(): import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.bus @@ -114,5 +114,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689524_MultipleTerrains_CheckWarningInConsole) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py b/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py index f540cae081..265836489d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py @@ -69,10 +69,9 @@ def C5689528_Terrain_MultipleTerrainComponents(): imports.init() - - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.legacy.general as general @@ -111,5 +110,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689528_Terrain_MultipleTerrainComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py b/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py index 2fbf21fb72..138ae68408 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py @@ -67,9 +67,8 @@ def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -114,5 +113,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689529_Verify_Terrain_RigidBody_Collider_Mesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py b/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py index c8e5d6873b..7d60a61ec1 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py @@ -74,10 +74,9 @@ def C5689531_Warning_TerrainSliceTerrainComponent(): imports.init() - - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.legacy.general as general @@ -123,5 +122,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5689531_Warning_TerrainSliceTerrainComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py b/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py index 87bc4812b2..f01dd4582f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py @@ -74,9 +74,8 @@ def C5932040_ForceRegion_CubeExertsWorldForce(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -191,5 +190,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932040_ForceRegion_CubeExertsWorldForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py index d78f0f386a..095a669541 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py @@ -74,9 +74,8 @@ def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -169,5 +168,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py b/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py index a3f6de6a5f..04cecd45b2 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py @@ -80,8 +80,8 @@ def C5932042_PhysXForceRegion_LinearDamping(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -276,5 +276,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932042_PhysXForceRegion_LinearDamping) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py index 2c019b092c..512698ce4b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py @@ -50,7 +50,8 @@ def C5932043_ForceRegion_SimpleDragOnRigidBodies(): imports.init() - from utils import Report, TestHelper as helper + 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 @@ -145,5 +146,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932043_ForceRegion_SimpleDragOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py index 4f8121e254..b7257b488b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py @@ -74,9 +74,8 @@ def C5932044_ForceRegion_PointForceOnRigidBody(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -197,5 +196,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932044_ForceRegion_PointForceOnRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py b/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py index 4cb71ab54c..eca0679921 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py @@ -79,9 +79,8 @@ def C5932045_ForceRegion_Spline(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import itertools import azlmbr @@ -170,5 +169,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5932045_ForceRegion_Spline) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py b/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py index 5271bec2ec..6aff0a7145 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py @@ -47,8 +47,8 @@ def C5959759_RigidBody_ForceRegionSpherePointForce(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -157,5 +157,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959759_RigidBody_ForceRegionSpherePointForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py b/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py index 42020c78b7..89eb1842be 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py @@ -72,8 +72,8 @@ def C5959760_PhysXForceRegion_PointForceExertion(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -230,5 +230,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959760_PhysXForceRegion_PointForceExertion) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py b/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py index af9af57363..ba0475266b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py @@ -76,8 +76,8 @@ def C5959761_ForceRegion_PhysAssetExertsPointForce(): import azlmbr.bus as bus import azlmbr.math - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper TIMEOUT = 2.0 @@ -147,5 +147,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959761_ForceRegion_PhysAssetExertsPointForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py b/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py index 2b7bf49278..76130d25eb 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py @@ -50,7 +50,8 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): imports.init() - from utils import Report, TestHelper as helper + 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 @@ -171,5 +172,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959763_ForceRegion_ForceRegionImpulsesCube) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py b/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py index 02bba2f848..f314dae5b7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py @@ -50,7 +50,8 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): imports.init() - from utils import Report, TestHelper as helper + 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 @@ -173,5 +174,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959764_ForceRegion_ForceRegionImpulsesCapsule) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py b/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py index 1afd7b4536..ddcba5996b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py @@ -53,7 +53,8 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): imports.init() - from utils import Report, TestHelper as helper + 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 @@ -175,5 +176,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959765_ForceRegion_AssetGetsImpulsed) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py b/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py index f105c5642e..175f73a420 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py @@ -133,8 +133,8 @@ def C5959808_ForceRegion_PositionOffset(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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.math as azmath @@ -412,5 +412,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959808_ForceRegion_PositionOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py b/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py index f0379d20f7..1ad53194d3 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py @@ -134,8 +134,8 @@ def C5959809_ForceRegion_RotationalOffset(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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.math as azmath @@ -412,5 +412,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959809_ForceRegion_RotationalOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py b/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py index e09b58ecdc..212f7cc86b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py @@ -74,8 +74,8 @@ def C5959810_ForceRegion_ForceRegionCombinesForces(): imports.init() - from utils import Report - from utils import TestHelper as helper + 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 @@ -241,5 +241,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5959810_ForceRegion_ForceRegionCombinesForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py index 3bdb4410ea..4aa0fef642 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py @@ -67,7 +67,8 @@ def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.physics - from utils import Report, TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Constants TIME_OUT = 6.0 # Second to wait before timing out @@ -181,5 +182,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py b/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py index 7c7c11f548..ba491c96a7 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py @@ -70,9 +70,8 @@ def C5968760_ForceRegion_CheckNetForceChange(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -171,5 +170,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C5968760_ForceRegion_CheckNetForceChange) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py b/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py index d79954d26f..4543b0b8f6 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py @@ -89,9 +89,8 @@ def C6032082_Terrain_MultipleResolutionsValid(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -217,5 +216,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6032082_Terrain_MultipleResolutionsValid) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py b/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py index 825b8287d1..557b7e7ec5 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py @@ -72,9 +72,8 @@ def C6090546_ForceRegion_SliceFileInstantiates(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -146,5 +145,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090546_ForceRegion_SliceFileInstantiates) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py b/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py index a62a673b9f..a07fd1861b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py @@ -81,13 +81,12 @@ def C6090547_ForceRegion_ParentChildForceRegions(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.math as lymath - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Constants TIMEOUT = 3.0 @@ -207,5 +206,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090547_ForceRegion_ParentChildForceRegions) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py index c85dc6a273..f8da62ebac 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py @@ -78,12 +78,11 @@ def C6090550_ForceRegion_WorldSpaceForceNegative(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -251,5 +250,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090550_ForceRegion_WorldSpaceForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py index 45f9b21522..0788b1da66 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py @@ -78,12 +78,11 @@ def C6090551_ForceRegion_LocalSpaceForceNegative(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -251,5 +250,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090551_ForceRegion_LocalSpaceForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py b/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py index 5751f55b0c..a878819045 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py @@ -77,12 +77,11 @@ def C6090552_ForceRegion_LinearDampingNegative(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -250,5 +249,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090552_ForceRegion_LinearDampingNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py index 3c995bca62..43c4335918 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py @@ -72,12 +72,11 @@ def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper # Holds details about the ball class Ball: @@ -182,5 +181,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090553_ForceRegion_SimpleDragForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py index 0ea8ca2e4b..d7781b6040 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py @@ -78,12 +78,11 @@ def C6090554_ForceRegion_PointForceNegative(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -251,5 +250,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090554_ForceRegion_PointForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py index dfa992bc21..b1b76d896d 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py @@ -74,9 +74,8 @@ def C6090555_ForceRegion_SplineFollowOnRigidBodies(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr import azlmbr.legacy.general as general @@ -184,5 +183,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6090555_ForceRegion_SplineFollowOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py b/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py index 5e475a4c4c..11281df4eb 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py @@ -67,9 +67,8 @@ def C6131473_StaticSlice_OnDynamicSliceSpawn(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -111,5 +110,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6131473_StaticSlice_OnDynamicSliceSpawn) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py b/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py index f88e07bf86..6501e11e68 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py @@ -69,9 +69,8 @@ def C6224408_ScriptCanvas_EntitySpawn(): imports.init() - - from utils import Report - from utils import TestHelper as helper + 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 @@ -152,5 +151,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6224408_ScriptCanvas_EntitySpawn) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py b/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py index 64baa81140..44c8be9e1e 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py @@ -75,12 +75,11 @@ def C6274125_ScriptCanvas_TriggerEvents(): imports.init() - import azlmbr.legacy.general as general import azlmbr.bus - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() @@ -136,5 +135,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6274125_ScriptCanvas_TriggerEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py b/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py index 2b0168a2fe..c1a51f2887 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py @@ -99,10 +99,9 @@ def C6321601_Force_HighValuesDirectionAxes(): imports.init() - - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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 import azlmbr.legacy.general as general import azlmbr.bus @@ -256,5 +255,5 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(C6321601_Force_HighValuesDirectionAxes) diff --git a/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py b/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py index db07f4e14a..e61118ef5b 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py +++ b/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py @@ -13,7 +13,7 @@ import ImportPathHelper as imports imports.init() -from utils import Report +from editor_python_test_tools.utils import Report import azlmbr.legacy.general as general import azlmbr.bus diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py new file mode 100644 index 0000000000..67e855a00e --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py @@ -0,0 +1,37 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +""" + +# This suite consists of all test cases that are passing and have been verified. + +import pytest +import os +import sys + +from .FileManagement import FileManagement as fm +from ly_test_tools import LAUNCHERS + +sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') + +from base import TestAutomationBase + + +revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', 'physxdefaultsceneconfiguration.setreg', 'physxsystemconfiguration.setreg'], 'AutomatedTesting/Registry') + + +@pytest.mark.SUITE_main +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) +@pytest.mark.parametrize("project", ["AutomatedTesting"]) +class TestAutomation(TestAutomationBase): + + def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform): + from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module + self._run_test(request, workspace, editor, test_module) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py rename to AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py index 805e4f7d79..39ed85a65a 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py @@ -27,26 +27,16 @@ from base import TestAutomationBase revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', 'physxdefaultsceneconfiguration.setreg', 'physxsystemconfiguration.setreg'], 'AutomatedTesting/Registry') -@pytest.mark.SUITE_main +@pytest.mark.SUITE_periodic @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): - # Marking the test as an expected failure due to sporadic failure on Automated Review: SPEC-3146 - # The test still runs, but a failure of the test doesn't result in the test run failing - @pytest.mark.xfail( - reason="This test seems to fail sometimes due to it being the first test in the testsuite, we'll duplicate it temporarly." - "Need to figure out the reason why this is the case") - @revert_physics_config - def test_C000000_RigidBody_EnablingGravityWorksPoC_DUPLICATE(self, request, workspace, editor, launcher_platform): - from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module - self._run_test(request, workspace, editor, test_module) - @revert_physics_config def test_C3510642_Terrain_NotCollideWithTerrain(self, request, workspace, editor, launcher_platform): from . import C3510642_Terrain_NotCollideWithTerrain as test_module self._run_test(request, workspace, editor, test_module) - + @revert_physics_config def test_C4976195_RigidBodies_InitialLinearVelocity(self, request, workspace, editor, launcher_platform): from . import C4976195_RigidBodies_InitialLinearVelocity as test_module @@ -279,6 +269,8 @@ class TestAutomation(TestAutomationBase): from . import C18977601_Material_FrictionCombinePriority as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail( + reason="Something with the CryRenderer disabling is causing this test to fail now.") @revert_physics_config def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform): from . import C13895144_Ragdoll_ChangeLevel as test_module @@ -530,8 +522,4 @@ class TestAutomation(TestAutomationBase): def test_C100000_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform): from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module - self._run_test(request, workspace, editor, test_module) - - def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform): - from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module - self._run_test(request, workspace, editor, test_module) + self._run_test(request, workspace, editor, test_module) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py index 94c1335536..bc6697afaf 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py +++ b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py @@ -22,8 +22,8 @@ def run(): imports.init() - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper helper.init_idle() Report.success(Tests.passed) diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py index 666b4910a1..5f24f41083 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py +++ b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py @@ -58,9 +58,8 @@ def run(): imports.init() - - from utils import Report - from utils import TestHelper as helper + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general from Physmaterial_Editor import Physmaterial_Editor diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py index 0aeb8aa73a..fa904250ea 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py +++ b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py @@ -39,12 +39,11 @@ def run(): imports.init() - import azlmbr.legacy.general as general - from utils import Report - from utils import TestHelper as helper - from utils import Tracer + 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() diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py index 3b54c0de72..25dd83e5e2 100755 --- a/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py @@ -51,9 +51,9 @@ def Docking_Pane(): imports.init() - from utils import Report - from utils import TestHelper as helper - import pyside_utils + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper + import editor_python_test_tools.pyside_utils as pyside_utils # Open 3D Engine imports import azlmbr.legacy.general as general @@ -114,6 +114,6 @@ if __name__ == "__main__": imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(Docking_Pane) diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py index 4ea4d791dd..6100285092 100755 --- a/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py @@ -54,9 +54,9 @@ def Opening_Closing_Pane(): imports.init() - from utils import Report - from utils import TestHelper as helper - import pyside_utils + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper + import editor_python_test_tools.pyside_utils as pyside_utils # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -123,6 +123,6 @@ if __name__ == "__main__": imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(Opening_Closing_Pane) diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py index 216ef4fb7d..9262e76cb0 100755 --- a/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py @@ -51,9 +51,9 @@ def Resizing_Pane(): imports.init() - from utils import Report - from utils import TestHelper as helper - import pyside_utils + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper + import editor_python_test_tools.pyside_utils as pyside_utils # Open 3D Engine imports import azlmbr.legacy.general as general @@ -115,6 +115,6 @@ if __name__ == "__main__": import ImportPathHelper as imports imports.init() - from utils import Report + from editor_python_test_tools.utils import Report Report.start_test(Resizing_Pane) diff --git a/AutomatedTesting/Levels/Physics/Base/Base.ly b/AutomatedTesting/Levels/Physics/Base/Base.ly index 97546ff3a2..f99dc672b0 100644 --- a/AutomatedTesting/Levels/Physics/Base/Base.ly +++ b/AutomatedTesting/Levels/Physics/Base/Base.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:75cb1c8454aafc3de81351450a9480f91cb98d926a6e47f87a5ffe91e1d5a7d5 -size 4745 +oid sha256:f63204a86af8bc0963a4823d047a2e222cc19aabd14570d0789dc90cdc82970c +size 2017 diff --git a/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml index 456d609b8a..6ea168cc6b 100644 --- a/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml +++ b/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml @@ -1,356 +1,356 @@ - - + + - - + + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - + - - + + - + - + - - + + diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas index a422f072a5..34e80f3ccd 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,21 @@ - + - + - + - + - + @@ -39,23 +39,9 @@ - - - - - - - - - - - - - - - - + + @@ -76,12 +62,13 @@ + - + @@ -91,45 +78,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -150,12 +100,13 @@ + - + @@ -165,8 +116,8 @@ - - + + @@ -187,123 +138,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -317,22 +158,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - - - + @@ -354,52 +258,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + - + - - - - - - - - - + + + + + + + - - - + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + @@ -408,7 +516,375 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -441,7 +917,7 @@ - + @@ -468,6 +944,7 @@ + @@ -505,6 +982,7 @@ + @@ -542,6 +1020,7 @@ + @@ -579,6 +1058,7 @@ + @@ -616,6 +1096,7 @@ + @@ -653,6 +1134,7 @@ + @@ -690,6 +1172,7 @@ + @@ -719,7 +1202,7 @@ - + @@ -746,6 +1229,7 @@ + @@ -800,1929 +1284,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2755,7 +1317,7 @@ - + @@ -2782,6 +1344,7 @@ + @@ -2819,6 +1382,7 @@ + @@ -2856,6 +1420,7 @@ + @@ -2893,6 +1458,7 @@ + @@ -2930,6 +1496,7 @@ + @@ -2967,6 +1534,7 @@ + @@ -3004,6 +1572,7 @@ + @@ -3033,7 +1602,7 @@ - + @@ -3060,6 +1629,7 @@ + @@ -3114,530 +1684,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3683,6 +1730,7 @@ + @@ -3720,6 +1768,7 @@ + @@ -3757,6 +1806,7 @@ + @@ -3794,6 +1844,7 @@ + @@ -3831,6 +1882,7 @@ + @@ -3873,6 +1925,7 @@ + @@ -3910,6 +1963,7 @@ + @@ -3947,6 +2001,7 @@ + @@ -3984,6 +2039,7 @@ + @@ -4021,6 +2077,7 @@ + @@ -4103,21 +2160,212 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4154,12 +2402,13 @@ + - + @@ -4191,12 +2440,13 @@ + - + @@ -4228,43 +2478,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -4285,16 +2499,16 @@ - - - + + + - + @@ -4302,7 +2516,7 @@ - + @@ -4348,6 +2562,7 @@ + @@ -4385,6 +2600,7 @@ + @@ -4427,6 +2643,7 @@ + @@ -4464,6 +2681,7 @@ + @@ -4492,21 +2710,389 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4538,12 +3124,13 @@ + - + @@ -4575,12 +3162,13 @@ + - + @@ -4612,16 +3200,17 @@ + - + - + @@ -4631,7 +3220,307 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4682,6 +3571,7 @@ + @@ -4719,6 +3609,7 @@ + @@ -4756,6 +3647,7 @@ + @@ -4793,7 +3685,1212 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4839,6 +4936,7 @@ + @@ -4876,6 +4974,7 @@ + @@ -4918,6 +5017,7 @@ + @@ -4955,6 +5055,7 @@ + @@ -4985,7 +5086,7 @@ - + @@ -4995,7 +5096,7 @@ - + @@ -5003,7 +5104,7 @@ - + @@ -5016,7 +5117,7 @@ - + @@ -5026,7 +5127,7 @@ - + @@ -5034,7 +5135,7 @@ - + @@ -5047,7 +5148,7 @@ - + @@ -5057,7 +5158,7 @@ - + @@ -5065,7 +5166,7 @@ - + @@ -5078,7 +5179,7 @@ - + @@ -5088,7 +5189,7 @@ - + @@ -5096,7 +5197,7 @@ - + @@ -5109,7 +5210,7 @@ - + @@ -5119,7 +5220,7 @@ - + @@ -5127,7 +5228,7 @@ - + @@ -5140,7 +5241,7 @@ - + @@ -5150,7 +5251,7 @@ - + @@ -5158,7 +5259,7 @@ - + @@ -5171,7 +5272,7 @@ - + @@ -5181,7 +5282,7 @@ - + @@ -5189,7 +5290,7 @@ - + @@ -5202,7 +5303,7 @@ - + @@ -5212,7 +5313,7 @@ - + @@ -5220,7 +5321,7 @@ - + @@ -5233,7 +5334,7 @@ - + @@ -5243,7 +5344,7 @@ - + @@ -5251,7 +5352,7 @@ - + @@ -5264,7 +5365,7 @@ - + @@ -5274,7 +5375,7 @@ - + @@ -5282,7 +5383,7 @@ - + @@ -5295,7 +5396,7 @@ - + @@ -5305,7 +5406,7 @@ - + @@ -5313,7 +5414,7 @@ - + @@ -5326,7 +5427,7 @@ - + @@ -5336,7 +5437,7 @@ - + @@ -5344,7 +5445,7 @@ - + @@ -5357,7 +5458,7 @@ - + @@ -5367,7 +5468,7 @@ - + @@ -5375,7 +5476,7 @@ - + @@ -5388,7 +5489,7 @@ - + @@ -5398,7 +5499,7 @@ - + @@ -5406,7 +5507,7 @@ - + @@ -5419,7 +5520,7 @@ - + @@ -5429,7 +5530,7 @@ - + @@ -5437,7 +5538,7 @@ - + @@ -5450,7 +5551,7 @@ - + @@ -5460,7 +5561,7 @@ - + @@ -5468,7 +5569,7 @@ - + @@ -5481,7 +5582,7 @@ - + @@ -5491,7 +5592,7 @@ - + @@ -5499,7 +5600,7 @@ - + @@ -5512,7 +5613,7 @@ - + @@ -5522,7 +5623,7 @@ - + @@ -5530,7 +5631,7 @@ - + @@ -5543,7 +5644,7 @@ - + @@ -5553,7 +5654,7 @@ - + @@ -5561,7 +5662,7 @@ - + @@ -5574,7 +5675,7 @@ - + @@ -5584,7 +5685,7 @@ - + @@ -5592,7 +5693,7 @@ - + @@ -5605,7 +5706,7 @@ - + @@ -5615,7 +5716,7 @@ - + @@ -5623,7 +5724,7 @@ - + @@ -5636,7 +5737,7 @@ - + @@ -5646,7 +5747,7 @@ - + @@ -5654,7 +5755,7 @@ - + @@ -5667,7 +5768,7 @@ - + @@ -5677,7 +5778,7 @@ - + @@ -5685,7 +5786,7 @@ - + @@ -5698,7 +5799,7 @@ - + @@ -5708,7 +5809,7 @@ - + @@ -5716,7 +5817,7 @@ - + @@ -5729,7 +5830,7 @@ - + @@ -5739,7 +5840,7 @@ - + @@ -5747,7 +5848,7 @@ - + @@ -5760,7 +5861,7 @@ - + @@ -5770,7 +5871,7 @@ - + @@ -5778,7 +5879,7 @@ - + @@ -5791,7 +5892,7 @@ - + @@ -5801,7 +5902,7 @@ - + @@ -5809,7 +5910,7 @@ - + @@ -5822,7 +5923,7 @@ - + @@ -5832,7 +5933,7 @@ - + @@ -5840,7 +5941,7 @@ - + @@ -5853,7 +5954,7 @@ - + @@ -5863,7 +5964,7 @@ - + @@ -5871,7 +5972,7 @@ - + @@ -5884,7 +5985,7 @@ - + @@ -5894,7 +5995,7 @@ - + @@ -5902,7 +6003,7 @@ - + @@ -5915,7 +6016,7 @@ - + @@ -5925,7 +6026,7 @@ - + @@ -5933,7 +6034,7 @@ - + @@ -5946,7 +6047,7 @@ - + @@ -5956,7 +6057,7 @@ - + @@ -5964,7 +6065,7 @@ - + @@ -5977,7 +6078,7 @@ - + @@ -5987,7 +6088,7 @@ - + @@ -5995,7 +6096,7 @@ - + @@ -6008,7 +6109,7 @@ - + @@ -6018,7 +6119,7 @@ - + @@ -6026,7 +6127,7 @@ - + @@ -6039,7 +6140,7 @@ - + @@ -6049,7 +6150,7 @@ - + @@ -6057,7 +6158,7 @@ - + @@ -6070,7 +6171,7 @@ - + @@ -6080,7 +6181,7 @@ - + @@ -6088,7 +6189,7 @@ - + @@ -6101,7 +6202,7 @@ - + @@ -6111,7 +6212,7 @@ - + @@ -6119,7 +6220,7 @@ - + @@ -6132,7 +6233,7 @@ - + @@ -6142,7 +6243,7 @@ - + @@ -6150,7 +6251,7 @@ - + @@ -6163,7 +6264,7 @@ - + @@ -6173,7 +6274,7 @@ - + @@ -6181,7 +6282,7 @@ - + @@ -6194,7 +6295,7 @@ - + @@ -6204,7 +6305,7 @@ - + @@ -6212,7 +6313,7 @@ - + @@ -6225,7 +6326,7 @@ - + @@ -6235,7 +6336,7 @@ - + @@ -6243,7 +6344,7 @@ - + @@ -6256,7 +6357,7 @@ - + @@ -6266,7 +6367,7 @@ - + @@ -6274,7 +6375,7 @@ - + @@ -6287,7 +6388,7 @@ - + @@ -6297,7 +6398,7 @@ - + @@ -6305,7 +6406,7 @@ - + @@ -6318,7 +6419,7 @@ - + @@ -6328,7 +6429,7 @@ - + @@ -6336,7 +6437,7 @@ - + @@ -6349,7 +6450,7 @@ - + @@ -6359,7 +6460,7 @@ - + @@ -6367,7 +6468,7 @@ - + @@ -6386,7 +6487,7 @@ - + @@ -6394,7 +6495,7 @@ - + @@ -6402,334 +6503,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6740,10 +6514,22 @@ - - + + - + + + + + + + + + + + + + @@ -6751,7 +6537,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6761,6 +6589,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6769,12 +6731,26 @@ - - - - + + + + + + + + + + + + + + + + + + @@ -6793,151 +6769,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6947,56 +6783,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7008,301 +6794,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7310,61 +6802,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -7375,10 +6813,22 @@ - - + + - + + + + + + + + + + + + + @@ -7386,7 +6836,133 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7399,14 +6975,254 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7416,6 +7232,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7423,6 +7498,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7430,6 +7531,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7446,38 +7579,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7497,7 +7598,7 @@ - + @@ -7524,14 +7625,15 @@ - + + - + @@ -7558,14 +7660,15 @@ - + + - + @@ -7592,7 +7695,8 @@ - + + diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo index 71938493ae..22c7ff807d 100644 --- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3160 +1,1940 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{22092699-BB9E-4DD0-8893-9E49240342AE}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas index 88e3333298..f4ca23b882 100644 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,1135 +16,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1190,6 +62,7 @@ + @@ -1227,6 +100,7 @@ + @@ -1264,6 +138,7 @@ + @@ -1301,6 +176,7 @@ + @@ -1338,6 +214,7 @@ + @@ -1375,6 +252,7 @@ + @@ -1425,111 +303,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1576,6 +350,7 @@ + @@ -1613,6 +388,7 @@ + @@ -1633,7 +409,657 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1679,6 +1105,7 @@ + @@ -1716,6 +1143,7 @@ + @@ -1753,6 +1181,7 @@ + @@ -1790,6 +1219,7 @@ + @@ -1827,6 +1257,7 @@ + @@ -1869,6 +1300,7 @@ + @@ -1906,6 +1338,7 @@ + @@ -1943,6 +1376,7 @@ + @@ -1980,6 +1414,7 @@ + @@ -2017,6 +1452,7 @@ + @@ -2094,12 +1530,12 @@ - + - + @@ -2145,6 +1581,7 @@ + @@ -2182,6 +1619,7 @@ + @@ -2224,6 +1662,7 @@ + @@ -2261,6 +1700,7 @@ + @@ -2298,6 +1738,7 @@ + @@ -2335,6 +1776,7 @@ + @@ -2372,6 +1814,7 @@ + @@ -2436,11 +1879,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2450,7 +2500,7 @@ - + @@ -2458,7 +2508,7 @@ - + @@ -2471,7 +2521,7 @@ - + @@ -2481,7 +2531,7 @@ - + @@ -2489,7 +2539,7 @@ - + @@ -2502,7 +2552,7 @@ - + @@ -2512,7 +2562,7 @@ - + @@ -2520,7 +2570,7 @@ - + @@ -2533,7 +2583,7 @@ - + @@ -2543,7 +2593,7 @@ - + @@ -2551,7 +2601,7 @@ - + @@ -2564,7 +2614,7 @@ - + @@ -2574,7 +2624,7 @@ - + @@ -2582,7 +2632,7 @@ - + @@ -2595,7 +2645,7 @@ - + @@ -2605,7 +2655,7 @@ - + @@ -2613,7 +2663,7 @@ - + @@ -2626,7 +2676,7 @@ - + @@ -2636,7 +2686,7 @@ - + @@ -2644,7 +2694,7 @@ - + @@ -2657,7 +2707,7 @@ - + @@ -2667,7 +2717,7 @@ - + @@ -2675,7 +2725,7 @@ - + @@ -2688,7 +2738,7 @@ - + @@ -2698,7 +2748,7 @@ - + @@ -2706,7 +2756,7 @@ - + @@ -2719,7 +2769,7 @@ - + @@ -2729,7 +2779,7 @@ - + @@ -2737,7 +2787,7 @@ - + @@ -2750,7 +2800,7 @@ - + @@ -2760,7 +2810,7 @@ - + @@ -2768,7 +2818,7 @@ - + @@ -2781,7 +2831,7 @@ - + @@ -2791,7 +2841,7 @@ - + @@ -2799,7 +2849,7 @@ - + @@ -2812,7 +2862,7 @@ - + @@ -2822,7 +2872,7 @@ - + @@ -2830,7 +2880,7 @@ - + @@ -2843,7 +2893,7 @@ - + @@ -2853,7 +2903,7 @@ - + @@ -2861,7 +2911,7 @@ - + @@ -2880,7 +2930,7 @@ - + @@ -2888,188 +2938,41 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3077,94 +2980,30 @@ - + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3180,27 +3019,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -3208,22 +3027,20 @@ - + - - - - + + + - - - - + + + @@ -3234,15 +3051,17 @@ - - - + + + + - - - + + + + @@ -3250,22 +3069,167 @@ - + - - + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3276,15 +3240,17 @@ - - - + + + + - - - + + + + @@ -3292,43 +3258,127 @@ - + - - - - + + + - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3365,7 +3415,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -3377,27 +3447,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -3415,7 +3465,7 @@ - + @@ -3441,6 +3491,7 @@ + diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas index f49edd0f46..65f10d4f81 100644 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,295 +16,105 @@ - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -312,21 +122,21 @@ - + - + - + - + - + @@ -337,7 +147,7 @@ - + @@ -358,12 +168,13 @@ + - + @@ -374,7 +185,7 @@ - + @@ -395,12 +206,56 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -432,12 +287,13 @@ + - + @@ -469,12 +325,13 @@ + - + @@ -506,12 +363,13 @@ + - + @@ -543,21 +401,38 @@ + + + + + + + + + + + + + + + - + + + - + - + @@ -567,7 +442,7 @@ - + @@ -577,7 +452,7 @@ - + @@ -593,7 +468,304 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -639,6 +811,7 @@ + @@ -676,6 +849,7 @@ + @@ -713,6 +887,7 @@ + @@ -750,6 +925,7 @@ + @@ -787,6 +963,7 @@ + @@ -824,6 +1001,7 @@ + @@ -861,6 +1039,7 @@ + @@ -898,6 +1077,7 @@ + @@ -940,6 +1120,7 @@ + @@ -977,6 +1158,7 @@ + @@ -1056,102 +1238,285 @@ - + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -1160,7 +1525,309 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1211,6 +1878,7 @@ + @@ -1248,6 +1916,7 @@ + @@ -1285,6 +1954,7 @@ + @@ -1322,6 +1992,7 @@ + @@ -1357,641 +2028,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2001,7 +2042,7 @@ - + @@ -2009,7 +2050,7 @@ - + @@ -2022,7 +2063,7 @@ - + @@ -2032,7 +2073,7 @@ - + @@ -2040,7 +2081,7 @@ - + @@ -2053,7 +2094,7 @@ - + @@ -2063,7 +2104,7 @@ - + @@ -2071,7 +2112,7 @@ - + @@ -2084,7 +2125,7 @@ - + @@ -2094,7 +2135,7 @@ - + @@ -2102,7 +2143,7 @@ - + @@ -2115,7 +2156,7 @@ - + @@ -2125,7 +2166,7 @@ - + @@ -2133,7 +2174,7 @@ - + @@ -2146,7 +2187,7 @@ - + @@ -2156,7 +2197,7 @@ - + @@ -2164,7 +2205,7 @@ - + @@ -2177,7 +2218,7 @@ - + @@ -2187,7 +2228,7 @@ - + @@ -2195,7 +2236,7 @@ - + @@ -2208,7 +2249,7 @@ - + @@ -2218,7 +2259,7 @@ - + @@ -2226,7 +2267,7 @@ - + @@ -2239,7 +2280,7 @@ - + @@ -2249,7 +2290,7 @@ - + @@ -2257,7 +2298,7 @@ - + @@ -2270,7 +2311,7 @@ - + @@ -2280,7 +2321,7 @@ - + @@ -2288,7 +2329,7 @@ - + @@ -2301,7 +2342,7 @@ - + @@ -2311,7 +2352,7 @@ - + @@ -2319,7 +2360,7 @@ - + @@ -2338,7 +2379,7 @@ - + @@ -2346,41 +2387,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -2388,41 +2429,41 @@ - + - - - - + + + - - - - + + + - + - - - + + + + - - - + + + + @@ -2430,10 +2471,72 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2449,27 +2552,7 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -2477,22 +2560,20 @@ - + - - - - + + + - - - - + + + @@ -2503,15 +2584,17 @@ - - - + + + + - - - + + + + @@ -2519,22 +2602,83 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2545,15 +2689,17 @@ - - - + + + + - - - + + + + @@ -2561,146 +2707,41 @@ - + - - - - + + + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2711,23 +2752,7 @@ - - - - - - - - - - - - - - - - - + @@ -2735,7 +2760,23 @@ - + + + + + + + + + + + + + + + + + @@ -2779,6 +2820,7 @@ + diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo index d8f2240e77..ed6d5ec968 100644 --- a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo @@ -1,869 +1,556 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true, + "Position": [ + 1.0, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{E6D6DBB9-38FA-560E-B328-B40DE06FBE95}" + }, + "assetHint": "levels/physics/c15096735_materials_defaultlibraryconsistency/c15096735_materials_defaultlibraryconsistency.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{92DC3AA3-AD2D-4DBC-9036-BC5E880A921B}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true, + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{E6D6DBB9-38FA-560E-B328-B40DE06FBE95}" + }, + "assetHint": "levels/physics/c15096735_materials_defaultlibraryconsistency/c15096735_materials_defaultlibraryconsistency.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{92DC3AA3-AD2D-4DBC-9036-BC5E880A921B}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{E84D5551-F699-40BA-A7A2-C66F6C0D39B2}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo index 9ce7bf1602..51414b5d4b 100644 --- a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo @@ -1,867 +1,525 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{E694D681-DB52-47F8-AEB9-1A5EE5D97BC5}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo index 8ba38aed69..4dcf28d5f7 100644 --- a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo @@ -1,869 +1,556 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true, + "Position": [ + 1.0, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{E6D6DBB9-38FA-560E-B328-B40DE06FBE95}" + }, + "assetHint": "levels/physics/c15096735_materials_defaultlibraryconsistency/c15096735_materials_defaultlibraryconsistency.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{7D4BE734-81B5-4271-B41B-340F4D77F3D0}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true, + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{E6D6DBB9-38FA-560E-B328-B40DE06FBE95}" + }, + "assetHint": "levels/physics/c15096735_materials_defaultlibraryconsistency/c15096735_materials_defaultlibraryconsistency.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{7D4BE734-81B5-4271-B41B-340F4D77F3D0}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration" + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{D3D94371-503F-4F35-AD93-18A94A76768C}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo index bcb31b6285..a46faf82f4 100644 --- a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo @@ -1,851 +1,520 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo - copy", + "id": "{D37B415D-46B4-5A13-9D04-9B923B8F95C3}", + "rules": { + "rules": [ + { + "$type": "TangentsRule" + }, + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo - Copy\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.0 + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 1.0 + } + ] + ] + } + ] + } + } + } + } + }, + { + "$type": "CoordinateSystemRule" + } + ] + } + }, + { + "$type": "{5B03C8E6-8CEE-4DA0-A7FA-CD88689DD45B} MeshGroup", + "id": "{590B2AF7-4D8B-5829-BC22-E8F8168B0CB1}", + "name": "rin_skeleton_newgeo - copy", + "NodeSelectionList": { + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.mesh_GRP.rin_eyeballs.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_eyeballs.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_haircap.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_haircap.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_cloth.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_cloth.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_leather.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_leather.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_armor.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_armor.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_hands.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_hands.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_props.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_props.TangentSet_Fbx_1", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_props.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_props.BitangentSet_Fbx_1", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_teeth_low.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_low.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_teeth_up.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_face.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_face.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_armorstraps.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_armorstraps.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_hairplanes.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_hairplanes.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_eyecover.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_eyecover.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_haircards.TangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.map1", + "RootNode.mesh_GRP.rin_haircards.BitangentSet_Fbx_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo - Copy", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{5F668CE7-04DE-4B48-A263-C2870B179523}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo index c128da7bad..debe7226e7 100644 --- a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo @@ -1,870 +1,534 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Linear damping": 0.0, + "Angular damping": 0.0, + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Visible": true + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 1.0 + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{FFCEB33B-33BF-4F71-BAD0-355C750ECF9B}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo index 7acab6fea1..f516305351 100644 --- a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3402 +1,2505 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + } + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{25E48A63-2092-5B95-84A3-2F609F97AAA6}" + }, + "assetHint": "levels/physics/c15308221_material_componentsinsyncwithlibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{E81483D1-4079-4DAA-9A60-5A2D936FABED}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo index b8f2ec02d2..0ad10ef106 100644 --- a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3400 +1,1936 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{02F904FA-83C0-45A3-9E71-D2E49BBB3770}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo index e300afcc7c..1911ef0900 100644 --- a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3402 +1,2510 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{F17DFF59-6ED6-4F8B-A8C1-35EF03EAD06C}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{9B6D2554-FD4D-4662-923A-3E105C6F1170}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo index a52b4111f0..18a947df49 100644 --- a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3402 +1,2510 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{49D81C0E-872B-5954-B9B1-13D873728AAD}" + }, + "assetHint": "levels/physics/c4925580_material_ragdollbonesmaterial/c4925580_material_ragdollbonesmaterial.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{E9BF3E6A-71C2-4A42-847C-8CA6C93B73D7}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{1A548B5D-375D-4956-BB19-41B3AC9A1554}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo index b8f2ec02d2..c00102f606 100644 --- a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3400 +1,1936 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + {}, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ] + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ] + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{9A32F46A-8448-4410-9ABC-51214EE37AF3}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo index b2df1b6411..50ede5866e 100644 --- a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo +++ b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo @@ -1,3402 +1,2510 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "{F5F8D1BF-3A24-45E8-8C3F-6A682CA02520} SkeletonGroup", + "name": "rin_skeleton_newgeo", + "selectedRootBone": "RootNode.root", + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "{A3217B13-79EA-4487-9A13-5D382EA9077A} SkinGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.mesh_GRP.rin_eyeballs.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyeballs.rin_m_eyeballs", + "RootNode.mesh_GRP.rin_eyeballs.map1", + "RootNode.mesh_GRP.rin_haircap.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircap.rin_m_haircap", + "RootNode.mesh_GRP.rin_haircap.map1", + "RootNode.mesh_GRP.rin_cloth.SkinWeight_0", + "RootNode.mesh_GRP.rin_cloth.rin_m_cloth", + "RootNode.mesh_GRP.rin_cloth.Col", + "RootNode.mesh_GRP.rin_cloth.UVMap", + "RootNode.mesh_GRP.rin_leather.SkinWeight_0", + "RootNode.mesh_GRP.rin_leather.rin_m_leather", + "RootNode.mesh_GRP.rin_leather.Col", + "RootNode.mesh_GRP.rin_leather.UVMap", + "RootNode.mesh_GRP.rin_armor.SkinWeight_0", + "RootNode.mesh_GRP.rin_armor.rin_m_armor", + "RootNode.mesh_GRP.rin_armor.Col", + "RootNode.mesh_GRP.rin_armor.UVMap", + "RootNode.mesh_GRP.rin_hands.SkinWeight_0", + "RootNode.mesh_GRP.rin_hands.rin_m_hands", + "RootNode.mesh_GRP.rin_hands.Col", + "RootNode.mesh_GRP.rin_hands.UVMap", + "RootNode.mesh_GRP.rin_props.SkinWeight_0", + "RootNode.mesh_GRP.rin_props.rin_m_props", + "RootNode.mesh_GRP.rin_props.UVMap", + "RootNode.mesh_GRP.rin_props.map1", + "RootNode.mesh_GRP.rin_teeth_low.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_low.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_low.map1", + "RootNode.mesh_GRP.rin_teeth_up.SkinWeight_0", + "RootNode.mesh_GRP.rin_teeth_up.rin_m_mouth", + "RootNode.mesh_GRP.rin_teeth_up.map1", + "RootNode.mesh_GRP.rin_face.SkinWeight_0", + "RootNode.mesh_GRP.rin_face.rin_m_face", + "RootNode.mesh_GRP.rin_face.map1", + "RootNode.mesh_GRP.rin_armorstraps.SkinWeight_0", + "RootNode.mesh_GRP.rin_armorstraps.rin_m_armor", + "RootNode.mesh_GRP.rin_armorstraps.map1", + "RootNode.mesh_GRP.rin_hairplanes.SkinWeight_0", + "RootNode.mesh_GRP.rin_hairplanes.rin_m_hairplanes", + "RootNode.mesh_GRP.rin_hairplanes.map1", + "RootNode.mesh_GRP.rin_eyecover.SkinWeight_0", + "RootNode.mesh_GRP.rin_eyecover.rin_m_eyecover", + "RootNode.mesh_GRP.rin_eyecover.map1", + "RootNode.mesh_GRP.rin_haircards.SkinWeight_0", + "RootNode.mesh_GRP.rin_haircards.rin_m_haircards", + "RootNode.mesh_GRP.rin_haircards.map1" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.root.C_pelvis_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT.transform", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{00000000-0000-0000-0000-000000000000}" + }, + { + "$type": "ActorGroup", + "name": "rin_skeleton_newgeo", + "id": "{2ED526E0-A2A1-5D5F-8699-1CD32AE80359}", + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"rin_skeleton_newgeo\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"root\"\r\n" + }, + { + "$type": "ActorPhysicsSetupRule", + "data": { + "config": { + "hitDetectionConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + }, + "ragdollConfig": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false + }, + { + "name": "L_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.20254400372505189, + -0.6249864101409912, + 0.7367693781852722, + 0.1618904024362564 + ], + "ChildLocalRotation": [ + 0.7375792264938355, + 0.0, + 0.0, + 0.6753178238868713 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -21.0, + "TwistUpperLimit": 23.0 + } + }, + { + "name": "R_leg_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.18296609818935395, + 0.6832081079483032, + -0.6832082271575928, + -0.18296639621257783 + ], + "ChildLocalRotation": [ + -0.0, + 0.7255232930183411, + 0.6882146000862122, + 0.0 + ], + "SwingLimitY": 50.0, + "SwingLimitZ": 30.0, + "TwistLowerLimit": -16.0, + "TwistUpperLimit": 17.0 + } + }, + { + "name": "L_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.6036934852600098, + -0.36913779377937319, + -0.36888980865478518, + 0.60325688123703 + ], + "ChildLocalRotation": [ + 0.0100685004144907, + -0.01671529933810234, + -0.07859530299901962, + 0.9967455863952637 + ], + "SwingLimitY": 70.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -98.0, + "TwistUpperLimit": -75.0 + } + }, + { + "name": "R_knee_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -0.3260999023914337, + -0.6149802207946777, + 0.6509910821914673, + 0.30416950583457949 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 0.9999656081199646, + -0.008921699598431588 + ], + "SwingLimitY": 69.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": 77.0, + "TwistUpperLimit": 102.0 + } + }, + { + "name": "L_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.09583680331707001, + 0.995438814163208 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.514680027961731, + 0.8578065037727356 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -34.0, + "TwistUpperLimit": 50.0 + } + }, + { + "name": "R_foot_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9909648895263672, + -0.13970449566841126 + ], + "ChildLocalRotation": [ + -0.0267730001360178, + -0.024081699550151826, + 0.8836833834648132, + 0.46900999546051028 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 20.0, + "TwistLowerLimit": -29.0, + "TwistUpperLimit": 28.0 + } + }, + { + "name": "C_spine_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "ChildLocalRotation": [ + 0.7071067094802856, + 0.0, + 0.0, + 0.7071068286895752 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_spine_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_03_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "C_spine_04_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.704440712928772, + 0.06162650138139725, + 0.06162650138139725, + 0.704440712928772 + ], + "SwingLimitY": 15.0, + "SwingLimitZ": 5.0, + "TwistLowerLimit": -100.0, + "TwistUpperLimit": -80.0 + } + }, + { + "name": "L_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.3254435956478119, + 0.0, + 0.9459221959114075 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + -0.01745240017771721, + 0.9998490810394287 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_01_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.07845719903707504, + 0.9969456791877747 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_neck_02_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "C_head_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitY": 10.0, + "SwingLimitZ": 25.0, + "TwistLowerLimit": -30.0, + "TwistUpperLimit": 30.0 + } + }, + { + "name": "R_clavicle_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 3.000000106112566e-7, + 0.6944776773452759, + 3.000000106112566e-7, + 0.7195212244987488 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 10.0, + "SwingLimitZ": 10.0, + "TwistLowerLimit": -10.0, + "TwistUpperLimit": 10.0 + } + }, + { + "name": "R_arm_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.9351276159286499, + 0.0, + 0.35854610800743105 + ], + "ChildLocalRotation": [ + -0.008921699598431588, + 0.999965488910675, + -0.0, + -0.0 + ], + "SwingLimitY": 25.0, + "SwingLimitZ": 85.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "L_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.040344301611185077, + -0.016693100333213807, + 0.38212141394615176, + 0.9235191941261292 + ], + "SwingLimitY": 15.0, + "TwistLowerLimit": -25.0, + "TwistUpperLimit": 25.0 + } + }, + { + "name": "L_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + }, + { + "name": "R_elbow_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + 0.0, + 0.0, + 0.9186229109764099, + -0.3986668884754181 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitY": 15.0 + } + }, + { + "name": "R_wrist_JNT", + "Sleep threshold": 0.5, + "Compute Mass": false, + "Compute inertia": false, + "JointLimit": { + "$type": "D6JointLimitConfiguration", + "ParentLocalRotation": [ + -1.0000000116860974e-7, + -0.0, + 0.9999998807907105, + 2.0000000233721949e-7 + ], + "ChildLocalRotation": [ + 0.0, + 0.0, + 1.0, + 0.0 + ], + "SwingLimitZ": 15.0, + "TwistLowerLimit": -20.0, + "TwistUpperLimit": 20.0 + } + } + ], + "colliders": { + "nodes": [ + { + "name": "C_pelvis_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.15000000596046449 + } + ] + ] + }, + { + "name": "L_leg_JNT", + "shapes": [ + [ + { + "Position": [ + 0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7008618712425232, + 0.0, + 0.7132986783981323 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "R_leg_JNT", + "shapes": [ + [ + { + "Position": [ + -0.3199999928474426, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.6882243752479553, + 0.0, + 0.725512683391571 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.5, + "Radius": 0.07999999821186066 + } + ] + ] + }, + { + "name": "L_knee_JNT", + "shapes": [ + [ + { + "Position": [ + 0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7133017182350159, + 0.0, + 0.7008591294288635 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "R_knee_JNT", + "shapes": [ + [ + { + "Position": [ + -0.20000000298023225, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7255414128303528, + 0.0, + 0.6881973743438721 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.4000000059604645, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_foot_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + -0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.05999999865889549, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "R_foot_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.019999999552965165, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.2755587100982666, + 0.9615697264671326 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.25, + 0.07000000029802323, + 0.10000000149011612 + ] + } + ] + ] + }, + { + "name": "C_spine_01_JNT", + "shapes": [ + [ + { + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.33000001311302187, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "C_spine_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_03_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.20000000298023225, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "C_spine_04_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.15000000596046449, + "Radius": 0.07000000029802323 + } + ] + ] + }, + { + "name": "L_arm_JNT", + "shapes": [ + [ + { + "Position": [ + 0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + -2.0000000233721949e-7, + -0.7075905203819275, + 2.0000000233721949e-7, + 0.7066226005554199 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.0, + -0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_neck_01_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "C_neck_02_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "SphereShapeConfiguration", + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "C_head_JNT", + "shapes": [ + [ + { + "Position": [ + 0.07000000029802323, + 0.009999999776482582, + 0.0 + ], + "Rotation": [ + 0.6727613806724548, + 0.21843160688877107, + 0.21843160688877107, + 0.6727614998817444 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.25, + "Radius": 0.10000000149011612 + } + ] + ] + }, + { + "name": "R_clavicle_JNT", + "shapes": [ + [ + { + "Position": [ + -0.07000000029802323, + 0.0, + 0.019999999552965165 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.11999999731779099, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_arm_JNT", + "shapes": [ + [ + { + "Position": [ + -0.15000000596046449, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.3499999940395355, + "Radius": 0.05999999865889549 + } + ] + ] + }, + { + "name": "L_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + 0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "L_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + 0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + }, + { + "name": "R_elbow_JNT", + "shapes": [ + [ + { + "Position": [ + -0.10000000149011612, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + -0.7071067094802856, + 0.0, + 0.7071068286895752 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.30000001192092898, + "Radius": 0.05000000074505806 + } + ] + ] + }, + { + "name": "R_wrist_JNT", + "shapes": [ + [ + { + "Position": [ + -0.05000000074505806, + 0.0, + 0.0 + ], + "MaterialSelection": { + "Material": { + "assetId": { + "guid": "{716DED56-5A2A-5D96-94EF-2646AD76ED8A}" + }, + "assetHint": "levels/physics/c4925582_material_addmodifydeleteonragdollbones/ragdollbones.physmaterial" + }, + "MaterialIds": [ + { + "MaterialId": "{A68F207B-4082-4CC7-B574-72881BCA16E9}" + } + ] + } + }, + { + "$type": "BoxShapeConfiguration", + "Configuration": [ + 0.11999999731779099, + 0.07999999821186066, + 0.029999999329447748 + ] + } + ] + ] + } + ] + } + }, + "clothConfig": { + "nodes": [ + { + "name": "L_index_root_JNT", + "shapes": [ + [ + { + "Position": [ + 0.022891199216246606, + 0.03267350047826767, + 0.0029446000698953869 + ], + "propertyVisibilityFlags": 248 + }, + { + "$type": "CapsuleShapeConfiguration", + "Height": 0.0485990010201931, + "Radius": 0.013095799833536148 + } + ] + ] + } + ] + } + } + } + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "rin_skeleton_newgeo", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.root", + "RootNode.mesh_GRP", + "RootNode.root.C_pelvis_JNT", + "RootNode.mesh_GRP.rin_eyeballs", + "RootNode.mesh_GRP.rin_haircap", + "RootNode.mesh_GRP.rin_cloth", + "RootNode.mesh_GRP.rin_leather", + "RootNode.mesh_GRP.rin_armor", + "RootNode.mesh_GRP.rin_hands", + "RootNode.mesh_GRP.rin_props", + "RootNode.mesh_GRP.rin_teeth_low", + "RootNode.mesh_GRP.rin_teeth_up", + "RootNode.mesh_GRP.rin_face", + "RootNode.mesh_GRP.rin_armorstraps", + "RootNode.mesh_GRP.rin_hairplanes", + "RootNode.mesh_GRP.rin_eyecover", + "RootNode.mesh_GRP.rin_haircards", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT", + "RootNode.root.C_pelvis_JNT.C_legArmor_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_sword_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_leg_twist_JNT", + "RootNode.root.C_pelvis_JNT.L_ribbon_01_JNT.L_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.R_ribbon_01_JNT.R_ribbon_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_knee_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT", + "RootNode.root.C_pelvis_JNT.L_leg_JNT.L_knee_JNT.L_foot_JNT.L_toe_JNT", + "RootNode.root.C_pelvis_JNT.R_leg_JNT.R_knee_JNT.R_foot_JNT.R_toe_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neckCollar_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_neckCollar_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_armPit_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassleLoop_01_JNT.L_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_neck_01_JNT.C_neck_02_JNT.C_head_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_arm_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_armBulge_corr_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassleLoop_01_JNT.R_tassleLoop_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.C_hood_01_JNT.C_hood_02_JNT.C_hood_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_tassle_01_JNT.L_tassle_02_JNT.L_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_elbow_twist_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_tassle_01_JNT.R_tassle_02_JNT.R_tassle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_thumb_01_JNT.L_thumb_02_JNT.L_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_thumb_01_JNT.R_thumb_02_JNT.R_thumb_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_index_root_JNT.L_index_01_JNT.L_index_02_JNT.L_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_middle_root_JNT.L_middle_01_JNT.L_middle_02_JNT.L_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_ring_root_JNT.L_ring_01_JNT.L_ring_02_JNT.L_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.L_clavicle_JNT.L_arm_JNT.L_elbow_JNT.L_wrist_JNT.L_pinky_root_JNT.L_pinky_01_JNT.L_pinky_02_JNT.L_pinky_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_index_root_JNT.R_index_01_JNT.R_index_02_JNT.R_index_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_middle_root_JNT.R_middle_01_JNT.R_middle_02_JNT.R_middle_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_ring_root_JNT.R_ring_01_JNT.R_ring_02_JNT.R_ring_03_JNT", + "RootNode.root.C_pelvis_JNT.C_spine_01_JNT.C_spine_02_JNT.C_spine_03_JNT.C_spine_04_JNT.R_clavicle_JNT.R_arm_JNT.R_elbow_JNT.R_wrist_JNT.R_pinky_root_JNT.R_pinky_01_JNT.R_pinky_02_JNT.R_pinky_03_JNT" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "StaticMeshAdvancedRule", + "vertexColorStreamName": "Col" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{9DB99875-C725-49D9-833B-594EEB333025}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo index 9993da27bd..14b860fcd4 100644 --- a/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo +++ b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo @@ -1,838 +1,691 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "values": [ + { + "$type": "ActorGroup", + "name": "jack", + "selectedRootBone": "RootNode.LOD_Group_1.LOD_0", + "id": "{B7194F91-D8A1-5D5D-AC6D-DDEBC087D80D}", + "rules": { + "rules": [ + { + "$type": "{3CB103B3-CEAF-49D7-A9DC-5A31E2DF15E4} LodRule", + "nodeSelectionList": [ + { + "selectedNodes": [ + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3.transform", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.LOD_Group_1", + "RootNode.LOD_Group_1.LOD_0", + "RootNode.LOD_Group_1.LOD_1", + "RootNode.LOD_Group_1.LOD_2", + "RootNode.LOD_Group_1.LOD_3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.Jack:jack" + ], + "lodLevel": 1 + }, + { + "selectedNodes": [ + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3.transform", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.LOD_Group_1", + "RootNode.LOD_Group_1.LOD_0", + "RootNode.LOD_Group_1.LOD_1", + "RootNode.LOD_Group_1.LOD_2", + "RootNode.LOD_Group_1.LOD_3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.Jack:jack" + ], + "lodLevel": 2 + }, + { + "selectedNodes": [ + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3.transform", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3.transform", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh" + ], + "unselectedNodes": [ + "RootNode", + "RootNode.LOD_Group_1", + "RootNode.LOD_Group_1.LOD_0", + "RootNode.LOD_Group_1.LOD_1", + "RootNode.LOD_Group_1.LOD_2", + "RootNode.LOD_Group_1.LOD_3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh.Jack:jack", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.SkinWeight_0", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.map1", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh.Jack:jack" + ], + "lodLevel": 3 + } + ] + }, + { + "$type": "TangentsRule" + }, + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + }, + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"Jack\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"Jack:jack_root\"\r\n" + }, + { + "$type": "CoordinateSystemRule" + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "Jack", + "nodeSelectionList": { + "selectedNodes": [ + {}, + "RootNode", + "RootNode.LOD_Group_1", + "RootNode.LOD_Group_1.LOD_0", + "RootNode.LOD_Group_1.LOD_1", + "RootNode.LOD_Group_1.LOD_2", + "RootNode.LOD_Group_1.LOD_3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root", + "RootNode.LOD_Group_1.LOD_1.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_2.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_3.Jack:jack_mesh", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_upLegRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__RHand2Aim_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:l_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__L_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeTargetLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:l_upLeg.Jack:l_loLeg.Jack:l_ankle.Jack:Bip01__planeWeightLeft", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:r_ball", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__R_Heel", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeTargetRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:r_upLeg.Jack:r_loLeg.Jack:r_ankle.Jack:Bip01__planeWeightRight", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:Bip01__CustomStart", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:Bip01__CustomAim.Jack:Bip01__RHand2Aim_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:neck.Jack:head", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_upArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_loArmRoll", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_handProp.Jack:Bip01__RHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKBlend", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_handProp.Jack:Bip01__LHand2Weapon_IKTarget", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_thumb1.Jack:l_thumb2.Jack:l_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_index1.Jack:l_index2.Jack:l_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_mid1.Jack:l_mid2.Jack:l_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_thumb1.Jack:r_thumb2.Jack:r_thumb3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_index1.Jack:r_index2.Jack:r_index3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_mid1.Jack:r_mid2.Jack:r_mid3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_ring1.Jack:l_ring2.Jack:l_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:l_shldr.Jack:l_upArm.Jack:l_loArm.Jack:l_hand.Jack:l_metacarpal.Jack:l_pinky1.Jack:l_pinky2.Jack:l_pinky3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_ring1.Jack:r_ring2.Jack:r_ring3", + "RootNode.LOD_Group_1.LOD_0.Jack:jack_root.Jack:Bip01__pelvis.Jack:spine1.Jack:spine2.Jack:spine3.Jack:r_shldr.Jack:r_upArm.Jack:r_loArm.Jack:r_hand.Jack:r_metacarpal.Jack:r_pinky1.Jack:r_pinky2.Jack:r_pinky3" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{8D605093-F5E6-476C-ABD6-42304F53F1F0}" + } + ] +} \ No newline at end of file diff --git a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas index ff9fe5c64c..b24a477a2e 100644 --- a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,21 +16,118 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67,54 +164,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -146,12 +202,13 @@ + - + @@ -183,6 +240,7 @@ + @@ -195,36 +253,24 @@ - + - - - - - - - - - - - - - - + + - + - + @@ -232,16 +278,7 @@ - - - - - - - - - - + @@ -292,6 +329,7 @@ + @@ -334,6 +372,7 @@ + @@ -371,6 +410,7 @@ + @@ -408,6 +448,7 @@ + @@ -457,58 +498,21 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -545,12 +549,56 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -582,12 +630,13 @@ + - + @@ -619,6 +668,7 @@ + @@ -631,24 +681,36 @@ - + + + + + + + + + + + + + - - + + - + - + @@ -656,7 +718,16 @@ - + + + + + + + + + + @@ -702,6 +773,7 @@ + @@ -739,6 +811,7 @@ + @@ -781,6 +854,7 @@ + @@ -823,6 +897,7 @@ + @@ -865,6 +940,7 @@ + @@ -907,6 +983,7 @@ + @@ -949,6 +1026,7 @@ + @@ -991,6 +1069,7 @@ + @@ -1028,6 +1107,7 @@ + @@ -1065,6 +1145,7 @@ + @@ -1102,6 +1183,7 @@ + @@ -1139,6 +1221,7 @@ + @@ -1176,6 +1259,7 @@ + @@ -1213,6 +1297,7 @@ + @@ -1296,334 +1381,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1670,6 +1433,7 @@ + @@ -1712,6 +1476,7 @@ + @@ -1749,6 +1514,7 @@ + @@ -1786,6 +1552,7 @@ + @@ -1868,21 +1635,231 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1893,7 +1870,7 @@ - + @@ -1914,11 +1891,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + @@ -1926,21 +1963,21 @@ - + - + - + @@ -1977,12 +2014,13 @@ + - + @@ -2019,12 +2057,13 @@ + - + @@ -2056,12 +2095,13 @@ + - + @@ -2093,6 +2133,7 @@ + @@ -2105,7 +2146,7 @@ - + @@ -2144,7 +2185,7 @@ - + @@ -2154,7 +2195,7 @@ - + @@ -2162,7 +2203,7 @@ - + @@ -2175,7 +2216,7 @@ - + @@ -2185,7 +2226,7 @@ - + @@ -2193,7 +2234,7 @@ - + @@ -2206,7 +2247,7 @@ - + @@ -2216,7 +2257,7 @@ - + @@ -2224,7 +2265,7 @@ - + @@ -2237,7 +2278,7 @@ - + @@ -2247,7 +2288,7 @@ - + @@ -2255,7 +2296,7 @@ - + @@ -2268,7 +2309,7 @@ - + @@ -2278,7 +2319,7 @@ - + @@ -2286,7 +2327,7 @@ - + @@ -2299,7 +2340,7 @@ - + @@ -2309,7 +2350,7 @@ - + @@ -2317,7 +2358,7 @@ - + @@ -2330,7 +2371,7 @@ - + @@ -2340,7 +2381,7 @@ - + @@ -2348,7 +2389,7 @@ - + @@ -2361,7 +2402,7 @@ - + @@ -2371,7 +2412,7 @@ - + @@ -2379,7 +2420,7 @@ - + @@ -2392,7 +2433,7 @@ - + @@ -2402,7 +2443,7 @@ - + @@ -2410,7 +2451,7 @@ - + @@ -2429,7 +2470,7 @@ - + @@ -2437,49 +2478,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2492,7 +2491,7 @@ - + @@ -2513,7 +2512,7 @@ - + @@ -2521,27 +2520,15 @@ - + - - - - - - - - - - - - - - + + - + @@ -2552,25 +2539,10 @@ - - + + - - - - - - - - - - - - - - - - + @@ -2580,24 +2552,9 @@ - - - - - - - - - - - - - - - - - - + + + @@ -2605,7 +2562,7 @@ - + @@ -2615,8 +2572,8 @@ - - + + @@ -2626,20 +2583,22 @@ - + - - - + + + + - - - + + + + @@ -2650,17 +2609,15 @@ - - - - + + + - - - - + + + @@ -2668,7 +2625,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2681,51 +2680,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2736,15 +2691,17 @@ - - - + + + + - - - + + + + @@ -2752,7 +2709,7 @@ - + @@ -2760,7 +2717,7 @@ - + @@ -2780,7 +2737,7 @@ - + @@ -2792,25 +2749,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + diff --git a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas index 988184109a..b9f438a4f3 100644 --- a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,868 +16,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -923,6 +62,7 @@ + @@ -960,6 +100,7 @@ + @@ -997,6 +138,7 @@ + @@ -1034,6 +176,7 @@ + @@ -1071,6 +214,7 @@ + @@ -1113,6 +257,7 @@ + @@ -1150,6 +295,7 @@ + @@ -1187,6 +333,7 @@ + @@ -1224,6 +371,7 @@ + @@ -1261,6 +409,7 @@ + @@ -1343,7 +492,885 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1390,6 +1417,7 @@ + @@ -1427,6 +1455,7 @@ + @@ -1513,6 +1542,7 @@ + @@ -1599,6 +1629,7 @@ + @@ -1680,6 +1711,7 @@ + @@ -1720,7 +1752,7 @@ - + @@ -1730,7 +1762,7 @@ - + @@ -1738,7 +1770,7 @@ - + @@ -1751,7 +1783,7 @@ - + @@ -1761,7 +1793,7 @@ - + @@ -1769,7 +1801,7 @@ - + @@ -1782,7 +1814,7 @@ - + @@ -1792,7 +1824,7 @@ - + @@ -1800,7 +1832,7 @@ - + @@ -1813,7 +1845,7 @@ - + @@ -1823,7 +1855,7 @@ - + @@ -1831,7 +1863,7 @@ - + @@ -1844,7 +1876,7 @@ - + @@ -1854,7 +1886,7 @@ - + @@ -1862,7 +1894,7 @@ - + @@ -1875,7 +1907,7 @@ - + @@ -1885,7 +1917,7 @@ - + @@ -1893,7 +1925,7 @@ - + @@ -1906,7 +1938,7 @@ - + @@ -1916,7 +1948,7 @@ - + @@ -1924,7 +1956,7 @@ - + @@ -1937,7 +1969,7 @@ - + @@ -1947,7 +1979,7 @@ - + @@ -1955,7 +1987,7 @@ - + @@ -1974,7 +2006,7 @@ - + @@ -1982,7 +2014,49 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1995,28 +2069,28 @@ - + - + - + - + @@ -2024,62 +2098,46 @@ - + - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2087,7 +2145,7 @@ - + @@ -2123,46 +2181,20 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - + @@ -2170,7 +2202,7 @@ - + @@ -2178,27 +2210,27 @@ - + - + - + - + @@ -2212,41 +2244,41 @@ - + - - - - - - - - - - - - - - + + - + - + - - + + - + + + + + + + + + + + + + @@ -2276,7 +2308,7 @@ - + @@ -2284,7 +2316,7 @@ - + @@ -2296,7 +2328,7 @@ - + diff --git a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas index a5b927dfc1..7db4f3a35c 100644 --- a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas @@ -3,7 +3,7 @@ - + @@ -16,163 +16,21 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -209,54 +67,13 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -288,12 +105,51 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -325,6 +181,7 @@ + @@ -337,33 +194,21 @@ - + - - - - - - - - - - - - - + - + @@ -374,7 +219,363 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -421,6 +622,7 @@ + @@ -458,6 +660,7 @@ + @@ -544,6 +747,7 @@ + @@ -630,6 +834,7 @@ + @@ -711,6 +916,7 @@ + @@ -749,72 +955,21 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -824,163 +979,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -994,12 +1077,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1013,22 +1128,8 @@ - - - - - - - - - - - - - - - + @@ -1050,47 +1151,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + - + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + @@ -1098,7 +1320,7 @@ - + @@ -1144,6 +1366,7 @@ + @@ -1181,6 +1404,7 @@ + @@ -1218,6 +1442,7 @@ + @@ -1255,6 +1480,7 @@ + @@ -1292,6 +1518,7 @@ + @@ -1334,6 +1561,7 @@ + @@ -1371,6 +1599,7 @@ + @@ -1408,6 +1637,7 @@ + @@ -1445,6 +1675,7 @@ + @@ -1482,6 +1713,7 @@ + @@ -1562,210 +1794,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1775,7 +1808,7 @@ - + @@ -1783,7 +1816,7 @@ - + @@ -1796,7 +1829,7 @@ - + @@ -1806,7 +1839,7 @@ - + @@ -1814,7 +1847,7 @@ - + @@ -1827,7 +1860,7 @@ - + @@ -1837,7 +1870,7 @@ - + @@ -1845,7 +1878,7 @@ - + @@ -1858,7 +1891,7 @@ - + @@ -1868,7 +1901,7 @@ - + @@ -1876,7 +1909,7 @@ - + @@ -1889,7 +1922,7 @@ - + @@ -1899,7 +1932,7 @@ - + @@ -1907,7 +1940,7 @@ - + @@ -1920,7 +1953,7 @@ - + @@ -1930,7 +1963,7 @@ - + @@ -1938,7 +1971,7 @@ - + @@ -1951,7 +1984,7 @@ - + @@ -1961,7 +1994,7 @@ - + @@ -1969,7 +2002,7 @@ - + @@ -1982,7 +2015,7 @@ - + @@ -1992,7 +2025,7 @@ - + @@ -2000,7 +2033,7 @@ - + @@ -2019,7 +2052,7 @@ - + @@ -2027,27 +2060,15 @@ - + - - - - - - - - - - - - - - + + - + @@ -2057,97 +2078,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2155,60 +2085,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + + + @@ -2216,30 +2102,10 @@ - + - - - - - - - - - - - - - - - - - - - - @@ -2255,7 +2121,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -2263,27 +2149,57 @@ - + - - - + + + + - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2293,11 +2209,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2336,15 +2369,7 @@ - - - - - - - - - + @@ -2352,13 +2377,21 @@ - + + + + + + + + + diff --git a/AutomatedTesting/game.cfg b/AutomatedTesting/game.cfg index d9d8461ea0..f50112436f 100644 --- a/AutomatedTesting/game.cfg +++ b/AutomatedTesting/game.cfg @@ -1,7 +1,7 @@ sys_game_name = "AutomatedTesting" sys_localization_folder = Localization ca_useIMG_CAF = 0 -sys_asserts=2 +sys_asserts=1 -- Enable warnings when asset loads take longer than the given millisecond threshold cl_assetLoadWarningEnable=true diff --git a/CMakeLists.txt b/CMakeLists.txt index 6da92f9c2d..ad5cd9f431 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,9 @@ if(CMAKE_VERSION VERSION_EQUAL 3.19) cmake_policy(SET CMP0111 OLD) endif() +include(cmake/LySet.cmake) include(cmake/Version.cmake) +include(cmake/OutputDirectory.cmake) if(NOT PROJECT_NAME) project(O3DE @@ -30,7 +32,7 @@ if(NOT PROJECT_NAME) ) endif() -include(cmake/Initialize.cmake) +include(cmake/GeneralSettings.cmake) include(cmake/FileUtil.cmake) include(cmake/PAL.cmake) include(cmake/PALTools.cmake) @@ -73,9 +75,6 @@ foreach(restricted_platform ${PAL_RESTRICTED_PLATFORMS}) endif() endforeach() -# Recurse into directory of general python test scripts -add_subdirectory(ctest_scripts) - add_subdirectory(scripts) # SPEC-1417 will investigate and fix this @@ -121,7 +120,10 @@ endif() include(cmake/RuntimeDependencies.cmake) # 5. Perform test impact framework post steps once all of the targets have been enumerated ly_test_impact_post_step() -# 6. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine +# 6. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine if(NOT INSTALLED_ENGINE) ly_setup_o3de_install() -endif() \ No newline at end of file + + # IMPORTANT: must be included last + include(cmake/CPack.cmake) +endif() diff --git a/Code/.p4ignore b/Code/.p4ignore index 2c409735ab..f0b9f1ea6b 100644 --- a/Code/.p4ignore +++ b/Code/.p4ignore @@ -3,4 +3,4 @@ SDKs #ColinB (8/26)- I know there are depot files that this will ignore... But these files should not be #here, they should all be in 3rdParty... so we will ignore them until I can move them, it should -#be OK for now because they shouldn't change at all anyway. \ No newline at end of file +#be OK for now because they shouldn't change at all anyway. diff --git a/Code/CryEngine/Cry3DEngine/FogVolumeRenderNode_Jobs.cpp b/Code/CryEngine/Cry3DEngine/FogVolumeRenderNode_Jobs.cpp index 21a63188bd..7f6b359d78 100644 --- a/Code/CryEngine/Cry3DEngine/FogVolumeRenderNode_Jobs.cpp +++ b/Code/CryEngine/Cry3DEngine/FogVolumeRenderNode_Jobs.cpp @@ -396,4 +396,4 @@ void CFogVolumeRenderNode::GetVolumetricFogColorBox(const Vec3& worldPos, const resultColor = ColorF(m_cachedFogColor.r, m_cachedFogColor.g, m_cachedFogColor.b, min(fog, 1.0f)); } } -} \ No newline at end of file +} diff --git a/Code/CryEngine/Cry3DEngine/GeomCacheMeshManager.cpp b/Code/CryEngine/Cry3DEngine/GeomCacheMeshManager.cpp index 9988d7b860..8c12c38ed8 100644 --- a/Code/CryEngine/Cry3DEngine/GeomCacheMeshManager.cpp +++ b/Code/CryEngine/Cry3DEngine/GeomCacheMeshManager.cpp @@ -325,4 +325,4 @@ bool CGeomCacheMeshManager::ReadMeshColors(CGeomCacheStreamReader& reader, const return true; } -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/Cry3DEngine/GeomCacheRenderNode.cpp b/Code/CryEngine/Cry3DEngine/GeomCacheRenderNode.cpp index cbca734351..8f190aa594 100644 --- a/Code/CryEngine/Cry3DEngine/GeomCacheRenderNode.cpp +++ b/Code/CryEngine/Cry3DEngine/GeomCacheRenderNode.cpp @@ -1488,4 +1488,4 @@ void CGeomCacheRenderNode::OnGeomCacheStaticDataUnloaded() Clear(false); } -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/Cry3DEngine/ObjManDraw.cpp b/Code/CryEngine/Cry3DEngine/ObjManDraw.cpp index d2ef754723..ad2d4c8545 100644 --- a/Code/CryEngine/Cry3DEngine/ObjManDraw.cpp +++ b/Code/CryEngine/Cry3DEngine/ObjManDraw.cpp @@ -14,4 +14,4 @@ // Description : Draw static objects (vegetations) -#include "Cry3DEngine_precompiled.h" \ No newline at end of file +#include "Cry3DEngine_precompiled.h" diff --git a/Code/CryEngine/Cry3DEngine/PostProcessEffects.cpp b/Code/CryEngine/Cry3DEngine/PostProcessEffects.cpp index 47934a5172..52a771aa30 100644 --- a/Code/CryEngine/Cry3DEngine/PostProcessEffects.cpp +++ b/Code/CryEngine/Cry3DEngine/PostProcessEffects.cpp @@ -94,4 +94,4 @@ void C3DEngine::DisablePostEffects() } } } -} \ No newline at end of file +} diff --git a/Code/CryEngine/Cry3DEngine/Tests/MockValidationTest.cpp b/Code/CryEngine/Cry3DEngine/Tests/MockValidationTest.cpp index 206f714fbe..5ba771bc69 100644 --- a/Code/CryEngine/Cry3DEngine/Tests/MockValidationTest.cpp +++ b/Code/CryEngine/Cry3DEngine/Tests/MockValidationTest.cpp @@ -22,4 +22,4 @@ TEST(MockValidationTests, SystemMock_Compiles) TEST(MockValidationTests, LogMock_Compiles) { LogMock mockLog; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/Algorithm.h b/Code/CryEngine/CryCommon/Algorithm.h index e88ed0a425..554fe7f507 100644 --- a/Code/CryEngine/CryCommon/Algorithm.h +++ b/Code/CryEngine/CryCommon/Algorithm.h @@ -71,4 +71,4 @@ namespace std17 } } -#endif // CRYINCLUDE_CRYCOMMON_ALGORITHM_H \ No newline at end of file +#endif // CRYINCLUDE_CRYCOMMON_ALGORITHM_H diff --git a/Code/CryEngine/CryCommon/Bezier.h b/Code/CryEngine/CryCommon/Bezier.h index 50c9f7345e..fa1cf60d49 100644 --- a/Code/CryEngine/CryCommon/Bezier.h +++ b/Code/CryEngine/CryCommon/Bezier.h @@ -318,4 +318,4 @@ namespace Bezier } } -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/CryCommon/CREFogVolume.h b/Code/CryEngine/CryCommon/CREFogVolume.h index fd7aa00979..83a024d15e 100644 --- a/Code/CryEngine/CryCommon/CREFogVolume.h +++ b/Code/CryEngine/CryCommon/CREFogVolume.h @@ -63,4 +63,4 @@ public: }; -#endif // #ifndef _CREFOGVOLUME_ \ No newline at end of file +#endif // #ifndef _CREFOGVOLUME_ diff --git a/Code/CryEngine/CryCommon/CREVolumeObject.h b/Code/CryEngine/CryCommon/CREVolumeObject.h index bf28fb993e..d84c7b3e50 100644 --- a/Code/CryEngine/CryCommon/CREVolumeObject.h +++ b/Code/CryEngine/CryCommon/CREVolumeObject.h @@ -67,4 +67,4 @@ public: _smart_ptr m_pHullMesh; }; -#endif // #ifndef _CREVOLUMEOBJECT_ \ No newline at end of file +#endif // #ifndef _CREVOLUMEOBJECT_ diff --git a/Code/CryEngine/CryCommon/CREWaterOcean.h b/Code/CryEngine/CryCommon/CREWaterOcean.h index 07f2c4eb45..784588309f 100644 --- a/Code/CryEngine/CryCommon/CREWaterOcean.h +++ b/Code/CryEngine/CryCommon/CREWaterOcean.h @@ -54,4 +54,4 @@ private: }; -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/CryCommon/HeightmapUpdateNotificationBus.h b/Code/CryEngine/CryCommon/HeightmapUpdateNotificationBus.h index b69b816832..fce7dbec21 100644 --- a/Code/CryEngine/CryCommon/HeightmapUpdateNotificationBus.h +++ b/Code/CryEngine/CryCommon/HeightmapUpdateNotificationBus.h @@ -35,4 +35,4 @@ namespace AZ }; typedef AZ::EBus HeightmapUpdateNotificationBus; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/IMovieSystem.h b/Code/CryEngine/CryCommon/IMovieSystem.h index 7a1125ae2b..c22394e1b3 100644 --- a/Code/CryEngine/CryCommon/IMovieSystem.h +++ b/Code/CryEngine/CryCommon/IMovieSystem.h @@ -327,7 +327,16 @@ struct IMovieCallback */ struct IAnimTrack { - AZ_RTTI(IAnimTrack, "{AA0D5170-FB28-426F-BA13-7EFF6BB3AC67}") + AZ_RTTI(IAnimTrack, "{AA0D5170-FB28-426F-BA13-7EFF6BB3AC67}"); + AZ_CLASS_ALLOCATOR(IAnimTrack, AZ::SystemAllocator, 0); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class(); + } + } //! Flags that can be set on animation track. enum EAnimTrackFlags @@ -594,7 +603,16 @@ struct IAnimNodeOwner struct IAnimNode { public: - AZ_RTTI(IAnimNode, "{0A096354-7F26-4B18-B8C0-8F10A3E0440A}") + AZ_RTTI(IAnimNode, "{0A096354-7F26-4B18-B8C0-8F10A3E0440A}"); + AZ_CLASS_ALLOCATOR(IAnimNode, AZ::SystemAllocator, 0); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class(); + } + } ////////////////////////////////////////////////////////////////////////// // Supported params. @@ -922,7 +940,7 @@ struct IAnimSequence static void Reflect(AZ::ReflectContext* context) { - if (auto serializeContext = azrtti_cast(context); serializeContext != nullptr) + if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class(); } diff --git a/Code/CryEngine/CryCommon/LocalizationManagerBus.inl b/Code/CryEngine/CryCommon/LocalizationManagerBus.inl index 89c774008e..7eaf0087d6 100644 --- a/Code/CryEngine/CryCommon/LocalizationManagerBus.inl +++ b/Code/CryEngine/CryCommon/LocalizationManagerBus.inl @@ -83,4 +83,4 @@ void LocalizationManagerRequests::LocalizeAndSubstitute(const AZStd::string& loc outLocalizedString = locString; LocalizationManagerRequestBus::Broadcast(&LocalizationManagerRequestBus::Events::LocalizeAndSubstituteInternal, outLocalizedString, keys, values); -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiCheckboxBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiCheckboxBus.h index a8dd20e1df..2184447fcd 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiCheckboxBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiCheckboxBus.h @@ -96,4 +96,4 @@ public: // member functions virtual void OnCheckboxStateChange([[maybe_unused]] bool checked) {} }; -typedef AZ::EBus UiCheckboxNotificationBus; \ No newline at end of file +typedef AZ::EBus UiCheckboxNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownBus.h index 4a12cc40e8..554de1be0d 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownBus.h @@ -124,4 +124,4 @@ public: // member functions virtual void OnDropdownValueChanged([[maybe_unused]] AZ::EntityId option) {} }; -typedef AZ::EBus UiDropdownNotificationBus; \ No newline at end of file +typedef AZ::EBus UiDropdownNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownOptionBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownOptionBus.h index d7dfd14192..b2454d682b 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownOptionBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiDropdownOptionBus.h @@ -63,4 +63,4 @@ public: // member functions virtual void OnDropdownOptionSelected() {} }; -typedef AZ::EBus UiDropdownOptionNotificationBus; \ No newline at end of file +typedef AZ::EBus UiDropdownOptionNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonBus.h index 6c0e999bd8..4e6014e152 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonBus.h @@ -83,4 +83,4 @@ public: // member functions virtual void OnRadioButtonStateChange([[maybe_unused]] bool checked) {} }; -typedef AZ::EBus UiRadioButtonNotificationBus; \ No newline at end of file +typedef AZ::EBus UiRadioButtonNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonCommunicationBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonCommunicationBus.h index 6ede3e1065..d791ef744e 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonCommunicationBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonCommunicationBus.h @@ -38,4 +38,4 @@ public: // static member data static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; }; -typedef AZ::EBus UiRadioButtonCommunicationBus; \ No newline at end of file +typedef AZ::EBus UiRadioButtonCommunicationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupBus.h index bc08ca47c0..efdc3f2558 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupBus.h @@ -75,4 +75,4 @@ public: // member functions virtual void OnRadioButtonGroupStateChange([[maybe_unused]] AZ::EntityId checkedRadioButton) {} }; -typedef AZ::EBus UiRadioButtonGroupNotificationBus; \ No newline at end of file +typedef AZ::EBus UiRadioButtonGroupNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupCommunicationBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupCommunicationBus.h index a64654fd0f..5f7c779d12 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupCommunicationBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiRadioButtonGroupCommunicationBus.h @@ -44,4 +44,4 @@ public: // static member data static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; }; -typedef AZ::EBus UiRadioButtonGroupCommunicationBus; \ No newline at end of file +typedef AZ::EBus UiRadioButtonGroupCommunicationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/Bus/UiSliderBus.h b/Code/CryEngine/CryCommon/LyShine/Bus/UiSliderBus.h index 03958cb7ba..80fe1bb5ee 100644 --- a/Code/CryEngine/CryCommon/LyShine/Bus/UiSliderBus.h +++ b/Code/CryEngine/CryCommon/LyShine/Bus/UiSliderBus.h @@ -107,4 +107,4 @@ public: // member functions virtual void OnSliderValueChanged([[maybe_unused]] float value) {} }; -typedef AZ::EBus UiSliderNotificationBus; \ No newline at end of file +typedef AZ::EBus UiSliderNotificationBus; diff --git a/Code/CryEngine/CryCommon/LyShine/IDraw2d.h b/Code/CryEngine/CryCommon/LyShine/IDraw2d.h index e71c8421d3..16fdfceca3 100644 --- a/Code/CryEngine/CryCommon/LyShine/IDraw2d.h +++ b/Code/CryEngine/CryCommon/LyShine/IDraw2d.h @@ -11,7 +11,7 @@ */ #pragma once -#include +#include #include #include #include @@ -115,355 +115,4 @@ public: // member functions //! Implement virtual destructor just for safety. virtual ~IDraw2d() {} - - //! Start a section of 2D drawing function calls. This will set appropriate render state. - // - //! \param deferCalls If true then actual render calls are deferred until the end of the frame - virtual void BeginDraw2d(bool deferCalls = false) = 0; - - //! Start a section of 2D drawing function calls. This will set appropriate render state. - //! This variant allows the viewport size to be specified - // - //! \param viewportSize The size of the viewport being rendered to - //! \param deferCalls If true then actual render calls are deferred until the end of the frame - virtual void BeginDraw2d(AZ::Vector2 viewportSize, bool deferCalls = false) = 0; - - //! End a section of 2D drawing function calls. This will reset some render state. - virtual void EndDraw2d() = 0; - - //! Draw a textured quad with the top left corner at the given position. - // - //! The image is drawn with the color specified by SetShapeColor and the opacity - //! passed as an argument. - //! If rotation is non-zero then the quad is rotated. If the pivot point is - //! provided then the points of the quad are rotated about that point, otherwise - //! they are rotated about the top left corner of the quad. - //! \param texId The texture ID returned by ITexture::GetTextureID() - //! \param position Position of the top left corner of the quad (before rotation) in pixels - //! \param size The width and height of the quad. Use texture width and height to avoid minification, - //! magnification or stretching (assuming the minMaxTexCoords are left to the default) - //! \param opacity The alpha value used when blending - //! \param rotation Angle of rotation in degrees counter-clockwise - //! \param pivotPoint The point about which the quad is rotated - //! \param minMaxTexCoords An optional two component array. The first component is the UV coord for the top left - //! point of the quad and the second is the UV coord of the bottom right point of the quad - //! \param imageOptions Optional struct specifying options that tend to be the same from call to call - virtual void DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float opacity = 1.0f, - float rotation = 0.0f, const AZ::Vector2* pivotPoint = nullptr, const AZ::Vector2* minMaxTexCoords = nullptr, - ImageOptions* imageOptions = nullptr) = 0; - - //! Draw a textured quad where the position specifies the point specified by the alignment. - // - //! Rotation is always around the position. - //! \param texId The texture ID returned by ITexture::GetTextureID() - //! \param position Position align point of the quad (before rotation) in pixels - //! \param size The width and height of the quad. Use texture width and height to avoid minification, - //! magnification or stretching (assuming the minMaxTexCoords are left to the default) - //! \param horizontalAlignment Specifies how the quad is horizontally aligned to the given position - //! \param verticalAlignment Specifies how the quad is vertically aligned to the given position - //! \param opacity The alpha value used when blending - //! \param rotation Angle of rotation in degrees counter-clockwise - //! \param minMaxTexCoords An optional two component array. The first component is the UV coord for the top left - //! point of the quad and the second is the UV coord of the bottom right point of the quad - //! \param imageOptions Optional struct specifying options that tend to be the same from call to call - virtual void DrawImageAligned(int texId, AZ::Vector2 position, AZ::Vector2 size, - HAlign horizontalAlignment, VAlign verticalAlignment, - float opacity = 1.0f, float rotation = 0.0f, const AZ::Vector2* minMaxTexCoords = nullptr, - ImageOptions* imageOptions = nullptr) = 0; - - //! Draw a textured quad where the position, color and uv of each point is specified explicitly - // - //! \param texId The texture ID returned by ITexture::GetTextureID() - //! \param verts An array of 4 vertices, in clockwise order (e.g. top left, top right, bottom right, bottom left) - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) - //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState - virtual void DrawQuad(int texId, VertexPosColUV* verts, - int blendMode = UseDefault, - Rounding pixelRounding = Rounding::Nearest, - int baseState = UseDefault) = 0; - - //! Draw a line - // - //! \param start The start position - //! \param end The end position - //! \param color The color of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) - //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState - virtual void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, - int blendMode = UseDefault, - IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault) = 0; - - //! Draw a line with a texture so it can be dotted or dashed - // - //! \param texId The texture ID returned by ITexture::GetTextureID() - //! \param verts An array of 2 vertices for the start and end points of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) - //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState - virtual void DrawLineTextured(int texId, VertexPosColUV* verts, - int blendMode = UseDefault, - IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault) = 0; - - //! Draw a text string. Only supports ASCII text. - // - //! The font and effect used to render the text are specified in the textOptions structure - //! \param textString A null terminated ASCII text string. May contain \n characters - //! \param position Position of the text in pixels. Alignment values in textOptions affect actual position - //! \param pointSize The size of the font to use - //! \param opacity The opacity (alpha value) to use to draw the text - //! \param textOptions Pointer to an options struct. If null the default options are used - virtual void DrawText(const char* textString, AZ::Vector2 position, float pointSize, - float opacity = 1.0f, TextOptions* textOptions = nullptr) = 0; - - //! Get the width and height (in pixels) that would be used to draw the given text string. - // - //! Pass the same parameter values that would be used to draw the string - virtual AZ::Vector2 GetTextSize(const char* textString, float pointSize, TextOptions* textOptions = nullptr) = 0; - - //! Get the width of the rendering viewport (in pixels). - // - //! If rendering full screen this is the native width from IRenderer - virtual float GetViewportWidth() const = 0; - - //! Get the height of the rendering viewport (in pixels). - // - //! If rendering full screen this is the native width from IRenderer - virtual float GetViewportHeight() const = 0; - - //! Get the default values that would be used if no image options were passed in - // - //! This is a convenient way to initialize the imageOptions struct - virtual const ImageOptions& GetDefaultImageOptions() const = 0; - - //! Get the default values that would be used if no text options were passed in - // - //! This is a convenient way to initialize the textOptions struct - virtual const TextOptions& GetDefaultTextOptions() const = 0; -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////// -//! Helper class for using the IDraw2d interface -//! -//! The Draw2dHelper class is an inline wrapper that provides two convenience features: -//! 1. It automatically calls BeginDraw2d/EndDraw2d in its construction/destruction. -//! 2. It automatically sets member options structures to their defaults and provides set functions -//! to set them. -class Draw2dHelper -{ -public: // member functions - - //! Start a section of 2D drawing function calls. This will set appropriate render state. - Draw2dHelper(bool deferCalls = false) - : m_draw2d(GetDraw2d()) - { - if (m_draw2d) - { - m_draw2d->BeginDraw2d(deferCalls); - m_imageOptions = m_draw2d->GetDefaultImageOptions(); - m_textOptions = m_draw2d->GetDefaultTextOptions(); - } - } - - //! End a section of 2D drawing function calls. This will reset some render state. - ~Draw2dHelper() - { - if (m_draw2d) - { - m_draw2d->EndDraw2d(); - } - } - - //! Draw a textured quad, optional rotation is counter-clockwise in degrees. - // - //! See IDraw2d:DrawImage for parameter descriptions - void DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float opacity = 1.0f, - float rotation = 0.0f, const AZ::Vector2* pivotPoint = nullptr, const AZ::Vector2* minMaxTexCoords = nullptr) - { - if (m_draw2d) - { - m_draw2d->DrawImage(texId, position, size, opacity, rotation, pivotPoint, minMaxTexCoords, &m_imageOptions); - } - } - - //! Draw a textured quad where the position specifies the point specified by the alignment. - // - //! See IDraw2d:DrawImageAligned for parameter descriptions - void DrawImageAligned(int texId, AZ::Vector2 position, AZ::Vector2 size, - IDraw2d::HAlign horizontalAlignment, IDraw2d::VAlign verticalAlignment, - float opacity = 1.0f, float rotation = 0.0f, const AZ::Vector2* minMaxTexCoords = nullptr) - { - if (m_draw2d) - { - m_draw2d->DrawImageAligned(texId, position, size, horizontalAlignment, verticalAlignment, - opacity, rotation, minMaxTexCoords, &m_imageOptions); - } - } - - //! Draw a textured quad where the position, color and uv of each point is specified explicitly - // - //! See IDraw2d:DrawQuad for parameter descriptions - void DrawQuad(int texId, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, - IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) - { - if (m_draw2d) - { - m_draw2d->DrawQuad(texId, verts, blendMode, pixelRounding, baseState); - } - } - - //! Draw a line - // - //! See IDraw2d:DrawLine for parameter descriptions - void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode = IDraw2d::UseDefault, - IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) - { - if (m_draw2d) - { - m_draw2d->DrawLine(start, end, color, blendMode, pixelRounding, baseState); - } - } - - //! Draw a line with a texture so it can be dotted or dashed - // - //! See IDraw2d:DrawLineTextured for parameter descriptions - void DrawLineTextured(int texId, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, - IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) - { - if (m_draw2d) - { - m_draw2d->DrawLineTextured(texId, verts, blendMode, pixelRounding, baseState); - } - } - - //! Draw a text string. Only supports ASCII text. - // - //! See IDraw2d:DrawText for parameter descriptions - void DrawText(const char* textString, AZ::Vector2 position, float pointSize, float opacity = 1.0f) - { - if (m_draw2d) - { - m_draw2d->DrawText(textString, position, pointSize, opacity, &m_textOptions); - } - } - - //! Get the width and height (in pixels) that would be used to draw the given text string. - // - //! See IDraw2d:GetTextSize for parameter descriptions - AZ::Vector2 GetTextSize(const char* textString, float pointSize) - { - if (m_draw2d) - { - return m_draw2d->GetTextSize(textString, pointSize, &m_textOptions); - } - else - { - return AZ::Vector2(0, 0); - } - } - - // State management - - //! Set the blend mode used for images, default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA. - void SetImageBlendMode(int mode) { m_imageOptions.blendMode = mode; } - - //! Set the color used for DrawImage and other image drawing. - void SetImageColor(AZ::Vector3 color) { m_imageOptions.color = color; } - - //! Set whether images are rounded to have the points on exact pixel boundaries. - void SetImagePixelRounding(IDraw2d::Rounding round) { m_imageOptions.pixelRounding = round; } - - //! Set the base state (that blend mode etc is combined with) used for images, default is GS_NODEPTHTEST. - void SetImageBaseState(int state) { m_imageOptions.baseState = state; } - - //! Set the text font. - void SetTextFont(IFFont* font) { m_textOptions.font = font; } - - //! Set the text font effect index. - void SetTextEffectIndex(unsigned int effectIndex) { m_textOptions.effectIndex = effectIndex; } - - //! Set the text color. - void SetTextColor(AZ::Vector3 color) { m_textOptions.color = color; } - - //! Set the text alignment. - void SetTextAlignment(IDraw2d::HAlign horizontalAlignment, IDraw2d::VAlign verticalAlignment) - { - m_textOptions.horizontalAlignment = horizontalAlignment; - m_textOptions.verticalAlignment = verticalAlignment; - } - - //! Set a drop shadow for text drawing. An alpha of zero disables drop shadow. - void SetTextDropShadow(AZ::Vector2 offset, AZ::Color color) - { - m_textOptions.dropShadowOffset = offset; - m_textOptions.dropShadowColor = color; - } - - //! Set a rotation for the text. The text rotates around its position (taking into account alignment). - void SetTextRotation(float rotation) - { - m_textOptions.rotation = rotation; - } - - //! Set the base state (that blend mode etc is combined with) used for text, default is GS_NODEPTHTEST. - void SetTextBaseState(int state) { m_textOptions.baseState = state; } - -public: // static member functions - - //! Helper to get the IDraw2d interface - static IDraw2d* GetDraw2d() { return (gEnv && gEnv->pLyShine) ? gEnv->pLyShine->GetDraw2d() : nullptr; } - - //! Get the width of the rendering viewport (in pixels). - static float GetViewportWidth() - { - IDraw2d* draw2d = GetDraw2d(); - return (draw2d) ? draw2d->GetViewportWidth() : 0.0f; - } - - //! Get the height of the rendering viewport (in pixels). - static float GetViewportHeight() - { - IDraw2d* draw2d = GetDraw2d(); - return (draw2d) ? draw2d->GetViewportHeight() : 0.0f; - } - - //! Round the X and Y coordinates of a point using the given rounding policy - template - static T RoundXY(T value, IDraw2d::Rounding roundingType) - { - T result = value; - - switch (roundingType) - { - case IDraw2d::Rounding::None: - // nothing to do - break; - case IDraw2d::Rounding::Nearest: - result.SetX(floor(value.GetX() + 0.5f)); - result.SetY(floor(value.GetY() + 0.5f)); - break; - case IDraw2d::Rounding::Down: - result.SetX(floor(value.GetX())); - result.SetY(floor(value.GetY())); - break; - case IDraw2d::Rounding::Up: - result.SetX(ceil(value.GetX())); - result.SetY(ceil(value.GetY())); - break; - } - - return result; - } - -protected: // attributes - - IDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions - IDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions - IDraw2d* m_draw2d; }; diff --git a/Code/CryEngine/CryCommon/LyShine/IUiRenderer.h b/Code/CryEngine/CryCommon/LyShine/IUiRenderer.h deleted file mode 100644 index 797ea51b87..0000000000 --- a/Code/CryEngine/CryCommon/LyShine/IUiRenderer.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include - -//////////////////////////////////////////////////////////////////////////////////////////////////// -//! Interface used by UI components to render to the canvas -// -//! The IUiRenderer provides helper functions for UI rendering and also manages state that -//! persists between UI elements when rendering a UI canvas. -//! For example one UI component can turn on stencil test and that affects all UI rendering -//! until it is turned off. -//! -//! This is a singleton class that is accessed via IUiRenderer::Get() which is a shortcut for -//! gEnv->pLyShine()->GetUiRenderer(); -class IUiRenderer -{ -public: // types - - -public: // member functions - - //! Implement virtual destructor for safety. - virtual ~IUiRenderer() {} - - //! Start the rendering of a UI canvas - virtual void BeginCanvasRender(AZ::Vector2 viewportSize) = 0; - - //! End the rendering of a UI canvas - virtual void EndCanvasRender() = 0; - - //! Get the current base state - virtual int GetBaseState() = 0; - - //! Set the base state - virtual void SetBaseState(int state) = 0; - - //! Get the current stencil test reference value - virtual uint32 GetStencilRef() = 0; - - //! Set the stencil test reference value - virtual void SetStencilRef(uint32) = 0; - - //! Increment the current stencil reference value - virtual void IncrementStencilRef() = 0; - - //! Decrement the current stencil reference value - virtual void DecrementStencilRef() = 0; - - //! Get flag that indicates we are rendering into a mask. Used to avoid masks on child mask elements. - virtual bool IsRenderingToMask() = 0; - - //! Set flag that we are rendering into a mask. Used to avoid masks on child mask elements. - virtual void SetIsRenderingToMask(bool isRenderingToMask) = 0; - - //! Push an alpha fade, this is multiplied with any existing alpha fade from parents - virtual void PushAlphaFade(float alphaFadeValue) = 0; - - //! Pop an alpha fade off the stack - virtual void PopAlphaFade() = 0; - - //! Get the current alpha fade value - virtual float GetAlphaFade() const = 0; - -public: // static member functions - - //! Helper function to get the singleton UiRenderer - static IUiRenderer* Get() { return gEnv->pLyShine->GetUiRenderer(); } -}; diff --git a/Code/CryEngine/CryCommon/LyShine/UiSerializeHelpers.h b/Code/CryEngine/CryCommon/LyShine/UiSerializeHelpers.h index 131671e2a5..91b5cc294c 100644 --- a/Code/CryEngine/CryCommon/LyShine/UiSerializeHelpers.h +++ b/Code/CryEngine/CryCommon/LyShine/UiSerializeHelpers.h @@ -20,6 +20,7 @@ #include #include +#include //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Code/CryEngine/CryCommon/Maestro/Bus/EditorSequenceComponentBus.h b/Code/CryEngine/CryCommon/Maestro/Bus/EditorSequenceComponentBus.h index d679b6c325..c9bc9f0985 100644 --- a/Code/CryEngine/CryCommon/Maestro/Bus/EditorSequenceComponentBus.h +++ b/Code/CryEngine/CryCommon/Maestro/Bus/EditorSequenceComponentBus.h @@ -57,4 +57,4 @@ namespace Maestro // defined in the bus header so we can refer to it in the Editor code #define EditorSequenceComponentTypeId "{C02DC0E2-D0F3-488B-B9EE-98E28077EC56}" -} // namespace Maestro \ No newline at end of file +} // namespace Maestro diff --git a/Code/CryEngine/CryCommon/Maestro/Bus/SequenceAgentComponentBus.h b/Code/CryEngine/CryCommon/Maestro/Bus/SequenceAgentComponentBus.h index af13633998..33aafd1320 100644 --- a/Code/CryEngine/CryCommon/Maestro/Bus/SequenceAgentComponentBus.h +++ b/Code/CryEngine/CryCommon/Maestro/Bus/SequenceAgentComponentBus.h @@ -97,4 +97,4 @@ namespace AZStd return retVal; } }; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/Maestro/Types/AnimNodeType.h b/Code/CryEngine/CryCommon/Maestro/Types/AnimNodeType.h index 1e55339349..a3656078f8 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/AnimNodeType.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/AnimNodeType.h @@ -52,4 +52,4 @@ enum class AnimNodeType Num }; -#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMNODETYPE_H \ No newline at end of file +#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMNODETYPE_H diff --git a/Code/CryEngine/CryCommon/Maestro/Types/AnimValue.h b/Code/CryEngine/CryCommon/Maestro/Types/AnimValue.h index da7a086f2f..e2fb1e7742 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/AnimValue.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/AnimValue.h @@ -42,4 +42,4 @@ enum class AnimValue }; -#endif CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMVALUE_H \ No newline at end of file +#endif CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMVALUE_H diff --git a/Code/CryEngine/CryCommon/Maestro/Types/AnimValueType.h b/Code/CryEngine/CryCommon/Maestro/Types/AnimValueType.h index fca3c34530..86150b4add 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/AnimValueType.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/AnimValueType.h @@ -45,4 +45,4 @@ enum class AnimValueType }; -#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMVALUETYPE_H \ No newline at end of file +#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_ANIMVALUETYPE_H diff --git a/Code/CryEngine/CryCommon/Maestro/Types/AssetBlendKey.h b/Code/CryEngine/CryCommon/Maestro/Types/AssetBlendKey.h index a09f454279..19a5b1e6e6 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/AssetBlendKey.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/AssetBlendKey.h @@ -35,4 +35,4 @@ struct IAssetBlendKey }; AZ_TYPE_INFO_SPECIALIZE(IAssetBlendKey, "{15B82C3A-6DB8-466F-AF7F-18298FCD25FD}"); -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/Maestro/Types/AssetBlends.h b/Code/CryEngine/CryCommon/Maestro/Types/AssetBlends.h index 0ebf9dbbc4..fb82b025f7 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/AssetBlends.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/AssetBlends.h @@ -77,4 +77,4 @@ namespace Maestro } }; -} // namespace Maestro \ No newline at end of file +} // namespace Maestro diff --git a/Code/CryEngine/CryCommon/Maestro/Types/SequenceType.h b/Code/CryEngine/CryCommon/Maestro/Types/SequenceType.h index 765e8ad40f..c4f488e80c 100644 --- a/Code/CryEngine/CryCommon/Maestro/Types/SequenceType.h +++ b/Code/CryEngine/CryCommon/Maestro/Types/SequenceType.h @@ -25,4 +25,4 @@ enum class SequenceType SequenceComponent = 1 // Sequence Component on an AZ::Entity }; -#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_SEQUENCETYPE_H \ No newline at end of file +#endif // CRYINCLUDE_CRYCOMMON_MAESTRO_TYPES_SEQUENCETYPE_H diff --git a/Code/CryEngine/CryCommon/Mocks/StubTimer.h b/Code/CryEngine/CryCommon/Mocks/StubTimer.h index c5216c6b3a..fe3a11fb42 100644 --- a/Code/CryEngine/CryCommon/Mocks/StubTimer.h +++ b/Code/CryEngine/CryCommon/Mocks/StubTimer.h @@ -110,4 +110,4 @@ private: CTimeValue m_frameStartTime; float m_frameTime; float m_frameRate; -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/CryCommon/Platform/Mac/crycommon_enginesettings_mac_files.cmake b/Code/CryEngine/CryCommon/Platform/Mac/crycommon_enginesettings_mac_files.cmake index 9d5958347f..f862be24f6 100644 --- a/Code/CryEngine/CryCommon/Platform/Mac/crycommon_enginesettings_mac_files.cmake +++ b/Code/CryEngine/CryCommon/Platform/Mac/crycommon_enginesettings_mac_files.cmake @@ -12,4 +12,4 @@ set(FILES ../../EngineSettingsBackendApple.cpp ../../EngineSettingsBackendApple.h -) \ No newline at end of file +) diff --git a/Code/CryEngine/CryCommon/Platform/Windows/crycommon_enginesettings_windows_files.cmake b/Code/CryEngine/CryCommon/Platform/Windows/crycommon_enginesettings_windows_files.cmake index 98e2d087f2..db9fd5b464 100644 --- a/Code/CryEngine/CryCommon/Platform/Windows/crycommon_enginesettings_windows_files.cmake +++ b/Code/CryEngine/CryCommon/Platform/Windows/crycommon_enginesettings_windows_files.cmake @@ -12,4 +12,4 @@ set(FILES ../../EngineSettingsBackendWin32.cpp ../../EngineSettingsBackendWin32.h -) \ No newline at end of file +) diff --git a/Code/CryEngine/CryCommon/Platform/Windows/crycommon_windows_files.cmake b/Code/CryEngine/CryCommon/Platform/Windows/crycommon_windows_files.cmake index 7da8d9eada..5714be5dfb 100644 --- a/Code/CryEngine/CryCommon/Platform/Windows/crycommon_windows_files.cmake +++ b/Code/CryEngine/CryCommon/Platform/Windows/crycommon_windows_files.cmake @@ -10,4 +10,4 @@ # set(FILES -) \ No newline at end of file +) diff --git a/Code/CryEngine/CryCommon/RenderBus.h b/Code/CryEngine/CryCommon/RenderBus.h index 544b002dfa..efd004219a 100644 --- a/Code/CryEngine/CryCommon/RenderBus.h +++ b/Code/CryEngine/CryCommon/RenderBus.h @@ -120,4 +120,4 @@ namespace AZ }; using RenderScreenshotNotificationBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/RenderContextConfig.h b/Code/CryEngine/CryCommon/RenderContextConfig.h index 26ac314588..3d5899d3f6 100644 --- a/Code/CryEngine/CryCommon/RenderContextConfig.h +++ b/Code/CryEngine/CryCommon/RenderContextConfig.h @@ -83,4 +83,4 @@ namespace AzRTT //! confirm if user wants to use texture size larger than MaxRecommendedRenderTargetSize bool ValidateTextureSize(void* newValue, const AZ::Uuid& valueType); }; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/Serialization/Decorators/Resources.h b/Code/CryEngine/CryCommon/Serialization/Decorators/Resources.h index b2d61cd7f7..637fc937ed 100644 --- a/Code/CryEngine/CryCommon/Serialization/Decorators/Resources.h +++ b/Code/CryEngine/CryCommon/Serialization/Decorators/Resources.h @@ -64,4 +64,4 @@ namespace Serialization using Serialization::ForceFeedbackIdName; } } -#endif // CRYINCLUDE_CRYCOMMON_SERIALIZATION_DECORATORS_RESOURCES_H \ No newline at end of file +#endif // CRYINCLUDE_CRYCOMMON_SERIALIZATION_DECORATORS_RESOURCES_H diff --git a/Code/CryEngine/CryCommon/Serialization/NetScriptSerialize.h b/Code/CryEngine/CryCommon/Serialization/NetScriptSerialize.h index 6193fe33fe..8c66452419 100644 --- a/Code/CryEngine/CryCommon/Serialization/NetScriptSerialize.h +++ b/Code/CryEngine/CryCommon/Serialization/NetScriptSerialize.h @@ -24,4 +24,4 @@ namespace Serialization }; } -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/CryCommon/StereoRendererBus.h b/Code/CryEngine/CryCommon/StereoRendererBus.h index a99ee407dc..2d0da799f6 100644 --- a/Code/CryEngine/CryCommon/StereoRendererBus.h +++ b/Code/CryEngine/CryCommon/StereoRendererBus.h @@ -44,4 +44,4 @@ namespace AZ }; using StereoRendererRequestBus = EBus < StereoRendererBus >; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CryCommon/TPool.h b/Code/CryEngine/CryCommon/TPool.h index 1eb1894bf3..b7f1d19068 100644 --- a/Code/CryEngine/CryCommon/TPool.h +++ b/Code/CryEngine/CryCommon/TPool.h @@ -85,4 +85,4 @@ public: PodArray m_lstUsed; T* m_pPool; int m_nPoolSize; -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/CryCommon/VRCommon.h b/Code/CryEngine/CryCommon/VRCommon.h index e14b456fbe..5d438da9d5 100644 --- a/Code/CryEngine/CryCommon/VRCommon.h +++ b/Code/CryEngine/CryCommon/VRCommon.h @@ -256,4 +256,4 @@ namespace AZ }//namespace VR AZ_TYPE_INFO_SPECIALIZE(VR::ControllerIndex, "{90D4C80E-A1CC-4DBF-A131-0082C75835E8}"); -}//namespace AZ \ No newline at end of file +}//namespace AZ diff --git a/Code/CryEngine/CryCommon/crycommon_enginesettings_files.cmake b/Code/CryEngine/CryCommon/crycommon_enginesettings_files.cmake index 03f7444316..0fbd223d21 100644 --- a/Code/CryEngine/CryCommon/crycommon_enginesettings_files.cmake +++ b/Code/CryEngine/CryCommon/crycommon_enginesettings_files.cmake @@ -24,4 +24,4 @@ set(FILES # Remove files that cause #define collisions on Mac due to multiple inclusions of 'AppleSpecific.h' and include orders set(SKIP_UNITY_BUILD_INCLUSION_FILES SettingsManagerHelpers.cpp -) \ No newline at end of file +) diff --git a/Code/CryEngine/CryCommon/crycommon_testing_files.cmake b/Code/CryEngine/CryCommon/crycommon_testing_files.cmake index c3348df7dc..ca133c2497 100644 --- a/Code/CryEngine/CryCommon/crycommon_testing_files.cmake +++ b/Code/CryEngine/CryCommon/crycommon_testing_files.cmake @@ -23,4 +23,4 @@ set(FILES Mocks/ITextureMock.h Mocks/IRemoteConsoleMock.h Mocks/MockCGFContent.h -) \ No newline at end of file +) diff --git a/Code/CryEngine/CryFont/CryFont.def b/Code/CryEngine/CryFont/CryFont.def index 25b69bafbd..43bfe0b13d 100644 --- a/Code/CryEngine/CryFont/CryFont.def +++ b/Code/CryEngine/CryFont/CryFont.def @@ -1,3 +1,3 @@ EXPORTS ModuleInitISystem @2 - CryModuleGetMemoryInfo @8 \ No newline at end of file + CryModuleGetMemoryInfo @8 diff --git a/Code/CryEngine/CrySystem/CmdLine.cpp b/Code/CryEngine/CrySystem/CmdLine.cpp index 15e655ddcb..07fbf6aa15 100644 --- a/Code/CryEngine/CrySystem/CmdLine.cpp +++ b/Code/CryEngine/CrySystem/CmdLine.cpp @@ -185,6 +185,7 @@ string CCmdLine::Next(char*& src) return string(org, src - 1); case ' ': + ch = *src++; continue; default: org = src - 1; diff --git a/Code/CryEngine/CrySystem/Huffman.cpp b/Code/CryEngine/CrySystem/Huffman.cpp index 916cf3ae33..a02d24c131 100644 --- a/Code/CryEngine/CrySystem/Huffman.cpp +++ b/Code/CryEngine/CrySystem/Huffman.cpp @@ -464,4 +464,4 @@ static void printModel(const HuffmanTreeNode* const pNodes, const HuffmanSymbolC printf("\n"); } } -}*/ \ No newline at end of file +}*/ diff --git a/Code/CryEngine/CrySystem/IOSConsole.mm b/Code/CryEngine/CrySystem/IOSConsole.mm index b75441369a..6058ea8a44 100644 --- a/Code/CryEngine/CrySystem/IOSConsole.mm +++ b/Code/CryEngine/CrySystem/IOSConsole.mm @@ -91,4 +91,4 @@ void CIOSConsole::PutText( int x, int y, const char * msg ) void CIOSConsole::EndDraw() { // Do Nothing } -#endif // IOS \ No newline at end of file +#endif // IOS diff --git a/Code/CryEngine/CrySystem/LZ4Decompressor.cpp b/Code/CryEngine/CrySystem/LZ4Decompressor.cpp index bb7bff72f4..a4b8a2b8e6 100644 --- a/Code/CryEngine/CrySystem/LZ4Decompressor.cpp +++ b/Code/CryEngine/CrySystem/LZ4Decompressor.cpp @@ -26,4 +26,4 @@ bool CLZ4Decompressor::DecompressData(const char* pIn, char* pOut, const uint ou void CLZ4Decompressor::Release() { delete this; -} \ No newline at end of file +} diff --git a/Code/CryEngine/CrySystem/MiniGUI/MiniButton.cpp b/Code/CryEngine/CrySystem/MiniGUI/MiniButton.cpp index b4c818c8ad..cbedfe1eae 100644 --- a/Code/CryEngine/CrySystem/MiniGUI/MiniButton.cpp +++ b/Code/CryEngine/CrySystem/MiniGUI/MiniButton.cpp @@ -313,4 +313,4 @@ bool CMiniButton::SetConnectedCtrl(IMiniCtrl* pConnectedCtrl) return true; } -MINIGUI_END \ No newline at end of file +MINIGUI_END diff --git a/Code/CryEngine/CrySystem/MiniGUI/MiniInfoBox.cpp b/Code/CryEngine/CrySystem/MiniGUI/MiniInfoBox.cpp index 68fc2dcda1..74114b9156 100644 --- a/Code/CryEngine/CrySystem/MiniGUI/MiniInfoBox.cpp +++ b/Code/CryEngine/CrySystem/MiniGUI/MiniInfoBox.cpp @@ -171,4 +171,4 @@ void CMiniInfoBox::AutoResize() m_requiresResize = false; } -MINIGUI_END \ No newline at end of file +MINIGUI_END diff --git a/Code/CryEngine/CrySystem/MiniGUI/MiniMenu.cpp b/Code/CryEngine/CrySystem/MiniGUI/MiniMenu.cpp index 0788d49831..f905f0f998 100644 --- a/Code/CryEngine/CrySystem/MiniGUI/MiniMenu.cpp +++ b/Code/CryEngine/CrySystem/MiniGUI/MiniMenu.cpp @@ -361,4 +361,4 @@ void CMiniMenu::AddSubCtrl(IMiniCtrl* pCtrl) // Call parent CMiniButton::AddSubCtrl(pCtrl); } -MINIGUI_END \ No newline at end of file +MINIGUI_END diff --git a/Code/CryEngine/CrySystem/RemoteConsole/RemoteConsole_impl.inl b/Code/CryEngine/CrySystem/RemoteConsole/RemoteConsole_impl.inl index b58a8d3780..72155f71de 100644 --- a/Code/CryEngine/CrySystem/RemoteConsole/RemoteConsole_impl.inl +++ b/Code/CryEngine/CrySystem/RemoteConsole/RemoteConsole_impl.inl @@ -182,4 +182,4 @@ void CRemoteConsole::RegisterListener(IRemoteConsoleListener* pListener, const c void CRemoteConsole::UnregisterListener(IRemoteConsoleListener* pListener) { m_listener.Remove(pListener); -} \ No newline at end of file +} diff --git a/Code/CryEngine/CrySystem/Sampler.cpp b/Code/CryEngine/CrySystem/Sampler.cpp index 21113e7be6..b6866ba6cd 100644 --- a/Code/CryEngine/CrySystem/Sampler.cpp +++ b/Code/CryEngine/CrySystem/Sampler.cpp @@ -284,4 +284,4 @@ void CSampler::LogSampledData() } -#endif // defined(WIN32) \ No newline at end of file +#endif // defined(WIN32) diff --git a/Code/CryEngine/CrySystem/SystemInit.cpp b/Code/CryEngine/CrySystem/SystemInit.cpp index 5e43d6a1df..fcbf0b8215 100644 --- a/Code/CryEngine/CrySystem/SystemInit.cpp +++ b/Code/CryEngine/CrySystem/SystemInit.cpp @@ -247,7 +247,7 @@ CUNIXConsole* pUnixConsole; #define LOCALIZATION_TRANSLATIONS_LIST_FILE_NAME "Libs/Localization/localization.xml" -#define LOAD_LEGACY_RENDERER_FOR_EDITOR true // If you set this to false you must for now also set 'ed_useAtomNativeViewport' to true (see /Code/Sandbox/Editor/ViewManager.cpp) +#define LOAD_LEGACY_RENDERER_FOR_EDITOR false // If you set this to true you must also set 'ed_useAtomNativeViewport' to false (see /Code/Sandbox/Editor/ViewManager.cpp) #define LOAD_LEGACY_RENDERER_FOR_LAUNCHER false ////////////////////////////////////////////////////////////////////////// @@ -1294,7 +1294,7 @@ bool CSystem::OpenRenderLibrary(int type, const SSystemInitParams& initParams) const char* libname = ""; if (AZ::Interface::Get()) { - libname = "CryRenderOther"; + libname = DLL_RENDERER_NULL; } else if (type == R_DX9_RENDERER) { @@ -4094,6 +4094,7 @@ void CSystem::CreateSystemVars() "0 = Suppress Asserts\n" "1 = Log Asserts\n" "2 = Show Assert Dialog\n" + "3 = Crashes the Application on Assert\n" "Note: when set to '0 = Suppress Asserts', assert expressions are still evaluated. To turn asserts into a no-op, undefine AZ_ENABLE_TRACING and recompile.", OnAssertLevelCvarChanged); CSystem::SetAssertLevel(defaultAssertValue); diff --git a/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.cpp b/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.cpp index 16dd7bda45..ace30d5df7 100644 --- a/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.cpp +++ b/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.cpp @@ -356,4 +356,4 @@ void DebugCamera::MovePosition(const Vec3& offset) m_position += m_view.GetColumn2() * offset.z; } -} // namespace LegacyViewSystem \ No newline at end of file +} // namespace LegacyViewSystem diff --git a/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.h b/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.h index b051d80944..bcdf101aca 100644 --- a/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.h +++ b/Code/CryEngine/CrySystem/ViewSystem/DebugCamera.h @@ -80,4 +80,4 @@ inline bool DebugCamera::IsFree() return m_cameraMode == DebugCamera::ModeFree; } -} // namespace LegacyViewSystem \ No newline at end of file +} // namespace LegacyViewSystem diff --git a/Code/CryEngine/RenderDll/Common/DeferredRenderUtils.h b/Code/CryEngine/RenderDll/Common/DeferredRenderUtils.h index a32e28fd2e..954d1b4c4c 100644 --- a/Code/CryEngine/RenderDll/Common/DeferredRenderUtils.h +++ b/Code/CryEngine/RenderDll/Common/DeferredRenderUtils.h @@ -39,4 +39,4 @@ private: static void SphereTessR(Vec3& v0, Vec3& v1, Vec3& v2, int depth, t_arrDeferredMeshIndBuff& indBuff, t_arrDeferredMeshVertBuff& vertBuff); }; -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/RenderDll/Common/Memory/VRAMDrillerBus.h b/Code/CryEngine/RenderDll/Common/Memory/VRAMDrillerBus.h index bfc76e63e1..ba779b2e54 100644 --- a/Code/CryEngine/RenderDll/Common/Memory/VRAMDrillerBus.h +++ b/Code/CryEngine/RenderDll/Common/Memory/VRAMDrillerBus.h @@ -90,4 +90,4 @@ namespace Render } // namespace Render #endif // CRYINCLUDE_CRYENGINE_RENDERDLL_COMMON_MEMORY_VRAMDRILLERBUS_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.cpp b/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.cpp index ff28ac55b2..ea6ee680ed 100644 --- a/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.cpp +++ b/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.cpp @@ -685,4 +685,4 @@ Matrix44& SPostEffectsUtils::GetColorMatrix() return m_pColorMat; } -//////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.h b/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.h index d1b875d37d..2e8390798e 100644 --- a/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.h +++ b/Code/CryEngine/RenderDll/Common/PostProcess/PostProcessUtils.h @@ -309,4 +309,4 @@ private: static CTexture* m_UpscaleTarget; }; -#endif // CRYINCLUDE_CRYENGINE_RENDERDLL_COMMON_POSTPROCESS_POSTPROCESSUTILS_H \ No newline at end of file +#endif // CRYINCLUDE_CRYENGINE_RENDERDLL_COMMON_POSTPROCESS_POSTPROCESSUTILS_H diff --git a/Code/CryEngine/RenderDll/Common/RendElements/AbstractMeshElement.cpp b/Code/CryEngine/RenderDll/Common/RendElements/AbstractMeshElement.cpp index dd9fdb5338..5ac258be94 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/AbstractMeshElement.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/AbstractMeshElement.cpp @@ -71,4 +71,4 @@ void AbstractMeshElement::DrawMeshWireframe() gcpRendD3D->FX_DrawIndexedPrimitive(eptTriangleList, 0, 0, nVertexBufferCount, 0, nIndexBufferCount); gcpRendD3D->FX_SetState(nState); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/RendElements/CREDeferredShading.cpp b/Code/CryEngine/RenderDll/Common/RendElements/CREDeferredShading.cpp index 8d57c4ac15..fd5b8d12d5 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/CREDeferredShading.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/CREDeferredShading.cpp @@ -47,4 +47,4 @@ void CREDeferredShading::mfReset() void CREDeferredShading::mfActivate([[maybe_unused]] int iProcess) { -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/RendElements/CREGeomCache.cpp b/Code/CryEngine/RenderDll/Common/RendElements/CREGeomCache.cpp index 344186f9ec..bea79db280 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/CREGeomCache.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/CREGeomCache.cpp @@ -240,4 +240,4 @@ bool CREGeomCache::GetGeometryInfo(SGeometryInfo &streams) return true; } -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/RenderDll/Common/RendElements/CREHDRProcess.cpp b/Code/CryEngine/RenderDll/Common/RendElements/CREHDRProcess.cpp index dcb4c3982a..6b9f3ed913 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/CREHDRProcess.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/CREHDRProcess.cpp @@ -47,4 +47,4 @@ void CREHDRProcess::mfReset() void CREHDRProcess::mfActivate([[maybe_unused]] int iProcess) { -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/RendElements/OpticsFactory.cpp b/Code/CryEngine/RenderDll/Common/RendElements/OpticsFactory.cpp index 0dd0effe74..ab56dcd0e3 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/OpticsFactory.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/OpticsFactory.cpp @@ -58,4 +58,4 @@ IOpticsElementBase* COpticsFactory::Create(EFlareType type) const default: return NULL; } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/RendElements/OpticsPredef.hpp b/Code/CryEngine/RenderDll/Common/RendElements/OpticsPredef.hpp index d5622c733c..791fc42d46 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/OpticsPredef.hpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/OpticsPredef.hpp @@ -74,4 +74,4 @@ public: static OpticsPredef instance; return &instance; } -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.cpp b/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.cpp index e50db38c07..1bd6a5a6ae 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.cpp +++ b/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.cpp @@ -850,4 +850,4 @@ EPolygonInCircle2D PolygonInCircle2D(const Vec2& center, const float radius, con } return state; -}//------------------------------------------------------------------------------------------------- \ No newline at end of file +}//------------------------------------------------------------------------------------------------- diff --git a/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.h b/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.h index ab30229995..fd8cc1b292 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.h +++ b/Code/CryEngine/RenderDll/Common/RendElements/Utils/PolygonMath2D.h @@ -150,4 +150,4 @@ enum EPolygonInCircle2D EPolygonInCircle2D PolygonInCircle2D(const Vec2& center, const float radius, const Vec2* pPolygon, const int numPts); -#endif // _POLYGON_MATH_2D_ \ No newline at end of file +#endif // _POLYGON_MATH_2D_ diff --git a/Code/CryEngine/RenderDll/Common/RendElements/Utils/SpatialHashGrid.h b/Code/CryEngine/RenderDll/Common/RendElements/Utils/SpatialHashGrid.h index cf33757117..be70d9e8c1 100644 --- a/Code/CryEngine/RenderDll/Common/RendElements/Utils/SpatialHashGrid.h +++ b/Code/CryEngine/RenderDll/Common/RendElements/Utils/SpatialHashGrid.h @@ -285,4 +285,4 @@ void CSpatialHashGrid::DebugDraw() #endif // !RELEASE #endif // GLASSCFG_USE_HASH_GRID -#endif // _SPATIAL_HASH_GRID_ \ No newline at end of file +#endif // _SPATIAL_HASH_GRID_ diff --git a/Code/CryEngine/RenderDll/Common/Shaders/ShaderStaticFlags.inl b/Code/CryEngine/RenderDll/Common/Shaders/ShaderStaticFlags.inl index 24a7b5d468..84c122fbba 100644 --- a/Code/CryEngine/RenderDll/Common/Shaders/ShaderStaticFlags.inl +++ b/Code/CryEngine/RenderDll/Common/Shaders/ShaderStaticFlags.inl @@ -19,4 +19,4 @@ FX_STATIC_FLAG(GMEM_RT_GREATER_FOUR) FX_STATIC_FLAG(NO_DEPTH_CLIPPING) FX_STATIC_FLAG(FEATURE_FETCH_DEPTHSTENCIL) FX_STATIC_FLAG(GMEM_VELOCITY_BUFFER) -FX_STATIC_FLAG(GLES3_0) \ No newline at end of file +FX_STATIC_FLAG(GLES3_0) diff --git a/Code/CryEngine/RenderDll/Common/Shaders/ShadersResourcesGroups/PerFrame.h b/Code/CryEngine/RenderDll/Common/Shaders/ShadersResourcesGroups/PerFrame.h index a4cdb8b8ce..209b2021a2 100644 --- a/Code/CryEngine/RenderDll/Common/Shaders/ShadersResourcesGroups/PerFrame.h +++ b/Code/CryEngine/RenderDll/Common/Shaders/ShadersResourcesGroups/PerFrame.h @@ -51,4 +51,4 @@ struct PerFrameParameters Vec4 m_VolumetricFogDistanceParams; }; -#endif // _PER_FRAME_RESOURCE_GROUP_ \ No newline at end of file +#endif // _PER_FRAME_RESOURCE_GROUP_ diff --git a/Code/CryEngine/RenderDll/Common/Textures/PowerOf2BlockPacker.cpp b/Code/CryEngine/RenderDll/Common/Textures/PowerOf2BlockPacker.cpp index a38e93aba1..5dbffb30a5 100644 --- a/Code/CryEngine/RenderDll/Common/Textures/PowerOf2BlockPacker.cpp +++ b/Code/CryEngine/RenderDll/Common/Textures/PowerOf2BlockPacker.cpp @@ -228,4 +228,4 @@ void CPowerOf2BlockPacker::FreeContainers() Clear(); stl::free_container(m_Blocks); stl::free_container(m_BlockBitmap); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.cpp b/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.cpp index b06d2dde57..78611fa552 100644 --- a/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.cpp +++ b/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.cpp @@ -43,4 +43,4 @@ void CStereoTexture::Apply(int nTUnit, int nState, int nTexMatSlot, int nSUnit, { AZ_Assert(true, "Invalid eye provided for rendering"); } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.h b/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.h index b439be54c1..d41250108f 100644 --- a/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.h +++ b/Code/CryEngine/RenderDll/Common/Textures/StereoTexture.h @@ -37,4 +37,4 @@ public: void Apply(int nTUnit, int nState = -1, int nTexMatSlot = EFTT_UNKNOWN, int nSUnit = -1, SResourceView::KeyType nResViewKey = SResourceView::DefaultView, EHWShaderClass eHWSC = eHWSC_Pixel) override; AZStd::vector m_textures; -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/RenderDll/Common/Textures/TextureManager.cpp b/Code/CryEngine/RenderDll/Common/Textures/TextureManager.cpp index 2bdeabefaa..8af1faade7 100644 --- a/Code/CryEngine/RenderDll/Common/Textures/TextureManager.cpp +++ b/Code/CryEngine/RenderDll/Common/Textures/TextureManager.cpp @@ -131,78 +131,18 @@ void CTextureManager::LoadDefaultTextures() #endif }; - // Reduced list of default textures to load. - const TextureEntry texturesFromFileReduced[] = + for (const TextureEntry& entry : texturesFromFile) { - {"NoTextureCM", "EngineAssets/TextureMsg/ReplaceMeCM.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"White", "EngineAssets/Textures/White.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"Gray", "EngineAssets/Textures/Grey.dds", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"Black", "EngineAssets/Textures/Black.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"BlackAlpha", "EngineAssets/Textures/BlackAlpha.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"BlackCM", "EngineAssets/Textures/BlackCM.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"FlatBump", "EngineAssets/Textures/White_ddn.tif", FT_DONT_RELEASE | FT_DONT_STREAM | FT_TEX_NORMAL_MAP }, - {"AverageMemoryUsage", "EngineAssets/Icons/AverageMemoryUsage.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"LowMemoryUsage", "EngineAssets/Icons/LowMemoryUsage.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"HighMemoryUsage", "EngineAssets/Icons/HighMemoryUsage.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"LivePreview", "EngineAssets/Icons/LivePreview.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, -#if !defined(_RELEASE) - {"NoTexture", "EngineAssets/TextureMsg/ReplaceMe.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"IconTextureCompiling", "EngineAssets/TextureMsg/TextureCompiling.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"IconTextureCompiling_a", "EngineAssets/TextureMsg/TextureCompiling_a.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"IconTextureCompiling_cm", "EngineAssets/TextureMsg/TextureCompiling_cm.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"IconTextureCompiling_ddn", "EngineAssets/TextureMsg/TextureCompiling_ddn.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"IconTextureCompiling_ddna", "EngineAssets/TextureMsg/TextureCompiling_ddna.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"DefaultMergedDetail", "EngineAssets/Textures/GreyAlpha.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"MipMapDebug", "EngineAssets/TextureMsg/MipMapDebug.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorBlue", "EngineAssets/TextureMsg/color_Blue.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorCyan", "EngineAssets/TextureMsg/color_Cyan.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorGreen", "EngineAssets/TextureMsg/color_Green.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorPurple", "EngineAssets/TextureMsg/color_Purple.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorRed", "EngineAssets/TextureMsg/color_Red.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorWhite", "EngineAssets/TextureMsg/color_White.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorYellow", "EngineAssets/TextureMsg/color_Yellow.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorOrange", "EngineAssets/TextureMsg/color_Orange.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, - {"ColorMagenta", "EngineAssets/TextureMsg/color_Magenta.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, -#else - {"NoTexture", "EngineAssets/TextureMsg/ReplaceMeRelease.tif", FT_DONT_RELEASE | FT_DONT_STREAM }, -#endif - }; - - // Loop over the appropriate texture list and load the textures, storing them in a map keyed by texture name. - // Use reduced subset of textures for Other. - if (AZ::Interface::Get()) - { - for (const TextureEntry& entry : texturesFromFileReduced) + CTexture* pNewTexture = CTexture::ForName(entry.szFileName, entry.flags, eTF_Unknown); + if (pNewTexture) { - // Use EF_LoadTexture rather than CTexture::ForName - CTexture* pNewTexture = static_cast(gEnv->pRenderer->EF_LoadTexture(entry.szFileName, entry.flags)); - if (pNewTexture) - { - CCryNameTSCRC texEntry(entry.szTextureName); - m_DefaultTextures[texEntry] = pNewTexture; - } - else - { - AZ_Assert(false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); - AZ_Warning("[Shaders System]", false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); - } + CCryNameTSCRC texEntry(entry.szTextureName); + m_DefaultTextures[texEntry] = pNewTexture; } - } - else - { - for (const TextureEntry& entry : texturesFromFile) + else { - CTexture* pNewTexture = CTexture::ForName(entry.szFileName, entry.flags, eTF_Unknown); - if (pNewTexture) - { - CCryNameTSCRC texEntry(entry.szTextureName); - m_DefaultTextures[texEntry] = pNewTexture; - } - else - { - AZ_Assert(false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); - AZ_Warning("[Shaders System]", false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); - } + AZ_Assert(false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); + AZ_Warning("[Shaders System]", false, "Error - CTextureManager failed to load default texture %s", entry.szFileName); } } diff --git a/Code/CryEngine/RenderDll/RenderDll_precompiled.cpp b/Code/CryEngine/RenderDll/RenderDll_precompiled.cpp index 12177ac75d..7e27221229 100644 --- a/Code/CryEngine/RenderDll/RenderDll_precompiled.cpp +++ b/Code/CryEngine/RenderDll/RenderDll_precompiled.cpp @@ -12,4 +12,4 @@ // Original file Copyright Crytek GMBH or its affiliates, used under license. #include "RenderDll_precompiled.h" - \ No newline at end of file + diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/CRELensOpticsD3D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/CRELensOpticsD3D.cpp index f304b36831..eb4b394ca2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/CRELensOpticsD3D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/CRELensOpticsD3D.cpp @@ -198,4 +198,4 @@ bool CRELensOptics::mfDraw(CShader* pShader, [[maybe_unused]] SShaderPass* pass) void CRELensOptics::ClearResources() { g_SoftOcclusionManager.ClearResources(); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderGL.props b/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderGL.props index 576dc0806f..19ec66e8c3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderGL.props +++ b/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderGL.props @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderMETAL.props b/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderMETAL.props index 4dceca5ba0..8e4213cec3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderMETAL.props +++ b/Code/CryEngine/RenderDll/XRenderD3D9/CryRenderMETAL.props @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/D3DHMDRenderer.h b/Code/CryEngine/RenderDll/XRenderD3D9/D3DHMDRenderer.h index ab6c2a328d..b5a0b49818 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/D3DHMDRenderer.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/D3DHMDRenderer.h @@ -116,4 +116,4 @@ class D3DHMDRenderer EyeRenderTarget m_eyes[STEREO_EYE_COUNT]; ///< Device render targets to be rendered to and submitted to the HMD for display. bool m_framePrepared; ///< If true, PrepareFrame() and SubmitFrame() were called in the proper ordering (just for debugging purproses). -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DX/RenderCapabilities.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DX/RenderCapabilities.cpp index ad178f6c83..e4d91a49d4 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DX/RenderCapabilities.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DX/RenderCapabilities.cpp @@ -53,4 +53,4 @@ namespace RenderCapabilities { return true; } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/RenderCapabilities.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/RenderCapabilities.cpp index 6d6f768746..b36eb7eed4 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/RenderCapabilities.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/RenderCapabilities.cpp @@ -53,4 +53,4 @@ namespace RenderCapabilities { return true; } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12Asynchronous.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12Asynchronous.cpp index 6935683dd9..f4ec65b270 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12Asynchronous.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12Asynchronous.cpp @@ -11,4 +11,4 @@ */ // Original file Copyright Crytek GMBH or its affiliates, used under license. -#include "RenderDll_precompiled.h" \ No newline at end of file +#include "RenderDll_precompiled.h" diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12View.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12View.cpp index 6935683dd9..f4ec65b270 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12View.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/CCryDX12View.cpp @@ -11,4 +11,4 @@ */ // Original file Copyright Crytek GMBH or its affiliates, used under license. -#include "RenderDll_precompiled.h" \ No newline at end of file +#include "RenderDll_precompiled.h" diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/Texture/CCryDX12TextureBase.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/Texture/CCryDX12TextureBase.cpp index 6935683dd9..f4ec65b270 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/Texture/CCryDX12TextureBase.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DX12/Resource/Texture/CCryDX12TextureBase.cpp @@ -11,4 +11,4 @@ */ // Original file Copyright Crytek GMBH or its affiliates, used under license. -#include "RenderDll_precompiled.h" \ No newline at end of file +#include "RenderDll_precompiled.h" diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLADLoader.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLADLoader.cpp index 6d3c11efdd..45efb6f9f3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLADLoader.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLADLoader.cpp @@ -43,4 +43,4 @@ # include # undef GLAD_GLX_IMPLEMENTATION # endif -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLBlitShaders.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLBlitShaders.hpp index 02c9ffeca4..a144e57c81 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLBlitShaders.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLBlitShaders.hpp @@ -40,4 +40,4 @@ namespace NCryOpenGL "{" " Output0 = texture(text0, VtxOutput0.xy);" "}"; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLFormat.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLFormat.hpp index 75cb0f54b6..0938f06e21 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLFormat.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLFormat.hpp @@ -352,4 +352,4 @@ namespace NCryOpenGL }; -#endif //__GLFORMAT__ \ No newline at end of file +#endif //__GLFORMAT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLInstrument.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLInstrument.hpp index 095641492f..5fd05368d9 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLInstrument.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLInstrument.hpp @@ -1112,4 +1112,4 @@ CUSTOM_INSTRUMENT(Delete, glDeleteSamplers) CUSTOM_INSTRUMENT(Delete, glDeleteTransformFeedbacks) CUSTOM_INSTRUMENT(Delete, glDeleteProgramPipelines) -#endif //__GLINSTRUMENT__ \ No newline at end of file +#endif //__GLINSTRUMENT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlendState.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlendState.cpp index b5c20a2147..4c9e0e60f4 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlendState.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlendState.cpp @@ -51,4 +51,4 @@ bool CCryDXGLBlendState::Apply(NCryOpenGL::CContext* pContext) void CCryDXGLBlendState::GetDesc(D3D11_BLEND_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlob.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlob.cpp index 1512c449bc..30a46abb9e 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlob.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBlob.cpp @@ -75,4 +75,4 @@ LPVOID CCryDXGLBlob::GetBufferPointer() SIZE_T CCryDXGLBlob::GetBufferSize() { return m_uBufferSize; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBuffer.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBuffer.hpp index c45c91b146..c78ed6c285 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBuffer.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLBuffer.hpp @@ -41,4 +41,4 @@ private: D3D11_BUFFER_DESC m_kDesc; }; -#endif //__CRYDXGLBUFFER__ \ No newline at end of file +#endif //__CRYDXGLBUFFER__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilState.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilState.cpp index 3269c350c4..c288761d27 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilState.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilState.cpp @@ -50,4 +50,4 @@ bool CCryDXGLDepthStencilState::Apply(uint32 uStencilReference, NCryOpenGL::CCon void CCryDXGLDepthStencilState::GetDesc(D3D11_DEPTH_STENCIL_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.cpp index 0c4f960002..1f4529f62f 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.cpp @@ -53,4 +53,4 @@ NCryOpenGL::SOutputMergerView* CCryDXGLDepthStencilView::GetGLView() void CCryDXGLDepthStencilView::GetDesc(D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.hpp index 4abab6f222..851df312c9 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLDepthStencilView.hpp @@ -44,4 +44,4 @@ protected: _smart_ptr m_spGLView; }; -#endif //__CRYDXGLDEPTHSTENCILVIEW__ \ No newline at end of file +#endif //__CRYDXGLDEPTHSTENCILVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIObject.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIObject.cpp index 6fa7c22fa1..bbec7eadfa 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIObject.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIObject.cpp @@ -53,4 +53,4 @@ HRESULT CCryDXGLGIObject::GetParent(REFIID riid, void** ppParent) DXGL_TODO("Implement if required") * ppParent = NULL; return E_FAIL; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.cpp index ba24136e47..74515d5eb5 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.cpp @@ -331,4 +331,4 @@ HRESULT CCryDXGLGIOutput::GetFrameStatistics(DXGI_FRAME_STATISTICS* pStats) { DXGL_NOT_IMPLEMENTED return E_FAIL; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.hpp index 99ffdd46ab..5321fa21df 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLGIOutput.hpp @@ -57,4 +57,4 @@ protected: DXGI_OUTPUT_DESC m_kDesc; }; -#endif //__CRYDXGLGIOUTPUT__ \ No newline at end of file +#endif //__CRYDXGLGIOUTPUT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.cpp index fd762a0795..724d9f3507 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.cpp @@ -34,4 +34,4 @@ CCryDXGLInputLayout::~CCryDXGLInputLayout() NCryOpenGL::SInputLayout* CCryDXGLInputLayout::GetGLLayout() { return m_spGLLayout; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.hpp index a76a20cae8..2a4cc6f5cd 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLInputLayout.hpp @@ -38,4 +38,4 @@ private: _smart_ptr m_spGLLayout; }; -#endif //__CRYDXGLINPUTLAYOUT__ \ No newline at end of file +#endif //__CRYDXGLINPUTLAYOUT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.cpp index da5938868a..50ba3c6d04 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.cpp @@ -55,4 +55,4 @@ UINT CCryDXGLQuery::GetDataSize(void) void CCryDXGLQuery::GetDesc(D3D11_QUERY_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.hpp index 096d679657..c115024e33 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLQuery.hpp @@ -59,4 +59,4 @@ private: _smart_ptr m_spGLQuery; }; -#endif //__CRYDXGLQUERY__ \ No newline at end of file +#endif //__CRYDXGLQUERY__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRasterizerState.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRasterizerState.hpp index eaf8562e57..61b6fc6347 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRasterizerState.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRasterizerState.hpp @@ -44,4 +44,4 @@ protected: NCryOpenGL::SRasterizerState* m_pGLState; }; -#endif //__CRYDXGLRASTERIZERSTATE__ \ No newline at end of file +#endif //__CRYDXGLRASTERIZERSTATE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.cpp index 5f10bef21e..423ad2d39a 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.cpp @@ -54,4 +54,4 @@ NCryOpenGL::SOutputMergerView* CCryDXGLRenderTargetView::GetGLView() void CCryDXGLRenderTargetView::GetDesc(D3D11_RENDER_TARGET_VIEW_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.hpp index 6257368ca1..b8a581b2a2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLRenderTargetView.hpp @@ -44,4 +44,4 @@ private: _smart_ptr m_spGLView; }; -#endif //__CRYDXGLRENDERTARGETVIEW__ \ No newline at end of file +#endif //__CRYDXGLRENDERTARGETVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.cpp index e1a7f990a4..792bee2b4c 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.cpp @@ -49,4 +49,4 @@ UINT CCryDXGLResource::GetEvictionPriority(void) { DXGL_NOT_IMPLEMENTED return 0; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.hpp index 9d73d13b00..83c94f1ed1 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLResource.hpp @@ -57,4 +57,4 @@ protected: D3D11_RESOURCE_DIMENSION m_eDimension; }; -#endif //__CRYDXGLRESOURCE__ \ No newline at end of file +#endif //__CRYDXGLRESOURCE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.cpp index 8cc0e3bf35..e7a4da4622 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.cpp @@ -52,4 +52,4 @@ void CCryDXGLSamplerState::Apply(uint32 uStage, uint32 uSlot, NCryOpenGL::CConte void CCryDXGLSamplerState::GetDesc(D3D11_SAMPLER_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.hpp index 85b9a68778..fa542a73fe 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSamplerState.hpp @@ -44,4 +44,4 @@ protected: NCryOpenGL::SSamplerState* m_pGLState; }; -#endif //__CRYDXGLSAMPLERSTATE__ \ No newline at end of file +#endif //__CRYDXGLSAMPLERSTATE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.cpp index 24bdd018dc..93cc909937 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.cpp @@ -31,4 +31,4 @@ CCryDXGLShader::~CCryDXGLShader() NCryOpenGL::SShader* CCryDXGLShader::GetGLShader() { return m_spGLShader.get(); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.hpp index 069d4c08c6..03b6d1238d 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShader.hpp @@ -114,4 +114,4 @@ public: } }; -#endif //__CRYDXGLSHADER__ \ No newline at end of file +#endif //__CRYDXGLSHADER__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderReflection.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderReflection.cpp index 6f78f6c535..1848493663 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderReflection.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderReflection.cpp @@ -414,4 +414,4 @@ UINT CCryDXGLShaderReflection::GetThreadGroupSize(UINT* pSizeX, UINT* pSizeY, UI { DXGL_NOT_IMPLEMENTED return 0; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderResourceView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderResourceView.cpp index c5658bc896..6c03dbea54 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderResourceView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLShaderResourceView.cpp @@ -49,4 +49,4 @@ bool CCryDXGLShaderResourceView::Initialize(NCryOpenGL::CContext* pContext) void CCryDXGLShaderResourceView::GetDesc(D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.cpp index e8fe3cad5a..4c35ddb915 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.cpp @@ -211,4 +211,4 @@ HRESULT CCryDXGLSwapChain::GetLastPresentCount(UINT* pLastPresentCount) { DXGL_NOT_IMPLEMENTED; return E_FAIL; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.hpp index 776c77aae1..f427ff7c59 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwapChain.hpp @@ -63,4 +63,4 @@ protected: DXGI_SWAP_CHAIN_DESC m_kDesc; }; -#endif //__CRYDXGLSWAPCHAIN__ \ No newline at end of file +#endif //__CRYDXGLSWAPCHAIN__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwitchToRef.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwitchToRef.cpp index 3175eb5851..1d002230e7 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwitchToRef.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLSwitchToRef.cpp @@ -44,4 +44,4 @@ BOOL CCryDXGLSwitchToRef::GetUseRef() { DXGL_NOT_IMPLEMENTED return false; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.cpp index 76092ff703..6ee9caea73 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture1D::~CCryDXGLTexture1D() void CCryDXGLTexture1D::GetDesc(D3D11_TEXTURE1D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.hpp index ee36686547..f525f472ac 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture1D.hpp @@ -46,4 +46,4 @@ private: D3D11_TEXTURE1D_DESC m_kDesc; }; -#endif //__CRYDXGLTEXTURE1D__ \ No newline at end of file +#endif //__CRYDXGLTEXTURE1D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.cpp index b342dbacc5..6c75bec4eb 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture2D::~CCryDXGLTexture2D() void CCryDXGLTexture2D::GetDesc(D3D11_TEXTURE2D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.hpp index 6e2ca7e986..e8b284eda3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture2D.hpp @@ -48,4 +48,4 @@ private: D3D11_TEXTURE2D_DESC m_kDesc; }; -#endif //__CRYDXGLTEXTURE2D__ \ No newline at end of file +#endif //__CRYDXGLTEXTURE2D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.cpp index 8d6fea8ae5..1bc4f5975f 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture3D::~CCryDXGLTexture3D() void CCryDXGLTexture3D::GetDesc(D3D11_TEXTURE3D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.hpp index bf20797819..a01015f517 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTexture3D.hpp @@ -46,4 +46,4 @@ private: D3D11_TEXTURE3D_DESC m_kDesc; }; -#endif //__CRYDXGLTEXTURE3D__ \ No newline at end of file +#endif //__CRYDXGLTEXTURE3D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTextureBase.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTextureBase.hpp index c698307615..7a2b7fc59e 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTextureBase.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLTextureBase.hpp @@ -34,4 +34,4 @@ public: NCryOpenGL::STexture* GetGLTexture(); }; -#endif //__CRYDXGLTEXTUREBASE__ \ No newline at end of file +#endif //__CRYDXGLTEXTUREBASE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.cpp index 866ecb0c27..d0f719e7d6 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.cpp @@ -54,4 +54,4 @@ NCryOpenGL::SShaderView* CCryDXGLUnorderedAccessView::GetGLView() void CCryDXGLUnorderedAccessView::GetDesc(D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.hpp index ba10103e56..1db32dcbd3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLUnorderedAccessView.hpp @@ -44,4 +44,4 @@ protected: _smart_ptr m_spGLView; }; -#endif //__CRYDXGLUNORDEREDACCESSVIEW__ \ No newline at end of file +#endif //__CRYDXGLUNORDEREDACCESSVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLView.cpp index bb72a69fe1..485e70d0ac 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Interfaces/CCryDXGLView.cpp @@ -42,4 +42,4 @@ void CCryDXGLView::GetResource(ID3D11Resource** ppResource) m_spResource->AddRef(); } CCryDXGLResource::ToInterface(ppResource, m_spResource); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/RenderCapabilities.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/RenderCapabilities.cpp index 45df155f56..4975e5906c 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/RenderCapabilities.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/RenderCapabilities.cpp @@ -180,4 +180,4 @@ namespace RenderCapabilities { return GetGLDevice()->GetFeatureSpec().m_kVersion.ToUint(); } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/opengl_renderer_files.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/opengl_renderer_files.cmake index 37398920d6..0628baf4bd 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/opengl_renderer_files.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/opengl_renderer_files.cmake @@ -124,4 +124,4 @@ set(SKIP_UNITY_BUILD_INCLUSION_FILES Implementation/GLBlitFramebufferHelper.cpp Implementation/GLShader.cpp Implementation/GLShader.hpp -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11.h index c7a168c21d..6e852e0c60 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11.h @@ -1764,4 +1764,4 @@ struct ID3D11CommandList; //struct ID3D11Device; // Typedef as CCryDXGLDevice -#endif // __DXGL_D3D11_h__ \ No newline at end of file +#endif // __DXGL_D3D11_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11Shader.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11Shader.h index 11251ef031..346621440f 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11Shader.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3D11Shader.h @@ -134,4 +134,4 @@ typedef struct _D3D11_SHADER_INPUT_BIND_DESC } D3D11_SHADER_INPUT_BIND_DESC; -#endif //__DXGL_D3D11Shader_h__ \ No newline at end of file +#endif //__DXGL_D3D11Shader_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCommon.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCommon.h index cc06ed5b16..5f5c9d629d 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCommon.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCommon.h @@ -660,4 +660,4 @@ struct ID3DInclude virtual HRESULT STDMETHODCALLTYPE Open(LPCVOID pData) = 0; }; -#endif //__DXGL_D3DCommon_h__ \ No newline at end of file +#endif //__DXGL_D3DCommon_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCompiler.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCompiler.h index 6f90443b73..b12f1e997c 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCompiler.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DCompiler.h @@ -42,4 +42,4 @@ #define D3DCOMPILE_RESERVED17 (1 << 17) #define D3DCOMPILE_WARNINGS_ARE_ERRORS (1 << 18) -#endif //__DXGL_D3D11Compiler_h__ \ No newline at end of file +#endif //__DXGL_D3D11Compiler_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11.h index c105aa197a..d54aa114f3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11.h @@ -25,4 +25,4 @@ //////////////////////////////////////////////////////////////////////////// struct ID3DX11ThreadPump; -#endif //__DXGL_D3DX11_h__ \ No newline at end of file +#endif //__DXGL_D3DX11_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11tex.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11tex.h index 8a04cbe495..aa408aa432 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11tex.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_D3DX11tex.h @@ -127,4 +127,4 @@ typedef struct _D3DX11_TEXTURE_LOAD_INFO UINT MipFilter; } D3DX11_TEXTURE_LOAD_INFO; -#endif //__DXGL_D3DX11tex_h__ \ No newline at end of file +#endif //__DXGL_D3DX11tex_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_dxgi.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_dxgi.h index cb0d3b7bd9..e40a520279 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_dxgi.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/D3D11/DXMETAL_dxgi.h @@ -196,4 +196,4 @@ struct IDXGISurface1; //struct IDXGIAdapter1; // Typedef as CCryDXGLGIAdapter //struct IDXGIDevice1; // Typedef as CCryDXGLDevice -#endif //__DXGL_DXGI_h__ \ No newline at end of file +#endif //__DXGL_DXGI_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3D11Shader.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3D11Shader.h index 6a16b58bef..42e50bf035 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3D11Shader.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3D11Shader.h @@ -221,4 +221,4 @@ struct ID3D11ShaderReflection #endif //DXGL_FULL_EMULATION -#endif //__DXGL_D3D11Shader_h__ \ No newline at end of file +#endif //__DXGL_D3D11Shader_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCommon.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCommon.h index a568589e89..8e07070cdf 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCommon.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCommon.h @@ -660,4 +660,4 @@ struct ID3DInclude virtual HRESULT STDMETHODCALLTYPE Open(LPCVOID pData) = 0; }; -#endif //__DXGL_D3DCommon_h__ \ No newline at end of file +#endif //__DXGL_D3DCommon_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCompiler.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCompiler.h index 3df383c14f..9679fd25f8 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCompiler.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DCompiler.h @@ -55,4 +55,4 @@ typedef HRESULT (WINAPI * pD3DCompile) ID3DBlob** ppCode, ID3DBlob** ppErrorMsgs); -#endif //__DXGL_D3D11Compiler_h__ \ No newline at end of file +#endif //__DXGL_D3D11Compiler_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11.h index 7c38f0779e..fcafc0a8e4 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11.h @@ -25,4 +25,4 @@ //////////////////////////////////////////////////////////////////////////// struct ID3DX11ThreadPump; -#endif //__DXGL_D3DX11_h__ \ No newline at end of file +#endif //__DXGL_D3DX11_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11tex.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11tex.h index a6173c9128..ef19de2186 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11tex.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_D3DX11tex.h @@ -127,4 +127,4 @@ typedef struct _D3DX11_TEXTURE_LOAD_INFO UINT MipFilter; } D3DX11_TEXTURE_LOAD_INFO; -#endif //__DXGL_D3DX11tex_h__ \ No newline at end of file +#endif //__DXGL_D3DX11tex_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_dxgi.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_dxgi.h index 5fcf3d7a7c..1a59ea3781 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_dxgi.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Definitions/DXMETAL_dxgi.h @@ -280,4 +280,4 @@ struct IDXGIDevice1 #endif //DXGL_FULL_EMULATION -#endif //__DXGL_DXGI_h__ \ No newline at end of file +#endif //__DXGL_DXGI_h__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/AppleGPUInfoUtils.h b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/AppleGPUInfoUtils.h index e543986518..8efe8ec358 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/AppleGPUInfoUtils.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/AppleGPUInfoUtils.h @@ -20,4 +20,4 @@ // Return -1 on failure and availabe VRAM otherwise long GetVRAMForDisplay(const int dspNum); -#endif \ No newline at end of file +#endif diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.cpp index 8b25f3b4f8..782b11a5d7 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.cpp @@ -24,4 +24,4 @@ namespace NCryOpenGL SAutoLog g_kLog("DXGL.log"); SAutoTLSSlot g_kCRCTable; } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.hpp index fdc4356dd4..1dd933f626 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLCrossPlatform.hpp @@ -194,4 +194,4 @@ namespace NCryOpenGL }; } -#endif //__GLCROSSPLATFORM__ \ No newline at end of file +#endif //__GLCROSSPLATFORM__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLWinPlatform.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLWinPlatform.hpp index c0118df514..fa7691a8db 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLWinPlatform.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Implementation/GLWinPlatform.hpp @@ -127,4 +127,4 @@ namespace NCryOpenGL } } -#endif //__GLWINPLATFORM__ \ No newline at end of file +#endif //__GLWINPLATFORM__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlendState.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlendState.cpp index d8b3d3cf4f..0df54fceb1 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlendState.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlendState.cpp @@ -51,4 +51,4 @@ bool CCryDXGLBlendState::Apply(NCryMetal::CContext* pContext) void CCryDXGLBlendState::GetDesc(D3D11_BLEND_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlob.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlob.cpp index 5cf56cf41b..8e05fdaa0f 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlob.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBlob.cpp @@ -75,4 +75,4 @@ LPVOID CCryDXGLBlob::GetBufferPointer() SIZE_T CCryDXGLBlob::GetBufferSize() { return m_uBufferSize; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBuffer.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBuffer.hpp index 98de44b7c7..bfcc78a9fd 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBuffer.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALBuffer.hpp @@ -41,4 +41,4 @@ private: D3D11_BUFFER_DESC m_kDesc; }; -#endif //__CRYMETALGLBUFFER__ \ No newline at end of file +#endif //__CRYMETALGLBUFFER__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilState.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilState.cpp index 0763a77f4a..f75b57c3ff 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilState.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilState.cpp @@ -62,4 +62,4 @@ bool CCryDXGLDepthStencilState::Apply(uint32 uStencilReference, NCryMetal::CCont void CCryDXGLDepthStencilState::GetDesc(D3D11_DEPTH_STENCIL_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.cpp index 8ff0fe2bb2..4b508aada3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.cpp @@ -53,4 +53,4 @@ NCryMetal::SOutputMergerView* CCryDXGLDepthStencilView::GetGLView() void CCryDXGLDepthStencilView::GetDesc(D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.hpp index 8408e04312..e89b6d9737 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALDepthStencilView.hpp @@ -44,4 +44,4 @@ protected: _smart_ptr m_spGLView; }; -#endif //__CRYMETALGLDEPTHSTENCILVIEW__ \ No newline at end of file +#endif //__CRYMETALGLDEPTHSTENCILVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIFactory.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIFactory.cpp index 50124079cc..97bae5f0c7 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIFactory.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIFactory.cpp @@ -131,4 +131,4 @@ BOOL CCryDXGLGIFactory::IsCurrent() { DXGL_NOT_IMPLEMENTED return false; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIObject.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIObject.cpp index 40d554a9bb..4073f645a2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIObject.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIObject.cpp @@ -53,4 +53,4 @@ HRESULT CCryDXGLGIObject::GetParent(REFIID riid, void** ppParent) DXGL_TODO("Implement if required") * ppParent = NULL; return E_FAIL; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.cpp index 65094f0e28..85ed885a55 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.cpp @@ -108,4 +108,4 @@ HRESULT CCryDXGLGIOutput::GetFrameStatistics(DXGI_FRAME_STATISTICS* pStats) { DXGL_NOT_IMPLEMENTED return E_FAIL; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.hpp index 9422d7bb48..e5e21ead7e 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALGIOutput.hpp @@ -48,4 +48,4 @@ protected: DXGI_OUTPUT_DESC m_OutputDesc; }; -#endif //__CRYMETALGLGIOUTPUT__ \ No newline at end of file +#endif //__CRYMETALGLGIOUTPUT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.cpp index 3a14f058ed..1f35826658 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.cpp @@ -33,4 +33,4 @@ CCryDXGLInputLayout::~CCryDXGLInputLayout() NCryMetal::SInputLayout* CCryDXGLInputLayout::GetGLLayout() { return m_spGLLayout; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.hpp index f0efb46537..be487d27c2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALInputLayout.hpp @@ -38,4 +38,4 @@ private: _smart_ptr m_spGLLayout; }; -#endif //__CRYMETALGLINPUTLAYOUT__ \ No newline at end of file +#endif //__CRYMETALGLINPUTLAYOUT__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.cpp index 267c11a473..7beb850f9b 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.cpp @@ -55,4 +55,4 @@ UINT CCryDXGLQuery::GetDataSize(void) void CCryDXGLQuery::GetDesc(D3D11_QUERY_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.hpp index c2c15aefb4..0df668771c 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALQuery.hpp @@ -59,4 +59,4 @@ private: _smart_ptr m_spGLQuery; }; -#endif //__CRYMETALGLQUERY__ \ No newline at end of file +#endif //__CRYMETALGLQUERY__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRasterizerState.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRasterizerState.hpp index f8e0a9b97e..da21f4d01d 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRasterizerState.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRasterizerState.hpp @@ -44,4 +44,4 @@ protected: NCryMetal::SRasterizerState* m_pGLState; }; -#endif //__CRYMETALGLRASTERIZERSTATE__ \ No newline at end of file +#endif //__CRYMETALGLRASTERIZERSTATE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.cpp index 947b92cb51..df5d746e5d 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.cpp @@ -54,4 +54,4 @@ NCryMetal::SOutputMergerView* CCryDXGLRenderTargetView::GetGLView() void CCryDXGLRenderTargetView::GetDesc(D3D11_RENDER_TARGET_VIEW_DESC* pDesc) { (*pDesc) = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.hpp index 5a561c6395..5ffab07b56 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALRenderTargetView.hpp @@ -44,4 +44,4 @@ private: _smart_ptr m_spGLView; }; -#endif //__CRYMETALGLRENDERTARGETVIEW__ \ No newline at end of file +#endif //__CRYMETALGLRENDERTARGETVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.cpp index 6152e2ba75..206642bcaa 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.cpp @@ -54,4 +54,4 @@ UINT CCryDXGLResource::GetEvictionPriority(void) { DXGL_NOT_IMPLEMENTED return 0; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.hpp index af43cf0c28..98ad37d131 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALResource.hpp @@ -57,4 +57,4 @@ protected: D3D11_RESOURCE_DIMENSION m_eDimension; }; -#endif //__CRYMETALGLRESOURCE__ \ No newline at end of file +#endif //__CRYMETALGLRESOURCE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.cpp index c2f0b35df5..234394058e 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.cpp @@ -31,4 +31,4 @@ CCryDXGLShader::~CCryDXGLShader() NCryMetal::SShader* CCryDXGLShader::GetGLShader() { return m_spGLShader.get(); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.hpp index 14720a92d8..6527c035d3 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShader.hpp @@ -114,4 +114,4 @@ public: } }; -#endif //__CRYMETALGLSHADER__ \ No newline at end of file +#endif //__CRYMETALGLSHADER__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShaderResourceView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShaderResourceView.cpp index 617b90501b..0ba8eb6733 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShaderResourceView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALShaderResourceView.cpp @@ -54,4 +54,4 @@ NCryMetal::SShaderResourceView* CCryDXGLShaderResourceView::GetGLView() void CCryDXGLShaderResourceView::GetDesc(D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwapChain.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwapChain.hpp index 5da234a296..b6a307c580 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwapChain.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwapChain.hpp @@ -81,4 +81,4 @@ protected: void* m_pAutoreleasePool; }; -#endif //__CRYMETALGLSWAPCHAIN__ \ No newline at end of file +#endif //__CRYMETALGLSWAPCHAIN__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwitchToRef.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwitchToRef.cpp index 605640a73a..74070cb1f2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwitchToRef.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALSwitchToRef.cpp @@ -44,4 +44,4 @@ BOOL CCryDXGLSwitchToRef::GetUseRef() { DXGL_NOT_IMPLEMENTED return false; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.cpp index 332d582221..91be242357 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture1D::~CCryDXGLTexture1D() void CCryDXGLTexture1D::GetDesc(D3D11_TEXTURE1D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.hpp index 7544902c57..a818eaa05d 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture1D.hpp @@ -46,4 +46,4 @@ private: D3D11_TEXTURE1D_DESC m_kDesc; }; -#endif //__CRYMETALGLTEXTURE1D__ \ No newline at end of file +#endif //__CRYMETALGLTEXTURE1D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.cpp index befabe03a9..25ee8358cc 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture2D::~CCryDXGLTexture2D() void CCryDXGLTexture2D::GetDesc(D3D11_TEXTURE2D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.hpp index 250b8e3682..f497917fba 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture2D.hpp @@ -48,4 +48,4 @@ private: D3D11_TEXTURE2D_DESC m_kDesc; }; -#endif //__CRYMETALGLTEXTURE2D__ \ No newline at end of file +#endif //__CRYMETALGLTEXTURE2D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.cpp index 8d74b56930..527a64a905 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.cpp @@ -37,4 +37,4 @@ CCryDXGLTexture3D::~CCryDXGLTexture3D() void CCryDXGLTexture3D::GetDesc(D3D11_TEXTURE3D_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.hpp index f9475d085a..8707218358 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTexture3D.hpp @@ -46,4 +46,4 @@ private: D3D11_TEXTURE3D_DESC m_kDesc; }; -#endif //__CRYMETALGLTEXTURE3D__ \ No newline at end of file +#endif //__CRYMETALGLTEXTURE3D__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTextureBase.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTextureBase.hpp index f3b8a9846d..6360182b03 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTextureBase.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALTextureBase.hpp @@ -34,4 +34,4 @@ public: NCryMetal::STexture* GetGLTexture(); }; -#endif //__CRYMETALGLTEXTUREBASE__ \ No newline at end of file +#endif //__CRYMETALGLTEXTUREBASE__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.cpp index dab833815c..a53ce0f4b6 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.cpp @@ -46,4 +46,4 @@ NCryMetal::STexture* CCryDXGLUnorderedAccessView::GetGLTexture() void CCryDXGLUnorderedAccessView::GetDesc(D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc) { *pDesc = m_kDesc; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.hpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.hpp index f09f102769..61c81cce11 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.hpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALUnorderedAccessView.hpp @@ -40,4 +40,4 @@ protected: D3D11_UNORDERED_ACCESS_VIEW_DESC m_kDesc; }; -#endif //__CRYMETALGLUNORDEREDACCESSVIEW__ \ No newline at end of file +#endif //__CRYMETALGLUNORDEREDACCESSVIEW__ diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALView.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALView.cpp index 92cb9d0d8e..33bf3d9b6a 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALView.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DXMETAL/Interfaces/CCryDXMETALView.cpp @@ -42,4 +42,4 @@ void CCryDXGLView::GetResource(ID3D11Resource** ppResource) m_spResource->AddRef(); } CCryDXGLResource::ToInterface(ppResource, m_spResource); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.cpp index 217b873fc0..fce087e8b7 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.cpp @@ -225,4 +225,4 @@ namespace AzRHI entry.m_registerCountMax = 0; entry.m_bExternalActive = false; } -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.h b/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.h index ad24df1dda..f86253a6bc 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.h @@ -148,4 +148,4 @@ namespace AzRHI AZStd::vector m_Buffers[eHWSC_Num][eConstantBufferShaderSlot_Count]; AZStd::vector m_DirtyEntries; }; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.cpp index 93e79ce4cc..94574f1221 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.cpp @@ -22,4 +22,4 @@ IGPUTimer* GPUTimerFactory::Create() return aznew CNullGPUTimer(); #endif -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.h b/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.h index adcc9c297b..9cb9c9e097 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/GPUTimerFactory.h @@ -18,4 +18,4 @@ public: // Instantiates a GPUTimer corresponding to the current platform. // Returns dynamic memory. Caller is resposible for de-allocating. static IGPUTimer* Create(); -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/Common/UtilityPasses.cpp b/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/Common/UtilityPasses.cpp index 2265fb23d6..aa8c03e2a2 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/Common/UtilityPasses.cpp +++ b/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/Common/UtilityPasses.cpp @@ -212,4 +212,4 @@ void CGaussianBlurPass::Reset() { m_passH.Reset(); m_passV.Reset(); -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/FurBendData.h b/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/FurBendData.h index 2280817b8a..2ffc0fb814 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/FurBendData.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/GraphicsPipeline/FurBendData.h @@ -52,4 +52,4 @@ private: CThreadSafeRendererContainer m_fillData[RT_COMMAND_BUF_COUNT]; static FurBendData* s_pInstance; -}; \ No newline at end of file +}; diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Linux/core_renderer_linux.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Linux/core_renderer_linux.cmake index 79566b3247..1682dfa3f9 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Linux/core_renderer_linux.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Linux/core_renderer_linux.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PUBLIC 3rdParty::squish-ccr -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Mac/core_renderer_mac.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Mac/core_renderer_mac.cmake index 79566b3247..1682dfa3f9 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Mac/core_renderer_mac.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Mac/core_renderer_mac.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PUBLIC 3rdParty::squish-ccr -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/core_renderer_windows.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/core_renderer_windows.cmake index cf3cb827b9..0b18297911 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/core_renderer_windows.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/core_renderer_windows.cmake @@ -18,4 +18,4 @@ set(LY_BUILD_DEPENDENCIES d3dcompiler dxguid 3rdParty::squish-ccr -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d11_windows.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d11_windows.cmake index d2d5fe5d26..f751cd594b 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d11_windows.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d11_windows.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE d3d11 -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d12_windows.cmake b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d12_windows.cmake index 2090fa1de1..bbe5978122 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d12_windows.cmake +++ b/Code/CryEngine/RenderDll/XRenderD3D9/Platform/Windows/d3d12_windows.cmake @@ -13,4 +13,4 @@ set(LY_BUILD_DEPENDENCIES PUBLIC d3d12 dxgi -) \ No newline at end of file +) diff --git a/Code/CryEngine/RenderDll/XRenderD3D9/ShadowTextureGroupManager.h b/Code/CryEngine/RenderDll/XRenderD3D9/ShadowTextureGroupManager.h index ae253e28b0..f965dc8590 100644 --- a/Code/CryEngine/RenderDll/XRenderD3D9/ShadowTextureGroupManager.h +++ b/Code/CryEngine/RenderDll/XRenderD3D9/ShadowTextureGroupManager.h @@ -82,4 +82,4 @@ private: // -------------------------------------------------------------------- -#endif // SHADOW_TEXTURE_GROUP_MANAGER_H \ No newline at end of file +#endif // SHADOW_TEXTURE_GROUP_MANAGER_H diff --git a/Code/CryEngine/RenderDll/XRenderNULL/CRELensOpticsNULL.cpp b/Code/CryEngine/RenderDll/XRenderNULL/CRELensOpticsNULL.cpp index 81dc726f74..497eec472a 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/CRELensOpticsNULL.cpp +++ b/Code/CryEngine/RenderDll/XRenderNULL/CRELensOpticsNULL.cpp @@ -26,4 +26,4 @@ bool CRELensOptics::mfCompile([[maybe_unused]] CParserBin& Parser, [[maybe_unuse void CRELensOptics::mfPrepare([[maybe_unused]] bool bCheckOverflow) {} -bool CRELensOptics::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) { return true; } \ No newline at end of file +bool CRELensOptics::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) { return true; } diff --git a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Font.cpp b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Font.cpp index 2b85cce0f5..f20b12c559 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Font.cpp +++ b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Font.cpp @@ -52,4 +52,4 @@ void CNULLRenderer::DrawDynVB([[maybe_unused]] SVF_P3F_C4B_T2F* pBuf, [[maybe_un void CNULLRenderer::DrawDynUiPrimitiveList([[maybe_unused]] DynUiPrimitiveList& primitives, [[maybe_unused]] int totalNumVertices, [[maybe_unused]] int totalNumIndices) { -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderNULL/NULL_PostProcess.cpp b/Code/CryEngine/RenderDll/XRenderNULL/NULL_PostProcess.cpp index 3453f9b026..5828787b5e 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/NULL_PostProcess.cpp +++ b/Code/CryEngine/RenderDll/XRenderNULL/NULL_PostProcess.cpp @@ -254,4 +254,4 @@ void ScreenFader::Render() } -///////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +///////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Textures.cpp b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Textures.cpp index db969cafdf..36da308082 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/NULL_Textures.cpp +++ b/Code/CryEngine/RenderDll/XRenderNULL/NULL_Textures.cpp @@ -283,4 +283,4 @@ bool CTexture::Clear() { return true; } uint32 CDeviceTexture::TextureDataSize([[maybe_unused]] uint32 nWidth, [[maybe_unused]] uint32 nHeight, [[maybe_unused]] uint32 nDepth, [[maybe_unused]] uint32 nMips, [[maybe_unused]] uint32 nSlices, [[maybe_unused]] const ETEX_Format eTF) { return 0; -} \ No newline at end of file +} diff --git a/Code/CryEngine/RenderDll/XRenderNULL/Platform/Windows/platform_windows.cmake b/Code/CryEngine/RenderDll/XRenderNULL/Platform/Windows/platform_windows.cmake index 4101ff307e..6f1124d28d 100644 --- a/Code/CryEngine/RenderDll/XRenderNULL/Platform/Windows/platform_windows.cmake +++ b/Code/CryEngine/RenderDll/XRenderNULL/Platform/Windows/platform_windows.cmake @@ -13,4 +13,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE opengl32 glu32 -) \ No newline at end of file +) diff --git a/Code/Framework/AtomCore/AtomCore/Instance/Instance.h b/Code/Framework/AtomCore/AtomCore/Instance/Instance.h index 53e3f8efe4..7dcbcbd190 100644 --- a/Code/Framework/AtomCore/AtomCore/Instance/Instance.h +++ b/Code/Framework/AtomCore/AtomCore/Instance/Instance.h @@ -26,4 +26,4 @@ namespace AZ template using Instance = AZStd::intrusive_ptr; } -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/AtomCore/Instance/InstanceId.cpp b/Code/Framework/AtomCore/AtomCore/Instance/InstanceId.cpp index eba9a59204..9022a97757 100644 --- a/Code/Framework/AtomCore/AtomCore/Instance/InstanceId.cpp +++ b/Code/Framework/AtomCore/AtomCore/Instance/InstanceId.cpp @@ -60,4 +60,4 @@ namespace AZ return m_guid != rhs.m_guid || m_subId != rhs.m_subId; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/AtomCore/std/containers/fixed_vector_set.h b/Code/Framework/AtomCore/AtomCore/std/containers/fixed_vector_set.h index 6e5b77c133..d8ff78c3d2 100644 --- a/Code/Framework/AtomCore/AtomCore/std/containers/fixed_vector_set.h +++ b/Code/Framework/AtomCore/AtomCore/std/containers/fixed_vector_set.h @@ -35,4 +35,4 @@ namespace AZStd base_type::assign(list.begin(), list.end()); } }; -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/AtomCore/std/containers/lru_cache.h b/Code/Framework/AtomCore/AtomCore/std/containers/lru_cache.h index 7a4c96d872..8aa8844a90 100644 --- a/Code/Framework/AtomCore/AtomCore/std/containers/lru_cache.h +++ b/Code/Framework/AtomCore/AtomCore/std/containers/lru_cache.h @@ -158,4 +158,4 @@ namespace AZStd /// Old elements will be evicted if the capacity is exceeded. size_t m_capacity = 0; }; -} // namespace AZStd \ No newline at end of file +} // namespace AZStd diff --git a/Code/Framework/AtomCore/AtomCore/std/containers/vector_set.h b/Code/Framework/AtomCore/AtomCore/std/containers/vector_set.h index 5a2dfb9e59..1c20be232d 100644 --- a/Code/Framework/AtomCore/AtomCore/std/containers/vector_set.h +++ b/Code/Framework/AtomCore/AtomCore/std/containers/vector_set.h @@ -76,4 +76,4 @@ namespace AZStd base_type::m_container.set_allocator(allocator); } }; -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/AtomCore/std/containers/vector_set_base.h b/Code/Framework/AtomCore/AtomCore/std/containers/vector_set_base.h index 0d7ba93dfb..b1753511f9 100644 --- a/Code/Framework/AtomCore/AtomCore/std/containers/vector_set_base.h +++ b/Code/Framework/AtomCore/AtomCore/std/containers/vector_set_base.h @@ -231,4 +231,4 @@ namespace AZStd protected: RandomAccessContainer m_container; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake index fd4cab77e3..26efd09fe1 100644 --- a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake +++ b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake @@ -16,4 +16,4 @@ set(FILES lru_cache.cpp Main.cpp vector_set.cpp -) \ No newline at end of file +) diff --git a/Code/Framework/AtomCore/Tests/lru_cache.cpp b/Code/Framework/AtomCore/Tests/lru_cache.cpp index bd24c9255f..873951d5aa 100644 --- a/Code/Framework/AtomCore/Tests/lru_cache.cpp +++ b/Code/Framework/AtomCore/Tests/lru_cache.cpp @@ -169,4 +169,4 @@ namespace UnitTest intintptr_cache.clear(); EXPECT_EQ(p->use_count(), 1); } -} \ No newline at end of file +} diff --git a/Code/Framework/AtomCore/Tests/vector_set.cpp b/Code/Framework/AtomCore/Tests/vector_set.cpp index 16729eaf88..dadcb80899 100644 --- a/Code/Framework/AtomCore/Tests/vector_set.cpp +++ b/Code/Framework/AtomCore/Tests/vector_set.cpp @@ -282,4 +282,4 @@ namespace UnitTest VectorSetTester> tester; tester.TestIteratorsConst(); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/input/KeyboardHandler.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/input/KeyboardHandler.java index d31fd9dd6a..9504792d3a 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/input/KeyboardHandler.java +++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/input/KeyboardHandler.java @@ -193,4 +193,4 @@ public class KeyboardHandler private Activity m_activity; private InputMethodManager m_inputManager; private DummyTextView m_textView; -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/APKHandler.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/APKHandler.java index 69d7e0232e..e3761f4a52 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/APKHandler.java +++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/APKHandler.java @@ -88,4 +88,4 @@ public class APKHandler private static AssetManager s_assetManager = null; private static boolean s_debug = false; -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderActivity.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderActivity.java index d2da0ad09d..7cdab93ad3 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderActivity.java +++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderActivity.java @@ -320,4 +320,4 @@ public class ObbDownloaderActivity extends Activity implements IDownloaderClient private int m_buttonPauseTextId; private int m_kbPerSecondTextId; private int m_timeRemainingTextId; -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderAlarmReceiver.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderAlarmReceiver.java index 85f2eb6146..43be7539f0 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderAlarmReceiver.java +++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderAlarmReceiver.java @@ -37,4 +37,4 @@ public class ObbDownloaderAlarmReceiver extends BroadcastReceiver e.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderService.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderService.java index 72278f0dab..2ded31433e 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderService.java +++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/io/obb/ObbDownloaderService.java @@ -75,4 +75,4 @@ public class ObbDownloaderService extends DownloaderService private byte[] m_salt = new byte[] { 23, 12, 4, -12, -34, 23, -120, 122, -23, -104, -2, -4, 12, 3, -21, 123, -11, 4, -11, 32 }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzAndroid/java/com/amazon/test/SimpleObject.java b/Code/Framework/AzAndroid/java/com/amazon/test/SimpleObject.java index 386fc0b508..875809c34f 100644 --- a/Code/Framework/AzAndroid/java/com/amazon/test/SimpleObject.java +++ b/Code/Framework/AzAndroid/java/com/amazon/test/SimpleObject.java @@ -84,4 +84,4 @@ public class SimpleObject // ---- private static final String TAG = "SimpleObject"; -} \ No newline at end of file +} diff --git a/Code/Framework/AzAutoGen/azautogen_files.cmake b/Code/Framework/AzAutoGen/azautogen_files.cmake index 1d927ba580..f575094748 100644 --- a/Code/Framework/AzAutoGen/azautogen_files.cmake +++ b/Code/Framework/AzAutoGen/azautogen_files.cmake @@ -11,4 +11,4 @@ set(FILES AzAutoGen.py -) \ No newline at end of file +) diff --git a/Code/Framework/AzCore/AzCore/Android/AndroidEnv.cpp b/Code/Framework/AzCore/AzCore/Android/AndroidEnv.cpp index e9658e50dc..caa297bf18 100644 --- a/Code/Framework/AzCore/AzCore/Android/AndroidEnv.cpp +++ b/Code/Framework/AzCore/AzCore/Android/AndroidEnv.cpp @@ -417,4 +417,4 @@ namespace AZ return true; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Android/AndroidEnv.h b/Code/Framework/AzCore/AzCore/Android/AndroidEnv.h index 4981eb0823..313031f6f2 100644 --- a/Code/Framework/AzCore/AzCore/Android/AndroidEnv.h +++ b/Code/Framework/AzCore/AzCore/Android/AndroidEnv.h @@ -219,4 +219,4 @@ namespace AZ bool m_isRunning; //!< Internal flag indicating if the application is running, mainly used to determine if we shoudl be blocking on the event pump while paused }; } // namespace Android -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Android/JNI/Object.h b/Code/Framework/AzCore/AzCore/Android/JNI/Object.h index b2aa7c20d1..23b1bde775 100644 --- a/Code/Framework/AzCore/AzCore/Android/JNI/Object.h +++ b/Code/Framework/AzCore/AzCore/Android/JNI/Object.h @@ -485,4 +485,4 @@ namespace AZ { namespace Android } // namespace AZ -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h index c09d531e0a..c8a245af68 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h +++ b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h @@ -1104,8 +1104,11 @@ namespace AZ // If we either already had valid asset data, or just created it via FindOrCreateAsset, try to queue the load. if (m_assetData && m_assetData->GetId().IsValid()) { - // Only try to queue if the asset isn't already loading or loaded. - if (m_assetData->GetStatus() == AZ::Data::AssetData::AssetStatus::NotLoaded) + // Try to queue if the asset isn't already loading or loaded. + // Also try to queue if the asset *is* already loading or loaded, but we're the only one with a strong reference + // (i.e. use count == 1), because that means it was in the process of being garbage-collected. + if ((m_assetData->GetStatus() == AZ::Data::AssetData::AssetStatus::NotLoaded) || + (m_assetData->GetUseCount() == 1)) { *this = AssetInternal::GetAsset(m_assetData->GetId(), m_assetData->GetType(), loadBehavior, loadParams); } diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp index 984aeeb756..4e7a19c197 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp @@ -255,7 +255,7 @@ namespace AZ bool AssetContainer::IsValid() const { - return (m_containerAssetId.IsValid() && m_initComplete); + return (m_containerAssetId.IsValid() && m_initComplete && m_rootAsset); } void AssetContainer::CheckReady() @@ -341,6 +341,7 @@ namespace AZ void AssetContainer::OnAssetError(Asset asset) { + AZ_Warning("AssetContainer", false, "Error loading asset %s", asset->GetId().ToString().c_str()); HandleReadyAsset(asset); } @@ -366,7 +367,10 @@ namespace AZ auto remainingPreloadIter = m_preloadList.find(waiterId); if (remainingPreloadIter == m_preloadList.end()) { - AZ_Warning("AssetContainer", !m_initComplete, "Couldn't find waiting list for %s", waiterId.ToString().c_str()); + // If we got here without an entry on the preload list, it probably means this asset was triggered to load multiple + // times, some with dependencies and some without. To ensure that we don't disturb the loads that expect the + // dependencies, just silently return and don't treat the asset as finished loading. We'll rely on the other load + // to send an OnAssetReady() whenever its expected dependencies are met. return; } if (!remainingPreloadIter->second.erase(preloadID)) @@ -610,7 +614,12 @@ namespace AZ } for(auto& thisList : preloadList) { - m_preloadList[thisList.first].insert(thisList.second.begin(), thisList.second.end()); + // Only save the entry to the final preload list if it has at least one dependent asset still remaining after + // the checks above. + if (!thisList.second.empty()) + { + m_preloadList[thisList.first].insert(thisList.second.begin(), thisList.second.end()); + } } } } diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.cpp index 5ef278c7ea..a17ff6fd6e 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.cpp @@ -208,6 +208,7 @@ namespace AZ::Data void AssetDataStream::Close() { AZ_Assert(m_isOpen, "Attempting to close a stream that hasn't been opened."); + AZ_Assert(m_curReadRequest == nullptr, "Attempting to close a stream with a read request in flight."); // Destroy the asset buffer and unlock the allocator, so the allocator itself knows that it is no longer needed. if (m_buffer != m_preloadedData.data()) @@ -222,6 +223,16 @@ namespace AZ::Data AZ_PROFILE_INTERVAL_END(AZ::Debug::ProfileCategory::AzCore, this); } + void AssetDataStream::RequestCancel() + { + AZStd::scoped_lock lock(m_readRequestMutex); + if (m_curReadRequest) + { + auto streamer = Interface::Get(); + m_curReadRequest = streamer->Cancel(m_curReadRequest); + } + } + void AssetDataStream::Seek(AZ::IO::OffsetType bytes, AZ::IO::GenericStream::SeekMode mode) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzCore); diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.h b/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.h index 58144c2f92..1367c493f5 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.h +++ b/Code/Framework/AzCore/AzCore/Asset/AssetDataStream.h @@ -82,6 +82,10 @@ namespace AZ::Data //! Gets the size of data loaded (so far). size_t GetLoadedSize() const { return m_loadedSize; } + //! Request a cancellation of any current IO streamer requests. + //! Note: This is asynchronous and not guaranteed to cancel if the request is already in-process. + void RequestCancel(); + private: //! Perform any operations needed by all variants of Open() void OpenInternal(size_t assetSize, const char* streamName); diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetInternal/WeakAsset.h b/Code/Framework/AzCore/AzCore/Asset/AssetInternal/WeakAsset.h index 1384511e78..b772d5a8cb 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetInternal/WeakAsset.h +++ b/Code/Framework/AzCore/AzCore/Asset/AssetInternal/WeakAsset.h @@ -28,6 +28,8 @@ namespace AZ::Data::AssetInternal class WeakAsset { public: + static constexpr bool EnableAssetCancellation = false; + WeakAsset() = default; WeakAsset(AssetData* assetData, AssetLoadBehavior assetReferenceLoadBehavior); @@ -111,7 +113,14 @@ namespace AZ::Data::AssetInternal // - If the left and right sides are the same, clearing the right side's reference means one less reference will exist if (m_assetData) { - m_assetData->ReleaseWeak(); + if constexpr (EnableAssetCancellation) + { + m_assetData->ReleaseWeak(); + } + else + { + m_assetData->Release(); + } } m_assetData = AZStd::move(rhs.m_assetData); rhs.m_assetData = nullptr; @@ -141,13 +150,27 @@ namespace AZ::Data::AssetInternal if (assetData) { - assetData->AcquireWeak(); + if constexpr (EnableAssetCancellation) + { + assetData->AcquireWeak(); + } + else + { + assetData->Acquire(); + } m_assetId = assetData->GetId(); } if (m_assetData) { - m_assetData->ReleaseWeak(); + if constexpr (EnableAssetCancellation) + { + m_assetData->ReleaseWeak(); + } + else + { + m_assetData->Release(); + } } m_assetData = assetData; diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp index 214443142b..db8736b4a8 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp @@ -2144,7 +2144,7 @@ namespace AZ if (curIter != m_assetContainers.end()) { auto newRef = curIter->second.lock(); - if (newRef) + if (newRef && newRef->IsValid()) { return newRef; } diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp index a3af2648cf..c55f565615 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp @@ -341,6 +341,16 @@ namespace AZ ; } } + + if (auto behaviorContext = azrtti_cast(context)) + { + behaviorContext->EBus("ComponentApplicationBus") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Category, "Components") + + ->Event("GetEntityName", &ComponentApplicationBus::Events::GetEntityName) + ->Event("SetEntityName", &ComponentApplicationBus::Events::SetEntityName); + } } //========================================================================= @@ -1050,6 +1060,20 @@ namespace AZ return AZStd::string(); } + //========================================================================= + // SetEntityName + //========================================================================= + bool ComponentApplication::SetEntityName(const EntityId& id, const AZStd::string_view name) + { + Entity* entity = FindEntity(id); + if (entity) + { + entity->SetName(name); + return true; + } + return false; + } + //========================================================================= // EnumerateEntities //========================================================================= diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h index ef5c813573..3ebcf39d95 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h @@ -209,6 +209,7 @@ namespace AZ bool DeleteEntity(const EntityId& id) override; Entity* FindEntity(const EntityId& id) override; AZStd::string GetEntityName(const EntityId& id) override; + bool SetEntityName(const EntityId& id, const AZStd::string_view name) override; void EnumerateEntities(const ComponentApplicationRequests::EntityCallback& callback) override; ComponentApplication* GetApplication() override { return this; } /// Returns the serialize context that has been registered with the app, if there is one. diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplicationBus.h b/Code/Framework/AzCore/AzCore/Component/ComponentApplicationBus.h index d0f161aa39..3582e6ebb8 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplicationBus.h +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplicationBus.h @@ -130,7 +130,13 @@ namespace AZ //! @param entity A reference to the entity whose name you are seeking. //! @return The name of the entity with the specified entity ID. //! If no entity is found for the specified ID, it returns an empty string. - virtual AZStd::string GetEntityName(const EntityId& id) { (void)id; return AZStd::string(); }; + virtual AZStd::string GetEntityName(const EntityId& id) { (void)id; return AZStd::string(); } + + //! Sets the name of the entity that has the specified entity ID. + //! Entity names are not enforced to be unique. + //! @param entityId A reference to the entity whose name you want to change. + //! @return True if the name was changed successfully, false if it wasn't. + virtual bool SetEntityName([[maybe_unused]] const EntityId& id, [[maybe_unused]] const AZStd::string_view name) { return false; } //! The type that AZ::ComponentApplicationRequests::EnumerateEntities uses to //! pass entity callbacks to the application for enumeration. diff --git a/Code/Framework/AzCore/AzCore/Compression/zstd_compression.h b/Code/Framework/AzCore/AzCore/Compression/zstd_compression.h index 56f486010f..b7ccc0e522 100644 --- a/Code/Framework/AzCore/AzCore/Compression/zstd_compression.h +++ b/Code/Framework/AzCore/AzCore/Compression/zstd_compression.h @@ -87,4 +87,4 @@ namespace AZ size_t m_nextBlockSize; unsigned int m_compressedBufferIndex; }; -}; \ No newline at end of file +}; diff --git a/Code/Framework/AzCore/AzCore/Debug/AssetTracking.cpp b/Code/Framework/AzCore/AzCore/Debug/AssetTracking.cpp index 787dcff22d..f238b8a74a 100644 --- a/Code/Framework/AzCore/AzCore/Debug/AssetTracking.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/AssetTracking.cpp @@ -63,13 +63,13 @@ namespace AZ static AssetTrackingImpl* GetSharedInstance(); static ThreadData& GetSharedThreadData(); - using MasterAssets = AZStd::unordered_map, AZStd::equal_to, AZStdAssetTrackingAllocator>; + using PrimaryAssets = AZStd::unordered_map, AZStd::equal_to, AZStdAssetTrackingAllocator>; using ThreadData = ThreadData; using mutex_type = AZStd::mutex; using lock_type = AZStd::lock_guard; mutex_type m_mutex; - MasterAssets m_masterAssets; + PrimaryAssets m_primaryAssets; AssetTreeNodeBase* m_assetRoot = nullptr; AssetAllocationTableBase* m_allocationTable = nullptr; bool m_performingAnalysis = false; @@ -118,7 +118,7 @@ namespace AZ auto& threadData = GetSharedThreadData(); AssetTreeNodeBase* parentAsset = threadData.m_currentAssetStack.empty() ? nullptr : threadData.m_currentAssetStack.back(); AssetTreeNodeBase* childAsset; - AssetMasterInfo* assetMasterInfo; + AssetPrimaryInfo* assetPrimaryInfo; if (!parentAsset) { @@ -128,22 +128,22 @@ namespace AZ { lock_type lock(m_mutex); - // Locate or create the master record for this asset - auto masterItr = m_masterAssets.find(assetId); + // Locate or create the primary record for this asset + auto primaryItr = m_primaryAssets.find(assetId); - if (masterItr != m_masterAssets.end()) + if (primaryItr != m_primaryAssets.end()) { - assetMasterInfo = &masterItr->second; + assetPrimaryInfo = &primaryItr->second; } else { - auto insertResult = m_masterAssets.emplace(assetId, AssetMasterInfo()); - assetMasterInfo = &insertResult.first->second; - assetMasterInfo->m_id = &insertResult.first->first; + auto insertResult = m_primaryAssets.emplace(assetId, AssetPrimaryInfo()); + assetPrimaryInfo = &insertResult.first->second; + assetPrimaryInfo->m_id = &insertResult.first->first; } // Add this asset to the stack for this thread's context - childAsset = parentAsset->FindOrAddChild(assetId, assetMasterInfo); + childAsset = parentAsset->FindOrAddChild(assetId, assetPrimaryInfo); } threadData.m_currentAssetStack.push_back(childAsset); @@ -304,7 +304,7 @@ namespace AZ char* pos = buffer; for (auto itr = assetStack.rbegin(); itr != assetStack.rend(); ++itr) { - pos += azsnprintf(pos, BUFFER_SIZE - (pos - buffer), "%s\n", (*itr)->GetAssetMasterInfo()->m_id->m_id.c_str()); + pos += azsnprintf(pos, BUFFER_SIZE - (pos - buffer), "%s\n", (*itr)->GetAssetPrimaryInfo()->m_id->m_id.c_str()); if (pos >= buffer + BUFFER_SIZE) { diff --git a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h index e5be75c7d3..00b82d09ef 100644 --- a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h +++ b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h @@ -79,9 +79,9 @@ namespace AZ AssetTrackingString m_id; }; - // Master information about an asset. + // Primary information about an asset. // Currently just contains the ID of the asset, but in the future may carry additional information about that asset (such as where in code it was initialized). - struct AssetMasterInfo + struct AssetPrimaryInfo { const AssetTrackingId* m_id; }; @@ -90,8 +90,8 @@ namespace AZ class AssetTreeNodeBase { public: - virtual const AssetMasterInfo* GetAssetMasterInfo() const = 0; - virtual AssetTreeNodeBase* FindOrAddChild(const AssetTrackingId& id, const AssetMasterInfo* info) = 0; + virtual const AssetPrimaryInfo* GetAssetPrimaryInfo() const = 0; + virtual AssetTreeNodeBase* FindOrAddChild(const AssetTrackingId& id, const AssetPrimaryInfo* info) = 0; }; // Base class for an asset tree. Implemented by the template AssetTree<>. diff --git a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h index 91f0a0ef21..711c0cf4eb 100644 --- a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h +++ b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h @@ -29,18 +29,18 @@ namespace AZ class AssetTreeNode : public AssetTreeNodeBase { public: - AssetTreeNode(const AssetMasterInfo* masterInfo = nullptr, AssetTreeNode* parent = nullptr) : - m_masterInfo(masterInfo), + AssetTreeNode(const AssetPrimaryInfo* primaryInfo = nullptr, AssetTreeNode* parent = nullptr) : + m_primaryinfo(primaryInfo), m_parent(parent) { } - const AssetMasterInfo* GetAssetMasterInfo() const override + const AssetPrimaryInfo* GetAssetPrimaryInfo() const override { - return m_masterInfo; + return m_primaryinfo; } - AssetTreeNodeBase* FindOrAddChild(const AssetTrackingId& id, const AssetMasterInfo* info) override + AssetTreeNodeBase* FindOrAddChild(const AssetTrackingId& id, const AssetPrimaryInfo* info) override { AssetTreeNodeBase* result = nullptr; auto childItr = m_children.find(id); @@ -61,7 +61,7 @@ namespace AZ using AssetMap = AssetTrackingMap; - const AssetMasterInfo* m_masterInfo; + const AssetPrimaryInfo* m_primaryinfo; AssetTreeNode* m_parent; AssetMap m_children; AssetDataT m_data; diff --git a/Code/Framework/AzCore/AzCore/Debug/EventTraceDrillerBus.h b/Code/Framework/AzCore/AzCore/Debug/EventTraceDrillerBus.h index 70755561e9..e1b92f6fd6 100644 --- a/Code/Framework/AzCore/AzCore/Debug/EventTraceDrillerBus.h +++ b/Code/Framework/AzCore/AzCore/Debug/EventTraceDrillerBus.h @@ -82,4 +82,4 @@ namespace AZ #define AZ_TRACE_INSTANT_THREAD_CATEGORY(name, category) \ EBUS_QUEUE_EVENT(AZ::Debug::EventTraceDrillerBus, RecordInstantThread, name, category, AZStd::this_thread::get_id(), AZStd::GetTimeNowMicroSecond()) -#define AZ_TRACE_INSTANT_THREAD(name) AZ_TRACE_INSTANT_THREAD_CATEGORY(name, "") \ No newline at end of file +#define AZ_TRACE_INSTANT_THREAD(name) AZ_TRACE_INSTANT_THREAD_CATEGORY(name, "") diff --git a/Code/Framework/AzCore/AzCore/Debug/FrameProfiler.h b/Code/Framework/AzCore/AzCore/Debug/FrameProfiler.h index e467e169d1..698e5c7ba4 100644 --- a/Code/Framework/AzCore/AzCore/Debug/FrameProfiler.h +++ b/Code/Framework/AzCore/AzCore/Debug/FrameProfiler.h @@ -64,4 +64,4 @@ namespace AZ } // namespace AZ #endif // AZCORE_FRAME_PROFILER_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Debug/FrameProfilerBus.h b/Code/Framework/AzCore/AzCore/Debug/FrameProfilerBus.h index 7e51b205e9..cabf98993a 100644 --- a/Code/Framework/AzCore/AzCore/Debug/FrameProfilerBus.h +++ b/Code/Framework/AzCore/AzCore/Debug/FrameProfilerBus.h @@ -39,4 +39,4 @@ namespace AZ } // namespace AZ #endif // AZCORE_FRAME_PROFILER_BUS_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Debug/ProfilerDrillerBus.h b/Code/Framework/AzCore/AzCore/Debug/ProfilerDrillerBus.h index f174f674cd..5762779cf1 100644 --- a/Code/Framework/AzCore/AzCore/Debug/ProfilerDrillerBus.h +++ b/Code/Framework/AzCore/AzCore/Debug/ProfilerDrillerBus.h @@ -46,4 +46,4 @@ namespace AZ } #endif // AZCORE_PROFILER_DRILLER_BUS_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp index 18db84e326..635db26465 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp @@ -70,6 +70,7 @@ namespace AZ static const char* logVerbosityUID = "sys_LogLevel"; static const int assertLevel_log = 1; static const int assertLevel_nativeUI = 2; + static const int assertLevel_crash = 3; static const int logLevel_errorWarning = 1; static const int logLevel_full = 2; static AZ::EnvironmentVariable> g_ignoredAsserts; @@ -289,8 +290,8 @@ namespace AZ } #if AZ_ENABLE_TRACE_ASSERTS - //display native UI dialogs at verbosity level 2 or higher - if (currentLevel >= assertLevel_nativeUI) + //display native UI dialogs at verbosity level 2 + if (currentLevel == assertLevel_nativeUI) { AZ::NativeUI::AssertAction buttonResult; EBUS_EVENT_RESULT(buttonResult, AZ::NativeUI::NativeUIRequestBus, DisplayAssertDialog, dialogBoxText); @@ -314,7 +315,13 @@ namespace AZ break; } } + else #endif //AZ_ENABLE_TRACE_ASSERTS + // Crash the application directly at assert level 3 + if (currentLevel >= assertLevel_crash) + { + AZ_Crash(); + } } g_alreadyHandlingAssertOrFatal = false; } diff --git a/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h b/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h index 953f91947f..e53c1f7f0d 100644 --- a/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h +++ b/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h @@ -194,4 +194,4 @@ namespace AZ } }; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.cpp b/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.cpp index e18612b8dd..e9cb74f469 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.cpp @@ -112,4 +112,4 @@ namespace AZ return m_offsetEnd; } } // namespace IO -} // namesapce AZ \ No newline at end of file +} // namesapce AZ diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.h b/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.h index b1578ee159..0f37eec7aa 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.h +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/FileRange.h @@ -71,4 +71,4 @@ namespace AZ u64 m_offsetEnd : 63; }; } // namespace IO -} // namesapce AZ \ No newline at end of file +} // namesapce AZ diff --git a/Code/Framework/AzCore/AzCore/JSON/writer.h b/Code/Framework/AzCore/AzCore/JSON/writer.h index 35b99d6590..dcd6b7cb21 100644 --- a/Code/Framework/AzCore/AzCore/JSON/writer.h +++ b/Code/Framework/AzCore/AzCore/JSON/writer.h @@ -24,4 +24,4 @@ #if AZ_TRAIT_JSON_CLANG_IGNORE_UNKNOWN_WARNING && defined(AZ_COMPILER_CLANG) #pragma clang diagnostic pop -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h index de7c0246ca..01c68d0fb9 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h +++ b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h @@ -46,4 +46,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Jobs/JobCompletion.h b/Code/Framework/AzCore/AzCore/Jobs/JobCompletion.h index 9b7b87cf13..02b41a9270 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/JobCompletion.h +++ b/Code/Framework/AzCore/AzCore/Jobs/JobCompletion.h @@ -68,4 +68,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Jobs/JobCompletionSpin.h b/Code/Framework/AzCore/AzCore/Jobs/JobCompletionSpin.h index 9cade2942c..9496f67856 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/JobCompletionSpin.h +++ b/Code/Framework/AzCore/AzCore/Jobs/JobCompletionSpin.h @@ -70,4 +70,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Jobs/JobEmpty.h b/Code/Framework/AzCore/AzCore/Jobs/JobEmpty.h index bab1accc7c..615b330ba5 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/JobEmpty.h +++ b/Code/Framework/AzCore/AzCore/Jobs/JobEmpty.h @@ -36,4 +36,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Jobs/MultipleDependentJob.h b/Code/Framework/AzCore/AzCore/Jobs/MultipleDependentJob.h index 6b6b26be3a..0b3091029e 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/MultipleDependentJob.h +++ b/Code/Framework/AzCore/AzCore/Jobs/MultipleDependentJob.h @@ -96,4 +96,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Jobs/task_group.h b/Code/Framework/AzCore/AzCore/Jobs/task_group.h index 97586cd017..fc47d4e74e 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/task_group.h +++ b/Code/Framework/AzCore/AzCore/Jobs/task_group.h @@ -135,4 +135,4 @@ namespace AZ } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/Math/Aabb.cpp b/Code/Framework/AzCore/AzCore/Math/Aabb.cpp index 94e138d88d..3f7cb4ecf5 100644 --- a/Code/Framework/AzCore/AzCore/Math/Aabb.cpp +++ b/Code/Framework/AzCore/AzCore/Math/Aabb.cpp @@ -146,8 +146,8 @@ namespace AZ ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) ->Method("GetTranslated", &Aabb::GetTranslated) ->Method("GetSurfaceArea", &Aabb::GetSurfaceArea) - ->Method("GetTransformedObb", &Aabb::GetTransformedObb) - ->Method("GetTransformedAabb", &Aabb::GetTransformedAabb) + ->Method("GetTransformedObb", static_cast(&Aabb::GetTransformedObb)) + ->Method("GetTransformedAabb", static_cast(&Aabb::GetTransformedAabb)) ->Method("ApplyTransform", &Aabb::ApplyTransform) ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) ->Method("Clone", [](const Aabb& rhs) -> Aabb { return rhs; }) @@ -195,6 +195,20 @@ namespace AZ } + Obb Aabb::GetTransformedObb(const Matrix3x4& matrix3x4) const + { + Matrix3x4 matrixNoScale = matrix3x4; + const AZ::Vector3 scale = matrixNoScale.ExtractScale(); + const AZ::Quaternion rotation = AZ::Quaternion::CreateFromMatrix3x4(matrixNoScale); + + return Obb::CreateFromPositionRotationAndHalfLengths( + matrix3x4 * GetCenter(), + rotation, + 0.5f * scale * GetExtents() + ); + } + + void Aabb::ApplyTransform(const Transform& transform) { Vector3 a, b, axisCoeffs; @@ -224,4 +238,17 @@ namespace AZ m_min = newMin; m_max = newMax; } + + + void Aabb::ApplyMatrix3x4(const Matrix3x4& matrix3x4) + { + const AZ::Vector3 extents = GetExtents(); + const AZ::Vector3 center = matrix3x4 * GetCenter(); + AZ::Vector3 newHalfExtents( + 0.5f * matrix3x4.GetRowAsVector3(0).GetAbs().Dot(extents), + 0.5f * matrix3x4.GetRowAsVector3(1).GetAbs().Dot(extents), + 0.5f * matrix3x4.GetRowAsVector3(2).GetAbs().Dot(extents)); + m_min = center - newHalfExtents; + m_max = center + newHalfExtents; + } } diff --git a/Code/Framework/AzCore/AzCore/Math/Aabb.h b/Code/Framework/AzCore/AzCore/Math/Aabb.h index 0aebd099f4..ef7704533e 100644 --- a/Code/Framework/AzCore/AzCore/Math/Aabb.h +++ b/Code/Framework/AzCore/AzCore/Math/Aabb.h @@ -129,11 +129,21 @@ namespace AZ void ApplyTransform(const Transform& transform); + void ApplyMatrix3x4(const Matrix3x4& matrix3x4); + + void MultiplyByScale(const Vector3& scale); + //! Transforms an Aabb and returns the resulting Obb. - class Obb GetTransformedObb(const Transform& transform) const; + [[nodiscard]] Obb GetTransformedObb(const Transform& transform) const; + + //! Transforms an Aabb and returns the resulting Obb. + [[nodiscard]] Obb GetTransformedObb(const Matrix3x4& matrix3x4) const; //! Returns a new AABB containing the transformed AABB. - Aabb GetTransformedAabb(const Transform& transform) const; + [[nodiscard]] Aabb GetTransformedAabb(const Transform& transform) const; + + //! Returns a new AABB containing the transformed AABB. + [[nodiscard]] Aabb GetTransformedAabb(const Matrix3x4& matrix3x4) const; //! Checks if this aabb is equal to another within a floating point tolerance. bool IsClose(const Aabb& rhs, float tolerance = Constants::Tolerance) const; diff --git a/Code/Framework/AzCore/AzCore/Math/Aabb.inl b/Code/Framework/AzCore/AzCore/Math/Aabb.inl index 5e6a5ae188..13549a30f6 100644 --- a/Code/Framework/AzCore/AzCore/Math/Aabb.inl +++ b/Code/Framework/AzCore/AzCore/Math/Aabb.inl @@ -292,6 +292,14 @@ namespace AZ } + AZ_MATH_INLINE void Aabb::MultiplyByScale(const Vector3& scale) + { + m_min *= scale; + m_max *= scale; + AZ_MATH_ASSERT(IsValid(), "Min must be less than Max"); + } + + AZ_MATH_INLINE Aabb Aabb::GetTransformedAabb(const Transform& transform) const { Aabb aabb = Aabb::CreateFromMinMax(m_min, m_max); @@ -300,6 +308,14 @@ namespace AZ } + AZ_MATH_INLINE Aabb Aabb::GetTransformedAabb(const Matrix3x4& matrix3x4) const + { + Aabb aabb = Aabb::CreateFromMinMax(m_min, m_max); + aabb.ApplyMatrix3x4(matrix3x4); + return aabb; + } + + AZ_MATH_INLINE bool Aabb::IsClose(const Aabb& rhs, float tolerance) const { return m_min.IsClose(rhs.m_min, tolerance) && m_max.IsClose(rhs.m_max, tolerance); diff --git a/Code/Framework/AzCore/AzCore/Math/Internal/VertexContainer.inl b/Code/Framework/AzCore/AzCore/Math/Internal/VertexContainer.inl index ce8c3982d8..d616e40540 100644 --- a/Code/Framework/AzCore/AzCore/Math/Internal/VertexContainer.inl +++ b/Code/Framework/AzCore/AzCore/Math/Internal/VertexContainer.inl @@ -296,4 +296,4 @@ namespace AZ m_updateCallback(index); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h b/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h index 08f6e26296..b2dcbe288a 100644 --- a/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h +++ b/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h @@ -164,4 +164,4 @@ namespace AZ return GetTargetValue(); } }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Math/MatrixUtils.h b/Code/Framework/AzCore/AzCore/Math/MatrixUtils.h index a099b0a3d4..f217bc7231 100644 --- a/Code/Framework/AzCore/AzCore/Math/MatrixUtils.h +++ b/Code/Framework/AzCore/AzCore/Math/MatrixUtils.h @@ -67,4 +67,4 @@ namespace AZ //! Transforms a position by a matrix. This function can be used with any generic cases which include projection matrices. Vector3 MatrixTransformPosition(const Matrix4x4& matrix, const Vector3& inPosition); -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp b/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp index ca09f8b453..143fe59ca7 100644 --- a/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp +++ b/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp @@ -258,7 +258,8 @@ namespace AZ Method("CreateFromMatrix3x3", &Quaternion::CreateFromMatrix3x3)-> Method("CreateFromMatrix4x4", &Quaternion::CreateFromMatrix4x4)-> Method("CreateFromAxisAngle", &Quaternion::CreateFromAxisAngle)-> - Method("CreateShortestArc", &Quaternion::CreateShortestArc) + Method("CreateShortestArc", &Quaternion::CreateShortestArc)-> + Method("CreateFromEulerAnglesDegrees", &Quaternion::CreateFromEulerAnglesDegrees) ; } } diff --git a/Code/Framework/AzCore/AzCore/Math/Transform.cpp b/Code/Framework/AzCore/AzCore/Math/Transform.cpp index 77d8658d0f..bb3f764492 100644 --- a/Code/Framework/AzCore/AzCore/Math/Transform.cpp +++ b/Code/Framework/AzCore/AzCore/Math/Transform.cpp @@ -250,6 +250,7 @@ namespace AZ Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::All)-> Attribute(Script::Attributes::Storage, Script::Attributes::StorageType::Value)-> Attribute(Script::Attributes::GenericConstructorOverride, &Internal::TransformDefaultConstructor)-> + Constructor()-> Method("GetBasis", &Transform::GetBasis)-> Method("GetBasisX", &Transform::GetBasisX)-> Method("GetBasisY", &Transform::GetBasisY)-> diff --git a/Code/Framework/AzCore/AzCore/Math/VertexContainer.h b/Code/Framework/AzCore/AzCore/Math/VertexContainer.h index 44479e8880..648c8c80bc 100644 --- a/Code/Framework/AzCore/AzCore/Math/VertexContainer.h +++ b/Code/Framework/AzCore/AzCore/Math/VertexContainer.h @@ -110,4 +110,4 @@ namespace AZ } // namespace AZ -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/AzCore/Math/VertexContainerInterface.h b/Code/Framework/AzCore/AzCore/Math/VertexContainerInterface.h index 6fd0ce78db..dd9952b1f0 100644 --- a/Code/Framework/AzCore/AzCore/Math/VertexContainerInterface.h +++ b/Code/Framework/AzCore/AzCore/Math/VertexContainerInterface.h @@ -172,4 +172,4 @@ namespace AZ template<> inline AZ::Vector3 AdaptVertexOut(const AZ::Vector2& vector) { return Vector2ToVector3(vector); } -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Module/Internal/ModuleManagerSearchPathTool.cpp b/Code/Framework/AzCore/AzCore/Module/Internal/ModuleManagerSearchPathTool.cpp index 21df4c5ac5..55617b8222 100644 --- a/Code/Framework/AzCore/AzCore/Module/Internal/ModuleManagerSearchPathTool.cpp +++ b/Code/Framework/AzCore/AzCore/Module/Internal/ModuleManagerSearchPathTool.cpp @@ -31,4 +31,4 @@ namespace AZ return modulePath; } } // namespace Internal -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Preprocessor/CodeGenBoilerplate.h b/Code/Framework/AzCore/AzCore/Preprocessor/CodeGenBoilerplate.h index 4c0c989aa9..861ac66cec 100644 --- a/Code/Framework/AzCore/AzCore/Preprocessor/CodeGenBoilerplate.h +++ b/Code/Framework/AzCore/AzCore/Preprocessor/CodeGenBoilerplate.h @@ -113,4 +113,4 @@ #define AZCG_Unpack_98(x, ...) AZCG_Unpack_1(x) AZCG_Unpack_97(__VA_ARGS__) #define AZCG_Unpack_99(x, ...) AZCG_Unpack_1(x) AZCG_Unpack_98(__VA_ARGS__) #define AZCG_Unpack(...) AZ_MACRO_SPECIALIZE(AZCG_Unpack_, AZ_VA_NUM_ARGS(__VA_ARGS__), (__VA_ARGS__)) -#define AZCG_Paste(x) x \ No newline at end of file +#define AZCG_Paste(x) x diff --git a/Code/Framework/AzCore/AzCore/RTTI/AzStdReflectionComponent.h b/Code/Framework/AzCore/AzCore/RTTI/AzStdReflectionComponent.h index c17a26c18d..6c4d51e5f2 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/AzStdReflectionComponent.h +++ b/Code/Framework/AzCore/AzCore/RTTI/AzStdReflectionComponent.h @@ -26,4 +26,4 @@ namespace AZ void Activate() override { } void Deactivate() override { } }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextAttributes.inl b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextAttributes.inl index 6557aedfc4..518b1e852c 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextAttributes.inl +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextAttributes.inl @@ -79,4 +79,4 @@ namespace AZ AZ_TYPE_INFO_SPECIALIZE(Script::Attributes::OperatorType, "{26B98C03-7E07-4E3E-9E31-03DA2168E896}"); AZ_TYPE_INFO_SPECIALIZE(Script::Attributes::StorageType, "{57FED71F-B590-4002-9599-A48CB50B0F8E}"); -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorObjectSignals.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorObjectSignals.h index 31cc99815f..98531a46fa 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorObjectSignals.h +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorObjectSignals.h @@ -32,4 +32,4 @@ namespace AZ }; typedef AZ::EBus BehaviorObjectSignals; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.cpp b/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.cpp index e845d7fd9a..4a82a2980f 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.cpp +++ b/Code/Framework/AzCore/AzCore/RTTI/ReflectContext.cpp @@ -138,4 +138,4 @@ namespace AZ m_currentlyProcessingTypeIds.pop_back(); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/RTTI/ReflectionManager.cpp b/Code/Framework/AzCore/AzCore/RTTI/ReflectionManager.cpp index 00be3365ba..78e8e5357e 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/ReflectionManager.cpp +++ b/Code/Framework/AzCore/AzCore/RTTI/ReflectionManager.cpp @@ -208,4 +208,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptProperty.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptProperty.cpp index f128312fdf..e59b17eb90 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptProperty.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptProperty.cpp @@ -1411,4 +1411,4 @@ namespace AZ m_value = entityProperty->m_value; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptPropertyWatcherBus.h b/Code/Framework/AzCore/AzCore/Script/ScriptPropertyWatcherBus.h index 08ffebc879..073169cc00 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptPropertyWatcherBus.h +++ b/Code/Framework/AzCore/AzCore/Script/ScriptPropertyWatcherBus.h @@ -38,4 +38,4 @@ namespace AZ }; typedef AZ::EBus ScriptPropertyWatcherBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptTimePoint.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptTimePoint.cpp index 77a17df1c0..a2e73fbc10 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptTimePoint.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptTimePoint.cpp @@ -47,4 +47,4 @@ namespace AZ } } -#endif // #if !defined(AZCORE_EXCLUDE_LUA) \ No newline at end of file +#endif // #if !defined(AZCORE_EXCLUDE_LUA) diff --git a/Code/Framework/AzCore/AzCore/Serialization/DataPatchUpgradeManager.cpp b/Code/Framework/AzCore/AzCore/Serialization/DataPatchUpgradeManager.cpp index 8fe2388c87..121752b13a 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/DataPatchUpgradeManager.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/DataPatchUpgradeManager.cpp @@ -287,4 +287,4 @@ namespace AZ return nullptr; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl index eac6e5760e..90b9ba5afd 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl +++ b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl @@ -118,6 +118,7 @@ namespace AZ const static AZ::Crc32 StringLineEditingCompleteNotify = AZ_CRC("StringLineEditingCompleteNotify", 0x139e5fa9); const static AZ::Crc32 NameLabelOverride = AZ_CRC("NameLabelOverride", 0x9ff79cab); + const static AZ::Crc32 AssetPickerTitle = AZ_CRC_CE("AssetPickerTitle"); const static AZ::Crc32 ChildNameLabelOverride = AZ_CRC("ChildNameLabelOverride", 0x73dd2909); //! Container attribute that is used to override labels for its elements given the index of the element const static AZ::Crc32 IndexedChildNameLabelOverride = AZ_CRC("IndexedChildNameLabelOverride", 0x5f313ac2); diff --git a/Code/Framework/AzCore/AzCore/Slice/SliceBus.h b/Code/Framework/AzCore/AzCore/Slice/SliceBus.h index 9e6d1c2a64..583567a748 100644 --- a/Code/Framework/AzCore/AzCore/Slice/SliceBus.h +++ b/Code/Framework/AzCore/AzCore/Slice/SliceBus.h @@ -139,4 +139,4 @@ namespace AZ /// @deprecated Use SliceBus. using PrefabBus = SliceBus; -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Slice/SliceSystemComponent.h b/Code/Framework/AzCore/AzCore/Slice/SliceSystemComponent.h index 891593769e..5825a7a4cf 100644 --- a/Code/Framework/AzCore/AzCore/Slice/SliceSystemComponent.h +++ b/Code/Framework/AzCore/AzCore/Slice/SliceSystemComponent.h @@ -39,4 +39,4 @@ namespace AZ SliceAssetHandler m_assetHandler; }; -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/State/HSM.h b/Code/Framework/AzCore/AzCore/State/HSM.h index 8d9b303836..a15bff185c 100644 --- a/Code/Framework/AzCore/AzCore/State/HSM.h +++ b/Code/Framework/AzCore/AzCore/State/HSM.h @@ -125,4 +125,4 @@ namespace AZ bool DummyStateHandler(HSM& /*sm*/, const HSM::Event& /*e*/) { return handleEvent; } } #endif // AZCORE_HIERARCHIAL_STATE_MACHINE_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/bind/bind.h b/Code/Framework/AzCore/AzCore/std/bind/bind.h index 0944e49076..63afa078f3 100644 --- a/Code/Framework/AzCore/AzCore/std/bind/bind.h +++ b/Code/Framework/AzCore/AzCore/std/bind/bind.h @@ -38,4 +38,4 @@ namespace AZStd using std::is_placeholder; template constexpr size_t is_placeholder_v = is_placeholder::value; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/delegate/delegate.h b/Code/Framework/AzCore/AzCore/std/delegate/delegate.h index 4218df8550..d241c489bb 100644 --- a/Code/Framework/AzCore/AzCore/std/delegate/delegate.h +++ b/Code/Framework/AzCore/AzCore/std/delegate/delegate.h @@ -2024,4 +2024,4 @@ namespace AZStd #endif // AZSTD_DELEGATE_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/delegate/delegate_bind.h b/Code/Framework/AzCore/AzCore/std/delegate/delegate_bind.h index 4f12200620..2ad968888d 100644 --- a/Code/Framework/AzCore/AzCore/std/delegate/delegate_bind.h +++ b/Code/Framework/AzCore/AzCore/std/delegate/delegate_bind.h @@ -228,4 +228,4 @@ namespace AZStd } #endif //AZSTD_DELEGATE_BIND_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/delegate/delegate_fwd.h b/Code/Framework/AzCore/AzCore/std/delegate/delegate_fwd.h index 9537638d77..22435acb14 100644 --- a/Code/Framework/AzCore/AzCore/std/delegate/delegate_fwd.h +++ b/Code/Framework/AzCore/AzCore/std/delegate/delegate_fwd.h @@ -23,4 +23,4 @@ namespace AZStd #endif // AZSTD_DELEGATE_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_map.h b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_map.h index 77d3507984..0699632805 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_map.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_map.h @@ -194,4 +194,4 @@ namespace AZStd } #endif // AZSTD_PARALLEL_CONTAINERS_CONCURRENT_FIXED_UNORDERED_MAP_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_set.h b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_set.h index f5fc3bbedf..c7272e8e1e 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_set.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_fixed_unordered_set.h @@ -162,4 +162,4 @@ namespace AZStd } #endif // AZSTD_PARALLEL_CONTAINERS_CONCURRENT_FIXED_UNORDERED_SET_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_map.h b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_map.h index 80c2234202..2b9f53c1c4 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_map.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_map.h @@ -266,4 +266,4 @@ namespace AZStd } #endif // AZSTD_PARALLEL_CONTAINERS_CONCURRENT_UNORDERED_MAP_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_set.h b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_set.h index f21e090167..152c282898 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_set.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_unordered_set.h @@ -228,4 +228,4 @@ namespace AZStd } #endif // AZSTD_PARALLEL_CONTAINERS_CONCURRENT_UNORDERED_SET_H -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_vector.h b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_vector.h index 41b4d40973..6d1039e812 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_vector.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/containers/concurrent_vector.h @@ -159,4 +159,4 @@ namespace AZStd } #endif -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_base.h b/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_base.h index f5c7e161f7..107ddb31b6 100644 --- a/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_base.h +++ b/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_base.h @@ -23,4 +23,4 @@ namespace AZStd */ using intrusive_base = intrusive_refcount; -} // namespace AZStd \ No newline at end of file +} // namespace AZStd diff --git a/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_refcount.h b/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_refcount.h index c78a571af6..cf6e17d1db 100644 --- a/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_refcount.h +++ b/Code/Framework/AzCore/AzCore/std/smart_ptr/intrusive_refcount.h @@ -75,4 +75,4 @@ namespace AZStd Deleter m_deleter; }; -} // namespace AZStd \ No newline at end of file +} // namespace AZStd diff --git a/Code/Framework/AzCore/AzCore/std/string/memorytoascii.h b/Code/Framework/AzCore/AzCore/std/string/memorytoascii.h index 75c9208fc8..061ae50dfd 100644 --- a/Code/Framework/AzCore/AzCore/std/string/memorytoascii.h +++ b/Code/Framework/AzCore/AzCore/std/string/memorytoascii.h @@ -62,4 +62,4 @@ namespace AZStd } } -#endif // AZSTD_MEMORYTOASCII_H \ No newline at end of file +#endif // AZSTD_MEMORYTOASCII_H diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/add_const.h b/Code/Framework/AzCore/AzCore/std/typetraits/add_const.h index a82262be12..a6ca989f09 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/add_const.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/add_const.h @@ -16,4 +16,4 @@ namespace AZStd { using std::add_const; using std::add_const_t; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/add_pointer.h b/Code/Framework/AzCore/AzCore/std/typetraits/add_pointer.h index 1f10f1bbae..7600a44415 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/add_pointer.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/add_pointer.h @@ -17,4 +17,4 @@ namespace AZStd using std::add_pointer; template using add_pointer_t = std::add_pointer_t; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/internal/is_template_copy_constructible.h b/Code/Framework/AzCore/AzCore/std/typetraits/internal/is_template_copy_constructible.h index bd8ca16ea9..ea4c7873a8 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/internal/is_template_copy_constructible.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/internal/is_template_copy_constructible.h @@ -129,4 +129,4 @@ namespace AZStd { }; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/internal/type_sequence_traits.h b/Code/Framework/AzCore/AzCore/std/typetraits/internal/type_sequence_traits.h index 16ea78b40f..d7a5a2fa50 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/internal/type_sequence_traits.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/internal/type_sequence_traits.h @@ -41,4 +41,4 @@ namespace AZStd template using pack_traits_get_arg_t = typename pack_traits_get_arg>::type; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/is_member_object_pointer.h b/Code/Framework/AzCore/AzCore/std/typetraits/is_member_object_pointer.h index ec7c7b5f4d..8c0a0c10c3 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/is_member_object_pointer.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/is_member_object_pointer.h @@ -17,4 +17,4 @@ namespace AZStd { using std::is_member_object_pointer; using std::is_member_object_pointer_v; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/remove_pointer.h b/Code/Framework/AzCore/AzCore/std/typetraits/remove_pointer.h index ca0ae141f3..77e5d003c3 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/remove_pointer.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/remove_pointer.h @@ -17,4 +17,4 @@ namespace AZStd using std::remove_pointer; template using remove_pointer_t = std::remove_pointer_t; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/AzCore/std/typetraits/void_t.h b/Code/Framework/AzCore/AzCore/std/typetraits/void_t.h index 9111dc4827..dc6a1b4328 100644 --- a/Code/Framework/AzCore/AzCore/std/typetraits/void_t.h +++ b/Code/Framework/AzCore/AzCore/std/typetraits/void_t.h @@ -19,4 +19,4 @@ namespace AZStd // It can be used to detect ill-formed which are not mappable to void template struct make_void { using type = void; }; template using void_t = typename make_void::type; -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/CMakeLists.txt b/Code/Framework/AzCore/CMakeLists.txt index c77205a760..db2c79f0c9 100644 --- a/Code/Framework/AzCore/CMakeLists.txt +++ b/Code/Framework/AzCore/CMakeLists.txt @@ -40,14 +40,13 @@ ly_add_target( ${common_dir} ${AZ_CORE_RADTELEMETRY_INCLUDE_DIRECTORIES} BUILD_DEPENDENCIES - PRIVATE - 3rdParty::zlib - 3rdParty::zstd - 3rdParty::cityhash PUBLIC 3rdParty::Lua 3rdParty::RapidJSON 3rdParty::RapidXML + 3rdParty::zlib + 3rdParty::zstd + 3rdParty::cityhash ${AZ_CORE_RADTELEMETRY_BUILD_DEPENDENCIES} ) ly_add_source_properties( diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/AzCore_Traits_Platform.h b/Code/Framework/AzCore/Platform/Android/AzCore/AzCore_Traits_Platform.h index 7d6cc159ff..37f0fce5fa 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/AzCore_Traits_Platform.h +++ b/Code/Framework/AzCore/Platform/Android/AzCore/AzCore_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/Memory/HeapSchema_Android.cpp b/Code/Framework/AzCore/Platform/Android/AzCore/Memory/HeapSchema_Android.cpp index 56120ac167..4df29a63f8 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/Memory/HeapSchema_Android.cpp +++ b/Code/Framework/AzCore/Platform/Android/AzCore/Memory/HeapSchema_Android.cpp @@ -21,4 +21,4 @@ namespace AZ return 0; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_Platform.h b/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_Platform.h index 6e43071185..63ffbacf77 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_Platform.h +++ b/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_fwd_Platform.h b/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_fwd_Platform.h index ffaf029de9..09bfe2e28a 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_fwd_Platform.h +++ b/Code/Framework/AzCore/Platform/Android/AzCore/Socket/AzSocket_fwd_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/base_Android.h b/Code/Framework/AzCore/Platform/Android/AzCore/base_Android.h index 26aa4e416e..7d9a58a823 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/base_Android.h +++ b/Code/Framework/AzCore/Platform/Android/AzCore/base_Android.h @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/Platform/Android/platform_android_files.cmake b/Code/Framework/AzCore/Platform/Android/platform_android_files.cmake index fcb78b4cf1..8a68fd51f9 100644 --- a/Code/Framework/AzCore/Platform/Android/platform_android_files.cmake +++ b/Code/Framework/AzCore/Platform/Android/platform_android_files.cmake @@ -91,4 +91,4 @@ if (LY_TEST_PROJECT) PROPERTY COMPILE_DEFINITIONS VALUES LY_NO_ASSETS ) -endif() \ No newline at end of file +endif() diff --git a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/IO/SystemFile_Apple.cpp b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/IO/SystemFile_Apple.cpp index 3ccd516667..ac921cc8ca 100644 --- a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/IO/SystemFile_Apple.cpp +++ b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/IO/SystemFile_Apple.cpp @@ -65,4 +65,4 @@ namespace AZ::IO::Platform } } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Memory/OSAllocator_Apple.h b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Memory/OSAllocator_Apple.h index deec108a0a..4a40cd2d9f 100644 --- a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Memory/OSAllocator_Apple.h +++ b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Memory/OSAllocator_Apple.h @@ -21,4 +21,4 @@ inline void* memalign(size_t blocksize, size_t bytes) } # define AZ_OS_MALLOC(byteSize, alignment) memalign(alignment, byteSize) -# define AZ_OS_FREE(pointer) ::free(pointer) \ No newline at end of file +# define AZ_OS_FREE(pointer) ::free(pointer) diff --git a/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerContext_Default.cpp b/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerContext_Default.cpp index bdc7f7adb7..166e0d7122 100644 --- a/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerContext_Default.cpp +++ b/Code/Framework/AzCore/Platform/Common/Default/AzCore/IO/Streamer/StreamerContext_Default.cpp @@ -34,4 +34,4 @@ namespace AZ::Platform m_threadSleepCondition.notify_one(); } -} // namespace AZ::Platform \ No newline at end of file +} // namespace AZ::Platform diff --git a/Code/Framework/AzCore/Platform/Common/Default/AzCore/Module/Internal/ModuleManagerSearchPathTool_Default.cpp b/Code/Framework/AzCore/Platform/Common/Default/AzCore/Module/Internal/ModuleManagerSearchPathTool_Default.cpp index 95b66c887b..62d35b0d84 100644 --- a/Code/Framework/AzCore/Platform/Common/Default/AzCore/Module/Internal/ModuleManagerSearchPathTool_Default.cpp +++ b/Code/Framework/AzCore/Platform/Common/Default/AzCore/Module/Internal/ModuleManagerSearchPathTool_Default.cpp @@ -28,4 +28,4 @@ namespace AZ { } } // namespace Internal -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/Platform/Common/MSVC/AzCore/std/string/fixed_string_MSVC.inl b/Code/Framework/AzCore/Platform/Common/MSVC/AzCore/std/string/fixed_string_MSVC.inl index 746f37c89b..71d20ea495 100644 --- a/Code/Framework/AzCore/Platform/Common/MSVC/AzCore/std/string/fixed_string_MSVC.inl +++ b/Code/Framework/AzCore/Platform/Common/MSVC/AzCore/std/string/fixed_string_MSVC.inl @@ -27,4 +27,4 @@ namespace AZStd return result; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Common/RadTelemetry/ProfileTelemetryBus.h b/Code/Framework/AzCore/Platform/Common/RadTelemetry/ProfileTelemetryBus.h index 77f10d3778..20d815912e 100644 --- a/Code/Framework/AzCore/Platform/Common/RadTelemetry/ProfileTelemetryBus.h +++ b/Code/Framework/AzCore/Platform/Common/RadTelemetry/ProfileTelemetryBus.h @@ -50,4 +50,4 @@ namespace RADTelemetry using ProfileTelemetryRequestBus = AZ::EBus; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.cpp index 24b71036d9..25a2b99d89 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.cpp +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.cpp @@ -90,4 +90,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.h b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.h index 31cd478b94..33c7d6f891 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.h +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/IO/Internal/SystemFileUtils_UnixLike.h @@ -26,4 +26,4 @@ namespace AZ bool FormatAndPeelOffWildCardExtension(const char* sourcePath, char* filePath, size_t filePathSize, char* extensionPath, size_t extensionSize, bool keepWildcard = false); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Memory/OSAllocator_UnixLike.h b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Memory/OSAllocator_UnixLike.h index 5401fb4d40..8ab8ff00d5 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Memory/OSAllocator_UnixLike.h +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Memory/OSAllocator_UnixLike.h @@ -14,4 +14,4 @@ #include # define AZ_OS_MALLOC(byteSize, alignment) ::memalign(alignment, byteSize) -# define AZ_OS_FREE(pointer) ::free(pointer) \ No newline at end of file +# define AZ_OS_FREE(pointer) ::free(pointer) diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h index be2414b180..9a3386a43c 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h @@ -12,4 +12,4 @@ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h index e8f0fc0f7e..533e925224 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h @@ -12,4 +12,4 @@ #pragma once struct sockaddr; -struct sockaddr_in; \ No newline at end of file +struct sockaddr_in; diff --git a/Code/Framework/AzCore/Platform/Common/azcore_profile_telemetry_files.cmake b/Code/Framework/AzCore/Platform/Common/azcore_profile_telemetry_files.cmake index 7f180524b5..00f242db1c 100644 --- a/Code/Framework/AzCore/Platform/Common/azcore_profile_telemetry_files.cmake +++ b/Code/Framework/AzCore/Platform/Common/azcore_profile_telemetry_files.cmake @@ -12,4 +12,4 @@ set(FILES RadTelemetry/ProfileTelemetry.h RadTelemetry/ProfileTelemetryBus.h -) \ No newline at end of file +) diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/AzCore_Traits_Platform.h b/Code/Framework/AzCore/Platform/Linux/AzCore/AzCore_Traits_Platform.h index cc5b02b600..5483e43caa 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/AzCore_Traits_Platform.h +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/AzCore_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/IO/SystemFile_Linux.cpp b/Code/Framework/AzCore/Platform/Linux/AzCore/IO/SystemFile_Linux.cpp index 3ccd516667..ac921cc8ca 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/IO/SystemFile_Linux.cpp +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/IO/SystemFile_Linux.cpp @@ -65,4 +65,4 @@ namespace AZ::IO::Platform } } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/Memory/HeapSchema_Linux.cpp b/Code/Framework/AzCore/Platform/Linux/AzCore/Memory/HeapSchema_Linux.cpp index 56120ac167..4df29a63f8 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/Memory/HeapSchema_Linux.cpp +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/Memory/HeapSchema_Linux.cpp @@ -21,4 +21,4 @@ namespace AZ return 0; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/Module/Internal/ModuleManagerSearchPathTool_Linux.cpp b/Code/Framework/AzCore/Platform/Linux/AzCore/Module/Internal/ModuleManagerSearchPathTool_Linux.cpp index 95b66c887b..62d35b0d84 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/Module/Internal/ModuleManagerSearchPathTool_Linux.cpp +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/Module/Internal/ModuleManagerSearchPathTool_Linux.cpp @@ -28,4 +28,4 @@ namespace AZ { } } // namespace Internal -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_Platform.h b/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_Platform.h index 6e43071185..63ffbacf77 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_Platform.h +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_fwd_Platform.h b/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_fwd_Platform.h index ffaf029de9..09bfe2e28a 100644 --- a/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_fwd_Platform.h +++ b/Code/Framework/AzCore/Platform/Linux/AzCore/Socket/AzSocket_fwd_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/AzCore_Traits_Platform.h b/Code/Framework/AzCore/Platform/Mac/AzCore/AzCore_Traits_Platform.h index f45704f966..d1e5952a42 100644 --- a/Code/Framework/AzCore/Platform/Mac/AzCore/AzCore_Traits_Platform.h +++ b/Code/Framework/AzCore/Platform/Mac/AzCore/AzCore_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/Memory/HeapSchema_Mac.cpp b/Code/Framework/AzCore/Platform/Mac/AzCore/Memory/HeapSchema_Mac.cpp index 56120ac167..4df29a63f8 100644 --- a/Code/Framework/AzCore/Platform/Mac/AzCore/Memory/HeapSchema_Mac.cpp +++ b/Code/Framework/AzCore/Platform/Mac/AzCore/Memory/HeapSchema_Mac.cpp @@ -21,4 +21,4 @@ namespace AZ return 0; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_Platform.h b/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_Platform.h index 6e43071185..63ffbacf77 100644 --- a/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_Platform.h +++ b/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_fwd_Platform.h b/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_fwd_Platform.h index 56c0658270..66b21b77b7 100644 --- a/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_fwd_Platform.h +++ b/Code/Framework/AzCore/Platform/Mac/AzCore/Socket/AzSocket_fwd_Platform.h @@ -15,4 +15,4 @@ #define MSG_NOSIGNAL 0 #endif -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/Mac/platform_mac.cmake b/Code/Framework/AzCore/Platform/Mac/platform_mac.cmake index 0c5f15a9b8..4b2981c3cb 100644 --- a/Code/Framework/AzCore/Platform/Mac/platform_mac.cmake +++ b/Code/Framework/AzCore/Platform/Mac/platform_mac.cmake @@ -16,4 +16,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE ${APPKIT_LIBRARY} ${FOUNDATION_LIBRARY} -) \ No newline at end of file +) diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/AzCore_Traits_Platform.h b/Code/Framework/AzCore/Platform/Windows/AzCore/AzCore_Traits_Platform.h index e190bae61f..e721dcdcb9 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/AzCore_Traits_Platform.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/AzCore_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/Memory/HeapSchema_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/Memory/HeapSchema_Windows.cpp index 55e9db6458..943b9ad400 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/Memory/HeapSchema_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/Memory/HeapSchema_Windows.cpp @@ -23,4 +23,4 @@ namespace AZ return (char*)si.lpMaximumApplicationAddress - (char*)si.lpMinimumApplicationAddress; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_Platform.h b/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_Platform.h index 329da4ed52..9b429a7ce0 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_Platform.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_Platform.h @@ -12,4 +12,4 @@ */ #pragma once -#include "../../../Common/WinAPI/AzCore/Socket/AzSocket_WinAPI.h" \ No newline at end of file +#include "../../../Common/WinAPI/AzCore/Socket/AzSocket_WinAPI.h" diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_fwd_Platform.h b/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_fwd_Platform.h index c668f688f1..bc5b82e5fd 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_fwd_Platform.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/Socket/AzSocket_fwd_Platform.h @@ -12,4 +12,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/base_Windows.h b/Code/Framework/AzCore/Platform/Windows/AzCore/base_Windows.h index 26aa4e416e..7d9a58a823 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/base_Windows.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/base_Windows.h @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/AzCore_Traits_Platform.h b/Code/Framework/AzCore/Platform/iOS/AzCore/AzCore_Traits_Platform.h index 4ba343f67b..187bdd34b4 100644 --- a/Code/Framework/AzCore/Platform/iOS/AzCore/AzCore_Traits_Platform.h +++ b/Code/Framework/AzCore/Platform/iOS/AzCore/AzCore_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/Memory/HeapSchema_iOS.cpp b/Code/Framework/AzCore/Platform/iOS/AzCore/Memory/HeapSchema_iOS.cpp index 56120ac167..4df29a63f8 100644 --- a/Code/Framework/AzCore/Platform/iOS/AzCore/Memory/HeapSchema_iOS.cpp +++ b/Code/Framework/AzCore/Platform/iOS/AzCore/Memory/HeapSchema_iOS.cpp @@ -21,4 +21,4 @@ namespace AZ return 0; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_Platform.h b/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_Platform.h index 6e43071185..63ffbacf77 100644 --- a/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_Platform.h +++ b/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_fwd_Platform.h b/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_fwd_Platform.h index 56c0658270..66b21b77b7 100644 --- a/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_fwd_Platform.h +++ b/Code/Framework/AzCore/Platform/iOS/AzCore/Socket/AzSocket_fwd_Platform.h @@ -15,4 +15,4 @@ #define MSG_NOSIGNAL 0 #endif -#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" \ No newline at end of file +#include "../../../Common/UnixLike/AzCore/Socket/AzSocket_fwd_UnixLike.h" diff --git a/Code/Framework/AzCore/Platform/iOS/platform_ios.cmake b/Code/Framework/AzCore/Platform/iOS/platform_ios.cmake index 6b91449bda..e1d918d000 100644 --- a/Code/Framework/AzCore/Platform/iOS/platform_ios.cmake +++ b/Code/Framework/AzCore/Platform/iOS/platform_ios.cmake @@ -25,4 +25,4 @@ endif() set(LY_BUILD_DEPENDENCIES PRIVATE ${__azcore_dependencies} -) \ No newline at end of file +) diff --git a/Code/Framework/AzCore/Tests/Asset/AssetCommon.cpp b/Code/Framework/AzCore/Tests/Asset/AssetCommon.cpp index d0e34487ea..c829821ca6 100644 --- a/Code/Framework/AzCore/Tests/Asset/AssetCommon.cpp +++ b/Code/Framework/AzCore/Tests/Asset/AssetCommon.cpp @@ -186,7 +186,8 @@ namespace UnitTest int GetWeakUseCount() { return m_weakUseCount.load(); } }; - TEST_F(WeakAssetTest, WeakAsset_ConstructionAndDestruction_UpdatesAssetDataWeakRefCount) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable + TEST_F(WeakAssetTest, DISABLED_WeakAsset_ConstructionAndDestruction_UpdatesAssetDataWeakRefCount) { TestAssetData testData; EXPECT_EQ(testData.GetWeakUseCount(), 0); @@ -202,7 +203,8 @@ namespace UnitTest EXPECT_EQ(testData.GetWeakUseCount(), 0); } - TEST_F(WeakAssetTest, WeakAsset_MoveOperatorWithDifferentData_UpdatesOldAssetDataWeakRefCount) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable + TEST_F(WeakAssetTest, DISABLED_WeakAsset_MoveOperatorWithDifferentData_UpdatesOldAssetDataWeakRefCount) { TestAssetData testData; EXPECT_EQ(testData.GetWeakUseCount(), 0); @@ -217,7 +219,8 @@ namespace UnitTest AZ_TEST_STOP_TRACE_SUPPRESSION(1); } - TEST_F(WeakAssetTest, WeakAsset_MoveOperatorWithSameData_PreservesAssetDataWeakRefCount) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable + TEST_F(WeakAssetTest, DISABLED_WeakAsset_MoveOperatorWithSameData_PreservesAssetDataWeakRefCount) { TestAssetData testData; EXPECT_EQ(testData.GetWeakUseCount(), 0); @@ -234,7 +237,8 @@ namespace UnitTest AZ_TEST_STOP_TRACE_SUPPRESSION(1); } - TEST_F(WeakAssetTest, WeakAsset_AssignmentOperator_CopiesDataAndIncrementsWeakRefCount) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable + TEST_F(WeakAssetTest, DISABLED_WeakAsset_AssignmentOperator_CopiesDataAndIncrementsWeakRefCount) { TestAssetData testData; EXPECT_EQ(testData.GetWeakUseCount(), 0); diff --git a/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp b/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp index 18e193304a..78e2288a4c 100644 --- a/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp +++ b/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp @@ -575,6 +575,91 @@ namespace UnitTest EXPECT_EQ(baseStatus, expected_base_status); } + struct DebugListener : AZ::Interface::Registrar + { + void AssetStatusUpdate(AZ::Data::AssetId id, AZ::Data::AssetData::AssetStatus status) override + { + AZ::Debug::Trace::Output( + "", AZStd::string::format("Status %s - %d\n", id.ToString().c_str(), static_cast(status)).c_str()); + } + void ReleaseAsset(AZ::Data::AssetId id) override + { + AZ::Debug::Trace::Output( + "", AZStd::string::format("Release %s\n", id.ToString().c_str()).c_str()); + } + }; + + TEST_F(AssetJobsFloodTest, RapidAcquireAndRelease) + { + DebugListener listener; + auto assetUuids = { + MyAsset1Id, + MyAsset2Id, + MyAsset3Id, + }; + + AZStd::vector threads; + AZStd::mutex mutex; + AZStd::atomic threadCount(static_cast(assetUuids.size())); + AZStd::condition_variable cv; + AZStd::atomic_bool keepDispatching(true); + + auto dispatch = [&keepDispatching]() { + while (keepDispatching) + { + AssetManager::Instance().DispatchEvents(); + } + }; + + AZStd::thread dispatchThread(dispatch); + + for (const auto& assetUuid : assetUuids) + { + threads.emplace_back([this, &threadCount, &cv, assetUuid]() { + bool checkLoaded = true; + + for (int i = 0; i < 5000; i++) + { + Asset asset1 = + m_testAssetManager->GetAsset(assetUuid, azrtti_typeid(), AZ::Data::AssetLoadBehavior::PreLoad); + + if (checkLoaded) + { + asset1.BlockUntilLoadComplete(); + + EXPECT_TRUE(asset1.IsReady()) << "Iteration " << i << " failed. Asset status: " << static_cast(asset1.GetStatus()); + } + + checkLoaded = !checkLoaded; + } + + --threadCount; + cv.notify_one(); + }); + } + + bool timedOut = false; + + // Used to detect a deadlock. If we wait for more than 5 seconds, it's likely a deadlock has occurred + while (threadCount > 0 && !timedOut) + { + AZStd::unique_lock lock(mutex); + timedOut = (AZStd::cv_status::timeout == cv.wait_until(lock, AZStd::chrono::system_clock::now() + DefaultTimeoutSeconds * 20000)); + } + + ASSERT_EQ(threadCount, 0) << "Thread count is non-zero, a thread has likely deadlocked. Test will not shut down cleanly."; + + for (auto& thread : threads) + { + thread.join(); + } + + keepDispatching = false; + dispatchThread.join(); + + AssetManager::Destroy(); + } + #if AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS TEST_F(AssetJobsFloodTest, DISABLED_AssetLoadBehaviorIsPreserved) #else @@ -2592,7 +2677,8 @@ namespace UnitTest #if AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS TEST_F(AssetManagerCancelTests, DISABLED_CancelLoad_NoReferences_LoadCancels) #else - TEST_F(AssetManagerCancelTests, CancelLoad_NoReferences_LoadCancels) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable. LYN-3263 + TEST_F(AssetManagerCancelTests, DISABLED_CancelLoad_NoReferences_LoadCancels) #endif // AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS { m_assetHandlerAndCatalog->SetArtificialDelayMilliseconds(0, 100); @@ -2632,7 +2718,8 @@ namespace UnitTest #if AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS TEST_F(AssetManagerCancelTests, DISABLED_CanceledLoad_CanBeLoadedAgainLater) #else - TEST_F(AssetManagerCancelTests, CanceledLoad_CanBeLoadedAgainLater) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable. LYN-3263 + TEST_F(AssetManagerCancelTests, DISABLED_CanceledLoad_CanBeLoadedAgainLater) #endif // AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS { m_assetHandlerAndCatalog->SetArtificialDelayMilliseconds(0, 50); @@ -2681,7 +2768,8 @@ namespace UnitTest #if AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS TEST_F(AssetManagerCancelTests, DISABLED_CancelLoad_InProgressLoad_Continues) #else - TEST_F(AssetManagerCancelTests, CancelLoad_InProgressLoad_Continues) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable. LYN-3263 + TEST_F(AssetManagerCancelTests, DISABLED_CancelLoad_InProgressLoad_Continues) #endif // AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS { m_assetHandlerAndCatalog->SetArtificialDelayMilliseconds(0, 100); @@ -2903,8 +2991,9 @@ namespace UnitTest TEST_F(AssetManagerClearAssetReferenceTests, DISABLED_ContainerLoadTest_AssetLosesAndGainsReferencesDuringLoadAndSuspendedRelease_AssetSuccessfullyFinishesLoading) #else + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable. LYN-3263 TEST_F(AssetManagerClearAssetReferenceTests, - ContainerLoadTest_AssetLosesAndGainsReferencesDuringLoadAndSuspendedRelease_AssetSuccessfullyFinishesLoading) + DISABLED_ContainerLoadTest_AssetLosesAndGainsReferencesDuringLoadAndSuspendedRelease_AssetSuccessfullyFinishesLoading) #endif // AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS { // Start the load and wait for the dependent asset to hit the loading state. @@ -2961,7 +3050,8 @@ namespace UnitTest #if AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS TEST_F(AssetManagerClearAssetReferenceTests, DISABLED_ContainerLoadTest_RootAssetDestroyedWhileContainerLoading_ContainerFinishesLoad) #else - TEST_F(AssetManagerClearAssetReferenceTests, ContainerLoadTest_RootAssetDestroyedWhileContainerLoading_ContainerFinishesLoad) + // Asset cancellation is temporarily disabled, re-enable this test when cancellation is more stable. LYN-3263 + TEST_F(AssetManagerClearAssetReferenceTests, DISABLED_ContainerLoadTest_RootAssetDestroyedWhileContainerLoading_ContainerFinishesLoad) #endif // AZ_TRAIT_DISABLE_FAILED_ASSET_MANAGER_TESTS { OnAssetReadyListener assetStatus1(DependentPreloadAssetId, azrtti_typeid()); diff --git a/Code/Framework/AzCore/Tests/Debug/AssetTracking.cpp b/Code/Framework/AzCore/Tests/Debug/AssetTracking.cpp index a4a152a4f6..92d02a2706 100644 --- a/Code/Framework/AzCore/Tests/Debug/AssetTracking.cpp +++ b/Code/Framework/AzCore/Tests/Debug/AssetTracking.cpp @@ -105,7 +105,7 @@ namespace UnitTest EXPECT_EQ(&rootAsset, &m_env->m_tree.GetRoot()); ASSERT_NE(itr, rootAsset.m_children.end()); - EXPECT_EQ(itr->second.m_masterInfo->m_id->m_id, "TestScopedAllocation.1"); + EXPECT_EQ(itr->second.m_primaryinfo->m_id->m_id, "TestScopedAllocation.1"); EXPECT_EQ(&itr->second, m_env->m_table.FindAllocation(TEST_POINTER)); diff --git a/Code/Framework/AzCore/Tests/EntityIdTests.cpp b/Code/Framework/AzCore/Tests/EntityIdTests.cpp index 8b5a15bba8..44b67c8007 100644 --- a/Code/Framework/AzCore/Tests/EntityIdTests.cpp +++ b/Code/Framework/AzCore/Tests/EntityIdTests.cpp @@ -139,4 +139,4 @@ TEST_F(EntityIdTests, Constructor_Default_IsInvalidEntityId) AZ::EntityId entityId; AZ::EntityId invalidId(AZ::EntityId::InvalidEntityId); EXPECT_EQ((AZ::u64)entityId, (AZ::u64)invalidId); -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Tests/Interface.cpp b/Code/Framework/AzCore/Tests/Interface.cpp index 2370d89645..5ee1bf5064 100644 --- a/Code/Framework/AzCore/Tests/Interface.cpp +++ b/Code/Framework/AzCore/Tests/Interface.cpp @@ -172,4 +172,4 @@ namespace UnitTest testSystem1.Deactivate(); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzCore/Tests/Math/AabbTests.cpp b/Code/Framework/AzCore/Tests/Math/AabbTests.cpp index 20a4d2ed85..44cc800616 100644 --- a/Code/Framework/AzCore/Tests/Math/AabbTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/AabbTests.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace AZ; @@ -385,4 +386,77 @@ namespace UnitTest EXPECT_TRUE(aabb.GetMin().IsClose(transAabb.GetMin())); EXPECT_TRUE(aabb.GetMax().IsClose(transAabb.GetMax())); } + + TEST(MATH_AabbTransform, GetTransformedObbMatrix3x4) + { + Vector3 min(-1.0f, -2.0f, -3.0f); + Vector3 max(4.0f, 3.0f, 2.0f); + Aabb aabb = Aabb::CreateFromMinMax(min, max); + + Quaternion rotation(0.46f, 0.26f, 0.58f, 0.62f); + Vector3 translation(5.0f, 7.0f, 9.0f); + + Matrix3x4 matrix3x4 = Matrix3x4::CreateFromQuaternionAndTranslation(rotation, translation); + + matrix3x4.MultiplyByScale(Vector3(0.5f, 1.5f, 2.0f)); + + Obb obb = aabb.GetTransformedObb(matrix3x4); + + EXPECT_THAT(obb.GetRotation(), IsClose(rotation)); + EXPECT_THAT(obb.GetHalfLengths(), IsClose(Vector3(1.25f, 3.75f, 5.0f))); + EXPECT_THAT(obb.GetPosition(), IsClose(Vector3(3.928f, 7.9156f, 9.3708f))); + } + + TEST(MATH_AabbTransform, GetTransformedAabbMatrix3x4) + { + Vector3 min(2.0f, 3.0f, 5.0f); + Vector3 max(6.0f, 5.0f, 11.0f); + Aabb aabb = Aabb::CreateFromMinMax(min, max); + + Quaternion rotation(0.34f, 0.46f, 0.58f, 0.58f); + Vector3 translation(-3.0f, -4.0f, -5.0f); + + Matrix3x4 matrix3x4 = Matrix3x4::CreateFromQuaternionAndTranslation(rotation, translation); + + matrix3x4.MultiplyByScale(Vector3(1.2f, 0.8f, 2.0f)); + + Aabb transformedAabb = aabb.GetTransformedAabb(matrix3x4); + + EXPECT_THAT(transformedAabb.GetMin(), IsClose(Vector3(4.1488f, -0.01216f, -0.31904f))); + EXPECT_THAT(transformedAabb.GetMax(), IsClose(Vector3(16.3216f, 6.54272f, 5.98112f))); + } + + TEST(MATH_AabbTransform, GetTransformedObbFitsInsideTransformedAabb) + { + Vector3 min(4.0f, 3.0f, 1.0f); + Vector3 max(7.0f, 6.0f, 8.0f); + Aabb aabb = Aabb::CreateFromMinMax(min, max); + + Quaternion rotation(0.40f, 0.40f, 0.64f, 0.52f); + Vector3 translation(-2.0f, 4.0f, -3.0f); + + Matrix3x4 matrix3x4 = Matrix3x4::CreateFromQuaternionAndTranslation(rotation, translation); + + matrix3x4.MultiplyByScale(Vector3(2.2f, 0.6f, 1.4f)); + + Aabb transformedAabb = aabb.GetTransformedAabb(matrix3x4); + Obb transformedObb = aabb.GetTransformedObb(matrix3x4); + Aabb aabbContainingTransformedObb = Aabb::CreateFromObb(transformedObb); + + EXPECT_THAT(transformedAabb.GetMin(), IsClose(aabbContainingTransformedObb.GetMin())); + EXPECT_THAT(transformedAabb.GetMax(), IsClose(aabbContainingTransformedObb.GetMax())); + } + + TEST(MATH_AabbTransform, MultiplyByScale) + { + Vector3 min(2.0f, 6.0f, 8.0f); + Vector3 max(6.0f, 9.0f, 10.0f); + Aabb aabb = Aabb::CreateFromMinMax(min, max); + + Vector3 scale(0.5f, 2.0f, 1.5f); + aabb.MultiplyByScale(scale); + + EXPECT_THAT(aabb.GetMin(), IsClose(Vector3(1.0f, 12.0f, 12.0f))); + EXPECT_THAT(aabb.GetMax(), IsClose(Vector3(3.0f, 18.0f, 15.0f))); + } } diff --git a/Code/Framework/AzCore/Tests/ModuleTestBus.h b/Code/Framework/AzCore/Tests/ModuleTestBus.h index cac72caae2..e4623a61fc 100644 --- a/Code/Framework/AzCore/Tests/ModuleTestBus.h +++ b/Code/Framework/AzCore/Tests/ModuleTestBus.h @@ -24,4 +24,4 @@ public: virtual const char* GetModuleName() = 0; }; -using ModuleTestRequestBus = AZ::EBus; \ No newline at end of file +using ModuleTestRequestBus = AZ::EBus; diff --git a/Code/Framework/AzCore/Tests/ScriptProperty.cpp b/Code/Framework/AzCore/Tests/ScriptProperty.cpp index 877680fee2..f09ae980b5 100644 --- a/Code/Framework/AzCore/Tests/ScriptProperty.cpp +++ b/Code/Framework/AzCore/Tests/ScriptProperty.cpp @@ -386,4 +386,4 @@ namespace UnitTest } } } -#endif // #if !defined(AZCORE_EXCLUDE_LUA) \ No newline at end of file +#endif // #if !defined(AZCORE_EXCLUDE_LUA) diff --git a/Code/Framework/AzFramework/AzFramework/CommandLine/CommandRegistrationBus.h b/Code/Framework/AzFramework/AzFramework/CommandLine/CommandRegistrationBus.h index fdb156c6b3..628a68146f 100644 --- a/Code/Framework/AzFramework/AzFramework/CommandLine/CommandRegistrationBus.h +++ b/Code/Framework/AzFramework/AzFramework/CommandLine/CommandRegistrationBus.h @@ -65,4 +65,4 @@ namespace AzFramework using CommandRegistrationBus = AZ::EBus; -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Components/AzFrameworkConfigurationSystemComponent.h b/Code/Framework/AzFramework/AzFramework/Components/AzFrameworkConfigurationSystemComponent.h index ce96e5139c..20575aeb83 100644 --- a/Code/Framework/AzFramework/AzFramework/Components/AzFrameworkConfigurationSystemComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Components/AzFrameworkConfigurationSystemComponent.h @@ -37,4 +37,4 @@ namespace AzFramework static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); }; -} // AzFramework \ No newline at end of file +} // AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Components/ConsoleBus.h b/Code/Framework/AzFramework/AzFramework/Components/ConsoleBus.h index 89337458cd..2e00067bc4 100644 --- a/Code/Framework/AzFramework/AzFramework/Components/ConsoleBus.h +++ b/Code/Framework/AzFramework/AzFramework/Components/ConsoleBus.h @@ -69,4 +69,4 @@ namespace AzFramework } // namespace AzFramework -#endif // AZFRAMEWORK_CONSOLE_BUS_H \ No newline at end of file +#endif // AZFRAMEWORK_CONSOLE_BUS_H diff --git a/Code/Framework/AzFramework/AzFramework/Debug/DebugCameraBus.h b/Code/Framework/AzFramework/AzFramework/Debug/DebugCameraBus.h index bff782edc5..c264a8d6ca 100644 --- a/Code/Framework/AzFramework/AzFramework/Debug/DebugCameraBus.h +++ b/Code/Framework/AzFramework/AzFramework/Debug/DebugCameraBus.h @@ -69,4 +69,4 @@ namespace AzFramework virtual void DebugCameraMoved(const AZ::Transform& world) {} }; using DebugCameraEventsBus = AZ::EBus; -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Entity/BehaviorEntity.h b/Code/Framework/AzFramework/AzFramework/Entity/BehaviorEntity.h index 4090e3970e..464a7a80bb 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/BehaviorEntity.h +++ b/Code/Framework/AzFramework/AzFramework/Entity/BehaviorEntity.h @@ -240,4 +240,4 @@ namespace AzFramework AZ::EntityId m_entityId; }; -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp index 5f86afac01..fb08802493 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp @@ -296,4 +296,4 @@ namespace AZ return static_cast(bytesWritten); } } // namespace IO -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.h b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.h index f64286336a..1696fa8974 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.h +++ b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.h @@ -41,4 +41,4 @@ namespace AZ } } -#endif // #ifndef CRYCOMMON_FILEOPERATIONS_H \ No newline at end of file +#endif // #ifndef CRYCOMMON_FILEOPERATIONS_H diff --git a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp index c8fcdd653d..45ddc2a841 100644 --- a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp @@ -253,4 +253,4 @@ namespace AzFramework { return m_rolloverLength; } -}; \ No newline at end of file +}; diff --git a/Code/Framework/AzFramework/AzFramework/Network/DynamicSerializableFieldMarshaler.h b/Code/Framework/AzFramework/AzFramework/Network/DynamicSerializableFieldMarshaler.h index 66f5900016..3e69454f59 100644 --- a/Code/Framework/AzFramework/AzFramework/Network/DynamicSerializableFieldMarshaler.h +++ b/Code/Framework/AzFramework/AzFramework/Network/DynamicSerializableFieldMarshaler.h @@ -143,4 +143,4 @@ namespace GridMate }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzFramework/AzFramework/Network/EntityIdMarshaler.h b/Code/Framework/AzFramework/AzFramework/Network/EntityIdMarshaler.h index 6c1deb2203..0116020cc0 100644 --- a/Code/Framework/AzFramework/AzFramework/Network/EntityIdMarshaler.h +++ b/Code/Framework/AzFramework/AzFramework/Network/EntityIdMarshaler.h @@ -73,4 +73,4 @@ namespace GridMate }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzFramework/AzFramework/Network/NetSystemBus.h b/Code/Framework/AzFramework/AzFramework/Network/NetSystemBus.h index d7fc0086e5..788eacf8b5 100644 --- a/Code/Framework/AzFramework/AzFramework/Network/NetSystemBus.h +++ b/Code/Framework/AzFramework/AzFramework/Network/NetSystemBus.h @@ -35,4 +35,4 @@ namespace AzFramework }; using NetSystemRequestBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.cpp index ed8681f463..8ae8493bb2 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.cpp @@ -32,4 +32,4 @@ namespace Physics ; } } -} // Physics \ No newline at end of file +} // Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.h index f7fb1be4bc..d874b26b8b 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/AnimationConfiguration.h @@ -34,4 +34,4 @@ namespace Physics CharacterColliderConfiguration m_clothConfig; CharacterColliderConfiguration m_simulatedObjectColliderConfig; }; -} // namespace Physics \ No newline at end of file +} // namespace Physics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Character.h b/Code/Framework/AzFramework/AzFramework/Physics/Character.h index c43c6de9e8..19a6cbfe03 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Character.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Character.h @@ -28,7 +28,7 @@ namespace Physics class CharacterColliderNodeConfiguration { public: - AZ_RTTI(CharacterColliderNodeConfiguration, "{C16F3301-0979-400C-B734-692D83755C39}"); + AZ_RTTI(Physics::CharacterColliderNodeConfiguration, "{C16F3301-0979-400C-B734-692D83755C39}"); AZ_CLASS_ALLOCATOR_DECL virtual ~CharacterColliderNodeConfiguration() = default; @@ -42,7 +42,7 @@ namespace Physics class CharacterColliderConfiguration { public: - AZ_RTTI(CharacterColliderConfiguration, "{4DFF1434-DF5B-4ED5-BE0F-D3E66F9B331A}"); + AZ_RTTI(Physics::CharacterColliderConfiguration, "{4DFF1434-DF5B-4ED5-BE0F-D3E66F9B331A}"); AZ_CLASS_ALLOCATOR_DECL virtual ~CharacterColliderConfiguration() = default; @@ -63,21 +63,23 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(CharacterConfiguration, AZ::SystemAllocator, 0); - AZ_RTTI(CharacterConfiguration, "{58D5A6CA-113B-4AC3-8D53-239DB0C4E240}", AzPhysics::SimulatedBodyConfiguration); + AZ_RTTI(Physics::CharacterConfiguration, "{58D5A6CA-113B-4AC3-8D53-239DB0C4E240}", AzPhysics::SimulatedBodyConfiguration); virtual ~CharacterConfiguration() = default; static void Reflect(AZ::ReflectContext* context); - AzPhysics::CollisionGroups::Id m_collisionGroupId; ///< Which layers does this character collide with. - AzPhysics::CollisionLayer m_collisionLayer; ///< Which collision layer is this character on. - MaterialSelection m_materialSelection; ///< Material selected from library for the body associated with the character. - AZ::Vector3 m_upDirection = AZ::Vector3::CreateAxisZ(); ///< Up direction for character orientation and step behavior. - float m_maximumSlopeAngle = 30.0f; ///< The maximum slope on which the character can move, in degrees. - float m_stepHeight = 0.5f; ///< Affects what size steps the character can climb. - float m_minimumMovementDistance = 0.001f; ///< To avoid jittering, the controller will not attempt to move distances below this. - float m_maximumSpeed = 100.0f; ///< If the accumulated requested velocity for a tick exceeds this magnitude, it will be clamped. - AZStd::string m_colliderTag; ///< Used to identify the collider associated with the character controller. + AzPhysics::CollisionGroups::Id m_collisionGroupId; //!< Which layers does this character collide with. + AzPhysics::CollisionLayer m_collisionLayer; //!< Which collision layer is this character on. + MaterialSelection m_materialSelection; //!< Material selected from library for the body associated with the character. + AZ::Vector3 m_upDirection = AZ::Vector3::CreateAxisZ(); //!< Up direction for character orientation and step behavior. + float m_maximumSlopeAngle = 30.0f; //!< The maximum slope on which the character can move, in degrees. + float m_stepHeight = 0.5f; //!< Affects what size steps the character can climb. + float m_minimumMovementDistance = 0.001f; //!< To avoid jittering, the controller will not attempt to move distances below this. + float m_maximumSpeed = 100.0f; //!< If the accumulated requested velocity for a tick exceeds this magnitude, it will be clamped. + AZStd::string m_colliderTag; //!< Used to identify the collider associated with the character controller. + AZStd::shared_ptr m_shapeConfig; //!< The shape to use when creating the character controller. + AZStd::vector> m_colliders; //!< The list of colliders to attach to the character controller. }; /// Basic implementation of common character-style needs as a WorldBody. Is not a full-functional ship-ready @@ -88,7 +90,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(Character, AZ::SystemAllocator, 0); - AZ_RTTI(Character, "{962E37A1-3401-4672-B896-0A6157CFAC97}", AzPhysics::SimulatedBody); + AZ_RTTI(Physics::Character, "{962E37A1-3401-4672-B896-0A6157CFAC97}", AzPhysics::SimulatedBody); ~Character() override = default; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h index d892e433bc..ed8a68dc24 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h @@ -55,7 +55,7 @@ namespace AzPhysics //! Flag to determine if the body is part of the simulation. //! When true the body will be affected by any forces, collisions, and found with scene queries. - bool m_simulating = true; + bool m_simulating = false; //! Helper functions for setting user data. //! @param userData Can be a pointer to any type as internally will be cast to a void*. Object lifetime not managed by the SimulatedBody. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp index 0e29263e30..01bff3ccbb 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp @@ -46,6 +46,7 @@ namespace AzPhysics ->Field("orientation", &SimulatedBodyConfiguration::m_orientation) ->Field("scale", &SimulatedBodyConfiguration::m_scale) ->Field("entityId", &SimulatedBodyConfiguration::m_entityId) + ->Field("startSimulationEnabled", &SimulatedBodyConfiguration::m_startSimulationEnabled) ; } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h index 47b05089de..6862bfccb8 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h @@ -29,7 +29,7 @@ namespace AzPhysics struct SimulatedBodyConfiguration { AZ_CLASS_ALLOCATOR_DECL; - AZ_RTTI(SimulatedBodyConfiguration, "{52844E3D-79C8-4F34-AF63-5C45ADE77F85}"); + AZ_RTTI(AzPhysics::SimulatedBodyConfiguration, "{52844E3D-79C8-4F34-AF63-5C45ADE77F85}"); static void Reflect(AZ::ReflectContext* context); SimulatedBodyConfiguration() = default; @@ -39,6 +39,7 @@ namespace AzPhysics AZ::Vector3 m_position = AZ::Vector3::CreateZero(); AZ::Quaternion m_orientation = AZ::Quaternion::CreateIdentity(); AZ::Vector3 m_scale = AZ::Vector3::CreateOne(); + bool m_startSimulationEnabled = true; // Entity/object association. AZ::EntityId m_entityId = AZ::EntityId(AZ::EntityId::InvalidEntityId); diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PropertyTypes.h b/Code/Framework/AzFramework/AzFramework/Physics/PropertyTypes.h index 98d4729dd9..5048602a4e 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/PropertyTypes.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/PropertyTypes.h @@ -22,4 +22,4 @@ namespace Physics const static AZ::Crc32 CollisionGroupSelector = AZ_CRC("CollisionGroupSelector", 0x7d498664); const static AZ::Crc32 MaterialIdSelector = AZ_CRC("MaterialIdSelector", 0x494511ad); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp index 02cd96ac00..f634360445 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.cpp @@ -52,6 +52,11 @@ namespace Physics } } + RagdollConfiguration::RagdollConfiguration() + { + m_startSimulationEnabled = false; //ragdolls do not start enabled. + } + void RagdollConfiguration::Reflect(AZ::ReflectContext* context) { AZ::SerializeContext* serializeContext = azrtti_cast(context); diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h index 3f98ca9303..239d93cf32 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/Ragdoll.h @@ -24,6 +24,8 @@ namespace Physics { + using ParentIndices = AZStd::vector; + class RagdollNodeConfiguration : public AzPhysics::RigidBodyConfiguration { @@ -46,7 +48,7 @@ namespace Physics AZ_RTTI(RagdollConfiguration, "{7C96D332-61D8-4C58-A2BF-707716D38D14}", AzPhysics::SimulatedBodyConfiguration); static void Reflect(AZ::ReflectContext* context); - RagdollConfiguration() = default; + RagdollConfiguration(); explicit RagdollConfiguration(const RagdollConfiguration& settings) = default; RagdollNodeConfiguration* FindNodeConfigByName(const AZStd::string& nodeName) const; @@ -56,6 +58,8 @@ namespace Physics AZStd::vector m_nodes; CharacterColliderConfiguration m_colliders; + RagdollState m_initialState; + ParentIndices m_parentIndices; }; /// Represents a single rigid part of a ragdoll. @@ -79,7 +83,7 @@ namespace Physics { public: AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_RTTI(Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", AzPhysics::SimulatedBody); + AZ_RTTI(Physics::Ragdoll, "{01F09602-80EC-4693-A0E7-C2719239044B}", AzPhysics::SimulatedBody); virtual ~Ragdoll() = default; /// Inserts the ragdoll into the physics simulation. diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp index f01e42a443..52eae22fee 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp @@ -26,6 +26,22 @@ namespace Physics ->Field("Scale", &ShapeConfiguration::m_scale) ; } + + if (auto behaviorContext = azrtti_cast(context)) + { + #define REFLECT_SHAPETYPE_ENUM_VALUE(EnumValue) \ + behaviorContext->EnumProperty<(int)Physics::ShapeType::EnumValue>("ShapeType_"#EnumValue) \ + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation) \ + ->Attribute(AZ::Script::Attributes::Module, "physics"); + + // Note: Here we only expose the types that are available to the user in the editor + REFLECT_SHAPETYPE_ENUM_VALUE(Box); + REFLECT_SHAPETYPE_ENUM_VALUE(Sphere); + REFLECT_SHAPETYPE_ENUM_VALUE(Cylinder); + REFLECT_SHAPETYPE_ENUM_VALUE(PhysicsAsset); + + #undef REFLECT_SHAPETYPE_ENUM_VALUE + } } void SphereShapeConfiguration::Reflect(AZ::ReflectContext* context) diff --git a/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h b/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h index 717f9e023c..f198551148 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h +++ b/Code/Framework/AzFramework/AzFramework/Physics/SystemBus.h @@ -246,26 +246,6 @@ namespace Physics using SystemRequests = System; using SystemRequestBus = AZ::EBus; - /// Physics character system global requests. - class CharacterSystemRequests - : public AZ::EBusTraits - { - public: - // EBusTraits - // singleton pattern - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; - - virtual ~CharacterSystemRequests() = default; - - /// Creates the physics representation used to handle basic character interactions (also known as a character - /// controller). - virtual AZStd::unique_ptr CreateCharacter(const CharacterConfiguration& characterConfig, - const ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) = 0; - }; - - typedef AZ::EBus CharacterSystemRequestBus; - /// Physics system global debug requests. class SystemDebugRequests : public AZ::EBusTraits diff --git a/Code/Framework/AzFramework/AzFramework/Scene/Scene.cpp b/Code/Framework/AzFramework/AzFramework/Scene/Scene.cpp index 78f90f4ab6..98905b4574 100644 --- a/Code/Framework/AzFramework/AzFramework/Scene/Scene.cpp +++ b/Code/Framework/AzFramework/AzFramework/Scene/Scene.cpp @@ -23,4 +23,4 @@ namespace AzFramework { return m_name; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Scene/Scene.h b/Code/Framework/AzFramework/AzFramework/Scene/Scene.h index e2414094ed..6b365dae0f 100644 --- a/Code/Framework/AzFramework/AzFramework/Scene/Scene.h +++ b/Code/Framework/AzFramework/AzFramework/Scene/Scene.h @@ -91,4 +91,4 @@ namespace AzFramework return nullptr; } -} // AzFramework \ No newline at end of file +} // AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemBus.h b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemBus.h index 73280cd32f..c75a8ceb9a 100644 --- a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemBus.h +++ b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemBus.h @@ -111,4 +111,4 @@ namespace AzFramework using SceneNotificationBus = AZ::EBus; -} // AzFramework \ No newline at end of file +} // AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.cpp b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.cpp index 63d178f3e2..909880ff55 100644 --- a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.cpp @@ -197,4 +197,4 @@ namespace AzFramework return nullptr; } -} // AzFramework \ No newline at end of file +} // AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.h b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.h index 7c5b2a689f..085efcd898 100644 --- a/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Scene/SceneSystemComponent.h @@ -61,4 +61,4 @@ namespace AzFramework // Map of entity context Ids to scenes. Using a vector because lookups will be common, but the size will be small. AZStd::vector> m_entityContextToScenes; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptDebugMsgReflection.cpp b/Code/Framework/AzFramework/AzFramework/Script/ScriptDebugMsgReflection.cpp index 995a5974a4..45d3e4968e 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptDebugMsgReflection.cpp +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptDebugMsgReflection.cpp @@ -103,4 +103,4 @@ namespace AzFramework ->Field("EBusses", &ScriptDebugRegisteredEBusesResult::m_ebusList); } } -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.cpp b/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.cpp index 1ab3e5d630..f02e050e74 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.cpp +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.cpp @@ -570,4 +570,4 @@ namespace AzFramework m_isDirty = false; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.h b/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.h index 9193bc676e..c13749d46b 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.h +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptMarshal.h @@ -91,4 +91,4 @@ namespace AzFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/DisplayContextRequestBus.h b/Code/Framework/AzFramework/AzFramework/Viewport/DisplayContextRequestBus.h index 611ffe3773..4049b153eb 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/DisplayContextRequestBus.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/DisplayContextRequestBus.h @@ -85,4 +85,4 @@ namespace AzFramework DisplayContext* m_prevSetDisplayContext = nullptr; DisplayContext* m_currSetDisplayContext = nullptr; }; -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.h b/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.h index 54aa4394cc..2649655f50 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.h @@ -37,6 +37,7 @@ namespace AzFramework // ViewportControllerInterface ... bool HandleInputChannelEvent(const ViewportControllerInputEvent& event) override; + void ResetInputChannels() override; void UpdateViewport(const ViewportControllerUpdateEvent& event) override; void RegisterViewportContext(ViewportId viewport) override; void UnregisterViewportContext(ViewportId viewport) override; @@ -58,6 +59,7 @@ namespace AzFramework ViewportId GetViewportId() const { return m_viewportId; } virtual bool HandleInputChannelEvent([[maybe_unused]]const ViewportControllerInputEvent& event) { return false; } + virtual void ResetInputChannels() {} virtual void UpdateViewport([[maybe_unused]]const ViewportControllerUpdateEvent& event) {} private: diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.inl b/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.inl index 011c30b520..cc59418dac 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.inl +++ b/Code/Framework/AzFramework/AzFramework/Viewport/MultiViewportController.inl @@ -30,6 +30,15 @@ namespace AzFramework return instanceIt->second->HandleInputChannelEvent(event); } + template + void MultiViewportController::ResetInputChannels() + { + for (auto instanceIt = m_instances.begin(); instanceIt != m_instances.end(); ++instanceIt) + { + instanceIt->second->ResetInputChannels(); + } + } + template void MultiViewportController::UpdateViewport(const ViewportControllerUpdateEvent& event) { diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportColors.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportColors.cpp index 7db108128d..1325ff50c5 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportColors.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportColors.cpp @@ -50,4 +50,4 @@ namespace AzFramework const AZ::Color DefaultManipulatorHandleColor(0.06275f, 0.1647f, 0.1647f, 1.0f); } // namespace ViewportColors -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.cpp index 7662a670d8..9715296260 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.cpp @@ -23,4 +23,4 @@ namespace AzFramework /// Default linear manipulator axis length. const float DefaultLinearManipulatorAxisLength = 2.0f; }// namespace ViewportConstants -}// namespace AzFramework \ No newline at end of file +}// namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.h b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.h index e084586a4a..2991c3516f 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportConstants.h @@ -24,4 +24,4 @@ namespace AzFramework extern const float DefaultLinearManipulatorAxisLength; } // namespace ViewportConstants -} // namespace AzFramework \ No newline at end of file +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.cpp index 39cdb1440e..1dd608319a 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.cpp @@ -49,6 +49,11 @@ namespace AzFramework bool ViewportControllerList::HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) { + if (!IsEnabled()) + { + return false; + } + // If our event priority is "custom", we should dispatch at all priority levels in order using AzFramework::ViewportControllerPriority; if (event.m_priority == AzFramework::ViewportControllerPriority::DispatchToAllPriorities) @@ -76,6 +81,23 @@ namespace AzFramework } } + void ViewportControllerList::ResetInputChannels() + { + // We don't need to send this while we're disabled, we're guaranteed to call ResetInputChannels after being re-enabled. + if (!IsEnabled()) + { + return; + } + + for (const auto& controllerList : m_controllers) + { + for (const auto& controller : controllerList.second) + { + controller->ResetInputChannels(); + } + } + } + bool ViewportControllerList::DispatchInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) { if (auto priorityListIt = m_controllers.find(event.m_priority); priorityListIt != m_controllers.end()) @@ -106,6 +128,11 @@ namespace AzFramework void ViewportControllerList::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) { + if (!IsEnabled()) + { + return; + } + // If our event priority is "custom", we should dispatch at all priority levels in reverse order // Reverse order lets high priority controllers get the last say in viewport update operations using AzFramework::ViewportControllerPriority; @@ -174,4 +201,22 @@ namespace AzFramework } } } + + bool ViewportControllerList::IsEnabled() const + { + return m_enabled; + } + + void ViewportControllerList::SetEnabled(bool enabled) + { + if (m_enabled != enabled) + { + m_enabled = enabled; + // If we've been re-enabled, reset our input channels as they may have missed state changes. + if (m_enabled) + { + ResetInputChannels(); + } + } + } } //namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h index 294a784dff..9da1d65dff 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h @@ -37,6 +37,9 @@ namespace AzFramework //! either a controller returns true to consume the event in OnInputChannelEvent or the controller list is exhausted. //! InputChannelEvents are sent to controllers in priority order (from the lowest priority value to the highest). bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override; + //! Dispatches a ResetInputChannels call to all controllers registered to this list. + //! Calls to controllers are made in an undefined order. + void ResetInputChannels() override; //! Dispatches an update tick to all controllers registered to this list. //! This occurs in *reverse* priority order (i.e. from the highest priority value to the lowest) so that //! controllers with the highest registration priority may override the transforms of the controllers with the @@ -50,6 +53,12 @@ namespace AzFramework //! All ViewportControllerLists have a priority of Custom to ensure //! that they receive events at all priorities from any parent controllers. AzFramework::ViewportControllerPriority GetPriority() const { return ViewportControllerPriority::DispatchToAllPriorities; } + //! Returns true if this controller list is enabled, i.e. + //! it is accepting and forwarding input and update events to its children. + bool IsEnabled() const; + //! Set this controller list's enabled state. + //! If a controller list is disabled, it will ignore all input and update events rather than dispatching them to its children. + void SetEnabled(bool enabled); private: void SortControllers(); @@ -58,5 +67,6 @@ namespace AzFramework AZStd::unordered_map> m_controllers; AZStd::unordered_set m_viewports; + bool m_enabled = true; }; } //namespace AzFramework diff --git a/Code/Framework/AzFramework/CMakeLists.txt b/Code/Framework/AzFramework/CMakeLists.txt index f62f205efd..50e1fcb5a4 100644 --- a/Code/Framework/AzFramework/CMakeLists.txt +++ b/Code/Framework/AzFramework/CMakeLists.txt @@ -33,12 +33,12 @@ ly_add_target( BUILD_DEPENDENCIES PRIVATE AZ::AzCore + PUBLIC + AZ::GridMate 3rdParty::md5 3rdParty::zlib 3rdParty::zstd 3rdParty::lz4 - PUBLIC - AZ::GridMate ) if(LY_ENABLE_STATISTICAL_PROFILING) diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/API/ApplicationAPI_Platform.h b/Code/Framework/AzFramework/Platform/Android/AzFramework/API/ApplicationAPI_Platform.h index 1a7a7b278b..5c9b95e32d 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/API/ApplicationAPI_Platform.h +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/API/ApplicationAPI_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/AzFramework_Traits_Platform.h b/Code/Framework/AzFramework/Platform/Android/AzFramework/AzFramework_Traits_Platform.h index d69ade0f06..848431d5fa 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/AzFramework_Traits_Platform.h +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/AzFramework_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h index 8d332fc743..bac07004c3 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Platform.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Platform.h index 1c81221429..e36a678b15 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Platform.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Archive/ArchiveVars_Linux.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Archive/ArchiveVars_Linux.h index 5cd50839ef..f8ca242409 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Archive/ArchiveVars_Linux.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Archive/ArchiveVars_Linux.h @@ -13,4 +13,4 @@ #pragma once #define STREAM_CACHE_DEFAULT 0 -#define FRONTEND_SHADER_CACHE_DEFAULT 0 \ No newline at end of file +#define FRONTEND_SHADER_CACHE_DEFAULT 0 diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp index 1f71b97a57..1ae3945bd6 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp @@ -29,6 +29,20 @@ namespace AzFramework::AssetSystem::Platform bool LaunchAssetProcessor(AZStd::string_view executableDirectory, AZStd::string_view engineRoot, AZStd::string_view projectPath) { + AZ::IO::FixedMaxPath assetProcessorPath{ executableDirectory }; + assetProcessorPath /= "AssetProcessor"; + + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + // Check for existence of one under a "bin" directory, i.e. engineRoot is an SDK structure. + assetProcessorPath = AZ::IO::FixedMaxPath{engineRoot} / "bin" / AZ_BUILD_CONFIGURATION_TYPE / "AssetProcessor"; + + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + return false; + } + } + pid_t firstChildPid = fork(); if (firstChildPid == 0) { @@ -47,9 +61,6 @@ namespace AzFramework::AssetSystem::Platform pid_t secondChildPid = fork(); if (secondChildPid == 0) { - AZ::IO::FixedMaxPath assetProcessorPath{ executableDirectory }; - assetProcessorPath /= "AssetProcessor"; - AZStd::array args { assetProcessorPath.c_str(), assetProcessorPath.c_str(), "--start-hidden", static_cast(nullptr), static_cast(nullptr), static_cast(nullptr) diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/AzFramework_Traits_Platform.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/AzFramework_Traits_Platform.h index a32b459472..6ab7bbbd6f 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/AzFramework_Traits_Platform.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/AzFramework_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/API/ApplicationAPI_Platform.h b/Code/Framework/AzFramework/Platform/Mac/AzFramework/API/ApplicationAPI_Platform.h index cbdf47394f..058cada4ed 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/API/ApplicationAPI_Platform.h +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/API/ApplicationAPI_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Archive/ArchiveVars_Mac.h b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Archive/ArchiveVars_Mac.h index 5cd50839ef..f8ca242409 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Archive/ArchiveVars_Mac.h +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Archive/ArchiveVars_Mac.h @@ -13,4 +13,4 @@ #pragma once #define STREAM_CACHE_DEFAULT 0 -#define FRONTEND_SHADER_CACHE_DEFAULT 0 \ No newline at end of file +#define FRONTEND_SHADER_CACHE_DEFAULT 0 diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Asset/AssetSystemComponentHelper_Mac.cpp b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Asset/AssetSystemComponentHelper_Mac.cpp index 43f7599676..6f1f860932 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Asset/AssetSystemComponentHelper_Mac.cpp +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Asset/AssetSystemComponentHelper_Mac.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -20,6 +21,7 @@ namespace AzFramework::AssetSystem::Platform { void AllowAssetProcessorToForeground() {} + bool LaunchAssetProcessor(AZStd::string_view executableDirectory, AZStd::string_view engineRoot, AZStd::string_view projectPath) { @@ -29,6 +31,17 @@ namespace AzFramework::AssetSystem::Platform assetProcessorPath /= "../../../AssetProcessor.app"; assetProcessorPath = assetProcessorPath.LexicallyNormal(); + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + // Check for existence of one under a "bin" directory, i.e. engineRoot is an SDK structure. + assetProcessorPath = AZ::IO::FixedMaxPath{engineRoot} / "bin" / AZ_BUILD_CONFIGURATION_TYPE / "AssetProcessor.app"; + + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + return false; + } + } + auto fullLaunchCommand = AZ::IO::FixedMaxPathString::format(R"(open -g "%s" --args --start-hidden)", assetProcessorPath.c_str()); // Add the engine path to the launch command if not empty if (!engineRoot.empty()) diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/AzFramework_Traits_Platform.h b/Code/Framework/AzFramework/Platform/Mac/AzFramework/AzFramework_Traits_Platform.h index e12492419b..e546d9814e 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/AzFramework_Traits_Platform.h +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/AzFramework_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h index 2863ddc36e..5361c41a5d 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/API/ApplicationAPI_Platform.h b/Code/Framework/AzFramework/Platform/Windows/AzFramework/API/ApplicationAPI_Platform.h index 95ae605d83..c18a545bb9 100644 --- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/API/ApplicationAPI_Platform.h +++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/API/ApplicationAPI_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Archive/ArchiveVars_Windows.h b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Archive/ArchiveVars_Windows.h index 5cd50839ef..f8ca242409 100644 --- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Archive/ArchiveVars_Windows.h +++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Archive/ArchiveVars_Windows.h @@ -13,4 +13,4 @@ #pragma once #define STREAM_CACHE_DEFAULT 0 -#define FRONTEND_SHADER_CACHE_DEFAULT 0 \ No newline at end of file +#define FRONTEND_SHADER_CACHE_DEFAULT 0 diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Asset/AssetSystemComponentHelper_Windows.cpp b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Asset/AssetSystemComponentHelper_Windows.cpp index 3f4dbef22a..b716778cf4 100644 --- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Asset/AssetSystemComponentHelper_Windows.cpp +++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Asset/AssetSystemComponentHelper_Windows.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -67,6 +68,17 @@ namespace AzFramework::AssetSystem::Platform AZ::IO::FixedMaxPath assetProcessorPath{ executableDirectory }; assetProcessorPath /= "AssetProcessor.exe"; + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + // Check for existence of one under a "bin" directory, i.e. engineRoot is an SDK structure. + assetProcessorPath = AZ::IO::FixedMaxPath{engineRoot} / "bin" / AZ_BUILD_CONFIGURATION_TYPE / "AssetProcessor.exe"; + + if (!AZ::IO::SystemFile::Exists(assetProcessorPath.c_str())) + { + return false; + } + } + auto fullLaunchCommand = AZ::IO::FixedMaxPathString::format(R"("%s" --start-hidden)", assetProcessorPath.c_str()); // Add the engine path to the launch command if not empty diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/AzFramework_Traits_Platform.h b/Code/Framework/AzFramework/Platform/Windows/AzFramework/AzFramework_Traits_Platform.h index ab42eb44e0..c23bcfaa11 100644 --- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/AzFramework_Traits_Platform.h +++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/AzFramework_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h index c5e5103329..4630744923 100644 --- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h +++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/iOS/AzFramework/API/ApplicationAPI_Platform.h b/Code/Framework/AzFramework/Platform/iOS/AzFramework/API/ApplicationAPI_Platform.h index 739b38a936..d4a19fc556 100644 --- a/Code/Framework/AzFramework/Platform/iOS/AzFramework/API/ApplicationAPI_Platform.h +++ b/Code/Framework/AzFramework/Platform/iOS/AzFramework/API/ApplicationAPI_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/iOS/AzFramework/AzFramework_Traits_Platform.h b/Code/Framework/AzFramework/Platform/iOS/AzFramework/AzFramework_Traits_Platform.h index c1016bcea1..f3868b9621 100644 --- a/Code/Framework/AzFramework/Platform/iOS/AzFramework/AzFramework_Traits_Platform.h +++ b/Code/Framework/AzFramework/Platform/iOS/AzFramework/AzFramework_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzFramework/Platform/iOS/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h b/Code/Framework/AzFramework/Platform/iOS/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h index 13d57a6dde..50da01d3fa 100644 --- a/Code/Framework/AzFramework/Platform/iOS/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h +++ b/Code/Framework/AzFramework/Platform/iOS/AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzGameFramework/AzGameFramework/AzGameFrameworkModule.h b/Code/Framework/AzGameFramework/AzGameFramework/AzGameFrameworkModule.h index 2089a10e19..224b109671 100644 --- a/Code/Framework/AzGameFramework/AzGameFramework/AzGameFrameworkModule.h +++ b/Code/Framework/AzGameFramework/AzGameFramework/AzGameFrameworkModule.h @@ -27,4 +27,4 @@ namespace AzGameFramework AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzGameFramework/AzGameFramework/CMakeLists.txt b/Code/Framework/AzGameFramework/AzGameFramework/CMakeLists.txt index 9e55dd1be8..3ae4116dbe 100644 --- a/Code/Framework/AzGameFramework/AzGameFramework/CMakeLists.txt +++ b/Code/Framework/AzGameFramework/AzGameFramework/CMakeLists.txt @@ -21,4 +21,4 @@ ly_add_target( PUBLIC AZ::AzCore AZ::AzFramework -) \ No newline at end of file +) diff --git a/Code/Framework/AzNetworking/AzNetworking/Serialization/ISerializer.inl b/Code/Framework/AzNetworking/AzNetworking/Serialization/ISerializer.inl index 2d983c2061..df3b08f798 100644 --- a/Code/Framework/AzNetworking/AzNetworking/Serialization/ISerializer.inl +++ b/Code/Framework/AzNetworking/AzNetworking/Serialization/ISerializer.inl @@ -18,6 +18,8 @@ #include #include #include +#include +#include namespace AzNetworking { @@ -173,6 +175,22 @@ namespace AzNetworking return true; } }; + + template<> + struct SerializeObjectHelper + { + static bool SerializeObject(ISerializer& serializer, AZ::Name& value) + { + AZ::Name::Hash nameHash = value.GetHash(); + bool result = serializer.Serialize(nameHash, "NameHash"); + + if (result && serializer.GetSerializerMode() == SerializerMode::WriteToObject) + { + value = AZ::NameDictionary::Instance().FindName(nameHash); + } + return result; + } + }; } #include diff --git a/Code/Framework/AzNetworking/Platform/Common/WinAPI/AzNetworking/Utilities/Endian_WinAPI.h b/Code/Framework/AzNetworking/Platform/Common/WinAPI/AzNetworking/Utilities/Endian_WinAPI.h index e5e7447635..d09120fdab 100644 --- a/Code/Framework/AzNetworking/Platform/Common/WinAPI/AzNetworking/Utilities/Endian_WinAPI.h +++ b/Code/Framework/AzNetworking/Platform/Common/WinAPI/AzNetworking/Utilities/Endian_WinAPI.h @@ -12,4 +12,4 @@ #pragma once -// nothing to do here \ No newline at end of file +// nothing to do here diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Buses/DragAndDrop.h b/Code/Framework/AzQtComponents/AzQtComponents/Buses/DragAndDrop.h index e60ce1ac52..f92656d631 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Buses/DragAndDrop.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Buses/DragAndDrop.h @@ -103,4 +103,4 @@ namespace AzQtComponents using DragAndDropEventsBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockBar.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockBar.h index 211880ebd2..2b0864751a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockBar.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockBar.h @@ -68,4 +68,4 @@ namespace AzQtComponents QPixmap m_tearIcon; QPixmap m_applicationIcon; }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabWidget.cpp index 8c2ad44cd2..b57ad32e2a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabWidget.cpp @@ -333,4 +333,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/moc_DockTabWidget.cpp" \ No newline at end of file +#include "Components/moc_DockTabWidget.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp index 76df971108..6cea9324c4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp @@ -2298,6 +2298,12 @@ namespace AzQtComponents OptimizedSetParent(dock, mainWindow); mainWindow->addDockWidget(Qt::LeftDockWidgetArea, dock); dock->show(); + + // Make sure we listen for events on the dock widget being put into a floating dock window + // because this might be called programmatically, so the dock widget might have never been + // parented to our m_mainWindow initially, so it won't already have an event filter, + // which will prevent the docking functionality from working. + dock->installEventFilter(this); } } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingDropZoneWidget.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingDropZoneWidget.h index 92eddbe5dc..e6ebbbe9f4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingDropZoneWidget.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingDropZoneWidget.h @@ -338,4 +338,4 @@ namespace AzQtComponents FancyDockingDropZoneState* const m_dropZoneState; }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h index 75bb58c661..3453171350 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h @@ -50,4 +50,4 @@ namespace AzQtComponents bool m_visible = false; // maintain our own flag, so that we're always ready to render ignoring Qt's widget caching system bool m_clipToWidgets = false; }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.h index 8d6014ce0f..dc3e8e1bc1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.h @@ -80,4 +80,4 @@ private: int m_vSpace; }; -#endif // FLOWLAYOUT_H \ No newline at end of file +#endif // FLOWLAYOUT_H diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/InteractiveWindowGeometryChanger.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/InteractiveWindowGeometryChanger.h index e5decf9fda..f89c6af66e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/InteractiveWindowGeometryChanger.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/InteractiveWindowGeometryChanger.h @@ -94,4 +94,4 @@ namespace AzQtComponents void handleMouseMove(QMouseEvent*) override; bool m_arrowAlreadyPressed = false; }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/TagSelector.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/TagSelector.h index b83c569480..bfd15a4efa 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/TagSelector.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/TagSelector.h @@ -117,4 +117,4 @@ namespace AzQtComponents TagWidgetContainer* m_tagWidgets; //! List of tag widgets. Each tag widget represents one selected tag. QComboBox* m_combo; }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/TitleBarOverdrawScreenHandler_win.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/TitleBarOverdrawScreenHandler_win.h index f4c56e9430..8df7f86c54 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/TitleBarOverdrawScreenHandler_win.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/TitleBarOverdrawScreenHandler_win.h @@ -44,4 +44,4 @@ private: void handleFloatingDockWidget(); }; -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonLineEdit.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonLineEdit.cpp index 4dfc38f8ff..3957943f5d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonLineEdit.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonLineEdit.cpp @@ -51,4 +51,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/moc_ToolButtonLineEdit.cpp" \ No newline at end of file +#include "Components/moc_ToolButtonLineEdit.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonWithWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonWithWidget.cpp index 3417e71d18..22d11f1d01 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonWithWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/ToolButtonWithWidget.cpp @@ -107,4 +107,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/moc_ToolButtonWithWidget.cpp" \ No newline at end of file +#include "Components/moc_ToolButtonWithWidget.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/VectorEdit.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/VectorEdit.cpp index 2595ca83e9..0e0d7f4273 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/VectorEdit.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/VectorEdit.cpp @@ -304,4 +304,4 @@ namespace AzQtComponents } -#include "Components/moc_VectorEdit.cpp" \ No newline at end of file +#include "Components/moc_VectorEdit.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss index d4b078d8ac..906f5b7fdb 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss @@ -147,4 +147,4 @@ QPlainTextEdit:focus @import "ToolBar.qss"; @import "ToolTip.qss"; @import "VectorInput.qss"; -@import "WindowDecorationWrapper.qss"; \ No newline at end of file +@import "WindowDecorationWrapper.qss"; diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BreadCrumbs.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BreadCrumbs.cpp index c55d834588..16647ed0cf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BreadCrumbs.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BreadCrumbs.cpp @@ -379,4 +379,4 @@ namespace AzQtComponents } } // namespace AzQtComponents -#include "Components/Widgets/moc_BreadCrumbs.cpp" \ No newline at end of file +#include "Components/Widgets/moc_BreadCrumbs.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.cpp index a6e7723f53..dc8f295895 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.cpp @@ -373,4 +373,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/Widgets/moc_BrowseEdit.cpp" \ No newline at end of file +#include "Components/Widgets/moc_BrowseEdit.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.qss index 80fbfde84e..cad7b18869 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BrowseEdit.qss @@ -90,4 +90,4 @@ AzQtComponents--BrowseEdit #attached-button:disabled { background-color: #666666; border-left: 1px solid #555555; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp index 9e9a25808d..57e2c1d929 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp @@ -460,4 +460,4 @@ namespace AzQtComponents } } // namespace AzQtComponents -#include "Components/Widgets/moc_Card.cpp" \ No newline at end of file +#include "Components/Widgets/moc_Card.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/CardHeader.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/CardHeader.cpp index f76d6b97c6..f7955c3495 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/CardHeader.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/CardHeader.cpp @@ -362,4 +362,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/Widgets/moc_CardHeader.cpp" \ No newline at end of file +#include "Components/Widgets/moc_CardHeader.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorLabel.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorLabel.qss index e9655d0bc4..aa9b51e9ab 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorLabel.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorLabel.qss @@ -40,4 +40,4 @@ AzQtComponents--ColorLabel AzQtComponents--ColorHexEdit > QLineEdit { max-width: 100px; min-width: 100px; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker.qss index bee907b467..56fd77d6a9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker.qss @@ -136,4 +136,4 @@ AzQtComponents--GradientSlider.VerticalSlider { qproperty-toolTipOffsetX: 8; qproperty-toolTipOffsetY: -24; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorValidator.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorValidator.cpp index 8a311b8cad..5f986a17c3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorValidator.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorValidator.cpp @@ -93,4 +93,4 @@ namespace AzQtComponents } } // namespace AzQtComponents -#include "Components/Widgets/ColorPicker/moc_ColorValidator.cpp" \ No newline at end of file +#include "Components/Widgets/ColorPicker/moc_ColorValidator.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorWarning.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorWarning.cpp index c0462309da..80a35cd2de 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorWarning.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/ColorWarning.cpp @@ -112,4 +112,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/Widgets/ColorPicker/moc_ColorWarning.cpp" \ No newline at end of file +#include "Components/Widgets/ColorPicker/moc_ColorWarning.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/Swatch.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/Swatch.cpp index 84a8a61d14..feb188dad2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/Swatch.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ColorPicker/Swatch.cpp @@ -88,4 +88,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Components/Widgets/ColorPicker/moc_Swatch.cpp" \ No newline at end of file +#include "Components/Widgets/ColorPicker/moc_Swatch.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/DragAndDropConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/DragAndDropConfig.ini index 87d080e1f6..14aca1f9d4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/DragAndDropConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/DragAndDropConfig.ini @@ -10,4 +10,4 @@ ballOutlineWidth=1 [DragIndicator] rectBorderRadius=2 -rectFillColor=#888888 \ No newline at end of file +rectFillColor=#888888 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/EyedropperConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/EyedropperConfig.ini index 4a3b0cdd6c..5156d7f36f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/EyedropperConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/EyedropperConfig.ini @@ -1,2 +1,2 @@ ContextSizeInPixels=15 -ZoomFactor=8 \ No newline at end of file +ZoomFactor=8 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.qss index 0393c640f5..6b011e5cc7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.qss @@ -49,4 +49,4 @@ QLineEdit QToolButton min-width: 16px; max-height: 16px; min-height: 16px; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LogicalTabOrderingWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LogicalTabOrderingWidget.cpp index 5cb20e6b90..e98dcb7b6c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LogicalTabOrderingWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LogicalTabOrderingWidget.cpp @@ -172,4 +172,4 @@ namespace AzQtComponents } } // namespace LogicalTabOrderingInternal -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MenuBar.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MenuBar.qss index 49b1b59e36..d93db664d2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MenuBar.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MenuBar.qss @@ -37,4 +37,4 @@ QMenuBar::item:selected QMenuBar::item:pressed { background-color: #222222; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/OverlayWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/OverlayWidget.cpp index 62800c1260..39f81df028 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/OverlayWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/OverlayWidget.cpp @@ -235,4 +235,4 @@ namespace AzQtComponents } } // namespace AzQtComponents -#include "Components/Widgets/moc_OverlayWidget.cpp" \ No newline at end of file +#include "Components/Widgets/moc_OverlayWidget.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/PushButtonConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/PushButtonConfig.ini index 05744772fa..c88d0f61ee 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/PushButtonConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/PushButtonConfig.ini @@ -52,4 +52,4 @@ SelectedColor=#FFFFFF [DropdownButton] IndicatorArrowDown=:/stylesheet/img/UI20/dropdown-button-arrow.svg MenuIndicatorWidth=16 -MenuIndicatorPadding=4 \ No newline at end of file +MenuIndicatorPadding=4 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ReflectedPropertyEditor.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ReflectedPropertyEditor.qss index 5448ec0651..60fa5e55a7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ReflectedPropertyEditor.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ReflectedPropertyEditor.qss @@ -22,4 +22,4 @@ AzToolsFramework--PropertyRowWidget QLabel#DefaultLabel { min-height: 16px; max-height: 16px; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBarConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBarConfig.ini index ddbc23aedf..5c4d6d5977 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBarConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBarConfig.ini @@ -1 +1 @@ -DefaultMode=0 \ No newline at end of file +DefaultMode=0 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentBar.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentBar.cpp index cf8c66fd63..c4bcee44e8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentBar.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentBar.cpp @@ -385,4 +385,4 @@ namespace AzQtComponents } } -#include "Components/Widgets/moc_SegmentBar.cpp" \ No newline at end of file +#include "Components/Widgets/moc_SegmentBar.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentControl.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentControl.cpp index 798640f4e1..66e296c7bb 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentControl.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SegmentControl.cpp @@ -262,4 +262,4 @@ namespace AzQtComponents } } -#include "Components/Widgets/moc_SegmentControl.cpp" \ No newline at end of file +#include "Components/Widgets/moc_SegmentControl.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Slider.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Slider.qss index 9808e2d0b7..071e971c10 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Slider.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Slider.qss @@ -21,4 +21,4 @@ AzQtComponents--Slider.VerticalSlider { qproperty-toolTipOffsetX: 8; qproperty-toolTipOffsetY: -24; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SpinBox.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SpinBox.qss index 61dbf64d2e..0950b98cb9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SpinBox.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SpinBox.qss @@ -177,4 +177,4 @@ QSpinBox[SpinBoxFocused=true][SpinBoxMinReached=false][SpinBoxValueDecreasing=fa QDoubleSpinBox[SpinBoxFocused=true][SpinBoxMinReached=false][SpinBoxValueDecreasing=false]::down-button { image: url(:/SpinBox/arrowLeftFocused.svg); -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetActionToolBar.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetActionToolBar.qss index dfb0dffc1e..5dba78e0de 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetActionToolBar.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetActionToolBar.qss @@ -29,4 +29,4 @@ AzQtComponents--DockTabWidget > AzQtComponents--TabWidgetActionToolBarContainer min-height: 28px; margin: 0; margin-bottom: 9px; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetConfig.ini index 192518f6be..a7473cc3fc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidgetConfig.ini @@ -8,4 +8,4 @@ TextRightPadding=40 CloseButtonRightPadding=4 CloseButtonMinTabWidth=32 ToolTipTabWidthThreshold=96 -OverflowSpacing=24 \ No newline at end of file +OverflowSpacing=24 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TextConfig.ini b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TextConfig.ini index f2eea957c7..450636e220 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TextConfig.ini +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TextConfig.ini @@ -1,2 +1,2 @@ [Hyperlink] -Color=#44B2F8 \ No newline at end of file +Color=#44B2F8 diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp index 1121ae8c6d..7552fb0b50 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp @@ -398,4 +398,4 @@ void VectorInput::UpdateTabOrder() } -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.h index 48e91f69b9..8fb906a5cf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.h @@ -235,4 +235,4 @@ namespace AzQtComponents } -Q_DECLARE_METATYPE(AzQtComponents::VectorElement::Coordinate) \ No newline at end of file +Q_DECLARE_METATYPE(AzQtComponents::VectorElement::Coordinate) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.qss b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.qss index 6971d2812b..0d4e1aba69 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.qss @@ -36,4 +36,4 @@ AzQtComponents--VectorElement[Coordinate="Z"] QLabel AzQtComponents--VectorElement[Coordinate="W"] QLabel { background-color: #E57829; -} \ No newline at end of file +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Add.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Add.svg index f388ec509e..6906f5149f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Add.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Add.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/AssetEditor/default_document.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/AssetEditor/default_document.svg index e0984e63cd..bce6df95d1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/AssetEditor/default_document.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/AssetEditor/default_document.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_File.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_File.svg index e0a56c8c6b..e856d8da5e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_File.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_File.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_Folder.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_Folder.svg index 129ca07fe0..7821c52879 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_Folder.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Asset_Folder.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Audio.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Audio.svg index 2fe9856d51..90c1f66771 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Audio.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Audio.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/List_View.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/List_View.svg index c54203e3bf..037eb58920 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/List_View.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/List_View.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/Next_level_arrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/Next_level_arrow.svg index 89fd7fc3fa..6fe5d7791c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/Next_level_arrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/Next_level_arrow.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default.svg index f08a9d20ac..758db90a0a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default_hover.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default_hover.svg index 2451b764a8..f7ec950940 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default_hover.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_left-default_hover.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default.svg index db48072bbf..6c3e8e53ed 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default_hover.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default_hover.svg index 533819aaa5..ef04881571 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default_hover.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/arrow_right-default_hover.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot.svg index 1643ddc948..2ab8718f90 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot_with_arrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot_with_arrow.svg index d8e38f94d5..f7dd318475 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot_with_arrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/dot-dot-dot_with_arrow.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/doward_arrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/doward_arrow.svg index c016dabd93..d1827485d8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/doward_arrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Breadcrumb/doward_arrow.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Camera.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Camera.svg index 79a3ee4334..d0c3de388f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Camera.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Camera.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-down.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-down.svg index e48e298767..142b9caf69 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-down.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-down.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-right.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-right.svg index ed6848327c..e923f992b8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-right.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/caret-right.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/error-conclict-state.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/error-conclict-state.svg index 866f8bc174..52a5fd8048 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/error-conclict-state.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/error-conclict-state.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help.svg index 9367251b95..ac210a849e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help_hover.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help_hover.svg index 049c4fa7b3..42f3f83717 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help_hover.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/help_hover.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/menu_ico.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/menu_ico.svg index 28198c1612..d70293f3a5 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/menu_ico.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/menu_ico.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg index 9435fd0802..464515fee8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cursors/Pointer.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cursors/Pointer.svg index 545191446e..ce26dcaf4f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cursors/Pointer.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cursors/Pointer.svg @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Delete.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Delete.svg index 297737ac82..ed83189145 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Delete.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Delete.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder-small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder-small.svg index 3483cbb7bc..8e75054a46 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder-small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder-small.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder.svg index c89b233ed7..5da972bdd1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Folder.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-next-level.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-next-level.svg index 95922a4349..64c92e0847 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-next-level.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-next-level.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-previous-level.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-previous-level.svg index 311acf3eaf..cc42db6a6d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-previous-level.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Goto-previous-level.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-large.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-large.svg index 92733d612f..a34ed744a0 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-large.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-large.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-small.svg index 1d9a802b64..625b3f5de6 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Grid-small.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Helpers.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Helpers.svg index a3d62e2ab2..51d1f16752 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Helpers.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Helpers.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Info.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Info.svg index 07d0a967c0..e1e37544dd 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Info.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Info.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Move.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Move.svg index 4ee7acb105..51d107de98 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Move.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Move.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Rotate.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Rotate.svg index b06a167dc8..bad08e5cf9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Rotate.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Rotate.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Save.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Save.svg index 69480b8599..370897fcc4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Save.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Save.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Scale.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Scale.svg index 4a9ffc67ef..359b1cf3bc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Scale.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Scale.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Select-Files.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Select-Files.svg index 2f7f543fa1..6278a88ba5 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Select-Files.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Select-Files.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Settings.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Settings.svg index 35087c8b53..17b49e791a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Settings.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Settings.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-leftarrow.svg index d2ddb0e4b3..3b713e876e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-rightarrow.svg index aead954fee..3b676b6a2c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MaxReached-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-leftarrow.svg index 6909ad9b84..478c6f1263 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-rightarrow.svg index a262ca30f0..1c8dc783b2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/MinReached-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_center.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_center.svg index 866d5fbf76..987dbaf632 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_center.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_center.svg @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left.svg index 59695ba437..b750da8216 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left_stopped.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left_stopped.svg index 41b914621e..ec474b3951 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left_stopped.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_left_stopped.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right.svg index 9c50cbd051..726e85bd58 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right_stopped.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right_stopped.svg index 335ac3f027..e100320236 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right_stopped.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/NumberEdit_scroll_right_stopped.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MaxReached-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MaxReached-BG.svg index f1c134752c..efb307d90f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MaxReached-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MaxReached-BG.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MinReached-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MinReached-BG.svg index 68f0352145..deb5b676a0 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MinReached-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-MinReached-BG.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-buttonPressActive-hover-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-buttonPressActive-hover-BG.svg index 9aa18aa180..93bc8a4349 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-buttonPressActive-hover-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-buttonPressActive-hover-BG.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-decrease-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-decrease-BG.svg index 0568f2ec1f..a838765f9b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-decrease-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-decrease-BG.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-focused-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-focused-BG.svg index 554f6c4107..655ea3ffb1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-focused-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-focused-BG.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-hover-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-hover-BG.svg index b18884f0fb..7af53feb45 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-hover-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-hover-BG.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-increase-BG.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-increase-BG.svg index 4ef63204ee..a3187cd9ca 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-increase-BG.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/SB-increase-BG.svg @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-leftarrow.svg index 6c7e4cd1d4..e2ca96e298 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-rightarrow.svg index 8eb8626b1e..30c7ec983a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/buttonPressActive-hover-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-leftarrow.svg index c26ab4ad2f..98fe7ac920 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-rightarrow.svg index 6a3de88aa4..4e83591cd7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/decrease-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-leftarrow.svg index 1fb4eb2131..de1cce7b69 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-rightarrow.svg index 7003df1053..2152553f80 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/focused-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-leftarrow.svg index bbdf916580..4fe8ba6cbf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-rightarrow.svg index d5168a592e..a3a568a6e2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/hover-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-leftarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-leftarrow.svg index 2121df97a1..d3f2f119b6 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-leftarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-leftarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-rightarrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-rightarrow.svg index 70aa67ad07..50b7abc661 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-rightarrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/SpinBox/increase-rightarrow.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed.svg index 57abd8eb81..7992ab0789 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed_small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed_small.svg index 2516187853..0e33f537bf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed_small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/closed_small.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/default-icon.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/default-icon.svg index 0e89489a4f..0dc622bccc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/default-icon.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/default-icon.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/folder-icon.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/folder-icon.svg index a86fea7679..454d88de43 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/folder-icon.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/folder-icon.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open.svg index a8821e7c98..01b91b762b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open_small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open_small.svg index 86ccc98029..b1416de12e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open_small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/TreeView/open_small.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/add-16.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/add-16.svg index 41402b80ec..d1f7dbf398 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/add-16.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/add-16.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit-select-files.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit-select-files.svg index 48e247278d..903cbe8cfe 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit-select-files.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit-select-files.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit.svg index c8a7191df2..a7a389d6c2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/browse-edit.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-disabled.svg index 46612ddeb8..94732b8050 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-disabled.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-focus.svg index f00c35da1d..c7bf13420c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off-focus.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off.svg index a95b84ac5b..bfc678faa7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/off.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-disabled.svg index 4435ad3862..020514b9bf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-disabled.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-focus.svg index 90a183a292..03971b4ea2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on-focus.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on.svg index ad78731eb9..8c2f963403 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/on.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-disabled.svg index a08724b9b9..b0bca84b49 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-disabled.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-focus.svg index a1093037c6..dd789a8782 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected-focus.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected.svg index 6f678f2682..643f35f357 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkbox/partial-selected.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark-menu.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark-menu.svg index 1a18f18298..bfedb33cc3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark-menu.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark-menu.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark.svg index 1c1a05c573..cd3309fc9e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/checkmark.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-eyedropper-normal.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-eyedropper-normal.svg index b266a9eac4..1ec04a8c2b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-eyedropper-normal.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-eyedropper-normal.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-toggle-normal-on.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-toggle-normal-on.svg index 165280b0b0..4120cdf4dd 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-toggle-normal-on.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/colorpicker/colorgrid-toggle-normal-on.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow-disabled.svg index a2193c29c4..fd298e969f 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow-disabled.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow.svg index ef93a8b6f9..73c9741ec7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/combobox-arrow.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/delete-16.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/delete-16.svg index 4262a9a527..566005a87c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/delete-16.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/delete-16.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/docking/tabs_icon.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/docking/tabs_icon.svg index 1142b676bf..b3ee23143c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/docking/tabs_icon.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/docking/tabs_icon.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/dropdown-button-arrow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/dropdown-button-arrow.svg index b408bcccc8..63be29598e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/dropdown-button-arrow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/dropdown-button-arrow.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/filter.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/filter.svg index ef11e89fc7..6868d094dc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/filter.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/filter.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/indeterminate.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/indeterminate.svg index af332bf65b..f2c117ff34 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/indeterminate.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/indeterminate.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close-disabled.svg index b290b6484c..fd520d28bc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close-disabled.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close.svg index 20e9b03d5b..880046be84 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-close.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-error.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-error.svg index 1a6e110ca1..57cb1cfdaa 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-error.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/lineedit-error.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-centered.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-centered.svg index fbf6872dc8..a21828aa27 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-centered.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-centered.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-indicator.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-indicator.svg index 767615d78e..f8d2504cc1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-indicator.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/menu-indicator.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/more.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/more.svg index f2cef679d1..2ea253c9da 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/more.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/more.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/open-in-internal-app.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/open-in-internal-app.svg index 118ebdc7d2..dd275ceeb3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/open-in-internal-app.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/open-in-internal-app.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/picker.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/picker.svg index c61612208f..fc537b1b77 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/picker.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/picker.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-disabled.svg index ffda1ccb1c..3c05726f2d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-disabled.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-focus.svg index 7bee259df0..a533b695b0 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked-focus.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked.svg index 70e3d200e3..40d64f6a8c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/checked.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-disabled.svg index 1c05f981ce..b11261c80c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-disabled.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-focus.svg index 07d1fcd116..e636dc38cd 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked-focus.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked.svg index 93bf39b8c5..104894efec 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/radiobutton/unchecked.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear-vertical.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear-vertical.svg index f819fda188..b31a5f3314 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear-vertical.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear-vertical.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear.svg index 2fb6201b5c..2221f64659 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/tear.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-close.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-close.svg index bba9b36114..e32d4216dc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-close.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-close.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-maximize.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-maximize.svg index 5108d37330..2a85106e5b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-maximize.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-maximize.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-minimize.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-minimize.svg index 8b520bf51d..dd61ec4709 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-minimize.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-minimize.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-hover.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-hover.svg index fd128f2d21..e80f5eb134 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-hover.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-hover.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-small.svg index 681611695f..5b6805dc8b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout-small.svg @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout.svg index 80c3315033..563a0c2961 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-popout.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore-hover.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore-hover.svg index 481d06bb25..be47327c62 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore-hover.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore-hover.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore.svg index c11040c1ff..b17cd3e8e9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/titlebar-restore.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-disabled.svg index 2fea1baf62..c1582c8cdf 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-disabled.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-focus.svg index 46f072b9fd..c28ccf7b0c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked-focus.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked.svg index 549f16326d..9a5b898e9c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/checked.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-disabled.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-disabled.svg index ae8e053c57..434e48a0d2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-disabled.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-disabled.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-focus.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-focus.svg index 0b46ffe90e..046789536b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-focus.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked-focus.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked.svg index dffc28bf80..2dcdfa5082 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toggleswitch/unchecked.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_object_to_surface.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_object_to_surface.svg index a8313223d8..487d9cd072 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_object_to_surface.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_object_to_surface.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_Object.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_Object.svg index 5c15b2db5a..c4daff9236 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_Object.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_Object.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_grid.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_grid.svg index 77403091e3..4f00356351 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_grid.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Align_to_grid.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Angle.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Angle.svg index 27fbfbdb73..541979364b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Angle.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Angle.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Audio.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Audio.svg index 06a6cb0e9d..81e8c02d63 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Audio.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Audio.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Database_view.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Database_view.svg index ac95009bbe..4cc69b9495 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Database_view.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Database_view.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Debugging.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Debugging.svg index c88c2298e5..196cbbc51c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Debugging.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Debugging.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Deploy.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Deploy.svg index a513091e86..8c7ace6b2d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Deploy.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Deploy.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Environment.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Environment.svg index e5b4d1b636..1d4d15fb60 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Environment.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Environment.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Flowgraph.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Flowgraph.svg index d3838cf1d3..88e8026085 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Flowgraph.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Flowgraph.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Follow_terrain.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Follow_terrain.svg index f2bce4b0d1..001b954d3a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Follow_terrain.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Follow_terrain.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Get_physics_state.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Get_physics_state.svg index ef5d9013b0..b0a4cbc682 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Get_physics_state.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Get_physics_state.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Grid.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Grid.svg index 971ee8c146..530c4b531c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Grid.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Grid.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Info.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Info.svg index 3f7d8d3b39..d1d2131d9b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Info.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Info.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/LUA.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/LUA.svg index a77acd9b1a..3726109ec3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/LUA.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/LUA.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Lighting.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Lighting.svg index 75d9245707..915290a5d6 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Lighting.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Lighting.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Load.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Load.svg index dabe9b8904..45e01f2492 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Load.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Load.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Locked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Locked.svg index 82ba30ae38..d7568fabf7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Locked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Locked.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Material.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Material.svg index a11292817c..2233100bd0 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Material.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Material.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Measure.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Measure.svg index f27c77d435..b8764f1edc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Measure.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Measure.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Move.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Move.svg index bf398e57ee..944ae9d4ce 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Move.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Move.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_follow_terrain.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_follow_terrain.svg index 9a9316a4e6..2737a0f6de 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_follow_terrain.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_follow_terrain.svg @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_height.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_height.svg index 5510c588c3..6320cde986 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_height.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_height.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_list.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_list.svg index 37a748789b..5d56d8f0ce 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_list.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Object_list.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Play.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Play.svg index 6a229e65bc..1869ac47ba 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Play.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Play.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Question.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Question.svg index 4217ce4434..1acf3b1905 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Question.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Question.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Redo.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Redo.svg index f9de53358f..dab24091f4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Redo.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Redo.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Reset_physics_state.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Reset_physics_state.svg index d94146aca6..d3fa517ba5 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Reset_physics_state.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Reset_physics_state.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Save.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Save.svg index 684edbc75f..0c4a7a70d0 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Save.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Save.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Scale.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Scale.svg index 1d16c0eb66..f0b5620bb9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Scale.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Scale.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select.svg index 3e58de0c3f..59a592f49d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select_terrain.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select_terrain.svg index 07a26bbb11..355995e44d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select_terrain.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Select_terrain.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Simulate_Physics_on_selected_objects.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Simulate_Physics_on_selected_objects.svg index c303c18ff3..7df2b8a715 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Simulate_Physics_on_selected_objects.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Simulate_Physics_on_selected_objects.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain.svg index da405bdb16..7ac00db06d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain_Texture.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain_Texture.svg index d64509b63c..60c4ac128c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain_Texture.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Terrain_Texture.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Translate.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Translate.svg index 06fc27722d..4f7245227e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Translate.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Translate.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Unlocked.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Unlocked.svg index bf91a07fba..3885554477 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Unlocked.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Unlocked.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Vertex_snapping.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Vertex_snapping.svg index 6381779410..736e0d6ded 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Vertex_snapping.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Vertex_snapping.svg @@ -22,4 +22,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/XY2_copy.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/XY2_copy.svg index be686b707e..8a0966d1fb 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/XY2_copy.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/XY2_copy.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/X_axis.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/X_axis.svg index 7cfc935ae5..26d203d895 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/X_axis.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/X_axis.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Y_axis.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Y_axis.svg index a91881cb7d..755f10a6c2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Y_axis.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Y_axis.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Z_axis.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Z_axis.svg index 8838a925b2..9be3f4da8b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Z_axis.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Z_axis.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/add_link.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/add_link.svg index 7398f002c0..4a527db749 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/add_link.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/add_link.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/particle.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/particle.svg index e5ae818435..388358cf88 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/particle.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/particle.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/remove_link.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/remove_link.svg index 770ed94c2a..8f5c97c5cd 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/remove_link.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/remove_link.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/select_object.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/select_object.svg index 345b33d9e4..0ee6b1e395 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/select_object.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/select_object.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/undo.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/undo.svg index 6165cfe8ee..160ec1e64b 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/undo.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/undo.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close.svg index 538d6057d7..ad8e2ea2c6 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_small.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_small.svg index 48cd38993c..a15c235115 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_small.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_small.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_x.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_x.svg index 990b8b1088..fc51f739f8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_x.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/close_x.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/help.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/help.svg index df2657a517..1c47280cde 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/help.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/help.svg @@ -1 +1 @@ -help \ No newline at end of file +help diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/hidden-icons.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/hidden-icons.svg index 8ede1d306a..1ac44add1d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/hidden-icons.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/hidden-icons.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-down.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-down.svg index f203b93b72..fdbd217188 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-down.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-down.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-up.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-up.svg index 1b44d8ea9b..d4809c56c8 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-up.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/indicator-arrow-up.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_off.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_off.svg index a2ef8be0de..d669d6d336 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_off.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_off.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_on.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_on.svg index 6732c6d1b7..89aaef4ac1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_on.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/lock_on.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/add-filter.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/add-filter.svg index 54b8f9d209..3963db6f64 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/add-filter.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/add-filter.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/copy.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/copy.svg index 876c451a56..e1e64f6716 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/copy.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/copy.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/debug.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/debug.svg index 12c649031c..ca350eca40 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/debug.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/debug.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/error.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/error.svg index 0b0885a984..6c79cd1c9c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/error.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/error.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/information.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/information.svg index 710dd02aea..7c4b8396b7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/information.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/information.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/pending.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/pending.svg index 73f663294c..181bbe38b4 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/pending.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/pending.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/processing.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/processing.svg index f7c24c1ede..0fa5ec5b69 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/processing.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/processing.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/reset.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/reset.svg index dc8c301eb9..29433ff84d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/reset.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/reset.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/valid.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/valid.svg index 38b16ea61e..668be9c547 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/valid.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/valid.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning-yellow.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning-yellow.svg index c69a2725a5..ae84495735 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning-yellow.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning-yellow.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning.svg index 07f5a71af0..504c7ed496 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/logging/warning.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/search.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/search.svg index ae39ed5ea6..36bc1b5ad3 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/search.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/search.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_off.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_off.svg index c8094337ea..92c7f9d126 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_off.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_off.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_on.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_on.svg index 9ace158977..386c4a4c6e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_on.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/tag_visibility_on.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg index 54f0e10960..33018dbeec 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg index e7007b6d62..2d3b999911 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_editoronly.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg index 2d206dd943..5544322cf2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/entity_notactive.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg index 32676441ff..6979b23e28 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/layer.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg index 71fc2c9c8c..324eacf60e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg index a7819953ba..a3449691a6 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Entity/prefab_edit.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Level/level.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Level/level.svg index 128ea738ac..3905c0eb42 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Level/level.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Level/level.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/checkmark.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/checkmark.svg index 5d648f5ea0..d612b35370 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/checkmark.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/checkmark.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/download.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/download.svg index f4521f343f..99f38ca290 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/download.svg +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/download.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/AzQtComponents/StyleGallery/MyCombo.cpp b/Code/Framework/AzQtComponents/AzQtComponents/StyleGallery/MyCombo.cpp index 32729c763f..893e18f7a9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/StyleGallery/MyCombo.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/StyleGallery/MyCombo.cpp @@ -17,4 +17,4 @@ MyComboBox::MyComboBox(QWidget *parent) } -#include "StyleGallery/moc_MyCombo.cpp" \ No newline at end of file +#include "StyleGallery/moc_MyCombo.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet1.qss b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet1.qss index dbad49d7c5..9c100f8435 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet1.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet1.qss @@ -1 +1 @@ -QLabel { background-color: red; } \ No newline at end of file +QLabel { background-color: red; } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet2.qss b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet2.qss index 25ce45f6d5..52ad095b91 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet2.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc1/sheet2.qss @@ -1 +1 @@ -QComboBox { color: blue; } \ No newline at end of file +QComboBox { color: blue; } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc2/sheet1.qss b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc2/sheet1.qss index 92ae6c1a26..da71c07b34 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc2/sheet1.qss +++ b/Code/Framework/AzQtComponents/AzQtComponents/Tests/qrc2/sheet1.qss @@ -1 +1 @@ -QLabel { background-color: blue; } \ No newline at end of file +QLabel { background-color: blue; } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/Conversions.h b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/Conversions.h index 5d0a37ac3c..a413900bf2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/Conversions.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/Conversions.h @@ -41,4 +41,4 @@ namespace AzQtComponents } -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.cpp index a488762280..59e1015f23 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.cpp @@ -73,4 +73,4 @@ namespace AzQtComponents EnableViewPaneDisabledGraphicsEffect(widget); } } -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.h b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.h index 6d966f8b35..9f6bdbd96d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/QtViewPaneEffects.h @@ -23,4 +23,4 @@ namespace AzQtComponents /// to show the widget as inactive. The reverse of this is applied when \p on is \p true. AZ_QT_COMPONENTS_API void SetWidgetInteractEnabled(QWidget* widget, bool on); -} // namespace AzQtComponents \ No newline at end of file +} // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_linux.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_linux.cpp index d93f9e0cdf..bd499d2cc9 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_linux.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_linux.cpp @@ -41,4 +41,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Utilities/moc_ScreenGrabber.cpp" \ No newline at end of file +#include "Utilities/moc_ScreenGrabber.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_mac.mm b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_mac.mm index 6a8b192310..e2e0d10669 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_mac.mm +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/ScreenGrabber_mac.mm @@ -73,4 +73,4 @@ namespace AzQtComponents } // namespace AzQtComponents -#include "Utilities/moc_ScreenGrabber.cpp" \ No newline at end of file +#include "Utilities/moc_ScreenGrabber.cpp" diff --git a/Code/Framework/AzQtComponents/AzQtComponents/natvis/qt.natvis b/Code/Framework/AzQtComponents/AzQtComponents/natvis/qt.natvis index b472ca5234..b4d33c4503 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/natvis/qt.natvis +++ b/Code/Framework/AzQtComponents/AzQtComponents/natvis/qt.natvis @@ -603,4 +603,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzQtComponents/CMakeLists.txt b/Code/Framework/AzQtComponents/CMakeLists.txt index f0b5e42d35..d0ba390027 100644 --- a/Code/Framework/AzQtComponents/CMakeLists.txt +++ b/Code/Framework/AzQtComponents/CMakeLists.txt @@ -115,4 +115,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_googletest( NAME AZ::AzQtComponents.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Code/Framework/AzQtComponents/Platform/Windows/platform_windows.cmake b/Code/Framework/AzQtComponents/Platform/Windows/platform_windows.cmake index f52adcc747..2ed79affc5 100644 --- a/Code/Framework/AzQtComponents/Platform/Windows/platform_windows.cmake +++ b/Code/Framework/AzQtComponents/Platform/Windows/platform_windows.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE Magnification.lib -) \ No newline at end of file +) diff --git a/Code/Framework/AzTest/AzTest/Platform/Common/WinAPI/AzTest/ColorizedOutput_WinAPI.cpp b/Code/Framework/AzTest/AzTest/Platform/Common/WinAPI/AzTest/ColorizedOutput_WinAPI.cpp index 702b59cda9..2146807a7c 100644 --- a/Code/Framework/AzTest/AzTest/Platform/Common/WinAPI/AzTest/ColorizedOutput_WinAPI.cpp +++ b/Code/Framework/AzTest/AzTest/Platform/Common/WinAPI/AzTest/ColorizedOutput_WinAPI.cpp @@ -32,4 +32,4 @@ namespace UnitTest return true; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorAnimationSystemRequestBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorAnimationSystemRequestBus.h index 392bd40af6..1745f87a79 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorAnimationSystemRequestBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorAnimationSystemRequestBus.h @@ -36,4 +36,4 @@ namespace AzToolsFramework }; using EditorAnimationSystemRequestsBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EntityCompositionNotificationBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EntityCompositionNotificationBus.h index 3fb60c6305..78a52a3a20 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EntityCompositionNotificationBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EntityCompositionNotificationBus.h @@ -52,4 +52,4 @@ namespace AzToolsFramework using EntityCompositionNotificationBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h index f12ab71936..83e40474d6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h @@ -348,6 +348,11 @@ namespace AzToolsFramework */ virtual bool AreAnyEntitiesSelected() = 0; + /*! + * Returns the number of selected entities. + */ + virtual int GetSelectedEntitiesCount() = 0; + /*! * Retrieves the set of selected entities. * \return a list of entity Ids. @@ -815,8 +820,6 @@ namespace AzToolsFramework /// Hide or show the circular dependency error when saving slices virtual void SetShowCircularDependencyError(const bool& /*showCircularDependencyError*/) {} - virtual void SetEditTool(const char* /*tool*/) {} - /// Launches the Lua editor and opens the specified (space separated) files. virtual void LaunchLuaEditor(const char* /*files*/) {} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.cpp index 4b6a134991..ba0f339890 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.cpp @@ -57,4 +57,4 @@ namespace AzToolsFramework } } -#include "Application/moc_Ticker.cpp" \ No newline at end of file +#include "Application/moc_Ticker.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.h index aa086d304d..3e2e4b9664 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/Ticker.h @@ -55,4 +55,4 @@ namespace AzToolsFramework float m_timeoutMS; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp index 22c1390828..50315e9d7a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp @@ -395,6 +395,7 @@ namespace AzToolsFramework ->Event("MarkEntityDeselected", &ToolsApplicationRequests::MarkEntityDeselected) ->Event("IsSelected", &ToolsApplicationRequests::IsSelected) ->Event("AreAnyEntitiesSelected", &ToolsApplicationRequests::AreAnyEntitiesSelected) + ->Event("GetSelectedEntitiesCount", &ToolsApplicationRequests::GetSelectedEntitiesCount) ; behaviorContext->EBus("ToolsApplicationNotificationBus") diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h index 0f038422ce..6c836ac888 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h @@ -101,6 +101,7 @@ namespace AzToolsFramework SourceControlFileInfo GetSceneSourceControlInfo() override; bool AreAnyEntitiesSelected() override { return !m_selectedEntities.empty(); } + int GetSelectedEntitiesCount() override { return m_selectedEntities.size(); } const EntityIdList& GetSelectedEntities() override { return m_selectedEntities; } const EntityIdList& GetHighlightedEntities() override { return m_highlightedEntities; } void SetSelectedEntities(const EntityIdList& selectedEntities) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChange.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChange.h index 0e12ee9a77..0a225f1c30 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChange.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChange.h @@ -165,4 +165,4 @@ namespace AzToolsFramework AZ::Data::AssetId m_assetId; }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChangeset.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChangeset.h index 059feb4b7c..08bf6b089c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChangeset.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetEntryChangeset.h @@ -75,4 +75,4 @@ namespace AzToolsFramework }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetSelectionModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetSelectionModel.h index 4ac199d0e2..59cc9d05e2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetSelectionModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetSelectionModel.h @@ -76,4 +76,4 @@ namespace AzToolsFramework QString m_title; }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntry.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntry.cpp index 85d5eaecea..abd1f91bf5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntry.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntry.cpp @@ -283,4 +283,4 @@ namespace AzToolsFramework } // namespace AssetBrowser } // namespace AzToolsFramework -#include "AssetBrowser/Entries/moc_AssetBrowserEntry.cpp" \ No newline at end of file +#include "AssetBrowser/Entries/moc_AssetBrowserEntry.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.cpp index 687a5d372b..32e902a805 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.cpp @@ -69,4 +69,4 @@ namespace AzToolsFramework m_absolutePathToFileId.clear(); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/FolderAssetBrowserEntry.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/FolderAssetBrowserEntry.h index f3702529c8..e41002f9ec 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/FolderAssetBrowserEntry.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/FolderAssetBrowserEntry.h @@ -55,4 +55,4 @@ namespace AzToolsFramework AZ_DISABLE_COPY_MOVE(FolderAssetBrowserEntry); }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h index 716bec0997..063db837df 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h @@ -63,4 +63,4 @@ namespace AzToolsFramework AZ_DISABLE_COPY_MOVE(ProductAssetBrowserEntry); }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.h index 9efec15ccb..44fe454e2d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/RootAssetBrowserEntry.h @@ -95,4 +95,4 @@ namespace AzToolsFramework bool m_isInitialUpdate = false; }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h index 200c116c4f..df9f6ed869 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h @@ -80,4 +80,4 @@ namespace AzToolsFramework AZ_DISABLE_COPY_MOVE(SourceAssetBrowserEntry); }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/EmptyPreviewer.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/EmptyPreviewer.h index 8754b2d177..874c10151c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/EmptyPreviewer.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/EmptyPreviewer.h @@ -47,4 +47,4 @@ namespace AzToolsFramework QScopedPointer m_ui; }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/Previewer.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/Previewer.cpp index 6c9ead840a..ea466bd65c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/Previewer.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/Previewer.cpp @@ -23,4 +23,4 @@ namespace AzToolsFramework } } -#include \ No newline at end of file +#include diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerBus.h index 5b6614852c..5b3bb734f5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerBus.h @@ -44,4 +44,4 @@ namespace AzToolsFramework using PreviewerRequestBus = AZ::EBus; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerFactory.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerFactory.h index 6dd269cf96..9351eca7a4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerFactory.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Previewer/PreviewerFactory.h @@ -34,4 +34,4 @@ namespace AzToolsFramework virtual const QString& GetName() const = 0; }; } // namespace AssetBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/Filter.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/Filter.cpp index 3b03d64fb5..ceda5f8e19 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/Filter.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/Filter.cpp @@ -613,4 +613,4 @@ namespace AzToolsFramework } // namespace AssetBrowser } // namespace AzToolsFramework -#include "AssetBrowser/Search/moc_Filter.cpp" \ No newline at end of file +#include "AssetBrowser/Search/moc_Filter.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.cpp index 7c2f26042f..d2edbcce32 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.cpp @@ -170,6 +170,15 @@ namespace AzToolsFramework return m_filter; } + QSharedPointer SearchWidget::GetStringFilter() const + { + return m_stringFilter; + } + + QSharedPointer SearchWidget::GetTypesFilter() const + { + return m_typesFilter; + } } // namespace AssetBrowser } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.h index 0453333c94..be649bc81d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/SearchWidget.h @@ -39,6 +39,10 @@ namespace AzToolsFramework QSharedPointer GetFilter() const; + QSharedPointer GetStringFilter() const; + + QSharedPointer GetTypesFilter() const; + QString GetFilterString() const { return textFilter(); } void ClearStringFilter() { ClearTextFilter(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/close.svg b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/close.svg index 538d6057d7..ad8e2ea2c6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/close.svg +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/close.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/search.svg b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/search.svg index ae39ed5ea6..36bc1b5ad3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/search.svg +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Search/search.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp index 0a25d1cf25..c1ba5ae9ce 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp @@ -139,8 +139,11 @@ namespace AzToolsFramework } else { - QPixmap pixmap = thumbnail->GetPixmap(size); - painter->drawPixmap(point.x(), point.y(), size.width(), size.height(), pixmap); + // Scaling and centering pixmap within bounds to preserve aspect ratio + const QPixmap pixmap = thumbnail->GetPixmap(size).scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + const QSize sizeDelta = size - pixmap.size(); + const QPoint pointDelta = QPoint(sizeDelta.width() / 2, sizeDelta.height() / 2); + painter->drawPixmap(point + pointDelta, pixmap); } return m_iconSize; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.h index 61ea9685a4..e4b9e33cff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFrameworkModule.h @@ -25,4 +25,4 @@ namespace AzToolsFramework AzToolsFrameworkModule(); ~AzToolsFrameworkModule() override = default; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.cpp index 4c1e2f792a..281caeff52 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.cpp @@ -72,4 +72,4 @@ namespace AzToolsFramework m_componentModeBuilders, m_transition); } } // namespace ComponentModeFramework -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.h index a64a3cc9ee..db7b46b03b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/ComponentModeCommand.h @@ -50,4 +50,4 @@ namespace AzToolsFramework Transition m_transition; ///< Entering/Leaving ComponentMode. }; } // namespace ComponentModeFramework -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.cpp index 9207652268..d1d312304c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.cpp @@ -105,4 +105,4 @@ namespace AzToolsFramework return PivotHasTranslationOverride(pivotOverride) || PivotHasOrientationOverride(pivotOverride); } -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.h index 178f387b3b..d7e9f0ee69 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/EntityManipulatorCommand.h @@ -103,4 +103,4 @@ namespace AzToolsFramework bool PivotHasOrientationOverride(AZ::u8 pivotOverride); bool PivotHasTransformOverride(AZ::u8 pivotOverride); -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.cpp index 39203b8bed..42f7ed9b55 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.cpp @@ -32,4 +32,4 @@ namespace AzToolsFramework { m_boxEdit.UpdateManipulators(); } -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.h index b3c878045f..b7172a921b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ComponentModes/BoxComponentMode.h @@ -40,4 +40,4 @@ namespace AzToolsFramework private: BoxViewportEdit m_boxEdit; }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContext.inl b/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContext.inl index dc22688d8e..b11afcb059 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContext.inl +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContext.inl @@ -183,4 +183,4 @@ namespace AzToolsFramework } // Debug } // AzToolsFramework -#endif // AZ_ENABLE_TRACE_CONTEXT \ No newline at end of file +#endif // AZ_ENABLE_TRACE_CONTEXT diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContextBufferedFormatter.inl b/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContextBufferedFormatter.inl index a308e22e05..a72838be07 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContextBufferedFormatter.inl +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContextBufferedFormatter.inl @@ -20,4 +20,4 @@ namespace AzToolsFramework return Print(buffer, size, stack, printUuids, startIndex); } } // Debug -} // AzToolsFramework \ No newline at end of file +} // AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp index ad458b0434..44c8487272 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextComponent.cpp @@ -491,6 +491,14 @@ namespace AzToolsFramework EditorEntityContextNotificationBus::Broadcast(&EditorEntityContextNotification::OnStartPlayInEditorBegin); + //cache the current selected entities. + ToolsApplicationRequests::Bus::BroadcastResult(m_selectedBeforeStartingGame, &ToolsApplicationRequests::GetSelectedEntities); + //deselect entities if selected when entering game mode before deactivating the entities in StartPlayInEditor(...) + if (!m_selectedBeforeStartingGame.empty()) + { + ToolsApplicationRequests::Bus::Broadcast(&ToolsApplicationRequests::MarkEntitiesDeselected, m_selectedBeforeStartingGame); + } + if (m_isLegacySliceService) { SliceEditorEntityOwnershipService* editorEntityOwnershipService = @@ -507,8 +515,6 @@ namespace AzToolsFramework m_isRunningGame = true; - ToolsApplicationRequests::Bus::BroadcastResult(m_selectedBeforeStartingGame, &ToolsApplicationRequests::GetSelectedEntities); - EditorEntityContextNotificationBus::Broadcast(&EditorEntityContextNotification::OnStartPlayInEditor); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextPickingBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextPickingBus.h index baa3e27e5f..c92365e383 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextPickingBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityContextPickingBus.h @@ -37,4 +37,4 @@ namespace AzToolsFramework using EditorEntityContextPickingRequestBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityFixupComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityFixupComponent.h index 913d5bce71..8989bfac00 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityFixupComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityFixupComponent.h @@ -36,4 +36,4 @@ namespace AzToolsFramework void OnSliceEntitiesLoaded(const AZStd::vector& entities) override; //////////////////////////////////////////////////////////////////////// }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModelBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModelBus.h index 6fd1e452f7..ac5be49bf7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModelBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntityModelBus.h @@ -25,4 +25,4 @@ namespace AzToolsFramework virtual void RemoveFromChildrenWithOverrides(const EntityIdList& parentEntityIds, const AZ::EntityId& entityId) = 0; }; using EditorEntityModelRequestBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index f272c3b428..19c236f509 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -31,11 +31,19 @@ namespace AzToolsFramework //! /param entities The entities to put under the new prefab. //! /param nestedPrefabInstances The nested prefab instances to put under the new prefab. //! /param filePath The filepath corresponding to the prefab file to be created. - //! /param instanceToParentUnder The instance under which the newly created prefab instance is parented under. + //! /param instanceToParentUnder The instance the newly created prefab instance is parented under. //! /return The optional reference to the prefab created. virtual Prefab::InstanceOptionalReference CreatePrefab( const AZStd::vector& entities, AZStd::vector>&& nestedPrefabInstances, AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0; + + //! Instantiate the prefab file provided. + //! /param filePath The filepath for the prefab file the instance should be created from. + //! /param instanceToParentUnder The instance the newly instantiated prefab instance is parented under. + //! /return The optional reference to the prefab instance. + virtual Prefab::InstanceOptionalReference InstantiatePrefab( + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0; + virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0; virtual bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 4b23b46ffd..81233069a9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +95,7 @@ namespace AzToolsFramework m_prefabSystemComponent->RemoveTemplate(templateId); } m_rootInstance->Reset(); + m_rootInstance->SetContainerEntityName("Level"); AzFramework::EntityOwnershipServiceNotificationBus::Event( m_entityContextId, &AzFramework::EntityOwnershipServiceNotificationBus::Events::OnEntityOwnershipServiceReset); @@ -198,6 +200,7 @@ namespace AzToolsFramework m_rootInstance->SetTemplateId(templateId); m_rootInstance->SetTemplateSourcePath(m_loaderInterface->GetRelativePathToProject(filename)); + m_rootInstance->SetContainerEntityName("Level"); m_prefabSystemComponent->PropagateTemplateChanges(templateId); return true; @@ -239,19 +242,6 @@ namespace AzToolsFramework return false; } } - else - { - // The template is already loaded, this is the case of either saving as same name or different name(loaded from before). - // Update the template with the changes - AzToolsFramework::Prefab::PrefabDom dom; - bool success = AzToolsFramework::Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(*m_rootInstance, dom); - if (!success) - { - AZ_Error("Prefab", false, "Failed to convert current root instance into a DOM when saving file '%.*s'", AZ_STRING_ARG(filename)); - return false; - } - m_prefabSystemComponent->UpdatePrefabTemplate(templateId, dom); - } Prefab::TemplateId prevTemplateId = m_rootInstance->GetTemplateId(); m_rootInstance->SetTemplateId(templateId); @@ -277,20 +267,51 @@ namespace AzToolsFramework AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) { AZStd::unique_ptr createdPrefabInstance = - m_prefabSystemComponent->CreatePrefab(entities, AZStd::move(nestedPrefabInstances), filePath); - - if (!instanceToParentUnder) - { - instanceToParentUnder = *m_rootInstance; - } + m_prefabSystemComponent->CreatePrefab(entities, AZStd::move(nestedPrefabInstances), filePath, nullptr, false); if (createdPrefabInstance) { + if (!instanceToParentUnder) + { + instanceToParentUnder = *m_rootInstance; + } + + Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance)); + AZ::Entity* containerEntity = addedInstance.m_containerEntity.get(); + containerEntity->AddComponent(aznew Prefab::EditorPrefabComponent()); + HandleEntitiesAdded({containerEntity}); + HandleEntitiesAdded(entities); + + // Update the template of the instance since we modified the entities of the instance by calling HandleEntitiesAdded. + Prefab::PrefabDom serializedInstance; + if (Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(addedInstance, serializedInstance)) + { + m_prefabSystemComponent->UpdatePrefabTemplate(addedInstance.GetTemplateId(), serializedInstance); + } + + return addedInstance; + } + + return AZStd::nullopt; + } + + Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::InstantiatePrefab( + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) + { + AZStd::unique_ptr createdPrefabInstance = m_prefabSystemComponent->InstantiatePrefab(filePath); + + if (createdPrefabInstance) + { + if (!instanceToParentUnder) + { + instanceToParentUnder = *m_rootInstance; + } + Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance)); HandleEntitiesAdded({addedInstance.m_containerEntity.get()}); return addedInstance; } - HandleEntitiesAdded(entities); + return AZStd::nullopt; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index ad11547506..9c483e61c5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -186,11 +186,14 @@ namespace AzToolsFramework PlayInEditorData m_playInEditorData; ////////////////////////////////////////////////////////////////////////// - // PrefabSystemComponentInterface interface implementation + // PrefabEditorEntityOwnershipInterface implementation Prefab::InstanceOptionalReference CreatePrefab( const AZStd::vector& entities, AZStd::vector>&& nestedPrefabInstances, AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) override; + Prefab::InstanceOptionalReference InstantiatePrefab( + AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) override; + Prefab::InstanceOptionalReference GetRootPrefabInstance() override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/BoxManipulatorRequestBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/BoxManipulatorRequestBus.h index 8e08f9cb36..05da73fa20 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/BoxManipulatorRequestBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/BoxManipulatorRequestBus.h @@ -48,4 +48,4 @@ namespace AzToolsFramework /// Type to inherit to implement BoxManipulatorRequests using BoxManipulatorRequestBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserBus.h index 4b4507df59..b0d625b6e4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserBus.h @@ -40,4 +40,4 @@ namespace AzToolsFramework using MaterialBrowserRequestBus = AZ::EBus; } // namespace MaterialBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserComponent.h index 709367dd71..93a48cf22c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/MaterialBrowser/MaterialBrowserComponent.h @@ -38,4 +38,4 @@ namespace AzToolsFramework static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); }; } // namespace MaterialBrowser -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/ContextBoundAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/ContextBoundAPI.h index c4c2a95fd6..4a053ea758 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/ContextBoundAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/ContextBoundAPI.h @@ -216,4 +216,4 @@ namespace AzToolsFramework ///< intersecting point. }; } // namespace Picking -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBoundManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBoundManager.h index 90aa886ab8..78e714c256 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBoundManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBoundManager.h @@ -52,4 +52,4 @@ namespace AzToolsFramework RegisteredBoundId m_nextBoundId = RegisteredBoundId(1); ///< Next bound id to use when a bound is registered. }; } // namespace Picking -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp index 12d676a0b4..8f14429cd0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/EditorPrefabComponent.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp index 0a5b43482e..eb247369c5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp @@ -123,7 +123,11 @@ namespace AzToolsFramework void Instance::SetTemplateSourcePath(AZ::IO::PathView sourcePath) { m_templateSourcePath = sourcePath; - m_containerEntity->SetName(sourcePath.Filename().Native()); + } + + void Instance::SetContainerEntityName(AZStd::string_view containerName) + { + m_containerEntity->SetName(containerName); } bool Instance::AddEntity(AZ::Entity& entity) @@ -317,7 +321,6 @@ namespace AzToolsFramework removedNestedInstance = AZStd::move(nestedInstanceIterator->second); removedNestedInstance->m_parent = nullptr; - removedNestedInstance->m_alias = InstanceAlias(); m_nestedInstances.erase(instanceAlias); } @@ -392,6 +395,14 @@ namespace AzToolsFramework } } + void Instance::GetNestedInstances(const AZStd::function&)>& callback) + { + for (auto& [instanceAlias, instance] : m_nestedInstances) + { + callback(instance); + } + } + void Instance::GetEntities(const AZStd::function&)>& callback) { for (auto& [entityAlias, entity] : m_entities) @@ -563,7 +574,7 @@ namespace AzToolsFramework AZ::EntityId Instance::GetContainerEntityId() const { - return m_containerEntity->GetId(); + return m_containerEntity ? m_containerEntity->GetId() : AZ::EntityId(); } bool Instance::HasContainerEntity() const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h index d1c7a4d853..821478b706 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h @@ -80,6 +80,7 @@ namespace AzToolsFramework const AZ::IO::Path& GetTemplateSourcePath() const; void SetTemplateSourcePath(AZ::IO::PathView sourcePath); + void SetContainerEntityName(AZStd::string_view containerName); bool AddEntity(AZ::Entity& entity); bool AddEntity(AZ::Entity& entity, EntityAlias entityAlias); @@ -113,6 +114,7 @@ namespace AzToolsFramework void GetConstEntities(const AZStd::function& callback); void GetNestedEntities(const AZStd::function&)>& callback); void GetEntities(const AZStd::function&)>& callback); + void GetNestedInstances(const AZStd::function&)>& callback); /** * Gets the alias for a given EnitityId in the Instance DOM. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp index bd02f3cd9b..836140eb74 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceSerializer.cpp @@ -200,7 +200,7 @@ namespace AzToolsFramework } return context.Report(result, - result.GetProcessing() == JSR::Processing::Completed ? "Succesfully loaded instance information for prefab." : + result.GetProcessing() == JSR::Processing::Completed ? "Successfully loaded instance information for prefab." : "Failed to load instance information for prefab"); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp index 65de6b713c..80ac86c974 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceUpdateExecutor.cpp @@ -15,14 +15,15 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include -#include namespace AzToolsFramework { @@ -89,17 +90,13 @@ namespace AzToolsFramework if (instanceCountToUpdateInBatch > 0) { + // Notify Propagation has begun + PrefabPublicNotificationBus::Broadcast(&PrefabPublicNotifications::OnPrefabInstancePropagationBegin); + EntityIdList selectedEntityIds; ToolsApplicationRequestBus::BroadcastResult(selectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, EntityIdList()); - // Disable the Outliner to avoid showing the propagation steps - EntityOutlinerWidgetInterface* entityOutlinerWidgetInterface = AZ::Interface::Get(); - if (entityOutlinerWidgetInterface) - { - entityOutlinerWidgetInterface->SetUpdatesEnabled(false); - } - for (int i = 0; i < instanceCountToUpdateInBatch; ++i) { Instance* instanceToUpdate = m_instancesUpdateQueue.front(); @@ -116,10 +113,24 @@ namespace AzToolsFramework "Could not find Template using Id '%llu'. Unable to update Instance.", currentTemplateId); + // Remove the instance from update queue if its corresponding template couldn't be found isUpdateSuccessful = false; + m_instancesUpdateQueue.pop(); + continue; } } + auto findInstancesResult = m_templateInstanceMapperInterface->FindInstancesOwnedByTemplate(instanceTemplateId)->get(); + + if (findInstancesResult.find(instanceToUpdate) == findInstancesResult.end()) + { + // Since nested instances get reconstructed during propagation, remove any nested instance that no longer + // maps to a template. + isUpdateSuccessful = false; + m_instancesUpdateQueue.pop(); + continue; + } + Template& currentTemplate = currentTemplateReference->get(); Instance::EntityList newEntities; if (PrefabDomUtils::LoadInstanceFromPrefabDom(*instanceToUpdate, newEntities, currentTemplate.GetPrefabDom())) @@ -139,23 +150,22 @@ namespace AzToolsFramework } m_instancesUpdateQueue.pop(); - } - ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, selectedEntityIds); - - // Enable the Outliner - if (entityOutlinerWidgetInterface) + for (auto entityIdIterator = selectedEntityIds.begin(); entityIdIterator != selectedEntityIds.end(); entityIdIterator++) { - entityOutlinerWidgetInterface->SetUpdatesEnabled(true); - - auto prefabPublicInterface = AZ::Interface::Get(); - if (prefabPublicInterface) + // Since entities get recreated during propagation, we need to check whether the entities correspoding to the list + // of selected entity ids are present or not. + AZ::Entity* entity = GetEntityById(*entityIdIterator); + if (entity == nullptr) { - AZ::EntityId rootEntityId = prefabPublicInterface->GetLevelInstanceContainerEntityId(); - entityOutlinerWidgetInterface->ExpandEntityChildren(rootEntityId); + selectedEntityIds.erase(entityIdIterator--); } } + ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequests::SetSelectedEntities, selectedEntityIds); + + // Notify Propagation has ended + PrefabPublicNotificationBus::Broadcast(&PrefabPublicNotifications::OnPrefabInstancePropagationEnd); } m_updatingTemplateInstancesInQueue = false; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp index 621a00b0bf..4dd31814b7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp @@ -230,6 +230,10 @@ namespace AzToolsFramework AZ_Assert(instanceDom.IsObject(), "Link Id '%u' cannot be added because the DOM of the instance is not an object.", m_id); instanceDom.AddMember(rapidjson::StringRef(PrefabDomUtils::LinkIdName), rapidjson::Value().SetUint64(m_id), allocator); } + else + { + linkIdReference->get().SetUint64(m_id); + } } } // namespace Prefab diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index c64a9491c5..1e9cc35230 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -15,15 +15,16 @@ #include #include +#include #include #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -37,12 +38,14 @@ namespace AzToolsFramework void PrefabPublicHandler::RegisterPrefabPublicHandlerInterface() { m_instanceEntityMapperInterface = AZ::Interface::Get(); - AZ_Assert( - m_instanceEntityMapperInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceEntityMapperInterface"); + AZ_Assert(m_instanceEntityMapperInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceEntityMapperInterface"); m_instanceToTemplateInterface = AZ::Interface::Get(); AZ_Assert(m_instanceToTemplateInterface, "PrefabPublicHandler - Could not retrieve instance of InstanceToTemplateInterface"); + m_prefabLoaderInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabLoaderInterface, "Could not get PrefabLoaderInterface on PrefabPublicHandler construction."); + m_prefabSystemComponentInterface = AZ::Interface::Get(); AZ_Assert(m_prefabSystemComponentInterface, "Could not get PrefabSystemComponentInterface on PrefabPublicHandler construction."); @@ -59,113 +62,234 @@ namespace AzToolsFramework } PrefabOperationResult PrefabPublicHandler::CreatePrefab(const AZStd::vector& entityIds, AZ::IO::PathView filePath) + { + EntityList inputEntityList, topLevelEntities; + AZ::EntityId commonRootEntityId; + InstanceOptionalReference commonRootEntityOwningInstance; + PrefabOperationResult findCommonRootOutcome = FindCommonRootOwningInstance( + entityIds, inputEntityList, topLevelEntities, commonRootEntityId, commonRootEntityOwningInstance); + if (!findCommonRootOutcome.IsSuccess()) + { + return findCommonRootOutcome; + } + + InstanceOptionalReference instanceToCreate; + { + // Initialize Undo Batch object + ScopedUndoBatch undoBatch("Create Prefab"); + + PrefabDom commonRootInstanceDomBeforeCreate; + m_instanceToTemplateInterface->GenerateDomForInstance( + commonRootInstanceDomBeforeCreate, commonRootEntityOwningInstance->get()); + + AZStd::vector entities; + AZStd::vector> instances; + + // Retrieve all entities affected and identify Instances + if (!RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, commonRootEntityOwningInstance->get(), entities, instances)) + { + return AZ::Failure( + AZStd::string("Could not create a new prefab out of the entities provided - entities do not share a common root.")); + } + + // When we create a prefab with other prefab instances, we have to remove the existing links between the source and + // target templates of the other instances. + for (auto& nestedInstance : instances) + { + PrefabUndoHelpers::RemoveLink( + nestedInstance->GetTemplateId(), commonRootEntityOwningInstance->get().GetTemplateId(), + nestedInstance->GetInstanceAlias(), nestedInstance->GetLinkId(), undoBatch.GetUndoBatch()); + } + + PrefabUndoHelpers::UpdatePrefabInstance( + commonRootEntityOwningInstance->get(), "Update prefab instance", commonRootInstanceDomBeforeCreate, + undoBatch.GetUndoBatch()); + + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + if (!prefabEditorEntityOwnershipInterface) + { + return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - internal error " + "(PrefabEditorEntityOwnershipInterface unavailable).")); + } + + // Create the Prefab + instanceToCreate = prefabEditorEntityOwnershipInterface->CreatePrefab( + entities, AZStd::move(instances), filePath, commonRootEntityOwningInstance); + + if (!instanceToCreate) + { + return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - internal error " + "(A null instance is returned).")); + } + + AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId(); + + instanceToCreate->get().GetNestedInstances([&](AZStd::unique_ptr& nestedInstance) { + AZ_Assert(nestedInstance, "Invalid nested instance found in the new prefab created."); + EntityOptionalReference nestedInstanceContainerEntity = nestedInstance->GetContainerEntity(); + AZ_Assert( + nestedInstanceContainerEntity, "Invalid container entity found for the nested instance used in prefab creation."); + CreateLink( + {&nestedInstanceContainerEntity->get()}, *nestedInstance, instanceToCreate->get().GetTemplateId(), + undoBatch.GetUndoBatch(), containerEntityId); + }); + + CreateLink( + topLevelEntities, instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(), undoBatch.GetUndoBatch(), + commonRootEntityId); + + // Change top level entities to be parented to the container entity + // Mark them as dirty so this change is correctly applied to the template + for (AZ::Entity* topLevelEntity : topLevelEntities) + { + m_prefabUndoCache.UpdateCache(topLevelEntity->GetId()); + undoBatch.MarkEntityDirty(topLevelEntity->GetId()); + AZ::TransformBus::Event(topLevelEntity->GetId(), &AZ::TransformBus::Events::SetParent, containerEntityId); + } + + // Select Container Entity + { + auto selectionUndo = aznew SelectionCommand({containerEntityId}, "Select Prefab Container Entity"); + selectionUndo->SetParent(undoBatch.GetUndoBatch()); + ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequestBus::Events::RunRedoSeparately, selectionUndo); + } + } + + // Save Template to file + m_prefabLoaderInterface->SaveTemplate(instanceToCreate->get().GetTemplateId()); + + return AZ::Success(); + } + + PrefabOperationResult PrefabPublicHandler::InstantiatePrefab( + AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) + { + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + if (!prefabEditorEntityOwnershipInterface) + { + return AZ::Failure(AZStd::string("Could not instantiate prefab - internal error " + "(PrefabEditorEntityOwnershipInterface unavailable).")); + } + + InstanceOptionalReference instanceToParentUnder; + + // Get parent entity and owning instance + if (parent.IsValid()) + { + instanceToParentUnder = m_instanceEntityMapperInterface->FindOwningInstance(parent); + } + + if (!instanceToParentUnder.has_value()) + { + instanceToParentUnder = prefabEditorEntityOwnershipInterface->GetRootPrefabInstance(); + parent = instanceToParentUnder->get().GetContainerEntityId(); + } + + { + // Initialize Undo Batch object + ScopedUndoBatch undoBatch("Instantiate Prefab"); + + PrefabDom instanceToParentUnderDomBeforeCreate; + m_instanceToTemplateInterface->GenerateDomForInstance( + instanceToParentUnderDomBeforeCreate, instanceToParentUnder->get()); + + // Instantiate the Prefab + auto instanceToCreate = prefabEditorEntityOwnershipInterface->InstantiatePrefab(filePath, instanceToParentUnder); + + if (!instanceToCreate) + { + return AZ::Failure(AZStd::string("Could not instantiate the prefab provided - internal error " + "(A null instance is returned).")); + } + + PrefabUndoHelpers::UpdatePrefabInstance( + instanceToParentUnder->get(), "Update prefab instance", instanceToParentUnderDomBeforeCreate, undoBatch.GetUndoBatch()); + + CreateLink({}, instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), + undoBatch.GetUndoBatch(), parent); + AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId(); + + // Apply position + AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetWorldTranslation, position); + } + + return AZ::Success(); + } + + PrefabOperationResult PrefabPublicHandler::FindCommonRootOwningInstance( + const AZStd::vector& entityIds, EntityList& inputEntityList, EntityList& topLevelEntities, + AZ::EntityId& commonRootEntityId, InstanceOptionalReference& commonRootEntityOwningInstance) { // Retrieve entityList from entityIds - EntityList inputEntityList = EntityIdListToEntityList(entityIds); + inputEntityList = EntityIdListToEntityList(entityIds); // Find common root and top level entities bool entitiesHaveCommonRoot = false; - AZ::EntityId commonRootEntityId; - EntityList topLevelEntities; AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( - entitiesHaveCommonRoot, - &AzToolsFramework::ToolsApplicationRequests::FindCommonRootInactive, - inputEntityList, - commonRootEntityId, - &topLevelEntities - ); + entitiesHaveCommonRoot, &AzToolsFramework::ToolsApplicationRequests::FindCommonRootInactive, inputEntityList, + commonRootEntityId, &topLevelEntities); // Bail if entities don't share a common root if (!entitiesHaveCommonRoot) { - return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - entities do not share a common root.")); - } - - AZ::Entity* commonRootEntity = nullptr; - if (commonRootEntityId.IsValid()) - { - commonRootEntity = GetEntityById(commonRootEntityId); + return AZ::Failure(AZStd::string("Failed to create a prefab: Provided entities do not share a common root.")); } // Retrieve the owning instance of the common root entity, which will be our new instance's parent instance. - InstanceOptionalReference commonRootEntityOwningInstance = GetOwnerInstanceByEntityId(commonRootEntityId); - AZ_Assert(commonRootEntityOwningInstance.has_value(), "Failed to create prefab : " - "Couldn't get a valid owning instance for the common root entity of the enities provided"); - - AZStd::vector entities; - AZStd::vector> instances; - - // Retrieve all entities affected and identify Instances - if (!RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, commonRootEntityOwningInstance->get(), entities, instances)) + commonRootEntityOwningInstance = GetOwnerInstanceByEntityId(commonRootEntityId); + if (!commonRootEntityOwningInstance) { - return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - entities do not share a common root.")); + AZ_Assert( + false, + "Failed to create prefab : Couldn't get a valid owning instance for the common root entity of the enities provided"); + return AZ::Failure(AZStd::string( + "Failed to create prefab : Couldn't get a valid owning instance for the common root entity of the enities provided")); } + return AZ::Success(); + } - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - if (!prefabEditorEntityOwnershipInterface) - { - return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - internal error " - "(PrefabEditorEntityOwnershipInterface unavailable).")); - } + void PrefabPublicHandler::CreateLink( + const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId, + UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId) + { + AZ::EntityId containerEntityId = sourceInstance.GetContainerEntityId(); + AZ::Entity* containerEntity = GetEntityById(containerEntityId); + Prefab::PrefabDom containerEntityDomBefore; + m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity); - InstanceOptionalReference instance = prefabEditorEntityOwnershipInterface->CreatePrefab( - entities, AZStd::move(instances), filePath, commonRootEntityOwningInstance); - - if (!instance) - { - return AZ::Failure(AZStd::string("Could not create a new prefab out of the entities provided - internal error " - "(A null instance is returned).")); - } - - AZ::EntityId containerEntityId = instance->get().GetContainerEntityId(); AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero()); AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero()); // Set the transform (translation, rotation) of the container entity GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation); + // Set container entity to be child of common root + AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId); + AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation); AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation); - // Set container entity to be child of common root - AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId); - - // Assign the EditorPrefabComponent to the instance container - EntityCompositionRequests::AddComponentsOutcome outcome; - EntityCompositionRequestBus::BroadcastResult( - outcome, &EntityCompositionRequests::AddComponentsToEntities, EntityIdList{containerEntityId}, - AZ::ComponentTypeList{azrtti_typeid()}); - - // Change top level entities to be parented to the container entity - for (AZ::Entity* topLevelEntity : topLevelEntities) - { - AZ::TransformBus::Event(topLevelEntity->GetId(), &AZ::TransformBus::Events::SetParent, containerEntityId); - } - - return AZ::Success(); - } + PrefabDom containerEntityDomAfter; + m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity); - PrefabOperationResult PrefabPublicHandler::InstantiatePrefab(AZStd::string_view /*filePath*/, AZ::EntityId /*parent*/, AZ::Vector3 /*position*/) - { - return AZ::Failure(AZStd::string("Prefab - InstantiatePrefab is yet to be implemented.")); + PrefabDom patch; + m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter); + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId); + + LinkId linkId = PrefabUndoHelpers::CreateLink( + sourceInstance.GetTemplateId(), targetTemplateId, patch, sourceInstance.GetInstanceAlias(), + undoBatch); + + sourceInstance.SetLinkId(linkId); + + // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes + m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter)); } PrefabOperationResult PrefabPublicHandler::SavePrefab(AZ::IO::Path filePath) { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - if (!prefabSystemComponentInterface) - { - AZ_Assert( - false, - "Prefab - PrefabPublicHandler - " - "Prefab System Component Interface could not be found. " - "Check that it is being correctly initialized."); - return AZ::Failure( - AZStd::string("SavePrefab - Internal error (Prefab System Component Interface could not be found).")); - } - - auto templateId = prefabSystemComponentInterface->GetTemplateIdFromFilePath(filePath.c_str()); + auto templateId = m_prefabSystemComponentInterface->GetTemplateIdFromFilePath(filePath.c_str()); if (templateId == InvalidTemplateId) { @@ -173,14 +297,7 @@ namespace AzToolsFramework AZStd::string("SavePrefab - Path error. Path could be invalid, or the prefab may not be loaded in this level.")); } - auto prefabLoaderInterface = AZ::Interface::Get(); - if (prefabLoaderInterface == nullptr) - { - return AZ::Failure(AZStd::string( - "Could not save prefab - internal error (PrefabLoaderInterface unavailable).")); - } - - if (!prefabLoaderInterface->SaveTemplate(templateId)) + if (!m_prefabLoaderInterface->SaveTemplate(templateId)) { return AZ::Failure(AZStd::string("Could not save prefab - internal error (Json write operation failure).")); } @@ -257,17 +374,17 @@ namespace AzToolsFramework AZ::EntityId entityId, UndoSystem::URSequencePoint* parentUndoBatch) { // Create Undo node on entities if they belong to an instance - InstanceOptionalReference instanceOptionalReference = m_instanceEntityMapperInterface->FindOwningInstance(entityId); + InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); - if (instanceOptionalReference.has_value()) + if (owningInstance.has_value()) { - PrefabDom beforeState; - m_prefabUndoCache.Retrieve(entityId, beforeState); - PrefabDom afterState; AZ::Entity* entity = GetEntityById(entityId); if (entity) { + PrefabDom beforeState; + m_prefabUndoCache.Retrieve(entityId, beforeState); + m_instanceToTemplateInterface->GenerateDomForEntity(afterState, *entity); PrefabDom patch; @@ -275,18 +392,36 @@ namespace AzToolsFramework if (patch.IsArray() && !patch.Empty() && beforeState.IsObject()) { - // Update the state of the entity - PrefabUndoEntityUpdate* state = aznew PrefabUndoEntityUpdate(AZStd::to_string(static_cast(entityId))); - state->SetParent(parentUndoBatch); - state->Capture(beforeState, afterState, entityId); + if (IsInstanceContainerEntity(entityId) && !IsLevelInstanceContainerEntity(entityId)) + { + m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, entityId); - state->Redo(); + // Save these changes as patches to the link + PrefabUndoLinkUpdate* linkUpdate = + aznew PrefabUndoLinkUpdate(AZStd::to_string(static_cast(entityId))); + linkUpdate->SetParent(parentUndoBatch); + linkUpdate->Capture(patch, owningInstance->get().GetLinkId()); + + linkUpdate->Redo(); + } + else + { + // Update the state of the entity + PrefabUndoEntityUpdate* state = aznew PrefabUndoEntityUpdate(AZStd::to_string(static_cast(entityId))); + state->SetParent(parentUndoBatch); + state->Capture(beforeState, afterState, entityId); + + state->Redo(); + } } // Update the cache m_prefabUndoCache.Store(entityId, AZStd::move(afterState)); } - + else + { + m_prefabUndoCache.PurgeCache(entityId); + } } } @@ -370,26 +505,14 @@ namespace AzToolsFramework PrefabRequestResult PrefabPublicHandler::HasUnsavedChanges(AZ::IO::Path prefabFilePath) const { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - if (!prefabSystemComponentInterface) - { - AZ_Assert( - false, - "Prefab - PrefabPublicHandler - " - "Prefab System Component Interface could not be found. " - "Check that it is being correctly initialized."); - return AZ::Failure( - AZStd::string("HasUnsavedChanges - Internal error (Prefab System Component Interface could not be found).")); - } - - auto templateId = prefabSystemComponentInterface->GetTemplateIdFromFilePath(prefabFilePath.c_str()); + auto templateId = m_prefabSystemComponentInterface->GetTemplateIdFromFilePath(prefabFilePath.c_str()); if (templateId == InvalidTemplateId) { return AZ::Failure(AZStd::string("HasUnsavedChanges - Path error. Path could be invalid, or the prefab may not be loaded in this level.")); } - return AZ::Success(prefabSystemComponentInterface->IsTemplateDirty(templateId)); + return AZ::Success(m_prefabSystemComponentInterface->IsTemplateDirty(templateId)); } PrefabOperationResult PrefabPublicHandler::DeleteEntitiesInInstance(const EntityIdList& entityIds) @@ -653,7 +776,7 @@ namespace AzToolsFramework InstanceOptionalReference owningInstance = m_instanceEntityMapperInterface->FindOwningInstance(entity->GetId()); AZ_Assert( owningInstance.has_value(), - "An error occored while retrieving entities and prefab instances : " + "An error occurred while retrieving entities and prefab instances : " "Owning instance of entity with id '%llu' couldn't be found", entity->GetId()); @@ -737,7 +860,7 @@ namespace AzToolsFramework { AZ_Assert( false, - "An error occored in function EntitiesBelongToSameInstance: " + "An error occurred in function EntitiesBelongToSameInstance: " "Owning instance of entity with id '%llu' couldn't be found", entityId); return false; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h index d9dba2a32e..e83513dbff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h @@ -27,8 +27,10 @@ namespace AzToolsFramework namespace Prefab { class Instance; + class InstanceEntityMapperInterface; class InstanceToTemplateInterface; + class PrefabLoaderInterface; class PrefabSystemComponentInterface; class PrefabPublicHandler final @@ -43,7 +45,7 @@ namespace AzToolsFramework // PrefabPublicInterface... PrefabOperationResult CreatePrefab(const AZStd::vector& entityIds, AZ::IO::PathView filePath) override; - PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, AZ::Vector3 position) override; + PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override; PrefabOperationResult SavePrefab(AZ::IO::Path filePath) override; PrefabEntityResult CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) override; @@ -67,12 +69,40 @@ namespace AzToolsFramework InstanceOptionalReference GetOwnerInstanceByEntityId(AZ::EntityId entityId) const; bool EntitiesBelongToSameInstance(const EntityIdList& entityIds) const; + /** + * Creates a link between the templates of an instance and its parent. + * + * \param topLevelEntities The list of entities that are immediate children to the container entity of the instance. + * \param sourceInstance The instance that corresponds to the source template of the link. + * \param targetInstance The id of the target template. + * \param undoBatch The undo batch to set as parent for this create link action. + * \param commonRootEntityId The id of the entity that the source instance should be parented under. + */ + void CreateLink( + const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId, + UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId); + + /** + * Given a list of entityIds, finds the prefab instance that owns the common root entity of the entityIds. + * + * \param entityIds The list of entity ids. + * \param inputEntityList The list of entities corresponding to the entity ids. + * \param topLevelEntities The list of entities that are immediate children of the common root entity. + * \param commonRootEntityId The entity id of the common root entity of all the entityIds. + * \param commonRootEntityOwningInstance The owning instance of the common root entity. + * \return PrefabOperationResult indicating whether the action was successful or not. + */ + PrefabOperationResult FindCommonRootOwningInstance( + const AZStd::vector& entityIds, EntityList& inputEntityList, EntityList& topLevelEntities, + AZ::EntityId& commonRootEntityId, InstanceOptionalReference& commonRootEntityOwningInstance); + static Instance* GetParentInstance(Instance* instance); static Instance* GetAncestorOfInstanceThatIsChildOfRoot(const Instance* ancestor, Instance* descendant); static void GenerateContainerEntityTransform(const EntityList& topLevelEntities, AZ::Vector3& translation, AZ::Quaternion& rotation); InstanceEntityMapperInterface* m_instanceEntityMapperInterface = nullptr; InstanceToTemplateInterface* m_instanceToTemplateInterface = nullptr; + PrefabLoaderInterface* m_prefabLoaderInterface = nullptr; PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; // Caches entity states for undo/redo purposes diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h index 4e59729ab2..1a8da0dfe0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h @@ -58,7 +58,7 @@ namespace AzToolsFramework * @param position The position in world space the prefab should be instantiated in. * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. */ - virtual PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, AZ::Vector3 position) = 0; + virtual PrefabOperationResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) = 0; /** * Saves changes to prefab to disk. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicNotificationBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicNotificationBus.h new file mode 100644 index 0000000000..fc5879f776 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicNotificationBus.h @@ -0,0 +1,34 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include + +namespace AzToolsFramework +{ + namespace Prefab + { + class PrefabPublicNotifications + : public AZ::EBusTraits + { + public: + virtual ~PrefabPublicNotifications() = default; + + virtual void OnPrefabInstancePropagationBegin() {} + virtual void OnPrefabInstancePropagationEnd() {} + }; + + using PrefabPublicNotificationBus = AZ::EBus; + + } // namespace Prefab +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index bf9fd658c6..40c8b3bc6a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -91,8 +91,9 @@ namespace AzToolsFramework m_instanceUpdateExecutor.UpdateTemplateInstancesInQueue(); } - AZStd::unique_ptr PrefabSystemComponent::CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, - AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity) + AZStd::unique_ptr PrefabSystemComponent::CreatePrefab( + const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, + AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity, bool shouldCreateLinks) { AZ::IO::Path relativeFilePath = m_prefabLoader.GetRelativePathToProject(filePath); if (GetTemplateIdFromFilePath(relativeFilePath) != InvalidTemplateId) @@ -104,7 +105,6 @@ namespace AzToolsFramework return nullptr; } - AZStd::unique_ptr newInstance = AZStd::make_unique(AZStd::move(containerEntity)); for (AZ::Entity* entity : entities) @@ -122,8 +122,9 @@ namespace AzToolsFramework } newInstance->SetTemplateSourcePath(relativeFilePath); + newInstance->SetContainerEntityName(relativeFilePath.Stem().Native()); - TemplateId newTemplateId = CreateTemplateFromInstance(*newInstance); + TemplateId newTemplateId = CreateTemplateFromInstance(*newInstance, shouldCreateLinks); if (newTemplateId == InvalidTemplateId) { AZ_Error("Prefab", false, @@ -142,7 +143,6 @@ namespace AzToolsFramework void PrefabSystemComponent::PropagateTemplateChanges(TemplateId templateId) { - UpdatePrefabInstances(templateId); auto templateIdToLinkIdsIterator = m_templateToLinkIdsMap.find(templateId); if (templateIdToLinkIdsIterator != m_templateToLinkIdsMap.end()) { @@ -153,15 +153,24 @@ namespace AzToolsFramework templateIdToLinkIdsIterator->second.end())); UpdateLinkedInstances(linkIdsToUpdateQueue); } + else + { + UpdatePrefabInstances(templateId); + } } void PrefabSystemComponent::UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) { - PrefabDom& templateDomToUpdate = FindTemplateDom(templateId); - if (AZ::JsonSerialization::Compare(templateDomToUpdate, updatedDom) != AZ::JsonSerializerCompareResult::Equal) + auto templateToUpdate = FindTemplate(templateId); + if (templateToUpdate) { - templateDomToUpdate.CopyFrom(updatedDom, templateDomToUpdate.GetAllocator()); - PropagateTemplateChanges(templateId); + PrefabDom& templateDomToUpdate = templateToUpdate->get().GetPrefabDom(); + if (AZ::JsonSerialization::Compare(templateDomToUpdate, updatedDom) != AZ::JsonSerializerCompareResult::Equal) + { + templateDomToUpdate.CopyFrom(updatedDom, templateDomToUpdate.GetAllocator()); + templateToUpdate->get().MarkAsDirty(true); + PropagateTemplateChanges(templateId); + } } } @@ -252,6 +261,29 @@ namespace AzToolsFramework } } + AZStd::unique_ptr PrefabSystemComponent::InstantiatePrefab(AZ::IO::PathView filePath) + { + // Retrieve the template id for the source prefab filepath + Prefab::TemplateId templateId = GetTemplateIdFromFilePath(filePath); + + if (templateId == Prefab::InvalidTemplateId) + { + // Load the template from the file + templateId = m_prefabLoader.LoadTemplateFromFile(filePath); + } + + if (templateId == Prefab::InvalidTemplateId) + { + AZ_Error("Prefab", false, + "Could not load template from path %s during InstantiatePrefab. Unable to proceed", + filePath); + + return nullptr; + } + + return InstantiatePrefab(templateId); + } + AZStd::unique_ptr PrefabSystemComponent::InstantiatePrefab(const TemplateId& templateId) { TemplateReference instantiatingTemplate = FindTemplate(templateId); @@ -281,7 +313,7 @@ namespace AzToolsFramework return newInstance; } - TemplateId PrefabSystemComponent::CreateTemplateFromInstance(Instance& instance) + TemplateId PrefabSystemComponent::CreateTemplateFromInstance(Instance& instance, bool shouldCreateLinks) { // We will register the template to match the path the instance has const AZ::IO::Path& templateSourcePath = instance.GetTemplateSourcePath(); @@ -315,14 +347,15 @@ namespace AzToolsFramework return InvalidTemplateId; } - if (!GenerateLinksForNewTemplate(newTemplateId, instance)) + if (shouldCreateLinks) { - // Clear new template and any links associated with it - RemoveTemplate(newTemplateId); - - return InvalidTemplateId; + if (!GenerateLinksForNewTemplate(newTemplateId, instance)) + { + // Clear new template and any links associated with it + RemoveTemplate(newTemplateId); + return InvalidTemplateId; + } } - return newTemplateId; } @@ -615,7 +648,12 @@ namespace AzToolsFramework instancesValue = memberFound->value; } - instancesValue->get().AddMember(rapidjson::StringRef(instanceAlias.c_str()), PrefabDomValue(), targetTemplateDom.GetAllocator()); + // Only add the instance if it's not there already + if (instancesValue->get().FindMember(rapidjson::StringRef(instanceAlias.c_str())) == instancesValue->get().MemberEnd()) + { + instancesValue->get().AddMember( + rapidjson::StringRef(instanceAlias.c_str()), PrefabDomValue(), targetTemplateDom.GetAllocator()); + } Template& sourceTemplate = sourceTemplateRef->get(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 40780b9775..30d03ba2ef 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -115,9 +115,16 @@ namespace AzToolsFramework */ void RemoveAllTemplates() override; + /** + * Generates a new Prefab Instance based on the Template whose source is stored in filepath. + * @param filePath the path to the prefab source file containing the template being instantiated. + * @return A unique_ptr to the newly instantiated instance. Null if operation failed. + */ + AZStd::unique_ptr InstantiatePrefab(AZ::IO::PathView filePath) override; + /** * Generates a new Prefab Instance based on the Template referenced by templateId - * @param templateId the id of the template being instantiated + * @param templateId the id of the template being instantiated. * @return A unique_ptr to the newly instantiated instance. Null if operation failed. */ AZStd::unique_ptr InstantiatePrefab(const TemplateId& templateId) override; @@ -187,17 +194,22 @@ namespace AzToolsFramework * @param entities A vector of entities that will be used in the new instance. May be empty * @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved. * May be empty - * @param filePath the path to associate the template of the new instance to + * @param filePath the path to associate the template of the new instance to. + * @param containerEntity The container entity for the prefab to be created. It will be created if a nullptr is provided. + * @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance + * and its nested instances. * @return A pointer to the newly created instance. nullptr on failure */ - AZStd::unique_ptr CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, - AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity = nullptr) override; + AZStd::unique_ptr CreatePrefab( + const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, + AZ::IO::PathView filePath, AZStd::unique_ptr containerEntity = nullptr, + bool ShouldCreateLinks = true) override; PrefabDom& FindTemplateDom(TemplateId templateId) override; /** * Updates a template with the given updated DOM. - * + * * @param templateId The id of the template to update. * @param updatedDom The DOM to update the template with. */ @@ -260,9 +272,11 @@ namespace AzToolsFramework /** * Takes a prefab instance and generates a new Prefab Template * along with any new Prefab Links representing any of the nested instances present - * @param instance The instance used to generate the new Template + * @param instance The instance used to generate the new Template. + * @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance + * and its nested instances. */ - TemplateId CreateTemplateFromInstance(Instance& instance); + TemplateId CreateTemplateFromInstance(Instance& instance, bool shouldCreateLinks); /** * Connect two templates with given link, and a nested instance value iterator diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 8b94935cc1..6491d67401 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -58,10 +58,11 @@ namespace AzToolsFramework virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; virtual void PropagateTemplateChanges(TemplateId templateId) = 0; + virtual AZStd::unique_ptr InstantiatePrefab(AZ::IO::PathView filePath) = 0; virtual AZStd::unique_ptr InstantiatePrefab(const TemplateId& templateId) = 0; virtual AZStd::unique_ptr CreatePrefab(const AZStd::vector& entities, AZStd::vector>&& instancesToConsume, AZ::IO::PathView filePath, - AZStd::unique_ptr containerEntity = nullptr) = 0; + AZStd::unique_ptr containerEntity = nullptr, bool ShouldCreateLinks = true) = 0; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp index 0d9f9f72a5..ea3fa5d84d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp @@ -124,7 +124,7 @@ namespace AzToolsFramework const TemplateId& targetId, const TemplateId& sourceId, const InstanceAlias& instanceAlias, - const PrefabDomReference linkDom, + PrefabDomReference linkDom, const LinkId linkId) { m_targetId = targetId; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h index 7a765c5db7..0d15d707d2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.h @@ -101,7 +101,7 @@ namespace AzToolsFramework const TemplateId& targetId, const TemplateId& sourceId, const InstanceAlias& instanceAlias, - const PrefabDomReference linkDom = PrefabDomReference(), + PrefabDomReference linkDom = PrefabDomReference(), const LinkId linkId = InvalidLinkId); void Undo() override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.cpp index da41635d03..2062e8b12c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.cpp @@ -32,6 +32,30 @@ namespace AzToolsFramework state->SetParent(undoBatch); state->Redo(); } + + LinkId CreateLink( + TemplateId sourceTemplateId, TemplateId targetTemplateId, PrefabDomReference patch, + const InstanceAlias& instanceAlias, UndoSystem::URSequencePoint* undoBatch) + { + auto linkAddUndo = aznew PrefabUndoInstanceLink("Create Link"); + linkAddUndo->Capture(targetTemplateId, sourceTemplateId, instanceAlias, patch, InvalidLinkId); + linkAddUndo->SetParent(undoBatch); + linkAddUndo->Redo(); + + return linkAddUndo->GetLinkId(); + } + + void RemoveLink( + TemplateId sourceTemplateId, TemplateId targetTemplateId, const InstanceAlias& instanceAlias, + LinkId linkId, UndoSystem::URSequencePoint* undoBatch) + { + auto linkRemoveUndo = aznew PrefabUndoInstanceLink("Remove Link"); + PrefabDom emptyLinkDom; + linkRemoveUndo->Capture( + targetTemplateId, sourceTemplateId, instanceAlias, emptyLinkDom, linkId); + linkRemoveUndo->SetParent(undoBatch); + linkRemoveUndo->Redo(); + } } } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.h index 81d0048e9e..74532b87a2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoHelpers.h @@ -21,6 +21,12 @@ namespace AzToolsFramework void UpdatePrefabInstance( const Instance& instance, AZStd::string_view undoMessage, const PrefabDom& instanceDomBeforeUpdate, UndoSystem::URSequencePoint* undoBatch); + LinkId CreateLink( + TemplateId sourceTemplateId, TemplateId targetTemplateId, PrefabDomReference patch, + const InstanceAlias& instanceAlias, UndoSystem::URSequencePoint* undoBatch); + void RemoveLink( + TemplateId sourceTemplateId, TemplateId targetTemplateId, const InstanceAlias& instanceAlias, + LinkId linkId, UndoSystem::URSequencePoint* undoBatch); } } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/PropertyTreeEditor/PropertyTreeEditorComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/PropertyTreeEditor/PropertyTreeEditorComponent.h index ca598c9ee9..5b60566c9f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/PropertyTreeEditor/PropertyTreeEditorComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/PropertyTreeEditor/PropertyTreeEditorComponent.h @@ -34,4 +34,4 @@ namespace AzToolsFramework } // namespace AzToolsFramework::Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/SQLite/SQLiteBoundColumnSet.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/SQLite/SQLiteBoundColumnSet.cpp index f38aebc007..510d5a947c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/SQLite/SQLiteBoundColumnSet.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/SQLite/SQLiteBoundColumnSet.cpp @@ -74,4 +74,4 @@ namespace AzToolsFramework } } // namespace Internal } // namespace SQLite -} // namespace AZFramework \ No newline at end of file +} // namespace AZFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.cpp index 87360606ae..c7e3118879 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.cpp @@ -116,4 +116,4 @@ namespace AzToolsFramework } } -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.h index a79485c9b9..16aadc29cb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDataFlagsCommand.h @@ -95,4 +95,4 @@ namespace AzToolsFramework AZ::DataPatch::FlagsMap m_previousDataFlagsMap; AZ::DataPatch::FlagsMap m_nextDataFlagsMap; }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserBus.h index ddee347e60..cba08d0aee 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserBus.h @@ -70,4 +70,4 @@ namespace AzToolsFramework }; using SliceDependencyBrowserNotificationsBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserComponent.h index 8ff4b6fd5b..43832ceb29 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceDependencyBrowserComponent.h @@ -131,4 +131,4 @@ namespace AzToolsFramework */ bool GetSliceDependendentsByRelativeAssetPath(const AZStd::string& relativePath, AZStd::vector& dependents) const; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceRelationshipNode.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceRelationshipNode.h index 580bb54cab..87072938c2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceRelationshipNode.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceRelationshipNode.h @@ -100,4 +100,4 @@ namespace AzToolsFramework SliceRelationshipNodeSet m_dependents; SliceRelationshipNodeSet m_dependencies; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp index 939ca813b6..2892e4efce 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp @@ -10,12 +10,14 @@ * */ +#include #include AZ_PUSH_DISABLE_WARNING(4127 4251 4800 4244, "-Wunknown-warning-option") // 4127: conditional expression is constant // 4251: 'QTextCodec::ConverterState::flags': class 'QFlags' needs to have dll-interface to be used by clients of struct 'QTextCodec::ConverterState' // 4800: 'QTextBoundaryFinderPrivate *const ': forcing value to bool 'true' or 'false' (performance warning) // 4244: conversion from 'int' to 'qint8', possible loss of data #include +#include AZ_POP_DISABLE_WARNING namespace AzToolsFramework @@ -80,7 +82,11 @@ namespace AzToolsFramework if (m_state == State::Unloaded) { m_state = State::Loading; - QFuture future = QtConcurrent::run([this](){ LoadThread(); }); + QThreadPool* threadPool; + ThumbnailContextRequestBus::BroadcastResult( + threadPool, + &ThumbnailContextRequestBus::Handler::GetThreadPool); + QFuture future = QtConcurrent::run(threadPool, [this](){ LoadThread(); }); m_watcher.setFuture(future); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp index 8f6b9c63fd..ae6d7c1178 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp @@ -28,10 +28,15 @@ namespace AzToolsFramework : m_missingThumbnail(new MissingThumbnail(thumbnailSize)) , m_loadingThumbnail(new LoadingThumbnail(thumbnailSize)) , m_thumbnailSize(thumbnailSize) + , m_threadPool(this) { + ThumbnailContextRequestBus::Handler::BusConnect(); } - ThumbnailContext::~ThumbnailContext() = default; + ThumbnailContext::~ThumbnailContext() + { + ThumbnailContextRequestBus::Handler::BusDisconnect(); + } bool ThumbnailContext::IsLoading(SharedThumbnailKey key) { @@ -53,6 +58,11 @@ namespace AzToolsFramework AzToolsFramework::AssetBrowser::AssetBrowserViewRequestBus::Broadcast(&AzToolsFramework::AssetBrowser::AssetBrowserViewRequests::Update); } + QThreadPool* ThumbnailContext::GetThreadPool() + { + return &m_threadPool; + } + SharedThumbnail ThumbnailContext::GetThumbnail(SharedThumbnailKey key) { SharedThumbnail thumbnail; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h index 589abad0df..6ba3d637f6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h @@ -19,6 +19,7 @@ #include #include +#include #endif class QString; @@ -40,6 +41,7 @@ namespace AzToolsFramework */ class ThumbnailContext : public QObject + , public ThumbnailContextRequestBus::Handler { Q_OBJECT public: @@ -58,10 +60,13 @@ namespace AzToolsFramework void UnregisterThumbnailProvider(const char* providerName); void RedrawThumbnail(); - + //! Default context used for most thumbnails static constexpr const char* DefaultContext = "Default"; + // ThumbnailContextRequestBus::Handler interface overrides... + QThreadPool* GetThreadPool() override; + private: struct ProviderCompare { bool operator() (const SharedThumbnailProvider& lhs, const SharedThumbnailProvider& rhs) const @@ -79,6 +84,9 @@ namespace AzToolsFramework SharedThumbnail m_loadingThumbnail; //! Thumbnail size (width and height in pixels) int m_thumbnailSize; + //! There is only a limited number of threads on global threadPool, because there can be many thumbnails rendering at once + //! an individual threadPool is needed to avoid deadlocks + QThreadPool m_threadPool; }; } // namespace Thumbnailer } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp index f2b81fdb98..85c8291518 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp @@ -71,15 +71,12 @@ namespace AzToolsFramework SharedThumbnail thumbnail; ThumbnailerRequestsBus::BroadcastResult(thumbnail, &ThumbnailerRequests::GetThumbnail, m_key, m_contextName.c_str()); QPainter painter(this); - QPixmap pixmap = thumbnail->GetPixmap(); - // preserve thumbnail image's ratio, if the widget is wider than the image, center the image hotizontally - float aspectRatio = aznumeric_cast(pixmap.width()) / pixmap.height(); - int originalWidth = width(); - int originalHeight = height(); - int realHeight = qMin(aznumeric_cast(originalWidth /aspectRatio), originalHeight); - int realWidth = aznumeric_cast(realHeight * aspectRatio); - int x = (originalWidth - realWidth) / 2; - painter.drawPixmap(QRect(x, 0, realHeight, realWidth), pixmap); + + // Scaling and centering pixmap within bounds to preserve aspect ratio + const QPixmap pixmap = thumbnail->GetPixmap().scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + const QSize sizeDelta = size() - pixmap.size(); + const QPoint pointDelta = QPoint(sizeDelta.width() / 2, sizeDelta.height() / 2); + painter.drawPixmap(pointDelta, pixmap); } QWidget::paintEvent(event); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h index ebc721bb4c..02264e61f8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h @@ -17,11 +17,23 @@ #include class QPixmap; +class QThreadPool; namespace AzToolsFramework { namespace Thumbnailer { + //! Interaction with thumbnail context + class ThumbnailContextRequests + : public AZ::EBusTraits + { + public: + //! Get thread pool for drawing thumbnails + virtual QThreadPool* GetThreadPool() = 0; + }; + + using ThumbnailContextRequestBus = AZ::EBus; + //! Interaction with thumbnailer class ThumbnailerRequests : public AZ::EBusTraits diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/AzToolsFrameworkConfigurationSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/AzToolsFrameworkConfigurationSystemComponent.h index 9c06d6c52a..790a1c0728 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/AzToolsFrameworkConfigurationSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/AzToolsFrameworkConfigurationSystemComponent.h @@ -37,4 +37,4 @@ namespace AzToolsFramework static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); }; -} // AzToolsFramework \ No newline at end of file +} // AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.cpp index affdce6e55..3440ca3bcf 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.cpp @@ -189,4 +189,4 @@ namespace AzToolsFramework QClipboard* clipboard = QApplication::clipboard(); clipboard->setMimeData(mimeData.release()); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.h index 42ab031e47..f821bac94b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ComponentMimeData.h @@ -69,4 +69,4 @@ namespace AzToolsFramework private: ComponentDataContainer m_components; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.cpp index b31dbf2109..3ca82dcfa7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.cpp @@ -28,4 +28,4 @@ namespace AzToolsFramework ->Field("CurrentAssetID", &AssetReferenceBase::m_currentID); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.h index ce8f9a408b..772fcaff7a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorAssetReference.h @@ -43,4 +43,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionBus.h index 5341428243..6cb826ebaa 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionBus.h @@ -26,4 +26,4 @@ namespace AzToolsFramework }; using EditorDisabledCompositionRequestBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.cpp index 6f943f00c6..ee780aa7d5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.cpp @@ -112,4 +112,4 @@ namespace AzToolsFramework EditorComponentBase::Deactivate(); } } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.h index d02aa97733..502a58f50b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorDisabledCompositionComponent.h @@ -49,4 +49,4 @@ namespace AzToolsFramework AZStd::vector m_disabledComponents; }; } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorEntityIconComponentBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorEntityIconComponentBus.h index e22682b94b..0ebda6adce 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorEntityIconComponentBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorEntityIconComponentBus.h @@ -71,4 +71,4 @@ namespace AzToolsFramework }; using EditorEntityIconComponentNotificationBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h index b5dc4c1d48..841b1e0ce2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h @@ -103,4 +103,4 @@ namespace AzToolsFramework bool m_componentOrderIsDirty = true; ///< This flag indicates our stored serialization order data is out of date and must be rebuilt before serialization occurs }; } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponentBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponentBus.h index 93d450ba2b..f8d91bbf82 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponentBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponentBus.h @@ -50,4 +50,4 @@ namespace AzToolsFramework }; using EditorInspectorComponentNotificationBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionBus.h index b97b35c867..5546761da6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionBus.h @@ -26,4 +26,4 @@ namespace AzToolsFramework }; using EditorPendingCompositionRequestBus = AZ::EBus; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.cpp index 97729d3ef4..16817ac4cf 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.cpp @@ -125,4 +125,4 @@ namespace AzToolsFramework EditorComponentBase::Deactivate(); } } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.h index a00a5f75ae..a090ae12a3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorPendingCompositionComponent.h @@ -49,4 +49,4 @@ namespace AzToolsFramework AZStd::vector m_pendingComponents; }; } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorSelectionAccentingBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorSelectionAccentingBus.h index 9bef2c1f68..7be2945efd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorSelectionAccentingBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorSelectionAccentingBus.h @@ -40,4 +40,4 @@ namespace AzToolsFramework using EditorSelectionAccentingRequestBus = AZ::EBus; } // namespace Components -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponent.h index 98ac30addf..6b04c637ba 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponent.h @@ -74,4 +74,4 @@ namespace AzToolsFramework } } // namespace AzToolsFramework -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponentBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponentBus.h index 185ed1f267..9fa000f82d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponentBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/SelectionComponentBus.h @@ -69,4 +69,4 @@ namespace AzToolsFramework } } // namespace AzToolsFramework -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils.h index 9cff562bdf..c7be61b5e4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils.h @@ -23,4 +23,4 @@ namespace AzToolsFramework bool GetFreeDiskSpace(const QString& path, qint64& outFreeDiskSpace); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils_generic.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils_generic.cpp index 79bf7e894b..6f382a6b2e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils_generic.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsFileUtils/ToolsFileUtils_generic.cpp @@ -48,4 +48,4 @@ namespace AzToolsFramework return outFreeDiskSpace >= 0; } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsMessaging/EntityHighlightBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsMessaging/EntityHighlightBus.h index ce42ac87d4..4f227364c9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsMessaging/EntityHighlightBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsMessaging/EntityHighlightBus.h @@ -32,4 +32,4 @@ namespace AzToolsFramework }; } -#endif // EDITOR_ENTITY_ID_LIST_CONTAINER_H \ No newline at end of file +#endif // EDITOR_ENTITY_ID_LIST_CONTAINER_H diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModel.cpp index 00a3663e61..4c6d981865 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModel.cpp @@ -35,4 +35,4 @@ namespace AzToolsFramework } } -#include "UI/ComponentPalette/moc_ComponentPaletteModel.cpp" \ No newline at end of file +#include "UI/ComponentPalette/moc_ComponentPaletteModel.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModelFilter.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModelFilter.cpp index 8b82e5fa89..cb338558f9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModelFilter.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/ComponentPalette/ComponentPaletteModelFilter.cpp @@ -55,4 +55,4 @@ namespace AzToolsFramework } } -#include "UI/ComponentPalette/moc_ComponentPaletteModelFilter.cpp" \ No newline at end of file +#include "UI/ComponentPalette/moc_ComponentPaletteModelFilter.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp index 98edd26f88..84266d3707 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp @@ -61,6 +61,11 @@ namespace AzToolsFramework return true; } + bool EditorEntityUiHandlerBase::CanRename(AZ::EntityId /*entityId*/) const + { + return true; + } + void EditorEntityUiHandlerBase::PaintItemBackground(QPainter* /*painter*/, const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const { } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h index 7360e7ff0b..1aa5e5720f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h @@ -47,6 +47,8 @@ namespace AzToolsFramework virtual QPixmap GenerateItemIcon(AZ::EntityId entityId) const; //! Returns whether the element's lock and visibility state should be accessible in the Outliner virtual bool CanToggleLockVisibility(AZ::EntityId entityId) const; + //! Returns whether the element's name should be editable + virtual bool CanRename(AZ::EntityId entityId) const; //! Paints the background of the item in the Outliner. virtual void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/AddToLayerMenu.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/AddToLayerMenu.h index 2fcc1d37a5..7c874a12cd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/AddToLayerMenu.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/AddToLayerMenu.h @@ -24,4 +24,4 @@ namespace AzToolsFramework QMenu* parentMenu, const AzToolsFramework::EntityIdSet& entitySelectionWithFlatHierarchy, NewLayerFunction newLayerFunction); -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorContextBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorContextBus.h index 2fdaef51f5..2956f4f04c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorContextBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorContextBus.h @@ -51,4 +51,4 @@ namespace LegacyFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp index 8cc6d46da8..0aec36b9b0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp @@ -192,6 +192,10 @@ namespace LegacyFramework // if we're in console mode, listen for CTRL+C ::SetConsoleCtrlHandler(CTRL_BREAK_HandlerRoutine, true); #endif + + m_ptrCommandLineParser = aznew AzFramework::CommandLine(); + m_ptrCommandLineParser->Parse(m_desc.m_argc, m_desc.m_argv); + // If we don't have one create a serialize context if (GetSerializeContext() == nullptr) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.cpp index c8b31a23cc..839b3dc16f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.cpp @@ -62,4 +62,4 @@ namespace AzToolsFramework ->Field("m_serializableWindowState", &MainWindowSavedState::m_serializableWindowState); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.h index d794f715ba..d01a2d678e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/MainWindowSavedState.h @@ -53,4 +53,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkAPI.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkAPI.cpp index 7c1c800b70..bac076a60f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkAPI.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkAPI.cpp @@ -94,4 +94,4 @@ namespace AzToolsFramework return dlg.m_result; } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogEntry.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogEntry.h index 7d9c74b71f..96357a15b4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogEntry.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogEntry.h @@ -92,4 +92,4 @@ namespace AzToolsFramework } // Logging } // AzToolsFramework -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogLine.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogLine.h index d3f43336d5..6902e388b7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogLine.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogLine.h @@ -104,4 +104,4 @@ namespace AzToolsFramework } } -Q_DECLARE_METATYPE(const AzToolsFramework::Logging::LogLine*); \ No newline at end of file +Q_DECLARE_METATYPE(const AzToolsFramework::Logging::LogLine*); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableItemDelegate.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableItemDelegate.cpp index 70b5f06649..2e24ec4207 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableItemDelegate.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableItemDelegate.cpp @@ -115,4 +115,4 @@ namespace AzToolsFramework } // namespace Logging } // namespace AzToolsFramework -#include "UI/Logging/moc_LogTableItemDelegate.cpp" \ No newline at end of file +#include "UI/Logging/moc_LogTableItemDelegate.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableModel.cpp index 2cb980f680..ffc27e05e2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogTableModel.cpp @@ -316,4 +316,4 @@ namespace AzToolsFramework } } // namespace AzToolsFramework -#include "UI/Logging/moc_LogTableModel.cpp" \ No newline at end of file +#include "UI/Logging/moc_LogTableModel.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LoggingCommon.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LoggingCommon.h index 9516dbdbef..85a04d3fb6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LoggingCommon.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LoggingCommon.h @@ -29,4 +29,4 @@ namespace AzToolsFramework } } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/NewLogTabDialog.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/NewLogTabDialog.h index 88a9c6e1cb..6ea849e3e0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/NewLogTabDialog.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/NewLogTabDialog.h @@ -56,4 +56,4 @@ namespace AzToolsFramework } // namespace LogPanel } // namespace AzToolsFramework -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h index da960a5e57..dc04119199 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h @@ -102,4 +102,4 @@ namespace AzToolsFramework virtual void Clear(); }; } // namespace LogPanel -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp index de10ae18b4..5b44594398 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp @@ -945,6 +945,12 @@ namespace AzToolsFramework return false; } + // Disable reparenting to the root level + if (!newParentId.IsValid()) + { + return false; + } + // Ignore entities not owned by the editor context. It is assumed that all entities belong // to the same context since multiple selection doesn't span across views. for (const AZ::EntityId& entityId : selectedEntityIds) @@ -974,39 +980,33 @@ namespace AzToolsFramework } } - if (newParentId.IsValid()) + bool isLayerEntity = false; + Layers::EditorLayerComponentRequestBus::EventResult( + isLayerEntity, + entityId, + &Layers::EditorLayerComponentRequestBus::Events::HasLayer); + // Layers can only have other layers as parents, or have no parent. + if (isLayerEntity) { - bool isLayerEntity = false; + bool newParentIsLayer = false; Layers::EditorLayerComponentRequestBus::EventResult( - isLayerEntity, - entityId, + newParentIsLayer, + newParentId, &Layers::EditorLayerComponentRequestBus::Events::HasLayer); - // Layers can only have other layers as parents, or have no parent. - if (isLayerEntity) + if (!newParentIsLayer) { - bool newParentIsLayer = false; - Layers::EditorLayerComponentRequestBus::EventResult( - newParentIsLayer, - newParentId, - &Layers::EditorLayerComponentRequestBus::Events::HasLayer); - if (!newParentIsLayer) - { - return false; - } + return false; } } } //Only check the entity pointer if the entity id is valid because //we want to allow dragging items to unoccupied parts of the tree to un-parent them - if (newParentId.IsValid()) + AZ::Entity* newParentEntity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(newParentEntity, &AZ::ComponentApplicationRequests::FindEntity, newParentId); + if (!newParentEntity) { - AZ::Entity* newParentEntity = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(newParentEntity, &AZ::ComponentApplicationRequests::FindEntity, newParentId); - if (!newParentEntity) - { - return false; - } + return false; } //reject dragging on to yourself or your children diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp index 08fc764507..cc65b61908 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -271,6 +272,12 @@ namespace AzToolsFramework m_listModel->Initialize(); + m_editorEntityUiInterface = AZ::Interface::Get(); + + AZ_Assert( + m_editorEntityUiInterface != nullptr, + "EntityOutlinerWidget requires a EditorEntityUiInterface instance on Initialize."); + EditorPickModeNotificationBus::Handler::BusConnect(GetEntityContextId()); EntityHighlightMessages::Bus::Handler::BusConnect(); EntityOutlinerModelNotificationBus::Handler::BusConnect(); @@ -279,12 +286,12 @@ namespace AzToolsFramework ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusConnect( GetEntityContextId()); EditorEntityInfoNotificationBus::Handler::BusConnect(); - AZ::Interface::Register(this); + Prefab::PrefabPublicNotificationBus::Handler::BusConnect(); } EntityOutlinerWidget::~EntityOutlinerWidget() { - AZ::Interface::Unregister(this); + Prefab::PrefabPublicNotificationBus::Handler::BusDisconnect(); ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusDisconnect(); EditorEntityInfoNotificationBus::Handler::BusDisconnect(); EditorPickModeNotificationBus::Handler::BusDisconnect(); @@ -562,7 +569,13 @@ namespace AzToolsFramework if (m_selectedEntityIds.size() == 1) { - contextMenu->addAction(m_actionToRenameSelection); + auto entityId = m_selectedEntityIds.front(); + auto entityUiHandler = m_editorEntityUiInterface->GetHandler(entityId); + + if (!entityUiHandler || entityUiHandler->CanRename(entityId)) + { + contextMenu->addAction(m_actionToRenameSelection); + } } if (m_selectedEntityIds.size() == 1) @@ -688,11 +701,17 @@ namespace AzToolsFramework if (m_selectedEntityIds.size() == 1) { - const QModelIndex proxyIndex = GetIndexFromEntityId(m_selectedEntityIds.front()); - if (proxyIndex.isValid()) + auto entityId = m_selectedEntityIds.front(); + auto entityUiHandler = m_editorEntityUiInterface->GetHandler(entityId); + + if (!entityUiHandler || entityUiHandler->CanRename(entityId)) { - m_gui->m_objectTree->setCurrentIndex(proxyIndex); - m_gui->m_objectTree->QTreeView::edit(proxyIndex); + const QModelIndex proxyIndex = GetIndexFromEntityId(entityId); + if (proxyIndex.isValid()) + { + m_gui->m_objectTree->setCurrentIndex(proxyIndex); + m_gui->m_objectTree->QTreeView::edit(proxyIndex); + } } } } @@ -1090,25 +1109,18 @@ namespace AzToolsFramework setEnabled(true); SetEntityOutlinerState(m_gui, true); } - - void EntityOutlinerWidget::SetUpdatesEnabled(bool enable) + + void EntityOutlinerWidget::OnPrefabInstancePropagationBegin() { - if (enable) - { - QTimer::singleShot(1, this, [this]() { - m_gui->m_objectTree->setUpdatesEnabled(true); - }); - } - else - { - m_gui->m_objectTree->setUpdatesEnabled(false); - } + m_gui->m_objectTree->setUpdatesEnabled(false); } - void EntityOutlinerWidget::ExpandEntityChildren(AZ::EntityId entityId) + void EntityOutlinerWidget::OnPrefabInstancePropagationEnd() { - QModelIndex index = GetIndexFromEntityId(entityId); - m_gui->m_objectTree->expand(index); + QTimer::singleShot(1, this, [this]() { + m_gui->m_objectTree->setUpdatesEnabled(true); + m_gui->m_objectTree->expand(m_proxyModel->index(0,0)); + }); } void EntityOutlinerWidget::OnEntityInfoUpdatedAddChildEnd(AZ::EntityId /*parentId*/, AZ::EntityId childId) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx index cf8c55abd1..9a02febab2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.hxx @@ -20,10 +20,10 @@ #include #include #include +#include #include #include #include -#include #include #include @@ -42,6 +42,7 @@ namespace Ui namespace AzToolsFramework { + class EditorEntityUiInterface; class EntityOutlinerListModel; class EntityOutlinerSortFilterProxyModel; @@ -61,7 +62,7 @@ namespace AzToolsFramework , private EditorEntityContextNotificationBus::Handler , private EditorEntityInfoNotificationBus::Handler , private ComponentModeFramework::EditorComponentModeNotificationBus::Handler - , private EntityOutlinerWidgetInterface + , private Prefab::PrefabPublicNotificationBus::Handler { Q_OBJECT; public: @@ -105,9 +106,9 @@ namespace AzToolsFramework void EnteredComponentMode(const AZStd::vector& componentModeTypes) override; void LeftComponentMode(const AZStd::vector& componentModeTypes) override; - // EntityOutlinerWidgetInterface - void SetUpdatesEnabled(bool enable) override; - void ExpandEntityChildren(AZ::EntityId entityId) override; + // PrefabPublicNotificationBus + void OnPrefabInstancePropagationBegin() override; + void OnPrefabInstancePropagationEnd() override; // Build a selection object from the given entities. Entities already in the Widget's selection buffers are ignored. template @@ -193,6 +194,8 @@ namespace AzToolsFramework EntityIdSet m_entitiesToSort; EntityOutliner::DisplaySortMode m_sortMode; bool m_sortContentQueued; + + EditorEntityUiInterface* m_editorEntityUiInterface = nullptr; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp index 828a49ef94..7915403c0a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp @@ -50,11 +50,31 @@ namespace AzToolsFramework return QPixmap(m_levelRootIconPath); } + QString LevelRootUiHandler::GenerateItemInfoString(AZ::EntityId entityId) const + { + QString infoString; + + AZ::IO::Path path = m_prefabPublicInterface->GetOwningInstancePrefabPath(entityId); + + if (!path.empty()) + { + infoString = + QObject::tr("(%1)").arg(path.Filename().Native().data()); + } + + return infoString; + } + bool LevelRootUiHandler::CanToggleLockVisibility(AZ::EntityId /*entityId*/) const { return false; } + bool LevelRootUiHandler::CanRename(AZ::EntityId /*entityId*/) const + { + return false; + } + void LevelRootUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& /*index*/) const { if (!painter) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h index a8b2e4a4f8..19c1244040 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h @@ -34,7 +34,9 @@ namespace AzToolsFramework // EditorEntityUiHandler... QPixmap GenerateItemIcon(AZ::EntityId entityId) const override; + QString GenerateItemInfoString(AZ::EntityId entityId) const override; bool CanToggleLockVisibility(AZ::EntityId entityId) const override; + bool CanRename(AZ::EntityId entityId) const override; void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; private: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditorHeader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditorHeader.cpp index 314efe6575..384f3225ec 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditorHeader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditorHeader.cpp @@ -118,4 +118,4 @@ namespace AzToolsFramework } } -#include "UI/PropertyEditor/moc_ComponentEditorHeader.cpp" \ No newline at end of file +#include "UI/PropertyEditor/moc_ComponentEditorHeader.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.cpp index be8753a828..ca96a26720 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.cpp @@ -58,4 +58,4 @@ namespace AzToolsFramework slider->setFocusPolicy(Qt::StrongFocus); slider->setFocusProxy(spinbox); } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.hxx index 642f582d67..d650c0147c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/DHQSlider.hxx @@ -43,4 +43,4 @@ namespace AzToolsFramework void InitializeSliderPropertyWidgets(QSlider*, QAbstractSpinBox*); } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityIdQLabel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityIdQLabel.cpp index 38ac3f8d7c..463b2bf9d1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityIdQLabel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityIdQLabel.cpp @@ -98,4 +98,4 @@ namespace AzToolsFramework } } -#include "UI/PropertyEditor/moc_EntityIdQLabel.cpp" \ No newline at end of file +#include "UI/PropertyEditor/moc_EntityIdQLabel.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp index 55c7fb3f65..181f5b9a9d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp @@ -310,6 +310,9 @@ namespace AzToolsFramework { initEntityPropertyEditorResources(); + m_prefabPublicInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabPublicInterface != nullptr, "EntityPropertyEditor requires a PrefabPublicInterface instance on Initialize."); + setObjectName("EntityPropertyEditor"); setAcceptDrops(true); @@ -405,8 +408,6 @@ namespace AzToolsFramework CreateActions(); UpdateContents(); - m_prefabPublicInterface = AZ::Interface::Get(); - EditorEntityContextNotificationBus::Handler::BusConnect(); //forced to register global event filter with application for selection @@ -693,11 +694,38 @@ namespace AzToolsFramework m_gui->m_entityIcon->repaint(); } + EntityPropertyEditor::InspectorLayout EntityPropertyEditor::GetCurrentInspectorLayout() const + { + if (!m_prefabsAreEnabled) + { + return m_isLevelEntityEditor ? InspectorLayout::LEVEL : InspectorLayout::ENTITY; + } + + AZ::EntityId levelContainerEntityId = m_prefabPublicInterface->GetLevelInstanceContainerEntityId(); + if (AZStd::find(m_selectedEntityIds.begin(), m_selectedEntityIds.end(), levelContainerEntityId) != m_selectedEntityIds.end()) + { + if (m_selectedEntityIds.size() > 1) + { + return InspectorLayout::INVALID; + } + else + { + return InspectorLayout::LEVEL; + } + } + else + { + return InspectorLayout::ENTITY; + } + } + void EntityPropertyEditor::UpdateEntityDisplay() { UpdateStatusComboBox(); - if (m_isLevelEntityEditor) + InspectorLayout layout = GetCurrentInspectorLayout(); + + if (layout == InspectorLayout::LEVEL) { AZStd::string levelName; AzToolsFramework::EditorRequestBus::BroadcastResult(levelName, &AzToolsFramework::EditorRequests::GetLevelName); @@ -737,13 +765,20 @@ namespace AzToolsFramework AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework); SelectionEntityTypeInfo result = SelectionEntityTypeInfo::None; - if (m_isLevelEntityEditor) + InspectorLayout layout = GetCurrentInspectorLayout(); + + if (layout == InspectorLayout::LEVEL) { // The Level Inspector should only have a list of selectable components after the // level entity itself is valid (i.e. "selected"). return selection.empty() ? SelectionEntityTypeInfo::None : SelectionEntityTypeInfo::LevelEntity; } + if (layout == InspectorLayout::INVALID) + { + return SelectionEntityTypeInfo::Mixed; + } + for (AZ::EntityId selectedEntityId : selection) { bool isLayerEntity = false; @@ -909,16 +944,18 @@ namespace AzToolsFramework } } + bool isLevelLayout = GetCurrentInspectorLayout() == InspectorLayout::LEVEL; + m_gui->m_entityDetailsLabel->setText(entityDetailsLabelText); m_gui->m_entityDetailsLabel->setVisible(entityDetailsVisible); m_gui->m_entityNameEditor->setVisible(hasEntitiesDisplayed); m_gui->m_entityNameLabel->setVisible(hasEntitiesDisplayed); m_gui->m_entityIcon->setVisible(hasEntitiesDisplayed); - m_gui->m_pinButton->setVisible(m_overrideSelectedEntityIds.empty() && hasEntitiesDisplayed && !m_isSystemEntityEditor && !m_isLevelEntityEditor); - m_gui->m_statusLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !m_isLevelEntityEditor); - m_gui->m_statusComboBox->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !m_isLevelEntityEditor); - m_gui->m_entityIdLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !m_isLevelEntityEditor); - m_gui->m_entityIdText->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !m_isLevelEntityEditor); + m_gui->m_pinButton->setVisible(m_overrideSelectedEntityIds.empty() && hasEntitiesDisplayed && !m_isSystemEntityEditor); + m_gui->m_statusLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_statusComboBox->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_entityIdLabel->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); + m_gui->m_entityIdText->setVisible(hasEntitiesDisplayed && !m_isSystemEntityEditor && !isLevelLayout); bool displayComponentSearchBox = hasEntitiesDisplayed; if (hasEntitiesDisplayed) @@ -941,7 +978,7 @@ namespace AzToolsFramework UpdateEntityDisplay(); } - m_gui->m_darkBox->setVisible(displayComponentSearchBox && !m_isSystemEntityEditor && !m_isLevelEntityEditor); + m_gui->m_darkBox->setVisible(displayComponentSearchBox && !m_isSystemEntityEditor && !isLevelLayout); m_gui->m_entitySearchBox->setVisible(displayComponentSearchBox); bool displayAddComponentMenu = CanAddComponentsToSelection(selectionEntityTypeInfo); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx index fed9c55f15..677dc98277 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx @@ -521,6 +521,15 @@ namespace AzToolsFramework bool m_isSystemEntityEditor; bool m_isLevelEntityEditor = false; + enum class InspectorLayout + { + ENTITY = 0, // All selected entities are regular entities + LEVEL, // The selected entity is the level prefab container entity + INVALID // Other entities are selected alongside the level prefab container entity + }; + + InspectorLayout GetCurrentInspectorLayout() const; + // the spacer's job is to make sure that its always at the end of the list of components. QSpacerItem* m_spacer; bool m_isAlreadyQueuedRefresh; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/GrowTextEdit.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/GrowTextEdit.cpp index 586f30520a..c230e1171d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/GrowTextEdit.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/GrowTextEdit.cpp @@ -86,4 +86,4 @@ namespace AzToolsFramework } } -#include "UI/PropertyEditor/moc_GrowTextEdit.cpp" \ No newline at end of file +#include "UI/PropertyEditor/moc_GrowTextEdit.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h index 6255adaae5..382f866042 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h @@ -53,4 +53,4 @@ namespace AzToolsFramework }; void RegisterMultiLineEditHandler(); -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index 261645e79a..f19f456816 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -63,7 +63,7 @@ AZ_POP_DISABLE_WARNING #include #include -#include +#include namespace AzToolsFramework { @@ -93,15 +93,11 @@ namespace AzToolsFramework setAcceptDrops(true); - m_thumbnail = new Thumbnailer::ThumbnailWidget(this); - m_thumbnail->setFixedSize(QSize(24, 24)); + m_thumbnail = new ThumbnailPropertyCtrl(this); + m_thumbnail->setFixedSize(QSize(40, 24)); m_thumbnail->setVisible(false); - m_thumbnailDropDown = new ThumbnailDropDown(this); - m_thumbnailDropDown->setFixedSize(QSize(40, 24)); - m_thumbnailDropDown->setVisible(false); - - connect(m_thumbnailDropDown, &ThumbnailDropDown::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); + connect(m_thumbnail, &ThumbnailPropertyCtrl::clicked, this, &PropertyAssetCtrl::OnThumbnailClicked); m_editButton = new QToolButton(this); m_editButton->setAutoRaise(true); @@ -112,7 +108,6 @@ namespace AzToolsFramework connect(m_editButton, &QToolButton::clicked, this, &PropertyAssetCtrl::OnEditButtonClicked); pLayout->addWidget(m_thumbnail); - pLayout->addWidget(m_thumbnailDropDown); pLayout->addWidget(m_browseEdit); pLayout->addWidget(m_editButton); @@ -188,6 +183,17 @@ namespace AzToolsFramework } } + void PropertyAssetCtrl::OnThumbnailClicked() + { + const AZ::Data::AssetId assetID = GetCurrentAssetID(); + if (m_thumbnailCallback) + { + AZ_Error("Asset Property", m_editNotifyTarget, "No notification target set for edit callback."); + m_thumbnailCallback->Invoke(m_editNotifyTarget, assetID, GetCurrentAssetType()); + return; + } + } + void PropertyAssetCtrl::OnCompletionModelReset() { if (!m_completerIsActive) @@ -674,6 +680,13 @@ namespace AzToolsFramework AzQtComponents::BrowseEdit::removeDropTargetStyle(m_browseEdit); } + AssetSelectionModel PropertyAssetCtrl::GetAssetSelectionModel() + { + auto selectionModel = AssetSelectionModel::AssetTypeSelection(GetCurrentAssetType()); + selectionModel.SetTitle(m_title); + return selectionModel; + } + void PropertyAssetCtrl::UpdateTabOrder() { setTabOrder(m_browseEdit, m_editButton); @@ -1052,6 +1065,11 @@ namespace AzToolsFramework m_editButton->setIcon(icon); } + void PropertyAssetCtrl::SetTitle(const QString& title) + { + m_title = title; + } + void PropertyAssetCtrl::SetEditNotifyTarget(void* editNotifyTarget) { m_editNotifyTarget = editNotifyTarget; @@ -1091,10 +1109,10 @@ namespace AzToolsFramework void PropertyAssetCtrl::UpdateThumbnail() { m_thumbnail->setVisible(m_showThumbnail); - m_thumbnailDropDown->setVisible(m_showThumbnailDropDown); - if (m_showThumbnail || m_showThumbnailDropDown) + if (m_showThumbnail) { + m_thumbnail->ShowDropDownArrow(m_showThumbnailDropDownButton); const AZ::Data::AssetId assetID = GetCurrentAssetID(); if (assetID.IsValid()) { @@ -1112,17 +1130,12 @@ namespace AzToolsFramework { m_thumbnail->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); } - if (m_showThumbnailDropDown) - { - m_thumbnailDropDown->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); - } return; } } } m_thumbnail->ClearThumbnail(); - m_thumbnailDropDown->ClearThumbnail(); } void PropertyAssetCtrl::SetClearButtonEnabled(bool enable) @@ -1156,14 +1169,19 @@ namespace AzToolsFramework return m_showThumbnail; } - void PropertyAssetCtrl::SetShowThumbnailDropDown(bool enable) + void PropertyAssetCtrl::SetShowThumbnailDropDownButton(bool enable) { - m_showThumbnailDropDown = enable; + m_showThumbnailDropDownButton = enable; } - bool PropertyAssetCtrl::GetShowThumbnailDropDown() const + bool PropertyAssetCtrl::GetShowThumbnailDropDownButton() const { - return m_showThumbnailDropDown; + return m_showThumbnailDropDownButton; + } + + void PropertyAssetCtrl::SetThumbnailCallback(EditCallbackType* editNotifyCallback) + { + m_thumbnailCallback = editNotifyCallback; } const AZ::Uuid& AssetPropertyHandlerDefault::GetHandledType() const @@ -1187,7 +1205,16 @@ namespace AzToolsFramework { (void)debugName; - if (attrib == AZ_CRC("EditCallback", 0xb74f2ee1)) + if (attrib == AZ_CRC_CE("AssetPickerTitle")) + { + AZStd::string title; + attrValue->Read(title); + if (!title.empty()) + { + GUI->SetTitle(title.c_str()); + } + } + else if (attrib == AZ_CRC("EditCallback", 0xb74f2ee1)) { PropertyAssetCtrl::EditCallbackType* func = azdynamic_cast(attrValue->GetAttribute()); if (func) @@ -1277,23 +1304,21 @@ namespace AzToolsFramework } else if (attrib == AZ_CRC_CE("Thumbnail")) { - bool showThumbnail = false; - if (attrValue->Read(showThumbnail)) - { - GUI->SetShowThumbnail(showThumbnail); - } + GUI->SetShowThumbnail(true); } - else if (attrib == AZ_CRC_CE("ThumbnailWithDropDown")) + else if (attrib == AZ_CRC_CE("ThumbnailCallback")) { PropertyAssetCtrl::EditCallbackType* func = azdynamic_cast(attrValue->GetAttribute()); if (func) { - GUI->SetShowThumbnailDropDown(true); - GUI->SetEditNotifyCallback(func); + GUI->SetShowThumbnail(true); + GUI->SetShowThumbnailDropDownButton(true); + GUI->SetThumbnailCallback(func); } else { - GUI->SetEditNotifyCallback(nullptr); + GUI->SetShowThumbnailDropDownButton(false); + GUI->SetThumbnailCallback(nullptr); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx index b1f2dbb529..e845cdf4fb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.hxx @@ -45,7 +45,7 @@ namespace AzToolsFramework { class AssetCompleterModel; class AssetCompleterListView; - class ThumbnailDropDown; + class ThumbnailPropertyCtrl; namespace Thumbnailer { @@ -89,14 +89,14 @@ namespace AzToolsFramework void dragLeaveEvent(QDragLeaveEvent* event) override; void dropEvent(QDropEvent* event) override; - virtual AssetSelectionModel GetAssetSelectionModel() { return AssetSelectionModel::AssetTypeSelection(GetCurrentAssetType()); } + virtual AssetSelectionModel GetAssetSelectionModel(); signals: void OnAssetIDChanged(AZ::Data::AssetId newAssetID); protected: - ThumbnailDropDown* m_thumbnailDropDown = nullptr; - Thumbnailer::ThumbnailWidget* m_thumbnail = nullptr; + QString m_title; + ThumbnailPropertyCtrl* m_thumbnail = nullptr; QPushButton* m_errorButton = nullptr; QToolButton* m_editButton = nullptr; @@ -157,8 +157,8 @@ namespace AzToolsFramework bool m_showProductAssetName = true; bool m_showThumbnail = false; - - bool m_showThumbnailDropDown = false; + bool m_showThumbnailDropDownButton = false; + EditCallbackType* m_thumbnailCallback = nullptr; // ! Default suffix used in the field's placeholder text when a default value is set. const char* m_DefaultSuffix = " (default)"; @@ -192,6 +192,7 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// public slots: + void SetTitle(const QString& title); void SetEditNotifyTarget(void* editNotifyTarget); void SetEditNotifyCallback(EditCallbackType* editNotifyCallback); // This is meant to be used with the "EditCallback" Attribute void SetClearNotifyCallback(ClearCallbackType* clearNotifyCallback); // This is meant to be used with the "ClearNotify" Attribute @@ -209,8 +210,9 @@ namespace AzToolsFramework void SetShowThumbnail(bool enable); bool GetShowThumbnail() const; - void SetShowThumbnailDropDown(bool enable); - bool GetShowThumbnailDropDown() const; + void SetShowThumbnailDropDownButton(bool enable); + bool GetShowThumbnailDropDownButton() const; + void SetThumbnailCallback(EditCallbackType* editNotifyCallback); void SetSelectedAssetID(const AZ::Data::AssetId& newID); void SetCurrentAssetType(const AZ::Data::AssetType& newType); @@ -222,6 +224,7 @@ namespace AzToolsFramework void UpdateAssetDisplay(); void OnLineEditFocus(bool focus); virtual void OnEditButtonClicked(); + void OnThumbnailClicked(); void OnCompletionModelReset(); void OnAutocomplete(const QModelIndex& index); void OnTextChange(const QString& text); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditor_UITypes.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditor_UITypes.h index 9978aa4810..2bcba85404 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditor_UITypes.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditor_UITypes.h @@ -347,4 +347,4 @@ namespace AzToolsFramework } } // namespace AzToolsFramework -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Entity.svg b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Entity.svg index 9a82f2addb..6e863e3d21 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Entity.svg +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Entity.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Handle_Modified.svg b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Handle_Modified.svg index 5fca6999c1..23f91b23c8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Handle_Modified.svg +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/Slice_Handle_Modified.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/pin_button.svg b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/pin_button.svg index 2a2fcd718c..894fe6dd7d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/pin_button.svg +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/Resources/pin_button.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp similarity index 66% rename from Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp rename to Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index 8a942a952a..bb9232435a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -19,12 +19,14 @@ AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // 4251: 'QRawFon #include #include #include +#include AZ_POP_DISABLE_WARNING -#include "ThumbnailDropDown.h" +#include "ThumbnailPropertyCtrl.h" namespace AzToolsFramework { - ThumbnailDropDown::ThumbnailDropDown(QWidget* parent) + + ThumbnailPropertyCtrl::ThumbnailPropertyCtrl(QWidget* parent) : QWidget(parent) { QHBoxLayout* pLayout = new QHBoxLayout(); @@ -37,6 +39,7 @@ namespace AzToolsFramework m_dropDownArrow = new AspectRatioAwarePixmapWidget(this); m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0.png")); m_dropDownArrow->setFixedSize(QSize(8, 24)); + ShowDropDownArrow(false); m_emptyThumbnail = new QLabel(this); m_emptyThumbnail->setPixmap(QPixmap(":/stylesheet/img/line.png")); @@ -51,19 +54,33 @@ namespace AzToolsFramework setLayout(pLayout); } - void ThumbnailDropDown::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName) + void ThumbnailPropertyCtrl::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName) { + m_key = key; m_emptyThumbnail->setVisible(false); m_thumbnail->SetThumbnailKey(key, contextName); } - void ThumbnailDropDown::ClearThumbnail() + void ThumbnailPropertyCtrl::ClearThumbnail() { m_emptyThumbnail->setVisible(true); m_thumbnail->ClearThumbnail(); } - bool ThumbnailDropDown::event(QEvent* e) + void ThumbnailPropertyCtrl::ShowDropDownArrow(bool visible) + { + if (visible) + { + setFixedSize(QSize(40, 24)); + } + else + { + setFixedSize(QSize(24, 24)); + } + m_dropDownArrow->setVisible(visible); + } + + bool ThumbnailPropertyCtrl::event(QEvent* e) { if (isEnabled()) { @@ -77,7 +94,7 @@ namespace AzToolsFramework return QWidget::event(e); } - void ThumbnailDropDown::paintEvent(QPaintEvent* e) + void ThumbnailPropertyCtrl::paintEvent(QPaintEvent* e) { QPainter p(this); QRect targetRect(QPoint(), QSize(40, 24)); @@ -85,17 +102,32 @@ namespace AzToolsFramework QWidget::paintEvent(e); } - void ThumbnailDropDown::enterEvent(QEvent* e) + void ThumbnailPropertyCtrl::enterEvent(QEvent* e) { m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0_highlighted.png")); + if (!m_thumbnailEnlarged && m_key) + { + QPoint position = mapToGlobal(pos() - QPoint(185, 0)); + QSize size(180, 180); + m_thumbnailEnlarged.reset(new Thumbnailer::ThumbnailWidget()); + m_thumbnailEnlarged->setFixedSize(size); + m_thumbnailEnlarged->move(position); + m_thumbnailEnlarged->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); + m_thumbnailEnlarged->SetThumbnailKey(m_key); + m_thumbnailEnlarged->show(); + } QWidget::enterEvent(e); } - void ThumbnailDropDown::leaveEvent(QEvent* e) + void ThumbnailPropertyCtrl::leaveEvent(QEvent* e) { m_dropDownArrow->setPixmap(QPixmap(":/stylesheet/img/triangle0.png")); + if (m_thumbnailEnlarged) + { + m_thumbnailEnlarged.reset(); + } QWidget::leaveEvent(e); } } -#include "UI/PropertyEditor/moc_ThumbnailDropDown.cpp" +#include "UI/PropertyEditor/moc_ThumbnailPropertyCtrl.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h similarity index 82% rename from Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h rename to Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h index da269742ff..428f24dbf6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailDropDown.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h @@ -30,17 +30,20 @@ namespace AzToolsFramework class ThumbnailWidget; } - class ThumbnailDropDown : public QWidget + //! Used by PropertyAssetCtrl to display thumbnail preview of the asset as well as additional drop-down actions + class ThumbnailPropertyCtrl : public QWidget { Q_OBJECT public: - explicit ThumbnailDropDown(QWidget* parent = nullptr); + explicit ThumbnailPropertyCtrl(QWidget* parent = nullptr); //! Call this to set what thumbnail widget will display void SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName = "Default"); //! Remove current thumbnail void ClearThumbnail(); + void ShowDropDownArrow(bool visible); + bool event(QEvent* e) override; Q_SIGNALS: @@ -52,7 +55,9 @@ namespace AzToolsFramework void leaveEvent(QEvent* e) override; private: + Thumbnailer::SharedThumbnailKey m_key; Thumbnailer::ThumbnailWidget* m_thumbnail = nullptr; + QScopedPointer m_thumbnailEnlarged; QLabel* m_emptyThumbnail = nullptr; AspectRatioAwarePixmapWidget* m_dropDownArrow = nullptr; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp index 7ba8bf2300..7d9cea4e68 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp @@ -714,4 +714,4 @@ namespace AzToolsFramework } // namespace AzToolsFramework -#include "UI/SearchWidget/moc_SearchCriteriaWidget.cpp" \ No newline at end of file +#include "UI/SearchWidget/moc_SearchCriteriaWidget.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.hxx index 5e0c3e4d42..c4203e4878 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.hxx @@ -151,4 +151,4 @@ Q_SIGNALS: }; using FilterByCategoryMap = AZStd::unordered_map; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchWidgetTypes.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchWidgetTypes.hxx index 1c8d7c8819..1dc4d28584 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchWidgetTypes.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchWidgetTypes.hxx @@ -18,4 +18,4 @@ namespace AzToolsFramework And, Or }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SliceRelationshipBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SliceRelationshipBus.h index 104d11016c..c80581c320 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SliceRelationshipBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SliceRelationshipBus.h @@ -27,4 +27,4 @@ namespace AzToolsFramework }; using SliceRelationshipRequestBus = AZ::EBus; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/AZAutoSizingScrollArea.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/AZAutoSizingScrollArea.hxx index 2c172db646..e51f4cacc1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/AZAutoSizingScrollArea.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/AZAutoSizingScrollArea.hxx @@ -42,4 +42,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ClickableLabel.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ClickableLabel.hxx index 8ad55a4c2b..c1f9577e73 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ClickableLabel.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ClickableLabel.hxx @@ -49,4 +49,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ColorPickerDelegate.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ColorPickerDelegate.hxx index e2f0483dee..2a130040aa 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ColorPickerDelegate.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/ColorPickerDelegate.hxx @@ -42,4 +42,4 @@ namespace AzToolsFramework }; } // namespace AzToolsFramework -#endif //COLOR_PICKER_DELEGATE_HXX \ No newline at end of file +#endif //COLOR_PICKER_DELEGATE_HXX diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/IconButton.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/IconButton.hxx index f4a4276fee..546684e109 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/IconButton.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/IconButton.hxx @@ -56,4 +56,4 @@ namespace AzToolsFramework bool m_mouseOver; }; -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/PlainTextEdit.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/PlainTextEdit.hxx index 4087759744..a925280d12 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/PlainTextEdit.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/PlainTextEdit.hxx @@ -52,4 +52,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx index 41d298d025..533dd3f765 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx @@ -152,4 +152,4 @@ namespace AzToolsFramework virtual void ApplySnapshot(QTreeView* treeView) = 0; }; -} //namespace AzToolsFramework \ No newline at end of file +} //namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.cpp index 24e004a592..a1213d9004 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.cpp @@ -46,4 +46,4 @@ namespace AzToolsFramework ->Field("m_windowGeometry", &QWidgetSavedState::m_windowGeometry); } } -} \ No newline at end of file +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.h index 15f3b104e8..dcebb39752 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QWidgetSavedState.h @@ -44,4 +44,4 @@ namespace AzToolsFramework }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoSystem.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoSystem.cpp index 9d944b7601..7a1cdefd06 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoSystem.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Undo/UndoSystem.cpp @@ -425,4 +425,4 @@ namespace AzToolsFramework } #endif } -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/EditorContextMenu.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/EditorContextMenu.h index 72164a5baa..ebce02fa4c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/EditorContextMenu.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/EditorContextMenu.h @@ -37,4 +37,4 @@ namespace AzToolsFramework void EditorContextMenuUpdate( EditorContextMenu& contextMenu, const ViewportInteraction::MouseInteractionEvent& mouseInteraction); -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h index f9c87096d0..d9fca58168 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h @@ -82,4 +82,4 @@ namespace AzToolsFramework AZStd::optional m_boxSelectRegion; ///< Maybe/optional value to store box select region while active. ViewportInteraction::KeyboardModifiers m_previousModifiers; ///< Modifier keys active on the previous frame. }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake index 2939bb44ad..627c2ea6ed 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake @@ -417,8 +417,8 @@ set(FILES UI/PropertyEditor/GrowTextEdit.cpp UI/PropertyEditor/MultiLineTextEditHandler.h UI/PropertyEditor/MultiLineTextEditHandler.cpp - UI/PropertyEditor/ThumbnailDropDown.h - UI/PropertyEditor/ThumbnailDropDown.cpp + UI/PropertyEditor/ThumbnailPropertyCtrl.h + UI/PropertyEditor/ThumbnailPropertyCtrl.cpp UI/Slice/SlicePushWidget.cpp UI/Slice/SlicePushWidget.hxx UI/Slice/SliceOverridesNotificationWindow.cpp @@ -652,6 +652,7 @@ set(FILES Prefab/PrefabPublicHandler.h Prefab/PrefabPublicHandler.cpp Prefab/PrefabPublicInterface.h + Prefab/PrefabPublicNotificationBus.h Prefab/PrefabUndo.h Prefab/PrefabUndo.cpp Prefab/PrefabUndoCache.cpp @@ -687,7 +688,6 @@ set(FILES UI/Outliner/EntityOutlinerDisplayOptionsMenu.cpp UI/Outliner/EntityOutlinerTreeView.hxx UI/Outliner/EntityOutlinerTreeView.cpp - UI/Outliner/EntityOutlinerWidgetInterface.h UI/Outliner/EntityOutlinerWidget.hxx UI/Outliner/EntityOutlinerWidget.cpp UI/Outliner/EntityOutlinerCacheBus.h diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_windows_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_windows_files.cmake index 0b085a5d31..97473ce7d2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_windows_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_windows_files.cmake @@ -34,4 +34,4 @@ set(FILES UI/UICore/SaveChangesDialog.cpp UI/UICore/SaveChangesDialog.ui ToolsFileUtils/ToolsFileUtils_win.cpp -) \ No newline at end of file +) diff --git a/Code/Framework/AzToolsFramework/CMakeLists.txt b/Code/Framework/AzToolsFramework/CMakeLists.txt index 4752c9bbab..53dba8eb48 100644 --- a/Code/Framework/AzToolsFramework/CMakeLists.txt +++ b/Code/Framework/AzToolsFramework/CMakeLists.txt @@ -93,4 +93,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) NAME AZ::AzToolsFramework.Benchmarks TARGET AZ::AzToolsFramework.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Code/Framework/AzToolsFramework/Platform/Common/Clang/aztoolsframework_clang.cmake b/Code/Framework/AzToolsFramework/Platform/Common/Clang/aztoolsframework_clang.cmake index 2ef719a8b7..55e5a3d2e5 100644 --- a/Code/Framework/AzToolsFramework/Platform/Common/Clang/aztoolsframework_clang.cmake +++ b/Code/Framework/AzToolsFramework/Platform/Common/Clang/aztoolsframework_clang.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an AS IS BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySelectionTests.cpp index 6625e56470..66ccf09aaf 100644 --- a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySelectionTests.cpp @@ -81,12 +81,17 @@ namespace UnitTest ToolsApplicationRequestBus::BroadcastResult( anyEntitySelected, &ToolsApplicationRequests::AreAnyEntitiesSelected); + int selectedEntitiesCount = 0; + ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesCount, &ToolsApplicationRequests::GetSelectedEntitiesCount); + EntityIdList selectedEntityIds; ToolsApplicationRequestBus::BroadcastResult( selectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); EXPECT_TRUE(testEntitySelected); EXPECT_TRUE(anyEntitySelected); + EXPECT_EQ(selectedEntitiesCount, 1); EXPECT_EQ(selectedEntityIds.size(), 1); EXPECT_EQ(selectedEntityIds.front(), testEntityId); @@ -100,11 +105,15 @@ namespace UnitTest ToolsApplicationRequestBus::BroadcastResult( anyEntitySelected, &ToolsApplicationRequests::AreAnyEntitiesSelected); + ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesCount, &ToolsApplicationRequests::GetSelectedEntitiesCount); + ToolsApplicationRequestBus::BroadcastResult( selectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); EXPECT_FALSE(testEntitySelected); EXPECT_FALSE(anyEntitySelected); + EXPECT_EQ(selectedEntitiesCount, 0); EXPECT_TRUE(selectedEntityIds.empty()); } @@ -141,11 +150,16 @@ namespace UnitTest ToolsApplicationRequestBus::BroadcastResult( anyEntitySelected, &ToolsApplicationRequests::AreAnyEntitiesSelected); + int selectedEntitiesCount = 0; + ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesCount, &ToolsApplicationRequests::GetSelectedEntitiesCount); + EntityIdList actualSelectedEntityIds; ToolsApplicationRequestBus::BroadcastResult( actualSelectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); EXPECT_TRUE(anyEntitySelected); + EXPECT_EQ(selectedEntitiesCount, expectedSelectedEntityIds.size()); EXPECT_EQ(actualSelectedEntityIds.size(), expectedSelectedEntityIds.size()); for (auto& id : expectedSelectedEntityIds) { @@ -160,10 +174,14 @@ namespace UnitTest ToolsApplicationRequestBus::BroadcastResult( anyEntitySelected, &ToolsApplicationRequests::AreAnyEntitiesSelected); + ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesCount, &ToolsApplicationRequests::GetSelectedEntitiesCount); + ToolsApplicationRequestBus::BroadcastResult( actualSelectedEntityIds, &ToolsApplicationRequests::GetSelectedEntities); EXPECT_TRUE(anyEntitySelected); + EXPECT_EQ(selectedEntitiesCount, expectedSelectedEntityIds.size()); EXPECT_EQ(actualSelectedEntityIds.size(), expectedSelectedEntityIds.size()); for (auto& id : expectedSelectedEntityIds) { diff --git a/Code/Framework/AzToolsFramework/Tests/FingerprintingTests.cpp b/Code/Framework/AzToolsFramework/Tests/FingerprintingTests.cpp index 35e7b9303b..7a2b54c534 100644 --- a/Code/Framework/AzToolsFramework/Tests/FingerprintingTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/FingerprintingTests.cpp @@ -297,4 +297,4 @@ namespace UnitTest EXPECT_NE(InvalidTypeFingerprint, fingerprinter.GenerateFingerprintForAllTypesInObject(&object)); } -} // namespace UnitTest \ No newline at end of file +} // namespace UnitTest diff --git a/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp b/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp index 1c36bd098b..510471bb77 100644 --- a/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp +++ b/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp @@ -538,4 +538,4 @@ namespace UnitTest EXPECT_EQ(numUndos, counter); EXPECT_EQ(tracker, numUndos); } -} \ No newline at end of file +} diff --git a/Code/Framework/CMakeLists.txt b/Code/Framework/CMakeLists.txt index fff4d0a674..325d614bfb 100644 --- a/Code/Framework/CMakeLists.txt +++ b/Code/Framework/CMakeLists.txt @@ -22,4 +22,4 @@ add_subdirectory(AzNetworking) add_subdirectory(Crcfix) add_subdirectory(GFxFramework) add_subdirectory(GridMate) -add_subdirectory(Tests) \ No newline at end of file +add_subdirectory(Tests) diff --git a/Code/Framework/Crcfix/CMakeLists.txt b/Code/Framework/Crcfix/CMakeLists.txt index 909371a5a2..2a6770d7f9 100644 --- a/Code/Framework/Crcfix/CMakeLists.txt +++ b/Code/Framework/Crcfix/CMakeLists.txt @@ -32,4 +32,4 @@ ly_add_source_properties( SOURCES crcfix.cpp PROPERTY COMPILE_DEFINITIONS VALUES _CRT_SECURE_NO_WARNINGS -) \ No newline at end of file +) diff --git a/Code/Framework/Crcfix/Platform/Linux/PAL_linux.cmake b/Code/Framework/Crcfix/Platform/Linux/PAL_linux.cmake index a636fe3d06..644b6dc4a8 100644 --- a/Code/Framework/Crcfix/Platform/Linux/PAL_linux.cmake +++ b/Code/Framework/Crcfix/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_CRCFIX FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_CRCFIX FALSE) diff --git a/Code/Framework/Crcfix/Platform/Mac/PAL_mac.cmake b/Code/Framework/Crcfix/Platform/Mac/PAL_mac.cmake index a636fe3d06..644b6dc4a8 100644 --- a/Code/Framework/Crcfix/Platform/Mac/PAL_mac.cmake +++ b/Code/Framework/Crcfix/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_CRCFIX FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_CRCFIX FALSE) diff --git a/Code/Framework/Crcfix/Platform/Windows/PAL_windows.cmake b/Code/Framework/Crcfix/Platform/Windows/PAL_windows.cmake index 4e372ce7c9..6559ee93dd 100644 --- a/Code/Framework/Crcfix/Platform/Windows/PAL_windows.cmake +++ b/Code/Framework/Crcfix/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_CRCFIX TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_CRCFIX TRUE) diff --git a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/IMaterial.h b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/IMaterial.h index e78f8c94dd..109d37c3d2 100644 --- a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/IMaterial.h +++ b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/IMaterial.h @@ -182,4 +182,4 @@ namespace AZ } //namespace GFxFramework } //namespace AZ -#endif // AZINCLUDE_GFXFRAMEWORK_IMATERIAL_H_ \ No newline at end of file +#endif // AZINCLUDE_GFXFRAMEWORK_IMATERIAL_H_ diff --git a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp index 1f6034a285..72e401974f 100644 --- a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp +++ b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp @@ -952,4 +952,4 @@ namespace AZ }//GFxFramework -}//AZ \ No newline at end of file +}//AZ diff --git a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.h b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.h index 24b00ea3d7..3082be4cad 100644 --- a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.h +++ b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.h @@ -118,4 +118,4 @@ namespace AZ }; } //GFxFramework -}//AZ \ No newline at end of file +}//AZ diff --git a/Code/Framework/GridMate/CMakeLists.txt b/Code/Framework/GridMate/CMakeLists.txt index f326bda179..20ce582307 100644 --- a/Code/Framework/GridMate/CMakeLists.txt +++ b/Code/Framework/GridMate/CMakeLists.txt @@ -28,8 +28,9 @@ ly_add_target( ${pal_dir} BUILD_DEPENDENCIES PRIVATE - 3rdParty::OpenSSL AZ::AzCore + PUBLIC + 3rdParty::OpenSSL ) ly_add_source_properties( diff --git a/Code/Framework/GridMate/GridMate/Carrier/Carrier.h b/Code/Framework/GridMate/GridMate/Carrier/Carrier.h index 7f7cfac04c..113df8f083 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/Carrier.h +++ b/Code/Framework/GridMate/GridMate/Carrier/Carrier.h @@ -546,4 +546,4 @@ namespace GridMate } } -#endif // GM_CARRIER_H \ No newline at end of file +#endif // GM_CARRIER_H diff --git a/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h b/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h index 5e8b54f17f..a4bb836b81 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h +++ b/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h @@ -160,4 +160,4 @@ namespace GridMate }; } -#endif // GM_DEFAULT_SIMULATOR_H \ No newline at end of file +#endif // GM_DEFAULT_SIMULATOR_H diff --git a/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.h b/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.h index e0bbfe3f3b..b3d1682a82 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.h +++ b/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.h @@ -195,4 +195,4 @@ namespace GridMate }; } -#endif // GM_DEFAULT_TRAFFIC_CONTROL_H \ No newline at end of file +#endif // GM_DEFAULT_TRAFFIC_CONTROL_H diff --git a/Code/Framework/GridMate/GridMate/Carrier/StreamSocketDriver.h b/Code/Framework/GridMate/GridMate/Carrier/StreamSocketDriver.h index 041e9bc60c..bf337105ce 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/StreamSocketDriver.h +++ b/Code/Framework/GridMate/GridMate/Carrier/StreamSocketDriver.h @@ -280,4 +280,4 @@ namespace GridMate }; } -#endif // GM_STREAM_SOCKET_DRIVER_H \ No newline at end of file +#endif // GM_STREAM_SOCKET_DRIVER_H diff --git a/Code/Framework/GridMate/GridMate/Carrier/Utils.h b/Code/Framework/GridMate/GridMate/Carrier/Utils.h index 45f873fad4..59136074bb 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/Utils.h +++ b/Code/Framework/GridMate/GridMate/Carrier/Utils.h @@ -25,4 +25,4 @@ namespace GridMate } } -#endif // GM_DEFAULT_TRAFFIC_CONTROL_H \ No newline at end of file +#endif // GM_DEFAULT_TRAFFIC_CONTROL_H diff --git a/Code/Framework/GridMate/GridMate/Drillers/CarrierDriller.h b/Code/Framework/GridMate/GridMate/Drillers/CarrierDriller.h index f6577d5181..231a3a6c34 100644 --- a/Code/Framework/GridMate/GridMate/Drillers/CarrierDriller.h +++ b/Code/Framework/GridMate/GridMate/Drillers/CarrierDriller.h @@ -63,4 +63,4 @@ namespace GridMate } } -#endif // GM_CARRIER_DRILLER_H \ No newline at end of file +#endif // GM_CARRIER_DRILLER_H diff --git a/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.cpp b/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.cpp index 8aed8ca168..0c14d70041 100644 --- a/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.cpp +++ b/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.cpp @@ -142,4 +142,4 @@ namespace GridMate m_output->Write(Tags::TIME_PROCESSED_MILLISEC, AZStd::chrono::milliseconds(AZStd::chrono::system_clock::now().time_since_epoch()).count()); } } -} \ No newline at end of file +} diff --git a/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.h b/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.h index 12fb356cb1..17fedfc022 100644 --- a/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.h +++ b/Code/Framework/GridMate/GridMate/Drillers/ReplicaDriller.h @@ -78,4 +78,4 @@ namespace GridMate } } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h b/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h index e5ecd6b6c4..4111d17f59 100644 --- a/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h +++ b/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h @@ -78,4 +78,4 @@ namespace GridMate } } -#endif // GM_SESSION_DRILLER_H \ No newline at end of file +#endif // GM_SESSION_DRILLER_H diff --git a/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h b/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h index feb20b9f3f..800d6397a0 100644 --- a/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h +++ b/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h @@ -238,4 +238,4 @@ namespace GridMate /////////////////////////////////////////////////////////////////////////// } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/GridMate/GridMate/Replica/Interest/InterestQueryResult.cpp b/Code/Framework/GridMate/GridMate/Replica/Interest/InterestQueryResult.cpp index 9372ba5671..847351a2a1 100644 --- a/Code/Framework/GridMate/GridMate/Replica/Interest/InterestQueryResult.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/Interest/InterestQueryResult.cpp @@ -26,4 +26,4 @@ namespace GridMate } } // namespace GridMate -*/ \ No newline at end of file +*/ diff --git a/Code/Framework/GridMate/GridMate/Replica/ReplicaDefs.h b/Code/Framework/GridMate/GridMate/Replica/ReplicaDefs.h index 4aab200718..cc01423655 100644 --- a/Code/Framework/GridMate/GridMate/Replica/ReplicaDefs.h +++ b/Code/Framework/GridMate/GridMate/Replica/ReplicaDefs.h @@ -84,4 +84,4 @@ namespace GridMate static const ZoneMask ZoneMask_All = (ZoneMask) - 1; } // namespace Gridmate -#endif // GM_REPLICADEFS_H \ No newline at end of file +#endif // GM_REPLICADEFS_H diff --git a/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.cpp b/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.cpp index 581de9e548..e5580055b4 100644 --- a/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.cpp @@ -100,4 +100,4 @@ namespace GridMate { delete this; } -} \ No newline at end of file +} diff --git a/Code/Framework/GridMate/GridMate/Replica/Tasks/ReplicaProcessPolicy.cpp b/Code/Framework/GridMate/GridMate/Replica/Tasks/ReplicaProcessPolicy.cpp index 11f3b67990..d4083e8f68 100644 --- a/Code/Framework/GridMate/GridMate/Replica/Tasks/ReplicaProcessPolicy.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/Tasks/ReplicaProcessPolicy.cpp @@ -98,4 +98,4 @@ namespace GridMate return shouldProcess; } -} \ No newline at end of file +} diff --git a/Code/Framework/GridMate/GridMate/Serialize/DataMarshal.h b/Code/Framework/GridMate/GridMate/Serialize/DataMarshal.h index ba50a083e0..a9d65c8a24 100644 --- a/Code/Framework/GridMate/GridMate/Serialize/DataMarshal.h +++ b/Code/Framework/GridMate/GridMate/Serialize/DataMarshal.h @@ -149,4 +149,4 @@ namespace GridMate } #endif // GM_UTILS_DATA_MARSHAL -#pragma once \ No newline at end of file +#pragma once diff --git a/Code/Framework/GridMate/GridMate/Session/LANSessionServiceBus.h b/Code/Framework/GridMate/GridMate/Session/LANSessionServiceBus.h index 4b55f38e72..9f237a5b77 100644 --- a/Code/Framework/GridMate/GridMate/Session/LANSessionServiceBus.h +++ b/Code/Framework/GridMate/GridMate/Session/LANSessionServiceBus.h @@ -32,4 +32,4 @@ namespace GridMate typedef AZ::EBus LANSessionServiceBus; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/GridMate/GridMate/Session/LANSessionServiceTypes.h b/Code/Framework/GridMate/GridMate/Session/LANSessionServiceTypes.h index e3ca9be708..92f09196c4 100644 --- a/Code/Framework/GridMate/GridMate/Session/LANSessionServiceTypes.h +++ b/Code/Framework/GridMate/GridMate/Session/LANSessionServiceTypes.h @@ -61,4 +61,4 @@ namespace GridMate }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/GridMate/GridMate/Session/SessionServiceBus.h b/Code/Framework/GridMate/GridMate/Session/SessionServiceBus.h index bfa63a13d7..6622bfb21b 100644 --- a/Code/Framework/GridMate/GridMate/Session/SessionServiceBus.h +++ b/Code/Framework/GridMate/GridMate/Session/SessionServiceBus.h @@ -31,4 +31,4 @@ namespace GridMate }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Framework/GridMate/Platform/Android/GridMate/Carrier/SocketDriver_Platform.h b/Code/Framework/GridMate/Platform/Android/GridMate/Carrier/SocketDriver_Platform.h index 7b2a760d2b..6ddbb767c8 100644 --- a/Code/Framework/GridMate/Platform/Android/GridMate/Carrier/SocketDriver_Platform.h +++ b/Code/Framework/GridMate/Platform/Android/GridMate/Carrier/SocketDriver_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Platform/Android/GridMate/Session/Session_Platform.h b/Code/Framework/GridMate/Platform/Android/GridMate/Session/Session_Platform.h index a6231dd1b9..d39f299ffb 100644 --- a/Code/Framework/GridMate/Platform/Android/GridMate/Session/Session_Platform.h +++ b/Code/Framework/GridMate/Platform/Android/GridMate/Session/Session_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Platform/Common/gridmate_clang.cmake b/Code/Framework/GridMate/Platform/Common/gridmate_clang.cmake index acdf10c23a..1cbeed7a34 100644 --- a/Code/Framework/GridMate/Platform/Common/gridmate_clang.cmake +++ b/Code/Framework/GridMate/Platform/Common/gridmate_clang.cmake @@ -15,4 +15,4 @@ ly_add_source_properties( GridMate/Carrier/StreamSecureSocketDriver.cpp PROPERTY COMPILE_OPTIONS VALUES -Wno-deprecated-declarations -) \ No newline at end of file +) diff --git a/Code/Framework/GridMate/Platform/Linux/GridMate/Session/Session_Platform.h b/Code/Framework/GridMate/Platform/Linux/GridMate/Session/Session_Platform.h index 1629b9803b..44ca98c0e7 100644 --- a/Code/Framework/GridMate/Platform/Linux/GridMate/Session/Session_Platform.h +++ b/Code/Framework/GridMate/Platform/Linux/GridMate/Session/Session_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Platform/Windows/GridMate/Session/LANSession_Windows.cpp b/Code/Framework/GridMate/Platform/Windows/GridMate/Session/LANSession_Windows.cpp index 4c6d7bb25d..39a8cab53b 100644 --- a/Code/Framework/GridMate/Platform/Windows/GridMate/Session/LANSession_Windows.cpp +++ b/Code/Framework/GridMate/Platform/Windows/GridMate/Session/LANSession_Windows.cpp @@ -38,4 +38,4 @@ namespace GridMate extendedName = GridMate::string::format("%s::%s", hostName, procName); } } -} \ No newline at end of file +} diff --git a/Code/Framework/GridMate/Platform/Windows/GridMate/Session/Session_Platform.h b/Code/Framework/GridMate/Platform/Windows/GridMate/Session/Session_Platform.h index 4b4bcfeec0..d3fe7e692f 100644 --- a/Code/Framework/GridMate/Platform/Windows/GridMate/Session/Session_Platform.h +++ b/Code/Framework/GridMate/Platform/Windows/GridMate/Session/Session_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Platform/Windows/platform_windows.cmake b/Code/Framework/GridMate/Platform/Windows/platform_windows.cmake index 0368ddd2b9..f4a250e3ac 100644 --- a/Code/Framework/GridMate/Platform/Windows/platform_windows.cmake +++ b/Code/Framework/GridMate/Platform/Windows/platform_windows.cmake @@ -18,4 +18,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE ws2_32 -) \ No newline at end of file +) diff --git a/Code/Framework/GridMate/Platform/iOS/GridMate/Session/Session_Platform.h b/Code/Framework/GridMate/Platform/iOS/GridMate/Session/Session_Platform.h index aadc6c5dfd..de237f2d74 100644 --- a/Code/Framework/GridMate/Platform/iOS/GridMate/Session/Session_Platform.h +++ b/Code/Framework/GridMate/Platform/iOS/GridMate/Session/Session_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/Platform/Android/GridMateTests_Traits_Platform.h b/Code/Framework/GridMate/Tests/Platform/Android/GridMateTests_Traits_Platform.h index 2785d85152..f135c46e67 100644 --- a/Code/Framework/GridMate/Tests/Platform/Android/GridMateTests_Traits_Platform.h +++ b/Code/Framework/GridMate/Tests/Platform/Android/GridMateTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/Platform/Linux/GridMateTests_Traits_Platform.h b/Code/Framework/GridMate/Tests/Platform/Linux/GridMateTests_Traits_Platform.h index 8ea2bbdeae..0b1cb9ab5e 100644 --- a/Code/Framework/GridMate/Tests/Platform/Linux/GridMateTests_Traits_Platform.h +++ b/Code/Framework/GridMate/Tests/Platform/Linux/GridMateTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/Platform/Mac/GridMateTests_Traits_Platform.h b/Code/Framework/GridMate/Tests/Platform/Mac/GridMateTests_Traits_Platform.h index f1361f7f3b..85a49e0489 100644 --- a/Code/Framework/GridMate/Tests/Platform/Mac/GridMateTests_Traits_Platform.h +++ b/Code/Framework/GridMate/Tests/Platform/Mac/GridMateTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/Platform/Windows/GridMateTests_Traits_Platform.h b/Code/Framework/GridMate/Tests/Platform/Windows/GridMateTests_Traits_Platform.h index d105be5255..3b760d0925 100644 --- a/Code/Framework/GridMate/Tests/Platform/Windows/GridMateTests_Traits_Platform.h +++ b/Code/Framework/GridMate/Tests/Platform/Windows/GridMateTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/Platform/iOS/GridMateTests_Traits_Platform.h b/Code/Framework/GridMate/Tests/Platform/iOS/GridMateTests_Traits_Platform.h index fbc70c6223..099625a729 100644 --- a/Code/Framework/GridMate/Tests/Platform/iOS/GridMateTests_Traits_Platform.h +++ b/Code/Framework/GridMate/Tests/Platform/iOS/GridMateTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/GridMate/Tests/StreamSecureSocketDriverTests.cpp b/Code/Framework/GridMate/Tests/StreamSecureSocketDriverTests.cpp index 30c80e4523..2a0b8f249b 100644 --- a/Code/Framework/GridMate/Tests/StreamSecureSocketDriverTests.cpp +++ b/Code/Framework/GridMate/Tests/StreamSecureSocketDriverTests.cpp @@ -496,4 +496,4 @@ GM_TEST_SUITE(StreamSecureSocketDriverTests) GM_TEST(Integ_StreamSecureSocketDriverTestsPingPong); GM_TEST_SUITE_END() -#endif // AZ_TRAIT_GRIDMATE_ENABLE_OPENSSL \ No newline at end of file +#endif // AZ_TRAIT_GRIDMATE_ENABLE_OPENSSL diff --git a/Code/Framework/GridMate/Tests/steam_appid.txt b/Code/Framework/GridMate/Tests/steam_appid.txt index 7ad8022502..36e082614b 100644 --- a/Code/Framework/GridMate/Tests/steam_appid.txt +++ b/Code/Framework/GridMate/Tests/steam_appid.txt @@ -1 +1 @@ -480 \ No newline at end of file +480 diff --git a/Code/Framework/Tests/BehaviorEntityTests.cpp b/Code/Framework/Tests/BehaviorEntityTests.cpp index bbcffa3e8d..5a4116a23b 100644 --- a/Code/Framework/Tests/BehaviorEntityTests.cpp +++ b/Code/Framework/Tests/BehaviorEntityTests.cpp @@ -301,4 +301,4 @@ TEST_F(BehaviorEntityTest, GetComponentConfiguration_Succeeds) bool configSuccess = m_behaviorEntity.GetComponentConfiguration(rawComponent->GetId(), retrievedConfig); EXPECT_TRUE(configSuccess); EXPECT_EQ(rawComponent->m_config.m_brimWidth, retrievedConfig.m_brimWidth); -} \ No newline at end of file +} diff --git a/Code/Framework/Tests/CMakeLists.txt b/Code/Framework/Tests/CMakeLists.txt index c6bd51de47..491f6d8e14 100644 --- a/Code/Framework/Tests/CMakeLists.txt +++ b/Code/Framework/Tests/CMakeLists.txt @@ -63,4 +63,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) NAME AZ::Framework.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Code/Framework/Tests/ComponentAdapterTests.cpp b/Code/Framework/Tests/ComponentAdapterTests.cpp index c3c7cc84f7..e6e3a0d4da 100644 --- a/Code/Framework/Tests/ComponentAdapterTests.cpp +++ b/Code/Framework/Tests/ComponentAdapterTests.cpp @@ -177,4 +177,4 @@ namespace UnitTest EXPECT_NE(testRuntimeComponent, nullptr); } -} \ No newline at end of file +} diff --git a/Code/Framework/Tests/FrameworkApplicationFixture.h b/Code/Framework/Tests/FrameworkApplicationFixture.h index 642749dcd6..f3a90864e7 100644 --- a/Code/Framework/Tests/FrameworkApplicationFixture.h +++ b/Code/Framework/Tests/FrameworkApplicationFixture.h @@ -83,4 +83,4 @@ namespace UnitTest AZStd::aligned_storage::value>::type m_applicationBuffer; AzFramework::Application* m_application; }; -} \ No newline at end of file +} diff --git a/Code/Framework/Tests/Platform/Android/AzFrameworkTests_Traits_Platform.h b/Code/Framework/Tests/Platform/Android/AzFrameworkTests_Traits_Platform.h index e0b35e6010..3d044be529 100644 --- a/Code/Framework/Tests/Platform/Android/AzFrameworkTests_Traits_Platform.h +++ b/Code/Framework/Tests/Platform/Android/AzFrameworkTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/Tests/Platform/Linux/AzFrameworkTests_Traits_Platform.h b/Code/Framework/Tests/Platform/Linux/AzFrameworkTests_Traits_Platform.h index 1199837706..81490e7d7b 100644 --- a/Code/Framework/Tests/Platform/Linux/AzFrameworkTests_Traits_Platform.h +++ b/Code/Framework/Tests/Platform/Linux/AzFrameworkTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/Tests/Platform/Mac/AzFrameworkTests_Traits_Platform.h b/Code/Framework/Tests/Platform/Mac/AzFrameworkTests_Traits_Platform.h index 28798630f4..af401002f9 100644 --- a/Code/Framework/Tests/Platform/Mac/AzFrameworkTests_Traits_Platform.h +++ b/Code/Framework/Tests/Platform/Mac/AzFrameworkTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/Tests/Platform/Windows/AzFrameworkTests_Traits_Platform.h b/Code/Framework/Tests/Platform/Windows/AzFrameworkTests_Traits_Platform.h index 565e001871..b3196682ac 100644 --- a/Code/Framework/Tests/Platform/Windows/AzFrameworkTests_Traits_Platform.h +++ b/Code/Framework/Tests/Platform/Windows/AzFrameworkTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/Tests/Platform/iOS/AzFrameworkTests_Traits_Platform.h b/Code/Framework/Tests/Platform/iOS/AzFrameworkTests_Traits_Platform.h index d30209ac3e..41bc599d73 100644 --- a/Code/Framework/Tests/Platform/iOS/AzFrameworkTests_Traits_Platform.h +++ b/Code/Framework/Tests/Platform/iOS/AzFrameworkTests_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Framework/Tests/framework_shared_tests_files.cmake b/Code/Framework/Tests/framework_shared_tests_files.cmake index bb3088d892..57345ee630 100644 --- a/Code/Framework/Tests/framework_shared_tests_files.cmake +++ b/Code/Framework/Tests/framework_shared_tests_files.cmake @@ -12,4 +12,4 @@ set(FILES Utils/Utils.h Utils/Utils.cpp -) \ No newline at end of file +) diff --git a/Code/LauncherUnified/FindLauncherGenerator.cmake b/Code/LauncherUnified/FindLauncherGenerator.cmake index 0a975776b8..415d77ea29 100644 --- a/Code/LauncherUnified/FindLauncherGenerator.cmake +++ b/Code/LauncherUnified/FindLauncherGenerator.cmake @@ -11,4 +11,4 @@ set(pal_dir ${LY_ROOT_FOLDER}/LauncherGenerator/Platform/${PAL_PLATFORM_NAME}) include(${pal_dir}/LauncherUnified_traits_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) -include(${LY_ROOT_FOLDER}/LauncherGenerator/launcher_generator.cmake) \ No newline at end of file +include(${LY_ROOT_FOLDER}/LauncherGenerator/launcher_generator.cmake) diff --git a/Code/LauncherUnified/Platform/Android/Launcher_Traits_Platform.h b/Code/LauncherUnified/Platform/Android/Launcher_Traits_Platform.h index 900b8dd60e..aaebd5a3c8 100644 --- a/Code/LauncherUnified/Platform/Android/Launcher_Traits_Platform.h +++ b/Code/LauncherUnified/Platform/Android/Launcher_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/LauncherUnified/Platform/Common/Apple/Launcher_Apple.mm b/Code/LauncherUnified/Platform/Common/Apple/Launcher_Apple.mm index 523871746e..3e329ed3ff 100644 --- a/Code/LauncherUnified/Platform/Common/Apple/Launcher_Apple.mm +++ b/Code/LauncherUnified/Platform/Common/Apple/Launcher_Apple.mm @@ -31,4 +31,4 @@ namespace O3DELauncher return pathToAssets; } -} \ No newline at end of file +} diff --git a/Code/LauncherUnified/Platform/Linux/Launcher_Traits_Platform.h b/Code/LauncherUnified/Platform/Linux/Launcher_Traits_Platform.h index c4e0178eb7..9a3d957a5c 100644 --- a/Code/LauncherUnified/Platform/Linux/Launcher_Traits_Platform.h +++ b/Code/LauncherUnified/Platform/Linux/Launcher_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/LauncherUnified/Platform/Mac/Launcher_Traits_Platform.h b/Code/LauncherUnified/Platform/Mac/Launcher_Traits_Platform.h index 4900545e53..c87f78bbfe 100644 --- a/Code/LauncherUnified/Platform/Mac/Launcher_Traits_Platform.h +++ b/Code/LauncherUnified/Platform/Mac/Launcher_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/LauncherUnified/Platform/Windows/DPIAware.xml b/Code/LauncherUnified/Platform/Windows/DPIAware.xml index 5dea26f9d5..bb01230627 100644 --- a/Code/LauncherUnified/Platform/Windows/DPIAware.xml +++ b/Code/LauncherUnified/Platform/Windows/DPIAware.xml @@ -4,4 +4,4 @@ true - \ No newline at end of file + diff --git a/Code/LauncherUnified/Platform/Windows/Launcher.rc.in b/Code/LauncherUnified/Platform/Windows/Launcher.rc.in index 3b5f6985bb..ae08976c2a 100644 --- a/Code/LauncherUnified/Platform/Windows/Launcher.rc.in +++ b/Code/LauncherUnified/Platform/Windows/Launcher.rc.in @@ -10,4 +10,4 @@ * */ -IDI_ICON1 ICON DISCARDABLE "@ICON_FILE@" \ No newline at end of file +IDI_ICON1 ICON DISCARDABLE "@ICON_FILE@" diff --git a/Code/LauncherUnified/Platform/Windows/Launcher_Traits_Platform.h b/Code/LauncherUnified/Platform/Windows/Launcher_Traits_Platform.h index a43a47a37a..68691e09a5 100644 --- a/Code/LauncherUnified/Platform/Windows/Launcher_Traits_Platform.h +++ b/Code/LauncherUnified/Platform/Windows/Launcher_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/LauncherUnified/Platform/Windows/launcher_game_windows_files.cmake b/Code/LauncherUnified/Platform/Windows/launcher_game_windows_files.cmake index 6e448aebc8..72f69252d3 100644 --- a/Code/LauncherUnified/Platform/Windows/launcher_game_windows_files.cmake +++ b/Code/LauncherUnified/Platform/Windows/launcher_game_windows_files.cmake @@ -11,4 +11,4 @@ set(FILES Launcher_Game_Windows.cpp -) \ No newline at end of file +) diff --git a/Code/LauncherUnified/Platform/Windows/launcher_project_windows.cmake b/Code/LauncherUnified/Platform/Windows/launcher_project_windows.cmake index 93a839ae47..4b5805908e 100644 --- a/Code/LauncherUnified/Platform/Windows/launcher_project_windows.cmake +++ b/Code/LauncherUnified/Platform/Windows/launcher_project_windows.cmake @@ -9,17 +9,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -if (LY_MONOLITHIC_GAME) # only Atom is supported in monolithic - set(LY_BUILD_DEPENDENCIES - PUBLIC - Legacy::CryRenderOther - ) -else() - set(LY_BUILD_DEPENDENCIES - PRIVATE - Legacy::CryRenderD3D11 - ) -endif() +set(LY_BUILD_DEPENDENCIES + PRIVATE + Legacy::CryRenderD3D11 +) set(ICON_FILE ${project_real_path}/Gem/Resources/GameSDK.ico) if(NOT EXISTS ${ICON_FILE}) diff --git a/Code/LauncherUnified/Platform/iOS/Launcher_Traits_Platform.h b/Code/LauncherUnified/Platform/iOS/Launcher_Traits_Platform.h index 084a8ddf49..0a5e31644e 100644 --- a/Code/LauncherUnified/Platform/iOS/Launcher_Traits_Platform.h +++ b/Code/LauncherUnified/Platform/iOS/Launcher_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/LauncherUnified/Platform/iOS/launcher_project_ios.cmake b/Code/LauncherUnified/Platform/iOS/launcher_project_ios.cmake index 8d2bc95eda..e846af494e 100644 --- a/Code/LauncherUnified/Platform/iOS/launcher_project_ios.cmake +++ b/Code/LauncherUnified/Platform/iOS/launcher_project_ios.cmake @@ -63,4 +63,4 @@ add_custom_command(TARGET ${project_name}.GameLauncher POST_BUILD WORKING_DIRECTORY ${layout_tool_dir} COMMENT "Synchronizing Layout Assets ..." VERBATIM -) \ No newline at end of file +) diff --git a/Code/LauncherUnified/launcher_generator.cmake b/Code/LauncherUnified/launcher_generator.cmake index 5fd4c17442..b73d2c1fff 100644 --- a/Code/LauncherUnified/launcher_generator.cmake +++ b/Code/LauncherUnified/launcher_generator.cmake @@ -202,4 +202,4 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC endif() -endforeach() \ No newline at end of file +endforeach() diff --git a/Code/Sandbox/.p4ignore b/Code/Sandbox/.p4ignore index b7a6ec06dd..9c6b6fcd91 100644 --- a/Code/Sandbox/.p4ignore +++ b/Code/Sandbox/.p4ignore @@ -2,4 +2,4 @@ SDKs #ignore these files -*.user \ No newline at end of file +*.user diff --git a/Code/Sandbox/CMakeLists.txt b/Code/Sandbox/CMakeLists.txt index f921a1793d..95e7284b63 100644 --- a/Code/Sandbox/CMakeLists.txt +++ b/Code/Sandbox/CMakeLists.txt @@ -12,4 +12,4 @@ # Plugins should be processed before because we are going to generate the list of plugins # that the editor should load add_subdirectory(Plugins) -add_subdirectory(Editor) \ No newline at end of file +add_subdirectory(Editor) diff --git a/Code/Sandbox/Editor/2DViewport.cpp b/Code/Sandbox/Editor/2DViewport.cpp index e6e62be1f1..d86ea03bdf 100644 --- a/Code/Sandbox/Editor/2DViewport.cpp +++ b/Code/Sandbox/Editor/2DViewport.cpp @@ -20,7 +20,6 @@ #include "2DViewport.h" #include "CryEditDoc.h" #include "DisplaySettings.h" -#include "EditTool.h" #include "GameEngine.h" #include "Settings.h" #include "ViewManager.h" @@ -1117,11 +1116,6 @@ void Q2DViewport::DrawObjects(DisplayContext& dc) GetIEditor()->GetObjectManager()->Display(dc); } - // Display editing tool. - if (GetEditTool()) - { - GetEditTool()->Display(dc); - } dc.PopMatrix(); } diff --git a/Code/Sandbox/Editor/Animation/AnimationBipedBoneNames.h b/Code/Sandbox/Editor/Animation/AnimationBipedBoneNames.h index 48dfefa9b8..f564e4c788 100644 --- a/Code/Sandbox/Editor/Animation/AnimationBipedBoneNames.h +++ b/Code/Sandbox/Editor/Animation/AnimationBipedBoneNames.h @@ -35,4 +35,4 @@ namespace EditorAnimationBones } -#endif // CRYINCLUDE_EDITOR_ANIMATION_ANIMATIONBIPEDBONENAMES_H \ No newline at end of file +#endif // CRYINCLUDE_EDITOR_ANIMATION_ANIMATIONBIPEDBONENAMES_H diff --git a/Code/Sandbox/Editor/AssetDatabase/AssetDatabaseLocationListener.h b/Code/Sandbox/Editor/AssetDatabase/AssetDatabaseLocationListener.h index ee37480252..0d24c0e8bf 100644 --- a/Code/Sandbox/Editor/AssetDatabase/AssetDatabaseLocationListener.h +++ b/Code/Sandbox/Editor/AssetDatabase/AssetDatabaseLocationListener.h @@ -36,4 +36,4 @@ namespace AssetDatabase AzToolsFramework::AssetDatabase::AssetDatabaseConnection* m_assetDatabaseConnection = nullptr; }; -}//namespace AssetDatabase \ No newline at end of file +}//namespace AssetDatabase diff --git a/Code/Sandbox/Editor/Commands/CommandManagerBus.h b/Code/Sandbox/Editor/Commands/CommandManagerBus.h index ec00fa1ab6..8571d41dac 100644 --- a/Code/Sandbox/Editor/Commands/CommandManagerBus.h +++ b/Code/Sandbox/Editor/Commands/CommandManagerBus.h @@ -31,4 +31,4 @@ public: }; -using CommandManagerRequestBus = AZ::EBus; \ No newline at end of file +using CommandManagerRequestBus = AZ::EBus; diff --git a/Code/Sandbox/Editor/ControlMRU.cpp b/Code/Sandbox/Editor/ControlMRU.cpp index 7b6646161a..20bc465699 100644 --- a/Code/Sandbox/Editor/ControlMRU.cpp +++ b/Code/Sandbox/Editor/ControlMRU.cpp @@ -136,4 +136,4 @@ void CControlMRU::OnCalcDynamicSize(DWORD dwMode) m_dwHideFlags = 0; SetEnabled(FALSE); } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Controls/QRollupCtrl.cpp b/Code/Sandbox/Editor/Controls/QRollupCtrl.cpp deleted file mode 100644 index ea91bdcd62..0000000000 --- a/Code/Sandbox/Editor/Controls/QRollupCtrl.cpp +++ /dev/null @@ -1,588 +0,0 @@ -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - -#include "EditorDefs.h" - -#include "QRollupCtrl.h" - -// Qt -#include -#include -#include -#include -#include -#include - -////////////////////////////////////////////////////////////////////////// - -class QRollupCtrlButton - : public QToolButton -{ -public: - QRollupCtrlButton(QWidget* parent); - - inline void setSelected(bool b) { selected = b; update(); } - inline bool isSelected() const { return selected; } - - QSize sizeHint() const override; - QSize minimumSizeHint() const override; - -protected: - void paintEvent(QPaintEvent*) override; - -private: - bool selected; -}; - -QRollupCtrlButton::QRollupCtrlButton(QWidget* parent) - : QToolButton(parent) - , selected(true) -{ - setBackgroundRole(QPalette::Window); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); - setFocusPolicy(Qt::NoFocus); - - setStyleSheet("* {margin: 2px 5px 2px 5px; border: 1px solid #CBA457;}"); -} - -QSize QRollupCtrlButton::sizeHint() const -{ - QSize iconSize(8, 8); - if (!icon().isNull()) - { - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize); - iconSize += QSize(icone + 2, icone); - } - QSize textSize = fontMetrics().size(Qt::TextShowMnemonic, text()) + QSize(0, 8); - - QSize total(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height())); - return total.expandedTo(QApplication::globalStrut()); -} - -QSize QRollupCtrlButton::minimumSizeHint() const -{ - if (icon().isNull()) - { - return QSize(); - } - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize); - return QSize(icone + 8, icone + 8); -} - -void QRollupCtrlButton::paintEvent(QPaintEvent*) -{ - QStylePainter p(this); - // draw the background manually, not to clash with UI 2.0 style shets - // the numbers here are taken from the stylesheet in the constructor - p.fillRect(QRect(5, 1, width() - 10, height() - 3), QColor(52, 52, 52)); - - { - QStyleOptionToolButton opt; - initStyleOption(&opt); - if (isSelected()) - { - if (opt.state & QStyle::State_MouseOver) - { - opt.state |= QStyle::State_Sunken; - } - opt.state |= QStyle::State_MouseOver; - } - p.drawComplexControl(QStyle::CC_ToolButton, opt); - } - - { - p.setPen(QPen(QColor(132, 128, 125))); - - int top = height() / 2 - 2; - p.drawLine(2, top, 4, top); - p.drawLine(width() - 5, top, width() - 3, top); - - int bottom = !isSelected() ? top + 4 : height(); - p.drawLine(2, bottom, 2, top); - p.drawLine(width() - 3, bottom, width() - 3, top); - - if (!isSelected()) - { - p.drawLine(2, bottom, 4, bottom); - p.drawLine(width() - 5, bottom, width() - 3, bottom); - } - } -} - -////////////////////////////////////////////////////////////////////////// - -QRollupCtrl::Page* QRollupCtrl::page(QWidget* widget) const -{ - if (!widget) - { - return 0; - } - - for (PageList::ConstIterator i = m_pageList.constBegin(); i != m_pageList.constEnd(); ++i) - { - if ((*i).widget == widget) - { - return (Page*)&(*i); - } - } - return 0; -} - -QRollupCtrl::Page* QRollupCtrl::page(int index) -{ - if (index >= 0 && index < m_pageList.size()) - { - return &m_pageList[index]; - } - return 0; -} - -const QRollupCtrl::Page* QRollupCtrl::page(int index) const -{ - if (index >= 0 && index < m_pageList.size()) - { - return &m_pageList.at(index); - } - return 0; -} - -inline void QRollupCtrl::Page::setText(const QString& text) { button->setText(text); } -inline void QRollupCtrl::Page::setIcon(const QIcon& is) { button->setIcon(is); } -inline void QRollupCtrl::Page::setToolTip(const QString& tip) { button->setToolTip(tip); } -inline QString QRollupCtrl::Page::text() const { return button->text(); } -inline QIcon QRollupCtrl::Page::icon() const { return button->icon(); } -inline QString QRollupCtrl::Page::toolTip() const { return button->toolTip(); } - -////////////////////////////////////////////////////////////////////////// - -QRollupCtrl::QRollupCtrl(QWidget* parent) - : QScrollArea(parent) - , m_layout(0) -{ - m_body = new QWidget(this); - m_body->setBackgroundRole(QPalette::Button); - setWidgetResizable(true); - setAlignment(Qt::AlignLeft | Qt::AlignTop); - setWidget(m_body); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - relayout(); -} - -QRollupCtrl::~QRollupCtrl() -{ - foreach(const QRollupCtrl::Page & c, m_pageList) - disconnect(c.widget, &QObject::destroyed, this, &QRollupCtrl::_q_widgetDestroyed); -} - -void QRollupCtrl::readSettings(const QString& qSettingsGroup) -{ - QSettings settings; - settings.beginGroup(qSettingsGroup); - - int i = 0; - foreach(const QRollupCtrl::Page & c, m_pageList) { - QString qObjectName = c.widget->objectName(); - - bool bHidden = settings.value(qObjectName, true).toBool(); - setIndexVisible(i++, !bHidden); - } - - settings.endGroup(); -} - -void QRollupCtrl::writeSettings(const QString& qSettingsGroup) -{ - QSettings settings; - settings.beginGroup(qSettingsGroup); - - for (int i = 0; i < count(); i++) - { - QString qObjectName; - bool bHidden = isPageHidden(i, qObjectName); - - settings.setValue(qObjectName, bHidden); - } -} - -void QRollupCtrl::updateTabs() -{ - for (auto i = m_pageList.constBegin(); i != m_pageList.constEnd(); ++i) - { - QRollupCtrlButton* tB = (*i).button; - QWidget* tW = (*i).sv; - tB->setSelected(tW->isVisible()); - tB->update(); - } -} - -int QRollupCtrl::insertItem(int index, QWidget* widget, const QIcon& icon, const QString& text) -{ - if (!widget) - { - return -1; - } - - auto it = std::find_if(m_pageList.cbegin(), m_pageList.cend(), [widget](const Page& page) { return page.widget == widget; }); - if (it != m_pageList.cend()) - { - return -1; - } - - connect(widget, &QObject::destroyed, this, &QRollupCtrl::_q_widgetDestroyed); - - QRollupCtrl::Page c; - c.widget = widget; - c.button = new QRollupCtrlButton(m_body); - c.button->setContextMenuPolicy(Qt::CustomContextMenu); - connect(c.button, &QRollupCtrlButton::clicked, this, &QRollupCtrl::_q_buttonClicked); - connect(c.button, &QRollupCtrlButton::customContextMenuRequested, this, &QRollupCtrl::_q_custumButtonMenu); - - c.sv = new QFrame(m_body); - c.sv->setObjectName("rollupPaneFrame"); - // c.sv->setFixedHeight(qMax(widget->sizeHint().height(), widget->size().height())); - QVBoxLayout* layout = new QVBoxLayout; - layout->setMargin(3); - layout->addWidget(widget); - c.sv->setLayout(layout); - c.sv->setStyleSheet("QFrame#rollupPaneFrame {margin: 0px 2px 2px 2px; border: 1px solid #84807D; border-top:0px;}"); - c.sv->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - c.sv->show(); - - c.setText(text); - c.setIcon(icon); - - const int numPages = m_pageList.count(); - if (index < 0 || index >= numPages) - { - m_pageList.append(c); - index = numPages - 1; - m_layout->insertWidget(m_layout->count() - 1, c.button); - m_layout->insertWidget(m_layout->count() - 1, c.sv); - } - else - { - m_pageList.insert(index, c); - relayout(); - } - - c.button->show(); - - updateTabs(); - itemInserted(index); - return index; -} - -void QRollupCtrl::_q_buttonClicked() -{ - QObject* tb = sender(); - QWidget* item = 0; - for (auto i = m_pageList.constBegin(); i != m_pageList.constEnd(); ++i) - { - if ((*i).button == tb) - { - item = (*i).widget; - break; - } - } - - if (item) - { - setIndexVisible(indexOf(item), !item->isVisible()); - } -} - -int QRollupCtrl::count() const -{ - return m_pageList.count(); -} - -bool QRollupCtrl::isPageHidden(int index, QString& qObjectName) const -{ - if (index < 0 || index >= m_pageList.size()) - { - return true; - } - const QRollupCtrl::Page& c = m_pageList.at(index); - qObjectName = c.widget->objectName(); - return c.sv->isHidden(); -} - -void QRollupCtrl::setIndexVisible(int index, bool visible) -{ - QRollupCtrl::Page* c = page(index); - if (!c) - { - return; - } - - if (c->sv->isHidden() && visible) - { - c->sv->show(); - } - else if (c->sv->isVisible() && !visible) - { - c->sv->hide(); - } - updateTabs(); -} - -void QRollupCtrl::setWidgetVisible(QWidget* widget, bool visible) -{ - setIndexVisible(indexOf(widget), visible); -} - -void QRollupCtrl::relayout() -{ - delete m_layout; - m_layout = new QVBoxLayout(m_body); - m_layout->setMargin(3); - m_layout->setSpacing(0); - for (QRollupCtrl::PageList::ConstIterator i = m_pageList.constBegin(); i != m_pageList.constEnd(); ++i) - { - m_layout->addWidget((*i).button); - m_layout->addWidget((*i).sv); - } - m_layout->addStretch(); - updateTabs(); -} - -void QRollupCtrl::_q_widgetDestroyed(QObject* object) -{ - // no verification - vtbl corrupted already - QWidget* p = (QWidget*)object; - - QRollupCtrl::Page* c = page(p); - if (!p || !c) - { - return; - } - - m_layout->removeWidget(c->sv); - m_layout->removeWidget(c->button); - c->sv->deleteLater(); // page might still be a child of sv - delete c->button; - - m_pageList.removeOne(*c); -} - -void QRollupCtrl::_q_custumButtonMenu([[maybe_unused]] const QPoint& pos) -{ - QMenu menu; - menu.addAction("Expand All")->setData(-1); - menu.addAction("Collapse All")->setData(-2); - menu.addSeparator(); - for (int i = 0; i < m_pageList.size(); ++i) - { - QRollupCtrl::Page* c = page(i); - QAction* action = menu.addAction(c->button->text()); - action->setCheckable(true); - action->setChecked(c->sv->isVisible()); - action->setData(i); - } - - QAction* action = menu.exec(QCursor::pos()); - if (!action) - { - return; - } - int res = action->data().toInt(); - switch (res) - { - case -1: // fall through - case -2: - expandAllPages(res == -1); - break; - default: - { - QRollupCtrl::Page* c = page(res); - if (c) - { - setIndexVisible(res, !c->sv->isVisible()); - } - } - break; - } -} - -void QRollupCtrl::expandAllPages(bool v) -{ - for (int i = 0; i < m_pageList.size(); i++) - { - setIndexVisible(i, v); - } -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -void QRollupCtrl::clear() -{ - while (!m_pageList.isEmpty()) - { - removeItem(0); - } -} - -void QRollupCtrl::removeItem(QWidget* widget) -{ - auto it = std::find_if(m_pageList.cbegin(), m_pageList.cend(), [widget](const Page& page) { return page.widget == widget; }); - if (it != m_pageList.cend()) - { - removeItem(it - m_pageList.cbegin()); - } -} - -void QRollupCtrl::removeItem(int index) -{ - if (QWidget* w = widget(index)) - { - disconnect(w, &QObject::destroyed, this, &QRollupCtrl::_q_widgetDestroyed); - w->setParent(this); - // destroy internal data - _q_widgetDestroyed(w); - itemRemoved(index); - } -} - -QWidget* QRollupCtrl::widget(int index) const -{ - if (index < 0 || index >= (int) m_pageList.size()) - { - return 0; - } - return m_pageList.at(index).widget; -} - -int QRollupCtrl::indexOf(QWidget* widget) const -{ - QRollupCtrl::Page* c = page(widget); - return c ? m_pageList.indexOf(*c) : -1; -} - -void QRollupCtrl::setItemEnabled(int index, bool enabled) -{ - QRollupCtrl::Page* c = page(index); - if (!c) - { - return; - } - - c->button->setEnabled(enabled); - if (!enabled) - { - int curIndexUp = index; - int curIndexDown = curIndexUp; - const int count = m_pageList.count(); - while (curIndexUp > 0 || curIndexDown < count - 1) - { - if (curIndexDown < count - 1) - { - if (page(++curIndexDown)->button->isEnabled()) - { - index = curIndexDown; - break; - } - } - if (curIndexUp > 0) - { - if (page(--curIndexUp)->button->isEnabled()) - { - index = curIndexUp; - break; - } - } - } - } -} - -void QRollupCtrl::setItemText(int index, const QString& text) -{ - QRollupCtrl::Page* c = page(index); - if (c) - { - c->setText(text); - } -} - -void QRollupCtrl::setItemIcon(int index, const QIcon& icon) -{ - QRollupCtrl::Page* c = page(index); - if (c) - { - c->setIcon(icon); - } -} - -void QRollupCtrl::setItemToolTip(int index, const QString& toolTip) -{ - QRollupCtrl::Page* c = page(index); - if (c) - { - c->setToolTip(toolTip); - } -} - -bool QRollupCtrl::isItemEnabled(int index) const -{ - const QRollupCtrl::Page* c = page(index); - return c && c->button->isEnabled(); -} - -QString QRollupCtrl::itemText(int index) const -{ - const QRollupCtrl::Page* c = page(index); - return (c ? c->text() : QString()); -} - -QIcon QRollupCtrl::itemIcon(int index) const -{ - const QRollupCtrl::Page* c = page(index); - return (c ? c->icon() : QIcon()); -} - -QString QRollupCtrl::itemToolTip(int index) const -{ - const QRollupCtrl::Page* c = page(index); - return (c ? c->toolTip() : QString()); -} - -void QRollupCtrl::changeEvent(QEvent* ev) -{ - if (ev->type() == QEvent::StyleChange) - { - updateTabs(); - } - QFrame::changeEvent(ev); -} - -void QRollupCtrl::showEvent(QShowEvent* ev) -{ - if (isVisible()) - { - updateTabs(); - } - IEditor* pEditor = GetIEditor(); - pEditor->SetEditMode(EEditMode::eEditModeSelect); - QFrame::showEvent(ev); -} - -void QRollupCtrl::itemInserted(int index) -{ - Q_UNUSED(index) -} - -void QRollupCtrl::itemRemoved(int index) -{ - Q_UNUSED(index) -} - - -#include diff --git a/Code/Sandbox/Editor/Controls/QRollupCtrl.h b/Code/Sandbox/Editor/Controls/QRollupCtrl.h deleted file mode 100644 index 3db8bdf860..0000000000 --- a/Code/Sandbox/Editor/Controls/QRollupCtrl.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef CRYINCLUDE_EDITOR_CONTROLS_QROLLUPCTRL_H -#define CRYINCLUDE_EDITOR_CONTROLS_QROLLUPCTRL_H - -/* - * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - * its licensors. - * - * For complete copyright and license terms please see the LICENSE at the root of this - * distribution (the "License"). All use of this software is governed by the License, - * or, if provided, by the license below or the license accompanying this file. Do not - * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - */ - - -#if !defined(Q_MOC_RUN) -#include -#include -#include -#endif - -class QVBoxLayout; -class QRollupCtrlButton; - -class QRollupCtrl - : public QScrollArea -{ - Q_OBJECT - Q_PROPERTY(int count READ count) - -public: - explicit QRollupCtrl(QWidget* parent = 0); - ~QRollupCtrl(); - - int addItem(QWidget* widget, const QString& text); - int addItem(QWidget* widget, const QIcon& icon, const QString& text); - int insertItem(int index, QWidget* widget, const QString& text); - int insertItem(int index, QWidget* widget, const QIcon& icon, const QString& text); - - void clear(); - void removeItem(QWidget* widget); - void removeItem(int index); - - void setItemEnabled(int index, bool enabled); - bool isItemEnabled(int index) const; - - void setItemText(int index, const QString& text); - QString itemText(int index) const; - - void setItemIcon(int index, const QIcon& icon); - QIcon itemIcon(int index) const; - - void setItemToolTip(int index, const QString& toolTip); - QString itemToolTip(int index) const; - - QWidget* widget(int index) const; - int indexOf(QWidget* widget) const; - int count() const; - - void readSettings (const QString& qSettingsGroup); - void writeSettings(const QString& qSettingsGroup); - -public slots: - void setIndexVisible(int index, bool visible); - void setWidgetVisible(QWidget* widget, bool visible); - void expandAllPages(bool v); - -protected: - virtual void itemInserted(int index); - virtual void itemRemoved(int index); - void changeEvent(QEvent*) override; - void showEvent(QShowEvent*) override; - -private: - Q_DISABLE_COPY(QRollupCtrl) - - struct Page - { - QRollupCtrlButton* button; - QFrame* sv; - QWidget* widget; - - void setText(const QString& text); - void setIcon(const QIcon& is); - void setToolTip(const QString& tip); - QString text() const; - QIcon icon() const; - QString toolTip() const; - - inline bool operator==(const Page& other) const - { - return widget == other.widget; - } - }; - typedef QList PageList; - - Page* page(QWidget* widget) const; - const Page* page(int index) const; - Page* page(int index); - - void updateTabs(); - void relayout(); - bool isPageHidden(int index, QString& qObjectName) const; - - QWidget* m_body; - PageList m_pageList; - QVBoxLayout* m_layout; - -private slots: - void _q_buttonClicked(); - void _q_widgetDestroyed(QObject*); - void _q_custumButtonMenu(const QPoint&); -}; - - -////////////////////////////////////////////////////////////////////////// - -inline int QRollupCtrl::addItem(QWidget* item, const QString& text) -{ return insertItem(-1, item, QIcon(), text); } -inline int QRollupCtrl::addItem(QWidget* item, const QIcon& iconSet, const QString& text) -{ return insertItem(-1, item, iconSet, text); } -inline int QRollupCtrl::insertItem(int index, QWidget* item, const QString& text) -{ return insertItem(index, item, QIcon(), text); } - -#endif diff --git a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp index 69f5d9801a..1df31a2c1d 100644 --- a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp +++ b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.cpp @@ -1,187 +1,64 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or + * a third party where indicated. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ #include "EditorDefs.h" #include "PropertyMotionCtrl.h" -// Qt -#include -#include -#include - // AzToolsFramework -#include #include +#include - -MotionPropertyCtrl::MotionPropertyCtrl(QWidget *pParent) - : QWidget(pParent) +QWidget* MotionPropertyWidgetHandler::CreateGUI(QWidget* pParent) { - m_motionLabel = new QLabel; - - m_pBrowseButton = new QToolButton; - m_pBrowseButton->setIcon(QIcon(":/reflectedPropertyCtrl/img/file_browse.png")); - m_pApplyButton = new QToolButton; - m_pApplyButton->setIcon(QIcon(":/reflectedPropertyCtrl/img/apply.png")); - - m_pApplyButton->setFocusPolicy(Qt::StrongFocus); - m_pBrowseButton->setFocusPolicy(Qt::StrongFocus); - - QHBoxLayout *pLayout = new QHBoxLayout(this); - pLayout->setContentsMargins(0, 0, 0, 0); - pLayout->addWidget(m_motionLabel, 1); - pLayout->addWidget(m_pBrowseButton); - pLayout->addWidget(m_pApplyButton); - - connect(m_pBrowseButton, &QAbstractButton::clicked, this, &MotionPropertyCtrl::OnBrowseClicked); - connect(m_pApplyButton, &QAbstractButton::clicked, this, &MotionPropertyCtrl::OnApplyClicked); -}; - -MotionPropertyCtrl::~MotionPropertyCtrl() -{ -} - - -void MotionPropertyCtrl::SetValue(const CReflectedVarMotion &motion) -{ - m_motion = motion; - SetLabelText(motion.m_motion); -} - -CReflectedVarMotion MotionPropertyCtrl::value() const -{ - return m_motion; -} - -void MotionPropertyCtrl::OnBrowseClicked() -{ - - static AZ::Data::AssetType emotionFXMotionAssetType("{00494B8E-7578-4BA2-8B28-272E90680787}"); // from MotionAsset.h in EMotionFX Gem - - // Request the AssetBrowser Dialog and set a type filter - AssetSelectionModel selection = AssetSelectionModel::AssetTypeSelection(emotionFXMotionAssetType); - selection.SetSelectedAssetId(m_motion.m_assetId); - AzToolsFramework::EditorRequests::Bus::Broadcast(&AzToolsFramework::EditorRequests::BrowseForAssets, selection); - if (selection.IsValid()) - { - auto product = azrtti_cast(selection.GetResult()); - if (product != nullptr) - { - m_motion.m_motion = product->GetRelativePath(); - m_motion.m_assetId = product->GetAssetId(); - SetLabelText(m_motion.m_motion); - emit ValueChanged(m_motion); - } - } -} - -// TODO: Might be able to delete this function -void MotionPropertyCtrl::OnApplyClicked() -{ -#if 0 - CUIEnumerations &roGeneralProxy = CUIEnumerations::GetUIEnumerationsInstance(); - QStringList cSelectedMotions; - size_t nTotalMotions(0); - size_t nCurrentMotion(0); - - QString combinedString = GetIEditor()->GetResourceSelectorHost()->GetGlobalSelection("motion"); - SplitString(combinedString, cSelectedMotions, ','); - - nTotalMotions = cSelectedMotions.size(); - for (nCurrentMotion = 0; nCurrentMotion < nTotalMotions; ++nCurrentMotion) - { - QString& rstrCurrentAnimAction = cSelectedMotions[nCurrentMotion]; - if (!rstrCurrentAnimAction.isEmpty()) - { - m_motion.m_motion = rstrCurrentAnimAction.toLatin1().data(); - SetLabelText(m_motion.m_motion); - emit ValueChanged(m_motion); - } - } -#endif -} - -QWidget* MotionPropertyCtrl::GetFirstInTabOrder() -{ - return m_pBrowseButton; -} -QWidget* MotionPropertyCtrl::GetLastInTabOrder() -{ - return m_pApplyButton; -} - -void MotionPropertyCtrl::UpdateTabOrder() -{ - setTabOrder(m_pBrowseButton, m_pApplyButton); -} - -void MotionPropertyCtrl::SetLabelText(const AZStd::string& motion) -{ - if (!motion.empty()) - { - AZStd::string filename; - if (AzFramework::StringFunc::Path::GetFileName(motion.c_str(), filename)) - { - m_motionLabel->setText(filename.c_str()); - } - else - { - m_motionLabel->setText(motion.c_str()); - } - } - else - { - m_motionLabel->setText(""); - } -} - - -QWidget* MotionPropertyWidgetHandler::CreateGUI(QWidget *pParent) -{ - MotionPropertyCtrl* newCtrl = aznew MotionPropertyCtrl(pParent); - connect(newCtrl, &MotionPropertyCtrl::ValueChanged, newCtrl, [newCtrl]() - { - EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl); - }); + AzToolsFramework::PropertyAssetCtrl* newCtrl = aznew AzToolsFramework::PropertyAssetCtrl(pParent); + connect( + newCtrl, &AzToolsFramework::PropertyAssetCtrl::OnAssetIDChanged, this, [newCtrl]([[maybe_unused]] AZ::Data::AssetId newAssetId) { + EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl); + AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast( + &AzToolsFramework::PropertyEditorGUIMessages::Bus::Handler::OnEditingFinished, newCtrl); + }); return newCtrl; } - -void MotionPropertyWidgetHandler::ConsumeAttribute(MotionPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) +void MotionPropertyWidgetHandler::ConsumeAttribute( + [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, [[maybe_unused]] AZ::u32 attrib, + [[maybe_unused]] AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName) { - Q_UNUSED(GUI); - Q_UNUSED(attrib); - Q_UNUSED(attrValue); - Q_UNUSED(debugName); } -void MotionPropertyWidgetHandler::WriteGUIValuesIntoProperty(size_t index, MotionPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) +void MotionPropertyWidgetHandler::WriteGUIValuesIntoProperty( + [[maybe_unused]] size_t index, [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, property_t& instance, + [[maybe_unused]] AzToolsFramework::InstanceDataNode* node) { - Q_UNUSED(index); - Q_UNUSED(node); - CReflectedVarMotion val = GUI->value(); + CReflectedVarMotion val; + val.m_motion = GUI->GetCurrentAssetHint(); + val.m_assetId = GUI->GetSelectedAssetID(); instance = static_cast(val); } -bool MotionPropertyWidgetHandler::ReadValuesIntoGUI(size_t index, MotionPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) +bool MotionPropertyWidgetHandler::ReadValuesIntoGUI( + [[maybe_unused]] size_t index, [[maybe_unused]] AzToolsFramework::PropertyAssetCtrl* GUI, const property_t& instance, + [[maybe_unused]] AzToolsFramework::InstanceDataNode* node) { - Q_UNUSED(index); - Q_UNUSED(node); - CReflectedVarMotion val = instance; - GUI->SetValue(val); + static const AZ::Data::AssetType emotionFXMotionAssetType( + "{00494B8E-7578-4BA2-8B28-272E90680787}"); // from MotionAsset.h in EMotionFX Gem + + GUI->blockSignals(true); + GUI->SetSelectedAssetID(instance.m_assetId); + GUI->SetCurrentAssetType(emotionFXMotionAssetType); + GUI->blockSignals(false); + return false; } - #include - diff --git a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h index 568111b521..d04f1b3353 100644 --- a/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h +++ b/Code/Sandbox/Editor/Controls/ReflectedPropertyControl/PropertyMotionCtrl.h @@ -1,92 +1,67 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ -#ifndef CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H -#define CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H #pragma once #if !defined(Q_MOC_RUN) -#include -#include #include "ReflectedVar.h" -#include -#include +#include +#include +#include #include - +#include +#include #endif -class QToolButton; -class QLabel; -class QHBoxLayout; - -namespace AzToolsFramework -{ - class PropertyAssetCtrl; -} - -class MotionPropertyCtrl - : public QWidget +class MotionPropertyWidgetHandler : QObject, + public AzToolsFramework::PropertyHandler { Q_OBJECT -public: - AZ_CLASS_ALLOCATOR(MotionPropertyCtrl, AZ::SystemAllocator, 0); - MotionPropertyCtrl(QWidget* pParent = nullptr); - virtual ~MotionPropertyCtrl(); - - CReflectedVarMotion value() const; - - QWidget* GetFirstInTabOrder(); - QWidget* GetLastInTabOrder(); - void UpdateTabOrder(); - -signals: - void ValueChanged(CReflectedVarMotion value); - -public slots: - void SetValue(const CReflectedVarMotion& motion); - -protected slots: - void OnBrowseClicked(); - void OnApplyClicked(); - -private: - void SetLabelText(const AZStd::string& motion); - - QToolButton* m_pBrowseButton; - QToolButton* m_pApplyButton; - QLabel* m_motionLabel; - - CReflectedVarMotion m_motion; -}; - -class MotionPropertyWidgetHandler - : QObject - , public AzToolsFramework::PropertyHandler < CReflectedVarMotion, MotionPropertyCtrl > -{ public: AZ_CLASS_ALLOCATOR(MotionPropertyWidgetHandler, AZ::SystemAllocator, 0); - virtual AZ::u32 GetHandlerName(void) const override { return AZ_CRC("Motion", 0xf5fea1e8); } - virtual bool IsDefaultHandler() const override { return true; } - virtual QWidget* GetFirstInTabOrder(MotionPropertyCtrl* widget) override { return widget->GetFirstInTabOrder(); } - virtual QWidget* GetLastInTabOrder(MotionPropertyCtrl* widget) override { return widget->GetLastInTabOrder(); } - virtual void UpdateWidgetInternalTabbing(MotionPropertyCtrl* widget) override { widget->UpdateTabOrder(); } + virtual AZ::u32 GetHandlerName(void) const override + { + return AZ_CRC("Motion", 0xf5fea1e8); + } + + virtual bool IsDefaultHandler() const override + { + return true; + } + + virtual QWidget* GetFirstInTabOrder(AzToolsFramework::PropertyAssetCtrl* widget) override + { + return widget->GetFirstInTabOrder(); + } + + virtual QWidget* GetLastInTabOrder(AzToolsFramework::PropertyAssetCtrl* widget) override + { + return widget->GetLastInTabOrder(); + } + + virtual void UpdateWidgetInternalTabbing(AzToolsFramework::PropertyAssetCtrl* widget) override + { + widget->UpdateTabOrder(); + } virtual QWidget* CreateGUI(QWidget* pParent) override; - virtual void ConsumeAttribute(MotionPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; - virtual void WriteGUIValuesIntoProperty(size_t index, MotionPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; - virtual bool ReadValuesIntoGUI(size_t index, MotionPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; + virtual void ConsumeAttribute( + AzToolsFramework::PropertyAssetCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, + const char* debugName) override; + virtual void WriteGUIValuesIntoProperty( + size_t index, AzToolsFramework::PropertyAssetCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; + virtual bool ReadValuesIntoGUI( + size_t index, AzToolsFramework::PropertyAssetCtrl* GUI, const property_t& instance, + AzToolsFramework::InstanceDataNode* node) override; }; - - -#endif // CRYINCLUDE_EDITOR_UTILS_PROPERTYMOTIONCTRL_H diff --git a/Code/Sandbox/Editor/Controls/ToolButton.cpp b/Code/Sandbox/Editor/Controls/ToolButton.cpp deleted file mode 100644 index b74fe1a330..0000000000 --- a/Code/Sandbox/Editor/Controls/ToolButton.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : implementation file - - -#include "EditorDefs.h" - -// Editor -#include "CryEditDoc.h" -#include "EditTool.h" -#include "ToolButton.h" - - -QEditorToolButton::QEditorToolButton(QWidget* parent /* = nullptr */) - : QPushButton(parent) - , m_styleSheet(styleSheet()) - , m_toolClass(nullptr) - , m_toolCreated(nullptr) - , m_needDocument(true) -{ - setSizePolicy({ QSizePolicy::Expanding, QSizePolicy::Fixed }); - connect(this, &QAbstractButton::clicked, this, &QEditorToolButton::OnClicked); - GetIEditor()->RegisterNotifyListener(this); -} - -QEditorToolButton::~QEditorToolButton() -{ - GetIEditor()->UnregisterNotifyListener(this); -} - -void QEditorToolButton::SetToolName(const QString& editToolName, const QString& userDataKey, void* userData) -{ - IClassDesc* klass = GetIEditor()->GetClassFactory()->FindClass(editToolName.toUtf8().data()); - if (!klass) - { - Warning(QStringLiteral("Editor Tool %1 not registered.").arg(editToolName).toUtf8().data()); - return; - } - if (klass->SystemClassID() != ESYSTEM_CLASS_EDITTOOL) - { - Warning(QStringLiteral("Class name %1 is not a valid Edit Tool class.").arg(editToolName).toUtf8().data()); - return; - } - - QScopedPointer o(klass->CreateQObject()); - if (!qobject_cast(o.data())) - { - Warning(QStringLiteral("Class name %1 is not a valid Edit Tool class.").arg(editToolName).toUtf8().data()); - return; - } - SetToolClass(o->metaObject(), userDataKey, userData); -} - -////////////////////////////////////////////////////////////////////////// -void QEditorToolButton::SetToolClass(const QMetaObject* toolClass, const QString& userDataKey, void* userData) -{ - m_toolClass = toolClass; - - m_userData = userData; - if (!userDataKey.isEmpty()) - { - m_userDataKey = userDataKey; - } -} - -void QEditorToolButton::OnEditorNotifyEvent(EEditorNotifyEvent event) -{ - switch (event) - { - case eNotify_OnBeginNewScene: - case eNotify_OnBeginLoad: - case eNotify_OnBeginSceneOpen: - { - if (m_needDocument) - { - setEnabled(false); - } - break; - } - - case eNotify_OnEndNewScene: - case eNotify_OnEndLoad: - case eNotify_OnEndSceneOpen: - { - if (m_needDocument) - { - setEnabled(true); - } - break; - } - case eNotify_OnEditToolChange: - { - CEditTool* tool = GetIEditor()->GetEditTool(); - - if (!tool || tool != m_toolCreated || tool->metaObject() != m_toolClass) - { - m_toolCreated = nullptr; - SetSelected(false); - } - } - default: - break; - } -} - -void QEditorToolButton::OnClicked() -{ - if (!m_toolClass) - { - return; - } - - if (m_needDocument && !GetIEditor()->GetDocument()->IsDocumentReady()) - { - return; - } - - CEditTool* tool = GetIEditor()->GetEditTool(); - if (tool && tool->IsMoveToObjectModeAfterEnd() && tool->metaObject() == m_toolClass && tool == m_toolCreated) - { - GetIEditor()->SetEditTool(nullptr); - SetSelected(false); - } - else - { - CEditTool* newTool = qobject_cast(m_toolClass->newInstance()); - if (!newTool) - { - return; - } - - m_toolCreated = newTool; - - SetSelected(true); - - if (m_userData) - { - newTool->SetUserData(m_userDataKey.toUtf8().data(), (void*)m_userData); - } - - update(); - - // Must be last function, can delete this. - GetIEditor()->SetEditTool(newTool); - } -} - -void QEditorToolButton::SetSelected(bool selected) -{ - if (selected) - { - setStyleSheet(QStringLiteral("QPushButton { background-color: palette(highlight); color: palette(highlighted-text); }")); - } - else - { - setStyleSheet(m_styleSheet); - } -} - -#include diff --git a/Code/Sandbox/Editor/Controls/ToolButton.h b/Code/Sandbox/Editor/Controls/ToolButton.h deleted file mode 100644 index f32bd6678d..0000000000 --- a/Code/Sandbox/Editor/Controls/ToolButton.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_CONTROLS_TOOLBUTTON_H -#define CRYINCLUDE_EDITOR_CONTROLS_TOOLBUTTON_H -#pragma once - -// ToolButton.h : header file -// - -#if !defined(Q_MOC_RUN) -#include -#include -#endif - -AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING -class SANDBOX_API QEditorToolButton - : public QPushButton - , public IEditorNotifyListener -{ -AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING - Q_OBJECT - // Construction -public: - QEditorToolButton(QWidget* parent = nullptr); - virtual ~QEditorToolButton(); - - void SetToolClass(const QMetaObject* toolClass, const QString& userDataKey = 0, void* userData = nullptr); - void SetToolName(const QString& editToolName, const QString& userDataKey = 0, void* userData = nullptr); - // Set if this tool button relies on a loaded level / ready document. By default every tool button only works if a level is loaded. - // However some tools are also used without a loaded level (e.g. UI Emulator) - void SetNeedDocument(bool needDocument) { m_needDocument = needDocument; } - - void SetSelected(bool selected); - void OnEditorNotifyEvent(EEditorNotifyEvent event) override; -protected: - void OnClicked(); - - const QString m_styleSheet; - - //! Tool associated with this button. - const QMetaObject* m_toolClass; - CEditTool* m_toolCreated; - QString m_userDataKey; - void* m_userData; - bool m_needDocument; -}; - - -#endif // CRYINCLUDE_EDITOR_CONTROLS_TOOLBUTTON_H diff --git a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp index f00085d5ad..aed53d6e8b 100644 --- a/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp +++ b/Code/Sandbox/Editor/Core/LevelEditorMenuHandler.cpp @@ -577,17 +577,6 @@ void LevelEditorMenuHandler::PopulateEditMenu(ActionManager::MenuWrapper& editMe modifyMenu.AddAction(ID_MODIFY_LINK); modifyMenu.AddAction(ID_MODIFY_UNLINK); modifyMenu.AddSeparator(); - - auto alignMenu = modifyMenu.AddMenu(tr("Align")); - alignMenu.AddAction(ID_OBJECTMODIFY_ALIGNTOGRID); - alignMenu.AddAction(ID_MODIFY_ALIGNOBJTOSURF); - - auto constrainMenu = modifyMenu.AddMenu(tr("Constrain")); - constrainMenu.AddAction(ID_SELECT_AXIS_X); - constrainMenu.AddAction(ID_SELECT_AXIS_Y); - constrainMenu.AddAction(ID_SELECT_AXIS_Z); - constrainMenu.AddAction(ID_SELECT_AXIS_XY); - constrainMenu.AddAction(ID_SELECT_AXIS_TERRAIN); } auto snapMenu = modifyMenu.AddMenu(tr("Snap")); @@ -609,20 +598,10 @@ void LevelEditorMenuHandler::PopulateEditMenu(ActionManager::MenuWrapper& editMe } auto transformModeMenu = modifyMenu.AddMenu(tr("Transform Mode")); - if (!newViewportInteractionModelEnabled) - { - transformModeMenu.AddAction(ID_EDITMODE_SELECT); - } - transformModeMenu.AddAction(ID_EDITMODE_MOVE); transformModeMenu.AddAction(ID_EDITMODE_ROTATE); transformModeMenu.AddAction(ID_EDITMODE_SCALE); - if (!newViewportInteractionModelEnabled) - { - transformModeMenu.AddAction(ID_EDITMODE_SELECTAREA); - } - editMenu.AddSeparator(); // Lock Selection diff --git a/Code/Sandbox/Editor/CryEdit.cpp b/Code/Sandbox/Editor/CryEdit.cpp index 7aefcffb5a..c6a2ece984 100644 --- a/Code/Sandbox/Editor/CryEdit.cpp +++ b/Code/Sandbox/Editor/CryEdit.cpp @@ -95,7 +95,6 @@ AZ_POP_DISABLE_WARNING #include "Core/QtEditorApplication.h" #include "StringDlg.h" -#include "VoxelAligningTool.h" #include "NewLevelDialog.h" #include "GridSettingsDialog.h" #include "LayoutConfigDialog.h" @@ -110,7 +109,6 @@ AZ_POP_DISABLE_WARNING #include "DisplaySettings.h" #include "GameEngine.h" -#include "ObjectCloneTool.h" #include "StartupTraceHandler.h" #include "ThumbnailGenerator.h" #include "ToolsConfigPage.h" @@ -127,7 +125,6 @@ AZ_POP_DISABLE_WARNING #include "AnimationContext.h" #include "GotoPositionDlg.h" -#include "SetVectorDlg.h" #include "ConsoleDialog.h" #include "Controls/ConsoleSCB.h" @@ -153,7 +150,6 @@ AZ_POP_DISABLE_WARNING #include "LevelIndependentFileMan.h" #include "WelcomeScreen/WelcomeScreenDialog.h" #include "Dialogs/DuplicatedObjectsHandlerDlg.h" -#include "EditMode/VertexSnappingModeTool.h" #include "Controls/ReflectedPropertyControl/PropertyCtrl.h" #include "Controls/ReflectedPropertyControl/ReflectedVar.h" @@ -398,34 +394,20 @@ void CCryEditApp::RegisterActionHandlers() ON_COMMAND(ID_EDITMODE_MOVE, OnEditmodeMove) ON_COMMAND(ID_EDITMODE_ROTATE, OnEditmodeRotate) ON_COMMAND(ID_EDITMODE_SCALE, OnEditmodeScale) - ON_COMMAND(ID_EDITMODE_SELECT, OnEditmodeSelect) - ON_COMMAND(ID_EDIT_ESCAPE, OnEditEscape) ON_COMMAND(ID_OBJECTMODIFY_SETAREA, OnObjectSetArea) ON_COMMAND(ID_OBJECTMODIFY_SETHEIGHT, OnObjectSetHeight) - ON_COMMAND(ID_OBJECTMODIFY_VERTEXSNAPPING, OnObjectVertexSnapping) - ON_COMMAND(ID_MODIFY_ALIGNOBJTOSURF, OnAlignToVoxel) ON_COMMAND(ID_OBJECTMODIFY_FREEZE, OnObjectmodifyFreeze) ON_COMMAND(ID_OBJECTMODIFY_UNFREEZE, OnObjectmodifyUnfreeze) - ON_COMMAND(ID_EDITMODE_SELECTAREA, OnEditmodeSelectarea) - ON_COMMAND(ID_SELECT_AXIS_X, OnSelectAxisX) - ON_COMMAND(ID_SELECT_AXIS_Y, OnSelectAxisY) - ON_COMMAND(ID_SELECT_AXIS_Z, OnSelectAxisZ) - ON_COMMAND(ID_SELECT_AXIS_XY, OnSelectAxisXy) ON_COMMAND(ID_UNDO, OnUndo) ON_COMMAND(ID_TOOLBAR_WIDGET_REDO, OnUndo) // Can't use the same ID, because for the menu we can't have a QWidgetAction, while for the toolbar we want one - ON_COMMAND(ID_EDIT_CLONE, OnEditClone) ON_COMMAND(ID_SELECTION_SAVE, OnSelectionSave) ON_COMMAND(ID_IMPORT_ASSET, OnOpenAssetImporter) ON_COMMAND(ID_SELECTION_LOAD, OnSelectionLoad) - ON_COMMAND(ID_MODIFY_ALIGNOBJTOSURF, OnAlignToVoxel) - ON_COMMAND(ID_OBJECTMODIFY_ALIGNTOGRID, OnAlignToGrid) ON_COMMAND(ID_LOCK_SELECTION, OnLockSelection) ON_COMMAND(ID_EDIT_LEVELDATA, OnEditLevelData) ON_COMMAND(ID_FILE_EDITLOGFILE, OnFileEditLogFile) ON_COMMAND(ID_FILE_RESAVESLICES, OnFileResaveSlices) ON_COMMAND(ID_FILE_EDITEDITORINI, OnFileEditEditorini) - ON_COMMAND(ID_SELECT_AXIS_TERRAIN, OnSelectAxisTerrain) - ON_COMMAND(ID_SELECT_AXIS_SNAPTOALL, OnSelectAxisSnapToAll) ON_COMMAND(ID_PREFERENCES, OnPreferences) ON_COMMAND(ID_RELOAD_GEOMETRY, OnReloadGeometry) ON_COMMAND(ID_REDO, OnRedo) @@ -492,7 +474,6 @@ void CCryEditApp::RegisterActionHandlers() ON_COMMAND(ID_VIEW_CYCLE2DVIEWPORT, OnViewCycle2dviewport) #endif ON_COMMAND(ID_DISPLAY_GOTOPOSITION, OnDisplayGotoPosition) - ON_COMMAND(ID_DISPLAY_SETVECTOR, OnDisplaySetVector) ON_COMMAND(ID_SNAPANGLE, OnSnapangle) ON_COMMAND(ID_RULER, OnRuler) ON_COMMAND(ID_ROTATESELECTION_XAXIS, OnRotateselectionXaxis) @@ -524,12 +505,10 @@ void CCryEditApp::RegisterActionHandlers() ON_COMMAND(ID_OPEN_MATERIAL_EDITOR, OnOpenMaterialEditor) ON_COMMAND(ID_GOTO_VIEWPORTSEARCH, OnGotoViewportSearch) - ON_COMMAND(ID_MATERIAL_PICKTOOL, OnMaterialPicktool) ON_COMMAND(ID_DISPLAY_SHOWHELPERS, OnShowHelpers) ON_COMMAND(ID_OPEN_TRACKVIEW, OnOpenTrackView) ON_COMMAND(ID_OPEN_UICANVASEDITOR, OnOpenUICanvasEditor) ON_COMMAND(ID_GOTO_VIEWPORTSEARCH, OnGotoViewportSearch) - ON_COMMAND(ID_MATERIAL_PICKTOOL, OnMaterialPicktool) ON_COMMAND(ID_TERRAIN_TIMEOFDAY, OnTimeOfDay) ON_COMMAND(ID_TERRAIN_TIMEOFDAYBUTTON, OnTimeOfDay) @@ -2739,15 +2718,6 @@ void CCryEditApp::OnEditDelete() ////////////////////////////////////////////////////////////////////////// void CCryEditApp::DeleteSelectedEntities([[maybe_unused]] bool includeDescendants) { - // If Edit tool active cannot delete object. - if (GetIEditor()->GetEditTool()) - { - if (GetIEditor()->GetEditTool()->OnKeyDown(GetIEditor()->GetViewManager()->GetView(0), VK_DELETE, 0, 0)) - { - return; - } - } - GetIEditor()->BeginUndo(); CUndo undo("Delete Selected Object"); GetIEditor()->GetObjectManager()->DeleteSelection(); @@ -2756,75 +2726,6 @@ void CCryEditApp::DeleteSelectedEntities([[maybe_unused]] bool includeDescendant GetIEditor()->SetModifiedModule(eModifiedBrushes); } -void CCryEditApp::OnEditClone() -{ - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - if (GetIEditor()->GetObjectManager()->GetSelection()->IsEmpty()) - { - QMessageBox::critical(AzToolsFramework::GetActiveWindow(), QString(), - QObject::tr("You have to select objects before you can clone them!")); - return; - } - - // Clear Widget selection - Prevents issues caused by cloning entities while a property in the Reflected Property Editor is being edited. - if (QApplication::focusWidget()) - { - QApplication::focusWidget()->clearFocus(); - } - - CEditTool* tool = GetIEditor()->GetEditTool(); - if (tool && qobject_cast(tool)) - { - ((CObjectCloneTool*)tool)->Accept(); - } - - CObjectCloneTool* cloneTool = new CObjectCloneTool; - GetIEditor()->SetEditTool(cloneTool); - GetIEditor()->SetModifiedFlag(); - GetIEditor()->SetModifiedModule(eModifiedBrushes); - - // Accept the clone operation if users didn't choose to stick duplicated entities to the cursor - // This setting can be changed in the global preference of the editor - if (!gSettings.deepSelectionSettings.bStickDuplicate) - { - cloneTool->Accept(); - GetIEditor()->GetSelection()->FinishChanges(); - } - } -} - -void CCryEditApp::OnEditEscape() -{ - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - // Abort current operation. - if (pEditTool) - { - // If Edit tool active cannot delete object. - CViewport* vp = GetIEditor()->GetActiveView(); - if (GetIEditor()->GetEditTool()->OnKeyDown(vp, VK_ESCAPE, 0, 0)) - { - return; - } - - if (GetIEditor()->GetEditMode() == eEditModeSelectArea) - { - GetIEditor()->SetEditMode(eEditModeSelect); - } - - // Disable current tool. - GetIEditor()->SetEditTool(0); - } - else - { - // Clear selection on escape. - GetIEditor()->ClearSelection(); - } - } -} - void CCryEditApp::OnMoveObject() { //////////////////////////////////////////////////////////////////////// @@ -2843,85 +2744,31 @@ void CCryEditApp::OnSetHeight() ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnEditmodeMove() { - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - using namespace AzToolsFramework; - EditorTransformComponentSelectionRequestBus::Event( - GetEntityContextId(), - &EditorTransformComponentSelectionRequests::SetTransformMode, - EditorTransformComponentSelectionRequests::Mode::Translation); - } - else - { - GetIEditor()->SetEditMode(eEditModeMove); - } + using namespace AzToolsFramework; + EditorTransformComponentSelectionRequestBus::Event( + GetEntityContextId(), + &EditorTransformComponentSelectionRequests::SetTransformMode, + EditorTransformComponentSelectionRequests::Mode::Translation); } ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnEditmodeRotate() { - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - using namespace AzToolsFramework; - EditorTransformComponentSelectionRequestBus::Event( - GetEntityContextId(), - &EditorTransformComponentSelectionRequests::SetTransformMode, - EditorTransformComponentSelectionRequests::Mode::Rotation); - } - else - { - GetIEditor()->SetEditMode(eEditModeRotate); - } + using namespace AzToolsFramework; + EditorTransformComponentSelectionRequestBus::Event( + GetEntityContextId(), + &EditorTransformComponentSelectionRequests::SetTransformMode, + EditorTransformComponentSelectionRequests::Mode::Rotation); } ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnEditmodeScale() { - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - using namespace AzToolsFramework; - EditorTransformComponentSelectionRequestBus::Event( - GetEntityContextId(), - &EditorTransformComponentSelectionRequests::SetTransformMode, - EditorTransformComponentSelectionRequests::Mode::Scale); - } - else - { - GetIEditor()->SetEditMode(eEditModeScale); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnEditmodeSelect() -{ - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - GetIEditor()->SetEditMode(eEditModeSelect); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnEditmodeSelectarea() -{ - // TODO: Add your command handler code here - GetIEditor()->SetEditMode(eEditModeSelectArea); -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateEditmodeSelectarea(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetEditMode() == eEditModeSelectArea); -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateEditmodeSelect(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - action->setChecked(GetIEditor()->GetEditMode() == eEditModeSelect); - } + using namespace AzToolsFramework; + EditorTransformComponentSelectionRequestBus::Event( + GetEntityContextId(), + &EditorTransformComponentSelectionRequests::SetTransformMode, + EditorTransformComponentSelectionRequests::Mode::Scale); } ////////////////////////////////////////////////////////////////////////// @@ -2929,19 +2776,12 @@ void CCryEditApp::OnUpdateEditmodeMove(QAction* action) { Q_ASSERT(action->isCheckable()); - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; - AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( - mode, AzToolsFramework::GetEntityContextId(), - &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); + AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; + AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( + mode, AzToolsFramework::GetEntityContextId(), + &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); - action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Translation); - } - else - { - action->setChecked(GetIEditor()->GetEditMode() == eEditModeMove); - } + action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Translation); } ////////////////////////////////////////////////////////////////////////// @@ -2949,20 +2789,12 @@ void CCryEditApp::OnUpdateEditmodeRotate(QAction* action) { Q_ASSERT(action->isCheckable()); - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; - AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( - mode, AzToolsFramework::GetEntityContextId(), - &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); + AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; + AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( + mode, AzToolsFramework::GetEntityContextId(), + &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); - action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Rotation); - } - else - { - action->setChecked(GetIEditor()->GetEditMode() == eEditModeRotate); - action->setEnabled(true); - } + action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Rotation); } ////////////////////////////////////////////////////////////////////////// @@ -2970,28 +2802,12 @@ void CCryEditApp::OnUpdateEditmodeScale(QAction* action) { Q_ASSERT(action->isCheckable()); - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; - AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( - mode, AzToolsFramework::GetEntityContextId(), - &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); + AzToolsFramework::EditorTransformComponentSelectionRequests::Mode mode; + AzToolsFramework::EditorTransformComponentSelectionRequestBus::EventResult( + mode, AzToolsFramework::GetEntityContextId(), + &AzToolsFramework::EditorTransformComponentSelectionRequests::GetTransformMode); - action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Scale); - } - else - { - action->setChecked(GetIEditor()->GetEditMode() == eEditModeScale); - action->setEnabled(true); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateEditmodeVertexSnapping(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - action->setChecked(qobject_cast(pEditTool) != nullptr); + action->setChecked(mode == AzToolsFramework::EditorTransformComponentSelectionRequests::Mode::Scale); } ////////////////////////////////////////////////////////////////////////// @@ -3143,19 +2959,6 @@ void CCryEditApp::OnObjectSetHeight() } } -void CCryEditApp::OnObjectVertexSnapping() -{ - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - if (qobject_cast(pEditTool)) - { - GetIEditor()->SetEditTool(NULL); - } - else - { - GetIEditor()->SetEditTool("EditTool.VertexSnappingMode"); - } -} - void CCryEditApp::OnObjectmodifyFreeze() { // Freeze selection. @@ -3185,101 +2988,6 @@ void CCryEditApp::OnViewSwitchToGame() GetIEditor()->SetInGameMode(inGame); } -void CCryEditApp::OnSelectAxisX() -{ - AxisConstrains axis = (GetIEditor()->GetAxisConstrains() != AXIS_X) ? AXIS_X : AXIS_NONE; - GetIEditor()->SetAxisConstraints(axis); -} - -void CCryEditApp::OnSelectAxisY() -{ - AxisConstrains axis = (GetIEditor()->GetAxisConstrains() != AXIS_Y) ? AXIS_Y : AXIS_NONE; - GetIEditor()->SetAxisConstraints(axis); -} - -void CCryEditApp::OnSelectAxisZ() -{ - AxisConstrains axis = (GetIEditor()->GetAxisConstrains() != AXIS_Z) ? AXIS_Z : AXIS_NONE; - GetIEditor()->SetAxisConstraints(axis); -} - -void CCryEditApp::OnSelectAxisXy() -{ - AxisConstrains axis = (GetIEditor()->GetAxisConstrains() != AXIS_XY) ? AXIS_XY : AXIS_NONE; - GetIEditor()->SetAxisConstraints(axis); -} - -void CCryEditApp::OnUpdateSelectAxisX(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_X); -} - -void CCryEditApp::OnUpdateSelectAxisXy(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_XY); -} - -void CCryEditApp::OnUpdateSelectAxisY(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_Y); -} - -void CCryEditApp::OnUpdateSelectAxisZ(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_Z); -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnSelectAxisTerrain() -{ - IEditor* editor = GetIEditor(); - bool isAlreadyEnabled = (editor->GetAxisConstrains() == AXIS_TERRAIN) && (editor->IsTerrainAxisIgnoreObjects()); - if (!isAlreadyEnabled) - { - editor->SetAxisConstraints(AXIS_TERRAIN); - editor->SetTerrainAxisIgnoreObjects(true); - } - else - { - // behave like a toggle button - click on the same thing again to disable. - editor->SetAxisConstraints(AXIS_NONE); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnSelectAxisSnapToAll() -{ - IEditor* editor = GetIEditor(); - bool isAlreadyEnabled = (editor->GetAxisConstrains() == AXIS_TERRAIN) && (!editor->IsTerrainAxisIgnoreObjects()); - if (!isAlreadyEnabled) - { - editor->SetAxisConstraints(AXIS_TERRAIN); - editor->SetTerrainAxisIgnoreObjects(false); - } - else - { - // behave like a toggle button - click on the same thing again to disable. - editor->SetAxisConstraints(AXIS_NONE); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateSelectAxisTerrain(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_TERRAIN && GetIEditor()->IsTerrainAxisIgnoreObjects()); -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateSelectAxisSnapToAll(QAction* action) -{ - action->setChecked(GetIEditor()->GetAxisConstrains() == AXIS_TERRAIN && !GetIEditor()->IsTerrainAxisIgnoreObjects()); -} - ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnExportSelectedObjects() { @@ -3460,57 +3168,8 @@ void CCryEditApp::OnUpdateSelected(QAction* action) action->setEnabled(!GetIEditor()->GetSelection()->IsEmpty()); } -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnAlignToGrid() -{ - CSelectionGroup* sel = GetIEditor()->GetSelection(); - if (!sel->IsEmpty()) - { - CUndo undo("Align To Grid"); - Matrix34 tm; - for (int i = 0; i < sel->GetCount(); i++) - { - CBaseObject* obj = sel->GetObject(i); - tm = obj->GetWorldTM(); - Vec3 snaped = gSettings.pGrid->Snap(tm.GetTranslation()); - tm.SetTranslation(snaped); - obj->SetWorldTM(tm, eObjectUpdateFlags_UserInput); - obj->OnEvent(EVENT_ALIGN_TOGRID); - } - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnAlignToVoxel() -{ - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - if (qobject_cast(pEditTool) != nullptr) - { - GetIEditor()->SetEditTool(nullptr); - } - else - { - GetIEditor()->SetEditTool(new CVoxelAligningTool()); - } -} - -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnUpdateAlignToVoxel(QAction* action) -{ - Q_ASSERT(action->isCheckable()); - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - action->setChecked(qobject_cast(pEditTool) != nullptr); - - action->setEnabled(!GetIEditor()->GetSelection()->IsEmpty()); -} - void CCryEditApp::OnShowHelpers() { - CEditTool* pEditTool(GetIEditor()->GetEditTool()); - if (pEditTool && pEditTool->IsNeedSpecificBehaviorForSpaceAcce()) - { - return; - } GetIEditor()->GetDisplaySettings()->DisplayHelpers(!GetIEditor()->GetDisplaySettings()->IsDisplayHelpers()); GetIEditor()->Notify(eNotify_OnDisplayRenderUpdate); } @@ -4668,13 +4327,6 @@ void CCryEditApp::OnDisplayGotoPosition() dlg.exec(); } -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnDisplaySetVector() -{ - CSetVectorDlg dlg; - dlg.exec(); -} - ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnSnapangle() { @@ -5136,12 +4788,6 @@ void CCryEditApp::OnOpenUICanvasEditor() QtViewPaneManager::instance()->OpenPane(LyViewPane::UiEditor); } -////////////////////////////////////////////////////////////////////////// -void CCryEditApp::OnMaterialPicktool() -{ - GetIEditor()->SetEditTool("EditTool.PickMaterial"); -} - ////////////////////////////////////////////////////////////////////////// void CCryEditApp::OnTimeOfDay() { @@ -5296,12 +4942,6 @@ void CCryEditApp::OnOpenQuickAccessBar() return; } - CEditTool* pEditTool(GetIEditor()->GetEditTool()); - if (pEditTool && pEditTool->IsNeedSpecificBehaviorForSpaceAcce()) - { - return; - } - QRect geo = m_pQuickAccessBar->geometry(); geo.moveCenter(MainWindow::instance()->geometry().center()); m_pQuickAccessBar->setGeometry(geo); @@ -5592,6 +5232,13 @@ extern "C" int AZ_DLL_EXPORT CryEditMain(int argc, char* argv[]) AzQtComponents::Utilities::HandleDpiAwareness(AzQtComponents::Utilities::SystemDpiAware); Editor::EditorQtApplication app(argc, argv); + if (app.arguments().contains("-autotest_mode")) + { + // Nullroute all stdout to null for automated tests, this way we make sure + // that the test result output is not polluted with unrelated output data. + theApp->RedirectStdoutToNull(); + } + // Hook the trace bus to catch errors, boot the AZ app after the QApplication is up int ret = 0; @@ -5609,13 +5256,6 @@ extern "C" int AZ_DLL_EXPORT CryEditMain(int argc, char* argv[]) return -1; } - if (app.arguments().contains("-autotest_mode")) - { - // Nullroute all stdout to null for automated tests, this way we make sure - // that the test result output is not polluted with unrelated output data. - theApp->RedirectStdoutToNull(); - } - AzToolsFramework::EditorEvents::Bus::Broadcast(&AzToolsFramework::EditorEvents::NotifyQtApplicationAvailable, &app); #if defined(AZ_PLATFORM_MAC) diff --git a/Code/Sandbox/Editor/CryEdit.h b/Code/Sandbox/Editor/CryEdit.h index 94c39991e9..dc18dbcfda 100644 --- a/Code/Sandbox/Editor/CryEdit.h +++ b/Code/Sandbox/Editor/CryEdit.h @@ -224,46 +224,23 @@ public: void OnEditmodeMove(); void OnEditmodeRotate(); void OnEditmodeScale(); - void OnEditmodeSelect(); - void OnEditEscape(); void OnObjectSetArea(); void OnObjectSetHeight(); - void OnObjectVertexSnapping(); - void OnUpdateEditmodeVertexSnapping(QAction* action); - void OnUpdateEditmodeSelect(QAction* action); void OnUpdateEditmodeMove(QAction* action); void OnUpdateEditmodeRotate(QAction* action); void OnUpdateEditmodeScale(QAction* action); void OnObjectmodifyFreeze(); void OnObjectmodifyUnfreeze(); - void OnEditmodeSelectarea(); - void OnUpdateEditmodeSelectarea(QAction* action); - void OnSelectAxisX(); - void OnSelectAxisY(); - void OnSelectAxisZ(); - void OnSelectAxisXy(); - void OnUpdateSelectAxisX(QAction* action); - void OnUpdateSelectAxisXy(QAction* action); - void OnUpdateSelectAxisY(QAction* action); - void OnUpdateSelectAxisZ(QAction* action); void OnUndo(); - void OnEditClone(); void OnSelectionSave(); void OnOpenAssetImporter(); void OnSelectionLoad(); void OnUpdateSelected(QAction* action); - void OnAlignToVoxel(); - void OnAlignToGrid(); - void OnUpdateAlignToVoxel(QAction* action); void OnLockSelection(); void OnEditLevelData(); void OnFileEditLogFile(); void OnFileResaveSlices(); void OnFileEditEditorini(); - void OnSelectAxisTerrain(); - void OnSelectAxisSnapToAll(); - void OnUpdateSelectAxisTerrain(QAction* action); - void OnUpdateSelectAxisSnapToAll(QAction* action); void OnPreferences(); void OnReloadTextures(); void OnReloadGeometry(); @@ -454,7 +431,6 @@ private: void OnToolsScriptHelp(); void OnViewCycle2dviewport(); void OnDisplayGotoPosition(); - void OnDisplaySetVector(); void OnSnapangle(); void OnUpdateSnapangle(QAction* action); void OnRuler(); @@ -491,7 +467,6 @@ private: void OnOpenAudioControlsEditor(); void OnOpenUICanvasEditor(); void OnGotoViewportSearch(); - void OnMaterialPicktool(); void OnTimeOfDay(); void OnChangeGameSpec(UINT nID); void SetGameSpecCheck(ESystemConfigSpec spec, ESystemConfigPlatform platform, int &nCheck, bool &enable); diff --git a/Code/Sandbox/Editor/CryEditDoc.cpp b/Code/Sandbox/Editor/CryEditDoc.cpp index 15269c1496..916317b6bb 100644 --- a/Code/Sandbox/Editor/CryEditDoc.cpp +++ b/Code/Sandbox/Editor/CryEditDoc.cpp @@ -279,9 +279,6 @@ void CCryEditDoc::DeleteContents() // [LY-90904] move this to the EditorVegetationManager component InstanceStatObjEventBus::Broadcast(&InstanceStatObjEventBus::Events::ReleaseData); - GetIEditor()->SetEditTool(0); // Turn off any active edit tools. - GetIEditor()->SetEditMode(eEditModeSelect); - ////////////////////////////////////////////////////////////////////////// // Clear all undo info. ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/CryEditDoc.h b/Code/Sandbox/Editor/CryEditDoc.h index 9f954f31d8..481e9fa046 100644 --- a/Code/Sandbox/Editor/CryEditDoc.h +++ b/Code/Sandbox/Editor/CryEditDoc.h @@ -216,7 +216,6 @@ protected: void OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAssetId, const AzFramework::SliceInstantiationTicket& /*ticket*/) override; ////////////////////////////////////////////////////////////////////////// - QString m_strMasterCDFolder; bool m_bLoadFailed; QColor m_waterColor; XmlNodeRef m_fogTemplate; diff --git a/Code/Sandbox/Editor/CustomizeKeyboardDialog.h b/Code/Sandbox/Editor/CustomizeKeyboardDialog.h index 0459fe48e9..c28770e831 100644 --- a/Code/Sandbox/Editor/CustomizeKeyboardDialog.h +++ b/Code/Sandbox/Editor/CustomizeKeyboardDialog.h @@ -60,4 +60,4 @@ private: QStringList BuildModels(QWidget* parent); }; -#endif //CRYINCLUDE_EDITOR_CUSTOMIZE_KEYBOARD_DIALOG_H \ No newline at end of file +#endif //CRYINCLUDE_EDITOR_CUSTOMIZE_KEYBOARD_DIALOG_H diff --git a/Code/Sandbox/Editor/Dialogs/ButtonsPanel.cpp b/Code/Sandbox/Editor/Dialogs/ButtonsPanel.cpp deleted file mode 100644 index 8314361585..0000000000 --- a/Code/Sandbox/Editor/Dialogs/ButtonsPanel.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "ButtonsPanel.h" - -// Qt -#include - -// Editor -#include "Controls/ToolButton.h" - -///////////////////////////////////////////////////////////////////////////// -// CButtonsPanel dialog -CButtonsPanel::CButtonsPanel(QWidget* parent) - : QWidget(parent) -{ -} - -CButtonsPanel::~CButtonsPanel() -{ -} - -////////////////////////////////////////////////////////////////////////// -void CButtonsPanel::AddButton(const SButtonInfo& button) -{ - SButton b; - b.info = button; - m_buttons.push_back(b); -} -////////////////////////////////////////////////////////////////////////// -void CButtonsPanel::AddButton(const QString& name, const QString& toolClass) -{ - SButtonInfo bi; - bi.name = name; - bi.toolClassName = toolClass; - AddButton(bi); -} -////////////////////////////////////////////////////////////////////////// -void CButtonsPanel::AddButton(const QString& name, const QMetaObject* pToolClass) -{ - SButtonInfo bi; - bi.name = name; - bi.pToolClass = pToolClass; - AddButton(bi); -} -////////////////////////////////////////////////////////////////////////// -void CButtonsPanel::ClearButtons() -{ - auto buttons = layout()->findChildren(); - foreach(auto button, buttons) - { - layout()->removeWidget(button); - delete button; - } - m_buttons.clear(); -} - -void CButtonsPanel::UncheckAll() -{ - for (auto& button : m_buttons) - { - button.pButton->SetSelected(false); - } -} - -void CButtonsPanel::OnInitDialog() -{ - auto layout = new QGridLayout(this); - setLayout(layout); - - layout->setMargin(4); - layout->setHorizontalSpacing(4); - layout->setVerticalSpacing(1); - - // Create Buttons. - int index = 0; - for (auto& button : m_buttons) - { - button.pButton = new QEditorToolButton(this); - button.pButton->setObjectName(button.info.name); - button.pButton->setText(button.info.name); - button.pButton->SetNeedDocument(button.info.bNeedDocument); - button.pButton->setToolTip(button.info.toolTip); - - if (button.info.pToolClass) - { - button.pButton->SetToolClass(button.info.pToolClass, button.info.toolUserDataKey, (void*)button.info.toolUserData.c_str()); - } - else if (!button.info.toolClassName.isEmpty()) - { - button.pButton->SetToolName(button.info.toolClassName, button.info.toolUserDataKey, (void*)button.info.toolUserData.c_str()); - } - - layout->addWidget(button.pButton, index / 2, index % 2); - connect(button.pButton, &QEditorToolButton::clicked, this, [&]() { OnButtonPressed(button.info); }); - ++index; - } -} - -void CButtonsPanel::EnableButton(const QString& buttonName, bool enable) -{ - for (auto& button : m_buttons) - { - if (button.pButton->objectName() == buttonName) - { - button.pButton->setEnabled(enable); - } - } -} - -#include diff --git a/Code/Sandbox/Editor/Dialogs/ButtonsPanel.h b/Code/Sandbox/Editor/Dialogs/ButtonsPanel.h deleted file mode 100644 index c214c7625b..0000000000 --- a/Code/Sandbox/Editor/Dialogs/ButtonsPanel.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_DIALOGS_BUTTONSPANEL_H -#define CRYINCLUDE_EDITOR_DIALOGS_BUTTONSPANEL_H -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#endif - -class QEditorToolButton; - -///////////////////////////////////////////////////////////////////////////// -// Panel with custom auto arranged buttons -class CButtonsPanel - : public QWidget -{ - Q_OBJECT -public: - - struct SButtonInfo - { - QString name; - QString toolClassName; - QString toolUserDataKey; - std::string toolUserData; - QString toolTip; - bool bNeedDocument; - const QMetaObject* pToolClass; - - SButtonInfo() - : pToolClass(nullptr) - , bNeedDocument(true) {}; - }; - - CButtonsPanel(QWidget* parent); - virtual ~CButtonsPanel(); - - virtual void AddButton(const SButtonInfo& button); - virtual void AddButton(const QString& name, const QString& toolClass); - virtual void AddButton(const QString& name, const QMetaObject* pToolClass); - virtual void EnableButton(const QString& buttonName, bool disable); - virtual void ClearButtons(); - - virtual void OnButtonPressed([[maybe_unused]] const SButtonInfo& button) {}; - virtual void UncheckAll(); - -protected: - void ReleaseGuiButtons(); - - virtual void OnInitDialog(); - - ////////////////////////////////////////////////////////////////////////// - struct SButton - { - SButtonInfo info; - QEditorToolButton* pButton; - SButton() - : pButton(nullptr) {}; - }; - - std::vector m_buttons; -}; - -#endif // CRYINCLUDE_EDITOR_DIALOGS_BUTTONSPANEL_H diff --git a/Code/Sandbox/Editor/EditMode/ObjectMode.cpp b/Code/Sandbox/Editor/EditMode/ObjectMode.cpp deleted file mode 100644 index 3454cfefd3..0000000000 --- a/Code/Sandbox/Editor/EditMode/ObjectMode.cpp +++ /dev/null @@ -1,1525 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#if defined(AZ_PLATFORM_WINDOWS) -#include -#endif - -#include "ObjectMode.h" - -// Qt -#include - -// AzToolsFramework -#include -#include -#include - -// Editor -#include "Viewport.h" -#include "ViewManager.h" -#include "Settings.h" -#include "Objects/SelectionGroup.h" - -#include "GameEngine.h" -#include "Objects/DisplayContext.h" -#include "Objects/EntityObject.h" -#include "AnimationContext.h" -#include "DeepSelection.h" -#include "SubObjectSelectionReferenceFrameCalculator.h" -#include "ITransformManipulator.h" -#include "SurfaceInfoPicker.h" -#include "RenderViewport.h" -#include "Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h" - - -////////////////////////////////////////////////////////////////////////// -CObjectMode::CObjectMode(QObject* parent) - : CEditTool(parent) -{ - m_pClassDesc = GetIEditor()->GetClassFactory()->FindClass(OBJECT_MODE_GUID); - SetStatusText(tr("Object Selection")); - - m_openContext = false; - m_commandMode = NothingMode; - m_MouseOverObject = GuidUtil::NullGuid; - - m_pDeepSelection = new CDeepSelection(); - m_bMoveByFaceNormManipShown = false; - m_pHitObject = NULL; - - m_bTransformChanged = false; -} - -////////////////////////////////////////////////////////////////////////// -CObjectMode::~CObjectMode() -{ -} - -void CObjectMode::DrawSelectionPreview(struct DisplayContext& dc, CBaseObject* drawObject) -{ - AABB bbox; - drawObject->GetBoundBox(bbox); - - AZStd::string cleanName = drawObject->GetName().toUtf8().data(); - - // Since we'll be passing this in as a format for a sprintf, need to cleanup any %'s so they display correctly - size_t index = cleanName.find("%", 0); - while (index != std::string::npos) - { - cleanName.insert(index, "%", 1); - - // Increment index past the replacement so it doesn't get picked up again on the next loop - index = cleanName.find("%", index + 2); - } - - // If CGroup/CPrefabObject - if (drawObject->GetChildCount() > 0) - { - // Draw object name label on top of object - Vec3 vTopEdgeCenterPos = bbox.GetCenter(); - - dc.SetColor(gSettings.objectColorSettings.groupHighlight); - vTopEdgeCenterPos(vTopEdgeCenterPos.x, vTopEdgeCenterPos.y, bbox.max.z); - dc.DrawTextLabel(vTopEdgeCenterPos, 1.3f, cleanName.c_str()); - // Draw bounding box wireframe - dc.DrawWireBox(bbox.min, bbox.max); - } - else - { - dc.SetColor(Vec3(1, 1, 1)); - dc.DrawTextLabel(bbox.GetCenter(), 1.5, cleanName.c_str()); - } - - // Object Geometry Highlight - - const float normalizedFloatToUint8 = 255.0f; - - // Default object - ColorB selColor = ColorB(gSettings.objectColorSettings.geometryHighlightColor.red(), gSettings.objectColorSettings.geometryHighlightColor.green(), gSettings.objectColorSettings.geometryHighlightColor.blue(), gSettings.objectColorSettings.fGeomAlpha * normalizedFloatToUint8); - - // In case it is a child object, use a different alpha value - if (drawObject->GetParent()) - { - selColor.a = (uint8)(gSettings.objectColorSettings.fChildGeomAlpha * normalizedFloatToUint8); - } - - // Draw geometry in custom color - SGeometryDebugDrawInfo dd; - dd.tm = drawObject->GetWorldTM(); - dd.color = selColor; - dd.lineColor = selColor; - dd.bExtrude = true; - - if (qobject_cast(drawObject)) - { - dc.DepthTestOff(); - dc.SetColor(gSettings.objectColorSettings.entityHighlight, gSettings.objectColorSettings.fBBoxAlpha * normalizedFloatToUint8); - dc.DrawSolidBox(bbox.min, bbox.max); - dc.DepthTestOn(); - - CEntityObject* entityObj = (CEntityObject*)drawObject; - if (entityObj) - { - entityObj->DrawExtraLightInfo(dc); - } - } - - // Highlight also children objects if this object is opened - for (int gNo = 0; gNo < drawObject->GetChildCount(); ++gNo) - { - if (std::find(m_PreviewGUIDs.begin(), m_PreviewGUIDs.end(), drawObject->GetChild(gNo)->GetId()) == m_PreviewGUIDs.end()) - { - DrawSelectionPreview(dc, drawObject->GetChild(gNo)); - } - } -} - -void CObjectMode::DisplaySelectionPreview(struct DisplayContext& dc) -{ - CViewport* view = dc.view->asCViewport(); - IObjectManager* objMan = GetIEditor()->GetObjectManager(); - - if (!view) - { - return; - } - - QRect rc = view->GetSelectionRectangle(); - - if (GetCommandMode() == SelectMode) - { - if (rc.width() > 1 && rc.height() > 1) - { - GetIEditor()->GetObjectManager()->FindObjectsInRect(view, rc, m_PreviewGUIDs); - - QString selCountStr; - - // Do not include child objects in the count of object candidates - int childNo = 0; - for (int objNo = 0; objNo < m_PreviewGUIDs.size(); ++objNo) - { - if (objMan->FindObject(m_PreviewGUIDs[objNo])) - { - if (objMan->FindObject(m_PreviewGUIDs[objNo])->GetParent()) - { - ++childNo; - } - } - } - - selCountStr = QString::number(m_PreviewGUIDs.size() - childNo); - GetIEditor()->SetStatusText(tr("Selection Candidates Count: %1").arg(selCountStr)); - - // Draw Preview for objects - for (size_t i = 0; i < m_PreviewGUIDs.size(); ++i) - { - CBaseObject* curObj = GetIEditor()->GetObjectManager()->FindObject(m_PreviewGUIDs[i]); - - if (!curObj) - { - continue; - } - - DrawSelectionPreview(dc, curObj); - } - } - } -} - -void CObjectMode::DisplayExtraLightInfo(struct DisplayContext& dc) -{ - if (m_MouseOverObject != GUID_NULL) - { - IObjectManager* objMan = GetIEditor()->GetObjectManager(); - - if (objMan) - { - CBaseObject* hitObj = objMan->FindObject(m_MouseOverObject); - - if (hitObj) - { - if (objMan->IsLightClass(hitObj)) - { - CEntityObject* entityObj = (CEntityObject*)hitObj; - if (entityObj) - { - entityObj->DrawExtraLightInfo(dc); - } - } - } - } - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::EndEditParams() -{ - CBaseObject* pMouseOverObject = nullptr; - if (!GuidUtil::IsEmpty(m_MouseOverObject)) - { - pMouseOverObject = GetIEditor()->GetObjectManager()->FindObject(m_MouseOverObject); - } - - if (pMouseOverObject) - { - pMouseOverObject->SetHighlight(false); - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::Display(struct DisplayContext& dc) -{ - // Selection Candidates Preview - DisplaySelectionPreview(dc); - DisplayExtraLightInfo(dc); - - GetIEditor()->GetSelection()->IndicateSnappingVertex(dc); -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) -{ - switch (event) - { - case eMouseLDown: - return OnLButtonDown(view, flags, point); - break; - case eMouseLUp: - return OnLButtonUp(view, flags, point); - break; - case eMouseLDblClick: - return OnLButtonDblClk(view, flags, point); - break; - case eMouseRDown: - return OnRButtonDown(view, flags, point); - break; - case eMouseRUp: - return OnRButtonUp(view, flags, point); - break; - case eMouseMove: - return OnMouseMove(view, flags, point); - break; - case eMouseMDown: - return OnMButtonDown(view, flags, point); - break; - case eMouseLeave: - return OnMouseLeave(view); - break; - } - return false; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnKeyDown([[maybe_unused]] CViewport* view, uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) -{ - if (nChar == VK_ESCAPE) - { - GetIEditor()->ClearSelection(); - } - return false; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnKeyUp([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) -{ - return false; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnLButtonDown(CViewport* view, int nFlags, const QPoint& point) -{ - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); - - if (m_bMoveByFaceNormManipShown) - { - HideMoveByFaceNormGizmo(); - } - - // CPointF ptMarker; - QPoint ptCoord; - - if (GetIEditor()->IsInGameMode() || GetIEditor()->IsInSimulationMode()) - { - // Ignore clicks while in game. - return false; - } - - // Allow interception of mouse clicks for custom behavior. - bool handledExternally = false; - EBUS_EVENT(AzToolsFramework::EditorRequests::Bus, - HandleObjectModeSelection, - AZ::Vector2(static_cast(point.x()), static_cast(point.y())), - nFlags, - handledExternally); - if (handledExternally) - { - return true; - } - - // Save the mouse down position - m_cMouseDownPos = point; - m_bDragThresholdExceeded = false; - - view->ResetSelectionRegion(); - - Vec3 pos = view->SnapToGrid(view->ViewToWorld(point)); - - // Swap X/Y - int unitSize = 1; - float hx = pos.y / unitSize; - float hy = pos.x / unitSize; - float hz = GetIEditor()->GetTerrainElevation(pos.x, pos.y); - - char szNewStatusText[512]; - sprintf_s(szNewStatusText, "Heightmap Coordinates: HX:%g HY:%g HZ:%g", hx, hy, hz); - GetIEditor()->SetStatusText(szNewStatusText); - - // Get control key status. - const bool bAltClick = (Qt::AltModifier & QApplication::queryKeyboardModifiers()); - bool bCtrlClick = (nFlags & MK_CONTROL); - bool bShiftClick = (nFlags & MK_SHIFT); - - bool bAddSelect = bCtrlClick; - bool bUnselect = bAltClick; - bool bNoRemoveSelection = bAddSelect || bUnselect; - - // Check deep selection mode activated - // The Deep selection has two mode. - // The normal mode pops the context menu, another is the cyclic selection on clinking. - const bool bTabPressed = CheckVirtualKey(Qt::Key_Tab); - const bool bZKeyPressed = CheckVirtualKey(Qt::Key_Z); - - CDeepSelection::EDeepSelectionMode dsMode = - (bTabPressed ? (bZKeyPressed ? CDeepSelection::DSM_POP : CDeepSelection::DSM_CYCLE) : CDeepSelection::DSM_NONE); - - bool bLockSelection = GetIEditor()->IsSelectionLocked(); - - int numUnselected = 0; - int numSelected = 0; - - // m_activeAxis = 0; - - HitContext hitInfo; - hitInfo.view = view; - if (bAddSelect || bUnselect) - { - // If adding or removing selection from the object, ignore hitting selection axis. - hitInfo.bIgnoreAxis = true; - } - - if (dsMode == CDeepSelection::DSM_POP) - { - m_pDeepSelection->Reset(true); - m_pDeepSelection->SetMode(dsMode); - hitInfo.pDeepSelection = m_pDeepSelection; - } - else if (dsMode == CDeepSelection::DSM_CYCLE) - { - if (!m_pDeepSelection->OnCycling(point)) - { - // Start of the deep selection cycling mode. - m_pDeepSelection->Reset(false); - m_pDeepSelection->SetMode(dsMode); - hitInfo.pDeepSelection = m_pDeepSelection; - } - } - else - { - if (m_pDeepSelection->GetPreviousMode() == CDeepSelection::DSM_NONE) - { - m_pDeepSelection->Reset(true); - } - - m_pDeepSelection->SetMode(CDeepSelection::DSM_NONE); - hitInfo.pDeepSelection = 0; - } - - if (view->HitTest(point, hitInfo)) - { - if (hitInfo.axis != 0) - { - GetIEditor()->SetAxisConstraints((AxisConstrains)hitInfo.axis); - bLockSelection = true; - } - if (hitInfo.axis != 0) - { - view->SetAxisConstrain(hitInfo.axis); - } - - - ////////////////////////////////////////////////////////////////////////// - // Deep Selection - CheckDeepSelection(hitInfo, view); - } - - CBaseObject* hitObj = hitInfo.object; - - int editMode = GetIEditor()->GetEditMode(); - - Matrix34 userTM = GetIEditor()->GetViewManager()->GetGrid()->GetMatrix(); - - if (hitObj) - { - Matrix34 tm = hitInfo.object->GetWorldTM(); - tm.OrthonormalizeFast(); - view->SetConstructionMatrix(COORDS_LOCAL, tm); - if (hitInfo.object->GetParent()) - { - Matrix34 parentTM = hitInfo.object->GetParent()->GetWorldTM(); - parentTM.OrthonormalizeFast(); - parentTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_PARENT, parentTM); - } - else - { - Matrix34 parentTM; - parentTM.SetIdentity(); - parentTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_PARENT, parentTM); - } - userTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_USERDEFINED, userTM); - - Matrix34 viewTM = view->GetViewTM(); - viewTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_VIEW, viewTM); - } - else - { - Matrix34 tm; - tm.SetIdentity(); - tm.SetTranslation(pos); - userTM.SetTranslation(pos); - view->SetConstructionMatrix(COORDS_LOCAL, tm); - view->SetConstructionMatrix(COORDS_PARENT, tm); - view->SetConstructionMatrix(COORDS_USERDEFINED, userTM); - } - - if (editMode != eEditModeTool) - { - // Check for Move to position. - if (bCtrlClick && bShiftClick && !hitInfo.object) - { - // Ctrl-Click on terrain will move selected objects to specified location. - MoveSelectionToPos(view, pos, bAltClick, point); - bLockSelection = true; - } - else if (bCtrlClick && bShiftClick && hitInfo.object) - { - const int nPickFlag = CSurfaceInfoPicker::ePOG_All; - view->BeginUndo(); - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - const int numObjects = pSelection->GetCount(); - for (int objectIndex = 0;objectIndex < numObjects;++objectIndex) - { - CBaseObject* m_curObj = pSelection->GetObject(objectIndex); - CSurfaceInfoPicker::CExcludedObjects excludeObjects; - excludeObjects.Add(m_curObj); - SRayHitInfo hitInfo2; - CSurfaceInfoPicker surfacePicker; - if (surfacePicker.Pick(point, hitInfo2, &excludeObjects, nPickFlag)) - { - m_curObj->SetPos(hitInfo2.vHitPos); - if (bAltClick) - { - Quat nq; - Vec3 zaxis = m_curObj->GetRotation() * Vec3(AZ::Vector3::CreateAxisZ()); - zaxis.Normalize(); - nq.SetRotationV0V1(zaxis, hitInfo2.vHitNormal); - m_curObj->SetRotation(nq * m_curObj->GetRotation()); - } - } - - } - AzToolsFramework::ScopedUndoBatch undo("Transform"); - view->AcceptUndo("Move Selection"); - bLockSelection = true; - } - } - - if (editMode == eEditModeMove) - { - if (!bNoRemoveSelection) - { - SetCommandMode(MoveMode); - } - - if (hitObj && hitObj->IsSelected() && !bNoRemoveSelection) - { - bLockSelection = true; - } - } - else if (editMode == eEditModeRotate) - { - if (!bNoRemoveSelection) - { - SetCommandMode(RotateMode); - } - if (hitObj && hitObj->IsSelected() && !bNoRemoveSelection) - { - bLockSelection = true; - } - } - else if (editMode == eEditModeScale) - { - if (!bNoRemoveSelection) - { - GetIEditor()->GetSelection()->StartScaling(); - SetCommandMode(ScaleMode); - } - - if (hitObj && hitObj->IsSelected() && !bNoRemoveSelection) - { - bLockSelection = true; - } - } - else if (hitObj != 0 && GetIEditor()->GetSelectedObject() == hitObj && !bAddSelect && !bUnselect) - { - bLockSelection = true; - } - - if (!bLockSelection) - { - // If not selection locked. - view->BeginUndo(); - - if (!bNoRemoveSelection) - { - // Current selection should be cleared - numUnselected = GetIEditor()->GetObjectManager()->ClearSelection(); - } - - if (hitObj) - { - numSelected = 1; - - if (!bUnselect) - { - if (hitObj->IsSelected()) - { - bUnselect = true; - } - } - - if (!bUnselect) - { - GetIEditor()->GetObjectManager()->SelectObject(hitObj, true); - } - else - { - GetIEditor()->GetObjectManager()->UnselectObject(hitObj); - } - } - if (view->IsUndoRecording()) - { - // When a designer object is selected, the update of the designer object can cause a change of a edit tool, which will makes this objectmode tool pointer invalid. - // so the update of objects must run on only pure idle time. - // view->AcceptUndo method calls the OnIdle() function in the app, which this is not a right timing to updates all, I think. - Jaesik Hwang. - GetIEditor()->GetObjectManager()->SetSkipUpdate(true); - view->AcceptUndo("Select Object(s)"); - GetIEditor()->GetObjectManager()->SetSkipUpdate(false); - } - - if ((numSelected == 0 || editMode == eEditModeSelect)) - { - // If object is not selected. - // Capture mouse input for this window. - SetCommandMode(SelectMode); - } - } - - if (GetCommandMode() == MoveMode || - GetCommandMode() == RotateMode || - GetCommandMode() == ScaleMode) - { - view->BeginUndo(); - - AzToolsFramework::EntityIdList selectedEntities; - AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( - selectedEntities, - &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities); - } - - ////////////////////////////////////////////////////////////////////////// - // Change cursor, must be before Capture mouse. - ////////////////////////////////////////////////////////////////////////// - SetObjectCursor(view, hitObj, true); - - ////////////////////////////////////////////////////////////////////////// - view->CaptureMouse(); - ////////////////////////////////////////////////////////////////////////// - - UpdateStatusText(); - - m_bTransformChanged = false; - - if (m_pDeepSelection->GetMode() == CDeepSelection::DSM_POP) - { - return OnLButtonUp(view, nFlags, point); - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnLButtonUp(CViewport* view, [[maybe_unused]] int nFlags, const QPoint& point) -{ - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); - - if (GetIEditor()->IsInGameMode() || GetIEditor()->IsInSimulationMode()) - { - // Ignore clicks while in game. - return true; - } - - if (m_bTransformChanged) - { - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - if (pSelection) - { - pSelection->FinishChanges(); - } - m_bTransformChanged = false; - } - - if (GetCommandMode() == ScaleMode) - { - Vec3 scale; - GetIEditor()->GetSelection()->FinishScaling(GetScale(view, point, scale), - GetIEditor()->GetReferenceCoordSys()); - } - - if (GetCommandMode() == MoveMode) - { - m_bDragThresholdExceeded = false; - } - - // Reset the status bar caption - GetIEditor()->SetStatusText("Ready"); - - ////////////////////////////////////////////////////////////////////////// - if (view->IsUndoRecording()) - { - if (GetCommandMode() == MoveMode) - { - { - AzToolsFramework::ScopedUndoBatch undo("Move"); - } - view->AcceptUndo("Move Selection"); - } - else if (GetCommandMode() == RotateMode) - { - { - AzToolsFramework::ScopedUndoBatch undo("Rotate"); - } - view->AcceptUndo("Rotate Selection"); - } - else if (GetCommandMode() == ScaleMode) - { - { - AzToolsFramework::ScopedUndoBatch undo("Scale"); - } - view->AcceptUndo("Scale Selection"); - } - else - { - view->CancelUndo(); - } - } - ////////////////////////////////////////////////////////////////////////// - - if (GetCommandMode() == SelectMode && (!GetIEditor()->IsSelectionLocked())) - { - const bool bUnselect = (Qt::AltModifier & QApplication::queryKeyboardModifiers()); - QRect selectRect = view->GetSelectionRectangle(); - if (!selectRect.isEmpty()) - { - // Ignore too small rectangles. - if (selectRect.width() > 5 && selectRect.height() > 5) - { - GetIEditor()->GetObjectManager()->SelectObjectsInRect(view, selectRect, !bUnselect); - UpdateStatusText(); - } - } - - if (GetIEditor()->GetEditMode() == eEditModeSelectArea) - { - AABB box; - GetIEditor()->GetSelectedRegion(box); - - ////////////////////////////////////////////////////////////////////////// - GetIEditor()->ClearSelection(); - } - } - // Release the restriction of the cursor - view->ReleaseMouse(); - - if (GetCommandMode() == ScaleMode || GetCommandMode() == MoveMode || GetCommandMode() == RotateMode) - { - AzToolsFramework::EntityIdList selectedEntities; - AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( - selectedEntities, - &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities); - - AzToolsFramework::EditorTransformChangeNotificationBus::Broadcast( - &AzToolsFramework::EditorTransformChangeNotificationBus::Events::OnEntityTransformChanged, - selectedEntities); - } - - if (GetIEditor()->GetEditMode() != eEditModeSelectArea) - { - view->ResetSelectionRegion(); - } - // Reset selected rectangle. - view->SetSelectionRectangle(QRect()); - - // Restore default editor axis constrain. - if (GetIEditor()->GetAxisConstrains() != view->GetAxisConstrain()) - { - view->SetAxisConstrain(GetIEditor()->GetAxisConstrains()); - } - - SetCommandMode(NothingMode); - - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnLButtonDblClk(CViewport* view, int nFlags, const QPoint& point) -{ - IEditor* editor = GetIEditor(); - - // If shift clicked, Move the camera to this place. - if (nFlags & MK_SHIFT) - { - // Get the heightmap coordinates for the click position - Vec3 v = view->ViewToWorld(point); - if (!(v.x == 0 && v.y == 0 && v.z == 0)) - { - Matrix34 tm = view->GetViewTM(); - Vec3 p = tm.GetTranslation(); - float height = p.z - editor->GetTerrainElevation(p.x, p.y); - if (height < 1) - { - height = 1; - } - p.x = v.x; - p.y = v.y; - p.z = editor->GetTerrainElevation(p.x, p.y) + height; - tm.SetTranslation(p); - view->SetViewTM(tm); - } - } - else - { - // Check if double clicked on object. - HitContext hitInfo; - view->HitTest(point, hitInfo); - - if (CBaseObject* hitObj = hitInfo.object) - { - // check if the object is an AZ::Entity - if ((hitObj->GetType() == OBJTYPE_AZENTITY)) - { - if (CRenderViewport* renderViewport = viewport_cast(view)) - { - // if we double clicked on an AZ::Entity/Component, build a mouse interaction and send a double - // click event to the EditorInteractionSystemViewportSelectionRequestBus. if we have double clicked - // on a component supporting ComponentMode, we will enter it. note: this is to support entering - // ComponentMode with a double click using the old viewport interaction model - const auto mouseInteraction = renderViewport->BuildMouseInteraction( - Qt::LeftButton, QGuiApplication::queryKeyboardModifiers(), - renderViewport->ViewportToWidget(point)); - - using AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus; - using AzToolsFramework::ViewportInteraction::MouseInteractionEvent; - using AzToolsFramework::ViewportInteraction::MouseEvent; - - EditorInteractionSystemViewportSelectionRequestBus::Event( - AzToolsFramework::GetEntityContextId(), - &EditorInteractionSystemViewportSelectionRequestBus::Events::InternalHandleMouseViewportInteraction, - MouseInteractionEvent(mouseInteraction, MouseEvent::DoubleClick)); - } - } - - // Fire double click event on hit object. - hitObj->OnEvent(EVENT_DBLCLICK); - } - else - { - if (!editor->IsSelectionLocked()) - { - editor->GetObjectManager()->ClearSelection(); - } - } - } - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnRButtonDown([[maybe_unused]] CViewport* view, [[maybe_unused]] int nFlags, [[maybe_unused]] const QPoint& point) -{ - if (gSettings.viewports.bEnableContextMenu && !GetIEditor()->IsInSimulationMode()) - { - m_openContext = true; - } - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnRButtonUp(CViewport* view, [[maybe_unused]] int nFlags, const QPoint& point) -{ - if (m_openContext) - { - bool selectionLocked = GetIEditor()->IsSelectionLocked(); - - // Check if right clicked on object. - HitContext hitInfo; - hitInfo.bIgnoreAxis = true; // ignore gizmo - view->HitTest(point, hitInfo); - - QPointer object; - - if (selectionLocked) - { - if (hitInfo.object) - { - // Save so we can use this for the context menu later - object = hitInfo.object; - } - } - else - { - Vec3 pos = view->SnapToGrid(view->ViewToWorld(point)); - Matrix34 userTM = GetIEditor()->GetViewManager()->GetGrid()->GetMatrix(); - - if (hitInfo.object) - { - Matrix34 tm = hitInfo.object->GetWorldTM(); - tm.OrthonormalizeFast(); - view->SetConstructionMatrix(COORDS_LOCAL, tm); - if (hitInfo.object->GetParent()) - { - Matrix34 parentTM = hitInfo.object->GetParent()->GetWorldTM(); - parentTM.OrthonormalizeFast(); - parentTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_PARENT, parentTM); - } - else - { - Matrix34 parentTM; - parentTM.SetIdentity(); - parentTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_PARENT, parentTM); - } - userTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_USERDEFINED, userTM); - - Matrix34 viewTM = view->GetViewTM(); - viewTM.SetTranslation(tm.GetTranslation()); - view->SetConstructionMatrix(COORDS_VIEW, viewTM); - - CSelectionGroup* selections = GetIEditor()->GetObjectManager()->GetSelection(); - - // hit object has not been selected - if (!selections->IsContainObject(hitInfo.object)) - { - view->BeginUndo(); - GetIEditor()->GetObjectManager()->ClearSelection(); - GetIEditor()->GetObjectManager()->SelectObject(hitInfo.object, true); - view->AcceptUndo("Select Object(s)"); - } - - // Save so we can use this for the context menu later - object = hitInfo.object; - } - else - { - Matrix34 tm; - tm.SetIdentity(); - tm.SetTranslation(pos); - userTM.SetTranslation(pos); - view->SetConstructionMatrix(COORDS_LOCAL, tm); - view->SetConstructionMatrix(COORDS_PARENT, tm); - view->SetConstructionMatrix(COORDS_USERDEFINED, userTM); - - view->BeginUndo(); - GetIEditor()->GetObjectManager()->ClearSelection(); - view->AcceptUndo("Select Object(s)"); - } - } - - // CRenderViewport hides the cursor when the mouse button is pressed - // and shows it when button is released. If we exec the context menu directly, then we block - // and the cursor stays invisible while the menu is open so instead, we queue it to happen - // after the mouse button release is finished - QTimer::singleShot(0, this, [point, view, object]() - { - QMenu menu(viewport_cast(view)); - - if (object) - { - object->OnContextMenu(&menu); - } - - // Populate global context menu. - int contextMenuFlag = 0; - EBUS_EVENT(AzToolsFramework::EditorEvents::Bus, - PopulateEditorGlobalContextMenu, - &menu, - AZ::Vector2(static_cast(point.x()), static_cast(point.y())), - contextMenuFlag); - - if (!menu.isEmpty()) - { - menu.exec(QCursor::pos()); - } - }); - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnMButtonDown(CViewport* view, [[maybe_unused]] int nFlags, const QPoint& point) -{ - if (GetIEditor()->GetGameEngine()->GetSimulationMode()) - { - // Get control key status. - const bool bCtrlClick = (Qt::ControlModifier & QApplication::queryKeyboardModifiers()); - - if (bCtrlClick) - { - // In simulation mode awake objects under the cursor when Ctrl+MButton pressed. - AwakeObjectAtPoint(view, point); - return true; - } - } - return false; -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::AwakeObjectAtPoint(CViewport* view, const QPoint& point) -{ - // In simulation mode awake objects under the cursor. - // Check if double clicked on object. - HitContext hitInfo; - view->HitTest(point, hitInfo); - CBaseObject* hitObj = hitInfo.object; - if (hitObj) - { - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::MoveSelectionToPos(CViewport* view, Vec3& pos, bool align, const QPoint& point) -{ - view->BeginUndo(); - // Find center of selection. - Vec3 center = GetIEditor()->GetSelection()->GetCenter(); - GetIEditor()->GetSelection()->Move(pos - center, CSelectionGroup::eMS_None, true, point); - - if (align) - { - GetIEditor()->GetSelection()->Align(); - } - - // This will capture any entity state changes that occurred - // during the move. - { - AzToolsFramework::ScopedUndoBatch undo("Transform"); - } - - view->AcceptUndo("Move Selection"); -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnMouseMove(CViewport* view, int nFlags, const QPoint& point) -{ - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); - - if (GetIEditor()->IsInGameMode() || GetIEditor()->IsInSimulationMode()) - { - // Ignore while in game. - return true; - } - - // Has the mouse been intentionally moved or could this be a small jump in movement due to right clicking? - if (std::abs(m_prevMousePos.x() - point.x()) > 2 || std::abs(m_prevMousePos.y() - point.y()) > 2) - { - // This was an intentional mouse movement, disable the context menu - m_openContext = false; - } - m_prevMousePos = point; - SetObjectCursor(view, 0); - - // get world/local coordinate system setting. - int coordSys = GetIEditor()->GetReferenceCoordSys(); - - // get current axis constrains. - if (GetCommandMode() == MoveMode) - { - if (!m_bDragThresholdExceeded) - { - int halfLength = gSettings.viewports.nDragSquareSize / 2; - QRect rcDrag(m_cMouseDownPos, QSize(0,0)); - rcDrag.adjust(-halfLength, -halfLength, halfLength, halfLength); - - if (!rcDrag.contains(point)) - { - m_bDragThresholdExceeded = true; - m_lastValidMoveVector = Vec3(0, 0, 0); - } - else - { - return true; - } - } - - GetIEditor()->RestoreUndo(); - - Vec3 v; - //m_cMouseDownPos = point; - CSelectionGroup::EMoveSelectionFlag selectionFlag = CSelectionGroup::eMS_None; - if (view->GetAxisConstrain() == AXIS_TERRAIN) - { - selectionFlag = CSelectionGroup::eMS_FollowTerrain; - Vec3 p1 = view->SnapToGrid(view->ViewToWorld(m_cMouseDownPos)); - Vec3 p2 = view->SnapToGrid(view->ViewToWorld(point)); - v = p2 - p1; - v.z = 0; - m_lastValidMoveVector = v; - } - else - { - Vec3 p1 = view->MapViewToCP(m_cMouseDownPos); - Vec3 p2 = view->MapViewToCP(point); - - if (p1.IsZero() || p2.IsZero()) - { - v = m_lastValidMoveVector; - } - else - { - v = view->GetCPVector(p1, p2); - m_lastValidMoveVector = v; - } - - //Matrix invParent = m_parentConstructionMatrix; - //invParent.Invert(); - //p1 = invParent.TransformVector(p1); - //p2 = invParent.TransformVector(p2); - //v = p2 - p1; - } - - if ((nFlags & MK_CONTROL) && !(nFlags & MK_SHIFT)) - { - selectionFlag = CSelectionGroup::eMS_FollowGeometryPosNorm; - } - - if (!v.IsEquivalent(Vec3(0, 0, 0))) - { - m_bTransformChanged = true; - } - - CTrackViewSequence* pSequence = GetIEditor()->GetAnimation()->GetSequence(); - { - CTrackViewSequenceNoNotificationContext context(pSequence); - GetIEditor()->GetSelection()->Move(v, selectionFlag, coordSys, point); - } - - if (pSequence) - { - pSequence->OnKeysChanged(); - } - - return true; - } - else if (GetCommandMode() == ScaleMode) - { - GetIEditor()->RestoreUndo(); - Vec3 scale; - GetIEditor()->GetSelection()->Scale(GetScale(view, point, scale), coordSys); - if (!scale.IsEquivalent(Vec3(0, 0, 0))) - { - m_bTransformChanged = true; - } - } - else if (GetCommandMode() == SelectMode) - { - // Ignore select when selection locked. - if (GetIEditor()->IsSelectionLocked()) - { - return true; - } - - QRect rc(m_cMouseDownPos, point - QPoint(1, 1)); - if (GetIEditor()->GetEditMode() == eEditModeSelectArea) - { - view->OnDragSelectRectangle(rc, false); - } - else - { - view->SetSelectionRectangle(rc); - } - //else - //OnDragSelectRectangle( CPoint(rc.left,rc.top),CPoint(rc.right,rc.bottom),true ); - } - - if (!(nFlags & MK_RBUTTON || nFlags & MK_MBUTTON)) - { - // Track mouse movements. - HitContext hitInfo; - if (view->HitTest(point, hitInfo)) - { - SetObjectCursor(view, hitInfo.object); - } - - HandleMoveByFaceNormal(hitInfo); - } - - if ((nFlags & MK_MBUTTON) && GetIEditor()->GetGameEngine()->GetSimulationMode()) - { - // Get control key status. - const bool bCtrlClick = (Qt::ControlModifier & QApplication::queryKeyboardModifiers()); - - if (bCtrlClick) - { - // In simulation mode awake objects under the cursor when Ctrl+MButton pressed. - AwakeObjectAtPoint(view, point); - } - } - - UpdateStatusText(); - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectMode::OnMouseLeave(CViewport* view) -{ - if (GetIEditor()->IsInGameMode() || GetIEditor()->IsInSimulationMode()) - { - // Ignore while in game. - return true; - } - - m_openContext = false; - SetObjectCursor(view, 0); - - return true; -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::SetObjectCursor(CViewport* view, CBaseObject* hitObj, [[maybe_unused]] bool bChangeNow) -{ - EStdCursor cursor = STD_CURSOR_DEFAULT; - QString m_cursorStr; - QString supplementaryCursor = ""; - - CBaseObject* pMouseOverObject = NULL; - if (!GuidUtil::IsEmpty(m_MouseOverObject)) - { - pMouseOverObject = GetIEditor()->GetObjectManager()->FindObject(m_MouseOverObject); - } - - //HCURSOR hPrevCursor = m_hCurrCursor; - if (pMouseOverObject) - { - pMouseOverObject->SetHighlight(false); - } - if (hitObj) - { - m_MouseOverObject = hitObj->GetId(); - } - else - { - m_MouseOverObject = GUID_NULL; - } - pMouseOverObject = hitObj; - bool bHitSelectedObject = false; - if (pMouseOverObject) - { - if (GetCommandMode() != SelectMode && !GetIEditor()->IsSelectionLocked()) - { - if (pMouseOverObject->CanBeHightlighted()) - { - pMouseOverObject->SetHighlight(true); - } - - m_cursorStr = pMouseOverObject->GetName(); - - QString comment(pMouseOverObject->GetComment()); - if (!comment.isEmpty()) - { - m_cursorStr += "\n"; - m_cursorStr += comment; - } - - QString warnings(pMouseOverObject->GetWarningsText()); - if (!warnings.isEmpty()) - { - m_cursorStr += warnings; - } - - cursor = STD_CURSOR_HIT; - if (pMouseOverObject->IsSelected()) - { - bHitSelectedObject = true; - } - - if (pMouseOverObject->GetType() == OBJTYPE_AZENTITY) - { - CComponentEntityObject* componentEntity = static_cast(pMouseOverObject); - - bool isEditorOnly = false; - AzToolsFramework::EditorOnlyEntityComponentRequestBus::EventResult(isEditorOnly, componentEntity->GetAssociatedEntityId(), &AzToolsFramework::EditorOnlyEntityComponentRequests::IsEditorOnlyEntity); - AZ::Entity* entity = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(entity, &AZ::ComponentApplicationBus::Events::FindEntity, componentEntity->GetAssociatedEntityId()); - const bool isInitiallyActive = entity ? entity->IsRuntimeActiveByDefault() : true; - - if (isEditorOnly) - { - supplementaryCursor = "\n[" + QObject::tr("Editor Only") + "]"; - } - else if (!isInitiallyActive) - { - supplementaryCursor = "\n[" + QObject::tr("Inactive") + "]"; - } - } - } - - QString tooltip = pMouseOverObject->GetTooltip(); - if (!tooltip.isEmpty()) - { - m_cursorStr += "\n"; - m_cursorStr += tooltip; - } - ; - } - else - { - m_cursorStr = ""; - cursor = STD_CURSOR_DEFAULT; - } - // Get control key status. - const auto modifiers = QApplication::queryKeyboardModifiers(); - const bool bAltClick = (Qt::AltModifier & modifiers); - const bool bCtrlClick = (Qt::ControlModifier & modifiers); - const bool bShiftClick = (Qt::ShiftModifier & modifiers); - - bool bAddSelect = bCtrlClick && !bShiftClick; - bool bUnselect = bAltClick; - bool bNoRemoveSelection = bAddSelect || bUnselect; - - bool bLockSelection = GetIEditor()->IsSelectionLocked(); - - if (GetCommandMode() == SelectMode || GetCommandMode() == NothingMode) - { - if (bAddSelect) - { - cursor = STD_CURSOR_SEL_PLUS; - } - if (bUnselect) - { - cursor = STD_CURSOR_SEL_MINUS; - } - - if ((bHitSelectedObject && !bNoRemoveSelection) || bLockSelection) - { - int editMode = GetIEditor()->GetEditMode(); - if (editMode == eEditModeMove) - { - cursor = STD_CURSOR_MOVE; - } - else if (editMode == eEditModeRotate) - { - cursor = STD_CURSOR_ROTATE; - } - else if (editMode == eEditModeScale) - { - cursor = STD_CURSOR_SCALE; - } - } - } - else if (GetCommandMode() == MoveMode) - { - cursor = STD_CURSOR_MOVE; - } - else if (GetCommandMode() == RotateMode) - { - cursor = STD_CURSOR_ROTATE; - } - else if (GetCommandMode() == ScaleMode) - { - cursor = STD_CURSOR_SCALE; - } - - AZ::u32 cursorId = static_cast(cursor); - AZStd::string cursorStr = m_cursorStr.toUtf8().data(); - EBUS_EVENT(AzToolsFramework::EditorRequests::Bus, - UpdateObjectModeCursor, - cursorId, - cursorStr); - cursor = static_cast(cursorId); - m_cursorStr = cursorStr.c_str(); - - view->SetCurrentCursor(cursor, m_cursorStr); - view->SetSupplementaryCursorStr(supplementaryCursor); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::RegisterTool(CRegistrationContext& rc) -{ - rc.pClassFactory->RegisterClass(new CQtViewClass("EditTool.ObjectMode", "Select", ESYSTEM_CLASS_EDITTOOL)); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::UpdateStatusText() -{ - QString str; - int nCount = GetIEditor()->GetSelection()->GetCount(); - if (nCount > 0) - { - str = tr("%1 Object(s) Selected").arg(nCount); - } - else - { - str = tr("No Selection"); - } - SetStatusText(str); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectMode::CheckDeepSelection(HitContext& hitContext, CViewport* view) -{ - if (hitContext.pDeepSelection) - { - m_pDeepSelection->CollectCandidate(hitContext.dist, gSettings.deepSelectionSettings.fRange); - } - - if (m_pDeepSelection->GetCandidateObjectCount() > 1) - { - // Deep Selection Pop Mode - if (m_pDeepSelection->GetMode() == CDeepSelection::DSM_POP) - { - // Show a sorted pop-up menu for selecting a bone. - QMenu popUpDeepSelect(qobject_cast(view->qobject())); - - for (int i = 0; i < m_pDeepSelection->GetCandidateObjectCount(); ++i) - { - QAction* action = popUpDeepSelect.addAction(QString(m_pDeepSelection->GetCandidateObject(i)->GetName())); - action->setData(i); - } - - QAction* userSelection = popUpDeepSelect.exec(QCursor::pos()); - if (userSelection) - { - int nSelect = userSelection->data().toInt(); - - // Update HitContext hitInfo. - hitContext.object = m_pDeepSelection->GetCandidateObject(nSelect); - m_pDeepSelection->ExcludeHitTest(nSelect); - } - } - else if (m_pDeepSelection->GetMode() == CDeepSelection::DSM_CYCLE) - { - int selPos = m_pDeepSelection->GetCurrentSelectPos(); - hitContext.object = m_pDeepSelection->GetCandidateObject(selPos + 1); - m_pDeepSelection->ExcludeHitTest(selPos + 1); - } - } -} - -Vec3& CObjectMode::GetScale(const CViewport* view, const QPoint& point, Vec3& OutScale) -{ - float ay = 1.0f - 0.01f * (point.y() - m_cMouseDownPos.y()); - - if (ay < 0.01f) - { - ay = 0.01f; - } - - Vec3 scl(ay, ay, ay); - - int axisConstrain = view->GetAxisConstrain(); - - if (axisConstrain < AXIS_XYZ && GetIEditor()->IsAxisVectorLocked()) - { - axisConstrain = AXIS_XYZ; - } - - switch (axisConstrain) - { - case AXIS_X: - scl(ay, 1, 1); - break; - case AXIS_Y: - scl(1, ay, 1); - break; - case AXIS_Z: - scl(1, 1, ay); - break; - case AXIS_XY: - scl(ay, ay, ay); - break; - case AXIS_XZ: - scl(ay, ay, ay); - break; - case AXIS_YZ: - scl(ay, ay, ay); - break; - case AXIS_XYZ: - scl(ay, ay, ay); - break; - case AXIS_TERRAIN: - scl(ay, ay, ay); - break; - } - ; - - OutScale = scl; - - return OutScale; -} - -////////////////////////////////////////////////////////////////////////// -// This callback is currently called only to handle the case of the 'move by the face normal'. -// Other movements of the object are handled in the 'CObjectMode::OnMouseMove()' method. -void CObjectMode::OnManipulatorDrag(CViewport* view, [[maybe_unused]] ITransformManipulator* pManipulator, QPoint& point0, [[maybe_unused]] QPoint& point1, const Vec3& value) -{ - RefCoordSys coordSys = GetIEditor()->GetReferenceCoordSys(); - int editMode = GetIEditor()->GetEditMode(); - - if (editMode == eEditModeMove) - { - GetIEditor()->RestoreUndo(); - CSelectionGroup* pSelGrp = GetIEditor()->GetSelection(); - - CSelectionGroup::EMoveSelectionFlag selectionFlag = view->GetAxisConstrain() == AXIS_TERRAIN ? CSelectionGroup::eMS_FollowTerrain : CSelectionGroup::eMS_None; - pSelGrp->Move(value, selectionFlag, coordSys, point0); - - if (m_pHitObject) - { - UpdateMoveByFaceNormGizmo(m_pHitObject); - } - } -} - -void CObjectMode::HandleMoveByFaceNormal([[maybe_unused]] HitContext& hitInfo) -{ - const bool bNKeyPressed = CheckVirtualKey(Qt::Key_N); - if (m_bMoveByFaceNormManipShown && !bNKeyPressed) - { - HideMoveByFaceNormGizmo(); - } -} - -void CObjectMode::UpdateMoveByFaceNormGizmo(CBaseObject* pHitObject) -{ - Matrix34 refFrame; - refFrame.SetIdentity(); - SubObjectSelectionReferenceFrameCalculator calculator(SO_ELEM_FACE); - pHitObject->CalculateSubObjectSelectionReferenceFrame(&calculator); - if (calculator.GetFrame(refFrame) == false) - { - HideMoveByFaceNormGizmo(); - } - else - { - ITransformManipulator* pManipulator = GetIEditor()->ShowTransformManipulator(true); - m_bMoveByFaceNormManipShown = true; - m_pHitObject = pHitObject; - - Matrix34 parentTM = pHitObject->GetWorldTM(); - Matrix34 userTM = GetIEditor()->GetViewManager()->GetGrid()->GetMatrix(); - parentTM.SetTranslation(refFrame.GetTranslation()); - userTM.SetTranslation(refFrame.GetTranslation()); - pManipulator->SetTransformation(COORDS_LOCAL, refFrame); - pManipulator->SetTransformation(COORDS_PARENT, parentTM); - pManipulator->SetTransformation(COORDS_USERDEFINED, userTM); - pManipulator->SetAlwaysUseLocal(true); - } -} - -void CObjectMode::HideMoveByFaceNormGizmo() -{ - GetIEditor()->ShowTransformManipulator(false); - m_bMoveByFaceNormManipShown = false; - m_pHitObject = NULL; -} - -#include - diff --git a/Code/Sandbox/Editor/EditMode/ObjectMode.h b/Code/Sandbox/Editor/EditMode/ObjectMode.h deleted file mode 100644 index a7919b2c47..0000000000 --- a/Code/Sandbox/Editor/EditMode/ObjectMode.h +++ /dev/null @@ -1,134 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Object edit mode describe viewport input behavior when operating on objects. - - -#ifndef CRYINCLUDE_EDITOR_EDITMODE_OBJECTMODE_H -#define CRYINCLUDE_EDITOR_EDITMODE_OBJECTMODE_H -#pragma once - -// {87109FED-BDB5-4874-936D-338400079F58} -DEFINE_GUID(OBJECT_MODE_GUID, 0x87109fed, 0xbdb5, 0x4874, 0x93, 0x6d, 0x33, 0x84, 0x0, 0x7, 0x9f, 0x58); - -#include "EditTool.h" - -class CBaseObject; -class CDeepSelection; -/*! -* CObjectMode is an abstract base class for All Editing Tools supported by Editor. -* Edit tools handle specific editing modes in viewports. -*/ -class SANDBOX_API CObjectMode - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE CObjectMode(QObject* parent = nullptr); - virtual ~CObjectMode(); - - static const GUID& GetClassID() { return OBJECT_MODE_GUID; } - - // Registration function. - static void RegisterTool(CRegistrationContext& rc); - - ////////////////////////////////////////////////////////////////////////// - // CEditTool implementation. - ////////////////////////////////////////////////////////////////////////// - virtual void BeginEditParams([[maybe_unused]] IEditor* ie, [[maybe_unused]] int flags) {}; - virtual void EndEditParams(); - virtual void Display(struct DisplayContext& dc); - virtual void DisplaySelectionPreview(struct DisplayContext& dc); - virtual void DrawSelectionPreview(struct DisplayContext& dc, CBaseObject* drawObject); - void DisplayExtraLightInfo(struct DisplayContext& dc); - - virtual bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - virtual bool OnKeyDown(CViewport* view, uint32 nChar, uint32 nRepCnt, uint32 nFlags); - virtual bool OnKeyUp(CViewport* view, uint32 nChar, uint32 nRepCnt, uint32 nFlags); - virtual bool OnSetCursor([[maybe_unused]] CViewport* vp) { return false; }; - - virtual void OnManipulatorDrag(CViewport* view, ITransformManipulator* pManipulator, QPoint& p0, QPoint& p1, const Vec3& value) override; - - bool IsUpdateUIPanel() override { return true; } - -protected: - enum ECommandMode - { - NothingMode = 0, - ScrollZoomMode, - SelectMode, - MoveMode, - RotateMode, - ScaleMode, - ScrollMode, - ZoomMode, - }; - - virtual bool OnLButtonDown(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnLButtonDblClk(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnLButtonUp(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnRButtonDown(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnRButtonUp(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnMButtonDown(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnMouseMove(CViewport* view, int nFlags, const QPoint& point); - virtual bool OnMouseLeave(CViewport* view); - - void SetCommandMode(ECommandMode mode) { m_commandMode = mode; } - ECommandMode GetCommandMode() const { return m_commandMode; } - - //! Ctrl-Click in move mode to move selected objects to given pos. - void MoveSelectionToPos(CViewport* view, Vec3& pos, bool align, const QPoint& point); - void SetObjectCursor(CViewport* view, CBaseObject* hitObj, bool bChangeNow = false); - - virtual void DeleteThis() { delete this; }; - - void UpdateStatusText(); - void AwakeObjectAtPoint(CViewport* view, const QPoint& point); - - void HideMoveByFaceNormGizmo(); - void HandleMoveByFaceNormal(HitContext& hitInfo); - void UpdateMoveByFaceNormGizmo(CBaseObject* pHitObject); - -protected: - - bool m_openContext; - -private: - void CheckDeepSelection(HitContext& hitContext, CViewport* view); - Vec3& GetScale(const CViewport* view, const QPoint& point, Vec3& OutScale); - - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - QPoint m_cMouseDownPos; - bool m_bDragThresholdExceeded; - ECommandMode m_commandMode; - - GUID m_MouseOverObject; - typedef std::vector TGuidContainer; - TGuidContainer m_PreviewGUIDs; - - _smart_ptr m_pDeepSelection; - - bool m_bMoveByFaceNormManipShown; - CBaseObject* m_pHitObject; - - bool m_bTransformChanged; - - QPoint m_prevMousePos = QPoint(0, 0); - - Vec3 m_lastValidMoveVector = Vec3(0, 0, 0); - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING -}; - - - -#endif // CRYINCLUDE_EDITOR_EDITMODE_OBJECTMODE_H diff --git a/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.cpp b/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.cpp deleted file mode 100644 index a0a5492f55..0000000000 --- a/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#if defined(AZ_PLATFORM_WINDOWS) -#include -#endif - -#include "VertexSnappingModeTool.h" - -// Editor -#include "Settings.h" -#include "Viewport.h" -#include "SurfaceInfoPicker.h" -#include "Material/Material.h" -#include "Util/KDTree.h" - - -// {3e008046-9269-41d7-82e2-07ffd7254c10} -DEFINE_GUID(VERTEXSNAPPING_MODE_GUID, 0x3e008046, 0x9269, 0x41d7, 0x82, 0xe2, 0x07, 0xff, 0xd7, 0x25, 0x4c, 0x10); - -bool FindNearestVertex(CBaseObject* pObject, CKDTree* pTree, const Vec3& vWorldRaySrc, const Vec3& vWorldRayDir, Vec3& outPos, Vec3& vOutHitPosOnCube) -{ - Matrix34 worldInvTM = pObject->GetWorldTM().GetInverted(); - Vec3 vRaySrc = worldInvTM.TransformPoint(vWorldRaySrc); - Vec3 vRayDir = worldInvTM.TransformVector(vWorldRayDir); - Vec3 vLocalCameraPos = worldInvTM.TransformPoint(gEnv->pRenderer->GetCamera().GetPosition()); - Vec3 vPos; - Vec3 vHitPosOnCube; - - if (pTree) - { - if (pTree->FindNearestVertex(vRaySrc, vRayDir, gSettings.vertexSnappingSettings.vertexCubeSize, vLocalCameraPos, vPos, vHitPosOnCube)) - { - outPos = pObject->GetWorldTM().TransformPoint(vPos); - vOutHitPosOnCube = pObject->GetWorldTM().TransformPoint(vHitPosOnCube); - return true; - } - } - else - { - // for objects without verts, the pivot is the nearest vertex - // return true if the ray hits the bounding box - outPos = pObject->GetWorldPos(); - - AABB bbox; - pObject->GetBoundBox(bbox); - if (bbox.IsContainPoint(vWorldRaySrc)) - { - // if ray starts inside bounding box, reject cases where pivot is behind the ray - float hitDistAlongRay = vWorldRayDir.Dot(outPos - vWorldRaySrc); - if (hitDistAlongRay >= 0.f) - { - vHitPosOnCube = vWorldRaySrc + (vWorldRayDir * hitDistAlongRay); - return true; - } - } - else if (Intersect::Ray_AABB(vWorldRaySrc, vWorldRayDir, bbox, vOutHitPosOnCube)) - { - return true; - } - } - - return false; -} - -CVertexSnappingModeTool::CVertexSnappingModeTool() -{ - m_modeStatus = eVSS_SelectFirstVertex; - m_bHit = false; -} - -CVertexSnappingModeTool::~CVertexSnappingModeTool() -{ - std::map::iterator ii = m_ObjectKdTreeMap.begin(); - for (; ii != m_ObjectKdTreeMap.end(); ++ii) - { - delete ii->second; - } -} - -const GUID& CVertexSnappingModeTool::GetClassID() -{ - return VERTEXSNAPPING_MODE_GUID; -} - -void CVertexSnappingModeTool::RegisterTool(CRegistrationContext& rc) -{ - rc.pClassFactory->RegisterClass(new CQtViewClass("EditTool.VertexSnappingMode", "Select", ESYSTEM_CLASS_EDITTOOL)); -} - -bool CVertexSnappingModeTool::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) -{ - CBaseObjectPtr pExcludedObject = NULL; - if (m_modeStatus == eVSS_MoveSelectVertexToAnotherVertex) - { - pExcludedObject = m_SelectionInfo.m_pObject; - } - - m_bHit = HitTest(view, point, pExcludedObject, m_vHitVertex, m_pHitObject, m_Objects); - - if (event == eMouseLDown && m_bHit && m_pHitObject && m_modeStatus == eVSS_SelectFirstVertex) - { - m_modeStatus = eVSS_MoveSelectVertexToAnotherVertex; - m_SelectionInfo.m_pObject = m_pHitObject; - m_SelectionInfo.m_vPos = m_vHitVertex; - - GetIEditor()->BeginUndo(); - m_pHitObject->StoreUndo("Vertex Snapping", true); - - view->SetCapture(); - } - - if (m_modeStatus == eVSS_MoveSelectVertexToAnotherVertex) - { - if (event == eMouseLUp) - { - m_modeStatus = eVSS_SelectFirstVertex; - - GetIEditor()->AcceptUndo("Vertex Snapping"); - view->ReleaseMouse(); - } - else if ((flags & MK_LBUTTON) && event == eMouseMove) - { - Vec3 vOffset = m_SelectionInfo.m_pObject->GetWorldPos() - m_SelectionInfo.m_vPos; - m_SelectionInfo.m_pObject->SetWorldPos(m_vHitVertex + vOffset); - m_SelectionInfo.m_vPos = m_SelectionInfo.m_pObject->GetWorldPos() - vOffset; - } - } - - return true; -} - -bool CVertexSnappingModeTool::HitTest(CViewport* view, const QPoint& point, CBaseObject* pExcludedObj, Vec3& outHitPos, CBaseObjectPtr& pOutHitObject, std::vector& outObjects) -{ - if (gSettings.vertexSnappingSettings.bRenderPenetratedBoundBox) - { - m_DebugBoxes.clear(); - } - - pOutHitObject = NULL; - outObjects.clear(); - - // - // Collect valid objects that mouse is over - // - - CSurfaceInfoPicker picker; - CSurfaceInfoPicker::CExcludedObjects excludedObjects; - if (pExcludedObj) - { - excludedObjects.Add(pExcludedObj); - } - - int nPickFlag = CSurfaceInfoPicker::ePOG_Entity; - - std::vector penetratedObjects; - if (!picker.PickByAABB(point, nPickFlag, view, &excludedObjects, &penetratedObjects)) - { - return false; - } - - for (int i = 0, iCount(penetratedObjects.size()); i < iCount; ++i) - { - CMaterial* pMaterial = penetratedObjects[i]->GetMaterial(); - if (pMaterial) - { - QString matName = pMaterial->GetName(); - if (!QString::compare(matName, "Objects/sky/forest_sky_dome", Qt::CaseInsensitive)) - { - continue; - } - } - outObjects.push_back(penetratedObjects[i]); - } - - // - // Find the best vertex. - // - - Vec3 vWorldRaySrc, vWorldRayDir; - view->ViewToWorldRay(point, vWorldRaySrc, vWorldRayDir); - - std::vector::iterator ii = outObjects.begin(); - float fNearestDist = 3e10f; - Vec3 vNearestPos; - CBaseObjectPtr pNearestObject = NULL; - for (ii = outObjects.begin(); ii != outObjects.end(); ++ii) - { - if (gSettings.vertexSnappingSettings.bRenderPenetratedBoundBox) - { - // add to debug boxes: the penetrated nodes of each object's kd-tree - if (auto pTree = GetKDTree(*ii)) - { - Matrix34 invWorldTM = (*ii)->GetWorldTM().GetInverted(); - int nIndex = m_DebugBoxes.size(); - - Vec3 vLocalRaySrc = invWorldTM.TransformPoint(vWorldRaySrc); - Vec3 vLocalRayDir = invWorldTM.TransformVector(vWorldRayDir); - pTree->GetPenetratedBoxes(vLocalRaySrc, vLocalRayDir, m_DebugBoxes); - for (int i = nIndex; i < m_DebugBoxes.size(); ++i) - { - m_DebugBoxes[i].SetTransformedAABB((*ii)->GetWorldTM(), m_DebugBoxes[i]); - } - } - } - - // find the nearest vertex on this object - Vec3 vPos, vHitPosOnCube; - if (FindNearestVertex(*ii, GetKDTree(*ii), vWorldRaySrc, vWorldRayDir, vPos, vHitPosOnCube)) - { - // is this the best so far? - float fDistance = vHitPosOnCube.GetDistance(vWorldRaySrc); - if (fDistance < fNearestDist) - { - fNearestDist = fDistance; - vNearestPos = vPos; - pNearestObject = *ii; - } - } - } - - if (fNearestDist < 3e10f) - { - outHitPos = vNearestPos; - pOutHitObject = pNearestObject; - } - - // if the mouse is over the object's pivot, use that instead of a vertex - if (pOutHitObject) - { - Vec3 vPivotPos = pOutHitObject->GetWorldPos(); - Vec3 vPivotBox = GetCubeSize(view, pOutHitObject->GetWorldPos()); - AABB pivotAABB(vPivotPos - vPivotBox, vPivotPos + vPivotBox); - Vec3 vPosOnPivotCube; - if (Intersect::Ray_AABB(vWorldRaySrc, vWorldRayDir, pivotAABB, vPosOnPivotCube)) - { - outHitPos = vPivotPos; - return true; - } - } - - return pOutHitObject && pOutHitObject == pNearestObject; -} - -Vec3 CVertexSnappingModeTool::GetCubeSize(IDisplayViewport* pView, const Vec3& pos) const -{ - if (!pView) - { - return Vec3(0, 0, 0); - } - float fScreenFactor = pView->GetScreenScaleFactor(pos); - return gSettings.vertexSnappingSettings.vertexCubeSize * Vec3(fScreenFactor, fScreenFactor, fScreenFactor); -} - -void CVertexSnappingModeTool::Display(struct DisplayContext& dc) -{ - const ColorB SnappedColor(0xFF00FF00); - const ColorB PivotColor(0xFF2020FF); - const ColorB VertexColor(0xFFFFAAAA); - - // draw all objects under mouse - dc.SetColor(VertexColor); - for (int i = 0, iCount(m_Objects.size()); i < iCount; ++i) - { - AABB worldAABB; - m_Objects[i]->GetBoundBox(worldAABB); - if (!dc.view->IsBoundsVisible(worldAABB)) - { - continue; - } - - if (auto pStatObj = m_Objects[i]->GetIStatObj()) - { - DrawVertexCubes(dc, m_Objects[i]->GetWorldTM(), pStatObj); - } - else - { - dc.DrawWireBox(worldAABB.min, worldAABB.max); - } - } - - // draw object being moved - if (m_modeStatus == eVSS_MoveSelectVertexToAnotherVertex && m_SelectionInfo.m_pObject) - { - dc.SetColor(QColor(0xaa, 0xaa, 0xaa)); - if (auto pStatObj = m_SelectionInfo.m_pObject->GetIStatObj()) - { - DrawVertexCubes(dc, m_SelectionInfo.m_pObject->GetWorldTM(), pStatObj); - } - else - { - AABB bounds; - m_SelectionInfo.m_pObject->GetBoundBox(bounds); - dc.DrawWireBox(bounds.min, bounds.max); - } - } - - // draw pivot of hit object - if (m_pHitObject && (!m_bHit || m_bHit && !m_pHitObject->GetWorldPos().IsEquivalent(m_vHitVertex, 0.001f))) - { - dc.SetColor(PivotColor); - dc.DepthTestOff(); - - Vec3 vBoxSize = GetCubeSize(dc.view, m_pHitObject->GetWorldPos()) * 1.2f; - AABB vertexBox(m_pHitObject->GetWorldPos() - vBoxSize, m_pHitObject->GetWorldPos() + vBoxSize); - dc.DrawBall((vertexBox.min + vertexBox.max) * 0.5f, (vertexBox.max.x - vertexBox.min.x) * 0.5f); - - dc.DepthTestOn(); - } - - // draw the vertex (or pivot) that's being hit - if (m_bHit) - { - dc.DepthTestOff(); - dc.SetColor(SnappedColor); - Vec3 vBoxSize = GetCubeSize(dc.view, m_vHitVertex); - if (m_vHitVertex.IsEquivalent(m_pHitObject->GetWorldPos(), 0.001f)) - { - dc.DrawBall(m_vHitVertex, vBoxSize.x * 1.2f); - } - else - { - dc.DrawSolidBox(m_vHitVertex - vBoxSize, m_vHitVertex + vBoxSize); - } - dc.DepthTestOn(); - } - - // draw wireframe of hit object - if (m_pHitObject && m_pHitObject->GetIStatObj()) - { - SGeometryDebugDrawInfo dd; - dd.tm = m_pHitObject->GetWorldTM(); - dd.color = ColorB(250, 0, 250, 30); - dd.lineColor = ColorB(255, 255, 0, 160); - dd.bExtrude = true; - m_pHitObject->GetIStatObj()->DebugDraw(dd); - } - - // draw debug boxes - if (gSettings.vertexSnappingSettings.bRenderPenetratedBoundBox) - { - ColorB boxColor(40, 40, 40); - for (int i = 0, iCount(m_DebugBoxes.size()); i < iCount; ++i) - { - dc.SetColor(boxColor); - boxColor += ColorB(25, 25, 25); - dc.DrawWireBox(m_DebugBoxes[i].min, m_DebugBoxes[i].max); - } - } -} - -void CVertexSnappingModeTool::DrawVertexCubes(DisplayContext& dc, const Matrix34& tm, IStatObj* pStatObj) -{ - if (!pStatObj) - { - return; - } - - IIndexedMesh* pIndexedMesh = pStatObj->GetIndexedMesh(); - if (pIndexedMesh) - { - IIndexedMesh::SMeshDescription md; - pIndexedMesh->GetMeshDescription(md); - for (int k = 0; k < md.m_nVertCount; ++k) - { - Vec3 vPos(0, 0, 0); - if (md.m_pVerts) - { - vPos = md.m_pVerts[k]; - } - else if (md.m_pVertsF16) - { - vPos = md.m_pVertsF16[k].ToVec3(); - } - else - { - continue; - } - vPos = tm.TransformPoint(vPos); - Vec3 vBoxSize = GetCubeSize(dc.view, vPos); - if (!m_bHit || !m_vHitVertex.IsEquivalent(vPos, 0.001f)) - { - dc.DrawSolidBox(vPos - vBoxSize, vPos + vBoxSize); - } - } - } - - for (int i = 0, iSubStatObjNum(pStatObj->GetSubObjectCount()); i < iSubStatObjNum; ++i) - { - IStatObj::SSubObject* pSubObj = pStatObj->GetSubObject(i); - if (pSubObj) - { - DrawVertexCubes(dc, tm * pSubObj->localTM, pSubObj->pStatObj); - } - } -} - -CKDTree* CVertexSnappingModeTool::GetKDTree(CBaseObject* pObject) -{ - auto existingTree = m_ObjectKdTreeMap.find(pObject); - if (existingTree != m_ObjectKdTreeMap.end()) - { - return existingTree->second; - } - - // Don't build a kd-tree for objects without verts - CKDTree* pTree = nullptr; - if (auto pStatObj = pObject->GetIStatObj()) - { - pTree = new CKDTree(); - pTree->Build(pObject->GetIStatObj()); - } - - m_ObjectKdTreeMap[pObject] = pTree; - return pTree; -} - -#include diff --git a/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.h b/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.h deleted file mode 100644 index 943f6bceb4..0000000000 --- a/Code/Sandbox/Editor/EditMode/VertexSnappingModeTool.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_EDITMODE_VERTEXSNAPPINGMODETOOL_H -#define CRYINCLUDE_EDITOR_EDITMODE_VERTEXSNAPPINGMODETOOL_H -#pragma once - -#include "EditTool.h" -#include "Objects/BaseObject.h" - -class CKDTree; -struct IDisplayViewport; - -class CVertexSnappingModeTool - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE CVertexSnappingModeTool(); - ~CVertexSnappingModeTool(); - - static const GUID& GetClassID(); - - static void RegisterTool(CRegistrationContext& rc); - - void Display(DisplayContext& dc); - bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - -protected: - - void DrawVertexCubes(DisplayContext& dc, const Matrix34& tm, IStatObj* pStatObj); - void DeleteThis(){ delete this; } - Vec3 GetCubeSize(IDisplayViewport* pView, const Vec3& pos) const; - -private: - - using CEditTool::HitTest; - bool HitTest(CViewport* view, const QPoint& point, CBaseObject* pExcludedObj, Vec3& outHitPos, CBaseObjectPtr& pOutHitObject, std::vector& outObjects); - CKDTree* GetKDTree(CBaseObject* pObject); - - enum EVertexSnappingStatus - { - eVSS_SelectFirstVertex, - eVSS_MoveSelectVertexToAnotherVertex - }; - EVertexSnappingStatus m_modeStatus; - - struct SSelectionInfo - { - SSelectionInfo() - { - m_pObject = NULL; - m_vPos = Vec3(0, 0, 0); - } - CBaseObjectPtr m_pObject; - Vec3 m_vPos; - }; - - /// Info on object being moved (when in eVSS_MoveSelectVertexToAnotherVertex mode). - SSelectionInfo m_SelectionInfo; - - /// Objects that mouse is over - std::vector m_Objects; - - /// Position of vertex that mouse is hitting. - /// Invalid when m_bHit is false. - Vec3 m_vHitVertex; - - /// Whether the mouse hit test succeeded - bool m_bHit; - - /// Object that mouse is hitting - CBaseObjectPtr m_pHitObject; - - /// Boxes to render for debug drawing - std::vector m_DebugBoxes; - - /// For each object, a tree containing its vertices. - std::map m_ObjectKdTreeMap; -}; -#endif // CRYINCLUDE_EDITOR_EDITMODE_VERTEXSNAPPINGMODETOOL_H diff --git a/Code/Sandbox/Editor/EditTool.cpp b/Code/Sandbox/Editor/EditTool.cpp deleted file mode 100644 index 31a59aa58f..0000000000 --- a/Code/Sandbox/Editor/EditTool.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "EditTool.h" - -// Editor -#include "Include/IObjectManager.h" -#include "Objects/SelectionGroup.h" - -////////////////////////////////////////////////////////////////////////// -// Class description. -////////////////////////////////////////////////////////////////////////// -class CEditTool_ClassDesc - : public CRefCountClassDesc -{ - virtual ESystemClassID SystemClassID() { return ESYSTEM_CLASS_EDITTOOL; } - virtual REFGUID ClassID() - { - // {0A43AB8E-B1AE-44aa-93B1-229F73D58CA4} - static const GUID guid = { - 0xa43ab8e, 0xb1ae, 0x44aa, { 0x93, 0xb1, 0x22, 0x9f, 0x73, 0xd5, 0x8c, 0xa4 } - }; - return guid; - } - virtual QString ClassName() { return "EditTool.Default"; }; - virtual QString Category() { return "EditTool"; }; -}; -CEditTool_ClassDesc g_stdClassDesc; - -////////////////////////////////////////////////////////////////////////// -CEditTool::CEditTool(QObject* parent) - : QObject(parent) -{ - m_pClassDesc = &g_stdClassDesc; - m_nRefCount = 0; -}; - -////////////////////////////////////////////////////////////////////////// -void CEditTool::SetParentTool(CEditTool* pTool) -{ - m_pParentTool = pTool; -} - -////////////////////////////////////////////////////////////////////////// -CEditTool* CEditTool::GetParentTool() -{ - return m_pParentTool; -} - -////////////////////////////////////////////////////////////////////////// -void CEditTool::Abort() -{ - if (m_pParentTool) - { - GetIEditor()->SetEditTool(m_pParentTool); - } - else - { - GetIEditor()->SetEditTool(0); - } -} - -////////////////////////////////////////////////////////////////////////// -void CEditTool::GetAffectedObjects(DynArray& outAffectedObjects) -{ - CSelectionGroup* pSelection = GetIEditor()->GetObjectManager()->GetSelection(); - if (pSelection == NULL) - { - return; - } - for (int i = 0, iCount(pSelection->GetCount()); i < iCount; ++i) - { - outAffectedObjects.push_back(pSelection->GetObject(i)); - } -} - -#include diff --git a/Code/Sandbox/Editor/EditTool.h b/Code/Sandbox/Editor/EditTool.h deleted file mode 100644 index b9d937ae0d..0000000000 --- a/Code/Sandbox/Editor/EditTool.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_EDITTOOL_H -#define CRYINCLUDE_EDITOR_EDITTOOL_H - -#pragma once - -#if !defined(Q_MOC_RUN) -#include "QtViewPaneManager.h" -#endif - -class CViewport; -struct IClassDesc; -struct ITransformManipulator; -struct HitContext; - -enum EEditToolType -{ - EDIT_TOOL_TYPE_PRIMARY, - EDIT_TOOL_TYPE_SECONDARY, -}; - -/*! - * CEditTool is an abstract base class for All Editing Tools supported by Editor. - * Edit tools handle specific editing modes in viewports. - */ -class SANDBOX_API CEditTool - : public QObject -{ - Q_OBJECT -public: - explicit CEditTool(QObject* parent = nullptr); - - ////////////////////////////////////////////////////////////////////////// - // For reference counting. - ////////////////////////////////////////////////////////////////////////// - void AddRef() { m_nRefCount++; }; - void Release() - { - AZ_Assert(m_nRefCount > 0, "Negative ref count"); - if (--m_nRefCount == 0) - { - DeleteThis(); - } - }; - - //! Returns class description for this tool. - IClassDesc* GetClassDesc() const { return m_pClassDesc; } - - virtual void SetParentTool(CEditTool* pTool); - virtual CEditTool* GetParentTool(); - - virtual EEditToolType GetType() { return EDIT_TOOL_TYPE_PRIMARY; } - virtual EOperationMode GetMode() { return eOperationModeNone; } - - // Abort tool. - virtual void Abort(); - - // Accept tool. - virtual void Accept([[maybe_unused]] bool resetPosition = false) {} - - //! Status text displayed when this tool is active. - void SetStatusText(const QString& text) { m_statusText = text; }; - QString GetStatusText() { return m_statusText; }; - - // Description: - // Activates tool. - // Arguments: - // pPreviousTool - Previously active edit tool. - // Return: - // True if the tool can be activated, - virtual bool Activate([[maybe_unused]] CEditTool* pPreviousTool) { return true; }; - - //! Used to pass user defined data to edit tool from ToolButton. - virtual void SetUserData([[maybe_unused]] const char* key, [[maybe_unused]] void* userData) {}; - - //! Called when user starts using this tool. - //! Flags is comnination of ObjectEditFlags flags. - virtual void BeginEditParams([[maybe_unused]] IEditor* ie, [[maybe_unused]] int flags) {}; - //! Called when user ends using this tool. - virtual void EndEditParams() {}; - - // Called each frame to display tool for given viewport. - virtual void Display(struct DisplayContext& dc) = 0; - - //! Mouse callback sent from viewport. - //! Returns true if event processed by callback, and all other processing for this event should abort. - //! Return false if event was not processed by callback, and other processing for this event should occur. - //! @param view Viewport that sent this callback. - //! @param event Indicate what kind of event occured in viewport. - //! @param point 2D coordinate in viewport where event occured. - //! @param flags Additional flags (MK_LBUTTON,etc..) or from (MouseEventFlags) specified by viewport when calling callback. - virtual bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) = 0; - - //! Called when key in viewport is pressed while using this tool. - //! Returns true if event processed by callback, and all other processing for this event should abort. - //! Returns false if event was not processed by callback, and other processing for this event should occur. - //! @param view Viewport where key was pressed. - //! @param nChar Specifies the virtual key code of the given key. For a list of standard virtual key codes, see Winuser.h - //! @param nRepCnt Specifies the repeat count, that is, the number of times the keystroke is repeated as a result of the user holding down the key. - //! @param nFlags Specifies the scan code, key-transition code, previous key state, and context code, (see WM_KEYDOWN) - virtual bool OnKeyDown([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) { return false; }; - - //! Called when key in viewport is released while using this tool. - //! Returns true if event processed by callback, and all other processing for this event should abort. - //! Returns false if event was not processed by callback, and other processing for this event should occur. - //! @param view Viewport where key was pressed. - //! @param nChar Specifies the virtual key code of the given key. For a list of standard virtual key codes, see Winuser.h - //! @param nRepCnt Specifies the repeat count, that is, the number of times the keystroke is repeated as a result of the user holding down the key. - //! @param nFlags Specifies the scan code, key-transition code, previous key state, and context code, (see WM_KEYDOWN) - virtual bool OnKeyUp([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) { return false; }; - - //! Called when mouse is moved and give oportunity to tool to set it own cursor. - //! @return true if cursor changed. or false otherwise. - virtual bool OnSetCursor([[maybe_unused]] CViewport* vp) { return false; }; - - // Return objects affected by this edit tool. The returned objects usually will be the selected objects. - virtual void GetAffectedObjects(DynArray& outAffectedObjects); - - // Called in response to the dragging of the manipulator in the view. - // Allow edit tool to handle manipulator dragging the way it wants. - virtual void OnManipulatorDrag([[maybe_unused]] CViewport* view, [[maybe_unused]] ITransformManipulator* pManipulator, [[maybe_unused]] QPoint& p0, [[maybe_unused]] QPoint& p1, [[maybe_unused]] const Vec3& value) {} - - virtual void OnManipulatorDrag(CViewport* view, ITransformManipulator* pManipulator, const Vec3& value) - { - // Overload with less boiler-plate - QPoint p0, p1; - OnManipulatorDrag(view, pManipulator, p0, p1, value); - } - - // Called in response to mouse event of the manipulator in the view - virtual void OnManipulatorMouseEvent([[maybe_unused]] CViewport* view, [[maybe_unused]] ITransformManipulator* pManipulator, [[maybe_unused]] EMouseEvent event, [[maybe_unused]] QPoint& point, [[maybe_unused]] int flags, [[maybe_unused]] bool bHitGizmo = false) {} - - virtual bool IsNeedMoveTool() { return false; } - virtual bool IsNeedSpecificBehaviorForSpaceAcce() { return false; } - virtual bool IsNeedToSkipPivotBoxForObjects() { return false; } - virtual bool IsDisplayGrid() { return true; } - virtual bool IsUpdateUIPanel() { return false; } - virtual bool IsMoveToObjectModeAfterEnd() { return true; } - virtual bool IsCircleTypeRotateGizmo() { return false; } - - // Draws object specific helpers for this tool - virtual void DrawObjectHelpers([[maybe_unused]] CBaseObject* pObject, [[maybe_unused]] DisplayContext& dc) {} - - // Hit test against edit tool - virtual bool HitTest([[maybe_unused]] CBaseObject* pObject, [[maybe_unused]] HitContext& hc) { return false; } - -protected: - virtual ~CEditTool() {}; - ////////////////////////////////////////////////////////////////////////// - // Delete edit tool. - ////////////////////////////////////////////////////////////////////////// - virtual void DeleteThis() = 0; - -protected: - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - _smart_ptr m_pParentTool; // Pointer to parent edit tool. - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - QString m_statusText; - IClassDesc* m_pClassDesc; - int m_nRefCount; -}; - -#endif // CRYINCLUDE_EDITOR_EDITTOOL_H diff --git a/Code/Sandbox/Editor/EditorCryEdit.rc b/Code/Sandbox/Editor/EditorCryEdit.rc index 76d5d53476..81388d230a 100644 --- a/Code/Sandbox/Editor/EditorCryEdit.rc +++ b/Code/Sandbox/Editor/EditorCryEdit.rc @@ -1 +1 @@ -IDI_ICON1 ICON DISCARDABLE "res\\o3de_editor.ico" \ No newline at end of file +IDI_ICON1 ICON DISCARDABLE "res\\o3de_editor.ico" diff --git a/Code/Sandbox/Editor/EditorPreferencesDialog.h b/Code/Sandbox/Editor/EditorPreferencesDialog.h index fa69a4ebe6..b3e29c5c7b 100644 --- a/Code/Sandbox/Editor/EditorPreferencesDialog.h +++ b/Code/Sandbox/Editor/EditorPreferencesDialog.h @@ -73,4 +73,4 @@ private: QPixmap m_unSelectedPixmap; EditorPreferencesTreeWidgetItem* m_currentPageItem; QString m_filter; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Editor/EditorPreferencesPageGeneral.cpp b/Code/Sandbox/Editor/EditorPreferencesPageGeneral.cpp index b10d564031..a7420b79a4 100644 --- a/Code/Sandbox/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Sandbox/Editor/EditorPreferencesPageGeneral.cpp @@ -63,11 +63,6 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("DeepSelectionRange", &DeepSelection::m_deepSelectionRange) ->Field("StickDuplicate", &DeepSelection::m_stickDuplicate); - serialize.Class() - ->Version(1) - ->Field("VertexCubeSize", &VertexSnapping::m_vertexCubeSize) - ->Field("RenderPenetratedBoundBox", &VertexSnapping::m_bRenderPenetratedBoundBox); - serialize.Class() ->Version(1) ->Field("DynamicByDefault", &SliceSettings::m_slicesDynamicByDefault); @@ -78,7 +73,6 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("Messaging", &CEditorPreferencesPage_General::m_messaging) ->Field("Undo", &CEditorPreferencesPage_General::m_undo) ->Field("Deep Selection", &CEditorPreferencesPage_General::m_deepSelection) - ->Field("Vertex Snapping", &CEditorPreferencesPage_General::m_vertexSnapping) ->Field("Slice Settings", &CEditorPreferencesPage_General::m_sliceSettings); @@ -119,12 +113,6 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Attribute(AZ::Edit::Attributes::Min, 0.0f) ->Attribute(AZ::Edit::Attributes::Max, 1000.0f); - editContext->Class("Vertex Snapping", "") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &VertexSnapping::m_vertexCubeSize, "Vertex Cube Size", "Vertex Cube Size") - ->Attribute(AZ::Edit::Attributes::Min, 0.0001f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &VertexSnapping::m_bRenderPenetratedBoundBox, "Render Penetrated BoundBoxes", "Render Penetrated BoundBoxes"); - editContext->Class("Slices", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &SliceSettings::m_slicesDynamicByDefault, "New Slices Dynamic By Default", "When creating slices, they will be set to dynamic by default"); @@ -135,7 +123,6 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_vertexSnapping, "Vertex Snapping", "Vertex Snapping") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_sliceSettings, "Slices", "Slice Settings"); } } @@ -189,10 +176,6 @@ void CEditorPreferencesPage_General::OnApply() gSettings.deepSelectionSettings.fRange = m_deepSelection.m_deepSelectionRange; gSettings.deepSelectionSettings.bStickDuplicate = m_deepSelection.m_stickDuplicate; - //vertex snapping - gSettings.vertexSnappingSettings.vertexCubeSize = m_vertexSnapping.m_vertexCubeSize; - gSettings.vertexSnappingSettings.bRenderPenetratedBoundBox = m_vertexSnapping.m_bRenderPenetratedBoundBox; - //slices gSettings.sliceSettings.dynamicByDefault = m_sliceSettings.m_slicesDynamicByDefault; @@ -236,10 +219,6 @@ void CEditorPreferencesPage_General::InitializeSettings() m_deepSelection.m_deepSelectionRange = gSettings.deepSelectionSettings.fRange; m_deepSelection.m_stickDuplicate = gSettings.deepSelectionSettings.bStickDuplicate; - //vertex snapping - m_vertexSnapping.m_vertexCubeSize = gSettings.vertexSnappingSettings.vertexCubeSize; - m_vertexSnapping.m_bRenderPenetratedBoundBox = gSettings.vertexSnappingSettings.bRenderPenetratedBoundBox; - //slices m_sliceSettings.m_slicesDynamicByDefault = gSettings.sliceSettings.dynamicByDefault; } diff --git a/Code/Sandbox/Editor/EditorPreferencesPageGeneral.h b/Code/Sandbox/Editor/EditorPreferencesPageGeneral.h index d996f410a7..31776e9c10 100644 --- a/Code/Sandbox/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Sandbox/Editor/EditorPreferencesPageGeneral.h @@ -88,14 +88,6 @@ private: bool m_stickDuplicate; }; - struct VertexSnapping - { - AZ_TYPE_INFO(VertexSnapping, "{20F16350-990C-4096-86E3-40D56DDDD702}") - - float m_vertexCubeSize; - bool m_bRenderPenetratedBoundBox; - }; - struct SliceSettings { AZ_TYPE_INFO(SliceSettings, "{8505CCC1-874C-4389-B51A-B9E5FF70CFDA}") @@ -107,7 +99,6 @@ private: Messaging m_messaging; Undo m_undo; DeepSelection m_deepSelection; - VertexSnapping m_vertexSnapping; SliceSettings m_sliceSettings; QIcon m_icon; }; diff --git a/Code/Sandbox/Editor/EditorViewportWidget.cpp b/Code/Sandbox/Editor/EditorViewportWidget.cpp index 695a0fa5f1..9ce567c91e 100644 --- a/Code/Sandbox/Editor/EditorViewportWidget.cpp +++ b/Code/Sandbox/Editor/EditorViewportWidget.cpp @@ -65,7 +65,6 @@ #include "Util/fastlib.h" #include "CryEditDoc.h" #include "GameEngine.h" -#include "EditTool.h" #include "ViewManager.h" #include "Objects/DisplayContext.h" #include "DisplaySettings.h" @@ -233,7 +232,6 @@ int EditorViewportWidget::OnCreate() { m_renderer = GetIEditor()->GetRenderer(); m_engine = GetIEditor()->Get3DEngine(); - assert(m_engine); CreateRenderContext(); @@ -276,9 +274,6 @@ void EditorViewportWidget::paintEvent([[maybe_unused]] QPaintEvent* event) if ((ge && ge->IsLevelLoaded()) || (GetType() != ET_ViewportCamera)) { setRenderOverlayVisible(true); - m_isOnPaint = true; - Update(); - m_isOnPaint = false; } else { @@ -682,6 +677,11 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) } SetCurrentCursor(STD_CURSOR_GAME); } + + if (m_renderViewport) + { + m_renderViewport->GetControllerList()->SetEnabled(false); + } } break; @@ -700,6 +700,11 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) RestoreViewportAfterGameMode(); } + + if (m_renderViewport) + { + m_renderViewport->GetControllerList()->SetEnabled(true); + } break; case eNotify_OnCloseScene: @@ -730,6 +735,8 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) // meters above the terrain (default terrain height is 32) viewTM.SetTranslation(Vec3(sx * 0.5f, sy * 0.5f, 34.0f)); SetViewTM(viewTM); + + UpdateScene(); } break; @@ -785,8 +792,14 @@ void EditorViewportWidget::OnRender() // This is necessary so that automated editor tests using the null renderer to test systems like dynamic vegetation // are still able to manipulate the current logical camera position, even if nothing is rendered. GetIEditor()->GetSystem()->SetViewCamera(m_Camera); - GetIEditor()->GetRenderer()->SetCamera(gEnv->pSystem->GetViewCamera()); - m_engine->RenderWorld(0, SRenderingPassInfo::CreateGeneralPassRenderingInfo(m_Camera), __FUNCTION__); + if (GetIEditor()->GetRenderer()) + { + GetIEditor()->GetRenderer()->SetCamera(gEnv->pSystem->GetViewCamera()); + } + if (m_engine) + { + m_engine->RenderWorld(0, SRenderingPassInfo::CreateGeneralPassRenderingInfo(m_Camera), __FUNCTION__); + } return; } @@ -809,6 +822,10 @@ void EditorViewportWidget::OnBeginPrepareRender() return; } + m_isOnPaint = true; + Update(); + m_isOnPaint = false; + float fNearZ = GetIEditor()->GetConsoleVar("cl_DefaultNearPlane"); float fFarZ = m_Camera.GetFarPlane(); @@ -874,12 +891,16 @@ void EditorViewportWidget::OnBeginPrepareRender() fov = 2 * atanf((h * tan(fov / 2)) / maxTargetHeight); } } - - m_Camera.SetFrustum(w, h, fov, fNearZ, gEnv->p3DEngine->GetMaxViewDistance()); + m_Camera.SetFrustum(w, h, fov, fNearZ); } GetIEditor()->GetSystem()->SetViewCamera(m_Camera); + if (GetIEditor()->IsInGameMode()) + { + return; + } + PreWidgetRendering(); RenderAll(); @@ -905,11 +926,6 @@ void EditorViewportWidget::OnBeginPrepareRender() m_debugDisplay->DepthTestOn(); PostWidgetRendering(); - - if (!m_renderer->IsStereoEnabled()) - { - GetIEditor()->GetSystem()->RenderStatistics(); - } } ////////////////////////////////////////////////////////////////////////// @@ -1206,13 +1222,18 @@ void EditorViewportWidget::SetViewportId(int id) CViewport::SetViewportId(id); // Now that we have an ID, we can initialize our viewport. - m_renderViewport = new AtomToolsFramework::RenderViewportWidget(id, this); - m_defaultViewportContextName = m_renderViewport->GetViewportContext()->GetName(); + m_renderViewport = new AtomToolsFramework::RenderViewportWidget(this, false); + if (!m_renderViewport->InitializeViewportContext(id)) + { + AZ_Warning("EditorViewportWidget", false, "Failed to initialize RenderViewportWidget's ViewportContext"); + return; + } + auto viewportContext = m_renderViewport->GetViewportContext(); + m_defaultViewportContextName = viewportContext->GetName(); QBoxLayout* layout = new QBoxLayout(QBoxLayout::Direction::TopToBottom, this); layout->setContentsMargins(QMargins()); layout->addWidget(m_renderViewport); - auto viewportContext = m_renderViewport->GetViewportContext(); viewportContext->ConnectViewMatrixChangedHandler(m_cameraViewMatrixChangeHandler); viewportContext->ConnectProjectionMatrixChangedHandler(m_cameraProjectionMatrixChangeHandler); @@ -2407,7 +2428,10 @@ void EditorViewportWidget::SetDefaultCamera() return; } ResetToViewSourceType(ViewSourceType::None); - gEnv->p3DEngine->GetPostEffectBaseGroup()->SetParam("Dof_Active", 0.0f); + if (gEnv->p3DEngine) + { + gEnv->p3DEngine->GetPostEffectBaseGroup()->SetParam("Dof_Active", 0.0f); + } GetViewManager()->SetCameraObjectId(m_cameraObjectId); SetName(m_defaultViewName); SetViewTM(m_defaultViewTM); @@ -2590,8 +2614,7 @@ bool EditorViewportWidget::GetActiveCameraPosition(AZ::Vector3& cameraPos) { if (GetIEditor()->IsInGameMode()) { - const Vec3 camPos = m_engine->GetRenderingCamera().GetPosition(); - cameraPos = LYVec3ToAZVec3(camPos); + cameraPos = m_renderViewport->GetViewportContext()->GetCameraTransform().GetTranslation(); } else { diff --git a/Code/Sandbox/Editor/Export/ExportManager.cpp b/Code/Sandbox/Editor/Export/ExportManager.cpp index bf5c3aa469..b41872595a 100644 --- a/Code/Sandbox/Editor/Export/ExportManager.cpp +++ b/Code/Sandbox/Editor/Export/ExportManager.cpp @@ -65,7 +65,7 @@ namespace const float kTangentDelta = 0.01f; const float kAspectRatio = 1.777778f; const int kReserveCount = 7; // x,y,z,rot_x,rot_y,rot_z,fov - const QString kMasterCameraName = "MasterCamera"; + const QString kPrimaryCameraName = "PrimaryCamera"; } // namespace @@ -169,10 +169,10 @@ CExportManager::CExportManager() , m_numberOfExportFrames(0) , m_pivotEntityObject(0) , m_bBakedKeysSequenceExport(true) - , m_animTimeExportMasterSequenceCurrentTime(0.0f) + , m_animTimeExportPrimarySequenceCurrentTime(0.0f) , m_animKeyTimeExport(true) , m_soundKeyTimeExport(true) - , m_bExportOnlyMasterCamera(false) + , m_bExportOnlyPrimaryCamera(false) { RegisterExporter(new COBJExporter()); RegisterExporter(new COCMExporter()); @@ -773,14 +773,14 @@ bool CExportManager::ShowFBXExportDialog() return false; } - SetFBXExportSettings(fpsDialog.GetExportCoordsLocalToTheSelectedObject(), fpsDialog.GetExportOnlyMasterCamera(), fpsDialog.GetFPS()); + SetFBXExportSettings(fpsDialog.GetExportCoordsLocalToTheSelectedObject(), fpsDialog.GetExportOnlyPrimaryCamera(), fpsDialog.GetFPS()); return true; } bool CExportManager::ProcessObjectsForExport() { - Export::CObject* pObj = new Export::CObject(kMasterCameraName.toUtf8().data()); + Export::CObject* pObj = new Export::CObject(kPrimaryCameraName.toUtf8().data()); pObj->entityType = Export::eCamera; m_data.m_objects.push_back(pObj); @@ -808,13 +808,13 @@ bool CExportManager::ProcessObjectsForExport() Export::CObject* pObj2 = m_data.m_objects[objectID]; CBaseObject* pObject = 0; - if (QString::compare(pObj2->name, kMasterCameraName) == 0) + if (QString::compare(pObj2->name, kPrimaryCameraName) == 0) { pObject = GetIEditor()->GetObjectManager()->FindObject(GetIEditor()->GetViewManager()->GetCameraObjectId()); } else { - if (m_bExportOnlyMasterCamera && pObj2->entityType != Export::eCameraTarget) + if (m_bExportOnlyPrimaryCamera && pObj2->entityType != Export::eCameraTarget) { continue; } @@ -952,7 +952,7 @@ void CExportManager::FillAnimTimeNode(XmlNodeRef writeNode, CTrackViewAnimNode* if (numAllTracks > 0) { XmlNodeRef objNode = writeNode->createNode(CleanXMLText(pObjectNode->GetName()).toUtf8().data()); - writeNode->setAttr("time", m_animTimeExportMasterSequenceCurrentTime); + writeNode->setAttr("time", m_animTimeExportPrimarySequenceCurrentTime); for (unsigned int trackID = 0; trackID < numAllTracks; ++trackID) { @@ -1020,7 +1020,7 @@ void CExportManager::FillAnimTimeNode(XmlNodeRef writeNode, CTrackViewAnimNode* XmlNodeRef keyNode = subNode->createNode(keyContentName.toUtf8().data()); - float keyGlobalTime = m_animTimeExportMasterSequenceCurrentTime + keyTime; + float keyGlobalTime = m_animTimeExportPrimarySequenceCurrentTime + keyTime; keyNode->setAttr("keyTime", keyGlobalTime); if (keyStartTime > 0) @@ -1123,13 +1123,13 @@ bool CExportManager::AddObjectsFromSequence(CTrackViewSequence* pSequence, XmlNo const QString sequenceName = pSubSequence->GetName(); XmlNodeRef subSeqNode2 = seqNode->createNode(sequenceName.toUtf8().data()); - if (sequenceName == m_animTimeExportMasterSequenceName) + if (sequenceName == m_animTimeExportPrimarySequenceName) { - m_animTimeExportMasterSequenceCurrentTime = sequenceKey.time; + m_animTimeExportPrimarySequenceCurrentTime = sequenceKey.time; } else { - m_animTimeExportMasterSequenceCurrentTime += sequenceKey.time; + m_animTimeExportPrimarySequenceCurrentTime += sequenceKey.time; } AddObjectsFromSequence(pSubSequence, subSeqNode2); @@ -1336,7 +1336,7 @@ bool CExportManager::Export(const char* defaultName, const char* defaultExt, con { m_numberOfExportFrames = pSequence->GetTimeRange().end * m_FBXBakedExportFPS; - if (!m_bExportOnlyMasterCamera) + if (!m_bExportOnlyPrimaryCamera) { AddObjectsFromSequence(pSequence); } @@ -1365,10 +1365,10 @@ bool CExportManager::Export(const char* defaultName, const char* defaultExt, con return returnRes; } -void CExportManager::SetFBXExportSettings(bool bLocalCoordsToSelectedObject, bool bExportOnlyMasterCamera, const float fps) +void CExportManager::SetFBXExportSettings(bool bLocalCoordsToSelectedObject, bool bExportOnlyPrimaryCamera, const float fps) { m_bExportLocalCoords = bLocalCoordsToSelectedObject; - m_bExportOnlyMasterCamera = bExportOnlyMasterCamera; + m_bExportOnlyPrimaryCamera = bExportOnlyPrimaryCamera; m_FBXBakedExportFPS = fps; } @@ -1439,10 +1439,10 @@ void CExportManager::SaveNodeKeysTimeToXML() if (dlg.exec()) { m_animTimeNode = XmlHelpers::CreateXmlNode(pSequence->GetName()); - m_animTimeExportMasterSequenceName = pSequence->GetName(); + m_animTimeExportPrimarySequenceName = pSequence->GetName(); m_data.Clear(); - m_animTimeExportMasterSequenceCurrentTime = 0.0; + m_animTimeExportPrimarySequenceCurrentTime = 0.0; AddObjectsFromSequence(pSequence, m_animTimeNode); diff --git a/Code/Sandbox/Editor/Export/ExportManager.h b/Code/Sandbox/Editor/Export/ExportManager.h index d8edf1d3b1..8904ef08ed 100644 --- a/Code/Sandbox/Editor/Export/ExportManager.h +++ b/Code/Sandbox/Editor/Export/ExportManager.h @@ -171,7 +171,7 @@ private: bool AddObjectsFromSequence(CTrackViewSequence* pSequence, XmlNodeRef seqNode = 0); bool IsDuplicateObjectBeingAdded(const QString& newObject); - void SetFBXExportSettings(bool bLocalCoordsToSelectedObject, bool bExportOnlyMasterCamera, const float fps); + void SetFBXExportSettings(bool bLocalCoordsToSelectedObject, bool bExportOnlyPrimaryCamera, const float fps); bool ProcessObjectsForExport(); bool ShowFBXExportDialog(); @@ -193,13 +193,13 @@ private: float m_FBXBakedExportFPS; bool m_bExportLocalCoords; - bool m_bExportOnlyMasterCamera; + bool m_bExportOnlyPrimaryCamera; int m_numberOfExportFrames; CEntityObject* m_pivotEntityObject; bool m_bBakedKeysSequenceExport; - QString m_animTimeExportMasterSequenceName; - float m_animTimeExportMasterSequenceCurrentTime; + QString m_animTimeExportPrimarySequenceName; + float m_animTimeExportPrimarySequenceCurrentTime; XmlNodeRef m_animTimeNode; bool m_animKeyTimeExport; diff --git a/Code/Sandbox/Editor/FBXExporterDialog.cpp b/Code/Sandbox/Editor/FBXExporterDialog.cpp index 7638680b10..677e6dcfe7 100644 --- a/Code/Sandbox/Editor/FBXExporterDialog.cpp +++ b/Code/Sandbox/Editor/FBXExporterDialog.cpp @@ -55,9 +55,9 @@ bool CFBXExporterDialog::GetExportCoordsLocalToTheSelectedObject() const return m_ui->m_exportLocalCoordsCheckbox->isChecked(); } -bool CFBXExporterDialog::GetExportOnlyMasterCamera() const +bool CFBXExporterDialog::GetExportOnlyPrimaryCamera() const { - return m_ui->m_exportOnlyMasterCameraCheckBox->isChecked(); + return m_ui->m_exportOnlyPrimaryCameraCheckBox->isChecked(); } void CFBXExporterDialog::SetExportLocalCoordsCheckBoxEnable(bool checked) @@ -100,7 +100,7 @@ int CFBXExporterDialog::exec() if (m_bDisplayOnlyFPSSetting) { m_ui->m_exportLocalCoordsCheckbox->setEnabled(false); - m_ui->m_exportOnlyMasterCameraCheckBox->setEnabled(false); + m_ui->m_exportOnlyPrimaryCameraCheckBox->setEnabled(false); } m_ui->m_fpsCombo->addItem("24"); diff --git a/Code/Sandbox/Editor/FBXExporterDialog.h b/Code/Sandbox/Editor/FBXExporterDialog.h index 9978cb4aca..ffa249ca5b 100644 --- a/Code/Sandbox/Editor/FBXExporterDialog.h +++ b/Code/Sandbox/Editor/FBXExporterDialog.h @@ -36,7 +36,7 @@ public: float GetFPS() const; bool GetExportCoordsLocalToTheSelectedObject() const; - bool GetExportOnlyMasterCamera() const; + bool GetExportOnlyPrimaryCamera() const; void SetExportLocalCoordsCheckBoxEnable(bool checked); int exec() override; @@ -44,7 +44,7 @@ public: protected: void OnFPSChange(); void SetExportLocalToTheSelectedObjectCheckBox(); - void SetExportOnlyMasterCameraCheckBox(); + void SetExportOnlyPrimaryCameraCheckBox(); void accept() override; diff --git a/Code/Sandbox/Editor/FBXExporterDialog.ui b/Code/Sandbox/Editor/FBXExporterDialog.ui index 8c02ce1ca9..6b7b93c342 100644 --- a/Code/Sandbox/Editor/FBXExporterDialog.ui +++ b/Code/Sandbox/Editor/FBXExporterDialog.ui @@ -49,9 +49,9 @@ - + - Export Only Master Camera + Export Only Primary Camera diff --git a/Code/Sandbox/Editor/GameExporter.cpp b/Code/Sandbox/Editor/GameExporter.cpp index 5173071024..8a93dbedce 100644 --- a/Code/Sandbox/Editor/GameExporter.cpp +++ b/Code/Sandbox/Editor/GameExporter.cpp @@ -33,7 +33,6 @@ #include "Util/CryMemFile.h" #include "Objects/ObjectManager.h" -#include "Objects/ObjectPhysicsManager.h" #include "Objects/EntityObject.h" #include "LensFlareEditor/LensFlareManager.h" #include "LensFlareEditor/LensFlareLibrary.h" @@ -125,9 +124,6 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE { QDir::setCurrent(pEditor->GetPrimaryCDFolder()); - // Close all Editor tools - pEditor->SetEditTool(0); - QString sLevelPath = Path::AddSlash(pGameEngine->GetLevelPath()); if (subdirectory && subdirectory[0] && strcmp(subdirectory, ".") != 0) { @@ -142,7 +138,10 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE // Make sure we unload any unused CGFs before exporting so that they don't end up in // the level data. - pEditor->Get3DEngine()->FreeUnusedCGFResources(); + if (pEditor->Get3DEngine()) + { + pEditor->Get3DEngine()->FreeUnusedCGFResources(); + } CCryEditDoc* pDocument = pEditor->GetDocument(); @@ -192,14 +191,6 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE } } - //////////////////////////////////////////////////////////////////////// - // Inform all objects that an export is about to begin - //////////////////////////////////////////////////////////////////////// - if (exportSuccessful) - { - GetIEditor()->GetObjectManager()->GetPhysicsManager()->PrepareForExport(); - } - //////////////////////////////////////////////////////////////////////// // Export all data to the game //////////////////////////////////////////////////////////////////////// @@ -285,7 +276,7 @@ void CGameExporter::ExportVisAreas(const char* pszGamePath, EEndian eExportEndia SHotUpdateInfo exportInfo; I3DEngine* p3DEngine = pEditor->Get3DEngine(); - if (eExportEndian == GetPlatformEndian()) // skip second export, this data is common for PC and consoles + if (p3DEngine && (eExportEndian == GetPlatformEndian())) // skip second export, this data is common for PC and consoles { std::vector* pTempBrushTable = NULL; std::vector<_smart_ptr>* pTempMatsTable = NULL; @@ -370,25 +361,28 @@ void CGameExporter::ExportLevelData(const QString& path, bool bExportMission) QString missionFileName; QString currentMissionFileName; I3DEngine* p3DEngine = pEditor->Get3DEngine(); - for (int i = 0; i < pDocument->GetMissionCount(); i++) + if (p3DEngine) { - CMission* pMission = pDocument->GetMission(i); - - QString name = pMission->GetName(); - name.replace(' ', '_'); - missionFileName = QStringLiteral("Mission_%1.xml").arg(name); - - XmlNodeRef missionDescNode = missionsNode->newChild("Mission"); - missionDescNode->setAttr("Name", pMission->GetName().toUtf8().data()); - missionDescNode->setAttr("File", missionFileName.toUtf8().data()); - missionDescNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); - - int nProgressBarRange = m_numExportedMaterials / 10 + p3DEngine->GetLoadedObjectCount(); - missionDescNode->setAttr("ProgressBarRange", nProgressBarRange); - - if (pMission == pCurrentMission) + for (int i = 0; i < pDocument->GetMissionCount(); i++) { - currentMissionFileName = missionFileName; + CMission* pMission = pDocument->GetMission(i); + + QString name = pMission->GetName(); + name.replace(' ', '_'); + missionFileName = QStringLiteral("Mission_%1.xml").arg(name); + + XmlNodeRef missionDescNode = missionsNode->newChild("Mission"); + missionDescNode->setAttr("Name", pMission->GetName().toUtf8().data()); + missionDescNode->setAttr("File", missionFileName.toUtf8().data()); + missionDescNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + + int nProgressBarRange = m_numExportedMaterials / 10 + p3DEngine->GetLoadedObjectCount(); + missionDescNode->setAttr("ProgressBarRange", nProgressBarRange); + + if (pMission == pCurrentMission) + { + currentMissionFileName = missionFileName; + } } } @@ -416,7 +410,10 @@ void CGameExporter::ExportLevelData(const QString& path, bool bExportMission) XmlNodeRef missionNode = rootAction->createNode("Mission"); pCurrentMission->Export(missionNode, objectsNode); - missionNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + if (p3DEngine) + { + missionNode->setAttr("CGFCount", p3DEngine->GetLoadedObjectCount()); + } //if (!CFileUtil::OverwriteFile( path+currentMissionFileName )) // return; @@ -486,6 +483,11 @@ void CGameExporter::ExportLevelInfo(const QString& path) ////////////////////////////////////////////////////////////////////////// void CGameExporter::ExportMapInfo(XmlNodeRef& node) { + if (!GetIEditor()->Get3DEngine()) + { + return; + } + XmlNodeRef info = node->newChild("LevelInfo"); IEditor* pEditor = GetIEditor(); @@ -508,8 +510,6 @@ void CGameExporter::ExportMapInfo(XmlNodeRef& node) CXmlArchive xmlAr; xmlAr.bLoading = false; xmlAr.root = node; - - GetIEditor()->GetObjectManager()->GetPhysicsManager()->SerializeCollisionClasses(xmlAr); } ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/IEditor.h b/Code/Sandbox/Editor/IEditor.h index 722f2a7c25..90fb8823e7 100644 --- a/Code/Sandbox/Editor/IEditor.h +++ b/Code/Sandbox/Editor/IEditor.h @@ -40,7 +40,6 @@ struct QMetaObject; class CBaseObject; class CCryEditDoc; class CSelectionGroup; -class CEditTool; class CAnimationContext; class CTrackViewSequenceManager; class CGameEngine; @@ -319,17 +318,6 @@ enum EOperationMode eModellingMode // Geometry modeling mode }; -enum EEditMode -{ - eEditModeSelect, - eEditModeSelectArea, - eEditModeMove, - eEditModeRotate, - eEditModeScale, - eEditModeTool, - eEditModeRotateCircle, -}; - //! Mouse events that viewport can send enum EMouseEvent { @@ -620,17 +608,6 @@ struct IEditor virtual void SetOperationMode(EOperationMode mode) = 0; virtual EOperationMode GetOperationMode() = 0; - //! editMode - EEditMode - virtual void SetEditMode(int editMode) = 0; - virtual int GetEditMode() = 0; - //! Assign current edit tool, destroy previously used edit too. - virtual void SetEditTool(CEditTool* tool, bool bStopCurrentTool = true) = 0; - //! Assign current edit tool by class name. - virtual void SetEditTool(const QString& sEditToolName, bool bStopCurrentTool = true) = 0; - //! Reinitializes the current edit tool if one is selected. - virtual void ReinitializeEditTool() = 0; - //! Returns current edit tool. - virtual CEditTool* GetEditTool() = 0; //! Shows/Hides transformation manipulator. //! if bShow is true also returns a valid ITransformManipulator pointer. virtual ITransformManipulator* ShowTransformManipulator(bool bShow) = 0; diff --git a/Code/Sandbox/Editor/IEditorImpl.cpp b/Code/Sandbox/Editor/IEditorImpl.cpp index 399ac45794..561953d729 100644 --- a/Code/Sandbox/Editor/IEditorImpl.cpp +++ b/Code/Sandbox/Editor/IEditorImpl.cpp @@ -54,7 +54,6 @@ AZ_POP_DISABLE_WARNING #include "Export/ExportManager.h" #include "LevelIndependentFileMan.h" #include "Material/MaterialManager.h" -#include "Material/MaterialPickTool.h" #include "TrackView/TrackViewSequenceManager.h" #include "AnimationContext.h" #include "GameEngine.h" @@ -71,13 +70,9 @@ AZ_POP_DISABLE_WARNING #include "Objects/SelectionGroup.h" #include "Objects/ObjectManager.h" -#include "RotateTool.h" -#include "NullEditTool.h" - #include "BackgroundTaskManager.h" #include "BackgroundScheduleManager.h" #include "EditorFileMonitor.h" -#include "EditMode/VertexSnappingModeTool.h" #include "Mission.h" #include "MainStatusBar.h" @@ -149,8 +144,7 @@ namespace const char* CEditorImpl::m_crashLogFileName = "SessionStatus/editor_statuses.json"; CEditorImpl::CEditorImpl() - : m_currEditMode(eEditModeSelect) - , m_operationMode(eOperationModeNone) + : m_operationMode(eOperationModeNone) , m_pSystem(nullptr) , m_pFileUtil(nullptr) , m_pClassFactory(nullptr) @@ -241,18 +235,6 @@ CEditorImpl::CEditorImpl() m_pRuler = new CRuler; m_selectedRegion.min = Vec3(0, 0, 0); m_selectedRegion.max = Vec3(0, 0, 0); - ZeroStruct(m_lastAxis); - m_lastAxis[eEditModeSelect] = AXIS_TERRAIN; - m_lastAxis[eEditModeSelectArea] = AXIS_TERRAIN; - m_lastAxis[eEditModeMove] = AXIS_TERRAIN; - m_lastAxis[eEditModeRotate] = AXIS_Z; - m_lastAxis[eEditModeScale] = AXIS_XY; - ZeroStruct(m_lastCoordSys); - m_lastCoordSys[eEditModeSelect] = COORDS_LOCAL; - m_lastCoordSys[eEditModeSelectArea] = COORDS_LOCAL; - m_lastCoordSys[eEditModeMove] = COORDS_WORLD; - m_lastCoordSys[eEditModeRotate] = COORDS_WORLD; - m_lastCoordSys[eEditModeScale] = COORDS_WORLD; DetectVersion(); RegisterTools(); @@ -262,8 +244,6 @@ CEditorImpl::CEditorImpl() m_pAssetBrowserRequestHandler = nullptr; m_assetEditorRequestsHandler = nullptr; - AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect(); - AZ::IO::SystemFile::CreateDir("SessionStatus"); QFile::setPermissions(m_crashLogFileName, QFileDevice::ReadOther | QFileDevice::WriteOther); } @@ -287,8 +267,6 @@ void CEditorImpl::Initialize() // Activate QT immediately so that its available as soon as CEditorImpl is (and thus GetIEditor()) InitializeEditorCommon(GetIEditor()); - - LoadSettings(); } //The only purpose of that function is to be called at the very begining of the shutdown sequence so that we can instrument and track @@ -303,8 +281,6 @@ void CEditorImpl::OnEarlyExitShutdownSequence() void CEditorImpl::Uninitialize() { - SaveSettings(); - if (m_pSystem) { UninitializeEditorCommonISystem(m_pSystem); @@ -365,8 +341,6 @@ void CEditorImpl::LoadPlugins() CEditorImpl::~CEditorImpl() { - AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect(); - gSettings.Save(); m_bExiting = true; // Can't save level after this point (while Crash) SAFE_RELEASE(m_pSourceControl); @@ -451,12 +425,6 @@ void CEditorImpl::RegisterTools() rc.pCommandManager = m_pCommandManager; rc.pClassFactory = m_pClassFactory; - - CObjectMode::RegisterTool(rc); - CMaterialPickTool::RegisterTool(rc); - CVertexSnappingModeTool::RegisterTool(rc); - CRotateTool::RegisterTool(rc); - NullEditTool::RegisterTool(rc); } void CEditorImpl::ExecuteCommand(const char* sCommand, ...) @@ -661,53 +629,6 @@ IMainStatusBar* CEditorImpl::GetMainStatusBar() return MainWindow::instance()->StatusBar(); } -int CEditorImpl::GetEditMode() -{ - return m_currEditMode; -} - -void CEditorImpl::SetEditMode(int editMode) -{ - bool isEditorInGameMode = false; - EBUS_EVENT_RESULT(isEditorInGameMode, AzToolsFramework::EditorEntityContextRequestBus, IsEditorRunningGame); - - if (isEditorInGameMode) - { - if (editMode != eEditModeSelect) - { - if (SelectionContainsComponentEntities()) - { - return; - } - } - } - - if ((EEditMode)editMode == eEditModeRotate) - { - if (GetEditTool() && GetEditTool()->IsCircleTypeRotateGizmo()) - { - editMode = eEditModeRotateCircle; - } - } - - EEditMode newEditMode = (EEditMode)editMode; - if (m_currEditMode == newEditMode) - { - return; - } - - m_currEditMode = newEditMode; - AABB box(Vec3(0, 0, 0), Vec3(0, 0, 0)); - SetSelectedRegion(box); - - if (GetEditTool() && !GetEditTool()->IsNeedMoveTool()) - { - SetEditTool(0, true); - } - - Notify(eNotify_OnEditModeChange); -} - void CEditorImpl::SetOperationMode(EOperationMode mode) { m_operationMode = mode; @@ -719,139 +640,6 @@ EOperationMode CEditorImpl::GetOperationMode() return m_operationMode; } -bool CEditorImpl::HasCorrectEditTool() const -{ - if (!m_pEditTool) - { - return false; - } - - switch (m_currEditMode) - { - case eEditModeRotate: - return qobject_cast(m_pEditTool) != nullptr; - default: - return qobject_cast(m_pEditTool) != nullptr && qobject_cast(m_pEditTool) == nullptr; - } -} - -CEditTool* CEditorImpl::CreateCorrectEditTool() -{ - if (m_currEditMode == eEditModeRotate) - { - CBaseObject* selectedObj = nullptr; - CSelectionGroup* pSelection = GetIEditor()->GetObjectManager()->GetSelection(); - if (pSelection && pSelection->GetCount() > 0) - { - selectedObj = pSelection->GetObject(0); - } - - return (new CRotateTool(selectedObj)); - } - - return (new CObjectMode); -} - -void CEditorImpl::SetEditTool(CEditTool* tool, bool bStopCurrentTool) -{ - CViewport* pViewport = GetIEditor()->GetActiveView(); - if (pViewport) - { - pViewport->SetCurrentCursor(STD_CURSOR_DEFAULT); - } - - if (!tool) - { - if (HasCorrectEditTool()) - { - return; - } - else - { - tool = CreateCorrectEditTool(); - } - } - - if (!tool->Activate(m_pEditTool)) - { - return; - } - - if (bStopCurrentTool) - { - if (m_pEditTool && m_pEditTool != tool) - { - m_pEditTool->EndEditParams(); - SetStatusText("Ready"); - } - } - - m_pEditTool = tool; - if (m_pEditTool) - { - m_pEditTool->BeginEditParams(this, 0); - } - - Notify(eNotify_OnEditToolChange); -} - -void CEditorImpl::ReinitializeEditTool() -{ - if (m_pEditTool) - { - m_pEditTool->EndEditParams(); - m_pEditTool->BeginEditParams(this, 0); - } -} - -void CEditorImpl::SetEditTool(const QString& sEditToolName, [[maybe_unused]] bool bStopCurrentTool) -{ - CEditTool* pTool = GetEditTool(); - if (pTool && pTool->GetClassDesc()) - { - // Check if already selected. - if (QString::compare(pTool->GetClassDesc()->ClassName(), sEditToolName, Qt::CaseInsensitive) == 0) - { - return; - } - } - - IClassDesc* pClass = GetIEditor()->GetClassFactory()->FindClass(sEditToolName.toUtf8().data()); - if (!pClass) - { - Warning("Editor Tool %s not registered.", sEditToolName.toUtf8().data()); - return; - } - if (pClass->SystemClassID() != ESYSTEM_CLASS_EDITTOOL) - { - Warning("Class name %s is not a valid Edit Tool class.", sEditToolName.toUtf8().data()); - return; - } - - QScopedPointer o(pClass->CreateQObject()); - if (CEditTool* pEditTool = qobject_cast(o.data())) - { - GetIEditor()->SetEditTool(pEditTool); - o.take(); - return; - } - else - { - Warning("Class name %s is not a valid Edit Tool class.", sEditToolName.toUtf8().data()); - return; - } -} - -CEditTool* CEditorImpl::GetEditTool() -{ - if (m_isNewViewportInteractionModelEnabled) - { - return nullptr; - } - - return m_pEditTool; -} - ITransformManipulator* CEditorImpl::ShowTransformManipulator(bool bShow) { if (bShow) @@ -885,7 +673,6 @@ ITransformManipulator* CEditorImpl::GetTransformManipulator() void CEditorImpl::SetAxisConstraints(AxisConstrains axisFlags) { m_selectedAxis = axisFlags; - m_lastAxis[m_currEditMode] = m_selectedAxis; m_pViewManager->SetAxisConstrain(axisFlags); SetTerrainAxisIgnoreObjects(false); @@ -911,7 +698,6 @@ bool CEditorImpl::IsTerrainAxisIgnoreObjects() void CEditorImpl::SetReferenceCoordSys(RefCoordSys refCoords) { m_refCoordsSys = refCoords; - m_lastCoordSys[m_currEditMode] = m_refCoordsSys; // Update all views. UpdateViews(eUpdateObjects, NULL); @@ -2041,60 +1827,6 @@ bool CEditorImpl::IsNewViewportInteractionModelEnabled() const return m_isNewViewportInteractionModelEnabled; } -void CEditorImpl::OnStartPlayInEditor() -{ - if (SelectionContainsComponentEntities()) - { - SetEditMode(eEditModeSelect); - } -} - -namespace -{ - const std::vector> s_editModeNames = { - { eEditModeSelect, QStringLiteral("Select") }, - { eEditModeSelectArea, QStringLiteral("SelectArea") }, - { eEditModeMove, QStringLiteral("Move") }, - { eEditModeRotate, QStringLiteral("Rotate") }, - { eEditModeScale, QStringLiteral("Scale") } - }; -} - -void CEditorImpl::LoadSettings() -{ - QSettings settings(QStringLiteral("Amazon"), QStringLiteral("O3DE")); - - settings.beginGroup(QStringLiteral("Editor")); - settings.beginGroup(QStringLiteral("CoordSys")); - - for (const auto& editMode : s_editModeNames) - { - if (settings.contains(editMode.second)) - { - m_lastCoordSys[editMode.first] = static_cast(settings.value(editMode.second).toInt()); - } - } - - settings.endGroup(); // CoordSys - settings.endGroup(); // Editor -} - -void CEditorImpl::SaveSettings() const -{ - QSettings settings(QStringLiteral("Amazon"), QStringLiteral("O3DE")); - - settings.beginGroup(QStringLiteral("Editor")); - settings.beginGroup(QStringLiteral("CoordSys")); - - for (const auto& editMode : s_editModeNames) - { - settings.setValue(editMode.second, static_cast(m_lastCoordSys[editMode.first])); - } - - settings.endGroup(); // CoordSys - settings.endGroup(); // Editor -} - IEditorPanelUtils* CEditorImpl::GetEditorPanelUtils() { return m_panelEditorUtils; diff --git a/Code/Sandbox/Editor/IEditorImpl.h b/Code/Sandbox/Editor/IEditorImpl.h index 4a8d5fa191..a99fa234b9 100644 --- a/Code/Sandbox/Editor/IEditorImpl.h +++ b/Code/Sandbox/Editor/IEditorImpl.h @@ -23,7 +23,6 @@ #include // for shared_ptr #include #include -#include #include #include @@ -86,13 +85,12 @@ namespace AssetDatabase class CEditorImpl : public IEditor - , protected AzToolsFramework::EditorEntityContextNotificationBus::Handler { Q_DECLARE_TR_FUNCTIONS(CEditorImpl) public: CEditorImpl(); - ~CEditorImpl(); + virtual ~CEditorImpl(); void Initialize(); void OnBeginShutdownSequence(); @@ -226,20 +224,6 @@ public: void SetDataModified(); void SetOperationMode(EOperationMode mode); EOperationMode GetOperationMode(); - void SetEditMode(int editMode); - int GetEditMode(); - - //! A correct tool is one that corresponds to the previously set edit mode. - bool HasCorrectEditTool() const; - - //! Returns the edit tool required for the edit mode specified. - CEditTool* CreateCorrectEditTool(); - - void SetEditTool(CEditTool* tool, bool bStopCurrentTool = true) override; - void SetEditTool(const QString& sEditToolName, bool bStopCurrentTool = true) override; - void ReinitializeEditTool() override; - //! Returns current edit tool. - CEditTool* GetEditTool() override; ITransformManipulator* ShowTransformManipulator(bool bShow); ITransformManipulator* GetTransformManipulator(); @@ -360,23 +344,15 @@ public: protected: - ////////////////////////////////////////////////////////////////////////// - // EditorEntityContextNotificationBus implementation - void OnStartPlayInEditor() override; - ////////////////////////////////////////////////////////////////////////// AZStd::string LoadProjectIdFromProjectData(); void DetectVersion(); void RegisterTools(); void SetPrimaryCDFolder(); - void LoadSettings(); - void SaveSettings() const; - //! List of all notify listeners. std::list m_listeners; - EEditMode m_currEditMode; EOperationMode m_operationMode; ISystem* m_pSystem; IFileUtil* m_pFileUtil; @@ -390,8 +366,6 @@ protected: AABB m_selectedRegion; AxisConstrains m_selectedAxis; RefCoordSys m_refCoordsSys; - AxisConstrains m_lastAxis[16]; - RefCoordSys m_lastCoordSys[16]; bool m_bAxisVectorLock; bool m_bUpdates; bool m_bTerrainAxisIgnoreObjects; @@ -400,7 +374,6 @@ protected: CXmlTemplateRegistry m_templateRegistry; CDisplaySettings* m_pDisplaySettings; CShaderEnum* m_pShaderEnum; - _smart_ptr m_pEditTool; CIconManager* m_pIconManager; std::unique_ptr m_pGizmoParameters; QString m_primaryCDFolder; diff --git a/Code/Sandbox/Editor/Include/IEditorMaterial.h b/Code/Sandbox/Editor/Include/IEditorMaterial.h index eb97fa08ff..25d20546e0 100644 --- a/Code/Sandbox/Editor/Include/IEditorMaterial.h +++ b/Code/Sandbox/Editor/Include/IEditorMaterial.h @@ -25,4 +25,4 @@ struct IEditorMaterial virtual void DisableHighlightForFrame() = 0; }; -#endif \ No newline at end of file +#endif diff --git a/Code/Sandbox/Editor/Include/IObjectManager.h b/Code/Sandbox/Editor/Include/IObjectManager.h index 184a080870..c1c09cf753 100644 --- a/Code/Sandbox/Editor/Include/IObjectManager.h +++ b/Code/Sandbox/Editor/Include/IObjectManager.h @@ -24,7 +24,6 @@ class CUsedResources; class CSelectionGroup; class CObjectClassDesc; class CObjectArchive; -class CObjectPhysicsManager; class CViewport; struct HitContext; enum class ImageRotationDegrees; @@ -188,8 +187,6 @@ public: virtual void SetSelection(const QString& name) = 0; //! Removes one of named selections. virtual void RemoveSelection(const QString& name) = 0; - //! Checks for changes to the current selection and makes adjustments accordingly - virtual void CheckAndFixSelection() = 0; //! Delete all objects in current selection group. virtual void DeleteSelection() = 0; @@ -249,10 +246,6 @@ public: virtual IGizmoManager* GetGizmoManager() = 0; - ////////////////////////////////////////////////////////////////////////// - //! Get acess to object physics manager - virtual CObjectPhysicsManager* GetPhysicsManager() = 0; - ////////////////////////////////////////////////////////////////////////// //! Invalidate visibily settings of objects. virtual void InvalidateVisibleList() = 0; diff --git a/Code/Sandbox/Editor/InfoBar.cpp b/Code/Sandbox/Editor/InfoBar.cpp index 60c24fe84e..e6860c38c8 100644 --- a/Code/Sandbox/Editor/InfoBar.cpp +++ b/Code/Sandbox/Editor/InfoBar.cpp @@ -22,15 +22,15 @@ #include "Include/ITransformManipulator.h" #include "ActionManager.h" #include "Settings.h" -#include "Objects/SelectionGroup.h" #include "Include/IObjectManager.h" #include "MathConversion.h" -#include "EditTool.h" AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING #include AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING +#include + #include #include "CryPhysicsDeprecation.h" @@ -53,12 +53,7 @@ CInfoBar::CInfoBar(QWidget* parent) { ui->setupUi(this); - m_enabledVector = false; - m_bVectorLock = false; - m_prevEditMode = 0; - m_bSelectionLocked = false; m_bSelectionChanged = false; - m_editTool = 0; m_bDragMode = false; m_prevMoveSpeed = 0; m_currValue = Vec3(-111, +222, -333); //this wasn't initialized. I don't know what a good value is @@ -72,25 +67,14 @@ CInfoBar::CInfoBar(QWidget* parent) OnInitDialog(); - connect(ui->m_vectorLock, &QToolButton::clicked, this, &CInfoBar::OnVectorLock); - connect(ui->m_lockSelection, &QToolButton::clicked, this, &CInfoBar::OnLockSelection); - auto comboBoxTextChanged = static_cast(&QComboBox::currentTextChanged); connect(ui->m_moveSpeed, comboBoxTextChanged, this, &CInfoBar::OnUpdateMoveSpeedText); connect(ui->m_moveSpeed->lineEdit(), &QLineEdit::returnPressed, this, &CInfoBar::OnSpeedComboBoxEnter); - connect(ui->m_posCtrl, &AzQtComponents::VectorInput::valueChanged, this, &CInfoBar::OnVectorChanged); - // Hide some buttons from the expander menu - AzQtComponents::Style::addClass(ui->m_posCtrl, "expanderMenu_hide"); AzQtComponents::Style::addClass(ui->m_physDoStepBtn, "expanderMenu_hide"); AzQtComponents::Style::addClass(ui->m_physSingleStepBtn, "expanderMenu_hide"); - // posCtrl is a VectorInput initialized via UI; as such, we can't construct it to have only 3 elements. - // We can just hide the W element as it is unused. - ui->m_posCtrl->getElements()[3]->setVisible(false); - - connect(ui->m_setVector, &QToolButton::clicked, this, &CInfoBar::OnBnClickedSetVector); connect(ui->m_physicsBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedPhysics); connect(ui->m_physSingleStepBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedSingleStepPhys); connect(ui->m_physDoStepBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedDoStepPhys); @@ -101,12 +85,6 @@ CInfoBar::CInfoBar(QWidget* parent) connect(this, &CInfoBar::ActionTriggered, MainWindow::instance()->GetActionManager(), &ActionManager::ActionTriggered); - connect(ui->m_lockSelection, &QAbstractButton::toggled, ui->m_lockSelection, [this](bool checked) { - ui->m_lockSelection->setToolTip(checked ? tr("Unlock Object Selection") : tr("Lock Object Selection")); - }); - connect(ui->m_vectorLock, &QAbstractButton::toggled, ui->m_vectorLock, [this](bool checked) { - ui->m_vectorLock->setToolTip(checked ? tr("Unlock Axis Vectors") : tr("Lock Axis Vectors")); - }); connect(ui->m_physicsBtn, &QAbstractButton::toggled, ui->m_physicsBtn, [this](bool checked) { ui->m_physicsBtn->setToolTip(checked ? tr("Stop Simulation (Ctrl+P)") : tr("Simulate (Ctrl+P)")); }); @@ -123,27 +101,6 @@ CInfoBar::CInfoBar(QWidget* parent) ui->m_vrBtn->setToolTip(checked ? tr("Disable VR Preview") : tr("Enable VR Preview")); }); - // hide old ui elements that are not valid with the new viewport interaction model - if (GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - ui->m_lockSelection->setVisible(false); - AzQtComponents::Style::addClass(ui->m_lockSelection, "expanderMenu_hide"); - ui->m_posCtrl->setVisible(false); - AzQtComponents::Style::addClass(ui->m_posCtrl, "expanderMenu_hide"); - ui->m_setVector->setVisible(false); - AzQtComponents::Style::addClass(ui->m_setVector, "expanderMenu_hide"); - ui->m_vectorLock->setVisible(false); - AzQtComponents::Style::addClass(ui->m_vectorLock, "expanderMenu_hide"); - - // As we're hiding some of the icons, we have an extra spacer to deal with. - // We cannot set the visibility of separators, so we'll have to take it out. - int separatorIndex = layout()->indexOf(ui->verticalSpacer_2); - QLayoutItem* separator = layout()->takeAt(separatorIndex); - - // takeAt() removes the item from the layout; delete to avoid memory leaks. - delete separator; - } - ui->m_moveSpeed->setValidator(new QDoubleValidator(m_minSpeed, m_maxSpeed, m_numDecimals, ui->m_moveSpeed)); // Save off the move speed here since setting up the combo box can cause it to update values in the background. @@ -209,172 +166,6 @@ void CInfoBar::OnEditorNotifyEvent(EEditorNotifyEvent event) { m_bSelectionChanged = true; } - else if (event == eNotify_OnEditModeChange) - { - int emode = GetIEditor()->GetEditMode(); - switch (emode) - { - case eEditModeMove: - ui->m_setVector->setToolTip(tr("Set Position of Selected Objects")); - break; - case eEditModeRotate: - ui->m_setVector->setToolTip(tr("Set Rotation of Selected Objects")); - break; - case eEditModeScale: - ui->m_setVector->setToolTip(tr("Set Scale of Selected Objects")); - break; - default: - ui->m_setVector->setToolTip(tr("Set Position/Rotation/Scale of Selected Objects (None Selected)")); - break; - } - } -} - -////////////////////////////////////////////////////////////////////////// - -void CInfoBar::OnVectorChanged() -{ - SetVector(GetVector()); - OnVectorUpdate(false); -} - -void CInfoBar::OnVectorUpdate(bool followTerrain) -{ - int emode = GetIEditor()->GetEditMode(); - if (emode != eEditModeMove && emode != eEditModeRotate && emode != eEditModeScale) - { - return; - } - - Vec3 v = GetVector(); - - ITransformManipulator* pManipulator = GetIEditor()->GetTransformManipulator(); - if (pManipulator) - { - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - - if (pEditTool) - { - Vec3 diff = v - m_lastValue; - if (emode == eEditModeMove) - { - //GetIEditor()->RestoreUndo(); - pEditTool->OnManipulatorDrag(GetIEditor()->GetActiveView(), pManipulator, diff); - } - if (emode == eEditModeRotate) - { - diff = DEG2RAD(diff); - //GetIEditor()->RestoreUndo(); - pEditTool->OnManipulatorDrag(GetIEditor()->GetActiveView(), pManipulator, diff); - } - if (emode == eEditModeScale) - { - //GetIEditor()->RestoreUndo(); - pEditTool->OnManipulatorDrag(GetIEditor()->GetActiveView(), pManipulator, diff); - } - } - return; - } - - CSelectionGroup* selection = GetIEditor()->GetObjectManager()->GetSelection(); - if (selection->IsEmpty()) - { - return; - } - - GetIEditor()->RestoreUndo(); - - int referenceCoordSys = GetIEditor()->GetReferenceCoordSys(); - - CBaseObject* obj = GetIEditor()->GetSelectedObject(); - - Matrix34 tm; - AffineParts ap; - if (obj) - { - tm = obj->GetWorldTM(); - ap.SpectralDecompose(tm); - } - - if (emode == eEditModeMove) - { - if (obj) - { - if (referenceCoordSys == COORDS_WORLD) - { - tm.SetTranslation(v); - obj->SetWorldTM(tm); - } - else - { - obj->SetPos(v); - } - } - else - { - GetIEditor()->GetSelection()->MoveTo(v, followTerrain ? CSelectionGroup::eMS_FollowTerrain : CSelectionGroup::eMS_None, referenceCoordSys); - } - } - if (emode == eEditModeRotate) - { - if (obj) - { - AZ::Vector3 av = LYVec3ToAZVec3(v); - AZ::Transform tr = AZ::ConvertEulerDegreesToTransform(av); - Matrix34 lyTransform = AZTransformToLYTransform(tr); - - AffineParts newap; - newap.SpectralDecompose(lyTransform); - - if (referenceCoordSys == COORDS_WORLD) - { - tm = Matrix34::Create(ap.scale, newap.rot, ap.pos); - obj->SetWorldTM(tm); - } - else - { - obj->SetRotation(newap.rot); - } - } - else - { - CBaseObject *refObj; - CSelectionGroup* pGroup = GetIEditor()->GetSelection(); - if (pGroup && pGroup->GetCount() > 0) - { - refObj = pGroup->GetObject(0); - AffineParts ap2; - ap2.SpectralDecompose(refObj->GetWorldTM()); - Vec3 oldEulerRotation = AZVec3ToLYVec3(AZ::ConvertQuaternionToEulerDegrees(LYQuaternionToAZQuaternion(ap2.rot))); - Vec3 diff = v - oldEulerRotation; - GetIEditor()->GetSelection()->Rotate((Ang3)diff, referenceCoordSys); - } - } - } - if (emode == eEditModeScale) - { - if (v.x == 0 || v.y == 0 || v.z == 0) - { - return; - } - - if (obj) - { - if (referenceCoordSys == COORDS_WORLD) - { - tm = Matrix34::Create(v, ap.rot, ap.pos); - obj->SetWorldTM(tm); - } - else - { - obj->SetScale(v); - } - } - else - { - GetIEditor()->GetSelection()->SetScale(v, referenceCoordSys); - } - } } void CInfoBar::IdleUpdate() @@ -399,61 +190,31 @@ void CInfoBar::IdleUpdate() Vec3 marker = GetIEditor()->GetMarkerPosition(); - /* - // Get active viewport. - int hx = marker.x / 2; - int hy = marker.y / 2; - if (m_heightMapX != hx || m_heightMapY != hy) + int selectedEntitiesCount = 0; + AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesCount, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntitiesCount); + if (selectedEntitiesCount != m_numSelected) { - m_heightMapX = hx; - m_heightMapY = hy; + m_numSelected = selectedEntitiesCount; updateUI = true; } - */ - - RefCoordSys coordSys = GetIEditor()->GetReferenceCoordSys(); - bool bWorldSpace = GetIEditor()->GetReferenceCoordSys() == COORDS_WORLD; - - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() != m_numSelected) - { - m_numSelected = selection->GetCount(); - updateUI = true; - } - - if (GetIEditor()->GetEditTool() != m_editTool) - { - updateUI = true; - m_editTool = GetIEditor()->GetEditTool(); - } QString str; - if (m_editTool) - { - str = m_editTool->GetStatusText(); - if (str != m_sLastText) - { - updateUI = true; - } - } - if (updateUI) { - if (!m_editTool) + if (m_numSelected == 0) { - if (m_numSelected == 0) - { - str = tr("None Selected"); - } - else if (m_numSelected == 1) - { - str = tr("1 Object Selected"); - } - else - { - str = tr("%1 Objects Selected").arg(m_numSelected); - } + str = tr("None Selected"); } + else if (m_numSelected == 1) + { + str = tr("1 Object Selected"); + } + else + { + str = tr("%1 Objects Selected").arg(m_numSelected); + } + ui->m_statusText->setText(str); m_sLastText = str; } @@ -488,198 +249,11 @@ void CInfoBar::IdleUpdate() } } - bool bSelLocked = GetIEditor()->IsSelectionLocked(); - if (bSelLocked != m_bSelectionLocked) - { - m_bSelectionLocked = bSelLocked; - ui->m_lockSelection->setChecked(m_bSelectionLocked); - } - - - if (GetIEditor()->GetSelection()->IsEmpty()) - { - if (ui->m_lockSelection->isEnabled()) - { - ui->m_lockSelection->setEnabled(false); - } - } - else - { - if (!ui->m_lockSelection->isEnabled()) - { - ui->m_lockSelection->setEnabled(true); - } - } - - ////////////////////////////////////////////////////////////////////////// - // Update vector. - ////////////////////////////////////////////////////////////////////////// - Vec3 v(0, 0, 0); - bool enable = false; - float min = 0, max = 10000; - - int emode = GetIEditor()->GetEditMode(); - ITransformManipulator* pManipulator = GetIEditor()->GetTransformManipulator(); - - if (pManipulator) - { - AffineParts ap; - ap.SpectralDecompose(pManipulator->GetTransformation(coordSys)); - - if (emode == eEditModeMove) - { - v = ap.pos; - enable = true; - - min = -64000; - max = 64000; - } - if (emode == eEditModeRotate) - { - v = Vec3(RAD2DEG(Ang3::GetAnglesXYZ(Matrix33(ap.rot)))); - enable = true; - min = -10000; - max = 10000; - } - if (emode == eEditModeScale) - { - v = ap.scale; - enable = true; - min = -10000; - max = 10000; - } - } - else - { - if (selection->IsEmpty()) - { - // Show marker position. - EnableVector(false); - SetVector(marker); - SetVectorRange(-100000, 100000); - return; - } - - CBaseObject* obj = GetIEditor()->GetSelectedObject(); - if (!obj) - { - CSelectionGroup* pGroup = GetIEditor()->GetSelection(); - if (pGroup && pGroup->GetCount() > 0) - { - obj = pGroup->GetObject(0); - } - } - - if (obj) - { - v = obj->GetWorldPos(); - } - - if (emode == eEditModeMove) - { - if (obj) - { - if (bWorldSpace) - { - v = obj->GetWorldTM().GetTranslation(); - } - else - { - v = obj->GetPos(); - } - } - enable = true; - min = -64000; - max = 64000; - } - if (emode == eEditModeRotate) - { - if (obj) - { - Quat objRot; - if (bWorldSpace) - { - AffineParts ap; - ap.SpectralDecompose(obj->GetWorldTM()); - objRot = ap.rot; - } - else - { - objRot = obj->GetRotation(); - } - - // Always convert objRot to v in order to ensure that the inspector and info bar are always in sync - v = AZVec3ToLYVec3(AZ::ConvertQuaternionToEulerDegrees(LYQuaternionToAZQuaternion(objRot))); - } - enable = true; - min = -10000; - max = 10000; - } - if (emode == eEditModeScale) - { - if (obj) - { - if (bWorldSpace) - { - AffineParts ap; - ap.SpectralDecompose(obj->GetWorldTM()); - v = ap.scale; - } - else - { - v = obj->GetScale(); - } - } - enable = true; - min = -10000; - max = 10000; - } - } - - bool updateDisplayVector = (m_currValue != v); - - // If Edit mode changed. - if (m_prevEditMode != emode) - { - // Scale mode enables vector lock. - SetVectorLock(emode == eEditModeScale); - - // Change undo strings. - QString undoString("Modify Object(s)"); - int mode = GetIEditor()->GetEditMode(); - switch (mode) - { - case eEditModeMove: - undoString = QStringLiteral("Move Object(s)"); - break; - case eEditModeRotate: - undoString = QStringLiteral("Rotate Object(s)"); - break; - case eEditModeScale: - undoString = QStringLiteral("Scale Object(s)"); - break; - } - - // edit mode changed, we must update the number values - updateDisplayVector = true; - } - - SetVectorRange(min, max); - EnableVector(enable); - // if our selection changed, or if our display values are out of date if (m_bSelectionChanged) { - updateDisplayVector = true; m_bSelectionChanged = false; } - - if (updateDisplayVector) - { - SetVector(v); - } - - m_prevEditMode = emode; } inline double Round(double fVal, double fStep) @@ -691,71 +265,6 @@ inline double Round(double fVal, double fStep) return fVal; } -void CInfoBar::SetVector(const Vec3& v) -{ - if (!m_bDragMode) - { - m_lastValue = m_currValue; - } - - if (m_currValue != v) - { - ui->m_posCtrl->setValuebyIndex(v.x, 0); - ui->m_posCtrl->setValuebyIndex(v.y, 1); - ui->m_posCtrl->setValuebyIndex(v.z, 2); - m_currValue = v; - } -} - -Vec3 CInfoBar::GetVector() -{ - Vec3 v; - v.x = ui->m_posCtrl->getElements()[0]->getValue(); - v.y = ui->m_posCtrl->getElements()[1]->getValue(); - v.z = ui->m_posCtrl->getElements()[2]->getValue(); - m_currValue = v; - return v; -} - -void CInfoBar::EnableVector(bool enable) -{ - if (m_enabledVector != enable) - { - m_enabledVector = enable; - ui->m_posCtrl->setEnabled(enable); - ui->m_vectorLock->setEnabled(enable); - ui->m_setVector->setEnabled(enable); - } -} - -void CInfoBar::SetVectorLock(bool bVectorLock) -{ - m_bVectorLock = bVectorLock; - ui->m_vectorLock->setChecked(bVectorLock); - GetIEditor()->SetAxisVectorLock(bVectorLock); -} - -void CInfoBar::SetVectorRange(float min, float max) -{ - // Worth noting that this gets called every IdleUpdate, so it is necessary to make sure - // setting the min/max doesn't result in the Qt event queue being pumped - ui->m_posCtrl->setMinimum(min); - ui->m_posCtrl->setMaximum(max); -} - -void CInfoBar::OnVectorLock() -{ - SetVectorLock(!m_bVectorLock); -} - -void CInfoBar::OnLockSelection() -{ - bool newLockSelectionValue = !m_bSelectionLocked; - m_bSelectionLocked = newLockSelectionValue; - ui->m_lockSelection->setChecked(newLockSelectionValue); - GetIEditor()->LockSelection(newLockSelectionValue); -} - void CInfoBar::OnUpdateMoveSpeedText(const QString& text) { gSettings.cameraMoveSpeed = aznumeric_cast(Round(text.toDouble(), m_speedStep)); @@ -771,12 +280,6 @@ void CInfoBar::OnInitDialog() QFontMetrics metrics({}); int width = metrics.boundingRect("-9999.99").width() * m_fieldWidthMultiplier; - ui->m_posCtrl->setEnabled(false); - ui->m_posCtrl->getElements()[0]->setFixedWidth(width); - ui->m_posCtrl->getElements()[1]->setFixedWidth(width); - ui->m_posCtrl->getElements()[2]->setFixedWidth(width); - ui->m_setVector->setEnabled(false); - ui->m_moveSpeed->setFixedWidth(width); ui->m_physicsBtn->setEnabled(false); @@ -850,12 +353,6 @@ void CInfoBar::OnBnClickedGotoPosition() emit ActionTriggered(ID_DISPLAY_GOTOPOSITION); } -////////////////////////////////////////////////////////////////////////// -void CInfoBar::OnBnClickedSetVector() -{ - emit ActionTriggered(ID_DISPLAY_SETVECTOR); -} - ////////////////////////////////////////////////////////////////////////// void CInfoBar::OnBnClickedMuteAudio() { diff --git a/Code/Sandbox/Editor/InfoBar.h b/Code/Sandbox/Editor/InfoBar.h index 6bf89099fe..6e547d46c6 100644 --- a/Code/Sandbox/Editor/InfoBar.h +++ b/Code/Sandbox/Editor/InfoBar.h @@ -59,24 +59,9 @@ protected: virtual void OnOK() {}; virtual void OnCancel() {}; - void OnVectorUpdate(bool followTerrain); - - // this gets called by stepper or text edit changes - void OnVectorChanged(); - - void SetVector(const Vec3& v); - void SetVectorRange(float min, float max); - Vec3 GetVector(); - void EnableVector(bool enable); - - void SetVectorLock(bool bVectorLock); - void OnBnClickedSyncplayer(); void OnBnClickedGotoPosition(); - void OnVectorLock(); - void OnLockSelection(); - void OnBnClickedSetVector(); void OnSpeedComboBoxEnter(); void OnUpdateMoveSpeedText(const QString&); void OnBnClickedTerrainCollision(); @@ -98,13 +83,10 @@ protected: void EnteredComponentMode(const AZStd::vector& componentModeTypes) override; void LeftComponentMode(const AZStd::vector& componentModeTypes) override; - bool m_enabledVector; - float m_width, m_height; //int m_heightMapX,m_heightMapY; double m_fieldWidthMultiplier = 1.8; - int m_prevEditMode; int m_numSelected; float m_prevMoveSpeed; @@ -117,14 +99,11 @@ protected: // Speed presets float m_speedPresetValues[3] = { 0.1f, 1.0f, 10.0f }; - bool m_bVectorLock; - bool m_bSelectionLocked; bool m_bSelectionChanged; bool m_bDragMode; QString m_sLastText; - CEditTool* m_editTool; Vec3 m_lastValue; Vec3 m_currValue; float m_oldMainVolume; diff --git a/Code/Sandbox/Editor/InfoBar.ui b/Code/Sandbox/Editor/InfoBar.ui index e6d135da4b..84207629df 100644 --- a/Code/Sandbox/Editor/InfoBar.ui +++ b/Code/Sandbox/Editor/InfoBar.ui @@ -57,42 +57,6 @@ - - - - - 0 - 0 - - - - Position - - - - - - - - 0 - 0 - - - - XYZ - - - - :/InfoBar/XYZ-default.svg:/InfoBar/XYZ-default.svg - - - - 22 - 18 - - - - @@ -135,68 +99,6 @@ - - - - Lock Object Selection - - - Lock Selection - - - - :/InfoBar/LockSelection-default.svg:/InfoBar/LockSelection-default.svg - - - - 18 - 18 - - - - true - - - - - - - Lock Scale Axis Vectors - - - Lock Scale - - - - :/InfoBar/LockScale-default.svg:/InfoBar/LockScale-default.svg - - - - 18 - 18 - - - - true - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 1 - 18 - - - - @@ -424,13 +326,6 @@ - - - AzQtComponents::VectorInput - QWidget -
AzQtComponents/Components/Widgets/VectorInput.h
-
-
diff --git a/Code/Sandbox/Editor/LayoutWnd.cpp b/Code/Sandbox/Editor/LayoutWnd.cpp index 56c0bcb849..34a96bca53 100644 --- a/Code/Sandbox/Editor/LayoutWnd.cpp +++ b/Code/Sandbox/Editor/LayoutWnd.cpp @@ -418,8 +418,11 @@ void CLayoutWnd::CreateLayout(EViewLayout layout, bool bBindViewports, EViewport QRect rcView = rect(); rcView.setBottom(rcView.bottom() - m_infoBar->height()); + // Ensure we delete our old view immediately so it can relinquish its backing ViewportContext if (m_maximizedView) - m_maximizedView->deleteLater(); + { + delete m_maximizedView; + } m_maximizedView = new CLayoutViewPane(this); m_maximizedView->SetId(0); diff --git a/Code/Sandbox/Editor/LegacyViewportCameraController.cpp b/Code/Sandbox/Editor/LegacyViewportCameraController.cpp index 7a33dff377..518b17f898 100644 --- a/Code/Sandbox/Editor/LegacyViewportCameraController.cpp +++ b/Code/Sandbox/Editor/LegacyViewportCameraController.cpp @@ -408,6 +408,13 @@ bool LegacyViewportCameraControllerInstance::HandleInputChannelEvent(const AzFra } } + UpdateCursorCapture(shouldCaptureCursor); + + return shouldConsumeEvent; +} + +void LegacyViewportCameraControllerInstance::UpdateCursorCapture(bool shouldCaptureCursor) +{ if (m_capturingCursor != shouldCaptureCursor) { if (shouldCaptureCursor) @@ -427,8 +434,14 @@ bool LegacyViewportCameraControllerInstance::HandleInputChannelEvent(const AzFra m_capturingCursor = shouldCaptureCursor; } +} - return shouldConsumeEvent; +void LegacyViewportCameraControllerInstance::ResetInputChannels() +{ + m_modifiers = 0; + m_pressedKeys.clear(); + UpdateCursorCapture(false); + m_inRotateMode = m_inMoveMode = m_inOrbitMode = m_inZoomMode = false; } void LegacyViewportCameraControllerInstance::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) diff --git a/Code/Sandbox/Editor/LegacyViewportCameraController.h b/Code/Sandbox/Editor/LegacyViewportCameraController.h index b4a36f44a5..129a2409da 100644 --- a/Code/Sandbox/Editor/LegacyViewportCameraController.h +++ b/Code/Sandbox/Editor/LegacyViewportCameraController.h @@ -35,6 +35,7 @@ namespace SandboxEditor explicit LegacyViewportCameraControllerInstance(AzFramework::ViewportId viewport); bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override; + void ResetInputChannels() override; void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override; private: @@ -53,6 +54,7 @@ namespace SandboxEditor bool HandleMouseMove(const AzFramework::ScreenPoint& currentMousePos, const AzFramework::ScreenPoint& previousMousePos); bool HandleMouseWheel(float zDelta); bool IsKeyDown(Qt::Key key) const; + void UpdateCursorCapture(bool shouldCaptureCursor); bool m_inRotateMode = false; bool m_inMoveMode = false; diff --git a/Code/Sandbox/Editor/LensFlareEditor/LensFlareReferenceTree.cpp b/Code/Sandbox/Editor/LensFlareEditor/LensFlareReferenceTree.cpp index 6f99e15b48..3c628d1b34 100644 --- a/Code/Sandbox/Editor/LensFlareEditor/LensFlareReferenceTree.cpp +++ b/Code/Sandbox/Editor/LensFlareEditor/LensFlareReferenceTree.cpp @@ -23,4 +23,4 @@ CLensFlareReferenceTree::CLensFlareReferenceTree() CLensFlareReferenceTree::~CLensFlareReferenceTree() { -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h b/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h index e48fb5fec1..b28a80967a 100644 --- a/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h +++ b/Code/Sandbox/Editor/Lib/Tests/IEditorMock.h @@ -20,7 +20,7 @@ class CEditorMock : public IEditor { public: - // GMock does not work with a variadic function (https://github.com/google/googlemock/blob/master/googlemock/docs/FrequentlyAskedQuestions.md) + // GMock does not work with a variadic function void ExecuteCommand(const char* sCommand, ...) override { va_list args; @@ -123,12 +123,6 @@ public: MOCK_METHOD0(GetRuler, CRuler* ()); MOCK_METHOD1(SetOperationMode, void(EOperationMode )); MOCK_METHOD0(GetOperationMode, EOperationMode()); - MOCK_METHOD1(SetEditMode, void(int )); - MOCK_METHOD0(GetEditMode, int()); - MOCK_METHOD2(SetEditTool, void(CEditTool*, bool)); - MOCK_METHOD2(SetEditTool, void(const QString&, bool)); - MOCK_METHOD0(ReinitializeEditTool, void()); - MOCK_METHOD0(GetEditTool, CEditTool* ()); MOCK_METHOD1(ShowTransformManipulator, ITransformManipulator* (bool)); MOCK_METHOD0(GetTransformManipulator, ITransformManipulator* ()); MOCK_METHOD1(SetAxisConstraints, void(AxisConstrains )); diff --git a/Code/Sandbox/Editor/Lib/Tests/test_EditorPythonBindings.cpp b/Code/Sandbox/Editor/Lib/Tests/test_EditorPythonBindings.cpp index 3bb33d623b..6456b95c00 100644 --- a/Code/Sandbox/Editor/Lib/Tests/test_EditorPythonBindings.cpp +++ b/Code/Sandbox/Editor/Lib/Tests/test_EditorPythonBindings.cpp @@ -151,9 +151,6 @@ namespace EditorPythonBindingsUnitTests EXPECT_TRUE(behaviorContext->m_methods.find("get_axis_constraint") != behaviorContext->m_methods.end()); EXPECT_TRUE(behaviorContext->m_methods.find("set_axis_constraint") != behaviorContext->m_methods.end()); - EXPECT_TRUE(behaviorContext->m_methods.find("get_edit_mode") != behaviorContext->m_methods.end()); - EXPECT_TRUE(behaviorContext->m_methods.find("set_edit_mode") != behaviorContext->m_methods.end()); - EXPECT_TRUE(behaviorContext->m_methods.find("get_pak_from_file") != behaviorContext->m_methods.end()); EXPECT_TRUE(behaviorContext->m_methods.find("log") != behaviorContext->m_methods.end()); @@ -200,8 +197,6 @@ namespace EditorPythonBindingsUnitTests EXPECT_TRUE(behaviorBus->m_events.find("OpenFileBox") != behaviorBus->m_events.end()); EXPECT_TRUE(behaviorBus->m_events.find("GetAxisConstraint") != behaviorBus->m_events.end()); EXPECT_TRUE(behaviorBus->m_events.find("SetAxisConstraint") != behaviorBus->m_events.end()); - EXPECT_TRUE(behaviorBus->m_events.find("GetEditMode") != behaviorBus->m_events.end()); - EXPECT_TRUE(behaviorBus->m_events.find("SetEditMode") != behaviorBus->m_events.end()); EXPECT_TRUE(behaviorBus->m_events.find("GetPakFromFile") != behaviorBus->m_events.end()); EXPECT_TRUE(behaviorBus->m_events.find("Log") != behaviorBus->m_events.end()); EXPECT_TRUE(behaviorBus->m_events.find("Undo") != behaviorBus->m_events.end()); diff --git a/Code/Sandbox/Editor/Lib/Tests/test_SetVectorDlg.cpp b/Code/Sandbox/Editor/Lib/Tests/test_SetVectorDlg.cpp deleted file mode 100644 index 18faf6deba..0000000000 --- a/Code/Sandbox/Editor/Lib/Tests/test_SetVectorDlg.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" -#include -#include - -#include - -using namespace AZ; -using namespace ::testing; - -namespace UnitTest -{ - class TestSetVectorDlg - : public ::testing::Test - { - public: - - }; - - const float SetVectorDlgNearTolerance = 0.0001f; - - TEST_F(TestSetVectorDlg, GetVectorFromString_ThreeParams_Success) - { - QString testStr{ "1,2,3" }; - Vec3 result{ 0, 0, 0 }; - - result = CSetVectorDlg::GetVectorFromString(testStr); - - EXPECT_NEAR(result[0], 1.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[1], 2.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[2], 3.0f, SetVectorDlgNearTolerance); - } - - TEST_F(TestSetVectorDlg, GetVectorFromString_FourParams_ThreeParsed) - { - QString testStr{ "1,2,3,4" }; - Vec3 result{ 0, 0, 0 }; - - result = CSetVectorDlg::GetVectorFromString(testStr); - - EXPECT_NEAR(result[0], 1.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[1], 2.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[2], 3.0f, SetVectorDlgNearTolerance); - } - - TEST_F(TestSetVectorDlg, GetVectorFromString_TwoParams_ThirdZero) - { - QString testStr{ "1,2" }; - Vec3 result{ 0, 0, 0 }; - - result = CSetVectorDlg::GetVectorFromString(testStr); - - EXPECT_NEAR(result[0], 1.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[1], 2.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[2], 0.0f, SetVectorDlgNearTolerance); - } - - TEST_F(TestSetVectorDlg, GetVectorFromString_NoParams_AllZero) - { - QString testStr; - Vec3 result{ 0, 0, 0 }; - - result = CSetVectorDlg::GetVectorFromString(testStr); - - EXPECT_NEAR(result[0], 0.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[1], 0.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[2], 0.0f, SetVectorDlgNearTolerance); - } - - TEST_F(TestSetVectorDlg, GetVectorFromString_BadStrings_AllZero) - { - QString testStr{ "some,illegal,strings" }; - Vec3 resultExpected{ 0, 1, 0 }; - - auto result = CSetVectorDlg::GetVectorFromString(testStr); - - EXPECT_NEAR(result[0], 0.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[1], 0.0f, SetVectorDlgNearTolerance); - EXPECT_NEAR(result[2], 0.0f, SetVectorDlgNearTolerance); - } -} // namespace UnitTest diff --git a/Code/Sandbox/Editor/MainWindow.cpp b/Code/Sandbox/Editor/MainWindow.cpp index 6acd8cfc20..902b04f266 100644 --- a/Code/Sandbox/Editor/MainWindow.cpp +++ b/Code/Sandbox/Editor/MainWindow.cpp @@ -60,7 +60,6 @@ AZ_POP_DISABLE_WARNING // Editor #include "Resource.h" -#include "EditTool.h" #include "Core/LevelEditorMenuHandler.h" #include "ShortcutDispatcher.h" #include "LayoutWnd.h" @@ -270,15 +269,6 @@ namespace return QtViewPaneManager::instance()->IsVisible(viewClassName); } - AZStd::string PyGetStatusText() - { - if (GetIEditor()->GetEditTool()) - { - return AZStd::string(GetIEditor()->GetEditTool()->GetStatusText().toUtf8().data()); - } - return AZStd::string(""); - } - AZStd::vector PyGetViewPaneNames() { const QtViewPanes panes = QtViewPaneManager::instance()->GetRegisteredPanes(); @@ -693,7 +683,6 @@ void MainWindow::closeEvent(QCloseEvent* event) } // Close all edit panels. GetIEditor()->ClearSelection(); - GetIEditor()->SetEditTool(0); GetIEditor()->GetObjectManager()->EndEditParams(); // force clean up of all deferred deletes, so that we don't have any issues with windows from plugins not being deleted yet @@ -761,11 +750,6 @@ void MainWindow::InitActions() am->AddAction(ID_TOOLBAR_SEPARATOR, QString()); - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - am->AddAction(ID_TOOLBAR_WIDGET_REF_COORD, QString()); - } - am->AddAction(ID_TOOLBAR_WIDGET_UNDO, QString()); am->AddAction(ID_TOOLBAR_WIDGET_REDO, QString()); am->AddAction(ID_TOOLBAR_WIDGET_SNAP_ANGLE, QString()); @@ -1006,18 +990,6 @@ void MainWindow::InitActions() am->AddAction(ID_EDIT_RENAMEOBJECT, tr("Rename Object(s)...")) .SetStatusTip(tr("Rename Object")); - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - am->AddAction(ID_EDITMODE_SELECT, tr("Select mode")) - .SetIcon(Style::icon("Select")) - .SetApplyHoverEffect() - .SetShortcut(tr("1")) - .SetToolTip(tr("Select mode (1)")) - .SetCheckable(true) - .SetStatusTip(tr("Select object(s)")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateEditmodeSelect); - } - am->AddAction(ID_EDITMODE_MOVE, tr("Move")) .SetIcon(Style::icon("Move")) .SetApplyHoverEffect() @@ -1043,74 +1015,6 @@ void MainWindow::InitActions() .SetStatusTip(tr("Select and scale selected object(s)")) .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateEditmodeScale); - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - am->AddAction(ID_EDITMODE_SELECTAREA, tr("Select terrain")) - .SetIcon(Style::icon("Select_terrain")) - .SetApplyHoverEffect() - .SetShortcut(tr("5")) - .SetToolTip(tr("Select terrain (5)")) - .SetCheckable(true) - .SetStatusTip(tr("Switch to terrain selection mode")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateEditmodeSelectarea); - am->AddAction(ID_SELECT_AXIS_X, tr("Constrain to X axis")) - .SetIcon(Style::icon("X_axis")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+1")) - .SetToolTip(tr("Constrain to X axis (Ctrl+1)")) - .SetCheckable(true) - .SetStatusTip(tr("Lock movement on X axis")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisX); - am->AddAction(ID_SELECT_AXIS_Y, tr("Constrain to Y axis")) - .SetIcon(Style::icon("Y_axis")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+2")) - .SetToolTip(tr("Constrain to Y axis (Ctrl+2)")) - .SetCheckable(true) - .SetStatusTip(tr("Lock movement on Y axis")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisY); - am->AddAction(ID_SELECT_AXIS_Z, tr("Constrain to Z axis")) - .SetIcon(Style::icon("Z_axis")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+3")) - .SetToolTip(tr("Constrain to Z axis (Ctrl+3)")) - .SetCheckable(true) - .SetStatusTip(tr("Lock movement on Z axis")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisZ); - am->AddAction(ID_SELECT_AXIS_XY, tr("Constrain to XY plane")) - .SetIcon(Style::icon("XY2_copy")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+4")) - .SetToolTip(tr("Constrain to XY plane (Ctrl+4)")) - .SetCheckable(true) - .SetStatusTip(tr("Lock movement on XY plane")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisXy); - am->AddAction(ID_SELECT_AXIS_TERRAIN, tr("Constrain to terrain/geometry")) - .SetIcon(Style::icon("Object_follow_terrain")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+5")) - .SetToolTip(tr("Constrain to terrain/geometry (Ctrl+5)")) - .SetCheckable(true) - .SetStatusTip(tr("Lock object movement to follow terrain")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisTerrain); - am->AddAction(ID_SELECT_AXIS_SNAPTOALL, tr("Follow terrain and snap to objects")) - .SetIcon(Style::icon("Follow_terrain")) - .SetApplyHoverEffect() - .SetShortcut(tr("Ctrl+6")) - .SetToolTip(tr("Follow terrain and snap to objects (Ctrl+6)")) - .SetCheckable(true) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelectAxisSnapToAll); - am->AddAction(ID_OBJECTMODIFY_ALIGNTOGRID, tr("Align to grid")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelected) - .SetIcon(Style::icon("Align_to_grid")) - .SetApplyHoverEffect(); - am->AddAction(ID_MODIFY_ALIGNOBJTOSURF, tr("Align object to surface (Hold CTRL)")).SetCheckable(true) - .SetToolTip(tr("Align object to surface (Hold CTRL)")) - .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateAlignToVoxel) - .SetIcon(Style::icon("Align_object_to_surface")) - .SetApplyHoverEffect(); - } - am->AddAction(ID_SNAP_TO_GRID, tr("Snap to grid")) .SetIcon(Style::icon("Grid")) .SetApplyHoverEffect() @@ -1169,7 +1073,6 @@ void MainWindow::InitActions() am->AddAction(ID_CHANGEMOVESPEED_CHANGESTEP, tr("Change Step")) .SetStatusTip(tr("Change Flycam Movement Step")); am->AddAction(ID_DISPLAY_GOTOPOSITION, tr("Go to Position...")); - am->AddAction(ID_DISPLAY_SETVECTOR, tr("Display Set Vector")); am->AddAction(ID_MODIFY_GOTO_SELECTION, tr("Center on Selection")) .SetShortcut(tr("Z")) .SetToolTip(tr("Center on Selection (Z)")) @@ -1459,10 +1362,6 @@ void MainWindow::InitActions() .SetIcon(QIcon(":/MainWindow/toolbars/object_toolbar-03.svg")) .SetApplyHoverEffect() .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelected); - // vertex snapping not yet supported when the new Viewport Interaction Model is enabled - am->AddAction(ID_OBJECTMODIFY_VERTEXSNAPPING, tr("Vertex snapping")) - .SetIcon(Style::icon("Vertex_snapping")) - .SetApplyHoverEffect(); } // Misc Toolbar Actions @@ -1510,8 +1409,6 @@ void MainWindow::OnEscapeAction() { AzToolsFramework::EditorEvents::Bus::Broadcast( &AzToolsFramework::EditorEvents::OnEscape); - - CCryEditApp::instance()->OnEditEscape(); } } } @@ -1522,62 +1419,6 @@ void MainWindow::InitToolBars() AdjustToolBarIconSize(static_cast(gSettings.gui.nToolbarIconSize)); } -QComboBox* MainWindow::CreateRefCoordComboBox() -{ - // ID_REF_COORDS_SYS; - auto coordSysCombo = new RefCoordComboBox(this); - - connect(this, &MainWindow::ToggleRefCoordSys, coordSysCombo, &RefCoordComboBox::ToggleRefCoordSys); - connect(this, &MainWindow::UpdateRefCoordSys, coordSysCombo, &RefCoordComboBox::UpdateRefCoordSys); - - return coordSysCombo; -} - -RefCoordComboBox::RefCoordComboBox(QWidget* parent) - : QComboBox(parent) -{ - addItems(coordSysList()); - setCurrentIndex(0); - - connect(this, static_cast(&QComboBox::currentIndexChanged), this, [](int index) - { - if (index >= 0 && index < LAST_COORD_SYSTEM) - { - RefCoordSys coordSys = (RefCoordSys)index; - if (GetIEditor()->GetReferenceCoordSys() != index) - { - GetIEditor()->SetReferenceCoordSys(coordSys); - } - } - }); - - UpdateRefCoordSys(); -} - -QStringList RefCoordComboBox::coordSysList() const -{ - static QStringList list = { tr("View"), tr("Local"), tr("Parent"), tr("World"), tr("Custom") }; - return list; -} - -void RefCoordComboBox::UpdateRefCoordSys() -{ - RefCoordSys coordSys = GetIEditor()->GetReferenceCoordSys(); - if (coordSys >= 0 && coordSys < LAST_COORD_SYSTEM) - { - setCurrentIndex(coordSys); - } -} - -void RefCoordComboBox::ToggleRefCoordSys() -{ - QStringList coordSys = coordSysList(); - const int localIndex = coordSys.indexOf(tr("Local")); - const int worldIndex = coordSys.indexOf(tr("World")); - const int newIndex = currentIndex() == localIndex ? worldIndex : localIndex; - setCurrentIndex(newIndex); -} - QToolButton* MainWindow::CreateUndoRedoButton(int command) { // We do either undo or redo below, sort that out here @@ -2542,9 +2383,6 @@ QWidget* MainWindow::CreateToolbarWidget(int actionId) case ID_TOOLBAR_WIDGET_REDO: w = CreateUndoRedoButton(ID_REDO); break; - case ID_TOOLBAR_WIDGET_REF_COORD: - w = CreateRefCoordComboBox(); - break; case ID_TOOLBAR_WIDGET_SNAP_GRID: w = CreateSnapToGridWidget(); break; @@ -2640,7 +2478,6 @@ namespace AzToolsFramework addLegacyGeneral(behaviorContext->Method("exit", PyExit, nullptr, "Exits the editor.")); addLegacyGeneral(behaviorContext->Method("exit_no_prompt", PyExitNoPrompt, nullptr, "Exits the editor without prompting to save first.")); addLegacyGeneral(behaviorContext->Method("report_test_result", PyReportTest, nullptr, "Report test information.")); - addLegacyGeneral(behaviorContext->Method("get_status_text", PyGetStatusText, nullptr, "Gets the status text from the Editor's current edit tool")); } } } diff --git a/Code/Sandbox/Editor/MainWindow.h b/Code/Sandbox/Editor/MainWindow.h index c40d732cee..3e652888fe 100644 --- a/Code/Sandbox/Editor/MainWindow.h +++ b/Code/Sandbox/Editor/MainWindow.h @@ -77,19 +77,6 @@ namespace AzToolsFramework // Subclassing so we can add slots to our toolbar widgets // Using lambdas is crashy since the lamdba doesn't know when the widget is deleted. -class RefCoordComboBox - : public QComboBox -{ - Q_OBJECT -public: - explicit RefCoordComboBox(QWidget* parent); -public Q_SLOTS: - void ToggleRefCoordSys(); - void UpdateRefCoordSys(); -private: - QStringList coordSysList() const; -}; - class UndoRedoToolButton : public QToolButton { @@ -229,8 +216,6 @@ private: QWidget* CreateSnapToGridWidget(); QWidget* CreateSnapToAngleWidget(); - QComboBox* CreateRefCoordComboBox(); - QToolButton* CreateUndoRedoButton(int command); QToolButton* CreateEnvironmentModeButton(); diff --git a/Code/Sandbox/Editor/MainWindow/object_toolbar-03.svg b/Code/Sandbox/Editor/MainWindow/object_toolbar-03.svg index 8fa9d2b423..ea7f8497ec 100644 --- a/Code/Sandbox/Editor/MainWindow/object_toolbar-03.svg +++ b/Code/Sandbox/Editor/MainWindow/object_toolbar-03.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/MatEditPreviewDlg.h b/Code/Sandbox/Editor/MatEditPreviewDlg.h index 988359b239..870d1b901e 100644 --- a/Code/Sandbox/Editor/MatEditPreviewDlg.h +++ b/Code/Sandbox/Editor/MatEditPreviewDlg.h @@ -63,4 +63,4 @@ private: QScopedPointer m_menubar; }; -#endif // CRYINCLUDE_EDITOR_MATEDITPREVIEWDLG_H \ No newline at end of file +#endif // CRYINCLUDE_EDITOR_MATEDITPREVIEWDLG_H diff --git a/Code/Sandbox/Editor/Material/MaterialManager.cpp b/Code/Sandbox/Editor/Material/MaterialManager.cpp index 8f4269bb3e..3c21a74d97 100644 --- a/Code/Sandbox/Editor/Material/MaterialManager.cpp +++ b/Code/Sandbox/Editor/Material/MaterialManager.cpp @@ -525,6 +525,11 @@ void CMaterialManager::OnEditorNotifyEvent(EEditorNotifyEvent event) ////////////////////////////////////////////////////////////////////////// void CMaterialManager::ReloadDirtyMaterials() { + if (!GetIEditor()->Get3DEngine()) + { + return; + } + IMaterialManager* runtimeMaterialManager = GetIEditor()->Get3DEngine()->GetMaterialManager(); uint32 mtlCount = 0; @@ -550,7 +555,6 @@ void CMaterialManager::ReloadDirtyMaterials() } } } - } ////////////////////////////////////////////////////////////////////////// @@ -744,12 +748,15 @@ int CMaterialManager::GetHighlightFlags(CMaterial* pMaterial) const result |= eHighlight_NoSurfaceType; } - if (ISurfaceTypeManager* pSurfaceManager = GetIEditor()->Get3DEngine()->GetMaterialManager()->GetSurfaceTypeManager()) + if (GetIEditor()->Get3DEngine()) { - const ISurfaceType* pSurfaceType = pSurfaceManager->GetSurfaceTypeByName(surfaceTypeName.toUtf8().data()); - if (pSurfaceType && pSurfaceType->GetBreakability() != 0) + if (ISurfaceTypeManager* pSurfaceManager = GetIEditor()->Get3DEngine()->GetMaterialManager()->GetSurfaceTypeManager()) { - result |= eHighlight_Breakable; + const ISurfaceType* pSurfaceType = pSurfaceManager->GetSurfaceTypeByName(surfaceTypeName.toUtf8().data()); + if (pSurfaceType && pSurfaceType->GetBreakability() != 0) + { + result |= eHighlight_Breakable; + } } } diff --git a/Code/Sandbox/Editor/Material/MaterialPickTool.cpp b/Code/Sandbox/Editor/Material/MaterialPickTool.cpp deleted file mode 100644 index 38e3d0612d..0000000000 --- a/Code/Sandbox/Editor/Material/MaterialPickTool.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "MaterialPickTool.h" - -// Editor -#include "MaterialManager.h" -#include "SurfaceInfoPicker.h" -#include "Viewport.h" - - -#define RENDER_MESH_TEST_DISTANCE 0.2f - -static IClassDesc * s_ToolClass = NULL; - -////////////////////////////////////////////////////////////////////////// -CMaterialPickTool::CMaterialPickTool() -{ - m_pClassDesc = s_ToolClass; - m_statusText = tr("Left Click To Pick Material"); -} - -////////////////////////////////////////////////////////////////////////// -CMaterialPickTool::~CMaterialPickTool() -{ - SetMaterial(0); -} - -////////////////////////////////////////////////////////////////////////// -bool CMaterialPickTool::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) -{ - if (event == eMouseLDown) - { - if (m_pMaterial) - { - CMaterial* pMtl = GetIEditor()->GetMaterialManager()->FromIMaterial(m_pMaterial); - if (pMtl) - { - GetIEditor()->GetMaterialManager()->SetHighlightedMaterial(0); - GetIEditor()->OpenMaterialLibrary(pMtl); - Abort(); - return true; - } - } - } - else if (event == eMouseMove) - { - return OnMouseMove(view, flags, point); - } - return true; -} - -////////////////////////////////////////////////////////////////////////// -void CMaterialPickTool::Display(DisplayContext& dc) -{ - QPoint mousePoint = QCursor::pos(); - - dc.view->ScreenToClient(mousePoint); - - Vec3 wp = dc.view->ViewToWorld(mousePoint); - - if (m_pMaterial) - { - float color[4] = {1, 1, 1, 1}; - dc.renderer->Draw2dLabel(mousePoint.x() + 12, mousePoint.y ()+ 8, 1.2f, color, false, "%s", m_displayString.toUtf8().data()); - } - - float fScreenScale = dc.view->GetScreenScaleFactor(m_HitInfo.vHitPos) * 0.06f; - - dc.DepthTestOff(); - dc.SetColor(ColorB(0, 0, 255, 255)); - if (!m_HitInfo.vHitNormal.IsZero()) - { - dc.DrawLine(m_HitInfo.vHitPos, m_HitInfo.vHitPos + m_HitInfo.vHitNormal * fScreenScale); - - Vec3 raySrc, rayDir; - dc.view->ViewToWorldRay(mousePoint, raySrc, rayDir); - - Matrix34 tm; - - Vec3 zAxis = m_HitInfo.vHitNormal; - Vec3 xAxis = rayDir.Cross(zAxis); - if (!xAxis.IsZero()) - { - xAxis.Normalize(); - Vec3 yAxis = xAxis.Cross(zAxis).GetNormalized(); - tm.SetFromVectors(xAxis, yAxis, zAxis, m_HitInfo.vHitPos); - - dc.PushMatrix(tm); - dc.DrawCircle(Vec3(0, 0, 0), 0.5f * fScreenScale); - dc.PopMatrix(); - } - } - dc.DepthTestOn(); -} - -////////////////////////////////////////////////////////////////////////// -bool CMaterialPickTool::OnMouseMove(CViewport* view, [[maybe_unused]] UINT nFlags, const QPoint& point) -{ - view->SetCurrentCursor(STD_CURSOR_HIT, ""); - - _smart_ptr pNearestMaterial(NULL); - - m_Mouse2DPosition = point; - - CSurfaceInfoPicker surfacePicker; - int nPickObjectGroupFlag = CSurfaceInfoPicker::ePOG_All; - if (surfacePicker.Pick(point, pNearestMaterial, m_HitInfo, NULL, nPickObjectGroupFlag)) - { - SetMaterial(pNearestMaterial); - return true; - } - - SetMaterial(0); - return false; -} - -const GUID& CMaterialPickTool::GetClassID() -{ - // {FD20F6F2-7B87-4349-A5D4-7533538E357F} - static const GUID guid = { - 0xfd20f6f2, 0x7b87, 0x4349, { 0xa5, 0xd4, 0x75, 0x33, 0x53, 0x8e, 0x35, 0x7f } - }; - return guid; -} - -////////////////////////////////////////////////////////////////////////// -void CMaterialPickTool::RegisterTool(CRegistrationContext& rc) -{ - rc.pClassFactory->RegisterClass(s_ToolClass = new CQtViewClass("EditTool.PickMaterial", "Material", ESYSTEM_CLASS_EDITTOOL)); -} - -////////////////////////////////////////////////////////////////////////// -void CMaterialPickTool::SetMaterial(_smart_ptr pMaterial) -{ - if (pMaterial == m_pMaterial) - { - return; - } - - m_pMaterial = pMaterial; - CMaterial* pCMaterial = GetIEditor()->GetMaterialManager()->FromIMaterial(m_pMaterial); - GetIEditor()->GetMaterialManager()->SetHighlightedMaterial(pCMaterial); - - m_displayString = ""; - if (pMaterial) - { - QString sfType; - sfType = QStringLiteral("%1 : %2").arg(pMaterial->GetSurfaceType()->GetId()).arg(pMaterial->GetSurfaceType()->GetName()); - - m_displayString = "\n"; - m_displayString += pMaterial->GetName(); - m_displayString += "\n"; - m_displayString += sfType; - } -} - -#include diff --git a/Code/Sandbox/Editor/Material/MaterialPickTool.h b/Code/Sandbox/Editor/Material/MaterialPickTool.h deleted file mode 100644 index 09c5691315..0000000000 --- a/Code/Sandbox/Editor/Material/MaterialPickTool.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Definition of PickObjectTool, tool used to pick objects. - -#ifndef CRYINCLUDE_EDITOR_MATERIAL_MATERIALPICKTOOL_H -#define CRYINCLUDE_EDITOR_MATERIAL_MATERIALPICKTOOL_H -#pragma once - -#include "EditTool.h" - -////////////////////////////////////////////////////////////////////////// -class CMaterialPickTool - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE CMaterialPickTool(); - - static const GUID& GetClassID(); - - static void RegisterTool(CRegistrationContext& rc); - - ////////////////////////////////////////////////////////////////////////// - // CEditTool implementation - ////////////////////////////////////////////////////////////////////////// - virtual bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - virtual void Display(DisplayContext& dc); - ////////////////////////////////////////////////////////////////////////// - -protected: - - bool OnMouseMove(CViewport* view, UINT nFlags, const QPoint& point); - void SetMaterial(_smart_ptr pMaterial); - - virtual ~CMaterialPickTool(); - // Delete itself. - void DeleteThis() { delete this; }; - - _smart_ptr m_pMaterial; - QString m_displayString; - QPoint m_Mouse2DPosition; - SRayHitInfo m_HitInfo; -}; - - -#endif // CRYINCLUDE_EDITOR_MATERIAL_MATERIALPICKTOOL_H diff --git a/Code/Sandbox/Editor/Material/MaterialPythonFuncs.h b/Code/Sandbox/Editor/Material/MaterialPythonFuncs.h index 80bf496baa..f04542f466 100644 --- a/Code/Sandbox/Editor/Material/MaterialPythonFuncs.h +++ b/Code/Sandbox/Editor/Material/MaterialPythonFuncs.h @@ -31,4 +31,4 @@ namespace AzToolsFramework void Deactivate() override {} }; -} // namespace AzToolsFramework \ No newline at end of file +} // namespace AzToolsFramework diff --git a/Code/Sandbox/Editor/Mission.cpp b/Code/Sandbox/Editor/Mission.cpp index 57f2033f3b..b9668f1c80 100644 --- a/Code/Sandbox/Editor/Mission.cpp +++ b/Code/Sandbox/Editor/Mission.cpp @@ -212,8 +212,11 @@ void CMission::SyncContent(bool bRetrieve, bool bIgnoreObjects, [[maybe_unused]] else { // Save time of day. - m_timeOfDay = XmlHelpers::CreateXmlNode("TimeOfDay"); - GetIEditor()->Get3DEngine()->GetTimeOfDay()->Serialize(m_timeOfDay, false); + if (GetIEditor()->Get3DEngine()) + { + m_timeOfDay = XmlHelpers::CreateXmlNode("TimeOfDay"); + GetIEditor()->Get3DEngine()->GetTimeOfDay()->Serialize(m_timeOfDay, false); + } if (!bIgnoreObjects) { diff --git a/Code/Sandbox/Editor/NullEditTool.cpp b/Code/Sandbox/Editor/NullEditTool.cpp deleted file mode 100644 index b848ed6364..0000000000 --- a/Code/Sandbox/Editor/NullEditTool.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "EditorDefs.h" - -#include "NullEditTool.h" - - -NullEditTool::NullEditTool() {} - -const GUID& NullEditTool::GetClassID() -{ - // {65AFF87A-34E0-479B-B062-94B1B867B13D} - static const GUID guid = - { - 0x65AFF87A, 0x34E0, 0x479B,{ 0xB0, 0x62, 0x94, 0xB1, 0xB8, 0x67, 0xB1, 0x3D } - }; - - return guid; -} - -void NullEditTool::RegisterTool(CRegistrationContext& rc) -{ - rc.pClassFactory->RegisterClass( - new CQtViewClass("EditTool.NullEditTool", "Select", ESYSTEM_CLASS_EDITTOOL)); -} - -#include diff --git a/Code/Sandbox/Editor/NullEditTool.h b/Code/Sandbox/Editor/NullEditTool.h deleted file mode 100644 index 44bb4ce76d..0000000000 --- a/Code/Sandbox/Editor/NullEditTool.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#if !defined(Q_MOC_RUN) -#include "EditTool.h" -#endif - -/// An EditTool that does nothing - it provides the Null-Object pattern. -class SANDBOX_API NullEditTool - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE NullEditTool(); - virtual ~NullEditTool() = default; - - static const GUID& GetClassID(); - static void RegisterTool(CRegistrationContext& rc); - - // CEditTool - void BeginEditParams([[maybe_unused]] IEditor* ie, [[maybe_unused]] int flags) override {} - void EndEditParams() override {} - void Display([[maybe_unused]] DisplayContext& dc) override {} - bool MouseCallback([[maybe_unused]] CViewport* view, [[maybe_unused]] EMouseEvent event, [[maybe_unused]] QPoint& point, [[maybe_unused]] int flags) override { return false; } - bool OnKeyDown([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) override { return false; } - bool OnKeyUp([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) override { return true; } - void DeleteThis() override { delete this; } -}; \ No newline at end of file diff --git a/Code/Sandbox/Editor/ObjectCloneTool.cpp b/Code/Sandbox/Editor/ObjectCloneTool.cpp deleted file mode 100644 index fd8256f4cb..0000000000 --- a/Code/Sandbox/Editor/ObjectCloneTool.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "ObjectCloneTool.h" - -// Editor -#include "MainWindow.h" -#include "Viewport.h" -#include "ViewManager.h" -#include "Include/IObjectManager.h" -#include "Objects/SelectionGroup.h" -#include "Settings.h" - -////////////////////////////////////////////////////////////////////////// -// Class description. -////////////////////////////////////////////////////////////////////////// -class CObjectCloneTool_ClassDesc - : public CRefCountClassDesc -{ - virtual ESystemClassID SystemClassID() { return ESYSTEM_CLASS_EDITTOOL; } - virtual REFGUID ClassID() - { - // {6A73E865-71DF-4ED0-ABA2-457E66119B35} - static const GUID guid = { - 0x6a73e865, 0x71df, 0x4ed0,{ 0xab, 0xa2, 0x45, 0x7e, 0x66, 0x11, 0x9b, 0x35 } - }; - return guid; - } - virtual QString ClassName() { return "EditTool.Clone"; }; - virtual QString Category() { return "EditTool"; }; -}; -CObjectCloneTool_ClassDesc g_cloneClassDesc; - -////////////////////////////////////////////////////////////////////////// -CObjectCloneTool::CObjectCloneTool() - : m_currentUndoBatch(nullptr) -{ - m_pClassDesc = &g_cloneClassDesc; - m_bSetConstrPlane = true; - - GetIEditor()->SuperBeginUndo(); - - GetIEditor()->BeginUndo(); - m_selection = nullptr; - if (!GetIEditor()->GetSelection()->IsEmpty()) - { - QWaitCursor wait; - CloneSelection(); - m_selection = GetIEditor()->GetSelection(); - m_origin = m_selection->GetCenter(); - } - GetIEditor()->AcceptUndo("Clone"); - GetIEditor()->BeginUndo(); - - if (!gSettings.deepSelectionSettings.bStickDuplicate) - { - SetStatusText("Clone object at the same location"); - } - else - { - SetStatusText("Left click to clone object"); - } -} - -////////////////////////////////////////////////////////////////////////// -CObjectCloneTool::~CObjectCloneTool() -{ - EndUndoBatch(); - - if (GetIEditor()->IsUndoRecording()) - { - GetIEditor()->SuperCancelUndo(); - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::CloneSelection() -{ - // Allow component application to intercept cloning behavior. - // This is to allow support for "smart" cloning of prefabs, and other contextual features. - AZ_Assert(!m_currentUndoBatch, "CloneSelection undo batch already created."); - EBUS_EVENT_RESULT(m_currentUndoBatch, AzToolsFramework::ToolsApplicationRequests::Bus, BeginUndoBatch, "Clone Selection"); - bool handled = false; - EBUS_EVENT(AzToolsFramework::EditorRequests::Bus, CloneSelection, handled); - if (handled) - { - GetIEditor()->GetObjectManager()->CheckAndFixSelection(); - return; - } - - // This is the legacy case. We're not cloning AZ entities, so abandon the AZ undo batch. - EndUndoBatch(); - - CSelectionGroup selObjects; - CSelectionGroup sel; - - CSelectionGroup* currSelection = GetIEditor()->GetSelection(); - - currSelection->Clone(selObjects); - - GetIEditor()->ClearSelection(); - for (int i = 0; i < selObjects.GetCount(); i++) - { - if (selObjects.GetObject(i)) - { - GetIEditor()->SelectObject(selObjects.GetObject(i)); - } - } - MainWindow::instance()->setFocus(); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::SetConstrPlane(CViewport* view, [[maybe_unused]] const QPoint& point) -{ - Matrix34 originTM; - originTM.SetIdentity(); - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() == 1) - { - originTM = selection->GetObject(0)->GetWorldTM(); - } - else if (selection->GetCount() > 1) - { - originTM = selection->GetObject(0)->GetWorldTM(); - Vec3 center = view->SnapToGrid(originTM.GetTranslation()); - originTM.SetTranslation(center); - } - view->SetConstructionMatrix(COORDS_LOCAL, originTM); -} - -//static Vec3 gP1,gP2; -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::Display([[maybe_unused]] DisplayContext& dc) -{ - //dc.SetColor( 1,1,0,1 ); - //dc.DrawBall( gP1,1.1f ); - //dc.DrawBall( gP2,1.1f ); -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectCloneTool::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) -{ - if (m_selection) - { - // Set construction plane origin to selection origin. - if (m_bSetConstrPlane) - { - SetConstrPlane(view, point); - m_bSetConstrPlane = false; - } - - if (event == eMouseLDown) - { - // Accept group. - Accept(); - GetIEditor()->GetSelection()->FinishChanges(); - return true; - } - if (event == eMouseMove) - { - // Move selection. - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection != m_selection) - { - Abort(); - } - else if (!selection->IsEmpty()) - { - GetIEditor()->RestoreUndo(); - - Vec3 v; - bool followTerrain = false; - - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - Vec3 selectionCenter = view->SnapToGrid(pSelection->GetCenter()); - - int axis = GetIEditor()->GetAxisConstrains(); - if (axis == AXIS_TERRAIN) - { - bool hitTerrain; - v = view->ViewToWorld(point, &hitTerrain) - selectionCenter; - if (axis == AXIS_TERRAIN) - { - v = view->SnapToGrid(v); - if (hitTerrain) - { - followTerrain = true; - v.z = 0; - } - } - } - else - { - Vec3 p1 = selectionCenter; - Vec3 p2 = view->MapViewToCP(point); - if (p2.IsZero()) - { - return true; - } - - v = view->GetCPVector(p1, p2); - // Snap v offset to grid if its enabled. - view->SnapToGrid(v); - } - - CSelectionGroup::EMoveSelectionFlag selectionFlag = CSelectionGroup::eMS_None; - if (followTerrain) - { - selectionFlag = CSelectionGroup::eMS_FollowTerrain; - } - - // Disable undo recording for these move commands as the only operation we need - // to undo is the creation of the new object. Undo commands are queued so it's - // possible that the object creation could be undone before attempting to undo - // these move operations causing undesired behavior. - bool wasRecording = CUndo::IsRecording(); - if (wasRecording) - { - GetIEditor()->SuspendUndo(); - } - - GetIEditor()->GetSelection()->Move(v, selectionFlag, GetIEditor()->GetReferenceCoordSys(), point); - - if (wasRecording) - { - GetIEditor()->ResumeUndo(); - } - } - } - if (event == eMouseWheel) - { - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection != m_selection) - { - Abort(); - } - else if (!selection->IsEmpty()) - { - double angle = 1; - - if (view->GetViewManager()->GetGrid()->IsAngleSnapEnabled()) - { - angle = view->GetViewManager()->GetGrid()->GetAngleSnap(); - } - - for (int i = 0; i < selection->GetCount(); ++i) - { - CBaseObject* pObj = selection->GetFilteredObject(i); - Quat rot = pObj->GetRotation(); - rot.SetRotationXYZ(Ang3(0, 0, rot.GetRotZ() + DEG2RAD(flags > 0 ? angle * (-1) : angle))); - pObj->SetRotation(rot); - } - GetIEditor()->AcceptUndo("Rotate Selection"); - } - } - } - return true; -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::Abort() -{ - EndUndoBatch(); - - // Abort - GetIEditor()->SetEditTool(0); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::Accept(bool resetPosition) -{ - // Close the az undo batch so it can add the appropriate objects to the cry undo stack - EndUndoBatch(); - - if (resetPosition) - { - GetIEditor()->GetSelection()->MoveTo(m_origin, CSelectionGroup::eMS_None, GetIEditor()->GetReferenceCoordSys()); - } - - if (GetIEditor()->IsUndoRecording()) - { - GetIEditor()->SuperAcceptUndo("Clone"); - } - - GetIEditor()->SetEditTool(0); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::EndUndoBatch() -{ - if (m_currentUndoBatch) - { - AzToolsFramework::UndoSystem::URSequencePoint* undoBatch = nullptr; - EBUS_EVENT_RESULT(undoBatch, AzToolsFramework::ToolsApplicationRequests::Bus, GetCurrentUndoBatch); - AZ_Error("ObjectCloneTool", undoBatch == m_currentUndoBatch, "Undo batch is not in sync."); - if (undoBatch == m_currentUndoBatch) - { - EBUS_EVENT(AzToolsFramework::ToolsApplicationRequests::Bus, EndUndoBatch); - } - m_currentUndoBatch = nullptr; - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::BeginEditParams([[maybe_unused]] IEditor* ie, [[maybe_unused]] int flags) -{ -} - -////////////////////////////////////////////////////////////////////////// -void CObjectCloneTool::EndEditParams() -{ -} - -////////////////////////////////////////////////////////////////////////// -bool CObjectCloneTool::OnKeyDown([[maybe_unused]] CViewport* view, uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) -{ - if (nChar == VK_ESCAPE) - { - Abort(); - } - return false; -} - -#include diff --git a/Code/Sandbox/Editor/ObjectCloneTool.h b/Code/Sandbox/Editor/ObjectCloneTool.h deleted file mode 100644 index f027456a4e..0000000000 --- a/Code/Sandbox/Editor/ObjectCloneTool.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Definition of ObjectCloneTool, edit tool for cloning of objects.. - - -#ifndef CRYINCLUDE_EDITOR_OBJECTCLONETOOL_H -#define CRYINCLUDE_EDITOR_OBJECTCLONETOOL_H - -#pragma once - -#include "EditTool.h" - -class CBaseObject; - -namespace AzToolsFramework -{ - namespace UndoSystem - { - class URSequencePoint; - } -} - -/*! - * CObjectCloneTool, When created duplicate current selection, and manages cloned selection. - * - */ - -class CObjectCloneTool - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE CObjectCloneTool(); - - ////////////////////////////////////////////////////////////////////////// - // Ovverides from CEditTool - bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - - virtual void BeginEditParams(IEditor* ie, int flags); - virtual void EndEditParams(); - - virtual void Display(DisplayContext& dc); - virtual bool OnKeyDown(CViewport* view, uint32 nChar, uint32 nRepCnt, uint32 nFlags); - virtual bool OnKeyUp([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) { return false; }; - ////////////////////////////////////////////////////////////////////////// - - void Accept(bool resetPosition = false); - void Abort(); - -protected: - virtual ~CObjectCloneTool(); - // Delete itself. - void DeleteThis() { delete this; }; - -private: - void CloneSelection(); - void SetConstrPlane(CViewport* view, const QPoint& point); - - CSelectionGroup* m_selection; - Vec3 m_origin; - bool m_bSetConstrPlane; - //bool m_bSetCapture; - - void EndUndoBatch(); - - AzToolsFramework::UndoSystem::URSequencePoint* m_currentUndoBatch; -}; - - -#endif // CRYINCLUDE_EDITOR_OBJECTCLONETOOL_H diff --git a/Code/Sandbox/Editor/Objects/AxisGizmo.cpp b/Code/Sandbox/Editor/Objects/AxisGizmo.cpp index 590b1256ac..40970838c1 100644 --- a/Code/Sandbox/Editor/Objects/AxisGizmo.cpp +++ b/Code/Sandbox/Editor/Objects/AxisGizmo.cpp @@ -24,7 +24,6 @@ #include "RenderHelpers/AxisHelper.h" #include "RenderHelpers/AxisHelperExtended.h" #include "IObjectManager.h" -#include "EditTool.h" ////////////////////////////////////////////////////////////////////////// // CAxisGizmo implementation. @@ -138,36 +137,6 @@ void CAxisGizmo::GetWorldBounds(AABB& bbox) void CAxisGizmo::DrawAxis(DisplayContext& dc) { m_pAxisHelper->SetHighlightAxis(m_highlightAxis); - // Only enable axis planes when editor is in Move mode. - int nEditMode = GetIEditor()->GetEditMode(); - int nModeFlags = 0; - switch (nEditMode) - { - case eEditModeMove: - nModeFlags |= CAxisHelper::MOVE_MODE; - break; - case eEditModeRotate: - nModeFlags |= CAxisHelper::ROTATE_MODE; - nModeFlags &= ~(CAxisHelper::ROTATE_CIRCLE_MODE); - break; - case eEditModeRotateCircle: - nModeFlags |= CAxisHelper::ROTATE_CIRCLE_MODE; - nModeFlags &= ~(CAxisHelper::ROTATE_MODE); - break; - case eEditModeScale: - nModeFlags |= CAxisHelper::SCALE_MODE; - break; - case eEditModeSelect: - nModeFlags |= CAxisHelper::SELECT_MODE; - break; - case eEditModeSelectArea: - nModeFlags |= CAxisHelper::SELECT_MODE; - break; - } - - //nModeFlags |= CAxisHelper::MOVE_MODE | CAxisHelper::ROTATE_MODE | CAxisHelper::SCALE_MODE; - - m_pAxisHelper->SetMode(nModeFlags); Matrix34 tm = GetTransformation(m_bAlwaysUseLocal ? COORDS_LOCAL : GetIEditor()->GetReferenceCoordSys(), dc.view); m_pAxisHelper->DrawAxis(tm, GetIEditor()->GetGlobalGizmoParameters(), dc); @@ -178,21 +147,6 @@ void CAxisGizmo::DrawAxis(DisplayContext& dc) m_pAxisHelper->DrawDome(tm, GetIEditor()->GetGlobalGizmoParameters(), dc, objectBox); } - ////////////////////////////////////////////////////////////////////////// - // Draw extended infinite-axis gizmo - ////////////////////////////////////////////////////////////////////////// - if (!(dc.flags & DISPLAY_2D) && - (nModeFlags == CAxisHelper::MOVE_MODE || - nModeFlags == CAxisHelper::ROTATE_MODE)) - { - bool bClickedShift = CheckVirtualKey(Qt::Key_Shift); - if (bClickedShift && (m_axisGizmoCount == 1 || m_highlightAxis || (m_axisGizmoCount == 2 && m_object && m_object->IsSkipSelectionHelper()))) - { - bool bClickedAlt = CheckVirtualKey(Qt::Key_Menu); - bool bUsePhysicalProxy = !bClickedAlt; - m_pAxisHelperExtended->DrawAxes(dc, tm, bUsePhysicalProxy); - } - } } ////////////////////////////////////////////////////////////////////////// @@ -325,7 +279,7 @@ Matrix34 CAxisGizmo::GetTransformation(RefCoordSys coordSys, IDisplayViewport* v } ////////////////////////////////////////////////////////////////////////// -bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int nFlags) +bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, [[maybe_unused]] int nFlags) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); @@ -365,28 +319,6 @@ bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point m_cMouseDownPos = point; m_initPos = GetTransformation(COORDS_WORLD).GetTranslation(); - switch (hc.manipulatorMode) - { - case 1: - view->SetCurrentCursor(STD_CURSOR_MOVE); - GetIEditor()->SetEditMode(eEditModeMove); - break; - case 2: - view->SetCurrentCursor(STD_CURSOR_ROTATE); - GetIEditor()->SetEditMode(eEditModeRotate); - break; - case 3: - view->SetCurrentCursor(STD_CURSOR_SCALE); - GetIEditor()->SetEditMode(eEditModeScale); - break; - } - - CEditTool* pEditTool = view->GetEditTool(); - if (pEditTool) - { - pEditTool->OnManipulatorMouseEvent(view, this, event, point, nFlags); - } - return true; } } @@ -394,158 +326,6 @@ bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point { if (m_bDragging) { - bool bCallBack = true; - Vec3 vDragValue(0, 0, 0); - // Dragging transform manipulator. - switch (GetIEditor()->GetEditMode()) - { - case eEditModeMove: - { - view->SetCurrentCursor(STD_CURSOR_MOVE); - - if (view->GetAxisConstrain() == AXIS_TERRAIN) - { - if (nFlags & MK_CONTROL) - { - bool bCollideWithTerrain; - Vec3 posOnTerrain = view->ViewToWorld(point, &bCollideWithTerrain, true); - if (!bCollideWithTerrain) - { - return true; - } - vDragValue = posOnTerrain - m_initPos; - } - else - { - Vec3 p1 = view->SnapToGrid(view->ViewToWorld(m_cMouseDownPos)); - Vec3 p2 = view->SnapToGrid(view->ViewToWorld(point)); - vDragValue = p2 - p1; - vDragValue.z = 0; - } - } - else - { - Vec3 p1 = view->MapViewToCP(m_cMouseDownPos); - Vec3 p2 = view->MapViewToCP(point); - if (p1.IsZero() || p2.IsZero()) - { - return true; - } - vDragValue = view->GetCPVector(p1, p2); - } - } - break; - case eEditModeRotate: - { - view->SetCurrentCursor(STD_CURSOR_ROTATE); - - Ang3 ang(0, 0, 0); - float ax = (point.x() - m_cMouseDownPos.x()); - float ay = (point.y() - m_cMouseDownPos.y()); - switch (view->GetAxisConstrain()) - { - case AXIS_X: - ang.x = ay; - break; - case AXIS_Y: - ang.y = ay; - break; - case AXIS_Z: - ang.z = ay; - break; - case AXIS_XY: - ang(ax, ay, 0); - break; - case AXIS_XZ: - ang(ax, 0, ay); - break; - case AXIS_YZ: - ang(0, ay, ax); - break; - case AXIS_TERRAIN: - ang(ax, ay, 0); - break; - } - ; - ang = gSettings.pGrid->SnapAngle(ang); - vDragValue = Vec3(DEG2RAD(ang)); - } - break; - case eEditModeScale: - { - Vec3 scl(0, 0, 0); - float ay = 1.0f - 0.01f * (point.y() - m_cMouseDownPos.y()); - if (ay < 0.01f) - { - ay = 0.01f; - } - scl(ay, ay, ay); - switch (view->GetAxisConstrain()) - { - case AXIS_X: - scl(ay, 1, 1); - break; - case AXIS_Y: - scl(1, ay, 1); - break; - case AXIS_Z: - scl(1, 1, ay); - break; - case AXIS_XY: - scl(ay, ay, ay); - break; - case AXIS_XZ: - scl(ay, ay, ay); - break; - case AXIS_YZ: - scl(ay, ay, ay); - break; - case AXIS_XYZ: - scl(ay, ay, ay); - break; - case AXIS_TERRAIN: - scl(ay, ay, ay); - break; - } - ; - view->SetCurrentCursor(STD_CURSOR_SCALE); - vDragValue = scl; - } - break; - case eEditModeRotateCircle: - { - Matrix34 tm = GetTransformation(m_bAlwaysUseLocal ? COORDS_LOCAL : GetIEditor()->GetReferenceCoordSys()); - Vec3 v0, v1; - Vec3 vHitNormal; - if (m_pAxisHelper->HitTestForRotationCircle(tm, view, m_cMouseDownPos, 0.05f, &v0, &vHitNormal) && m_pAxisHelper->HitTestForRotationCircle(tm, view, point, 2.0f, &v1, &vHitNormal)) - { - Vec3 vDir0 = (v0 - tm.GetTranslation()).GetNormalized(); - Vec3 vDir1 = (v1 - tm.GetTranslation()).GetNormalized(); - - Vec3 vCurlDir = vDir0.Cross(vDir1).GetNormalized(); - if (vHitNormal.Dot(vCurlDir) > 0) - { - vDragValue = Vec3(std::acos(vDir0.Dot(vDir1)), 0, 0); - } - else - { - vDragValue = Vec3(-std::acos(vDir0.Dot(vDir1)), 0, 0); - } - } - else - { - bCallBack = false; - } - } - break; - } - - CEditTool* pEditTool = view->GetEditTool(); - if (pEditTool && bCallBack) - { - pEditTool->OnManipulatorDrag(view, this, m_cMouseDownPos, point, vDragValue); - } - return true; } else @@ -573,12 +353,6 @@ bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point } bHit = true; } - - CEditTool* pEditTool = view->GetEditTool(); - if (pEditTool) - { - pEditTool->OnManipulatorMouseEvent(view, this, event, point, nFlags, bHit); - } } } else if (event == eMouseLUp) @@ -593,12 +367,6 @@ bool CAxisGizmo::MouseCallback(CViewport* view, EMouseEvent event, QPoint& point { GetIEditor()->SetReferenceCoordSys(m_coordSysBackUp); } - - CEditTool* pEditTool = view->GetEditTool(); - if (pEditTool) - { - pEditTool->OnManipulatorMouseEvent(view, this, event, point, nFlags); - } } } diff --git a/Code/Sandbox/Editor/Objects/BaseObject.cpp b/Code/Sandbox/Editor/Objects/BaseObject.cpp index 36b954315e..a579f303a9 100644 --- a/Code/Sandbox/Editor/Objects/BaseObject.cpp +++ b/Code/Sandbox/Editor/Objects/BaseObject.cpp @@ -39,7 +39,6 @@ #include "ViewManager.h" #include "IEditorImpl.h" #include "GameEngine.h" -#include "EditTool.h" // To use the Andrew's algorithm in order to make convex hull from the points, this header is needed. #include "Util/GeometryUtil.h" @@ -3264,11 +3263,6 @@ ERotationWarningLevel CBaseObject::GetRotationWarningLevel() const bool CBaseObject::IsSkipSelectionHelper() const { - CEditTool* pEditTool(GetIEditor()->GetEditTool()); - if (pEditTool && pEditTool->IsNeedToSkipPivotBoxForObjects()) - { - return true; - } return false; } diff --git a/Code/Sandbox/Editor/Objects/ObjectManager.cpp b/Code/Sandbox/Editor/Objects/ObjectManager.cpp index aff6d51816..f3f33996da 100644 --- a/Code/Sandbox/Editor/Objects/ObjectManager.cpp +++ b/Code/Sandbox/Editor/Objects/ObjectManager.cpp @@ -22,12 +22,9 @@ #include "Settings.h" #include "DisplaySettings.h" #include "EntityObject.h" -#include "NullEditTool.h" #include "Viewport.h" #include "GizmoManager.h" #include "AxisGizmo.h" -#include "ObjectPhysicsManager.h" -#include "EditMode/ObjectMode.h" #include "GameEngine.h" #include "WaitProgress.h" #include "Util/Image.h" @@ -111,7 +108,6 @@ CObjectManager::CObjectManager() , m_pLoadProgress(nullptr) , m_loadedObjects(0) , m_totalObjectsToLoad(0) - , m_pPhysicsManager(new CObjectPhysicsManager()) , m_bExiting(false) , m_isUpdateVisibilityList(false) , m_currentHideCount(CBaseObject::s_invalidHiddenID) @@ -140,7 +136,6 @@ CObjectManager::~CObjectManager() DeleteAllObjects(); delete m_gizmoManager; - delete m_pPhysicsManager; } ////////////////////////////////////////////////////////////////////////// @@ -838,15 +833,11 @@ void CObjectManager::Update() QWidget* prevActiveWindow = QApplication::activeWindow(); - CheckAndFixSelection(); - // Restore focus if it changed. if (prevActiveWindow && QApplication::activeWindow() != prevActiveWindow) { prevActiveWindow->setFocus(); } - - m_pPhysicsManager->Update(); } ////////////////////////////////////////////////////////////////////////// @@ -1230,60 +1221,6 @@ void CObjectManager::RemoveSelection(const QString& name) } } -//! Checks the state of the current selection and fixes it if necessary - Used when AZ Code modifies the selection -void CObjectManager::CheckAndFixSelection() -{ - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); - bool bObjectMode = qobject_cast(GetIEditor()->GetEditTool()) != nullptr; - - if (m_currSelection->GetCount() == 0) - { - // Nothing selected. - EndEditParams(); - if (bObjectMode) - { - GetIEditor()->ShowTransformManipulator(false); - } - } - else if (m_currSelection->GetCount() == 1) - { - if (!m_bSingleSelection) - { - EndEditParams(); - } - - CBaseObject* newSelObject = m_currSelection->GetObject(0); - // Single object selected. - if (m_currEditObject != m_currSelection->GetObject(0)) - { - m_bSelectionChanged = false; - if (!m_currEditObject || (m_currEditObject->metaObject() != newSelObject->metaObject())) - { - // If old object and new objects are of different classes. - EndEditParams(); - } - if (GetIEditor()->GetEditTool() && GetIEditor()->GetEditTool()->IsUpdateUIPanel()) - { - BeginEditParams(newSelObject, OBJECT_EDIT); - } - - //AfxGetMainWnd()->SetFocus(); - } - } - else if (m_currSelection->GetCount() > 1) - { - // Multiple objects are selected. - if (m_bSelectionChanged && bObjectMode) - { - m_bSelectionChanged = false; - m_nLastSelCount = m_currSelection->GetCount(); - EndEditParams(); - - m_currEditObject = m_currSelection->GetObject(0); - } - } -} - void CObjectManager::SelectCurrent() { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); @@ -1404,8 +1341,6 @@ void CObjectManager::FindDisplayableObjects(DisplayContext& dc, bool bDisplay) pDispayedViewObjects->ClearObjects(); pDispayedViewObjects->Reserve(m_visibleObjects.size()); - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - const bool newViewportInteractionModelEnabled = GetIEditor()->IsNewViewportInteractionModelEnabled(); if (dc.flags & DISPLAY_2D) @@ -1426,11 +1361,6 @@ void CObjectManager::FindDisplayableObjects(DisplayContext& dc, bool bDisplay) { obj->Display(dc); } - - if (pEditTool) - { - pEditTool->DrawObjectHelpers(obj, dc); - } } } } @@ -1476,11 +1406,6 @@ void CObjectManager::FindDisplayableObjects(DisplayContext& dc, bool bDisplay) { obj->Display(dc); } - - if (pEditTool) - { - pEditTool->DrawObjectHelpers(obj, dc); - } } } } @@ -1737,12 +1662,6 @@ bool CObjectManager::HitTestObject(CBaseObject* obj, HitContext& hc) { return false; } - - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - if (pEditTool && pEditTool->HitTest(obj, hc)) - { - return true; - } } return (bSelectionHelperHit || obj->HitTest(hc)); @@ -2742,10 +2661,6 @@ void CObjectManager::SelectObjectInRect(CBaseObject* pObj, CViewport* view, HitC void CObjectManager::EnteredComponentMode(const AZStd::vector& /*componentModeTypes*/) { - // provide an EditTool that does nothing. - // note: will hide rotation gizmo when active (CRotateTool) - GetIEditor()->SetEditTool(new NullEditTool()); - // hide current gizmo for entity (translate/rotate/scale) IGizmoManager* gizmoManager = GetGizmoManager(); const size_t gizmoCount = static_cast(gizmoManager->GetGizmoCount()); @@ -2757,9 +2672,6 @@ void CObjectManager::EnteredComponentMode(const AZStd::vector& /*compo void CObjectManager::LeftComponentMode(const AZStd::vector& /*componentModeTypes*/) { - // return to default EditTool (in whatever transform mode is set) - GetIEditor()->SetEditTool(nullptr); - // show translate/rotate/scale gizmo again if (IGizmoManager* gizmoManager = GetGizmoManager()) { diff --git a/Code/Sandbox/Editor/Objects/ObjectManager.h b/Code/Sandbox/Editor/Objects/ObjectManager.h index eca23bc92b..26905c47cd 100644 --- a/Code/Sandbox/Editor/Objects/ObjectManager.h +++ b/Code/Sandbox/Editor/Objects/ObjectManager.h @@ -226,8 +226,6 @@ public: //! Set one of name selections as current selection. void SetSelection(const QString& name); void RemoveSelection(const QString& name); - //! Checks for changes to the current selection and makes adjustments accordingly - void CheckAndFixSelection() override; bool IsObjectDeletionAllowed(CBaseObject* pObject); @@ -336,9 +334,6 @@ public: virtual void FindAndRenameProperty2(const char* property2Name, const QString& oldValue, const QString& newValue); virtual void FindAndRenameProperty2If(const char* property2Name, const QString& oldValue, const QString& newValue, const char* otherProperty2Name, const QString& otherValue); - class CObjectPhysicsManager* GetPhysicsManager() - { return m_pPhysicsManager; } - bool IsReloading() const { return m_bInReloading; } void SetSkipUpdate(bool bSkipUpdate) override { m_bSkipObjectUpdate = bSkipUpdate; } @@ -435,8 +430,6 @@ private: int m_totalObjectsToLoad; ////////////////////////////////////////////////////////////////////////// - class CObjectPhysicsManager* m_pPhysicsManager; - ////////////////////////////////////////////////////////////////////////// // Numbering for names. ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.cpp b/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.cpp deleted file mode 100644 index c3886ad7e8..0000000000 --- a/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "ObjectPhysicsManager.h" - -// Editor -#include "GameEngine.h" -#include "Commands/CommandManager.h" -#include "Objects/SelectionGroup.h" -#include "Include/IObjectManager.h" - -#include "CryPhysicsDeprecation.h" - -#define MAX_OBJECTS_PHYS_SIMULATION_TIME (5) - -////////////////////////////////////////////////////////////////////////// -CObjectPhysicsManager::CObjectPhysicsManager() -{ - CommandManagerHelper::RegisterCommand(GetIEditor()->GetCommandManager(), - "physics", "simulate_objects", "", "", - AZStd::bind(&CObjectPhysicsManager::Command_SimulateObjects, this)); - CommandManagerHelper::RegisterCommand(GetIEditor()->GetCommandManager(), - "physics", "reset_objects_state", "", "", - AZStd::bind(&CObjectPhysicsManager::Command_ResetPhysicsState, this)); - CommandManagerHelper::RegisterCommand(GetIEditor()->GetCommandManager(), - "physics", "get_objects_state", "", "", - AZStd::bind(&CObjectPhysicsManager::Command_GetPhysicsState, this)); - - m_fStartObjectSimulationTime = 0; - m_bSimulatingObjects = false; - m_wasSimObjects = 0; -} - -////////////////////////////////////////////////////////////////////////// -CObjectPhysicsManager::~CObjectPhysicsManager() -{ - -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::Command_SimulateObjects() -{ - SimulateSelectedObjectsPositions(); -} - -///////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::Command_ResetPhysicsState() -{ - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - for (int i = 0; i < pSelection->GetCount(); i++) - { - pSelection->GetObject(i)->OnEvent(EVENT_PHYSICS_RESETSTATE); - } -} - -///////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::Command_GetPhysicsState() -{ - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - for (int i = 0; i < pSelection->GetCount(); i++) - { - pSelection->GetObject(i)->OnEvent(EVENT_PHYSICS_GETSTATE); - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::Update() -{ - if (m_bSimulatingObjects) - { - UpdateSimulatingObjects(); - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::SimulateSelectedObjectsPositions() -{ - CSelectionGroup* pSel = GetIEditor()->GetObjectManager()->GetSelection(); - if (pSel->IsEmpty()) - { - return; - } - - if (GetIEditor()->GetGameEngine()->GetSimulationMode()) - { - return; - } - - GetIEditor()->GetGameEngine()->SetSimulationMode(true, true); - - m_simObjects.clear(); - CRY_PHYSICS_REPLACEMENT_ASSERT(); - m_wasSimObjects = m_simObjects.size(); - - m_fStartObjectSimulationTime = GetISystem()->GetITimer()->GetAsyncCurTime(); - m_bSimulatingObjects = true; -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::UpdateSimulatingObjects() -{ - { - CUndo undo("Simulate"); - CRY_PHYSICS_REPLACEMENT_ASSERT(); - } - - float curTime = GetISystem()->GetITimer()->GetAsyncCurTime(); - float runningTime = (curTime - m_fStartObjectSimulationTime); - - if (m_simObjects.empty() || (runningTime > MAX_OBJECTS_PHYS_SIMULATION_TIME)) - { - m_fStartObjectSimulationTime = 0; - m_bSimulatingObjects = false; - GetIEditor()->GetGameEngine()->SetSimulationMode(false, true); - } -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::PrepareForExport() -{ - // Clear the collision class set, ready for objects to register - // their collision classes - m_collisionClasses.clear(); - m_collisionClassExportId = 0; - // First collision-class IS always the default one - RegisterCollisionClass(SCollisionClass(0, 0)); -} - -////////////////////////////////////////////////////////////////////////// -bool operator == (const SCollisionClass& lhs, const SCollisionClass& rhs) -{ - return lhs.type == rhs.type && lhs.ignore == rhs.ignore; -} - -////////////////////////////////////////////////////////////////////////// -int CObjectPhysicsManager::RegisterCollisionClass(const SCollisionClass& collclass) -{ - TCollisionClassVector::iterator it = std::find(m_collisionClasses.begin(), m_collisionClasses.end(), collclass); - if (it == m_collisionClasses.end()) - { - m_collisionClasses.push_back(collclass); - return m_collisionClasses.size() - 1; - } - return it - m_collisionClasses.begin(); -} - -////////////////////////////////////////////////////////////////////////// -int CObjectPhysicsManager::GetCollisionClassId(const SCollisionClass& collclass) -{ - TCollisionClassVector::iterator it = std::find(m_collisionClasses.begin(), m_collisionClasses.end(), collclass); - if (it == m_collisionClasses.end()) - { - return 0; - } - return it - m_collisionClasses.begin(); -} - -////////////////////////////////////////////////////////////////////////// -void CObjectPhysicsManager::SerializeCollisionClasses(CXmlArchive& xmlAr) -{ - if (!xmlAr.bLoading) - { - // Storing - CLogFile::WriteLine("Storing Collision Classes ..."); - - XmlNodeRef root = xmlAr.root->newChild("CollisionClasses"); - int count = m_collisionClasses.size(); - for (int i = 0; i < count; i++) - { - SCollisionClass& cc = m_collisionClasses[i]; - XmlNodeRef xmlCC = root->newChild("CollisionClass"); - xmlCC->setAttr("type", cc.type); - xmlCC->setAttr("ignore", cc.ignore); - } - } -} - - - diff --git a/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.h b/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.h deleted file mode 100644 index 7711d93208..0000000000 --- a/Code/Sandbox/Editor/Objects/ObjectPhysicsManager.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_OBJECTS_OBJECTPHYSICSMANAGER_H -#define CRYINCLUDE_EDITOR_OBJECTS_OBJECTPHYSICSMANAGER_H -#pragma once - - -////////////////////////////////////////////////////////////////////////// -class CObjectPhysicsManager -{ -public: - CObjectPhysicsManager(); - ~CObjectPhysicsManager(); - - void SimulateSelectedObjectsPositions(); - void Update(); - - ////////////////////////////////////////////////////////////////////////// - /// Collision Classes - ////////////////////////////////////////////////////////////////////////// - int RegisterCollisionClass(const SCollisionClass& collclass); - int GetCollisionClassId(const SCollisionClass& collclass); - void SerializeCollisionClasses(CXmlArchive& xmlAr); - - void PrepareForExport(); - -private: - void Command_SimulateObjects(); - void Command_GetPhysicsState(); - void Command_ResetPhysicsState(); - - void UpdateSimulatingObjects(); - - bool m_bSimulatingObjects; - float m_fStartObjectSimulationTime; - int m_wasSimObjects; - std::vector<_smart_ptr > m_simObjects; - - typedef std::vector TCollisionClassVector; - int m_collisionClassExportId; - TCollisionClassVector m_collisionClasses; -}; - - -#endif // CRYINCLUDE_EDITOR_OBJECTS_OBJECTPHYSICSMANAGER_H diff --git a/Code/Sandbox/Editor/Platform/Common/MSVC/editor_lib_msvc.cmake b/Code/Sandbox/Editor/Platform/Common/MSVC/editor_lib_msvc.cmake index e9fec24e6d..34b9807ba3 100644 --- a/Code/Sandbox/Editor/Platform/Common/MSVC/editor_lib_msvc.cmake +++ b/Code/Sandbox/Editor/Platform/Common/MSVC/editor_lib_msvc.cmake @@ -12,4 +12,4 @@ ly_add_source_properties( SOURCES MainWindow.cpp CryEdit.cpp PROPERTY COMPILE_OPTIONS VALUES -bigobj -) \ No newline at end of file +) diff --git a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json index bfa8bcf478..603aec57a5 100644 --- a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json @@ -65,4 +65,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/Contents.json b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/Contents.json index da4a164c91..2d92bd53fd 100644 --- a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/Contents.json +++ b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/Contents.json @@ -3,4 +3,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json index bfa8bcf478..603aec57a5 100644 --- a/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json +++ b/Code/Sandbox/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json @@ -65,4 +65,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Platform/Mac/editor_mac.cmake b/Code/Sandbox/Editor/Platform/Mac/editor_mac.cmake index 1b7c1b9f4c..484974745d 100644 --- a/Code/Sandbox/Editor/Platform/Mac/editor_mac.cmake +++ b/Code/Sandbox/Editor/Platform/Mac/editor_mac.cmake @@ -22,4 +22,4 @@ set_target_properties(Editor PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_LIST_DIR}/gui_info.plist RESOURCE ${CMAKE_CURRENT_LIST_DIR}/Images.xcassets XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME EditorAppIcon -) \ No newline at end of file +) diff --git a/Code/Sandbox/Editor/Platform/Windows/editor_windows.cmake b/Code/Sandbox/Editor/Platform/Windows/editor_windows.cmake index 5050034d2d..4058c1d466 100644 --- a/Code/Sandbox/Editor/Platform/Windows/editor_windows.cmake +++ b/Code/Sandbox/Editor/Platform/Windows/editor_windows.cmake @@ -11,5 +11,5 @@ set(LY_BUILD_DEPENDENCIES PRIVATE - Legacy::CryRenderD3D11 + Legacy::CryRenderNULL ) \ No newline at end of file diff --git a/Code/Sandbox/Editor/PythonEditorEventsBus.h b/Code/Sandbox/Editor/PythonEditorEventsBus.h index f4b2971a17..69ef2671a1 100644 --- a/Code/Sandbox/Editor/PythonEditorEventsBus.h +++ b/Code/Sandbox/Editor/PythonEditorEventsBus.h @@ -139,16 +139,6 @@ namespace AzToolsFramework */ virtual void SetAxisConstraint(AZStd::string_view pConstrain) = 0; - /* - * Gets edit mode. - */ - virtual const char* GetEditMode() = 0; - - /* - * Sets edit mode. - */ - virtual void SetEditMode(AZStd::string_view pEditMode) = 0; - /* * Finds a pak file name for a given file. */ diff --git a/Code/Sandbox/Editor/PythonEditorFuncs.cpp b/Code/Sandbox/Editor/PythonEditorFuncs.cpp index f5de22387c..8f735706fd 100644 --- a/Code/Sandbox/Editor/PythonEditorFuncs.cpp +++ b/Code/Sandbox/Editor/PythonEditorFuncs.cpp @@ -688,68 +688,6 @@ namespace } } - ////////////////////////////////////////////////////////////////////////// - // Edit Mode - ////////////////////////////////////////////////////////////////////////// - const char* PyGetEditMode() - { - int actualEditMode = GetIEditor()->GetEditMode(); - switch (actualEditMode) - { - case eEditModeSelect: - return "SELECT"; - case eEditModeSelectArea: - return "SELECTAREA"; - case eEditModeMove: - return "MOVE"; - case eEditModeRotate: - return "ROTATE"; - case eEditModeScale: - return "SCALE"; - case eEditModeTool: - return "TOOL"; - default: - throw std::logic_error("Invalid edit mode."); - } - } - - void PySetEditMode(AZStd::string_view pEditMode) - { - if (pEditMode == "MOVE") - { - GetIEditor()->SetEditMode(eEditModeMove); - } - else if (pEditMode == "ROTATE") - { - GetIEditor()->SetEditMode(eEditModeRotate); - } - else if (pEditMode == "SCALE") - { - GetIEditor()->SetEditMode(eEditModeScale); - } - else if (pEditMode == "SELECT") - { - GetIEditor()->SetEditMode(eEditModeSelect); - } - else if (pEditMode == "SELECTAREA") - { - GetIEditor()->SetEditMode(eEditModeSelectArea); - } - else if (pEditMode == "TOOL") - { - GetIEditor()->SetEditMode(eEditModeTool); - } - else if (pEditMode == "RULER") - { - CRuler* pRuler = GetIEditor()->GetRuler(); - pRuler->SetActive(!pRuler->IsActive()); - } - else - { - throw std::logic_error("Invalid edit mode."); - } - } - ////////////////////////////////////////////////////////////////////////// const char* PyGetPakFromFile(const char* filename) { @@ -1031,8 +969,6 @@ namespace AzToolsFramework ->Event("OpenFileBox", &EditorLayerPythonRequestBus::Events::OpenFileBox) ->Event("GetAxisConstraint", &EditorLayerPythonRequestBus::Events::GetAxisConstraint) ->Event("SetAxisConstraint", &EditorLayerPythonRequestBus::Events::SetAxisConstraint) - ->Event("GetEditMode", &EditorLayerPythonRequestBus::Events::GetEditMode) - ->Event("SetEditMode", &EditorLayerPythonRequestBus::Events::SetEditMode) ->Event("GetPakFromFile", &EditorLayerPythonRequestBus::Events::GetPakFromFile) ->Event("Log", &EditorLayerPythonRequestBus::Events::Log) ->Event("Undo", &EditorLayerPythonRequestBus::Events::Undo) @@ -1168,16 +1104,6 @@ namespace AzToolsFramework return PySetAxisConstraint(pConstrain); } - const char* PythonEditorComponent::GetEditMode() - { - return PyGetEditMode(); - } - - void PythonEditorComponent::SetEditMode(AZStd::string_view pEditMode) - { - return PySetEditMode(pEditMode); - } - const char* PythonEditorComponent::GetPakFromFile(const char* filename) { return PyGetPakFromFile(filename); @@ -1252,9 +1178,6 @@ namespace AzToolsFramework addLegacyGeneral(behaviorContext->Method("get_axis_constraint", PyGetAxisConstraint, nullptr, "Gets axis.")); addLegacyGeneral(behaviorContext->Method("set_axis_constraint", PySetAxisConstraint, nullptr, "Sets axis.")); - addLegacyGeneral(behaviorContext->Method("get_edit_mode", PyGetEditMode, nullptr, "Gets edit mode.")); - addLegacyGeneral(behaviorContext->Method("set_edit_mode", PySetEditMode, nullptr, "Sets edit mode.")); - addLegacyGeneral(behaviorContext->Method("get_pak_from_file", PyGetPakFromFile, nullptr, "Finds a pak file name for a given file.")); addLegacyGeneral(behaviorContext->Method("log", PyLog, nullptr, "Prints the message to the editor console window.")); diff --git a/Code/Sandbox/Editor/PythonEditorFuncs.h b/Code/Sandbox/Editor/PythonEditorFuncs.h index 37cb6bd551..471f0d581f 100644 --- a/Code/Sandbox/Editor/PythonEditorFuncs.h +++ b/Code/Sandbox/Editor/PythonEditorFuncs.h @@ -95,10 +95,6 @@ namespace AzToolsFramework void SetAxisConstraint(AZStd::string_view pConstrain) override; - const char* GetEditMode() override; - - void SetEditMode(AZStd::string_view pEditMode) override; - const char* GetPakFromFile(const char* filename) override; void Log(const char* pMessage) override; diff --git a/Code/Sandbox/Editor/QtUI/PixmapLabelPreview.h b/Code/Sandbox/Editor/QtUI/PixmapLabelPreview.h index 2a3737c0d1..d603e28d94 100644 --- a/Code/Sandbox/Editor/QtUI/PixmapLabelPreview.h +++ b/Code/Sandbox/Editor/QtUI/PixmapLabelPreview.h @@ -40,4 +40,4 @@ private: Qt::AspectRatioMode m_mode; }; -#endif // PIXMAPLABELPREVIEW_H \ No newline at end of file +#endif // PIXMAPLABELPREVIEW_H diff --git a/Code/Sandbox/Editor/QtViewPaneManager.cpp b/Code/Sandbox/Editor/QtViewPaneManager.cpp index ad33eecfee..b242f3d914 100644 --- a/Code/Sandbox/Editor/QtViewPaneManager.cpp +++ b/Code/Sandbox/Editor/QtViewPaneManager.cpp @@ -36,6 +36,8 @@ #include #include +#include + #include #include #include @@ -983,6 +985,11 @@ bool QtViewPaneManager::ClosePanesWithRollback(const QVector& panesToKe */ void QtViewPaneManager::RestoreDefaultLayout(bool resetSettings) { + // Get whether the prefab system is enabled + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + if (resetSettings) { // We're going to do something destructive (removing all of the viewpane settings). Better confirm with the user @@ -1022,7 +1029,11 @@ void QtViewPaneManager::RestoreDefaultLayout(bool resetSettings) state.viewPanes.push_back(LyViewPane::EntityInspector); state.viewPanes.push_back(LyViewPane::AssetBrowser); state.viewPanes.push_back(LyViewPane::Console); - state.viewPanes.push_back(LyViewPane::LevelInspector); + + if (!isPrefabSystemEnabled) + { + state.viewPanes.push_back(LyViewPane::LevelInspector); + } state.mainWindowState = m_defaultMainWindowState; @@ -1047,7 +1058,12 @@ void QtViewPaneManager::RestoreDefaultLayout(bool resetSettings) const QtViewPane* assetBrowserViewPane = OpenPane(LyViewPane::AssetBrowser, QtViewPane::OpenMode::UseDefaultState); const QtViewPane* entityInspectorViewPane = OpenPane(LyViewPane::EntityInspector, QtViewPane::OpenMode::UseDefaultState); const QtViewPane* consoleViewPane = OpenPane(LyViewPane::Console, QtViewPane::OpenMode::UseDefaultState); - const QtViewPane* levelInspectorPane = OpenPane(LyViewPane::LevelInspector, QtViewPane::OpenMode::UseDefaultState); + + const QtViewPane* levelInspectorPane = nullptr; + if (!isPrefabSystemEnabled) + { + levelInspectorPane = OpenPane(LyViewPane::LevelInspector, QtViewPane::OpenMode::UseDefaultState); + } // This class does all kinds of behind the scenes magic to make docking / restore work, especially with groups // so instead of doing our special default layout attach / docking right now, we want to make it happen diff --git a/Code/Sandbox/Editor/RenderHelpers/AxisHelperShared.inl b/Code/Sandbox/Editor/RenderHelpers/AxisHelperShared.inl index fa56a21a8b..a6ceaf578f 100644 --- a/Code/Sandbox/Editor/RenderHelpers/AxisHelperShared.inl +++ b/Code/Sandbox/Editor/RenderHelpers/AxisHelperShared.inl @@ -17,7 +17,6 @@ #include "Include/IDisplayViewport.h" #include "Include/HitContext.h" #include "Util/Math.h" -#include "EditTool.h" #include "IObjectManager.h" #include diff --git a/Code/Sandbox/Editor/RenderViewport.cpp b/Code/Sandbox/Editor/RenderViewport.cpp index 213a4ed895..af4cbd46bc 100644 --- a/Code/Sandbox/Editor/RenderViewport.cpp +++ b/Code/Sandbox/Editor/RenderViewport.cpp @@ -66,7 +66,6 @@ #include "Util/fastlib.h" #include "CryEditDoc.h" #include "GameEngine.h" -#include "EditTool.h" #include "ViewManager.h" #include "Objects/DisplayContext.h" #include "DisplaySettings.h" @@ -1948,12 +1947,6 @@ void CRenderViewport::RenderAll() m_entityVisibilityQuery.DisplayVisibility(*debugDisplay); - if (GetEditTool()) - { - // display editing tool - GetEditTool()->Display(displayContext); - } - if (m_manipulatorManager != nullptr) { using namespace AzToolsFramework::ViewportInteraction; @@ -2776,35 +2769,6 @@ void CRenderViewport::OnMouseWheel(Qt::KeyboardModifiers modifiers, short zDelta handled = result != MouseInteractionResult::None; } - else - { - if (m_manipulatorManager == nullptr || m_manipulatorManager->ConsumeViewportMouseWheel(mouseInteraction)) - { - return; - } - - if (AzToolsFramework::ComponentModeFramework::InComponentMode()) - { - AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus::EventResult( - handled, AzToolsFramework::GetEntityContextId(), - &EditorInteractionSystemViewportSelectionRequestBus::Events::InternalHandleMouseViewportInteraction, - MouseInteractionEvent(mouseInteraction, zDelta)); - } - else - { - ////////////////////////////////////////////////////////////////////////// - // Asks current edit tool to handle mouse callback. - CEditTool* pEditTool = GetEditTool(); - if (pEditTool && (modifiers & Qt::ControlModifier)) - { - QPoint tempPoint(scaledPoint.x(), scaledPoint.y()); - if (pEditTool->MouseCallback(this, eMouseWheel, tempPoint, zDelta)) - { - handled = true; - } - } - } - } if (!handled) { @@ -4337,96 +4301,17 @@ void CRenderViewport::RenderSnappingGrid() { return; } - if (GetIEditor()->GetEditMode() != eEditModeMove - && GetIEditor()->GetEditMode() != eEditModeRotate) - { - return; - } CGrid* pGrid = GetViewManager()->GetGrid(); if (pGrid->IsEnabled() == false && pGrid->IsAngleSnapEnabled() == false) { return; } - if (GetIEditor()->GetEditTool() && !GetIEditor()->GetEditTool()->IsDisplayGrid()) - { - return; - } DisplayContext& dc = m_displayContext; int prevState = dc.GetState(); dc.DepthWriteOff(); - Vec3 p = pSelGroup->GetObject(0)->GetWorldPos(); - - AABB bbox; - pSelGroup->GetObject(0)->GetBoundBox(bbox); - float size = 2 * bbox.GetRadius(); - float alphaMax = 1.0f, alphaMin = 0.2f; - dc.SetLineWidth(3); - - if (GetIEditor()->GetEditMode() == eEditModeMove && pGrid->IsEnabled()) - // Draw the translation grid. - { - Vec3 u = m_constructionPlaneAxisX; - Vec3 v = m_constructionPlaneAxisY; - float step = pGrid->scale * pGrid->size; - const int MIN_STEP_COUNT = 5; - const int MAX_STEP_COUNT = 300; - int nSteps = std::min(std::max(FloatToIntRet(size / step), MIN_STEP_COUNT), MAX_STEP_COUNT); - size = nSteps * step; - for (int i = -nSteps; i <= nSteps; ++i) - { - // Draw u lines. - float alphaCur = alphaMax - fabsf(float(i) / float(nSteps)) * (alphaMax - alphaMin); - dc.DrawLine(p + v * (step * i), p + u * size + v * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p + v * (step * i), p - u * size + v * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - // Draw v lines. - dc.DrawLine(p + u * (step * i), p + v * size + u * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p + u * (step * i), p - v * size + u * (step * i), - ColorF(0, 0, 0, alphaCur), ColorF(0, 0, 0, alphaMin)); - } - } - else if (GetIEditor()->GetEditMode() == eEditModeRotate && pGrid->IsAngleSnapEnabled()) - // Draw the rotation grid. - { - int nAxis(GetAxisConstrain()); - if (nAxis == AXIS_X || nAxis == AXIS_Y || nAxis == AXIS_Z) - { - RefCoordSys coordSys = GetIEditor()->GetReferenceCoordSys(); - Vec3 xAxis(1, 0, 0); - Vec3 yAxis(0, 1, 0); - Vec3 zAxis(0, 0, 1); - Vec3 rotAxis; - if (nAxis == AXIS_X) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(xAxis); - } - else if (nAxis == AXIS_Y) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(yAxis); - } - else if (nAxis == AXIS_Z) - { - rotAxis = m_constructionMatrix[coordSys].TransformVector(zAxis); - } - Vec3 anotherAxis = m_constructionPlane.n * size; - float step = pGrid->angleSnap; - int nSteps = FloatToIntRet(180.0f / step); - for (int i = 0; i < nSteps; ++i) - { - AngleAxis rot(i* step* gf_PI / 180.0, rotAxis); - Vec3 dir = rot * anotherAxis; - dc.DrawLine(p, p + dir, - ColorF(0, 0, 0, alphaMax), ColorF(0, 0, 0, alphaMin)); - dc.DrawLine(p, p - dir, - ColorF(0, 0, 0, alphaMax), ColorF(0, 0, 0, alphaMin)); - } - } - } dc.SetState(prevState); } diff --git a/Code/Sandbox/Editor/Resource.h b/Code/Sandbox/Editor/Resource.h index afcd0c7a6f..8c4b09ae67 100644 --- a/Code/Sandbox/Editor/Resource.h +++ b/Code/Sandbox/Editor/Resource.h @@ -123,7 +123,6 @@ #define ID_TOOL_SHELVE_LAST 33375 #define ID_EDIT_SELECTALL 33376 #define ID_EDIT_SELECTNONE 33377 -#define ID_OBJECTMODIFY_VERTEXSNAPPING 33384 #define ID_WIREFRAME 33410 #define ID_FILE_GENERATETERRAINTEXTURE 33445 #define ID_GENERATORS_LIGHTING 33446 @@ -142,18 +141,12 @@ #define ID_EDITMODE_ROTATE 33506 #define ID_EDITMODE_SCALE 33507 #define ID_EDITMODE_MOVE 33508 -#define ID_EDITMODE_SELECT 33509 -#define ID_EDITMODE_SELECTAREA 33510 #define ID_SELECTION_DELETE 33512 #define ID_EDIT_ESCAPE 33513 #define ID_OBJECTMODIFY_SETAREA 33514 #define ID_OBJECTMODIFY_SETHEIGHT 33515 #define ID_OBJECTMODIFY_FREEZE 33517 #define ID_OBJECTMODIFY_UNFREEZE 33518 -#define ID_SELECT_AXIS_XY 33520 -#define ID_SELECT_AXIS_X 33521 -#define ID_SELECT_AXIS_Y 33522 -#define ID_SELECT_AXIS_Z 33523 #define ID_UNDO 33524 #define ID_EDIT_CLONE 33525 #define ID_SELECTION_SAVE 33527 @@ -162,7 +155,6 @@ #define ID_EDIT_LEVELDATA 33542 #define ID_FILE_EDITEDITORINI 33543 #define ID_FILE_EDITLOGFILE 33544 -#define ID_SELECT_AXIS_TERRAIN 33545 #define ID_PREFERENCES 33546 #define ID_RELOAD_GEOMETRY 33549 #define ID_REDO 33550 @@ -214,7 +206,6 @@ #define ID_TV_NEXTKEY 33603 #define ID_PLAY_LOOP 33607 #define ID_TERRAIN 33611 -#define ID_OBJECTMODIFY_ALIGNTOGRID 33619 #define ID_PANEL_VEG_EXPORT 33672 #define ID_PANEL_VEG_IMPORT 33673 #define ID_PANEL_VEG_DISTRIBUTE 33674 @@ -227,7 +218,6 @@ #define ID_PANEL_VEG_ADDCATEGORY 33682 #define ID_PANEL_VEG_RENAMECATEGORY 33683 #define ID_PANEL_VEG_REMOVECATEGORY 33684 -#define ID_SELECT_AXIS_SNAPTOALL 33685 #define ID_TOOLS_PREFERENCES 33691 #define ID_EDIT_INVERTSELECTION 33692 #define ID_TOOLTERRAINMODIFY_SMOOTH 33695 @@ -275,13 +265,11 @@ #define ID_GAME_PC_ENABLEMEDIUMSPEC 33961 #define ID_GAME_PC_ENABLEHIGHSPEC 33962 #define ID_GAME_PC_ENABLEVERYHIGHSPEC 33963 -#define ID_MODIFY_ALIGNOBJTOSURF 33968 #define ID_PANEL_VEG_CREATE_SEL 33990 #define ID_TOOLS_UPDATEPROCEDURALVEGETATION 33999 #define ID_DISPLAY_GOTOPOSITION 34004 #define ID_PHYSICS_SIMULATEOBJECTS 34007 #define ID_TERRAIN_TEXTURE_EXPORT 34008 -#define ID_DISPLAY_SETVECTOR 34010 #define ID_TV_SEQUENCE_NEW 34049 #define ID_TV_MODE_DOPESHEET 34052 #define ID_VIEW_LAYOUTS 34053 @@ -405,7 +393,6 @@ #define ID_TOOLBAR_WIDGET_FIRST 50003 #define ID_TOOLBAR_WIDGET_UNDO 50003 #define ID_TOOLBAR_WIDGET_REDO 50004 -#define ID_TOOLBAR_WIDGET_REF_COORD 50006 #define ID_TOOLBAR_WIDGET_SNAP_ANGLE 50007 #define ID_TOOLBAR_WIDGET_SNAP_GRID 50008 #define ID_TOOLBAR_WIDGET_ENVIRONMENT_MODE 50011 diff --git a/Code/Sandbox/Editor/RotateTool.cpp b/Code/Sandbox/Editor/RotateTool.cpp deleted file mode 100644 index e9b12d01af..0000000000 --- a/Code/Sandbox/Editor/RotateTool.cpp +++ /dev/null @@ -1,1059 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "EditorDefs.h" - -#include "RotateTool.h" - -// AzToolsFramework -#include - -// Editor -#include "Objects/SelectionGroup.h" -#include "NullEditTool.h" -#include "Viewport.h" -#include "Grid.h" -#include "ViewManager.h" -#include "Objects/BaseObject.h" - - -// This constant is used with GetScreenScaleFactor and was found experimentally. -static const float kViewDistanceScaleFactor = 0.06f; - -const GUID& CRotateTool::GetClassID() -{ - // {A50E5B95-05B9-41A3-8D8E-BDA3E930A396} - static const GUID guid = { - 0xA50E5B95, 0x05B9, 0x41A3, { 0x8D, 0x8E, 0xBD, 0xA3, 0xE9, 0x30, 0xA3, 0x96 } - }; - return guid; -} - -//! This method returns the human readable name of the class. -//! This method returns Category of this class, Category is specifying where this tool class fits best in create panel. -void CRotateTool::RegisterTool(CRegistrationContext& rc) -{ - rc.pClassFactory->RegisterClass(new CQtViewClass("EditTool.Rotate", "Select", ESYSTEM_CLASS_EDITTOOL)); -} - -CRotateTool::CRotateTool(CBaseObject* pObject, QWidget* parent /*= nullptr*/) - : CObjectMode(parent) - , m_initialViewAxisAngleRadians(0.f) - , m_angleToCursor(0.f) - , m_highlightAxis(AxisNone) - , m_draggingMouse(false) - , m_lastPosition(0, 0) - , m_rotationAngles(0, 0, 0) - , m_object(pObject) - , m_bTransformChanged(false) - , m_totalRotationAngle(0.f) - , m_basisAxisRadius(4.f) - , m_viewAxisRadius(5.f) - , m_arcRotationStepRadians(DEG2RAD(5.f)) -{ - m_axes[AxisX] = RotationDrawHelper::Axis(Col_Red, Col_Yellow); - m_axes[AxisY] = RotationDrawHelper::Axis(Col_Green, Col_Yellow); - m_axes[AxisZ] = RotationDrawHelper::Axis(Col_Blue, Col_Yellow); - m_axes[AxisView] = RotationDrawHelper::Axis(Col_White, Col_Yellow); - - if (m_object) - { - m_object->AddEventListener(this); - } - - GetIEditor()->GetObjectManager()->SetSelectCallback(this); -} - -bool CRotateTool::OnSelectObject(CBaseObject* object) -{ - m_object = object; - if (m_object) - { - m_object->AddEventListener(this); - } - return true; -} - -bool CRotateTool::CanSelectObject([[maybe_unused]] CBaseObject* object) -{ - return true; -} - -void CRotateTool::OnObjectEvent(CBaseObject* object, int event) -{ - if (event == CBaseObject::ON_DELETE || event == CBaseObject::ON_UNSELECT) - { - if (m_object && m_object == object) - { - m_object->RemoveEventListener(this); - m_object = nullptr; - } - } -} - -void CRotateTool::Display(DisplayContext& dc) -{ - if (!m_object) - { - return; - } - - const bool visible = - !m_object->IsHidden() - && !m_object->IsFrozen() - && m_object->IsSelected(); - - if (!visible) - { - GetIEditor()->SetEditTool(new NullEditTool()); - return; - } - - RotationDrawHelper::DisplayContextScope displayContextScope(dc); - m_hc.camera = dc.camera; - m_hc.view = dc.view; - m_hc.b2DViewport = static_cast(dc.view)->GetType() != ET_ViewportCamera; - dc.SetLineWidth(m_lineThickness); - - // Calculate the screen space position from which we cast a ray (center of viewport). - int viewportWidth = 0; - int viewportHeight = 0; - dc.view->GetDimensions(&viewportWidth, &viewportHeight); - m_hc.point2d = QPoint(viewportWidth / 2, viewportHeight / 2); - - // Calculate the ray from the camera position to the selection. - dc.view->ViewToWorldRay(m_hc.point2d, m_hc.raySrc, m_hc.rayDir); - - Matrix34 objectTransform = GetTransform(GetIEditor()->GetReferenceCoordSys(), dc.view); - - AffineParts ap; - ap.Decompose(objectTransform); - - Vec3 position = ap.pos; - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() > 1) - { - position = selection->GetCenter(); - } - - float screenScale = GetScreenScale(dc.view, dc.camera); - - // X axis arc - Vec3 cameraViewDir = (m_hc.raySrc - position).GetNormalized(); - float cameraAngle = atan2f(cameraViewDir.y, cameraViewDir.x); - m_axes[AxisX].Draw(dc, position, ap.rot.GetColumn0(), cameraAngle, m_arcRotationStepRadians, m_basisAxisRadius, m_highlightAxis == AxisX, m_object, screenScale); - - // Y axis arc - cameraAngle = atan2f(-cameraViewDir.z, cameraViewDir.x); - m_axes[AxisY].Draw(dc, position, ap.rot.GetColumn1(), cameraAngle, m_arcRotationStepRadians, m_basisAxisRadius, m_highlightAxis == AxisY, m_object, screenScale); - - // View direction axis - Vec3 cameraPos = dc.camera->GetPosition(); - - Vec3 axis = cameraPos - position; - axis.NormalizeSafe(); - - // Z axis arc - cameraAngle = atan2f(axis.y, axis.x); - m_axes[AxisZ].Draw(dc, position, objectTransform.GetColumn2().GetNormalized(), cameraAngle, m_arcRotationStepRadians, m_basisAxisRadius, m_highlightAxis == AxisZ, m_object, screenScale); - - // FIXME: currently, rotating multiple selections using the view axis may result in severe rotation artifacts, it's necessary to make sure - // the calculated rotation angle is smooth. - if (!m_hc.b2DViewport && selection->GetCount() == 1 || m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - // Draw view direction axis - dc.SetColor(m_highlightAxis == AxisView ? Col_Yellow : Col_White); - - cameraViewDir = m_hc.camera->GetViewdir().normalized(); - dc.DrawArc(position, m_viewAxisRadius * GetScreenScale(dc.view, dc.camera), 0, 360.f, RAD2DEG(m_arcRotationStepRadians), cameraViewDir); - } - - // Draw angle decorator - if (RotationControlConfiguration::Get().RotationControl_DrawDecorators) - { - DrawAngleDecorator(dc); - } - - // Display total rotation angle in degrees. - if (!m_hc.b2DViewport && fabs(m_totalRotationAngle) > FLT_EPSILON) - { - QString label; - label = QString::number(RAD2DEG(m_totalRotationAngle), 'f', 2); - - const float textScale = 1.5f; - const ColorF textBackground = ColorF(0.2f, 0.2f, 0.2f, 0.6f); - - if (m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - dc.DrawTextLabel(ap.pos, textScale, label.toUtf8().data()); - } - else - { - dc.DrawTextOn2DBox(ap.pos, label.toUtf8().data(), textScale, Col_White, textBackground); - } - } - - // Draw debug diagnostics - if (RotationControlConfiguration::Get().RotationControl_DebugHitTesting) - { - DrawHitTestGeometry(dc, m_hc); - } - - // Draw debug tracking of the view direction angle - if (RotationControlConfiguration::Get().RotationControl_AngleTracking) - { - DrawViewDirectionAngleTracking(dc, m_hc); - } -} - -void CRotateTool::DrawAngleDecorator(DisplayContext& dc) -{ - if (m_highlightAxis == AxisView) - { - //Vec3 cameraViewDir = dc.view->GetViewTM().GetColumn1().GetNormalized(); - Vec3 cameraViewDir = dc.camera->GetViewMatrix().GetColumn1().GetNormalized(); //Get the viewDir from the camera instead of from the view - // FIXME: The angle and sweep calculation here is incorrect. - float cameraAngle = atan2f(cameraViewDir.y, -cameraViewDir.x); - float angleDelta = (m_angleToCursor - g_PI2 * floor(m_initialViewAxisAngleRadians / g_PI2)) - (m_initialViewAxisAngleRadians - (cameraAngle - (g_PI / 2))); - - RotationDrawHelper::AngleDecorator::Draw(dc, m_object->GetWorldPos(), cameraViewDir, m_initialViewAxisAngleRadians, angleDelta, m_arcRotationStepRadians, m_viewAxisRadius, GetScreenScale(dc.view, dc.camera)); - } - else - { - if (fabs(m_totalRotationAngle) > FLT_EPSILON) - { - float screenScale = GetScreenScale(dc.view, dc.camera); - switch (m_highlightAxis) - { - case AxisX: - RotationDrawHelper::AngleDecorator::Draw(dc, m_object->GetWorldPos(), m_object->GetRotation().GetColumn0(), m_initialViewAxisAngleRadians, m_totalRotationAngle, m_arcRotationStepRadians, m_basisAxisRadius, screenScale); - break; - case AxisY: - RotationDrawHelper::AngleDecorator::Draw(dc, m_object->GetWorldPos(), m_object->GetRotation().GetColumn1(), m_initialViewAxisAngleRadians, m_totalRotationAngle, m_arcRotationStepRadians, m_basisAxisRadius, screenScale); - break; - case AxisZ: - RotationDrawHelper::AngleDecorator::Draw(dc, m_object->GetWorldPos(), m_object->GetRotation().GetColumn2(), m_initialViewAxisAngleRadians, m_totalRotationAngle, m_arcRotationStepRadians, m_basisAxisRadius, screenScale); - break; - default: - break; - } - } - } -} - -bool CRotateTool::HitTest(CBaseObject* object, HitContext& hc) -{ - if (!m_object) - { - return CObjectMode::HitTest(object, hc); - } - m_hc = hc; - m_highlightAxis = AxisNone; - - float screenScale = GetScreenScale(hc.view, hc.camera); - - // Determine intersection with the axis view direction. - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (!m_hc.b2DViewport && selection->GetCount() == 1 || m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - if (m_axes[AxisView].HitTest(object, hc, m_viewAxisRadius, m_arcRotationStepRadians, hc.camera ? hc.camera->GetViewMatrix().GetInverted().GetColumn1() : hc.view->GetViewTM().GetColumn1(), screenScale)) - { - m_highlightAxis = AxisView; - GetIEditor()->SetAxisConstraints(AXIS_XYZ); - return true; - } - } - - // Determine any intersection with a major axis. - AffineParts ap; - ap.Decompose(GetTransform(GetIEditor()->GetReferenceCoordSys(), hc.view)); - - if (m_axes[AxisX].HitTest(object, hc, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn0(), screenScale)) - { - m_highlightAxis = AxisX; - GetIEditor()->SetAxisConstraints(AXIS_X); - return true; - } - - if (m_axes[AxisY].HitTest(object, hc, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn1(), screenScale)) - { - m_highlightAxis = AxisY; - GetIEditor()->SetAxisConstraints(AXIS_Y); - return true; - } - - if (m_axes[AxisZ].HitTest(object, hc, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn2(), screenScale)) - { - m_highlightAxis = AxisZ; - GetIEditor()->SetAxisConstraints(AXIS_Z); - return true; - } - - return false; -} - -void CRotateTool::DeleteThis() -{ - delete this; -} - -bool CRotateTool::OnKeyDown([[maybe_unused]] CViewport* view, uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) -{ - if (nChar == VK_ESCAPE) - { - GetIEditor()->GetObjectManager()->ClearSelection(); - return true; - } - return false; -} - -Matrix34 CRotateTool::GetTransform(RefCoordSys referenceCoordinateSystem, IDisplayViewport* view) -{ - Matrix34 objectTransform = Matrix34::CreateIdentity(); - if (m_object) - { - switch (referenceCoordinateSystem) - { - case COORDS_VIEW: - if (view) - { - objectTransform = view->GetViewTM(); - } - objectTransform.SetTranslation(m_object->GetWorldTM().GetTranslation()); - break; - case COORDS_LOCAL: - objectTransform = m_object->GetWorldTM(); - break; - case COORDS_PARENT: - if (m_object->GetParent()) - { - Matrix34 parentTM = m_object->GetParent()->GetWorldTM(); - parentTM.SetTranslation(m_object->GetWorldTM().GetTranslation()); - objectTransform = parentTM; - } - else - { - objectTransform.SetTranslation(m_object->GetWorldTM().GetTranslation()); - } - break; - case COORDS_WORLD: - objectTransform.SetTranslation(m_object->GetWorldTM().GetTranslation()); - break; - } - } - return objectTransform; -} - -float CRotateTool::CalculateOrientation(const QPoint& p1, const QPoint& p2, const QPoint& p3) -{ - // Source: https://www.geeksforgeeks.org/orientation-3-ordered-points/ - float c = (p2.y() - p1.y()) * (p3.x() - p2.x()) - (p3.y() - p2.y()) * (p2.x() - p1.x()); - return c > 0 ? 1.0f : -1.0f; -} - -CRotateTool::~CRotateTool() -{ - if (m_object) - { - m_object->RemoveEventListener(this); - } - GetIEditor()->GetObjectManager()->SetSelectCallback(nullptr); -} - -bool CRotateTool::OnLButtonDown(CViewport* view, int nFlags, const QPoint& p) -{ - QPoint point = p; - m_hc.view = view; - m_hc.b2DViewport = view->GetType() != ET_ViewportCamera; - m_hc.point2d = point; - if (nFlags == OBJFLAG_IS_PARTICLE) - { - view->setHitcontext(point, m_hc.raySrc, m_hc.rayDir); - } - else - { - view->ViewToWorldRay(point, m_hc.raySrc, m_hc.rayDir); - } - - if (m_hc.object && m_hc.object != m_object) - { - GetIEditor()->ClearSelection(); - return CObjectMode::OnLButtonDown(view, nFlags, point); - } - - if (m_highlightAxis != AxisNone) - { - view->BeginUndo(); - view->CaptureMouse(); - view->SetCurrentCursor(STD_CURSOR_ROTATE); - - m_draggingMouse = true; - - // Store the starting drag angle when we first click the mouse, we will need this to know - // how much of the rotation we need to apply. - if (m_highlightAxis == AxisView) - { - Vec3 cameraViewDir = m_hc.camera->GetViewdir().GetNormalized(); - float cameraAngle = atan2f(cameraViewDir.y, -cameraViewDir.x); - m_initialViewAxisAngleRadians = m_angleToCursor - cameraAngle - (g_PI / 2); - m_initialViewAxisAngleRadians -= static_cast(g_PI); - } - - m_lastPosition = point; - m_rotationAngles = Ang3(0, 0, 0); - - AzToolsFramework::EntityIdList selectedEntities; - AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( - selectedEntities, - &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities); - - AzToolsFramework::EditorTransformChangeNotificationBus::Broadcast( - &AzToolsFramework::EditorTransformChangeNotificationBus::Events::OnEntityTransformChanging, - selectedEntities); - - return true; - } - - return CObjectMode::OnLButtonDown(view, nFlags, point); -} - -bool CRotateTool::OnLButtonUp(CViewport* view, int nFlags, const QPoint& p) -{ - QPoint point = p; - if (nFlags == OBJFLAG_IS_PARTICLE) - { - view->setHitcontext(point, m_hc.raySrc, m_hc.rayDir); - } - else - { - view->ViewToWorldRay(point, m_hc.raySrc, m_hc.rayDir); - } - - if (m_draggingMouse) - { - // We are no longer dragging the mouse, so we will release it and reset any state variables. - { - AzToolsFramework::ScopedUndoBatch undo("Rotate"); - } - view->AcceptUndo("Rotate Selection"); - view->ReleaseMouse(); - view->SetCurrentCursor(STD_CURSOR_DEFAULT); - - m_draggingMouse = false; - m_totalRotationAngle = 0.f; - m_initialViewAxisAngleRadians = 0.f; - m_angleToCursor = 0.f; - - // Apply the transform changes to the selection. - if (m_bTransformChanged) - { - CSelectionGroup* pSelection = GetIEditor()->GetSelection(); - if (pSelection) - { - pSelection->FinishChanges(); - } - - m_bTransformChanged = false; - - view->ResetSelectionRegion(); - // Reset selected rectangle. - view->SetSelectionRectangle(QRect()); - view->SetAxisConstrain(GetIEditor()->GetAxisConstrains()); - - AzToolsFramework::EntityIdList selectedEntities; - AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult( - selectedEntities, - &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities); - - AzToolsFramework::EditorTransformChangeNotificationBus::Broadcast( - &AzToolsFramework::EditorTransformChangeNotificationBus::Events::OnEntityTransformChanged, - selectedEntities); - } - } - - return CObjectMode::OnLButtonUp(view, nFlags, point); -} - -bool CRotateTool::OnMouseMove(CViewport* view, int nFlags, const QPoint& p) -{ - QPoint point = p; - if (!m_object) - { - return CObjectMode::OnMouseMove(view, nFlags, point); - } - - // Prevent the opening of the context menu during a mouse move. - m_openContext = false; - - // We calculate the mouse drag direction vector's angle from the object to the mouse position. - QPoint objectCenter; - if (nFlags != OBJFLAG_IS_PARTICLE) - { - objectCenter = view->WorldToView(GetIEditor()->GetSelection()->GetCenter()); - } - else - if (parent() && parent()->isWidgetType()) - { - QWidget *wParent = static_cast(parent()); - - // HACK: This is only valid for the particle editor and needs refactored. - const QRect rect = wParent->contentsRect(); - objectCenter = view->WorldToViewParticleEditor(m_object->GetWorldPos(), rect.width(), rect.height()); - } - - Vec2 dragDirection = Vec2(point.x() - objectCenter.x(), point.y() - objectCenter.y()); - dragDirection.Normalize(); - - float angleToCursor = (atan2f(dragDirection.y, dragDirection.x)); - m_angleToCursor = angleToCursor - g_PI2 * floor(angleToCursor / g_PI2); - - if (m_draggingMouse) - { - GetIEditor()->RestoreUndo(); - - view->SetCurrentCursor(STD_CURSOR_ROTATE); - - RefCoordSys referenceCoordSys = GetIEditor()->GetReferenceCoordSys(); - - if (m_highlightAxis == AxisView) - { - // Calculate the angular difference between the starting rotation angle, taking into account the camera's angle to ensure a smooth rotation. - Vec3 cameraViewDir = m_hc.camera->GetViewdir(); - float cameraAngle = atan2f(cameraViewDir.y, cameraViewDir.x); - float angleDelta = (m_angleToCursor - g_PI2 * floor(m_initialViewAxisAngleRadians / g_PI2)) - (m_initialViewAxisAngleRadians - (cameraAngle - (g_PI / 2))); - - // Snap the angle is necessary - angleDelta = view->GetViewManager()->GetGrid()->SnapAngle(RAD2DEG(angleDelta)); - - if (nFlags != OBJFLAG_IS_PARTICLE) - { - Matrix34 viewRotation = Matrix34::CreateRotationAA(DEG2RAD(angleDelta), cameraViewDir); - GetIEditor()->GetSelection()->Rotate(viewRotation, COORDS_WORLD); - } - else - { - Quat quatRotation = Quat::CreateRotationAA(DEG2RAD(angleDelta), cameraViewDir); - m_object->SetRotation(quatRotation); - } - - m_bTransformChanged = true; - } - else - if (m_highlightAxis != AxisNone) - { - float distanceMoved = (point - m_lastPosition).manhattanLength(); // screen-space distance dragged - float distanceToCenter = (m_lastPosition - objectCenter).manhattanLength(); // screen-space distance to object center - float roationDelta = RAD2DEG(atan2f(distanceMoved, distanceToCenter)); // unsigned rotation angle - float orientation = CalculateOrientation(objectCenter, m_lastPosition, point); // Calculate if rotation dragging gizmo clockwise or counter-clockwise - - m_lastPosition = point; - - // Calculate orientation of the object's axis towards camera - Vec3 directionToObject = (GetIEditor()->GetSelection()->GetCenter() - m_hc.camera->GetMatrix().GetTranslation()).normalize(); - - float directionX = 1.0f; - float directionY = 1.0f; - float directionZ = 1.0f; - - switch (referenceCoordSys) - { - case COORDS_LOCAL: - directionX = directionToObject.Dot(m_object->GetWorldTM().GetColumn0()) > 0 ? -1.0f : 1.0f; - directionY = directionToObject.Dot(m_object->GetWorldTM().GetColumn1()) > 0 ? -1.0f : 1.0f; - directionZ = directionToObject.Dot(m_object->GetWorldTM().GetColumn2()) > 0 ? -1.0f : 1.0f; - break; - case COORDS_PARENT: - if (m_object->GetParent()) - { - directionX = directionToObject.Dot(m_object->GetParent()->GetWorldTM().GetColumn0()) > 0 ? -1.0f : 1.0f; - directionY = directionToObject.Dot(m_object->GetParent()->GetWorldTM().GetColumn1()) > 0 ? -1.0f : 1.0f; - directionZ = directionToObject.Dot(m_object->GetParent()->GetWorldTM().GetColumn2()) > 0 ? -1.0f : 1.0f; - } - else - { - directionX = directionToObject.Dot(m_object->GetWorldTM().GetColumn0()) > 0 ? -1.0f : 1.0f; - directionY = directionToObject.Dot(m_object->GetWorldTM().GetColumn1()) > 0 ? -1.0f : 1.0f; - directionZ = directionToObject.Dot(m_object->GetWorldTM().GetColumn2()) > 0 ? -1.0f : 1.0f; - } - break; - case COORDS_VIEW: - case COORDS_WORLD: - directionX = directionToObject.Dot(Vec3(1, 0, 0)) > 0 ? -1.0f : 1.0f; - directionY = directionToObject.Dot(Vec3(0, 1, 0)) > 0 ? -1.0f : 1.0f; - directionZ = directionToObject.Dot(Vec3(0, 0, 1)) > 0 ? -1.0f : 1.0f; - break; - } - - switch (m_highlightAxis) - { - case AxisX: - m_rotationAngles.x += roationDelta * directionX * orientation; - break; - case AxisY: - m_rotationAngles.y += roationDelta * directionY * orientation; - break; - case AxisZ: - m_rotationAngles.z += roationDelta * directionZ * orientation; - break; - default: - break; - } - - // Snap the angle if necessary - m_rotationAngles = view->GetViewManager()->GetGrid()->SnapAngle(m_rotationAngles); - - // Compute the total amount rotated - Vec3 vDragValue = Vec3(m_rotationAngles); - m_totalRotationAngle = DEG2RAD(vDragValue.len()); - - // Apply the rotation - if (nFlags != OBJFLAG_IS_PARTICLE) - { - GetIEditor()->GetSelection()->Rotate(m_rotationAngles, referenceCoordSys); - } - else - { - Quat currentRotation = (m_object->GetRotation()); - Quat rotateTM = currentRotation * Quat::CreateRotationXYZ(DEG2RAD(-m_rotationAngles / 50.0f)); - m_object->SetRotation(rotateTM); - } - - m_bTransformChanged = fabs(m_totalRotationAngle) > FLT_EPSILON; - } - } - else - { - // If we are not yet dragging the mouse, do the hit testing to highlight the axis the mouse is over. - m_hc.view = view; - m_hc.b2DViewport = view->GetType() != ET_ViewportCamera; - m_hc.point2d = point; - - if (nFlags != OBJFLAG_IS_PARTICLE) - { - view->ViewToWorldRay(point, m_hc.raySrc, m_hc.rayDir); - } - else - { - view->setHitcontext(point, m_hc.raySrc, m_hc.rayDir); - } - - if (HitTest(m_object, m_hc)) - { - // Display a cursor that makes it clear to the user that he is over an axis that can be rotated. - view->SetCurrentCursor(STD_CURSOR_ROTATE); - } - else - { - // Nothing has been hit, reset the cursor back to default in case it was changed previously. - view->SetCurrentCursor(STD_CURSOR_DEFAULT); - } - } - - // We always consider the rotation tool's OnMove event handled - return true; -} - -float CRotateTool::GetScreenScale(IDisplayViewport* view, CCamera* camera /*=nullptr*/) -{ - Matrix34 objectTransform = GetTransform(GetIEditor()->GetReferenceCoordSys(), view); - - AffineParts ap; - ap.Decompose(objectTransform); - - if (m_object && m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - return view->GetScreenScaleFactor(*camera, ap.pos) * kViewDistanceScaleFactor; - } - - return static_cast(view)->GetScreenScaleFactor(ap.pos) * kViewDistanceScaleFactor; -} - -void CRotateTool::DrawHitTestGeometry(DisplayContext& dc, HitContext& hc) -{ - AffineParts ap; - ap.Decompose(GetTransform(GetIEditor()->GetReferenceCoordSys(), dc.view)); - - Vec3 position = ap.pos; - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() > 1 && !m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - position = selection->GetCenter(); - } - - float screenScale = GetScreenScale(dc.view, dc.camera); - - // Draw debug test surface for each axis. - m_axes[AxisX].DebugDrawHitTestSurface(dc, hc, position, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn0(), screenScale); - m_axes[AxisY].DebugDrawHitTestSurface(dc, hc, position, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn1(), screenScale); - m_axes[AxisZ].DebugDrawHitTestSurface(dc, hc, position, m_basisAxisRadius, m_arcRotationStepRadians, ap.rot.GetColumn2(), screenScale); - - // We don't render the view axis rotation for multiple selection. - if (!hc.b2DViewport && selection->GetCount() == 1) - { - Vec3 cameraViewDir = hc.view->GetViewTM().GetColumn1().GetNormalized(); - m_axes[AxisView].DebugDrawHitTestSurface(dc, hc, position, m_viewAxisRadius, m_arcRotationStepRadians, cameraViewDir, screenScale); - } -} - -void CRotateTool::DrawViewDirectionAngleTracking(DisplayContext& dc, HitContext& hc) -{ - Vec3 a; - Vec3 b; - - // Calculate a basis for the camera view direction. - Vec3 cameraViewDir = hc.view->GetViewTM().GetColumn1().GetNormalized(); - GetBasisVectors(cameraViewDir, a, b); - - // Calculates the camera view direction angle. - float angle = m_angleToCursor; - float cameraAngle = atan2f(cameraViewDir.y, -cameraViewDir.x); - - // Ensures the angle remains camera aligned. - angle -= cameraAngle - (g_PI / 2); - - // The position will be either the object's center or the selection's center. - Vec3 position = GetTransform(GetIEditor()->GetReferenceCoordSys(), dc.view).GetTranslation(); - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() > 1 && !m_object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - position = selection->GetCenter(); - } - - float screenScale = GetScreenScale(dc.view, dc.camera); - - const float cosAngle = cos(angle); - const float sinAngle = sin(angle); - - // The resulting position will be in a circular orientation based on the resulting angle. - Vec3 p0; - p0.x = position.x + (cosAngle * a.x + sinAngle * b.x) * m_viewAxisRadius * screenScale; - p0.y = position.y + (cosAngle * a.y + sinAngle * b.y) * m_viewAxisRadius * screenScale; - p0.z = position.z + (cosAngle * a.z + sinAngle * b.z) * m_viewAxisRadius * screenScale; - - const float ballRadius = 0.1f * screenScale; - dc.SetColor(Col_Magenta); - dc.DrawBall(p0, ballRadius); -} - -namespace RotationDrawHelper -{ - Axis::Axis(const ColorF& defaultColor, const ColorF& highlightColor) - { - m_colors[StateDefault] = defaultColor; - m_colors[StateHighlight] = highlightColor; - } - - void Axis::Draw(DisplayContext& dc, const Vec3& position, const Vec3& axis, float angleRadians, float angleStepRadians, float radius, bool highlighted, CBaseObject* object, float screenScale) - { - if (static_cast(dc.view)->GetType() != ET_ViewportCamera || object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - bool set = dc.SetDrawInFrontMode(true); - - // Draw the front facing arc - dc.SetColor(!highlighted ? m_colors[StateDefault] : m_colors[StateHighlight]); - dc.DrawArc(position, radius * screenScale, 0.f, 360.f, RAD2DEG(angleStepRadians), axis); - - dc.SetDrawInFrontMode(set); - } - else - { - // Draw the front facing arc - dc.SetColor(!highlighted ? m_colors[StateDefault] : m_colors[StateHighlight]); - dc.DrawArc(position, radius * screenScale, RAD2DEG(angleRadians) - 90.f, 180.f, RAD2DEG(angleStepRadians), axis); - - // Draw the back side - dc.SetColor(!highlighted ? Col_Gray : m_colors[StateHighlight]); - dc.DrawArc(position, radius * screenScale, RAD2DEG(angleRadians) + 90.f, 180.f, RAD2DEG(angleStepRadians), axis); - } - - static bool drawAxisMidPoint = false; - if (drawAxisMidPoint) - { - const float kBallRadius = 0.085f; - Vec3 a; - Vec3 b; - GetBasisVectors(axis, a, b); - - float cosAngle = cos(angleRadians); - float sinAngle = sin(angleRadians); - - Vec3 offset; - offset.x = position.x + (cosAngle * a.x + sinAngle * b.x) * screenScale * radius; - offset.y = position.y + (cosAngle * a.y + sinAngle * b.y) * screenScale * radius; - offset.z = position.z + (cosAngle * a.z + sinAngle * b.z) * screenScale * radius; - - dc.SetColor(!highlighted ? m_colors[StateDefault] : m_colors[StateHighlight]); - dc.DrawBall(offset, kBallRadius * screenScale); - } - } - - void Axis::GenerateHitTestGeometry([[maybe_unused]] HitContext& hc, const Vec3& position, float radius, float angleStepRadians, const Vec3& axis, float screenScale) - { - m_vertices.clear(); - - // The number of vertices relies on the angleStepRadians, the smaller the angle, the higher the vertex count. - int numVertices = static_cast(std::ceil(g_PI2 / angleStepRadians)); - - Vec3 a; - Vec3 b; - GetBasisVectors(axis, a, b); - - // The geometry is calculated by computing a circle aligned to the specified axis. - float angle = 0.f; - for (int i = 0; i < numVertices; ++i) - { - float cosAngle = cos(angle); - float sinAngle = sin(angle); - - Vec3 p; - p.x = position.x + (cosAngle * a.x + sinAngle * b.x) * radius * screenScale; - p.y = position.y + (cosAngle * a.y + sinAngle * b.y) * radius * screenScale; - p.z = position.z + (cosAngle * a.z + sinAngle * b.z) * radius * screenScale; - m_vertices.push_back(p); - - angle += angleStepRadians; - } - } - - bool Axis::IntersectRayWithQuad(const Ray& ray, Vec3 quad[4], Vec3& contact) - { - contact = Vec3(); - - // Tests ray vs. two quads, the front facing quad and a back facing quad. - // will return true if an intersection occurs and the world space position of the contact. - return (Intersect::Ray_Triangle(ray, quad[0], quad[1], quad[2], contact) || Intersect::Ray_Triangle(ray, quad[0], quad[2], quad[3], contact) || - Intersect::Ray_Triangle(ray, quad[0], quad[2], quad[1], contact) || Intersect::Ray_Triangle(ray, quad[0], quad[3], quad[2], contact)); - } - - bool Axis::HitTest(CBaseObject* object, HitContext& hc, float radius, float angleStepRadians, const Vec3& axis, float screenScale) - { - AffineParts ap; - ap.Decompose(object->GetWorldTM()); - - Vec3 position = ap.pos; - - CSelectionGroup* selection = GetIEditor()->GetSelection(); - if (selection->GetCount() > 1 && !object->CheckFlags(OBJFLAG_IS_PARTICLE)) - { - position = selection->GetCenter(); - } - - // Generate intersection testing geometry - GenerateHitTestGeometry(hc, position, radius, angleStepRadians, axis, screenScale); - - Ray ray; - ray.origin = hc.raySrc; - ray.direction = hc.rayDir; - - // Calculate the face normal with the first two vertices in the intersection geometry. - Vec3 vdir0 = (m_vertices[0] - m_vertices[1]).GetNormalized(); - Vec3 vdir1 = (m_vertices[2] - m_vertices[1]).GetNormalized(); - - Vec3 normal; - if (!hc.b2DViewport) - { - normal = hc.view->GetViewTM().GetColumn1(); - } - else - { - normal = hc.view->GetConstructionPlane()->n; - } - - float shortestDistance = std::numeric_limits::max(); - size_t numVertices = m_vertices.size(); - for (size_t i = 0; i < numVertices; ++i) - { - const Vec3& v0 = m_vertices[i]; - const Vec3& v1 = m_vertices[(i + 1) % numVertices]; - Vec3 right = (v0 - v1).Cross(normal).GetNormalized() * screenScale * m_hitTestWidth; - - // Calculates the quad vertices aligned to the face normal. - Vec3 quad[4]; - quad[0] = v0 + right; - quad[1] = v1 + right; - quad[2] = v1 - right; - quad[3] = v0 - right; - - Vec3 contact; - if (IntersectRayWithQuad(ray, quad, contact)) - { - Vec3 intersectionPoint; - if (PointToLineDistance(v0, v1, contact, intersectionPoint)) - { - // Ensure the intersection is within the quad's extents - float distanceToIntersection = intersectionPoint.GetDistance(contact); - if (distanceToIntersection < shortestDistance) - { - shortestDistance = distanceToIntersection; - } - } - } - } - - // if shortestDistance is less than the maximum possible distance, we have an intersection. - if (shortestDistance < std::numeric_limits::max() - FLT_EPSILON) - { - hc.object = object; - hc.dist = shortestDistance; - return true; - } - - return false; - } - - void Axis::DebugDrawHitTestSurface(DisplayContext& dc, HitContext& hc, const Vec3& position, float radius, float angleStepRadians, const Vec3& axis, float screenScale) - { - // Generate the geometry for rendering. - GenerateHitTestGeometry(hc, position, radius, angleStepRadians, axis, screenScale); - - // Calculate the face normal with the first two vertices in the intersection geometry. - Vec3 vdir0 = (m_vertices[0] - m_vertices[1]).GetNormalized(); - Vec3 vdir1 = (m_vertices[2] - m_vertices[1]).GetNormalized(); - - Vec3 normal; - if (!hc.b2DViewport) - { - normal = hc.view->GetViewTM().GetColumn1(); - } - else - { - normal = hc.view->GetConstructionPlane()->n; - } - - float shortestDistance = std::numeric_limits::max(); - - Ray ray; - ray.origin = hc.raySrc; - ray.direction = hc.rayDir; - - size_t numVertices = m_vertices.size(); - for (size_t i = 0; i < numVertices; ++i) - { - const Vec3& v0 = m_vertices[i]; - const Vec3& v1 = m_vertices[(i + 1) % numVertices]; - Vec3 right = (v0 - v1).Cross(normal).GetNormalized() * screenScale * m_hitTestWidth; - - // Calculates the quad vertices aligned to the face normal. - Vec3 quad[4]; - quad[0] = v0 + right; - quad[1] = v1 + right; - quad[2] = v1 - right; - quad[3] = v0 - right; - - // Draw double sided quad to ensure it is always visible regardless of camera orientation. - dc.DrawQuad(quad[0], quad[1], quad[2], quad[3]); - dc.DrawQuad(quad[3], quad[2], quad[1], quad[0]); - - Vec3 contact; - if (IntersectRayWithQuad(ray, quad, contact)) - { - Vec3 intersectionPoint; - if (PointToLineDistance(v0, v1, contact, intersectionPoint)) - { - // Ensure the intersection is within the quad's extents - float distanceToIntersection = intersectionPoint.GetDistance(contact); - if (distanceToIntersection < shortestDistance) - { - shortestDistance = distanceToIntersection; - - // Highlight the quad at which an intersection occurred. - auto c = dc.GetColor(); - dc.SetColor(Col_Red); - dc.DrawQuad(quad[0], quad[1], quad[2], quad[3]); - dc.DrawQuad(quad[3], quad[2], quad[1], quad[0]); - dc.SetColor(c); - } - } - } - } - } - - - namespace AngleDecorator - { - void Draw(DisplayContext& dc, const Vec3& position, const Vec3& axisToAlign, float startAngleRadians, float sweepAngleRadians, float stepAngleRadians, float radius, float screenScale) - { - float angle = startAngleRadians; - - if (fabs(sweepAngleRadians) < FLT_EPSILON || sweepAngleRadians < stepAngleRadians) - { - return; - } - - if (sweepAngleRadians > g_PI) - { - sweepAngleRadians = g_PI - (fabs(sweepAngleRadians - g_PI)); - stepAngleRadians = -stepAngleRadians; - } - - Vec3 a; - Vec3 b; - GetBasisVectors(axisToAlign, a, b); - - float cosAngle = cos(angle); - float sinAngle = sin(angle); - - // Pre-calculate the first vertex, this is useful for rendering the first handle ball. - Vec3 p0; - p0.x = position.x + (cosAngle * a.x + sinAngle * b.x) * radius * screenScale; - p0.y = position.y + (cosAngle * a.y + sinAngle * b.y) * radius * screenScale; - p0.z = position.z + (cosAngle * a.z + sinAngle * b.z) * radius * screenScale; - - const float ballRadius = 0.1f * screenScale; - - // TODO: colors should be configurable properties - dc.SetColor(0.f, 1.f, 0.f, 1.f); - dc.DrawBall(p0, ballRadius); - - float alpha = 0.5f; - dc.SetColor(0.8f, 0.8f, 0.8f, 0.5f); - - // Number of vertices is defined by stepAngleRadians, the smaller the step the higher vertex count. - int numVertices = static_cast(fabs(sweepAngleRadians / stepAngleRadians)); - if (numVertices >= 2) - { - Vec3 p1; - for (int i = 0; i < numVertices; ++i) - { - // We pre-calculated the first vertex, so we can advance the angle - angle += stepAngleRadians; - - const float cosAngle2 = cos(angle); - const float sinAngle2 = sin(angle); - - p1.x = position.x + (cosAngle2 * a.x + sinAngle2 * b.x) * radius * screenScale; - p1.y = position.y + (cosAngle2 * a.y + sinAngle2 * b.y) * radius * screenScale; - p1.z = position.z + (cosAngle2 * a.z + sinAngle2 * b.z) * radius * screenScale; - - // Draws a triangle from the object's position to p0 and p1. - dc.SetColor(0.8f, 0.8f, 0.8f, alpha); - dc.DrawTri(position, p0, p1); - - alpha += 0.5f * (i / numVertices); - p0 = p1; - } - - // Draw the end handle ball. - dc.SetColor(1.f, 0.f, 0.f, 1.f); - dc.DrawBall(p1, ballRadius); - } - } - } -} - -RotationControlConfiguration::RotationControlConfiguration() -{ - DefineConstIntCVar(RotationControl_DrawDecorators, 0, VF_NULL, "Toggles the display of the angular decorator."); - DefineConstIntCVar(RotationControl_DebugHitTesting, 0, VF_NULL, "Renders the hit testing geometry used for mouse input control."); - DefineConstIntCVar(RotationControl_AngleTracking, 0, VF_NULL, "Displays a sphere aligned to the mouse cursor direction for debugging."); -} - -#include diff --git a/Code/Sandbox/Editor/RotateTool.h b/Code/Sandbox/Editor/RotateTool.h deleted file mode 100644 index d24ff5ff39..0000000000 --- a/Code/Sandbox/Editor/RotateTool.h +++ /dev/null @@ -1,283 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#ifndef CRYINCLUDE_EDITOR_ROTATETOOL_H -#define CRYINCLUDE_EDITOR_ROTATETOOL_H -#pragma once - -#if !defined(Q_MOC_RUN) -#include "EditTool.h" -#include "IObjectManager.h" -#include "EditMode/ObjectMode.h" -#include "Objects/BaseObject.h" // for CBaseObject::EventListener -#include "Objects/DisplayContext.h" -#include "Include/HitContext.h" -#endif - -//! Provides rendering utilities to support CRotateTool -namespace RotationDrawHelper -{ - //! Circle drawing and hit testing functionality over arbitrary axes - class Axis - { - public: - - //! \param defaultColor Color used to draw the camera aligned portion of the axis. - //! \param highlightColor Color used to draw the circle when it is in focus. - Axis(const ColorF& defaultColor = Col_White, const ColorF& highlightColor = Col_Yellow); - - //! Draws an axis aligned circle. - //! \param dc DisplayContext to use for rendering. - //! \param position World space position used as the center of the circle. - //! \param axis The axis by which to align the circle. - //! \param angleRadians The angle towards which the circle will be highlighted. - //! \param radius The radius of the circle. - //! \param highlighted If true it will draw the circle in the specified highlightColor. - void Draw(DisplayContext& dc, const Vec3& position, const Vec3& axis, float angleRadians, float angleStepRadians, float radius, bool highlighted, CBaseObject* object, float screenScale); - - //! Calculates a hit testing mesh (invisible) used for intersection testing. - //! \param object The object selected if hit testing return true. - //! \param hc The HitContext in which the hit object is set if an intersection is true. - //! \param radius The radius for the axis' circle. - //! \param angleStepRadians The angle for the step used to calculate the circle, a smaller angle results in a higher quality circle. - //! \param axis The axis by which to align the intersection geometry. - //! \param screenScale This is an internal parameter used to deduce the view distance ratio in order to scale the tool. - bool HitTest(CBaseObject* object, HitContext& hc, float radius, float angleStepRadians, const Vec3& axis, float screenScale); - - //! Draws the generated hit testing geometry, good for diagnostics and debugging. - //! \param dc DisplayContext to use for rendering. - //! \param hc The HitContext that contains the view direction raycast. - //! \param position World space position used as the center of the circle. - //! \param radius The radius for the axis' circle. - //! \param angleStepRadians The angle for the step used to calculate the circle, a smaller angle results in a higher quality circle. - //! \param axis The axis by which to align the intersection geometry. - //! \param screenScale This is an internal parameter used to deduce the view distance ratio in order to scale the tool. - void DebugDrawHitTestSurface(DisplayContext& dc, HitContext& hc, const Vec3& position, float radius, float angleStepRadians, const Vec3& axis, float screenScale); - - protected: - - enum States - { - StateDefault, - StateHighlight, - StateCount - }; - - ColorF m_colors[StateCount]; - - //! Defines the width of the generated hit testing geometry. - float m_hitTestWidth = 0.4f; - - //! Contains the vertices that make up the ring for the intersection testing geometry. - //! \remark Only contains the center positions, quads are generated by calculating the four vertices offset by m_hitTestWidth. - std::vector m_vertices; - - //! Generates the world space geometry necessary to perform hit testing. - //! \param hc The HitContext data. - //! \param position The world space position around which the geometry will be centered. - //! \param radius The radius of the ring. - //! \param angleStepRadians The angle for the step used to calculate the circle, a smaller angle results in a higher quality circle. - //! \param axis The axis to which the geometry will be aligned to. - //! \param screenScale This is an internal parameter used to deduce the view distance ratio in order to scale the tool. - void GenerateHitTestGeometry(HitContext& hc, const Vec3& position, float radius, float angleStepRadians, const Vec3& axis, float screenScale); - - //! Performs intersection testing between a ray and both sides of a quad - //! \param ray The ray to test (in world space) - //! \param quad An array of four Vec3 points in world space. - //! \param[out] contact The intersection position in world space at which the intersection occurred. - bool IntersectRayWithQuad(const Ray&ray, Vec3 quad[4], Vec3 & contact); - }; - - //! Provides the means to set and restore DisplayContext settings within a given scope. - class DisplayContextScope - { - public: - DisplayContextScope(DisplayContext& dc) - : m_dc(dc) - { - m_dc.DepthTestOff(); - m_dc.CullOff(); - } - - ~DisplayContextScope() - { - m_dc.DepthTestOn(); - m_dc.CullOn(); - } - - DisplayContext& m_dc; - }; - - //! Helper function that draws the representation of the inner angle of a rotation. - namespace AngleDecorator - { - //! \param dc - //! \param position World space position of the center of the decorator. - //! \param axisToAlign Axis to which the decorator will be aligned to. - //! \param startAngleRadians The starting angle from which the rotation will be performed. - //! \param sweepAngleRadians An angle that represents the sweep of the rotation arc. - //! \param angleStepRadians The angle for the step used to calculate the circle, a smaller angle results in a higher quality circle. - //! \param radius The radius of the decorator. - //! \param screenScale This is an internal parameter used to deduce the view distance ratio in order to scale the tool. - void Draw(DisplayContext& dc, const Vec3& position, const Vec3& axisToAlign, float startAngleRadians, float sweepAngleRadians, float stepAngleRadians, float radius, float screenScale); - } -} - -//! Provides rotation manipulation controls. -class SANDBOX_API CRotateTool - : public CObjectMode - , public IObjectSelectCallback - , public CBaseObject::EventListener -{ - Q_OBJECT -public: - Q_INVOKABLE CRotateTool(CBaseObject* pObject = nullptr, QWidget* parent = nullptr); - virtual ~CRotateTool(); - - static const GUID& GetClassID(); - - // Registration function. - static void RegisterTool(CRegistrationContext& rc); - - void Display(DisplayContext& dc) override; - void DrawObjectHelpers([[maybe_unused]] CBaseObject* pObject, [[maybe_unused]] DisplayContext& dc) override {} - bool HitTest(CBaseObject* pObject, HitContext& hc) override; - void DeleteThis() override; - bool OnLButtonDown(CViewport* view, int nFlags, const QPoint& point) override; - bool OnLButtonUp(CViewport* view, int nFlags, const QPoint& point) override; - bool OnMouseMove(CViewport* view, int nFlags, const QPoint& point) override; - -protected: - - //! Utility to calculate the view distance ratio used to scale the tool. - float GetScreenScale(IDisplayViewport* view, CCamera* camera = nullptr); - - enum Axis - { - AxisNone, - AxisX, //! X axis visualization and hit testing - AxisY, //! Y axis visualization and hit testing - AxisZ, //! Z axis visualization and hit testing - AxisView, //! View direction axis, used to rotate along the vector from the camera to the object. - AxisCount - }; - - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - //! Axis visualization and hit testing - RotationDrawHelper::Axis m_axes[Axis::AxisCount]; - - //! We record the starting angle when we begin to drag an object - float m_initialViewAxisAngleRadians; - - //! The angle from the object's (or selection's) center to the mouse cursor. - float m_angleToCursor; - - //! Specified which axis is currently selected. - Axis m_highlightAxis; - - //! True when we are using the view direction rotation axis. - bool m_viewAxisRotation; - - //! True when the mouse has been pressed, becomes false on release. - bool m_draggingMouse; - - //! The last mouse position on screen when rotating. - QPoint m_lastPosition; - - //! Cumulative rotation angle in degrees. - Ang3 m_rotationAngles; - - //! The selected object. - CBaseObject* m_object; - - //! True if there has been a change in rotation that affects the object. - bool m_bTransformChanged; - - //! Sum of the total rotation angles. - float m_totalRotationAngle; - - //! Radius used to draw the XYZ axes - float m_basisAxisRadius; - - //! Radius used to draw the view direction axis - float m_viewAxisRadius; - - //! Rotation step controls the quality of the axes, a smaller angle represents a higher number of vertices. - float m_arcRotationStepRadians; - - //! Thickness of for the axis line rendering. - float m_lineThickness = 4.f; - - //! Draws angle decorator for the current rotation axis. - void DrawAngleDecorator(DisplayContext& dc); - - //! Useful for debugging and visualizing hit testing - void DrawHitTestGeometry(DisplayContext& dc, HitContext& hc); - - //! Diagnostic tool to examine view direction angle (follows mouse cursor) - void DrawViewDirectionAngleTracking(DisplayContext& dc, HitContext& hc); - - //! Callback registered to receive Selection callbacks to set m_object - bool OnSelectObject(CBaseObject* object) override; - - //! Callback to check that an object can be selected - bool CanSelectObject(CBaseObject* object) override; - - //! Callback installed on the object, used to determine destruction or deselection. - void OnObjectEvent(CBaseObject* object, int event) override; - - //! Handle key down events. - bool OnKeyDown(CViewport* view, uint32 nChar, uint32 nRepCnt, uint32 nFlags) override; - - //! Retrieves the object's transformation according to the specified reference coordinate system. - Matrix34 GetTransform(RefCoordSys referenceCoordinateSystem, IDisplayViewport* view); - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - - //! Calculate orientation of 3 points on screen, return 1.0f if clockwise, -1.0f if counter-clockwise - float CalculateOrientation(const QPoint& p1, const QPoint& p2, const QPoint& p3); - -private: - - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - HitContext m_hc; //!< HACK: Cache the hitcontext given that it's values may differ depending on the viewport they are coming from. - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING -}; - -//! Singleton that holds all the configuration cvars for the different features and debug options -//! used by the CRotationControl -class RotationControlConfiguration -{ -public: - - static RotationControlConfiguration& Get() - { - static RotationControlConfiguration instance; - return instance; - } - - //! If enabled it will draw the inner rotation decorator. - DeclareConstIntCVar(RotationControl_DrawDecorators, 0); - - //! If enabled the hit testing geometry is rendered. - DeclareConstIntCVar(RotationControl_DebugHitTesting, 0); - - //! If enabled a sphere will be drawn to represent the view axis angle to the mouse cursor. - DeclareConstIntCVar(RotationControl_AngleTracking, 0); - -private: - - RotationControlConfiguration(); - RotationControlConfiguration(const RotationControlConfiguration&) = delete; - RotationControlConfiguration& operator = (const RotationControlConfiguration&) = delete; - ~RotationControlConfiguration() {} -}; - -#endif // CRYINCLUDE_EDITOR_ROTATETOOL_H diff --git a/Code/Sandbox/Editor/SetVectorDlg.cpp b/Code/Sandbox/Editor/SetVectorDlg.cpp deleted file mode 100644 index 583f5ff4af..0000000000 --- a/Code/Sandbox/Editor/SetVectorDlg.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "SetVectorDlg.h" - -// Editor -#include "MainWindow.h" -#include "MathConversion.h" -#include "ActionManager.h" -#include "Objects/BaseObject.h" -#include "Objects/SelectionGroup.h" - -AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING -#include "ui_SetVectorDlg.h" -AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - -///////////////////////////////////////////////////////////////////////////// -// CSetVectorDlg dialog - - -CSetVectorDlg::CSetVectorDlg(QWidget* pParent /*=NULL*/) - : QDialog(pParent) - , m_ui(new Ui::SetVectorDlg) -{ - m_ui->setupUi(this); - - OnInitDialog(); - - connect(m_ui->buttonOk, &QPushButton::clicked, this, &CSetVectorDlg::accept); - connect(m_ui->buttonCancel, &QPushButton::clicked, this, &CSetVectorDlg::reject); -} - -CSetVectorDlg::~CSetVectorDlg() -{ -} - -///////////////////////////////////////////////////////////////////////////// -// CSetVectorDlg message handlers - - -void CSetVectorDlg::OnInitDialog() -{ - QString editModeString; - int emode = GetIEditor()->GetEditMode(); - - if (emode == eEditModeMove) - { - editModeString = tr("Position"); - } - else if (emode == eEditModeRotate) - { - editModeString = tr("Rotation"); - } - else if (emode == eEditModeScale) - { - editModeString = tr("Scale"); - } - - m_ui->label->setText(tr("Enter %1 here:").arg(editModeString)); - - currentVec = GetVectorFromEditor(); - m_ui->edit->setText(QStringLiteral("%1, %2, %3").arg(currentVec.x, 2, 'f', 2).arg(currentVec.y, 2, 'f', 2).arg(currentVec.z, 2, 'f', 2)); -} - -void CSetVectorDlg::accept() -{ - Vec3 newVec = GetVectorFromText(); - SetVector(newVec); - - if (GetIEditor()->GetEditMode() == eEditModeMove && currentVec.GetDistance(newVec) > 10.0f) - { - MainWindow::instance()->GetActionManager()->GetAction(ID_GOTO_SELECTED)->trigger(); - } - QDialog::accept(); -} - -Vec3 CSetVectorDlg::GetVectorFromEditor() -{ - Vec3 v; - int emode = GetIEditor()->GetEditMode(); - CBaseObject* obj = GetIEditor()->GetSelectedObject(); - bool bWorldSpace = GetIEditor()->GetReferenceCoordSys() == COORDS_WORLD; - - if (obj) - { - v = obj->GetWorldPos(); - } - - if (emode == eEditModeMove) - { - if (obj) - { - if (bWorldSpace) - { - v = obj->GetWorldTM().GetTranslation(); - } - else - { - v = obj->GetPos(); - } - } - } - if (emode == eEditModeRotate) - { - if (obj) - { - Quat qrot; - if (bWorldSpace) - { - AffineParts ap; - ap.SpectralDecompose(obj->GetWorldTM()); - qrot = ap.rot; - } - else - { - qrot = obj->GetRotation(); - } - - v = AZVec3ToLYVec3(AZ::ConvertQuaternionToEulerDegrees(LYQuaternionToAZQuaternion(qrot))); - } - } - if (emode == eEditModeScale) - { - if (obj) - { - if (bWorldSpace) - { - AffineParts ap; - ap.SpectralDecompose(obj->GetWorldTM()); - v = ap.scale; - } - else - { - v = obj->GetScale(); - } - } - } - return v; -} - -Vec3 CSetVectorDlg::GetVectorFromText() -{ - return GetVectorFromString(m_ui->edit->text()); -} - -Vec3 CSetVectorDlg::GetVectorFromString(const QString& vecString) -{ - const int maxCoordinates = 3; - float vec[maxCoordinates] = { 0, 0, 0 }; - - const QStringList parts = vecString.split(QRegularExpression("[\\s,;\\t]"), Qt::SkipEmptyParts); - const int checkCoords = AZStd::GetMin(parts.count(), maxCoordinates); - for (int k = 0; k < checkCoords; ++k) - { - vec[k] = parts[k].toDouble(); - } - - return Vec3(vec[0], vec[1], vec[2]); -} - -void CSetVectorDlg::SetVector(const Vec3& v) -{ - int emode = GetIEditor()->GetEditMode(); - if (emode != eEditModeMove && emode != eEditModeRotate && emode != eEditModeScale) - { - return; - } - - int referenceCoordSys = GetIEditor()->GetReferenceCoordSys(); - - CBaseObject* obj = GetIEditor()->GetSelectedObject(); - - Matrix34 tm; - AffineParts ap; - if (obj) - { - tm = obj->GetWorldTM(); - ap.SpectralDecompose(tm); - } - - if (emode == eEditModeMove) - { - if (obj) - { - CUndo undo("Set Position"); - if (referenceCoordSys == COORDS_WORLD) - { - tm.SetTranslation(v); - obj->SetWorldTM(tm, eObjectUpdateFlags_UserInput); - } - else - { - obj->SetPos(v, eObjectUpdateFlags_UserInput); - } - } - } - if (emode == eEditModeRotate) - { - CUndo undo("Set Rotation"); - if (obj) - { - Quat qrot = AZQuaternionToLYQuaternion(AZ::ConvertEulerDegreesToQuaternion(LYVec3ToAZVec3(v))); - if (referenceCoordSys == COORDS_WORLD) - { - tm = Matrix34::Create(ap.scale, qrot, ap.pos); - obj->SetWorldTM(tm, eObjectUpdateFlags_UserInput); - } - else - { - obj->SetRotation(qrot, eObjectUpdateFlags_UserInput); - } - } - else - { - GetIEditor()->GetSelection()->Rotate((Ang3)v, referenceCoordSys); - } - } - if (emode == eEditModeScale) - { - if (v.x == 0 || v.y == 0 || v.z == 0) - { - return; - } - - CUndo undo("Set Scale"); - if (obj) - { - if (referenceCoordSys == COORDS_WORLD) - { - tm = Matrix34::Create(v, ap.rot, ap.pos); - obj->SetWorldTM(tm, eObjectUpdateFlags_UserInput); - } - else - { - obj->SetScale(v, eObjectUpdateFlags_UserInput); - } - } - else - { - GetIEditor()->GetSelection()->Scale(v, referenceCoordSys); - } - } -} - -#include diff --git a/Code/Sandbox/Editor/SetVectorDlg.h b/Code/Sandbox/Editor/SetVectorDlg.h deleted file mode 100644 index e9fd8115e5..0000000000 --- a/Code/Sandbox/Editor/SetVectorDlg.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_EDITOR_SETVECTORDLG_H -#define CRYINCLUDE_EDITOR_SETVECTORDLG_H - -#pragma once -// GotoPositionDlg.h : header file -// - -#if !defined(Q_MOC_RUN) -#include -#endif - -namespace Ui -{ - class SetVectorDlg; -} - -///////////////////////////////////////////////////////////////////////////// -// CSetVectorDlg dialog - -class SANDBOX_API CSetVectorDlg - : public QDialog -{ - Q_OBJECT - // Construction -public: - CSetVectorDlg(QWidget* pParent = NULL); // standard constructor - ~CSetVectorDlg(); - - static Vec3 GetVectorFromString(const QString& vecString); - - // Implementation -protected: - void OnInitDialog(); - void accept() override; - void SetVector(const Vec3& v); - Vec3 GetVectorFromText(); - Vec3 GetVectorFromEditor(); - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - Vec3 currentVec; - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - -private: - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING - QScopedPointer m_ui; - AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING -}; - -#endif // CRYINCLUDE_EDITOR_SETVECTORDLG_H diff --git a/Code/Sandbox/Editor/SetVectorDlg.ui b/Code/Sandbox/Editor/SetVectorDlg.ui deleted file mode 100644 index a8ed3cb282..0000000000 --- a/Code/Sandbox/Editor/SetVectorDlg.ui +++ /dev/null @@ -1,55 +0,0 @@ - - - SetVectorDlg - - - - 0 - 0 - 270 - 99 - - - - Set Vector - - - - 29 - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Cancel - - - - - - - Set - - - - - - - - diff --git a/Code/Sandbox/Editor/Settings.cpp b/Code/Sandbox/Editor/Settings.cpp index 0f25b6ac6d..038af33129 100644 --- a/Code/Sandbox/Editor/Settings.cpp +++ b/Code/Sandbox/Editor/Settings.cpp @@ -653,12 +653,6 @@ void SEditorSettings::Save() SaveValue("Settings", "ForceSkyUpdate", gSettings.bForceSkyUpdate); - ////////////////////////////////////////////////////////////////////////// - // Vertex snapping settings - ////////////////////////////////////////////////////////////////////////// - SaveValue("Settings\\VertexSnapping", "VertexCubeSize", vertexSnappingSettings.vertexCubeSize); - SaveValue("Settings\\VertexSnapping", "RenderPenetratedBoundBox", vertexSnappingSettings.bRenderPenetratedBoundBox); - ////////////////////////////////////////////////////////////////////////// // Smart file open settings ////////////////////////////////////////////////////////////////////////// @@ -886,12 +880,6 @@ void SEditorSettings::Load() LoadValue("Settings", "ForceSkyUpdate", gSettings.bForceSkyUpdate); - ////////////////////////////////////////////////////////////////////////// - // Vertex snapping settings - ////////////////////////////////////////////////////////////////////////// - LoadValue("Settings\\VertexSnapping", "VertexCubeSize", vertexSnappingSettings.vertexCubeSize); - LoadValue("Settings\\VertexSnapping", "RenderPenetratedBoundBox", vertexSnappingSettings.bRenderPenetratedBoundBox); - ////////////////////////////////////////////////////////////////////////// // Smart file open settings ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/Settings.h b/Code/Sandbox/Editor/Settings.h index 918647388a..512c6e3942 100644 --- a/Code/Sandbox/Editor/Settings.h +++ b/Code/Sandbox/Editor/Settings.h @@ -119,18 +119,6 @@ struct SDeepSelectionSettings bool bStickDuplicate; }; -////////////////////////////////////////////////////////////////////////// -// Settings for vertex snapping. -////////////////////////////////////////////////////////////////////////// -struct SVertexSnappingSettings -{ - SVertexSnappingSettings() - : vertexCubeSize(0.01f) - , bRenderPenetratedBoundBox(false) {} - float vertexCubeSize; - bool bRenderPenetratedBoundBox; -}; - ////////////////////////////////////////////////////////////////////////// struct SObjectColors { @@ -474,9 +462,6 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING // Object Highlight Settings SObjectColors objectColorSettings; - - // Vertex Snapping Settings - SVertexSnappingSettings vertexSnappingSettings; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING SSmartOpenDialogSettings smartOpenSettings; diff --git a/Code/Sandbox/Editor/ShaderCache.cpp b/Code/Sandbox/Editor/ShaderCache.cpp index 5a5b0d8f58..3beeb9a7c4 100644 --- a/Code/Sandbox/Editor/ShaderCache.cpp +++ b/Code/Sandbox/Editor/ShaderCache.cpp @@ -138,6 +138,7 @@ bool CLevelShaderCache::SaveBuffer(QString& textBuffer) void CLevelShaderCache::Update() { IRenderer* pRenderer = gEnv->pRenderer; + if (pRenderer) { QString buf; char* str = NULL; diff --git a/Code/Sandbox/Editor/StartupTraceHandler.h b/Code/Sandbox/Editor/StartupTraceHandler.h index dcdad6c96c..095038213d 100644 --- a/Code/Sandbox/Editor/StartupTraceHandler.h +++ b/Code/Sandbox/Editor/StartupTraceHandler.h @@ -91,4 +91,4 @@ namespace SandboxEditor AZStd::list m_mainThreadMessages; }; -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Style/CloudCanvas.qss b/Code/Sandbox/Editor/Style/CloudCanvas.qss index d019d32aa2..730c494fdf 100644 --- a/Code/Sandbox/Editor/Style/CloudCanvas.qss +++ b/Code/Sandbox/Editor/Style/CloudCanvas.qss @@ -485,4 +485,4 @@ #LoginDialog Amazon--LoginWebView { background-color: #F8F8F8; -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Style/EditorPreferencesDialog.qss b/Code/Sandbox/Editor/Style/EditorPreferencesDialog.qss index 1ae9c96bf0..f13f273ddd 100644 --- a/Code/Sandbox/Editor/Style/EditorPreferencesDialog.qss +++ b/Code/Sandbox/Editor/Style/EditorPreferencesDialog.qss @@ -63,4 +63,4 @@ AzToolsFramework--PropertyRowWidget[HasParent="false"] QLabel#Name #EditorPreferencesDialog AzToolsFramework--PropertyRowWidget[isTopLevel="true"][hasChildRows="true"] QLabel#Name { font-weight: bold; -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Style/EditorStylesheetVariables_Dark.json b/Code/Sandbox/Editor/Style/EditorStylesheetVariables_Dark.json index 1ca90418d0..895e013c1e 100644 --- a/Code/Sandbox/Editor/Style/EditorStylesheetVariables_Dark.json +++ b/Code/Sandbox/Editor/Style/EditorStylesheetVariables_Dark.json @@ -56,4 +56,4 @@ "LayerBGSelectionColor": "#444545", "LayerChildBGSelectionColor": "#464747" } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Style/LayoutConfigDialog.qss b/Code/Sandbox/Editor/Style/LayoutConfigDialog.qss index 79ea43488d..1c79e47451 100644 --- a/Code/Sandbox/Editor/Style/LayoutConfigDialog.qss +++ b/Code/Sandbox/Editor/Style/LayoutConfigDialog.qss @@ -6,4 +6,4 @@ #CLayoutConfigDialog QListView::item:selected { background: #00A1C9; -} \ No newline at end of file +} diff --git a/Code/Sandbox/Editor/Style/resources.qrc b/Code/Sandbox/Editor/Style/resources.qrc index e6e819b9f2..54c2c4754a 100644 --- a/Code/Sandbox/Editor/Style/resources.qrc +++ b/Code/Sandbox/Editor/Style/resources.qrc @@ -7,4 +7,4 @@ GraphicsSettingsDialog.qss LensFlareEditor.qss - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/ToolbarManager.cpp b/Code/Sandbox/Editor/ToolbarManager.cpp index d39dabf034..6977121933 100644 --- a/Code/Sandbox/Editor/ToolbarManager.cpp +++ b/Code/Sandbox/Editor/ToolbarManager.cpp @@ -587,26 +587,13 @@ AmazonToolbar ToolbarManager::GetEditModeToolbar() const t.AddAction(ID_TOOLBAR_SEPARATOR, ORIGINAL_TOOLBAR_VERSION); - if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) - { - t.AddAction(ID_EDITMODE_SELECT, ORIGINAL_TOOLBAR_VERSION); - } - t.AddAction(ID_EDITMODE_MOVE, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_EDITMODE_ROTATE, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_EDITMODE_SCALE, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_EDITMODE_SELECTAREA, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_VIEW_SWITCHTOGAME, TOOLBARS_WITH_PLAY_GAME); t.AddAction(ID_TOOLBAR_SEPARATOR, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_TOOLBAR_WIDGET_REF_COORD, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_X, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_Y, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_Z, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_XY, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_TERRAIN, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_SELECT_AXIS_SNAPTOALL, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_TOOLBAR_WIDGET_SNAP_GRID, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_TOOLBAR_WIDGET_SNAP_ANGLE, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_RULER, ORIGINAL_TOOLBAR_VERSION); @@ -623,9 +610,7 @@ AmazonToolbar ToolbarManager::GetObjectToolbar() const AmazonToolbar t = AmazonToolbar("Object", QObject::tr("Object Toolbar")); t.SetMainToolbar(true); t.AddAction(ID_GOTO_SELECTED, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_OBJECTMODIFY_ALIGNTOGRID, ORIGINAL_TOOLBAR_VERSION); t.AddAction(ID_OBJECTMODIFY_SETHEIGHT, ORIGINAL_TOOLBAR_VERSION); - t.AddAction(ID_MODIFY_ALIGNOBJTOSURF, ORIGINAL_TOOLBAR_VERSION); if (!GetIEditor()->IsNewViewportInteractionModelEnabled()) { @@ -634,8 +619,6 @@ AmazonToolbar ToolbarManager::GetObjectToolbar() const t.AddAction(ID_EDIT_UNFREEZEALL, ORIGINAL_TOOLBAR_VERSION); } - t.AddAction(ID_OBJECTMODIFY_VERTEXSNAPPING, ORIGINAL_TOOLBAR_VERSION); - return t; } diff --git a/Code/Sandbox/Editor/TrackView/TrackViewDoubleSpinBox.h b/Code/Sandbox/Editor/TrackView/TrackViewDoubleSpinBox.h index 87347f521d..d39b06d811 100644 --- a/Code/Sandbox/Editor/TrackView/TrackViewDoubleSpinBox.h +++ b/Code/Sandbox/Editor/TrackView/TrackViewDoubleSpinBox.h @@ -28,4 +28,4 @@ protected: signals: void stepByFinished(); -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Editor/Translations/assetbrowser_en-us.ts b/Code/Sandbox/Editor/Translations/assetbrowser_en-us.ts index 6e2edd8fa1..f964f988d4 100644 --- a/Code/Sandbox/Editor/Translations/assetbrowser_en-us.ts +++ b/Code/Sandbox/Editor/Translations/assetbrowser_en-us.ts @@ -164,4 +164,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/Translations/editor_en-us.ts b/Code/Sandbox/Editor/Translations/editor_en-us.ts index 6fcd101934..8208551fc5 100644 --- a/Code/Sandbox/Editor/Translations/editor_en-us.ts +++ b/Code/Sandbox/Editor/Translations/editor_en-us.ts @@ -8,4 +8,4 @@ Open a Level - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/TrustInfo.manifest b/Code/Sandbox/Editor/TrustInfo.manifest index d7d278304e..d6ddcd3ab0 100644 --- a/Code/Sandbox/Editor/TrustInfo.manifest +++ b/Code/Sandbox/Editor/TrustInfo.manifest @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/Util/ColumnGroupProxyModel.h b/Code/Sandbox/Editor/Util/ColumnGroupProxyModel.h index 9ffb0203a3..9d7298dd6e 100644 --- a/Code/Sandbox/Editor/Util/ColumnGroupProxyModel.h +++ b/Code/Sandbox/Editor/Util/ColumnGroupProxyModel.h @@ -54,4 +54,4 @@ private: int m_freeSortColumn; }; -#endif // COLUMNGROUPPROXYMODEL_H \ No newline at end of file +#endif // COLUMNGROUPPROXYMODEL_H diff --git a/Code/Sandbox/Editor/Util/ColumnSortProxyModel.h b/Code/Sandbox/Editor/Util/ColumnSortProxyModel.h index 850938c8b9..24bf4ada9f 100644 --- a/Code/Sandbox/Editor/Util/ColumnSortProxyModel.h +++ b/Code/Sandbox/Editor/Util/ColumnSortProxyModel.h @@ -85,4 +85,4 @@ private: QVector m_mappingToSource; }; -#endif //COLUMNSORTPROXYMODEL_H \ No newline at end of file +#endif //COLUMNSORTPROXYMODEL_H diff --git a/Code/Sandbox/Editor/Util/ModalWindowDismisser.h b/Code/Sandbox/Editor/Util/ModalWindowDismisser.h index 3f5e83f374..0dc1e39fab 100644 --- a/Code/Sandbox/Editor/Util/ModalWindowDismisser.h +++ b/Code/Sandbox/Editor/Util/ModalWindowDismisser.h @@ -30,4 +30,4 @@ private: std::vector m_windows; bool m_dissmiss = false; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Editor/Util/Triangulate.h b/Code/Sandbox/Editor/Util/Triangulate.h index 67ee9f4dd1..f969b4a46d 100644 --- a/Code/Sandbox/Editor/Util/Triangulate.h +++ b/Code/Sandbox/Editor/Util/Triangulate.h @@ -27,4 +27,4 @@ namespace Triangulator }; -#endif \ No newline at end of file +#endif diff --git a/Code/Sandbox/Editor/Viewport.cpp b/Code/Sandbox/Editor/Viewport.cpp index ae2de224cb..1041a4f086 100644 --- a/Code/Sandbox/Editor/Viewport.cpp +++ b/Code/Sandbox/Editor/Viewport.cpp @@ -30,7 +30,6 @@ #include "Util/Ruler.h" #include "PluginManager.h" #include "Include/IRenderListener.h" -#include "EditTool.h" #include "GameEngine.h" #include "Settings.h" @@ -207,8 +206,6 @@ QtViewport::QtViewport(QWidget* parent) GetIEditor()->GetViewManager()->RegisterViewport(this); - m_pLocalEditTool = 0; - m_nCurViewportID = MAX_NUM_VIEWPORTS - 1; m_dropCallback = nullptr; // Leroy@Conffx @@ -232,8 +229,6 @@ QtViewport::QtViewport(QWidget* parent) ////////////////////////////////////////////////////////////////////////// QtViewport::~QtViewport() { - if (m_pLocalEditTool) - m_pLocalEditTool->deleteLater(); delete m_pVisibleObjectsCache; GetIEditor()->GetViewManager()->UnregisterViewport(this); @@ -258,42 +253,6 @@ void QtViewport::GetDimensions(int* pWidth, int* pHeight) const } } -////////////////////////////////////////////////////////////////////////// -CEditTool* QtViewport::GetEditTool() -{ - if (m_pLocalEditTool) - { - return m_pLocalEditTool; - } - return GetIEditor()->GetEditTool(); -} - -////////////////////////////////////////////////////////////////////////// -void QtViewport::SetEditTool(CEditTool* pEditTool, bool bLocalToViewport /*=false */) -{ - if (m_pLocalEditTool == pEditTool) - { - return; - } - - if (m_pLocalEditTool) - { - m_pLocalEditTool->EndEditParams(); - } - m_pLocalEditTool = 0; - - if (bLocalToViewport) - { - m_pLocalEditTool = pEditTool; - m_pLocalEditTool->BeginEditParams(GetIEditor(), 0); - } - else - { - m_pLocalEditTool = 0; - GetIEditor()->SetEditTool(pEditTool); - } -} - ////////////////////////////////////////////////////////////////////////// void QtViewport::RegisterRenderListener(IRenderListener* piListener) { @@ -466,12 +425,6 @@ void QtViewport::Update() m_bAdvancedSelectMode = false; bool bSpaceClick = false; - CEditTool* pEditTool = GetIEditor()->GetEditTool(); - if (pEditTool && pEditTool->IsNeedSpecificBehaviorForSpaceAcce()) - { - bSpaceClick = CheckVirtualKey(Qt::Key_Space); - } - else { bSpaceClick = CheckVirtualKey(Qt::Key_Space) & !CheckVirtualKey(Qt::Key_Shift) /*& !CheckVirtualKey(Qt::Key_Control)*/; } @@ -726,10 +679,6 @@ void QtViewport::OnMouseMove(Qt::KeyboardModifiers modifiers, Qt::MouseButtons b ////////////////////////////////////////////////////////////////////////// void QtViewport::OnSetCursor() { - if (GetEditTool()) - { - GetEditTool()->OnSetCursor(this); - } } ////////////////////////////////////////////////////////////////////////// @@ -803,39 +752,23 @@ void QtViewport::OnRButtonDblClk(Qt::KeyboardModifiers modifiers, const QPoint& } ////////////////////////////////////////////////////////////////////////// -void QtViewport::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) +void QtViewport::OnKeyDown([[maybe_unused]] UINT nChar, [[maybe_unused]] UINT nRepCnt, [[maybe_unused]] UINT nFlags) { if (GetIEditor()->IsInGameMode()) { // Ignore key downs while in game. return; } - - if (GetEditTool()) - { - if (GetEditTool()->OnKeyDown(this, nChar, nRepCnt, nFlags)) - { - return; - } - } } ////////////////////////////////////////////////////////////////////////// -void QtViewport::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) +void QtViewport::OnKeyUp([[maybe_unused]] UINT nChar, [[maybe_unused]] UINT nRepCnt, [[maybe_unused]] UINT nFlags) { if (GetIEditor()->IsInGameMode()) { // Ignore key downs while in game. return; } - - if (GetEditTool()) - { - if (GetEditTool()->OnKeyUp(this, nChar, nRepCnt, nFlags)) - { - return; - } - } } ////////////////////////////////////////////////////////////////////////// @@ -1454,28 +1387,6 @@ bool QtViewport::MouseCallback(EMouseEvent event, const QPoint& point, Qt::Keybo } } - ////////////////////////////////////////////////////////////////////////// - // Asks current edit tool to handle mouse callback. - CEditTool* pEditTool = GetEditTool(); - if (pEditTool) - { - if (pEditTool->MouseCallback(this, event, tempPoint, flags)) - { - return true; - } - - // Ask all chain of parent tools if they are handling mouse event. - CEditTool* pParentTool = pEditTool->GetParentTool(); - while (pParentTool) - { - if (pParentTool->MouseCallback(this, event, tempPoint, flags)) - { - return true; - } - pParentTool = pParentTool->GetParentTool(); - } - } - return false; } ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Editor/Viewport.h b/Code/Sandbox/Editor/Viewport.h index acc5a3acfb..9979a3bb0a 100644 --- a/Code/Sandbox/Editor/Viewport.h +++ b/Code/Sandbox/Editor/Viewport.h @@ -45,7 +45,6 @@ struct DisplayContext; class CCryEditDoc; class CLayoutViewPane; class CViewManager; -class CEditTool; class CBaseObjectsCache; struct HitContext; struct IRenderListener; @@ -255,8 +254,6 @@ public: virtual void SetSupplementaryCursorStr(const QString& str) = 0; virtual void SetCursorString(const QString& str) = 0; - virtual CEditTool* GetEditTool() = 0; - virtual void SetFocus() = 0; virtual void Invalidate(BOOL bErase = 1) = 0; @@ -488,10 +485,6 @@ public: void ResetCursor(); void SetSupplementaryCursorStr(const QString& str); - virtual CEditTool* GetEditTool(); - // Assign an edit tool to viewport - virtual void SetEditTool(CEditTool* pEditTool, bool bLocalToViewport = false); - ////////////////////////////////////////////////////////////////////////// // Return visble objects cache. CBaseObjectsCache* GetVisibleObjectsCache() { return m_pVisibleObjectsCache; }; @@ -627,8 +620,6 @@ protected: // Same construction matrix is shared by all viewports. Matrix34 m_constructionMatrix[LAST_COORD_SYSTEM]; - QPointer m_pLocalEditTool; - std::vector m_cRenderListeners; typedef std::vector<_smart_ptr > PostRenderers; diff --git a/Code/Sandbox/Editor/ViewportManipulatorController.cpp b/Code/Sandbox/Editor/ViewportManipulatorController.cpp index 910d037670..fc376b27d0 100644 --- a/Code/Sandbox/Editor/ViewportManipulatorController.cpp +++ b/Code/Sandbox/Editor/ViewportManipulatorController.cpp @@ -95,6 +95,11 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram AZStd::optional overrideButton; AZStd::optional eventType; + // Because we receive events multiple times at separate priorities for manipulator events and + // viewport interaction events, we want to avoid updating our "last tick state" until we're on our last event, + // which currently is the low priority Interaction processor. + const bool finishedProcessingEvents = event.m_priority == InteractionPriority; + if (IsMouseMove(event.m_inputChannel)) { // Cache the ray trace results when doing manipulator interaction checks, no need to recalculate after @@ -120,10 +125,11 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram } else if (auto mouseButton = GetMouseButton(event.m_inputChannel); mouseButton != MouseButton::None) { + const AZ::u32 mouseButtonValue = static_cast(mouseButton); overrideButton = mouseButton; if (event.m_inputChannel.GetState() == InputChannel::State::Began) { - m_state.m_mouseButtons.m_mouseButtons |= static_cast(mouseButton); + m_state.m_mouseButtons.m_mouseButtons |= mouseButtonValue; if (IsDoubleClick(mouseButton)) { // Only remove the double click flag once we're done processing both Manipulator and Interaction events @@ -135,8 +141,8 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram } else { - // Only insert the double click timing once we're done processing both Manipulator and Interaction events, to avoid a false IsDoubleClick positive - if (event.m_priority == InteractionPriority) + // Only insert the double click timing once we're done processing events, to avoid a false IsDoubleClick positive + if (finishedProcessingEvents) { m_pendingDoubleClicks[mouseButton] = m_curTime; } @@ -145,8 +151,18 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram } else if (event.m_inputChannel.GetState() == InputChannel::State::Ended) { - m_state.m_mouseButtons.m_mouseButtons &= ~static_cast(mouseButton); - eventType = MouseEvent::Up; + // If we've actually logged a mouse down event, forward a mouse up event. + // This prevents corner cases like the context menu thinking it should be opened even though no one clicked in this viewport, + // due to RenderViewportWidget ensuring all controllers get InputChannel::State::Ended events. + if (m_state.m_mouseButtons.m_mouseButtons & mouseButtonValue) + { + // Erase the button from our state if we're done processing events. + if (event.m_priority == InteractionPriority) + { + m_state.m_mouseButtons.m_mouseButtons &= ~mouseButtonValue; + } + eventType = MouseEvent::Up; + } } } else if (auto keyboardModifier = GetKeyboardModifier(event.m_inputChannel); keyboardModifier != KeyboardModifier::None) @@ -186,6 +202,12 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram return interactionHandled; } +void ViewportManipulatorControllerInstance::ResetInputChannels() +{ + m_pendingDoubleClicks.clear(); + m_state = AzToolsFramework::ViewportInteraction::MouseInteraction(); +} + void ViewportManipulatorControllerInstance::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) { m_curTime = event.m_time; diff --git a/Code/Sandbox/Editor/ViewportManipulatorController.h b/Code/Sandbox/Editor/ViewportManipulatorController.h index a4f373c48f..03a823fa64 100644 --- a/Code/Sandbox/Editor/ViewportManipulatorController.h +++ b/Code/Sandbox/Editor/ViewportManipulatorController.h @@ -26,6 +26,7 @@ namespace SandboxEditor explicit ViewportManipulatorControllerInstance(AzFramework::ViewportId viewport); bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override; + void ResetInputChannels() override; void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override; private: diff --git a/Code/Sandbox/Editor/VoxelAligningTool.cpp b/Code/Sandbox/Editor/VoxelAligningTool.cpp deleted file mode 100644 index 1d45dd2d3f..0000000000 --- a/Code/Sandbox/Editor/VoxelAligningTool.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "EditorDefs.h" - -#include "VoxelAligningTool.h" - -// Editor -#include "SurfaceInfoPicker.h" -#include "Objects/SelectionGroup.h" - -////////////////////////////////////////////////////////////////////////// -CVoxelAligningTool::CVoxelAligningTool() -{ - m_curObj = 0; - m_PreviewMode = ePM_Idle; - - CSelectionGroup* sel = GetIEditor()->GetSelection(); - if (!sel->IsEmpty()) - { - m_curObj = sel->GetObject(0); - m_CurObjTMBeforePreviewMode = m_curObj->GetWorldTM(); - m_q = m_curObj->GetRotation(); - } -} - -////////////////////////////////////////////////////////////////////////// -CVoxelAligningTool::~CVoxelAligningTool() -{ -} - -////////////////////////////////////////////////////////////////////////// -void CVoxelAligningTool::Display([[maybe_unused]] DisplayContext& dc) -{ -} - -////////////////////////////////////////////////////////////////////////// -bool CVoxelAligningTool::MouseCallback([[maybe_unused]] CViewport* view, EMouseEvent event, QPoint& point, int flags) -{ - // Get contrl key status. - bool bCtrlClick = (flags & MK_CONTROL); - bool bShiftClick = (flags & MK_SHIFT); - bool bOnlyCtrlClick = bCtrlClick && !bShiftClick; - - CSelectionGroup* sel = GetIEditor()->GetSelection(); - if (sel->IsEmpty() || m_curObj != sel->GetObject(0)) - { - GetIEditor()->SetEditTool(0); - return true; - } - - if (event == eMouseMove) - { - if (m_PreviewMode == ePM_Idle) - { - if (bOnlyCtrlClick) - { - if (m_curObj) - { - m_CurObjTMBeforePreviewMode = m_curObj->GetWorldTM(); - } - m_PreviewMode = ePM_Previewing; - GetIEditor()->BeginUndo(); - } - } - else if (!bOnlyCtrlClick) - { - if (m_curObj) - { - m_curObj->SetWorldTM(m_CurObjTMBeforePreviewMode); - //m_curObj->SetRotation(m_extraRot); - } - m_PreviewMode = ePM_Idle; - GetIEditor()->CancelUndo(); - } - - if (m_PreviewMode == ePM_Previewing && bOnlyCtrlClick) - { // Preview align to normal - ApplyPickedTM2CurObj(point); - } - } - - if (event == eMouseLDown && m_PreviewMode == ePM_Previewing) - { - m_CurObjTMBeforePreviewMode = m_curObj->GetWorldTM(); - GetIEditor()->AcceptUndo("Surface Normal Aligning"); - GetIEditor()->SetEditTool(NULL); - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -void CVoxelAligningTool::ApplyPickedTM2CurObj(const QPoint& point, [[maybe_unused]] bool bPickOnlyTerrain) -{ - int nPickFlag = CSurfaceInfoPicker::ePOG_All; - SRayHitInfo hitInfo; - CSurfaceInfoPicker::CExcludedObjects excludeObjects; - if (m_curObj) - { - excludeObjects.Add(m_curObj); - } - CSurfaceInfoPicker surfacePicker; - if (surfacePicker.Pick(point, hitInfo, &excludeObjects, nPickFlag)) - { - m_curObj->SetPos(hitInfo.vHitPos, eObjectUpdateFlags_UserInput); - ApplyRotation(hitInfo.vHitNormal); - } -} - -////////////////////////////////////////////////////////////////////////// -void CVoxelAligningTool::ApplyRotation(Vec3& normal) -{ - Vec3 zaxis = m_q * Vec3(0, 0, 1); - zaxis.Normalize(); - Quat nq; - nq.SetRotationV0V1(zaxis, normal); - m_curObj->SetRotation(nq * m_q, eObjectUpdateFlags_UserInput); -} - -////////////////////////////////////////////////////////////////////////// -void CVoxelAligningTool::BeginEditParams([[maybe_unused]] IEditor* ie, [[maybe_unused]] int flags) -{ -} - -////////////////////////////////////////////////////////////////////////// -void CVoxelAligningTool::EndEditParams() -{ -} - -////////////////////////////////////////////////////////////////////////// -bool CVoxelAligningTool::OnKeyDown([[maybe_unused]] CViewport* view, uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) -{ - if (nChar == VK_ESCAPE) - { - GetIEditor()->SetEditTool(0); - } - return false; -} - -#include diff --git a/Code/Sandbox/Editor/VoxelAligningTool.h b/Code/Sandbox/Editor/VoxelAligningTool.h deleted file mode 100644 index bfa0e19d9a..0000000000 --- a/Code/Sandbox/Editor/VoxelAligningTool.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Definition of VoxelAligningTool, edit tool for cloning of objects.. - - -#ifndef CRYINCLUDE_EDITOR_VOXELALIGNINGTOOL_H -#define CRYINCLUDE_EDITOR_VOXELALIGNINGTOOL_H - -#pragma once - -#if !defined(Q_MOC_RUN) -#include "EditTool.h" -#endif - -class CBaseObject; - -/*! - * CVoxelAligningTool, When created duplicate current selection, and manages cloned selection. - * - */ - -class CVoxelAligningTool - : public CEditTool -{ - Q_OBJECT -public: - Q_INVOKABLE CVoxelAligningTool(); - - ////////////////////////////////////////////////////////////////////////// - // Ovverides from CEditTool - bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - - virtual void BeginEditParams(IEditor* ie, int flags); - virtual void EndEditParams(); - - virtual void Display(DisplayContext& dc); - virtual bool OnKeyDown(CViewport* view, uint32 nChar, uint32 nRepCnt, uint32 nFlags); - virtual bool OnKeyUp([[maybe_unused]] CViewport* view, [[maybe_unused]] uint32 nChar, [[maybe_unused]] uint32 nRepCnt, [[maybe_unused]] uint32 nFlags) { return false; }; - ////////////////////////////////////////////////////////////////////////// - -protected: - virtual ~CVoxelAligningTool(); - // Delete itself. - void DeleteThis() { delete this; }; - - void ApplyPickedTM2CurObj(const QPoint& point, bool bPickOnlyTerrain = false); - void ApplyRotation(Vec3& normal); - -private: - - CBaseObject* m_curObj; - Quat m_q; - - enum EPreviewMode - { - ePM_Idle, - ePM_Previewing, - }; - EPreviewMode m_PreviewMode; - Matrix34 m_CurObjTMBeforePreviewMode; -}; - - -#endif // CRYINCLUDE_EDITOR_VOXELALIGNINGTOOL_H diff --git a/Code/Sandbox/Editor/editor_headers_files.cmake b/Code/Sandbox/Editor/editor_headers_files.cmake index 7da8d9eada..5714be5dfb 100644 --- a/Code/Sandbox/Editor/editor_headers_files.cmake +++ b/Code/Sandbox/Editor/editor_headers_files.cmake @@ -10,4 +10,4 @@ # set(FILES -) \ No newline at end of file +) diff --git a/Code/Sandbox/Editor/editor_lib_files.cmake b/Code/Sandbox/Editor/editor_lib_files.cmake index 5696931f26..ffbc37170d 100644 --- a/Code/Sandbox/Editor/editor_lib_files.cmake +++ b/Code/Sandbox/Editor/editor_lib_files.cmake @@ -10,8 +10,6 @@ # set(FILES - NullEditTool.h - NullEditTool.cpp Translations/editor_en-us.ts Translations/assetbrowser_en-us.ts DPIAware.xml @@ -389,8 +387,6 @@ set(FILES Controls/NumberCtrl.h Controls/PreviewModelCtrl.cpp Controls/PreviewModelCtrl.h - Controls/QRollupCtrl.cpp - Controls/QRollupCtrl.h Controls/SplineCtrl.cpp Controls/SplineCtrl.h Controls/SplineCtrlEx.cpp @@ -401,8 +397,6 @@ set(FILES Controls/TimelineCtrl.h Controls/TimeOfDaySlider.cpp Controls/TimeOfDaySlider.h - Controls/ToolButton.cpp - Controls/ToolButton.h Controls/WndGridHelper.h Controls/ReflectedPropertyControl/PropertyAnimationCtrl.cpp Controls/ReflectedPropertyControl/PropertyAnimationCtrl.h @@ -451,8 +445,6 @@ set(FILES CustomResolutionDlg.cpp CustomResolutionDlg.ui CustomResolutionDlg.h - Dialogs/ButtonsPanel.cpp - Dialogs/ButtonsPanel.h ErrorReportDialog.ui ErrorReportDialog.cpp ErrorReportDialog.h @@ -492,9 +484,6 @@ set(FILES SelectLightAnimationDialog.h SelectSequenceDialog.cpp SelectSequenceDialog.h - SetVectorDlg.cpp - SetVectorDlg.h - SetVectorDlg.ui ShadersDialog.cpp ShadersDialog.h ShadersDialog.ui @@ -533,18 +522,8 @@ set(FILES Dialogs/PythonScriptsDialog.ui Dialogs/Generic/UserOptions.cpp Dialogs/Generic/UserOptions.h - ObjectCloneTool.cpp - ObjectCloneTool.h EditMode/SubObjectSelectionReferenceFrameCalculator.cpp EditMode/SubObjectSelectionReferenceFrameCalculator.h - EditMode/ObjectMode.cpp - EditMode/ObjectMode.h - RotateTool.cpp - RotateTool.h - EditTool.cpp - EditTool.h - VoxelAligningTool.cpp - VoxelAligningTool.h Export/ExportManager.cpp Export/ExportManager.h Export/OBJExporter.cpp @@ -575,7 +554,6 @@ set(FILES Dialogs/DuplicatedObjectsHandlerDlg.h DocMultiArchive.h EditMode/DeepSelection.h - EditMode/VertexSnappingModeTool.h FBXExporterDialog.h FileTypeUtils.h GridUtils.h @@ -639,8 +617,6 @@ set(FILES Material/MaterialLibrary.h Material/MaterialManager.cpp Material/MaterialManager.h - Material/MaterialPickTool.cpp - Material/MaterialPickTool.h MaterialSender.h MaterialSender.cpp Material/MaterialPythonFuncs.h @@ -662,8 +638,6 @@ set(FILES Objects/ObjectManager.h Objects/ObjectManagerLegacyUndo.cpp Objects/ObjectManagerLegacyUndo.h - Objects/ObjectPhysicsManager.cpp - Objects/ObjectPhysicsManager.h Objects/DisplayContext.cpp Objects/DisplayContext.h Objects/EntityObject.cpp @@ -742,7 +716,6 @@ set(FILES ErrorReportTableModel.h ErrorReportTableModel.cpp EditMode/DeepSelection.cpp - EditMode/VertexSnappingModeTool.cpp FBXExporterDialog.cpp FBXExporterDialog.ui FileTypeUtils.cpp diff --git a/Code/Sandbox/Editor/editor_lib_test_files.cmake b/Code/Sandbox/Editor/editor_lib_test_files.cmake index 27713f4d30..f537169136 100644 --- a/Code/Sandbox/Editor/editor_lib_test_files.cmake +++ b/Code/Sandbox/Editor/editor_lib_test_files.cmake @@ -20,7 +20,6 @@ set(FILES Lib/Tests/test_MainWindowPythonBindings.cpp Lib/Tests/test_MaterialPythonFuncs.cpp Lib/Tests/test_ObjectManagerPythonBindings.cpp - Lib/Tests/test_SetVectorDlg.cpp Lib/Tests/test_TrackViewPythonBindings.cpp Lib/Tests/test_ViewPanePythonBindings.cpp Lib/Tests/test_ViewportTitleDlgPythonBindings.cpp diff --git a/Code/Sandbox/Editor/o3de_logo.svg b/Code/Sandbox/Editor/o3de_logo.svg index ac746c07a5..ba44566ce8 100644 --- a/Code/Sandbox/Editor/o3de_logo.svg +++ b/Code/Sandbox/Editor/o3de_logo.svg @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Camera.svg b/Code/Sandbox/Editor/res/Camera.svg index 9d48eea580..37a347837a 100644 --- a/Code/Sandbox/Editor/res/Camera.svg +++ b/Code/Sandbox/Editor/res/Camera.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Debug.svg b/Code/Sandbox/Editor/res/Debug.svg index 7bcfb21cda..ed97ba3f48 100644 --- a/Code/Sandbox/Editor/res/Debug.svg +++ b/Code/Sandbox/Editor/res/Debug.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Default_closed.svg b/Code/Sandbox/Editor/res/Default_closed.svg index 0a61514d44..9329e2d533 100644 --- a/Code/Sandbox/Editor/res/Default_closed.svg +++ b/Code/Sandbox/Editor/res/Default_closed.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Default_open.svg b/Code/Sandbox/Editor/res/Default_open.svg index 962ef99202..20ee7a5915 100644 --- a/Code/Sandbox/Editor/res/Default_open.svg +++ b/Code/Sandbox/Editor/res/Default_open.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Entity.svg b/Code/Sandbox/Editor/res/Entity.svg index 54f0e10960..33018dbeec 100644 --- a/Code/Sandbox/Editor/res/Entity.svg +++ b/Code/Sandbox/Editor/res/Entity.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Entity_Editor_Only.svg b/Code/Sandbox/Editor/res/Entity_Editor_Only.svg index e7007b6d62..2d3b999911 100644 --- a/Code/Sandbox/Editor/res/Entity_Editor_Only.svg +++ b/Code/Sandbox/Editor/res/Entity_Editor_Only.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Entity_Not_Active.svg b/Code/Sandbox/Editor/res/Entity_Not_Active.svg index 2d206dd943..5544322cf2 100644 --- a/Code/Sandbox/Editor/res/Entity_Not_Active.svg +++ b/Code/Sandbox/Editor/res/Entity_Not_Active.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Experimental.svg b/Code/Sandbox/Editor/res/Experimental.svg index d314f97ab4..47ce7d5f4d 100644 --- a/Code/Sandbox/Editor/res/Experimental.svg +++ b/Code/Sandbox/Editor/res/Experimental.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Eye.svg b/Code/Sandbox/Editor/res/Eye.svg index e3f7246313..a05f424751 100644 --- a/Code/Sandbox/Editor/res/Eye.svg +++ b/Code/Sandbox/Editor/res/Eye.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Files.svg b/Code/Sandbox/Editor/res/Files.svg index 03a5430a30..b76cdffb9e 100644 --- a/Code/Sandbox/Editor/res/Files.svg +++ b/Code/Sandbox/Editor/res/Files.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Gizmos.svg b/Code/Sandbox/Editor/res/Gizmos.svg index 4a17f8846c..e3cfe6fdbb 100644 --- a/Code/Sandbox/Editor/res/Gizmos.svg +++ b/Code/Sandbox/Editor/res/Gizmos.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Global.svg b/Code/Sandbox/Editor/res/Global.svg index d7cefa7ee4..a5f33b2406 100644 --- a/Code/Sandbox/Editor/res/Global.svg +++ b/Code/Sandbox/Editor/res/Global.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Motion.svg b/Code/Sandbox/Editor/res/Motion.svg index ba58d4dccf..8538797160 100644 --- a/Code/Sandbox/Editor/res/Motion.svg +++ b/Code/Sandbox/Editor/res/Motion.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Padlock.svg b/Code/Sandbox/Editor/res/Padlock.svg index c33e6782ff..f0fac87d82 100644 --- a/Code/Sandbox/Editor/res/Padlock.svg +++ b/Code/Sandbox/Editor/res/Padlock.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity.svg b/Code/Sandbox/Editor/res/Slice_Entity.svg index 9a82f2addb..6e863e3d21 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Editor_Only.svg b/Code/Sandbox/Editor/res/Slice_Entity_Editor_Only.svg index 45a59f3fb9..04f7d40bec 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Editor_Only.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Editor_Only.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified.svg index 270d9d1b5e..fc2b315d78 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only.svg index 24fdacfa2a..9d6da3d4d9 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only_Unsavable.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only_Unsavable.svg index 4663c0f095..007839b55a 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only_Unsavable.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Editor_Only_Unsavable.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active.svg index 4134715a82..d19f825c13 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active_Unsavable.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active_Unsavable.svg index 90095664df..bb6d303481 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active_Unsavable.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Not_Active_Unsavable.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Unsavable.svg b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Unsavable.svg index 00f0d378ea..71dcac8d78 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Modified_Unsavable.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Modified_Unsavable.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Entity_Not_Active.svg b/Code/Sandbox/Editor/res/Slice_Entity_Not_Active.svg index 3ac45b7e11..e2a735137c 100644 --- a/Code/Sandbox/Editor/res/Slice_Entity_Not_Active.svg +++ b/Code/Sandbox/Editor/res/Slice_Entity_Not_Active.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle.svg b/Code/Sandbox/Editor/res/Slice_Handle.svg index 7b2ee60d79..8ecf3e33a2 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle_Editor_Only.svg b/Code/Sandbox/Editor/res/Slice_Handle_Editor_Only.svg index bd5086fc1c..3370fef97b 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle_Editor_Only.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle_Editor_Only.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle_Modified.svg b/Code/Sandbox/Editor/res/Slice_Handle_Modified.svg index 5fca6999c1..23f91b23c8 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle_Modified.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle_Modified.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle_Modified_Editor_Only.svg b/Code/Sandbox/Editor/res/Slice_Handle_Modified_Editor_Only.svg index 7c6cc8aac8..92ac55ea59 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle_Modified_Editor_Only.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle_Modified_Editor_Only.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle_Modified_Not_Active.svg b/Code/Sandbox/Editor/res/Slice_Handle_Modified_Not_Active.svg index 85af107444..2d1f122abe 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle_Modified_Not_Active.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle_Modified_Not_Active.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Slice_Handle_Not_Active.svg b/Code/Sandbox/Editor/res/Slice_Handle_Not_Active.svg index 63bd14f6b1..aa9828a1e5 100644 --- a/Code/Sandbox/Editor/res/Slice_Handle_Not_Active.svg +++ b/Code/Sandbox/Editor/res/Slice_Handle_Not_Active.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/Viewport.svg b/Code/Sandbox/Editor/res/Viewport.svg index f286c380d4..cb9d4516ba 100644 --- a/Code/Sandbox/Editor/res/Viewport.svg +++ b/Code/Sandbox/Editor/res/Viewport.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_add.svg b/Code/Sandbox/Editor/res/db_library_add.svg index dc6f25e47c..731ae21f94 100644 --- a/Code/Sandbox/Editor/res/db_library_add.svg +++ b/Code/Sandbox/Editor/res/db_library_add.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_additem.svg b/Code/Sandbox/Editor/res/db_library_additem.svg index 73aa315558..0fb149de91 100644 --- a/Code/Sandbox/Editor/res/db_library_additem.svg +++ b/Code/Sandbox/Editor/res/db_library_additem.svg @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_cloneitem.svg b/Code/Sandbox/Editor/res/db_library_cloneitem.svg index 6359141d6d..8d18c112a7 100644 --- a/Code/Sandbox/Editor/res/db_library_cloneitem.svg +++ b/Code/Sandbox/Editor/res/db_library_cloneitem.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_copy.svg b/Code/Sandbox/Editor/res/db_library_copy.svg index 8bcfaeba3f..3294291ad7 100644 --- a/Code/Sandbox/Editor/res/db_library_copy.svg +++ b/Code/Sandbox/Editor/res/db_library_copy.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_delete.svg b/Code/Sandbox/Editor/res/db_library_delete.svg index dc342aa00d..ab8d4e506f 100644 --- a/Code/Sandbox/Editor/res/db_library_delete.svg +++ b/Code/Sandbox/Editor/res/db_library_delete.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_open.svg b/Code/Sandbox/Editor/res/db_library_open.svg index a5360b8972..18feb76526 100644 --- a/Code/Sandbox/Editor/res/db_library_open.svg +++ b/Code/Sandbox/Editor/res/db_library_open.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_paste.svg b/Code/Sandbox/Editor/res/db_library_paste.svg index ebfe9adc08..4b5b40e868 100644 --- a/Code/Sandbox/Editor/res/db_library_paste.svg +++ b/Code/Sandbox/Editor/res/db_library_paste.svg @@ -38,4 +38,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_refresh.svg b/Code/Sandbox/Editor/res/db_library_refresh.svg index b33c4139fd..e0201606a7 100644 --- a/Code/Sandbox/Editor/res/db_library_refresh.svg +++ b/Code/Sandbox/Editor/res/db_library_refresh.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_reload.svg b/Code/Sandbox/Editor/res/db_library_reload.svg index 8db9bd264a..ca940009f3 100644 --- a/Code/Sandbox/Editor/res/db_library_reload.svg +++ b/Code/Sandbox/Editor/res/db_library_reload.svg @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_removeitem.svg b/Code/Sandbox/Editor/res/db_library_removeitem.svg index b45e522205..cf4c4ac836 100644 --- a/Code/Sandbox/Editor/res/db_library_removeitem.svg +++ b/Code/Sandbox/Editor/res/db_library_removeitem.svg @@ -21,4 +21,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/db_library_save.svg b/Code/Sandbox/Editor/res/db_library_save.svg index 016a00ee83..cc97908a89 100644 --- a/Code/Sandbox/Editor/res/db_library_save.svg +++ b/Code/Sandbox/Editor/res/db_library_save.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/error_report_checkmark.svg b/Code/Sandbox/Editor/res/error_report_checkmark.svg index 04ac63c183..af476fa031 100644 --- a/Code/Sandbox/Editor/res/error_report_checkmark.svg +++ b/Code/Sandbox/Editor/res/error_report_checkmark.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/error_report_comment.svg b/Code/Sandbox/Editor/res/error_report_comment.svg index 40553a3f07..f4af17cfe0 100644 --- a/Code/Sandbox/Editor/res/error_report_comment.svg +++ b/Code/Sandbox/Editor/res/error_report_comment.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/error_report_error.svg b/Code/Sandbox/Editor/res/error_report_error.svg index bbe81b923b..3215a7f317 100644 --- a/Code/Sandbox/Editor/res/error_report_error.svg +++ b/Code/Sandbox/Editor/res/error_report_error.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/error_report_warning.svg b/Code/Sandbox/Editor/res/error_report_warning.svg index 05183c1f32..94fa8f59a5 100644 --- a/Code/Sandbox/Editor/res/error_report_warning.svg +++ b/Code/Sandbox/Editor/res/error_report_warning.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/CameraCollision-default.svg b/Code/Sandbox/Editor/res/infobar/CameraCollision-default.svg index f6da6faf3c..cc3bb8138b 100644 --- a/Code/Sandbox/Editor/res/infobar/CameraCollision-default.svg +++ b/Code/Sandbox/Editor/res/infobar/CameraCollision-default.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/GotoLocation-default.svg b/Code/Sandbox/Editor/res/infobar/GotoLocation-default.svg index e825d7e10d..d8ca099f38 100644 --- a/Code/Sandbox/Editor/res/infobar/GotoLocation-default.svg +++ b/Code/Sandbox/Editor/res/infobar/GotoLocation-default.svg @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/LockScale-default.svg b/Code/Sandbox/Editor/res/infobar/LockScale-default.svg index 13aba8ba62..8019a74893 100644 --- a/Code/Sandbox/Editor/res/infobar/LockScale-default.svg +++ b/Code/Sandbox/Editor/res/infobar/LockScale-default.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/LockSelection-default.svg b/Code/Sandbox/Editor/res/infobar/LockSelection-default.svg index c3afd554b3..d862f8b7f5 100644 --- a/Code/Sandbox/Editor/res/infobar/LockSelection-default.svg +++ b/Code/Sandbox/Editor/res/infobar/LockSelection-default.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/Mute-default.svg b/Code/Sandbox/Editor/res/infobar/Mute-default.svg index d20d8b8dbc..40f3b980bf 100644 --- a/Code/Sandbox/Editor/res/infobar/Mute-default.svg +++ b/Code/Sandbox/Editor/res/infobar/Mute-default.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/NoPlayerSync-default.svg b/Code/Sandbox/Editor/res/infobar/NoPlayerSync-default.svg index 25b6a2dfba..8c87f98433 100644 --- a/Code/Sandbox/Editor/res/infobar/NoPlayerSync-default.svg +++ b/Code/Sandbox/Editor/res/infobar/NoPlayerSync-default.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/NoPlayerSync-selected.svg b/Code/Sandbox/Editor/res/infobar/NoPlayerSync-selected.svg index b11452fe07..fc799a9c98 100644 --- a/Code/Sandbox/Editor/res/infobar/NoPlayerSync-selected.svg +++ b/Code/Sandbox/Editor/res/infobar/NoPlayerSync-selected.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/Pause-default.svg b/Code/Sandbox/Editor/res/infobar/Pause-default.svg index 10dd4e893e..f881ca5e1c 100644 --- a/Code/Sandbox/Editor/res/infobar/Pause-default.svg +++ b/Code/Sandbox/Editor/res/infobar/Pause-default.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/PausePlay-default.svg b/Code/Sandbox/Editor/res/infobar/PausePlay-default.svg index 546d59106f..469336531e 100644 --- a/Code/Sandbox/Editor/res/infobar/PausePlay-default.svg +++ b/Code/Sandbox/Editor/res/infobar/PausePlay-default.svg @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/PhysicsCol-default.svg b/Code/Sandbox/Editor/res/infobar/PhysicsCol-default.svg index 19efaf5fc6..96a88d5329 100644 --- a/Code/Sandbox/Editor/res/infobar/PhysicsCol-default.svg +++ b/Code/Sandbox/Editor/res/infobar/PhysicsCol-default.svg @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/VR-default.svg b/Code/Sandbox/Editor/res/infobar/VR-default.svg index fc81e0349e..0b666e0d88 100644 --- a/Code/Sandbox/Editor/res/infobar/VR-default.svg +++ b/Code/Sandbox/Editor/res/infobar/VR-default.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/infobar/XYZ-default.svg b/Code/Sandbox/Editor/res/infobar/XYZ-default.svg index f1d7d15149..2ec7313356 100644 --- a/Code/Sandbox/Editor/res/infobar/XYZ-default.svg +++ b/Code/Sandbox/Editor/res/infobar/XYZ-default.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layer_icon.svg b/Code/Sandbox/Editor/res/layer_icon.svg index 32676441ff..6979b23e28 100644 --- a/Code/Sandbox/Editor/res/layer_icon.svg +++ b/Code/Sandbox/Editor/res/layer_icon.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-0.svg b/Code/Sandbox/Editor/res/layouts/layouts-0.svg index 3889b46d67..9e59d88071 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-0.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-0.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-1.svg b/Code/Sandbox/Editor/res/layouts/layouts-1.svg index 81915122ad..05108c4820 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-1.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-1.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-2.svg b/Code/Sandbox/Editor/res/layouts/layouts-2.svg index 385ff391de..990d166166 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-2.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-2.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-3.svg b/Code/Sandbox/Editor/res/layouts/layouts-3.svg index 38c59c089c..52dce49b6d 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-3.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-3.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-4.svg b/Code/Sandbox/Editor/res/layouts/layouts-4.svg index 0883cf7261..166f736f8b 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-4.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-4.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-5.svg b/Code/Sandbox/Editor/res/layouts/layouts-5.svg index 227105c68a..904a564526 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-5.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-5.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-6.svg b/Code/Sandbox/Editor/res/layouts/layouts-6.svg index 9a89860383..a45f044d3b 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-6.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-6.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-7.svg b/Code/Sandbox/Editor/res/layouts/layouts-7.svg index ef70b005b4..5a06476dbe 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-7.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-7.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/layouts/layouts-8.svg b/Code/Sandbox/Editor/res/layouts/layouts-8.svg index 1eb5f8f1b6..8b2ac3fe95 100644 --- a/Code/Sandbox/Editor/res/layouts/layouts-8.svg +++ b/Code/Sandbox/Editor/res/layouts/layouts-8.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/lock_circle_default.svg b/Code/Sandbox/Editor/res/lock_circle_default.svg index 473ec52847..db88a17820 100644 --- a/Code/Sandbox/Editor/res/lock_circle_default.svg +++ b/Code/Sandbox/Editor/res/lock_circle_default.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/lock_circle_transparent.svg b/Code/Sandbox/Editor/res/lock_circle_transparent.svg index 485863b052..830cbb3909 100644 --- a/Code/Sandbox/Editor/res/lock_circle_transparent.svg +++ b/Code/Sandbox/Editor/res/lock_circle_transparent.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/lock_on_NotTransparent.svg b/Code/Sandbox/Editor/res/lock_on_NotTransparent.svg index 9fc6da8f87..a16d4bc52b 100644 --- a/Code/Sandbox/Editor/res/lock_on_NotTransparent.svg +++ b/Code/Sandbox/Editor/res/lock_on_NotTransparent.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/lock_on_transparent.svg b/Code/Sandbox/Editor/res/lock_on_transparent.svg index 8f7837e5f2..b5a3923c0f 100644 --- a/Code/Sandbox/Editor/res/lock_on_transparent.svg +++ b/Code/Sandbox/Editor/res/lock_on_transparent.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/locked.svg b/Code/Sandbox/Editor/res/locked.svg index 5bd99f2da7..effd0d1269 100644 --- a/Code/Sandbox/Editor/res/locked.svg +++ b/Code/Sandbox/Editor/res/locked.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/source_control-not_setup.svg b/Code/Sandbox/Editor/res/source_control-not_setup.svg index c558776704..25485cbeca 100644 --- a/Code/Sandbox/Editor/res/source_control-not_setup.svg +++ b/Code/Sandbox/Editor/res/source_control-not_setup.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/source_control-warning_v2.svg b/Code/Sandbox/Editor/res/source_control-warning_v2.svg index dc410e6283..a4dec8c322 100644 --- a/Code/Sandbox/Editor/res/source_control-warning_v2.svg +++ b/Code/Sandbox/Editor/res/source_control-warning_v2.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/source_control_connected.svg b/Code/Sandbox/Editor/res/source_control_connected.svg index df93ee9e30..a0b3739c53 100644 --- a/Code/Sandbox/Editor/res/source_control_connected.svg +++ b/Code/Sandbox/Editor/res/source_control_connected.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/source_control_error_v2.svg b/Code/Sandbox/Editor/res/source_control_error_v2.svg index 65bce37d60..16147e3a28 100644 --- a/Code/Sandbox/Editor/res/source_control_error_v2.svg +++ b/Code/Sandbox/Editor/res/source_control_error_v2.svg @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/unlocked.svg b/Code/Sandbox/Editor/res/unlocked.svg index d432a51c40..43a9609fb5 100644 --- a/Code/Sandbox/Editor/res/unlocked.svg +++ b/Code/Sandbox/Editor/res/unlocked.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/vis_circle_default.svg b/Code/Sandbox/Editor/res/vis_circle_default.svg index 473ec52847..db88a17820 100644 --- a/Code/Sandbox/Editor/res/vis_circle_default.svg +++ b/Code/Sandbox/Editor/res/vis_circle_default.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/vis_circle_transparent.svg b/Code/Sandbox/Editor/res/vis_circle_transparent.svg index 485863b052..830cbb3909 100644 --- a/Code/Sandbox/Editor/res/vis_circle_transparent.svg +++ b/Code/Sandbox/Editor/res/vis_circle_transparent.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/vis_on_NotTransparent.svg b/Code/Sandbox/Editor/res/vis_on_NotTransparent.svg index ea64dafcf5..f9242b6307 100644 --- a/Code/Sandbox/Editor/res/vis_on_NotTransparent.svg +++ b/Code/Sandbox/Editor/res/vis_on_NotTransparent.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/vis_on_transparent.svg b/Code/Sandbox/Editor/res/vis_on_transparent.svg index f3569c7cf8..2706b22ca4 100644 --- a/Code/Sandbox/Editor/res/vis_on_transparent.svg +++ b/Code/Sandbox/Editor/res/vis_on_transparent.svg @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/visb.svg b/Code/Sandbox/Editor/res/visb.svg index 690c3d121b..8b49015e07 100644 --- a/Code/Sandbox/Editor/res/visb.svg +++ b/Code/Sandbox/Editor/res/visb.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Editor/res/visb_hidden.svg b/Code/Sandbox/Editor/res/visb_hidden.svg index aeedd90eb5..7444982dcb 100644 --- a/Code/Sandbox/Editor/res/visb_hidden.svg +++ b/Code/Sandbox/Editor/res/visb_hidden.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.cpp index 8c2d2d2f38..2eff76c738 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.cpp @@ -68,4 +68,4 @@ void ComponentEntityDebugPrinter::OnTick(float /*deltaTime*/, AZ::ScriptTimePoin GetIEditor()->GetRenderer()->DrawTextQueued(Vec3(x, y, 0), textInfo, AZStd::string::format("Entities: %zu", numEntities).c_str()); } } -} \ No newline at end of file +} diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.h index 058f06750f..5a8c1d4856 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityDebugPrinter.h @@ -29,4 +29,4 @@ private: // TickBus void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; ////////////////////////////////////////////////////////////////////////// -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp index 17face523b..e5ad2a2872 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.cpp @@ -143,15 +143,6 @@ ComponentEntityEditorPlugin::ComponentEntityEditorPlugin([[maybe_unused]] IEdito LyViewPane::CategoryTools, pinnedInspectorOptions); - ViewPaneOptions levelInspectorOptions; - levelInspectorOptions.canHaveMultipleInstances = false; - levelInspectorOptions.preferedDockingArea = Qt::RightDockWidgetArea; - levelInspectorOptions.paneRect = QRect(50, 50, 400, 700); - RegisterViewPane( - LyViewPane::LevelInspector, - LyViewPane::CategoryTools, - levelInspectorOptions); - bool prefabSystemEnabled = false; AzFramework::ApplicationRequests::Bus::BroadcastResult(prefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); @@ -170,8 +161,14 @@ ComponentEntityEditorPlugin::ComponentEntityEditorPlugin([[maybe_unused]] IEdito } else { - // Add the Legacy Outliner to the Tools Menu + ViewPaneOptions levelInspectorOptions; + levelInspectorOptions.canHaveMultipleInstances = false; + levelInspectorOptions.preferedDockingArea = Qt::RightDockWidgetArea; + levelInspectorOptions.paneRect = QRect(50, 50, 400, 700); + RegisterViewPane( + LyViewPane::LevelInspector, LyViewPane::CategoryTools, levelInspectorOptions); + // Add the Legacy Outliner to the Tools Menu ViewPaneOptions outlinerOptions; outlinerOptions.canHaveMultipleInstances = true; outlinerOptions.preferedDockingArea = Qt::LeftDockWidgetArea; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.mf b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.mf index 09f696689c..997209477a 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.mf +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin.mf @@ -1,3 +1,3 @@  - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h index 581c453919..12757f5b24 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h @@ -21,7 +21,6 @@ #include #include #include -#include #include ///////////////////////////////////////////////////////////////////////////// diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp index 4a03dcd7dc..a97bdbf2ab 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp @@ -320,14 +320,6 @@ void CComponentEntityObject::OnSelected() // Invoked when selected via tools application, so we notify sandbox. const bool wasSelected = IsSelected(); GetIEditor()->GetObjectManager()->SelectObject(this); - - // If we get here and we're not already selected in sandbox land it means - // the selection started in AZ land and we need to clear any edit tool - // the user may have selected from the rollup bar - if (GetIEditor()->GetEditTool() && !wasSelected) - { - GetIEditor()->SetEditTool(nullptr); - } } } diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h index 4bf55cfbe6..fa59ec8507 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h @@ -24,6 +24,8 @@ #include #include +#include + #include "../Editor/Objects/EntityObject.h" #include #include diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp index 9c917b25c0..89ef4ead7f 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp @@ -1383,11 +1383,6 @@ void SandboxIntegrationManager::SetShowCircularDependencyError(const bool& showC } ////////////////////////////////////////////////////////////////////////// -void SandboxIntegrationManager::SetEditTool(const char* tool) -{ - GetIEditor()->SetEditTool(tool); -} - void SandboxIntegrationManager::LaunchLuaEditor(const char* files) { CCryEditApp::instance()->OpenLUAEditor(files); diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h index 36767605b2..ea4d2fe32b 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h @@ -162,7 +162,6 @@ private: bool GetUndoSliceOverrideSaveValue() override; bool GetShowCircularDependencyError() override; void SetShowCircularDependencyError(const bool& showCircularDependencyError) override; - void SetEditTool(const char* tool) override; void LaunchLuaEditor(const char* files) override; bool IsLevelDocumentOpen() override; AZStd::string GetLevelName() override; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/CategoriesList.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/CategoriesList.h index ce25813b93..116a1fc9b0 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/CategoriesList.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/CategoriesList.h @@ -40,4 +40,4 @@ protected: // Will emit OnCategoryChange signal void OnItemClicked(QTreeWidgetItem* item, int column); -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentDataModel.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentDataModel.h index 62758ef09d..857ef59b76 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentDataModel.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentDataModel.h @@ -129,4 +129,4 @@ public: protected: AZStd::string m_selectedCategory; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.cpp index 734d490c6c..a1ec03c2b1 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.h index 8116c86e51..3793fc929a 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/ComponentPaletteWindow.h @@ -58,4 +58,4 @@ protected: AzToolsFramework::SearchCriteriaWidget* m_filterWidget; void keyPressEvent(QKeyEvent* event) override; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FilteredComponentList.h b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FilteredComponentList.h index d0701be237..3f8e7f7fb0 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FilteredComponentList.h +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FilteredComponentList.h @@ -69,4 +69,4 @@ protected: AzToolsFramework::FilterByCategoryMap m_filtersRegExp; ComponentDataModel* m_componentDataModel; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default.svg index a603a23e64..450e94c4b7 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_hover.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_hover.svg index ed420de576..36cceef9e3 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_hover.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_hover.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_transparent.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_transparent.svg index 3f331871be..a3a09b1653 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_transparent.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_default_transparent.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on.svg index 5c61f11291..c616ed87c1 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_hover.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_hover.svg index 81f05cf689..410f751568 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_hover.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_hover.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_transparent.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_transparent.svg index 17367c29f2..f7e222c80f 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_transparent.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/lock_on_transparent.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_a_to_z.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_a_to_z.svg index 44e5893557..0d01d191f2 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_a_to_z.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_a_to_z.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_manually.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_manually.svg index b03a72498e..522b715969 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_manually.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_manually.svg @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_z_to_a.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_z_to_a.svg index 5c6aa6d165..d6acde4430 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_z_to_a.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/sort_z_to_a.svg @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default.svg index f9c2e3aca3..c7d4877809 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_hover.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_hover.svg index 54fbad2898..ae7f899c78 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_hover.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_hover.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_transparent.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_transparent.svg index c310e4343b..0469a3f4e9 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_transparent.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_default_transparent.svg @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on.svg index c50f830f28..f6d8a9c32f 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_hover.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_hover.svg index 6520636b57..a02fd53198 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_hover.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_hover.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_transparent.svg b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_transparent.svg index 15b5c34a5f..4d981e98fb 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_transparent.svg +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Icons/visibility_on_transparent.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp index f735048ed0..fb8084cb6f 100644 --- a/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp +++ b/Code/Sandbox/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp @@ -312,19 +312,6 @@ void OutlinerWidget::OnSelectionChanged(const QItemSelection& selected, const QI AzToolsFramework::EntityIdList newlyDeselected; ExtractEntityIdsFromSelection(deselected, newlyDeselected); - CEditTool* tool = GetIEditor()->GetEditTool(); - IClassDesc* classDescription = tool ? tool->GetClassDesc() : nullptr; - - if (classDescription && QString::compare(classDescription->ClassName(), "EditTool.Clone") == 0) - { - // if the user clicks an empty space or selects a different entity in the entity outliner, the clone operation will be accepted. - if ((newlySelected.empty() && !newlyDeselected.empty()) || !newlySelected.empty()) - { - tool->Accept(true); - GetIEditor()->GetSelection()->FinishChanges(); - } - } - AzToolsFramework::ScopedUndoBatch undo("Select Entity"); // initialize the selection command here to store the current selection before diff --git a/Code/Sandbox/Plugins/EditorAssetImporter/AssetBrowserContextProvider.h b/Code/Sandbox/Plugins/EditorAssetImporter/AssetBrowserContextProvider.h index ab638895e4..0b3cfac4ff 100644 --- a/Code/Sandbox/Plugins/EditorAssetImporter/AssetBrowserContextProvider.h +++ b/Code/Sandbox/Plugins/EditorAssetImporter/AssetBrowserContextProvider.h @@ -43,4 +43,4 @@ namespace AZ protected: bool HandlesSource(const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) const; // return true if we care about this kind of source file. }; -} \ No newline at end of file +} diff --git a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporter.qrc b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporter.qrc index aec2900006..5140ed81ab 100644 --- a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporter.qrc +++ b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporter.qrc @@ -14,4 +14,4 @@ ../../../../Editor/Icons/checkmark_checked_hover.png ../../../../Editor/Icons/checkmark_unchecked_hover.png - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterPlugin.h b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterPlugin.h index a02b0605e9..282e701624 100644 --- a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterPlugin.h +++ b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterPlugin.h @@ -97,4 +97,4 @@ private: // Context provider for the Asset Browser AZ::AssetBrowserContextProvider m_assetBrowserContextProvider; AZ::SceneSerializationHandler m_sceneSerializationHandler; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterWindow.h b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterWindow.h index 4be63daa07..fe689275db 100644 --- a/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterWindow.h +++ b/Code/Sandbox/Plugins/EditorAssetImporter/AssetImporterWindow.h @@ -124,4 +124,4 @@ private: int m_processingOverlayIndex; QSharedPointer m_processingOverlay; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/EditorAssetImporter/SceneSerializationHandler.h b/Code/Sandbox/Plugins/EditorAssetImporter/SceneSerializationHandler.h index a1044c4ba7..cf7d9ad4eb 100644 --- a/Code/Sandbox/Plugins/EditorAssetImporter/SceneSerializationHandler.h +++ b/Code/Sandbox/Plugins/EditorAssetImporter/SceneSerializationHandler.h @@ -38,4 +38,4 @@ namespace AZ AZStd::unordered_map> m_scenes; }; -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent.h b/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent.h index fc2e4713bc..49acc62f67 100644 --- a/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent.h +++ b/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent.h @@ -152,4 +152,4 @@ struct SCurveEditorContent } TCurveEditorCurves m_curves; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent_38.h b/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent_38.h index 7e11ba87d7..f11a135c80 100644 --- a/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent_38.h +++ b/Code/Sandbox/Plugins/EditorCommon/CurveEditorContent_38.h @@ -81,4 +81,4 @@ struct SCurveEditorContent } TCurveEditorCurves m_curves; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/EditorCommon/CurveEditor_38.h b/Code/Sandbox/Plugins/EditorCommon/CurveEditor_38.h index b90112d8d3..f0c5da608b 100644 --- a/Code/Sandbox/Plugins/EditorCommon/CurveEditor_38.h +++ b/Code/Sandbox/Plugins/EditorCommon/CurveEditor_38.h @@ -151,4 +151,4 @@ private: Vec2 m_translation; TRange m_timeRange; Range m_valueRange; -}; \ No newline at end of file +}; diff --git a/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/Ruler.h b/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/Ruler.h index e6be1a2eac..db599530ff 100644 --- a/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/Ruler.h +++ b/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/Ruler.h @@ -53,4 +53,4 @@ namespace DrawingPrimitives void DrawTicks(const std::vector& ticks, QPainter& painter, const QPalette& palette, const STickOptions& options); void DrawTicks(QPainter& painter, const QPalette& palette, const STickOptions& options); void DrawRuler(QPainter& painter, const QPalette& palette, const SRulerOptions& options, int* pRulerPrecision); -} \ No newline at end of file +} diff --git a/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/TimeSlider.h b/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/TimeSlider.h index dfbb778fab..b92c414b2a 100644 --- a/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/TimeSlider.h +++ b/Code/Sandbox/Plugins/EditorCommon/DrawingPrimitives/TimeSlider.h @@ -32,4 +32,4 @@ namespace DrawingPrimitives }; void DrawTimeSlider(QPainter& painter, const QPalette& palette, const STimeSliderOptions& options); -} \ No newline at end of file +} diff --git a/Code/Sandbox/Plugins/EditorCommon/QParentWndWidget.cpp b/Code/Sandbox/Plugins/EditorCommon/QParentWndWidget.cpp index d601d654c2..f0bbf572df 100644 --- a/Code/Sandbox/Plugins/EditorCommon/QParentWndWidget.cpp +++ b/Code/Sandbox/Plugins/EditorCommon/QParentWndWidget.cpp @@ -306,4 +306,4 @@ bool QParentWndWidget::focusNextPrevChild(bool next) return true; } -#include \ No newline at end of file +#include diff --git a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Linux/PAL_linux.cmake b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Linux/PAL_linux.cmake index 57d429ab32..7074ba07a4 100644 --- a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Linux/PAL_linux.cmake +++ b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED FALSE) diff --git a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Mac/PAL_mac.cmake b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Mac/PAL_mac.cmake index fa027e2d96..d84bc9317c 100644 --- a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Mac/PAL_mac.cmake +++ b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED TRUE) diff --git a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Windows/PAL_windows.cmake b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Windows/PAL_windows.cmake index fa027e2d96..d84bc9317c 100644 --- a/Code/Sandbox/Plugins/PerforcePlugin/Platform/Windows/PAL_windows.cmake +++ b/Code/Sandbox/Plugins/PerforcePlugin/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_P4PLUGIN_SUPPORTED TRUE) diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings.h b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings.h index bb9cc22fa8..ca74e98cff 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings.h +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings.h @@ -14,4 +14,4 @@ #include "PlatformSettings_Android.h" #include "PlatformSettings_Base.h" -#include "PlatformSettings_Ios.h" \ No newline at end of file +#include "PlatformSettings_Ios.h" diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Ios.h b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Ios.h index 79243d5208..f2ec86a57e 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Ios.h +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/PlatformSettings_Ios.h @@ -159,4 +159,4 @@ namespace ProjectSettingsTool IosIcons m_icons; IosLaunchscreens m_launchscreens; }; -} // namespace ProjectSettingsTool \ No newline at end of file +} // namespace ProjectSettingsTool diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/Platforms.h b/Code/Sandbox/Plugins/ProjectSettingsTool/Platforms.h index 31a0fae725..0ef97ff00c 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/Platforms.h +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/Platforms.h @@ -44,4 +44,4 @@ namespace ProjectSettingsTool Platform{ PlatformId::Ios, PlatformDataType::Plist } }; -} // namespace ProjectSettingsTool \ No newline at end of file +} // namespace ProjectSettingsTool diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/PlistDictionary.cpp b/Code/Sandbox/Plugins/ProjectSettingsTool/PlistDictionary.cpp index 6732a0129b..8725a3f307 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/PlistDictionary.cpp +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/PlistDictionary.cpp @@ -164,4 +164,4 @@ namespace ProjectSettingsTool return false; } -} // namespace ProjectSettingsTool \ No newline at end of file +} // namespace ProjectSettingsTool diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/ProjectSettingsValidator.h b/Code/Sandbox/Plugins/ProjectSettingsTool/ProjectSettingsValidator.h index a6f9f9a04e..38910ca6d4 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/ProjectSettingsValidator.h +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/ProjectSettingsValidator.h @@ -45,4 +45,4 @@ namespace ProjectSettingsTool // Tracks allocations of other QValidators so they don't leak QValidatorList m_otherValidators; }; -} // namespace ProjectSettingsTool \ No newline at end of file +} // namespace ProjectSettingsTool diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/icons/broken_link.svg b/Code/Sandbox/Plugins/ProjectSettingsTool/icons/broken_link.svg index 82a22181e0..c6adf14096 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/icons/broken_link.svg +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/icons/broken_link.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/Code/Sandbox/Plugins/ProjectSettingsTool/icons/link.svg b/Code/Sandbox/Plugins/ProjectSettingsTool/icons/link.svg index 227410c510..e37bfedb57 100644 --- a/Code/Sandbox/Plugins/ProjectSettingsTool/icons/link.svg +++ b/Code/Sandbox/Plugins/ProjectSettingsTool/icons/link.svg @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/.p4ignore b/Code/Tools/.p4ignore deleted file mode 100644 index eba2f26759..0000000000 --- a/Code/Tools/.p4ignore +++ /dev/null @@ -1,2 +0,0 @@ -#Ignore these directories -SDKs \ No newline at end of file diff --git a/Code/Tools/Android/ProjectBuilder/ProjectActivity.java b/Code/Tools/Android/ProjectBuilder/ProjectActivity.java index c9a3716f63..c9731cf602 100644 --- a/Code/Tools/Android/ProjectBuilder/ProjectActivity.java +++ b/Code/Tools/Android/ProjectBuilder/ProjectActivity.java @@ -26,4 +26,4 @@ public class ${ANDROID_PROJECT_ACTIVITY} extends LumberyardActivity System.loadLibrary("c++_shared"); Log.d("LMBR", "BootStrap: Finished Library load"); } -} \ No newline at end of file +} diff --git a/Code/Tools/Android/ProjectBuilder/android_builder.json b/Code/Tools/Android/ProjectBuilder/android_builder.json index 57dc39daa8..8bf18ee4c6 100644 --- a/Code/Tools/Android/ProjectBuilder/android_builder.json +++ b/Code/Tools/Android/ProjectBuilder/android_builder.json @@ -85,4 +85,4 @@ [ "wscript" ] -} \ No newline at end of file +} diff --git a/Code/Tools/Android/ProjectBuilder/android_libraries.json b/Code/Tools/Android/ProjectBuilder/android_libraries.json index 43a66ad7f9..49dc2c6a81 100644 --- a/Code/Tools/Android/ProjectBuilder/android_libraries.json +++ b/Code/Tools/Android/ProjectBuilder/android_libraries.json @@ -78,4 +78,4 @@ }] }] } -} \ No newline at end of file +} diff --git a/Code/Tools/Android/ProjectBuilder/bools.xml b/Code/Tools/Android/ProjectBuilder/bools.xml index 77249103f4..f5e5c499ed 100644 --- a/Code/Tools/Android/ProjectBuilder/bools.xml +++ b/Code/Tools/Android/ProjectBuilder/bools.xml @@ -4,4 +4,4 @@ ${ANDROID_USE_PATCH_OBB} ${ANDROID_ENABLE_KEEP_SCREEN_ON} ${ANDROID_DISABLE_IMMERSIVE_MODE} - \ No newline at end of file + diff --git a/Code/Tools/Android/ProjectBuilder/build.gradle.in b/Code/Tools/Android/ProjectBuilder/build.gradle.in index 0bf444b785..66f58294ab 100644 --- a/Code/Tools/Android/ProjectBuilder/build.gradle.in +++ b/Code/Tools/Android/ProjectBuilder/build.gradle.in @@ -79,4 +79,4 @@ ${CUSTOM_APPLY_ASSET_LAYOUT_RELEASE_TASK} ${CUSTOM_GRADLE_COPY_NATIVE_DEBUG_LIB_TASK} ${CUSTOM_GRADLE_COPY_NATIVE_PROFILE_LIB_TASK} ${CUSTOM_GRADLE_COPY_NATIVE_RELEASE_LIB_TASK} -} \ No newline at end of file +} diff --git a/Code/Tools/Android/ProjectBuilder/obb_downloader.xml b/Code/Tools/Android/ProjectBuilder/obb_downloader.xml index 41787a5495..e35377ce4f 100644 --- a/Code/Tools/Android/ProjectBuilder/obb_downloader.xml +++ b/Code/Tools/Android/ProjectBuilder/obb_downloader.xml @@ -164,4 +164,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetBundler/tests/DummyProject/project.json b/Code/Tools/AssetBundler/tests/DummyProject/project.json index 68629d303f..0fa6ec7011 100644 --- a/Code/Tools/AssetBundler/tests/DummyProject/project.json +++ b/Code/Tools/AssetBundler/tests/DummyProject/project.json @@ -11,4 +11,4 @@ "version_name" : "1.0.0.0", "orientation" : "landscape" } -} \ No newline at end of file +} diff --git a/Code/Tools/AssetBundler/tests/Gems/GemA/gem.json b/Code/Tools/AssetBundler/tests/Gems/GemA/gem.json index 83c5a6b7a1..c56e1aea6e 100644 --- a/Code/Tools/AssetBundler/tests/Gems/GemA/gem.json +++ b/Code/Tools/AssetBundler/tests/Gems/GemA/gem.json @@ -8,4 +8,4 @@ "Tags": ["Foo"], "IconPath": "preview.png", "EditorModule": true -} \ No newline at end of file +} diff --git a/Code/Tools/AssetBundler/tests/Gems/GemB/gem.json b/Code/Tools/AssetBundler/tests/Gems/GemB/gem.json index 1fad4dea8f..b150da656e 100644 --- a/Code/Tools/AssetBundler/tests/Gems/GemB/gem.json +++ b/Code/Tools/AssetBundler/tests/Gems/GemB/gem.json @@ -8,4 +8,4 @@ "Tags": ["Foo"], "IconPath": "preview.png", "EditorModule": true -} \ No newline at end of file +} diff --git a/Code/Tools/AssetBundler/tests/Gems/GemC/gem.json b/Code/Tools/AssetBundler/tests/Gems/GemC/gem.json index f9c4c35b67..c6c69d0535 100644 --- a/Code/Tools/AssetBundler/tests/Gems/GemC/gem.json +++ b/Code/Tools/AssetBundler/tests/Gems/GemC/gem.json @@ -8,4 +8,4 @@ "Tags": ["Foo"], "IconPath": "preview.png", "EditorModule": true -} \ No newline at end of file +} diff --git a/Code/Tools/AssetBundler/tests/main.h b/Code/Tools/AssetBundler/tests/main.h index 1d301e40f2..50a099a53c 100644 --- a/Code/Tools/AssetBundler/tests/main.h +++ b/Code/Tools/AssetBundler/tests/main.h @@ -13,4 +13,4 @@ namespace AssetBundler { extern const char RelativeTestFolder[]; -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderInfo.cpp b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderInfo.cpp index a27e5bffb3..78f27d0efe 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderInfo.cpp +++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderInfo.cpp @@ -190,4 +190,4 @@ namespace AssetBuilder } return functionAddr; } -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/AssetBuilder/Platform/Mac/AssetBuilderApplication_mac.cpp b/Code/Tools/AssetProcessor/AssetBuilder/Platform/Mac/AssetBuilderApplication_mac.cpp index a97e8ee82c..147fd22add 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/Platform/Mac/AssetBuilderApplication_mac.cpp +++ b/Code/Tools/AssetProcessor/AssetBuilder/Platform/Mac/AssetBuilderApplication_mac.cpp @@ -14,4 +14,4 @@ void AssetBuilderApplication::InstallCtrlHandler() { -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/AssetBuilder/Platform/Windows/AssetBuilderApplication_windows.cpp b/Code/Tools/AssetProcessor/AssetBuilder/Platform/Windows/AssetBuilderApplication_windows.cpp index 67df9f754e..d416d417af 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/Platform/Windows/AssetBuilderApplication_windows.cpp +++ b/Code/Tools/AssetProcessor/AssetBuilder/Platform/Windows/AssetBuilderApplication_windows.cpp @@ -32,4 +32,4 @@ namespace AssetBuilderApplicationPrivate void AssetBuilderApplication::InstallCtrlHandler() { ::SetConsoleCtrlHandler(AssetBuilderApplicationPrivate::CtrlHandlerRoutine, TRUE); -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_files.cmake b/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_files.cmake index 32a6097d89..cb3411f4ca 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_files.cmake +++ b/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_files.cmake @@ -20,4 +20,4 @@ set(FILES TraceMessageHook.h TraceMessageHook.cpp AssetBuilder.rc -) \ No newline at end of file +) diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderBusses.h b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderBusses.h index 0b65a39f3f..82cdbdd3a3 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderBusses.h +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderBusses.h @@ -117,4 +117,4 @@ namespace AssetBuilderSDK }; typedef AZ::EBus JobCommandBus; -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderEBusHelper.h b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderEBusHelper.h index 37a18b9cfc..ced4dea666 100644 --- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderEBusHelper.h +++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderEBusHelper.h @@ -68,4 +68,4 @@ namespace AssetBuilderSDK } -#endif //ASSETBUILDERUTILEBUSHELPER_H \ No newline at end of file +#endif //ASSETBUILDERUTILEBUSHELPER_H diff --git a/Code/Tools/AssetProcessor/Platform/Linux/AssetProcessor_Traits_Platform.h b/Code/Tools/AssetProcessor/Platform/Linux/AssetProcessor_Traits_Platform.h index 3b9426c567..8c3c58a555 100644 --- a/Code/Tools/AssetProcessor/Platform/Linux/AssetProcessor_Traits_Platform.h +++ b/Code/Tools/AssetProcessor/Platform/Linux/AssetProcessor_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessor_Traits_Platform.h b/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessor_Traits_Platform.h index 3f58347d98..f2a53e93e4 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessor_Traits_Platform.h +++ b/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessor_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json index 15c31c8f20..2c6bbd2282 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json @@ -56,4 +56,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json index 15c31c8f20..2c6bbd2282 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json @@ -56,4 +56,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/Contents.json b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/Contents.json index da4a164c91..2d92bd53fd 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/Contents.json +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/Contents.json @@ -3,4 +3,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake b/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake index a814e1b9ee..e065f9a1a2 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake +++ b/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake @@ -22,4 +22,4 @@ set_target_properties(AssetProcessor PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Platform/Mac/gui_info.plist RESOURCE ${CMAKE_CURRENT_SOURCE_DIR}/Platform/Mac/Images.xcassets XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AssetProcessorAppIcon -) \ No newline at end of file +) diff --git a/Code/Tools/AssetProcessor/Platform/Windows/AssetProcessor_Traits_Platform.h b/Code/Tools/AssetProcessor/Platform/Windows/AssetProcessor_Traits_Platform.h index aa9fc0372e..14b63beda9 100644 --- a/Code/Tools/AssetProcessor/Platform/Windows/AssetProcessor_Traits_Platform.h +++ b/Code/Tools/AssetProcessor/Platform/Windows/AssetProcessor_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/AssetProcessor/native/resourcecompiler/RCQueueSortModel.h b/Code/Tools/AssetProcessor/native/resourcecompiler/RCQueueSortModel.h index c8884b5b6d..103014d6e3 100644 --- a/Code/Tools/AssetProcessor/native/resourcecompiler/RCQueueSortModel.h +++ b/Code/Tools/AssetProcessor/native/resourcecompiler/RCQueueSortModel.h @@ -85,4 +85,4 @@ namespace AssetProcessor }; } // namespace AssetProcessor -#endif //ASSETPROCESSOR_RCQUEUESORTMODEL_H \ No newline at end of file +#endif //ASSETPROCESSOR_RCQUEUESORTMODEL_H diff --git a/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/assetBuilderSDKTest.h b/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/assetBuilderSDKTest.h index 27571dd501..271419b954 100644 --- a/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/assetBuilderSDKTest.h +++ b/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/assetBuilderSDKTest.h @@ -32,4 +32,4 @@ namespace AssetProcessor AZ::AllocatorInstance::Destroy(); } }; -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/native/ui/ConnectionEditDialog.h b/Code/Tools/AssetProcessor/native/ui/ConnectionEditDialog.h index cb5b88b075..b4c6bc68da 100644 --- a/Code/Tools/AssetProcessor/native/ui/ConnectionEditDialog.h +++ b/Code/Tools/AssetProcessor/native/ui/ConnectionEditDialog.h @@ -42,4 +42,4 @@ private: QLineEdit* m_id; QLineEdit* m_ipAddress; AzQtComponents::SpinBox* m_port; -}; \ No newline at end of file +}; diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor.qss b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor.qss index deebcbeb32..a9e3ce3ff6 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor.qss +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor.qss @@ -140,4 +140,4 @@ QListWidget::item:hover { QListWidget QHeaderView::section { background-color: rgb(34,34,34); -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_down.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_down.svg index 1aea01fe95..7fdba691b1 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_down.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_down.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_left.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_left.svg index f2d0956242..16485e827e 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_left.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_left.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_right.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_right.svg index 9254dfdd4b..30f071e34f 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_right.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_right.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_up.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_up.svg index 40b9a8a9a0..67ba425ce1 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_up.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_arrow_up.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto.svg index 118ebdc7d2..dd275ceeb3 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto_hover.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto_hover.svg index 3bcf8c062e..74b7589484 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto_hover.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_goto_hover.svg @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_plus.svg b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_plus.svg index 52e1234949..1efe6130d2 100644 --- a/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_plus.svg +++ b/Code/Tools/AssetProcessor/native/ui/style/AssetProcessor_plus.svg @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/AssetProcessor/native/unittests/MockConnectionHandler.h b/Code/Tools/AssetProcessor/native/unittests/MockConnectionHandler.h index 9cca9105a5..f0553d5e84 100644 --- a/Code/Tools/AssetProcessor/native/unittests/MockConnectionHandler.h +++ b/Code/Tools/AssetProcessor/native/unittests/MockConnectionHandler.h @@ -106,4 +106,4 @@ namespace AssetProcessor QByteArray m_payload; SendMessageCallBack m_callback; }; -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/native/utilities/BuilderManager.inl b/Code/Tools/AssetProcessor/native/utilities/BuilderManager.inl index c6c9e85cef..72b140ee61 100644 --- a/Code/Tools/AssetProcessor/native/utilities/BuilderManager.inl +++ b/Code/Tools/AssetProcessor/native/utilities/BuilderManager.inl @@ -93,4 +93,4 @@ namespace AssetProcessor return true; } -} // namespace AssetProcessor \ No newline at end of file +} // namespace AssetProcessor diff --git a/Code/Tools/AssetProcessor/native/utilities/CommunicatorTracePrinter.h b/Code/Tools/AssetProcessor/native/utilities/CommunicatorTracePrinter.h index ee22d6b088..14e5a0deaf 100644 --- a/Code/Tools/AssetProcessor/native/utilities/CommunicatorTracePrinter.h +++ b/Code/Tools/AssetProcessor/native/utilities/CommunicatorTracePrinter.h @@ -36,4 +36,4 @@ private: char m_streamBuffer[128]; AZStd::string m_stringBeingConcatenated; AZStd::string m_errorStringBeingConcatenated; -}; \ No newline at end of file +}; diff --git a/Code/Tools/AssetProcessor/native/utilities/PotentialDependencies.h b/Code/Tools/AssetProcessor/native/utilities/PotentialDependencies.h index 72debe03bc..2a8149566f 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PotentialDependencies.h +++ b/Code/Tools/AssetProcessor/native/utilities/PotentialDependencies.h @@ -66,4 +66,4 @@ namespace AssetProcessor AZStd::map m_uuids; AZStd::map m_assetIds; }; -} \ No newline at end of file +} diff --git a/Code/Tools/AssetProcessor/testdata/DummyProject/AssetProcessorGamePlatformConfig.ini b/Code/Tools/AssetProcessor/testdata/DummyProject/AssetProcessorGamePlatformConfig.ini index 0b09586c72..0416ea7f85 100644 --- a/Code/Tools/AssetProcessor/testdata/DummyProject/AssetProcessorGamePlatformConfig.ini +++ b/Code/Tools/AssetProcessor/testdata/DummyProject/AssetProcessorGamePlatformConfig.ini @@ -16,4 +16,4 @@ provo=copy ; this will remove "mov" from the default configuration [RC mov] -ignore=true \ No newline at end of file +ignore=true diff --git a/Code/Tools/AzTestRunner/Platform/Android/android_project.json b/Code/Tools/AzTestRunner/Platform/Android/android_project.json index dbea35299f..890c0172fc 100644 --- a/Code/Tools/AzTestRunner/Platform/Android/android_project.json +++ b/Code/Tools/AzTestRunner/Platform/Android/android_project.json @@ -10,4 +10,4 @@ "use_main_obb" : "false", "use_patch_obb" : "false" } -} \ No newline at end of file +} diff --git a/Code/Tools/AzTestRunner/Platform/Android/platform_android_files.cmake b/Code/Tools/AzTestRunner/Platform/Android/platform_android_files.cmake index e0c59dffb4..2d7068cd14 100644 --- a/Code/Tools/AzTestRunner/Platform/Android/platform_android_files.cmake +++ b/Code/Tools/AzTestRunner/Platform/Android/platform_android_files.cmake @@ -12,4 +12,4 @@ set(FILES platform_android.cpp native_app_glue_include.c -) \ No newline at end of file +) diff --git a/Code/Tools/AzTestRunner/Platform/Linux/platform_linux_files.cmake b/Code/Tools/AzTestRunner/Platform/Linux/platform_linux_files.cmake index 6546244ffc..4e5ea28bc0 100644 --- a/Code/Tools/AzTestRunner/Platform/Linux/platform_linux_files.cmake +++ b/Code/Tools/AzTestRunner/Platform/Linux/platform_linux_files.cmake @@ -12,4 +12,4 @@ set(FILES ../Common/platform_host_main.cpp ../Common/platform_host_posix.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/AzTestRunner/Platform/Mac/platform_mac_files.cmake b/Code/Tools/AzTestRunner/Platform/Mac/platform_mac_files.cmake index 6546244ffc..4e5ea28bc0 100644 --- a/Code/Tools/AzTestRunner/Platform/Mac/platform_mac_files.cmake +++ b/Code/Tools/AzTestRunner/Platform/Mac/platform_mac_files.cmake @@ -12,4 +12,4 @@ set(FILES ../Common/platform_host_main.cpp ../Common/platform_host_posix.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/AzTestRunner/Platform/Windows/platform_windows_files.cmake b/Code/Tools/AzTestRunner/Platform/Windows/platform_windows_files.cmake index 957af25fe5..11354f75b9 100644 --- a/Code/Tools/AzTestRunner/Platform/Windows/platform_windows_files.cmake +++ b/Code/Tools/AzTestRunner/Platform/Windows/platform_windows_files.cmake @@ -12,4 +12,4 @@ set(FILES ../Common/platform_host_main.cpp platform_windows.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/AzTestRunner/Platform/iOS/platform_ios_files.cmake b/Code/Tools/AzTestRunner/Platform/iOS/platform_ios_files.cmake index 533c1543b3..35a6518e2e 100644 --- a/Code/Tools/AzTestRunner/Platform/iOS/platform_ios_files.cmake +++ b/Code/Tools/AzTestRunner/Platform/iOS/platform_ios_files.cmake @@ -12,4 +12,4 @@ set(FILES Resources/Info.plist Launcher_iOS.mm -) \ No newline at end of file +) diff --git a/Code/Tools/CMakeLists.txt b/Code/Tools/CMakeLists.txt index b96ebae1ac..f106034c3c 100644 --- a/Code/Tools/CMakeLists.txt +++ b/Code/Tools/CMakeLists.txt @@ -13,8 +13,8 @@ add_subdirectory(SceneAPI) # Needs to go before AssetProcessor since it provides add_subdirectory(AssetProcessor) add_subdirectory(AWSNativeSDKInit) add_subdirectory(AzTestRunner) +add_subdirectory(CrashHandler) add_subdirectory(CryCommonTools) -add_subdirectory(CrySCompileServer) add_subdirectory(CryXML) add_subdirectory(HLSLCrossCompiler) add_subdirectory(HLSLCrossCompilerMETAL) @@ -22,11 +22,10 @@ add_subdirectory(News) add_subdirectory(PythonBindingsExample) add_subdirectory(RC) add_subdirectory(RemoteConsole) -add_subdirectory(CrashHandler) add_subdirectory(ShaderCacheGen) add_subdirectory(DeltaCataloger) add_subdirectory(SerializeContextTools) add_subdirectory(AssetBundler) add_subdirectory(GridHub) add_subdirectory(Standalone) -add_subdirectory(TestImpactFramework) \ No newline at end of file +add_subdirectory(TestImpactFramework) diff --git a/Code/Tools/CrashHandler/CMakeLists.txt b/Code/Tools/CrashHandler/CMakeLists.txt index 7c8229b8a4..ec41ef7c9e 100644 --- a/Code/Tools/CrashHandler/CMakeLists.txt +++ b/Code/Tools/CrashHandler/CMakeLists.txt @@ -32,11 +32,11 @@ ly_add_target( PRIVATE ${pal_dir} BUILD_DEPENDENCIES + PUBLIC + AZ::CrashSupport PRIVATE 3rdParty::Crashpad - AZ::AzCore AZ::AzFramework - AZ::CrashSupport ) string(REPLACE "." ";" version_list "${LY_VERSION_STRING}") @@ -67,11 +67,9 @@ ly_add_target( PRIVATE Uploader/include/Uploader BUILD_DEPENDENCIES - PRIVATE - AZ::AzCore - AZ::CrashSupport PUBLIC 3rdParty::Crashpad::Handler + AZ::CrashSupport ) add_subdirectory(Tools) diff --git a/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Android.h b/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Android.h index 6550db8787..a39abc6c95 100644 --- a/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Android.h +++ b/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Android.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_CRASHHANDLER_CONVERT_MULTIBYTE_CHARS 0 -#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 \ No newline at end of file +#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 diff --git a/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Platform.h b/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Platform.h index bd80335d94..b0a6c3eefd 100644 --- a/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Platform.h +++ b/Code/Tools/CrashHandler/Platform/Android/CrashHandler_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Linux.h b/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Linux.h index 6550db8787..a39abc6c95 100644 --- a/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Linux.h +++ b/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Linux.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_CRASHHANDLER_CONVERT_MULTIBYTE_CHARS 0 -#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 \ No newline at end of file +#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 diff --git a/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Platform.h b/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Platform.h index 6b652dc8f6..09197421f5 100644 --- a/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Platform.h +++ b/Code/Tools/CrashHandler/Platform/Linux/CrashHandler_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Mac.h b/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Mac.h index 6550db8787..a39abc6c95 100644 --- a/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Mac.h +++ b/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Mac.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_CRASHHANDLER_CONVERT_MULTIBYTE_CHARS 0 -#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 \ No newline at end of file +#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 diff --git a/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Platform.h b/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Platform.h index 98b7b66f5d..0c4d1b7aac 100644 --- a/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Platform.h +++ b/Code/Tools/CrashHandler/Platform/Mac/CrashHandler_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Platform.h b/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Platform.h index 816e8a78a9..0a79a91802 100644 --- a/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Platform.h +++ b/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Windows.h b/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Windows.h index 70bf0c4118..35f6a90316 100644 --- a/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Windows.h +++ b/Code/Tools/CrashHandler/Platform/Windows/CrashHandler_Traits_Windows.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_CRASHHANDLER_CONVERT_MULTIBYTE_CHARS 1 -#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 1 \ No newline at end of file +#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 1 diff --git a/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_Platform.h b/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_Platform.h index 31764c4dd0..f2a717899d 100644 --- a/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_Platform.h +++ b/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include \ No newline at end of file +#include diff --git a/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_iOS.h b/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_iOS.h index 6550db8787..a39abc6c95 100644 --- a/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_iOS.h +++ b/Code/Tools/CrashHandler/Platform/iOS/CrashHandler_Traits_iOS.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_CRASHHANDLER_CONVERT_MULTIBYTE_CHARS 0 -#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 \ No newline at end of file +#define AZ_TRAIT_CRASHHANDLER_WAIT_FOR_COMPLETED_HANDLER_LAUNCH 0 diff --git a/Code/Tools/CrashHandler/Shared/CrashHandler.h b/Code/Tools/CrashHandler/Shared/CrashHandler.h index df5185283b..487e27291e 100644 --- a/Code/Tools/CrashHandler/Shared/CrashHandler.h +++ b/Code/Tools/CrashHandler/Shared/CrashHandler.h @@ -69,4 +69,4 @@ namespace CrashHandler std::string m_submissionToken; }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Support/CMakeLists.txt b/Code/Tools/CrashHandler/Support/CMakeLists.txt index 2445b50db5..c67be28949 100644 --- a/Code/Tools/CrashHandler/Support/CMakeLists.txt +++ b/Code/Tools/CrashHandler/Support/CMakeLists.txt @@ -19,6 +19,6 @@ ly_add_target( PUBLIC include BUILD_DEPENDENCIES - PRIVATE + PUBLIC AZ::AzCore ) diff --git a/Code/Tools/CrashHandler/Support/include/CrashSupport.h b/Code/Tools/CrashHandler/Support/include/CrashSupport.h index 2079d2fe1b..071ab62975 100644 --- a/Code/Tools/CrashHandler/Support/include/CrashSupport.h +++ b/Code/Tools/CrashHandler/Support/include/CrashSupport.h @@ -82,4 +82,4 @@ namespace CrashHandler returnPath = returnPath.substr(0, extPos); } } -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Support/platform/win/CrashSupport_win.cpp b/Code/Tools/CrashHandler/Support/platform/win/CrashSupport_win.cpp index bfa239cee3..f3bb210dda 100644 --- a/Code/Tools/CrashHandler/Support/platform/win/CrashSupport_win.cpp +++ b/Code/Tools/CrashHandler/Support/platform/win/CrashSupport_win.cpp @@ -35,4 +35,4 @@ namespace CrashHandler time(&rawtime); localtime_s(&timeInfo, &rawtime); } -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Support/src/CrashSupport.cpp b/Code/Tools/CrashHandler/Support/src/CrashSupport.cpp index d5c9739dda..058b191089 100644 --- a/Code/Tools/CrashHandler/Support/src/CrashSupport.cpp +++ b/Code/Tools/CrashHandler/Support/src/CrashSupport.cpp @@ -31,4 +31,4 @@ namespace CrashHandler return buffer; } -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Tools/CMakeLists.txt b/Code/Tools/CrashHandler/Tools/CMakeLists.txt index 390ff7b07d..d8e29ccbed 100644 --- a/Code/Tools/CrashHandler/Tools/CMakeLists.txt +++ b/Code/Tools/CrashHandler/Tools/CMakeLists.txt @@ -21,13 +21,13 @@ ly_add_target( tools_crash_handler_files.cmake Platform/${PAL_PLATFORM_NAME}/tools_crash_handler_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake INCLUDE_DIRECTORIES - PRIVATE + PUBLIC . BUILD_DEPENDENCIES + PUBLIC + AZ::CrashHandler PRIVATE 3rdParty::Qt::Core - AZ::CrashHandler - AZ::CrashSupport AZ::AzToolsFramework ) @@ -41,18 +41,14 @@ ly_add_target( Platform/${PAL_PLATFORM_NAME}/tools_crash_uploader_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake INCLUDE_DIRECTORIES PRIVATE - . Uploader BUILD_DEPENDENCIES PRIVATE 3rdParty::Qt::Core 3rdParty::Qt::Gui 3rdParty::Qt::Widgets - 3rdParty::Crashpad - 3rdParty::Crashpad::Handler AZ::CrashUploaderSupport AZ::AzQtComponents - AZ::CrashSupport TARGET_PROPERTIES Qt5_NO_LINK_QTMAIN TRUE ) diff --git a/Code/Tools/CrashHandler/Tools/ToolsCrashHandler.h b/Code/Tools/CrashHandler/Tools/ToolsCrashHandler.h index 1b6a9615c8..1810649305 100644 --- a/Code/Tools/CrashHandler/Tools/ToolsCrashHandler.h +++ b/Code/Tools/CrashHandler/Tools/ToolsCrashHandler.h @@ -37,4 +37,4 @@ namespace CrashHandler virtual void GetOSAnnotations(CrashHandlerAnnotations& annotations) const override; }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Tools/ToolsCrashHandler_win.cpp b/Code/Tools/CrashHandler/Tools/ToolsCrashHandler_win.cpp index 501407abfe..66244fe23c 100644 --- a/Code/Tools/CrashHandler/Tools/ToolsCrashHandler_win.cpp +++ b/Code/Tools/CrashHandler/Tools/ToolsCrashHandler_win.cpp @@ -33,4 +33,4 @@ namespace CrashHandler } return returnPath; } -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Tools/Uploader/ToolsCrashUploader.h b/Code/Tools/CrashHandler/Tools/Uploader/ToolsCrashUploader.h index fce321ceb8..bfb5bb1805 100644 --- a/Code/Tools/CrashHandler/Tools/Uploader/ToolsCrashUploader.h +++ b/Code/Tools/CrashHandler/Tools/Uploader/ToolsCrashUploader.h @@ -26,4 +26,4 @@ namespace O3de static std::string GetRootFolder(); }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Uploader/include/Uploader/BufferedDataStream.h b/Code/Tools/CrashHandler/Uploader/include/Uploader/BufferedDataStream.h index 6eb25c1857..d797b4c5d9 100644 --- a/Code/Tools/CrashHandler/Uploader/include/Uploader/BufferedDataStream.h +++ b/Code/Tools/CrashHandler/Uploader/include/Uploader/BufferedDataStream.h @@ -33,4 +33,4 @@ namespace O3de BufferedDataStream& operator=(const BufferedDataStream& rhs) = delete; }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Uploader/include/Uploader/CrashUploader.h b/Code/Tools/CrashHandler/Uploader/include/Uploader/CrashUploader.h index dee0c03e67..a886bd3d25 100644 --- a/Code/Tools/CrashHandler/Uploader/include/Uploader/CrashUploader.h +++ b/Code/Tools/CrashHandler/Uploader/include/Uploader/CrashUploader.h @@ -72,4 +72,4 @@ namespace O3de std::string m_submissionToken; std::string m_executableName; }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Uploader/include/Uploader/FileStreamDataSource.h b/Code/Tools/CrashHandler/Uploader/include/Uploader/FileStreamDataSource.h index 0193b185ff..2409a804c8 100644 --- a/Code/Tools/CrashHandler/Uploader/include/Uploader/FileStreamDataSource.h +++ b/Code/Tools/CrashHandler/Uploader/include/Uploader/FileStreamDataSource.h @@ -31,4 +31,4 @@ namespace O3de base::FilePath m_filePath; }; -} \ No newline at end of file +} diff --git a/Code/Tools/CrashHandler/Uploader/src/CrashUploader.cpp b/Code/Tools/CrashHandler/Uploader/src/CrashUploader.cpp index 037b3aee5b..57cbfa3369 100644 --- a/Code/Tools/CrashHandler/Uploader/src/CrashUploader.cpp +++ b/Code/Tools/CrashHandler/Uploader/src/CrashUploader.cpp @@ -138,7 +138,7 @@ namespace O3de if (!logFileReader->Open(thisFile)) { #if defined(AZ_PLATFORM_WINDOWS) - LOG(ERROR) << "Failed to open " << base::UTF16ToUTF8(thisFile.BaseName().value()); + LOG(ERROR) << "Failed to open " << base::WideToUTF8(thisFile.BaseName().value()); #else LOG(ERROR) << "Failed to open " << thisFile.BaseName().value(); #endif @@ -149,7 +149,7 @@ namespace O3de if (start_offset < 0) { #if defined(AZ_PLATFORM_WINDOWS) - LOG(ERROR) << "Failed to get offset for " << base::UTF16ToUTF8(thisFile.BaseName().value()); + LOG(ERROR) << "Failed to get offset for " << base::WideToUTF8(thisFile.BaseName().value()); #else LOG(ERROR) << "Failed to get offset for " << thisFile.BaseName().value(); #endif @@ -162,7 +162,7 @@ namespace O3de std::string fileNameKey{ "attachment_" }; #if defined(AZ_PLATFORM_WINDOWS) - fileNameKey += base::UTF16ToUTF8(thisFile.BaseName().value()); + fileNameKey += base::WideToUTF8(thisFile.BaseName().value()); #else fileNameKey += thisFile.BaseName().value(); #endif @@ -246,4 +246,4 @@ namespace O3de // Reset so we can loop again inside crashpad optind = 0; } -} \ No newline at end of file +} diff --git a/Code/Tools/CryCommonTools/Decompose.h b/Code/Tools/CryCommonTools/Decompose.h index 6f3800a129..88e04737b6 100644 --- a/Code/Tools/CryCommonTools/Decompose.h +++ b/Code/Tools/CryCommonTools/Decompose.h @@ -27,4 +27,4 @@ void invert_affine(AffineParts *parts, AffineParts *inverse); #endif // CRYINCLUDE_CRYCOMMONTOOLS_DECOMPOSE_H -} \ No newline at end of file +} diff --git a/Code/Tools/CryCommonTools/Export/AnimationData.cpp b/Code/Tools/CryCommonTools/Export/AnimationData.cpp index e5a3adcdee..2b2c5966a6 100644 --- a/Code/Tools/CryCommonTools/Export/AnimationData.cpp +++ b/Code/Tools/CryCommonTools/Export/AnimationData.cpp @@ -294,4 +294,4 @@ NonSkeletalAnimationData::State::State() NonSkeletalAnimationData::ModelEntry::ModelEntry() : flags(0) { -} \ No newline at end of file +} diff --git a/Code/Tools/CryCommonTools/Export/ExportSourceDecoratorBase.cpp b/Code/Tools/CryCommonTools/Export/ExportSourceDecoratorBase.cpp index 53bd1b1488..5fd0cb855f 100644 --- a/Code/Tools/CryCommonTools/Export/ExportSourceDecoratorBase.cpp +++ b/Code/Tools/CryCommonTools/Export/ExportSourceDecoratorBase.cpp @@ -127,4 +127,4 @@ bool ExportSourceDecoratorBase::HasValidRotController(const IModelData* modelDat bool ExportSourceDecoratorBase::HasValidSclController(const IModelData* modelData, int modelIndex) const { return this->source->HasValidSclController(modelData, modelIndex); -} \ No newline at end of file +} diff --git a/Code/Tools/CryCommonTools/Export/MaterialHelpers.cpp b/Code/Tools/CryCommonTools/Export/MaterialHelpers.cpp index fe1e24d01e..82b9d1b88d 100644 --- a/Code/Tools/CryCommonTools/Export/MaterialHelpers.cpp +++ b/Code/Tools/CryCommonTools/Export/MaterialHelpers.cpp @@ -104,4 +104,4 @@ bool MaterialHelpers::WriteMaterials(const std::string& filename, const std::vec { return false; } -} \ No newline at end of file +} diff --git a/Code/Tools/CryCommonTools/crycommontools_files.cmake b/Code/Tools/CryCommonTools/crycommontools_files.cmake index ae0937655e..d68c49836a 100644 --- a/Code/Tools/CryCommonTools/crycommontools_files.cmake +++ b/Code/Tools/CryCommonTools/crycommontools_files.cmake @@ -51,4 +51,4 @@ set(FILES ZipDir/ZipFileFormat.h ZipDir/ZipFileFormat_info.h SuffixUtil.h -) \ No newline at end of file +) diff --git a/Code/Tools/CryFXC/cryfxc/cryfxc.vcxproj b/Code/Tools/CryFXC/cryfxc/cryfxc.vcxproj index ab57f4c7f6..f995e69e2e 100644 --- a/Code/Tools/CryFXC/cryfxc/cryfxc.vcxproj +++ b/Code/Tools/CryFXC/cryfxc/cryfxc.vcxproj @@ -150,4 +150,4 @@ - \ No newline at end of file + diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/CMakeLists.txt b/Code/Tools/CrySCompileServer/CrySCompileServer/CMakeLists.txt deleted file mode 100644 index ca22619c92..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) -ly_get_list_relative_pal_filename(common_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/Common) -ly_get_pal_tool_dirs(pal_tool_dirs ${CMAKE_CURRENT_LIST_DIR}/Platform) -ly_get_pal_tool_dirs(pal_tool_core_server_dirs ${CMAKE_CURRENT_LIST_DIR}/Core/Server/Platform) - -include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) - -if(NOT PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED OR NOT PAL_TRAIT_BUILD_HOST_TOOLS) - return() -endif() - -set(platform_tools_files) -foreach(enabled_platform ${LY_PAL_TOOLS_ENABLED}) - string(TOLOWER ${enabled_platform} enabled_platform_lowercase) - ly_get_list_relative_pal_filename(pal_tool_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${enabled_platform}) - list(APPEND platform_tools_files ${pal_tool_dir}/pal_tools_${enabled_platform_lowercase}.cmake) -endforeach() - -ly_add_target( - NAME CrySCompileServer EXECUTABLE - NAMESPACE Legacy - FILES_CMAKE - cryscompileserver_files.cmake - PLATFORM_INCLUDE_FILES - Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake - ${platform_tools_files} - ${common_dir}/${PAL_TRAIT_COMPILER_ID}/cryscompileserver_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake - INCLUDE_DIRECTORIES - PUBLIC - . - External - PRIVATE - ${pal_tool_dirs} - ${pal_tool_core_server_dirs} - BUILD_DEPENDENCIES - PRIVATE - 3rdParty::zlib - AZ::AzCore - AZ::AzFramework -) -ly_add_source_properties( - SOURCES - Core/Server/CrySimpleJobCompile.cpp - CrySCompileServer.cpp - PROPERTY COMPILE_DEFINITIONS - VALUES ${LY_PAL_TOOLS_DEFINES} -) -ly_add_source_properties( - SOURCES Core/Server/CrySimpleServer.cpp - PROPERTY COMPILE_DEFINITIONS - VALUES ${LY_PAL_TOOLS_DEFINES} -) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Common.h b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Common.h deleted file mode 100644 index d228fc1dc3..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Common.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_CRYSCOMPILESERVER_CORE_COMMON_H -#define CRYINCLUDE_CRYSCOMPILESERVER_CORE_COMMON_H -#pragma once - -#include -#include -#include - -#if defined(AZ_PLATFORM_WINDOWS) -# if !defined(_WIN32_WINNT) -# define _WIN32_WINNT 0x0501 -# endif - -// Windows platform requires either a long or an unsigned long/uint64 for the -// Interlock instructions. -typedef long AtomicCountType; - -#else - -// Linux/Mac platforms don't support a long for the atomic types, only int32 or -// int64 (no unsigned support). -typedef int32_t AtomicCountType; - -#endif - -#endif // CRYINCLUDE_CRYSCOMPILESERVER_CORE_COMMON_H diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.cpp deleted file mode 100644 index edbdcc6997..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "StdTypes.hpp" -#include "Error.hpp" -#include -#include "Server/CrySimpleErrorLog.hpp" -#include "Server/CrySimpleJob.hpp" - -#include -#include -#include - -ICryError::ICryError(EErrorType t) - : m_eType(t) - , m_numDupes(0) -{ -} - -void logmessage(const char* text, ...) -{ - va_list arg; - va_start(arg, text); - - char szBuffer[256]; - char* error = szBuffer; - int bufferlen = sizeof(szBuffer) - 1; - memset(szBuffer, 0, sizeof(szBuffer)); - - long req = CCrySimpleJob::GlobalRequestNumber(); - - int ret = azsnprintf(error, bufferlen, "%8ld | ", req); - - if (ret <= 0) - { - return; - } - error += ret; - bufferlen -= ret; - - time_t ltime; - time(<ime); - tm today; -#if defined(AZ_PLATFORM_WINDOWS) - localtime_s(&today, <ime); -#else - localtime_r(<ime, &today); -#endif - ret = (int)strftime(error, bufferlen, "%d/%m %H:%M:%S | ", &today); - - if (ret <= 0) - { - return; - } - error += ret; - bufferlen -= ret; - - vsnprintf(error, bufferlen, text, arg); - - AZ_TracePrintf(0, szBuffer); - - va_end(arg); -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.hpp deleted file mode 100644 index 8e432ce29a..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Error.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __DXPSERROR__ -#define __DXPSERROR__ - -#include -#include -#include "STLHelper.hpp" - -// printf wrapper to format things nicely -void logmessage(const char* text, ...); - -class ICryError -{ -public: - enum EErrorType - { - SIMPLE_ERROR = 0, - COMPILE_ERROR, - }; - - enum EOutputFormatType - { - OUTPUT_EMAIL = 0, - OUTPUT_TTY, - OUTPUT_HASH, - }; - - ICryError(EErrorType t); - virtual ~ICryError() {}; - - EErrorType GetType() const { return m_eType; } - - tdHash Hash() const { return CSTLHelper::Hash(GetErrorName() + GetErrorDetails(OUTPUT_HASH)); }; - - virtual bool Compare(const ICryError* err) const - { - if (GetType() != err->GetType()) - { - return GetType() < err->GetType(); - } - return Hash() < err->Hash(); - }; - virtual bool CanMerge([[maybe_unused]] const ICryError* err) const { return true; } - - virtual void AddDuplicate([[maybe_unused]] ICryError* err) { m_numDupes++; } - uint32_t NumDuplicates() const { return m_numDupes; } - - virtual void SetUniqueID([[maybe_unused]] int uniqueID) {} - - virtual bool HasFile() const { return false; }; - - virtual void AddCCs([[maybe_unused]] std::set& ccs) const {} - - virtual std::string GetErrorName() const = 0; - virtual std::string GetErrorDetails(EOutputFormatType outputType) const = 0; - virtual std::string GetFilename() const { return "NoFile"; } - virtual std::string GetFileContents() const { return ""; } -private: - EErrorType m_eType; - uint32_t m_numDupes; -}; - -class CSimpleError - : public ICryError -{ -public: - CSimpleError(const std::string& in_text) - : ICryError(SIMPLE_ERROR) - , m_text(in_text) {} - virtual ~CSimpleError() {} - - virtual std::string GetErrorName() const { return m_text; }; - virtual std::string GetErrorDetails([[maybe_unused]] EOutputFormatType outputType) const { return m_text; }; -private: - std::string m_text; -}; - - -#define CrySimple_ERROR(X) throw new CSimpleError(X) -#define CrySimple_SECURE_START try{ -#define CrySimple_SECURE_END }catch (const ICryError* err) {printf(err->GetErrorName().c_str()); delete err; } - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/MD5.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/MD5.hpp deleted file mode 100644 index f79725f9af..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/MD5.hpp +++ /dev/null @@ -1,334 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CSCMD5__ -#define __CSCMD5__ - -/* -* This code implements the MD5 message-digest algorithm. -* The algorithm is due to Ron Rivest. This code was -* written by Colin Plumb in 1993, no copyright is claimed. -* This code is in the public domain; do with it what you wish. -* -* Equivalent code is available from RSA Data Security, Inc. -* This code has been tested against that, and is equivalent, -* except that you don't need to include two pages of legalese -* with every copy. -* -* To compute the message digest of a chunk of bytes, declare an -* MD5Context structure, pass it to MD5Init, call MD5Update as -* needed on buffers full of bytes, and then call MD5Final, which -* will fill a supplied 16-byte array with the digest. -*/ - -/* This code was modified in 1997 by Jim Kingdon of Cyclic Software to -not require an integer type which is exactly 32 bits. This work -draws on the changes for the same purpose by Tatu Ylonen - as part of SSH, but since I didn't actually use -that code, there is no copyright issue. I hereby disclaim -copyright in any changes I have made; this code remains in the -public domain. */ - -/* Note regarding cvs_* namespace: this avoids potential conflicts -with libraries such as some versions of Kerberos. No particular -need to worry about whether the system supplies an MD5 library, as -this file is only about 3k of object code. */ - - -struct cvs_MD5Context -{ - uint32_t buf[4]; - uint32_t bits[2]; - unsigned char in[64]; -}; - -void cvs_MD5Init(struct cvs_MD5Context* context); -void cvs_MD5Update(struct cvs_MD5Context* context, unsigned char const* buf, unsigned len); -void cvs_MD5Final(unsigned char digest[16], struct cvs_MD5Context* context); -void cvs_MD5Transform(uint32_t buf[4], const unsigned char in[64]); - -/* Little-endian byte-swapping routines. Note that these do not -depend on the size of datatypes such as uint32_t, nor do they require -us to detect the endianness of the machine we are running on. It -is possible they should be macros for speed, but I would be -surprised if they were a performance bottleneck for MD5. */ - -uint32_t getu32 (const unsigned char* addr) -{ - return (((((unsigned long)addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0]; -} - -void putu32(uint32_t data, unsigned char* addr) -{ - addr[0] = (unsigned char)data; - addr[1] = (unsigned char)(data >> 8); - addr[2] = (unsigned char)(data >> 16); - addr[3] = (unsigned char)(data >> 24); -} - -/* -* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious -* initialization constants. -*/ -void cvs_MD5Init(cvs_MD5Context& rCtx) -{ - rCtx.buf[0] = 0x67452301; - rCtx.buf[1] = 0xefcdab89; - rCtx.buf[2] = 0x98badcfe; - rCtx.buf[3] = 0x10325476; - rCtx.bits[0] = 0; - rCtx.bits[1] = 0; -} - -/* -* Update context to reflect the concatenation of another buffer full -* of bytes. -*/ -void cvs_MD5Update(cvs_MD5Context& rCtx, unsigned char const* buf, uint32_t len) -{ - uint32_t t; - - /* Update bitcount */ - - t = rCtx.bits[0]; - if ((rCtx.bits[0] = (t + ((uint32_t)len << 3)) & 0xffffffff) < t) - { - rCtx.bits[1]++; /* Carry from low to high */ - } - rCtx.bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) - { - unsigned char* p = rCtx.in + t; - - t = 64 - t; - if (len < t) - { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - cvs_MD5Transform (rCtx.buf, rCtx.in); - buf += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - - while (len >= 64) - { - memcpy(rCtx.in, buf, 64); - cvs_MD5Transform (rCtx.buf, rCtx.in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(rCtx.in, buf, len); -} - -/* -* Final wrapup - pad to 64-byte boundary with the bit pattern -* 1 0* (64-bit count of bits processed, MSB-first) -*/ -void cvs_MD5Final(unsigned char digest[16], cvs_MD5Context& rCtx) -{ - unsigned count; - uint8_t* p; - - /* Compute number of bytes mod 64 */ - count = (rCtx.bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = rCtx.in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) - { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - cvs_MD5Transform (rCtx.buf, rCtx.in); - - /* Now fill the next block with 56 bytes */ - memset(rCtx.in, 0, 56); - } - else - { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - - /* Append length in bits and transform */ - putu32(rCtx.bits[0], rCtx.in + 56); - putu32(rCtx.bits[1], rCtx.in + 60); - - cvs_MD5Transform (rCtx.buf, rCtx.in); - putu32(rCtx.buf[0], digest); - putu32(rCtx.buf[1], digest + 4); - putu32(rCtx.buf[2], digest + 8); - putu32(rCtx.buf[3], digest + 12); - //memset(&rCtx,0,sizeof(rCtx)); // In case it's sensitive -} - - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - (w += f(x, y, z) + data, w &= 0xffffffff, w = w << s | w >> (32 - s), w += x) - -/* -* The core of the MD5 algorithm, this alters an existing MD5 hash to -* reflect the addition of 16 longwords of new data. MD5Update blocks -* the data and converts bytes into longwords for this routine. -*/ -void cvs_MD5Transform(uint32_t buf[4], const unsigned char inraw[64]) -{ - uint32_t a, b, c, d; - uint32_t in[16]; - int i; - - for (i = 0; i < 16; ++i) - { - in[i] = getu32 (inraw + 4 * i); - } - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[ 2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[ 7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[ 5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[ 3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[ 1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[ 8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[ 6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[ 4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[ 2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[ 9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -/* -#include - -int -main (int argc, char **argv) -{ - struct cvs_MD5Context context; - unsigned char checksum[16]; - int i; - int j; - - if (argc < 2) - { - fprintf (stderr, "usage: %s string-to-hash\n", argv[0]); - exit (1); - } - for (j = 1; j < argc; ++j) - { - printf ("MD5 (\"%s\") = ", argv[j]); - cvs_MD5Init (&context); - cvs_MD5Update (&context, argv[j], strlen (argv[j])); - cvs_MD5Final (checksum, &context); - for (i = 0; i < 16; i++) - { - printf ("%02x", (unsigned int) checksum[i]); - } - printf ("\n"); - } - return 0; -} -*/ - -#endif - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.cpp deleted file mode 100644 index 390fc3f8c9..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "Mailer.h" -#include "WindowsAPIImplementation.h" - -#include -#include - -#if defined(AZ_PLATFORM_MAC) -#include -#include -#elif defined(AZ_PLATFORM_WINDOWS) -#include -#endif - -#include -#include - -#pragma comment(lib,"ws2_32.lib") - - -namespace // helpers -{ - static const char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - - void Base64EncodeBlock(const unsigned char* in, unsigned char* out) - { - out[0] = cb64[in[0] >> 2]; - out[1] = cb64[((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)]; - out[2] = cb64[((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)]; - out[3] = cb64[in[2] & 0x3f]; - } - - - void Base64EncodeBlock(const unsigned char* in, unsigned char* out, int len) - { - out[0] = cb64[in[0] >> 2]; - out[1] = cb64[((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)]; - out[2] = (unsigned char) (len > 1 ? cb64[((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)] : '='); - out[3] = (unsigned char) (len > 2 ? cb64[in[2] & 0x3f] : '='); - } - - - void Base64Encode(const unsigned char* pSrc, const size_t srcLen, unsigned char* pDst, [[maybe_unused]] const size_t dstLen) - { - assert(dstLen >= 4 * ((srcLen + 2) / 3)); - - size_t len = srcLen; - for (; len > 2; len -= 3, pSrc += 3, pDst += 4) - { - Base64EncodeBlock(pSrc, pDst); - } - - if (len > 0) - { - unsigned char in[3]; - in[0] = pSrc[0]; - in[1] = len > 1 ? pSrc[1] : 0; - in[2] = 0; - Base64EncodeBlock(in, pDst, (int) len); - } - } - - - std::string Base64EncodeString(const std::string& in) - { - const size_t srcLen = in.size(); - const size_t dstLen = 4 * ((srcLen + 2) / 3); - std::string out(dstLen, 0); - - Base64Encode((const unsigned char*) in.c_str(), srcLen, (unsigned char*) out.c_str(), dstLen); - - return out; - } - - - const char* ExtractFileName(const char* filepath) - { - for (const char* p = filepath + strlen(filepath) - 1; p >= filepath; --p) - { - if (*p == '\\' || *p == '/') - { - return p + 1; - } - } - return filepath; - } -} - -AZStd::atomic_long CSMTPMailer::ms_OpenSockets = {0}; - -CSMTPMailer::CSMTPMailer(const tstr& username, const tstr& password, const tstr& server, int port) - : m_server(server) - , m_username(username) - , m_password(password) - , m_port(port) - , m_winSockAvail(false) - , m_response() -{ -#if defined(AZ_PLATFORM_WINDOWS) - WSADATA wd; - m_winSockAvail = WSAStartup(MAKEWORD(1, 1), &wd) == 0; - if (!m_winSockAvail) - { - m_response += "Error: Unable to initialize WinSock 1.1\n"; - } -#endif -} - - -CSMTPMailer::~CSMTPMailer() -{ -#if defined(AZ_PLATFORM_WINDOWS) - if (m_winSockAvail) - { - WSACleanup(); - } -#endif -} - - -void CSMTPMailer::ReceiveLine(SOCKET connection) -{ - char buf[1025]; - int ret = recv(connection, buf, sizeof(buf) - 1, 0); - if (ret == SOCKET_ERROR) - { - ret = azsnprintf(buf, sizeof(buf), "Error: WinSock error %d during recv()\n", WSAGetLastError()); - if (ret == sizeof(buf) || ret < 0) - { - buf[sizeof(buf) - 1] = '\0'; - } - } - else - { - buf[ret] = 0; - } - m_response += buf; -} - - -void CSMTPMailer::SendLine(SOCKET connection, const char* format, ...) const -{ - char buf[2049]; - va_list args; - va_start(args, format); - int len = azvsnprintf(buf, sizeof(buf), format, args); - if (len == sizeof(buf) || len < 0) - { - buf[sizeof(buf) - 1] = '\0'; - len = sizeof(buf) - 1; - } - va_end(args); - send(connection, buf, len, 0); -} - - -void CSMTPMailer::SendRaw(SOCKET connection, const char* data, size_t dataLen) const -{ - send(connection, data, (int) dataLen, 0); -} - - -void CSMTPMailer::SendFile(SOCKET connection, const tattachment& filepath, const char* boundary) const -{ - AZ::IO::SystemFile inputFile; - const bool wasSuccessful = inputFile.Open(filepath.second.c_str(), AZ::IO::SystemFile::SF_OPEN_READ_ONLY); - if (wasSuccessful) - { - SendLine(connection, "--%s\r\n", boundary); - SendLine(connection, "Content-Type: application/octet-stream\r\n"); - SendLine(connection, "Content-Transfer-Encoding: base64\r\n"); - SendLine(connection, "Content-Disposition: attachment; filename=\"%s\"\r\n", filepath.first.c_str()); - SendLine(connection, "\r\n"); - - AZ::IO::SystemFile::SizeType fileSize = inputFile.Length(); - while (fileSize) - { - const int DEF_BLOCK_SIZE = 128; // 72 - char in[3 * DEF_BLOCK_SIZE]; - size_t blockSize = fileSize > sizeof(in) ? sizeof(in) : fileSize; - inputFile.Read(blockSize, in); - - char out[4 * DEF_BLOCK_SIZE]; - Base64Encode((unsigned char*) in, blockSize, (unsigned char*) out, sizeof(out)); - SendRaw(connection, out, 4 * ((blockSize + 2) / 3)); - - SendLine(connection, "\r\n"); // seems to get sent faster if you split up the data lines - - fileSize -= blockSize; - } - } -} - - -SOCKET CSMTPMailer::Open(const char* host, unsigned short port, sockaddr_in& serverAddress) -{ - SOCKET connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (connection == INVALID_SOCKET) - { - m_response += "Error: Failed to create socket\n"; - return 0; - } - - struct addrinfo* addressInfo{}; - char portBuffer[16]; - struct addrinfo hints{}; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - azsnprintf(portBuffer, AZStd::size(portBuffer), "%hu", port); - int addrInfoReturnCode = getaddrinfo(host, portBuffer, &hints, &addressInfo); - if(addrInfoReturnCode != 0) - { - char buf[1025]; - int ret = azsnprintf(buf, sizeof(buf), "Error: Host %s not found\n", host); - if (ret == sizeof(buf) || ret < 0) - { - buf[sizeof(buf) - 1] = '\0'; - } - m_response += buf; - closesocket(connection); - return 0; - } - - if (addressInfo) - { - ++ms_OpenSockets; - - serverAddress = *reinterpret_cast(addressInfo->ai_addr); - } - - return connection; -} - - -void CSMTPMailer::AddReceivers(SOCKET connection, const tstrcol& receivers) -{ - for (tstrcol::const_iterator it = receivers.begin(), itEnd = receivers.end(); it != itEnd; ++it) - { - if (!(*it).empty()) - { - SendLine(connection, "rcpt to: %s\r\n", (*it).c_str()); - ReceiveLine(connection); - } - } -} - - -void CSMTPMailer::AssignReceivers(SOCKET connection, const char* receiverTag, const tstrcol& receivers) -{ - tstrcol::const_iterator it = receivers.begin(); - tstrcol::const_iterator itEnd = receivers.end(); - - while (it != itEnd && (*it).empty()) - { - ++it; - } - - if (it != itEnd) - { - tstr out(receiverTag); - out += *it; - ++it; - for (; it != itEnd; ++it) - { - if (!(*it).empty()) - { - out += "; "; - out += *it; - } - } - out += "\r\n"; - SendLine(connection, out.c_str()); - } -} - - -void CSMTPMailer::SendAttachments(SOCKET connection, const tattachlist& attachments, const char* boundary) -{ - for (tattachlist::const_iterator it = attachments.begin(), itEnd = attachments.end(); it != itEnd; ++it) - { - if (!(*it).first.empty() && !(*it).second.empty()) - { - SendFile(connection, *it, boundary); - } - } -} - - -bool CSMTPMailer::IsEmpty(const tstrcol& col) const -{ - if (!col.empty()) - { - for (tstrcol::const_iterator it = col.begin(), itEnd = col.end(); it != itEnd; ++it) - { - if (!(*it).empty()) - { - return false; - } - } - } - - return true; -} - - -bool CSMTPMailer::Send(const tstr& from, const tstrcol& to, const tstrcol& cc, const tstrcol& bcc, const tstr& subject, const tstr& body, const tattachlist& attachments) -{ - if (!m_winSockAvail) - { - return false; - } - - if (from.empty() || IsEmpty(to)) - { - return false; - } - - sockaddr_in serverAddress; - SOCKET connection = Open(m_server.c_str(), m_port, serverAddress); // SMTP telnet (usually port 25) - if (connection == INVALID_SOCKET) - { - return false; - } - - if (connect(connection, (sockaddr*) &serverAddress, sizeof(serverAddress)) != SOCKET_ERROR) - { - ReceiveLine(connection); - - SendLine(connection, "helo localhost\r\n"); - ReceiveLine(connection); - - if (!m_username.empty() && !m_password.empty()) - { - SendLine(connection, "auth login\r\n"); // most servers should implement this (todo: otherwise fall back to PLAIN or CRAM-MD5 (requiring EHLO)) - ReceiveLine(connection); - SendLine(connection, "%s\r\n", Base64EncodeString(m_username).c_str()); - ReceiveLine(connection); - SendLine(connection, "%s\r\n", Base64EncodeString(m_password).c_str()); - ReceiveLine(connection); - } - - SendLine(connection, "mail from: %s\r\n", from.c_str()); - ReceiveLine(connection); - - AddReceivers(connection, to); - AddReceivers(connection, cc); - AddReceivers(connection, bcc); - - SendLine(connection, "data\r\n"); - ReceiveLine(connection); - - SendLine(connection, "From: %s\r\n", from.c_str()); - AssignReceivers(connection, "To: ", to); - AssignReceivers(connection, "Cc: ", cc); - AssignReceivers(connection, "Bcc: ", bcc); - - SendLine(connection, "Subject: %s\r\n", subject.c_str()); - - static const char boundary[] = "------a95ed0b485e4a9b0fd4ff93f50ad06ca"; // beware, boundary should not clash with text content of message body! - - SendLine(connection, "MIME-Version: 1.0\r\n"); - SendLine(connection, "Content-Type: multipart/mixed; boundary=\"%s\"\r\n", boundary); - SendLine(connection, "\r\n"); - SendLine(connection, "This is a multi-part message in MIME format.\r\n"); - - SendLine(connection, "--%s\r\n", boundary); - SendLine(connection, "Content-Type: text/plain; charset=iso-8859-1; format=flowed\r\n"); // the used charset should support the commonly used special characters of western languages - SendLine(connection, "Content-Transfer-Encoding: 7bit\r\n"); - SendLine(connection, "\r\n"); - SendRaw(connection, body.c_str(), body.size()); - SendLine(connection, "\r\n"); - - SendAttachments(connection, attachments, boundary); - - SendLine(connection, "--%s--\r\n", boundary); - - SendLine(connection, "\r\n.\r\n"); - ReceiveLine(connection); - - SendLine(connection, "quit\r\n"); - ReceiveLine(connection); - } - else - { - char buf[1025]; - int ret = azsnprintf(buf, sizeof(buf), "Error: Failed to connect to %s:%d\n", m_server.c_str(), m_port); - if (ret == sizeof(buf) || ret < 0) - { - buf[sizeof(buf) - 1] = '\0'; - } - m_response += buf; - return false; - } - - closesocket(connection); - --ms_OpenSockets; - - return true; -} - - -const char* CSMTPMailer::GetResponse() const -{ - return m_response.c_str(); -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.h b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.h deleted file mode 100644 index 29d8815056..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Mailer.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_CRYSCOMPILESERVER_CORE_MAILER_H -#define CRYINCLUDE_CRYSCOMPILESERVER_CORE_MAILER_H -#pragma once - -#include "Common.h" -#include "Server/CrySimpleSock.hpp" -#include -#include -#include -#include -#include - -class CSMTPMailer -{ -public: - typedef std::string tstr; - typedef std::set tstrcol; - typedef std::pair tattachment; - typedef std::list tattachlist; - - static const int DEFAULT_PORT = 25; - static AZStd::atomic_long ms_OpenSockets; - -public: - CSMTPMailer(const tstr& username, const tstr& password, const tstr& server, int port = DEFAULT_PORT); - ~CSMTPMailer(); - - bool Send(const tstr& from, const tstrcol& to, const tstrcol& cc, const tstrcol& bcc, const tstr& subject, const tstr& body, const tattachlist& attachments); - const char* GetResponse() const; - - static long GetOpenSockets() { return ms_OpenSockets; } - -private: - void ReceiveLine(SOCKET connection); - void SendLine(SOCKET connection, const char* format, ...) const; - void SendRaw(SOCKET connection, const char* data, size_t dataLen) const; - void SendFile(SOCKET connection, const tattachment& file, const char* boundary) const; - - SOCKET Open(const char* host, unsigned short port, sockaddr_in& serverAddress); - - void AddReceivers(SOCKET connection, const tstrcol& receivers); - void AssignReceivers(SOCKET connection, const char* receiverTag, const tstrcol& receivers); - void SendAttachments(SOCKET connection, const tattachlist& attachments, const char* boundary); - - bool IsEmpty(const tstrcol& col) const; - -private: - - std::unique_ptr m_socket; - tstr m_server; - tstr m_username; - tstr m_password; - int m_port; - - bool m_winSockAvail; - tstr m_response; -}; - -#endif // CRYINCLUDE_CRYSCOMPILESERVER_CORE_MAILER_H diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.cpp deleted file mode 100644 index 3f7d2390db..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "StdTypes.hpp" -#include "Error.hpp" -#include "STLHelper.hpp" - -#include -#include -#include -#include -#include - -#if defined(AZ_PLATFORM_WINDOWS) -#include -#endif - -#include "MD5.hpp" -#include -#include - -#include -#include -#include -#include - -void CSTLHelper::Log(const std::string& rLog) -{ - const std::string Output = rLog + "\n"; - logmessage(Output.c_str()); -} - -void CSTLHelper::Tokenize(tdEntryVec& rRet, const std::string& Tokens, const std::string& Separator) -{ - rRet.clear(); - std::string::size_type Pt; - std::string::size_type Start = 0; - std::string::size_type SSize = Separator.size(); - - while ((Pt = Tokens.find(Separator, Start)) != std::string::npos) - { - std::string SubStr = Tokens.substr(Start, Pt - Start); - rRet.push_back(SubStr); - Start = Pt + SSize; - } - - rRet.push_back(Tokens.substr(Start)); -} - - -void CSTLHelper::Replace(std::string& rRet, const std::string& rSrc, const std::string& rToReplace, const std::string& rReplacement) -{ - std::vector Out; - std::vector In(rSrc.c_str(), rSrc.c_str() + rSrc.size() + 1); - Replace(Out, In, rToReplace, rReplacement); - rRet = std::string(reinterpret_cast(&Out[0])); -} - -void CSTLHelper::Replace(std::vector& rRet, const std::vector& rTokenSrc, const std::string& rToReplace, const std::string& rReplacement) -{ - rRet.clear(); - size_t SSize = rToReplace.size(); - for (size_t a = 0, Size = rTokenSrc.size(); a < Size; a++) - { - if (a + SSize < Size && strncmp((const char*)&rTokenSrc[a], rToReplace.c_str(), SSize) == 0) - { - for (size_t b = 0, RSize = rReplacement.size(); b < RSize; b++) - { - rRet.push_back(rReplacement.c_str()[b]); - } - a += SSize - 1; - } - else - { - rRet.push_back(rTokenSrc[a]); - } - } -} - -tdToken CSTLHelper::SplitToken(const std::string& rToken, const std::string& rSeparator) -{ -#undef min - using namespace std; - string Token; - Remove(Token, rToken, ' '); - - string::size_type Pt = Token.find(rSeparator); - return tdToken(Token.substr(0, Pt), Token.substr(std::min(Pt + 1, Token.size()))); -} - -void CSTLHelper::Splitizer(tdTokenList& rTokenList, const tdEntryVec& rFilter, const std::string& rSeparator) -{ - rTokenList.clear(); - for (size_t a = 0, Size = rFilter.size(); a < Size; a++) - { - rTokenList.push_back(SplitToken(rFilter[a], rSeparator)); - } -} - -void CSTLHelper::Trim(std::string& rStr, const std::string& charsToTrim) -{ - std::string::size_type Pt1 = rStr.find_first_not_of(charsToTrim); - if (Pt1 == std::string::npos) - { - // At this point the string could be empty or it could only contain 'charsToTrim' characters. - // In case it's the later then trim should be applied by leaving the string empty. - rStr = ""; - return; - } - - std::string::size_type Pt2 = rStr.find_last_not_of(charsToTrim) + 1; - - Pt2 = Pt2 - Pt1; - rStr = rStr.substr(Pt1, Pt2); -} - -void CSTLHelper::Remove(std::string& rTokenDst, const std::string& rTokenSrc, const char C) -{ - using namespace std; - AZ_PUSH_DISABLE_WARNING(4996, "-Wdeprecated-declarations") - remove_copy_if(rTokenSrc.begin(), rTokenSrc.end(), back_inserter(rTokenDst), [C](char token) { return token == C; }); - AZ_POP_DISABLE_WARNING -} - - -bool CSTLHelper::ToFile(const std::string& rFileName, const std::vector& rOut) -{ - if (rOut.size() == 0) - { - return false; - } - - AZ::IO::SystemFile outputFile; - const bool wasSuccessful = outputFile.Open(rFileName.c_str(), AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY | AZ::IO::SystemFile::SF_OPEN_CREATE); - - if (wasSuccessful == false) - { - AZ_Error("ShaderCompiler", wasSuccessful, "CSTLHelper::ToFile Could not create file: %s", rFileName.c_str()); - return false; - } - - outputFile.Write(&rOut[0], rOut.size()); - - return true; -} - -bool CSTLHelper::FromFile(const std::string& rFileName, std::vector& rIn) -{ - AZ::IO::SystemFile inputFile; - bool wasSuccess = inputFile.Open(rFileName.c_str(), AZ::IO::SystemFile::SF_OPEN_READ_WRITE); - if (!wasSuccess) - { - return false; - } - - AZ::IO::SystemFile::SizeType fileSize = inputFile.Length(); - if (fileSize <= 0) - { - return false; - } - - rIn.resize(fileSize); - AZ::IO::SystemFile::SizeType actualReadAmount = inputFile.Read(fileSize, &rIn[0]); - - return actualReadAmount == fileSize; -} - -bool CSTLHelper::ToFileCompressed(const std::string& rFileName, const std::vector& rOut) -{ - std::vector buf; - - unsigned long sourceLen = (unsigned long)rOut.size(); - unsigned long destLen = compressBound(sourceLen) + 16; - - buf.resize(destLen); - compress(buf.data(), &destLen, &rOut[0], sourceLen); - - if (destLen > 0) - { - AZ::IO::SystemFile outputFile; - const bool wasSuccessful = outputFile.Open(rFileName.c_str(), AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY | AZ::IO::SystemFile::SF_OPEN_CREATE); - AZ_Error("ShaderCompiler", wasSuccessful, "Could not create compressed file: %s", rFileName.c_str()); - - if (wasSuccessful == false) - { - return false; - } - - AZ::IO::SystemFile::SizeType bytesWritten = outputFile.Write(&sourceLen, sizeof(sourceLen)); - AZ_Error("ShaderCompiler", bytesWritten == sizeof(sourceLen), "Could not save out size of compressed data to %s", rFileName.c_str()); - - if (bytesWritten != sizeof(sourceLen)) - { - return false; - } - - bytesWritten = outputFile.Write(buf.data(), destLen); - AZ_Error("ShaderCompiler", bytesWritten == destLen, "Could not save out compressed data to %s", rFileName.c_str()); - - if (bytesWritten != destLen) - { - return false; - } - - return true; - } - else - { - return false; - } -} - -bool CSTLHelper::FromFileCompressed(const std::string& rFileName, std::vector& rIn) -{ - std::vector buf; - AZ::IO::SystemFile inputFile; - const bool wasSuccessful = inputFile.Open(rFileName.c_str(), AZ::IO::SystemFile::SF_OPEN_READ_ONLY); - AZ_Error("ShaderCompiler", wasSuccessful, "Could not read: ", rFileName.c_str()); - - if (!wasSuccessful) - { - return false; - } - - AZ::IO::SystemFile::SizeType FileLen = inputFile.Length(); - AZ_Error("ShaderCompiler", FileLen > 0, "Error getting file-size of ", rFileName.c_str()); - - if (FileLen <= 0) - { - return false; - } - - unsigned long uncompressedLen = 0; - // Possible, expected, loss of data from u64 to u32. Zlib supports only unsigned long - unsigned long sourceLen = azlossy_caster((FileLen - 4)); - - buf.resize(sourceLen); - - AZ::IO::SystemFile::SizeType bytesReadIn = inputFile.Read(sizeof(uncompressedLen), &uncompressedLen); - AZ_Warning("ShaderCompiler", bytesReadIn == sizeof(uncompressedLen), "Expected to read in %d but read in %d from file %s", sizeof(uncompressedLen), bytesReadIn, rFileName.c_str()); - - bytesReadIn = inputFile.Read(buf.size(), buf.data()); - AZ_Warning("ShaderCompiler", bytesReadIn == buf.size(), "Expected to read in %d but read in %d from file %s", buf.size(), bytesReadIn, rFileName.c_str()); - - unsigned long nUncompressedBytes = uncompressedLen; - rIn.resize(uncompressedLen); - int nRes = uncompress(rIn.data(), &nUncompressedBytes, buf.data(), sourceLen); - - return nRes == Z_OK && nUncompressedBytes == uncompressedLen; -} - -////////////////////////////////////////////////////////////////////////// -bool CSTLHelper::AppendToFile(const std::string& rFileName, const std::vector& rOut) -{ - AZ::IO::SystemFile outputFile; - int openMode = AZ::IO::SystemFile::SF_OPEN_APPEND; - if (!AZ::IO::SystemFile::Exists(rFileName.c_str())) - { - openMode = AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_CREATE_PATH | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY; - } - const bool wasSuccessful = outputFile.Open(rFileName.c_str(), openMode); - AZ_Error("ShaderCompiler", wasSuccessful, "Could not open file for appending: %s", rFileName.c_str()); - if (wasSuccessful == false) - { - return false; - } - - [[maybe_unused]] AZ::IO::SystemFile::SizeType bytesWritten = outputFile.Write(rOut.data(), rOut.size()); - AZ_Warning("ShaderCompiler", bytesWritten == rOut.size(), "Did not write out all the data to the file: %s", rFileName.c_str()); - return true; -} - -////////////////////////////////////////////////////////////////////////// -tdHash CSTLHelper::Hash(const uint8_t* pData, const size_t Size) -{ - tdHash CheckSum; - cvs_MD5Context MD5Context; - cvs_MD5Init(MD5Context); - cvs_MD5Update(MD5Context, pData, static_cast(Size)); - cvs_MD5Final(CheckSum.hash, MD5Context); - return CheckSum; -} - -static char C2A[17] = "0123456789ABCDEF"; - -std::string CSTLHelper::Hash2String(const tdHash& rHash) -{ - std::string Ret; - for (size_t a = 0, Size = std::min(sizeof(rHash.hash), 16u); a < Size; a++) - { - const uint8_t C1 = rHash[a] & 0xf; - const uint8_t C2 = rHash[a] >> 4; - Ret += C2A[C1]; - Ret += C2A[C2]; - } - return Ret; -} - -tdHash CSTLHelper::String2Hash(const std::string& rStr) -{ - assert(rStr.size() == 32); - tdHash Ret; - for (size_t a = 0, Size = std::min(rStr.size(), 32u); a < Size; a += 2) - { - const uint8_t C1 = rStr.c_str()[a]; - const uint8_t C2 = rStr.c_str()[a + 1]; - Ret[a >> 1] = C1 - (C1 >= '0' && C1 <= '9' ? '0' : 'A' - 10); - Ret[a >> 1] |= (C2 - (C2 >= '0' && C2 <= '9' ? '0' : 'A' - 10)) << 4; - } - return Ret; -} - -////////////////////////////////////////////////////////////////////////// -bool CSTLHelper::Compress(const std::vector& rIn, std::vector& rOut) -{ - unsigned long destLen, sourceLen = (unsigned long)rIn.size(); - destLen = compressBound(sourceLen) + 16; - rOut.resize(destLen + 4); - compress(&rOut[4], &destLen, &rIn[0], sourceLen); - rOut.resize(destLen + 4); - *(uint32_t*)(&rOut[0]) = sourceLen; - return true; -} - -bool CSTLHelper::Uncompress(const std::vector& rIn, std::vector& rOut) -{ - unsigned long sourceLen = (unsigned long)rIn.size() - 4; - unsigned long nUncompressed = *(uint32_t*)(&rIn[0]); - unsigned long nUncompressedBytes = nUncompressed; - rOut.resize(nUncompressed); - int nRes = uncompress(&rOut[0], &nUncompressedBytes, &rIn[4], sourceLen); - return nRes == Z_OK && nUncompressed == nUncompressedBytes; -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.hpp deleted file mode 100644 index a7f4228d3c..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/STLHelper.hpp +++ /dev/null @@ -1,112 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __STLHELPER__ -#define __STLHELPER__ - -#include -#include - -typedef std::vector tdEntryVec; -typedef std::pair tdToken; -typedef std::vector tdTokenList; -typedef std::vector tdDataVector; -//typedef std::vector tdHash; - -struct tdHash -{ - uint8_t hash[16]; - - inline bool operator<(const tdHash& other) const { return memcmp(hash, other.hash, sizeof(hash)) < 0; } - inline bool operator>(const tdHash& other) const { return memcmp(hash, other.hash, sizeof(hash)) > 0; } - inline bool operator==(const tdHash& other) const { return memcmp(hash, other.hash, sizeof(hash)) == 0; } - inline uint8_t& operator[](size_t nIndex) { return hash[nIndex]; } - inline const uint8_t& operator[](size_t nIndex) const { return hash[nIndex]; } -}; - -class CSTLHelper -{ - static tdHash Hash(const uint8_t* pData, const size_t Size); -public: - static void Tokenize(tdEntryVec& rRet, const std::string& Tokens, const std::string& Separator); - static tdToken SplitToken(const std::string& rToken, const std::string& rSeparator); - static void Splitizer(tdTokenList& rTokenList, const tdEntryVec& rFilter, const std::string& rSeparator); - static void Trim(std::string& rStr, const std::string& charsToTrim); - static void Remove(std::string& rTokenDst, const std::string& rTokenSrc, const char C); - static void Replace(std::vector& rRet, const std::vector& rTokenSrc, const std::string& rToReplace, const std::string& rReplacement); - static void Replace(std::string& rRet, const std::string& rSrc, const std::string& rToReplace, const std::string& rReplacement); - - - static bool ToFile(const std::string& rFileName, const std::vector& rOut); - static bool FromFile(const std::string& rFileName, std::vector& rIn); - - static bool AppendToFile(const std::string& rFileName, const std::vector& rOut); - - static bool ToFileCompressed(const std::string& rFileName, const std::vector& rOut); - static bool FromFileCompressed(const std::string& rFileName, std::vector& rIn); - - static bool Compress(const std::vector& rIn, std::vector& rOut); - static bool Uncompress(const std::vector& rIn, std::vector& rOut); - - - static void EndianSwizzleU64(uint64_t& S) - { - uint8_t* pT = reinterpret_cast(&S); - uint8_t T; - T = pT[0]; - pT[0] = pT[7]; - pT[7] = T; - T = pT[1]; - pT[1] = pT[6]; - pT[6] = T; - T = pT[2]; - pT[2] = pT[5]; - pT[5] = T; - T = pT[3]; - pT[3] = pT[4]; - pT[4] = T; - } - static void EndianSwizzleU32(uint32_t& S) - { - uint8_t* pT = reinterpret_cast(&S); - uint8_t T; - T = pT[0]; - pT[0] = pT[3]; - pT[3] = T; - T = pT[1]; - pT[1] = pT[2]; - pT[2] = T; - } - static void EndianSwizzleU16(uint16_t& S) - { - uint8_t* pT = reinterpret_cast(&S); - uint8_t T; - T = pT[0]; - pT[0] = pT[1]; - pT[1] = T; - } - - - static void Log(const std::string& rLog); - - static tdHash Hash(const std::string& rStr) { return Hash(reinterpret_cast(rStr.c_str()), rStr.size()); } - static tdHash Hash(const std::vector& rData) { return Hash(&rData[0], rData.size()); } - static tdHash Hash(const std::vector& rData, size_t Size) { return Hash(&rData[0], Size); } - - static std::string Hash2String(const tdHash& rHash); - static tdHash String2Hash(const std::string& rStr); -}; - -#define CRYSIMPLE_LOG(X) CSTLHelper::Log(X) -#endif - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.cpp deleted file mode 100644 index 9ceb6be6e2..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleCache.hpp" -#include "CrySimpleServer.hpp" - -#include -#include -#include - -#include -#include -#include - -enum EFileEntryHeaderFlags -{ - EFEHF_NONE = (0 << 0), - EFEHF_REFERENCE = (1 << 0), -}; - -#pragma pack(push, 1) -struct SFileEntryHeader -{ - char signature[4]; // entry signature. - uint32_t dataSize; // Size of entry data. - uint32_t flags; // Flags - uint8_t hash[16]; // Hash code for the data. -}; -#pragma pack(pop) - -static const int MAX_DATA_SIZE = 1024 * 1024; - -CCrySimpleCache& CCrySimpleCache::Instance() -{ - static CCrySimpleCache g_Cache; - return g_Cache; -} - -void CCrySimpleCache::Init() -{ - CCrySimpleMutexAutoLock Lock(m_Mutex); - m_CachingEnabled = false; - m_Hit = 0; - m_Miss = 0; -} - -std::string CCrySimpleCache::CreateFileName(const tdHash& rHash) const -{ - AZStd::string Name; - Name = CSTLHelper::Hash2String(rHash).c_str(); - char Tmp[4] = "012"; - Tmp[0] = Name.c_str()[0]; - Tmp[1] = Name.c_str()[1]; - Tmp[2] = Name.c_str()[2]; - - AZ::IO::Path resultFileName = SEnviropment::Instance().m_CachePath / Tmp / Name; - return std::string{ resultFileName.c_str(), resultFileName.Native().size() }; -} - - -bool CCrySimpleCache::Find(const tdHash& rHash, tdDataVector& rData) -{ - if (!m_CachingEnabled) - { - return false; - } - - CCrySimpleMutexAutoLock Lock(m_Mutex); - tdEntries::iterator it = m_Entries.find(rHash); - if (it != m_Entries.end()) - { - tdData::iterator dataIt = m_Data.find(it->second); - if (dataIt == m_Data.end()) - { - m_Miss++; - return false; - } - m_Hit++; - rData = dataIt->second; - return true; - } - m_Miss++; - return false; -} - -void CCrySimpleCache::Add(const tdHash& rHash, const tdDataVector& rData) -{ - if (!m_CachingEnabled) - { - return; - } - if (rData.size() > 0) - { - SFileEntryHeader hdr; - memcpy(hdr.signature, "SHDR", 4); - hdr.dataSize = (uint32_t)rData.size(); - hdr.flags = EFEHF_NONE; - memcpy(hdr.hash, &rHash, sizeof(hdr.hash)); - const uint8_t* pData = &rData[0]; - - tdHash DataHash = CSTLHelper::Hash(rData); - { - CCrySimpleMutexAutoLock Lock(m_Mutex); - m_Entries[rHash] = DataHash; - if (m_Data.find(DataHash) == m_Data.end()) - { - m_Data[DataHash] = rData; - } - else - { - hdr.flags |= EFEHF_REFERENCE; - hdr.dataSize = sizeof(tdHash); - pData = reinterpret_cast(&DataHash); - } - } - - - - tdDataVector buf; - buf.resize(sizeof(hdr) + hdr.dataSize); - memcpy(&buf[0], &hdr, sizeof(hdr)); - memcpy(&buf[sizeof(hdr)], pData, hdr.dataSize); - - tdDataVector* pPendingCacheEntry = new tdDataVector(buf); - { - CCrySimpleMutexAutoLock LockFile(m_FileMutex); - m_PendingCacheEntries.push_back(pPendingCacheEntry); - if (m_PendingCacheEntries.size() > 10000) - { - printf("Warning: Too many pending entries not saved to disk!!!"); - } - } - } -} - -////////////////////////////////////////////////////////////////////////// -bool CCrySimpleCache::LoadCacheFile(const std::string& filename) -{ - AZ::u64 startTimeInMillis = AZStd::GetTimeUTCMilliSecond(); - - printf("Loading shader cache from %s\n", filename.c_str()); - - tdDataVector rData; - - tdHash hash; - - bool bLoadedOK = true; - - uint32_t Loaded = 0; - uint32_t num = 0; - - uint64_t nFilePos = 0; - - ////////////////////////////////////////////////////////////////////////// - AZ::IO::SystemFile cacheFile; - const bool wasSuccessful = cacheFile.Open(filename.c_str(), AZ::IO::SystemFile::SF_OPEN_READ_ONLY); - if (!wasSuccessful) - { - return false; - } - - AZ::IO::SystemFile::SizeType fileSize = cacheFile.Length(); - - uint64_t SizeAdded = 0; - uint64_t SizeAddedCount = 0; - uint64_t SizeSaved = 0; - uint64_t SizeSavedCount = 0; - - while (nFilePos < fileSize) - { - SFileEntryHeader hdr; - AZ::IO::SystemFile::SizeType bytesReadIn = cacheFile.Read(sizeof(hdr), &hdr); - if (bytesReadIn != sizeof(hdr)) - { - break; - } - - if (memcmp(hdr.signature, "SHDR", 4) != 0) - { - // Bad Entry! - bLoadedOK = false; - printf("\nSkipping Invalid cache entry %d\n at file position: %llu because signature is bad", num, nFilePos); - break; - } - - if (hdr.dataSize > MAX_DATA_SIZE || hdr.dataSize == 0) - { - // Too big entry, probably invalid. - bLoadedOK = false; - printf("\nSkipping Invalid cache entry %d\n at file position: %llu because data size is too big", num, nFilePos); - break; - } - - rData.resize(hdr.dataSize); - bytesReadIn = cacheFile.Read(hdr.dataSize, rData.data()); - if (bytesReadIn != hdr.dataSize) - { - break; - } - memcpy(&hash, hdr.hash, sizeof(hdr.hash)); - - if (hdr.flags & EFEHF_REFERENCE) - { - if (hdr.dataSize != sizeof(tdHash)) - { - // Too big entry, probably invalid. - bLoadedOK = false; - printf("\nSkipping Invalid cache entry %d\n at file position: %llu, was flagged as cache reference but size was %d", num, nFilePos, hdr.dataSize); - break; - } - - bool bSkip = false; - - tdHash DataHash = *reinterpret_cast(&rData[0]); - tdData::iterator it = m_Data.find(DataHash); - if (it == m_Data.end()) - { - // Too big entry, probably invalid. - bSkip = true; // don't abort reading whole file just yet - skip only this entry - printf("\nSkipping Invalid cache entry %d\n at file position: %llu, data-hash references to not existing data ", num, nFilePos); - } - - if (!bSkip) - { - m_Entries[hash] = DataHash; - SizeSaved += it->second.size(); - SizeSavedCount++; - } - } - else - { - tdHash DataHash = CSTLHelper::Hash(rData); - m_Entries[hash] = DataHash; - if (m_Data.find(DataHash) == m_Data.end()) - { - SizeAdded += rData.size(); - m_Data[DataHash] = rData; - SizeAddedCount++; - } - else - { - SizeSaved += rData.size(); - SizeSavedCount++; - } - } - - if (num % 1000 == 0) - { - AZ::u64 endTimeInMillis = AZStd::GetTimeUTCMilliSecond(); - - Loaded = static_cast(nFilePos * 100 / fileSize); - printf("\rLoad:%3u%% %6uk t=%llus Compress: (Count)%llu%% %lluk:%lluk (MB)%llu%% %lluMB:%lluMB", Loaded, num / 1000u, (endTimeInMillis - startTimeInMillis), - SizeAddedCount / AZStd::GetMax((SizeAddedCount + SizeSavedCount) / 100ull, 1ull), - SizeAddedCount / 1000, SizeSavedCount / 1000, - SizeAdded / AZStd::GetMax((SizeAdded + SizeSaved) / 100ull, 1ull), - SizeAdded / (MAX_DATA_SIZE), SizeSaved / (MAX_DATA_SIZE)); - } - - num++; - nFilePos += hdr.dataSize + sizeof(SFileEntryHeader); - } - - printf("\n%d shaders loaded from cache\n", num); - - return bLoadedOK; -} - -void CCrySimpleCache::Finalize() -{ - m_CachingEnabled = true; - printf("\n caching enabled\n"); -} - -////////////////////////////////////////////////////////////////////////// -void CCrySimpleCache::ThreadFunc_SavePendingCacheEntries() -{ - // Check pending entries and save them to disk. - bool bListEmpty = false; - do - { - tdDataVector* pPendingCacheEntry = 0; - - { - CCrySimpleMutexAutoLock LockFile(m_FileMutex); - if (!m_PendingCacheEntries.empty()) - { - pPendingCacheEntry = m_PendingCacheEntries.front(); - m_PendingCacheEntries.pop_front(); - } - //CSTLHelper::AppendToFile( SEnviropment::Instance().m_CachePath+"Cache.dat",buf ); - bListEmpty = m_PendingCacheEntries.empty(); - } - - if (pPendingCacheEntry) - { - AZ::IO::Path cacheDatPath = SEnviropment::Instance().m_CachePath / "Cache.dat"; - CSTLHelper::AppendToFile(std::string{ cacheDatPath.c_str(), cacheDatPath.Native().size() }, *pPendingCacheEntry); - delete pPendingCacheEntry; - } - } while (!bListEmpty); -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.hpp deleted file mode 100644 index 5f8feab64c..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleCache.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLECACHE__ -#define __CRYSIMPLECACHE__ - -#include "CrySimpleMutex.hpp" - -#include - -#include -#include -#include - -/*class CCrySimpleCacheEntry -{ - tdCache -public: -protected: -private: -};*/ - -typedef std::map tdEntries; -typedef std::map tdData; - -class CCrySimpleCache -{ - volatile bool m_CachingEnabled; - int m_Hit; - int m_Miss; - tdEntries m_Entries; - tdData m_Data; - CCrySimpleMutex m_Mutex; - CCrySimpleMutex m_FileMutex; - - std::list m_PendingCacheEntries; - std::string CreateFileName(const tdHash& rHash) const; - -public: - void Init(); - bool Find(const tdHash& rHash, tdDataVector& rData); - void Add(const tdHash& rHash, const tdDataVector& rData); - - bool LoadCacheFile(const std::string& filename); - void Finalize(); - - void ThreadFunc_SavePendingCacheEntries(); - - static CCrySimpleCache& Instance(); - - - std::list& PendingCacheEntries(){return m_PendingCacheEntries; } - int Hit() const{return m_Hit; } - int Miss() const{return m_Miss; } - int EntryCount() const{return static_cast(m_Entries.size()); } -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.cpp deleted file mode 100644 index 6fe019da53..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleErrorLog.hpp" -#include "CrySimpleServer.hpp" -#include "CrySimpleJob.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#ifdef _MSC_VER -#include -#include -#endif -#ifdef UNIX -#include -#endif - -static unsigned int volatile g_bSendingMail = false; -static unsigned int volatile g_nMailNum = 0; - -CCrySimpleErrorLog& CCrySimpleErrorLog::Instance() -{ - static CCrySimpleErrorLog g_Cache; - return g_Cache; -} - -CCrySimpleErrorLog::CCrySimpleErrorLog() -{ - m_lastErrorTime = 0; -} - -void CCrySimpleErrorLog::Init() -{ -} - -bool CCrySimpleErrorLog::Add(ICryError* err) -{ - CCrySimpleMutexAutoLock Lock(m_LogMutex); - - if (m_Log.size() > 150) - { - // too many, just throw this error away - return false; // no ownership of this error - } - - m_Log.push_back(err); - - m_lastErrorTime = AZStd::GetTimeUTCMilliSecond(); - - return true; // take ownership of this error -} - -inline bool CmpError(ICryError* a, ICryError* b) -{ - return a->Compare(b); -} - -void CCrySimpleErrorLog::SendMail() -{ - CSMTPMailer::tstrcol Rcpt; - - std::string mailBody; - - tdEntryVec RcptVec; - CSTLHelper::Tokenize(RcptVec, SEnviropment::Instance().m_FailEMail, ";"); - - for (size_t i = 0; i < RcptVec.size(); i++) - { - Rcpt.insert(RcptVec[i]); - } - - tdErrorList tempLog; - { - CCrySimpleMutexAutoLock Lock(m_LogMutex); - m_Log.swap(tempLog); - } -#if defined(_MSC_VER) - { - char compName[256]; - DWORD size = ARRAYSIZE(compName); - - typedef BOOL (WINAPI * FP_GetComputerNameExA)(COMPUTER_NAME_FORMAT, LPSTR, LPDWORD); - FP_GetComputerNameExA pGetComputerNameExA = (FP_GetComputerNameExA) GetProcAddress(LoadLibrary("kernel32.dll"), "GetComputerNameExA"); - - if (pGetComputerNameExA) - { - pGetComputerNameExA(ComputerNamePhysicalDnsFullyQualified, compName, &size); - } - else - { - GetComputerName(compName, &size); - } - - mailBody += std::string("Report sent from ") + compName + "...\n\n"; - } -#endif - { - bool dedupe = SEnviropment::Instance().m_DedupeErrors; - - std::vector errors; - - if (!dedupe) - { - for (tdErrorList::const_iterator it = tempLog.begin(); it != tempLog.end(); ++it) - { - errors.push_back(*it); - } - } - else - { - std::map uniqErrors; - for (tdErrorList::const_iterator it = tempLog.begin(); it != tempLog.end(); ++it) - { - ICryError* err = *it; - - tdHash hash = err->Hash(); - - std::map::iterator uniq = uniqErrors.find(hash); - if (uniq != uniqErrors.end()) - { - uniq->second->AddDuplicate(err); - delete err; - } - else - { - uniqErrors[hash] = err; - } - } - - for (std::map::iterator it = uniqErrors.begin(); it != uniqErrors.end(); ++it) - { - errors.push_back(it->second); - } - } - - std::string body = mailBody; - CSMTPMailer::tstrcol cc; - CSMTPMailer::tattachlist Attachment; - - std::sort(errors.begin(), errors.end(), CmpError); - - int a = 0; - for (uint32_t i = 0; i < errors.size(); i++) - { - ICryError* err = errors[i]; - - err->SetUniqueID(a + 1); - - // doesn't have to be related to any job/error, - // we just use it to differentiate "1-IlluminationPS.txt" from "1-IlluminationPS.txt" - long req = CCrySimpleJob::GlobalRequestNumber(); - - if (err->HasFile()) - { - char Filename[1024]; - azsprintf(Filename, "%d-req%ld-%s", a + 1, req, err->GetFilename().c_str()); - - char DispFilename[1024]; - azsprintf(DispFilename, "%d-%s", a + 1, err->GetFilename().c_str()); - - std::string sErrorFile = (SEnviropment::Instance().m_ErrorPath / Filename).c_str(); - - std::vector bytes; - std::string text = err->GetFileContents(); - bytes.resize(text.size() + 1); - std::copy(text.begin(), text.end(), bytes.begin()); - while (bytes.size() && bytes[bytes.size() - 1] == 0) - { - bytes.pop_back(); - } - - CrySimple_SECURE_START - - CSTLHelper::ToFile(sErrorFile, bytes); - - Attachment.push_back(CSMTPMailer::tattachment(DispFilename, sErrorFile)); - - CrySimple_SECURE_END - } - - body += std::string("=============================================================\n"); - body += err->GetErrorDetails(ICryError::OUTPUT_EMAIL) + "\n"; - - err->AddCCs(cc); - a++; - - if (i == errors.size() - 1 || !err->CanMerge(errors[i + 1])) - { - CSMTPMailer::tstrcol bcc; - - CSMTPMailer mail("", "", SEnviropment::Instance().m_MailServer); - mail.Send(SEnviropment::Instance().m_FailEMail, Rcpt, cc, bcc, err->GetErrorName(), body, Attachment); - - a = 0; - body = mailBody; - cc.clear(); - - for (CSMTPMailer::tattachlist::iterator attach = Attachment.begin(); attach != Attachment.end(); ++attach) - { - AZ::IO::SystemFile::Delete(attach->second.c_str()); - } - - Attachment.clear(); - } - - delete err; - } - } - - g_bSendingMail = false; -} - -////////////////////////////////////////////////////////////////////////// -void CCrySimpleErrorLog::Tick() -{ - if (SEnviropment::Instance().m_MailInterval == 0) - { - return; - } - - AZ::u64 lastError = 0; - bool forceFlush = false; - - { - CCrySimpleMutexAutoLock Lock(m_LogMutex); - - if (m_Log.size() == 0) - { - return; - } - - // log has gotten pretty big, force a flush to avoid losing any errors - if (m_Log.size() > 100) - { - forceFlush = true; - } - - lastError = m_lastErrorTime; - } - - AZ::u64 t = AZStd::GetTimeUTCMilliSecond(); - if (forceFlush || t < lastError || (t - lastError) > SEnviropment::Instance().m_MailInterval * 1000) - { - if (!g_bSendingMail) - { - g_bSendingMail = true; - g_nMailNum++; - logmessage("Sending Errors Mail %d\n", g_nMailNum); - CCrySimpleErrorLog::Instance().SendMail(); - } - } -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.hpp deleted file mode 100644 index 96e417f143..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleErrorLog.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEERRORLOG__ -#define __CRYSIMPLEERRORLOG__ - -#include "CrySimpleMutex.hpp" - -#include -#include - -class ICryError; -typedef std::list tdErrorList; - -class CCrySimpleErrorLog -{ - CCrySimpleMutex m_LogMutex; // protects both below variables - tdErrorList m_Log; // error log - AZ::u64 m_lastErrorTime; // last time an error came in (we mail out a little after we've stopped receiving errors) - - void Init(); - void SendMail(); - CCrySimpleErrorLog(); -public: - - bool Add(ICryError* err); - void Tick(); - - static CCrySimpleErrorLog& Instance(); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.cpp deleted file mode 100644 index 624bfd5b80..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleHTTP.hpp" -#include "CrySimpleSock.hpp" -#include "CrySimpleJobCompile.hpp" -#include "CrySimpleServer.hpp" -#include "CrySimpleCache.hpp" - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - - -////////////////////////////////////////////////////////////////////////// -class CHTTPRequest -{ - CCrySimpleSock* m_pSock; -public: - CHTTPRequest(CCrySimpleSock* pSock) - : m_pSock(pSock){} - - ~CHTTPRequest(){delete m_pSock; } - - CCrySimpleSock* Socket(){return m_pSock; } -}; - -#define HTML_HEADER "HTTP/1.1 200 OK\n\ -Server: Shader compile server %s\n\ -Content-Length: %zu\n\ -Content-Language: de (nach RFC 3282 sowie RFC 1766)\n\ -Content-Type: text/html\n\ -Connection: close\n\ -\n\ -shader compile server %s" - -#define TABLE_START "\n\ -\n\ -\n" -#define TABLE_INFO "\n\ -\n" -#define TABLE_BAR "\n\ -\n" -#define TABLE_END "
DescriptionValueMax %
%s %s \n\ -
%s %d%d \n\ -\n\ -\n\ -
%d%%
" - -std::string CreateBar(const std::string& rName, int Value, int Max, int Percentage) -{ - AZStd::string formattedString = AZStd::string::format(TABLE_BAR, rName.c_str(), Value, Max, Percentage, Percentage); - return formattedString.c_str(); -} - -std::string CreateInfoText(const std::string& rName, const std::string& rValue) -{ - AZStd::string formattedString = AZStd::string::format(TABLE_INFO, rName.c_str(), rValue.c_str()); - return formattedString.c_str(); -} - -std::string CreateInfoText(const std::string& rName, int Value) -{ - char Text[64]; - azsprintf(Text, "%d", Value); - return CreateInfoText(rName, Text); -} - -class HttpProcessRequestJob - : public AZ::Job -{ -public: - HttpProcessRequestJob(CHTTPRequest* request) - : AZ::Job(true, nullptr) - , m_request(request) { } - -protected: - void Process() override - { -#if defined(AZ_PLATFORM_WINDOWS) - FILETIME IdleTime0, IdleTime1; - FILETIME KernelTime0, KernelTime1; - FILETIME UserTime0, UserTime1; - - int Ret0 = GetSystemTimes(&IdleTime0, &KernelTime0, &UserTime0); - Sleep(100); - int Ret1 = GetSystemTimes(&IdleTime1, &KernelTime1, &UserTime1); - const int Idle = IdleTime1.dwLowDateTime - IdleTime0.dwLowDateTime; - const int Kernel = KernelTime1.dwLowDateTime - KernelTime0.dwLowDateTime; - const int User = UserTime1.dwLowDateTime - UserTime0.dwLowDateTime; - //const int Idle = IdleTime1.dwHighDateTime-IdleTime0.dwHighDateTime; - //const int Kernel = KernelTime1.dwHighDateTime-KernelTime0.dwHighDateTime; - //const int User = UserTime1.dwHighDateTime-UserTime0.dwHighDateTime; - const int Total = Kernel + User; -#else - int Ret0 = 0; - int Ret1 = 0; - int Total = 0; - int Idle = 0; -#endif - - std::string Ret = TABLE_START; - - Ret += CreateInfoText("Load:", ""); - if (Ret0 && Ret1 && Total) - { - Ret += CreateBar("CPU-Usage", Total - Idle, Total, 100 - Idle * 100 / Total); - } - - Ret += CreateBar("CompileTasks", CCrySimpleJobCompile::GlobalCompileTasks(), - CCrySimpleJobCompile::GlobalCompileTasksMax(), - CCrySimpleJobCompile::GlobalCompileTasksMax() ? - CCrySimpleJobCompile::GlobalCompileTasks() * 100 / - CCrySimpleJobCompile::GlobalCompileTasksMax() : 0); - - - Ret += CreateInfoText("Setup:", ""); - Ret += CreateInfoText("Root", SEnviropment::Instance().m_Root.c_str()); - Ret += CreateInfoText("CompilerPath", SEnviropment::Instance().m_CompilerPath.c_str()); - Ret += CreateInfoText("CachePath", SEnviropment::Instance().m_CachePath.c_str()); - Ret += CreateInfoText("TempPath", SEnviropment::Instance().m_TempPath.c_str()); - Ret += CreateInfoText("ErrorPath", SEnviropment::Instance().m_ErrorPath.c_str()); - Ret += CreateInfoText("ShaderPath", SEnviropment::Instance().m_ShaderPath.c_str()); - Ret += CreateInfoText("FailEMail", SEnviropment::Instance().m_FailEMail); - Ret += CreateInfoText("MailServer", SEnviropment::Instance().m_MailServer); - Ret += CreateInfoText("port", SEnviropment::Instance().m_port); - Ret += CreateInfoText("MailInterval", SEnviropment::Instance().m_MailInterval); - Ret += CreateInfoText("Caching", SEnviropment::Instance().m_Caching ? "Enabled" : "Disabled"); - Ret += CreateInfoText("FallbackServer", SEnviropment::Instance().m_FallbackServer == "" ? "None" : SEnviropment::Instance().m_FallbackServer); - Ret += CreateInfoText("FallbackTreshold", static_cast(SEnviropment::Instance().m_FallbackTreshold)); - Ret += CreateInfoText("DumpShaders", static_cast(SEnviropment::Instance().m_DumpShaders)); - - Ret += CreateInfoText("Cache:", ""); - Ret += CreateInfoText("Entries", CCrySimpleCache::Instance().EntryCount()); - Ret += CreateBar("Hits", CCrySimpleCache::Instance().Hit(), - CCrySimpleCache::Instance().Hit() + CCrySimpleCache::Instance().Miss(), - CCrySimpleCache::Instance().Hit() * 100 / AZStd::GetMax(1, (CCrySimpleCache::Instance().Hit() + CCrySimpleCache::Instance().Miss()))); - Ret += CreateInfoText("Pending Entries", static_cast(CCrySimpleCache::Instance().PendingCacheEntries().size())); - - - - Ret += TABLE_END; - - Ret += ""; - char Text[sizeof(HTML_HEADER) + 1024]; - azsprintf(Text, HTML_HEADER, __DATE__, Ret.size(), __DATE__); - Ret = std::string(Text) + Ret; - m_request->Socket()->Send(Ret); - } - -private: - std::unique_ptr m_request; -}; - -class HttpServerJob - : public AZ::Job -{ -public: - HttpServerJob(CCrySimpleHTTP* simpleHttp) - : AZ::Job(true, nullptr) - , m_simpleHttp(simpleHttp) { } - -protected: - void Process() - { - m_simpleHttp->Run(); - } -private: - CCrySimpleHTTP* m_simpleHttp; -}; - -////////////////////////////////////////////////////////////////////////// -CCrySimpleHTTP::CCrySimpleHTTP() - : m_pServerSocket(0) -{ - CrySimple_SECURE_START - - Init(); - - CrySimple_SECURE_END -} - -void CCrySimpleHTTP::Init() -{ - m_pServerSocket = new CCrySimpleSock(61480, SEnviropment::Instance().m_WhitelistAddresses); //http - m_pServerSocket->Listen(); - HttpServerJob* serverJob = new HttpServerJob(this); - serverJob->Start(); -} - -void CCrySimpleHTTP::Run() -{ - while (1) - { - // New client message, receive new client socket connection. - CCrySimpleSock* newClientSocket = m_pServerSocket->Accept(); - if(!newClientSocket) - { - continue; - } - - // HTTP Request Data for new job - CHTTPRequest* pData = new CHTTPRequest(newClientSocket); - - HttpProcessRequestJob* requestJob = new HttpProcessRequestJob(pData); - requestJob->Start(); - } -} - - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.hpp deleted file mode 100644 index e78d6ef41d..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleHTTP.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CrySimpleHTTP__ -#define __CrySimpleHTTP__ - -#include -#include -#include - -extern bool g_Success; - -class CCrySimpleSock; - -class CCrySimpleHTTP -{ - static AZStd::atomic_long ms_ExceptionCount; - CCrySimpleSock* m_pServerSocket; - void Init(); -public: - CCrySimpleHTTP(); - - void Run(); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.cpp deleted file mode 100644 index 1e7423dc69..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleJob.hpp" -#include "CrySimpleFileGuard.hpp" -#include "CrySimpleServer.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -AZStd::atomic_long CCrySimpleJob::m_GlobalRequestNumber = {0}; - -CCrySimpleJob::CCrySimpleJob(uint32_t requestIP) - : m_State(ECSJS_NONE) - , m_RequestIP(requestIP) -{ - ++m_GlobalRequestNumber; -} - -CCrySimpleJob::~CCrySimpleJob() -{ -} - - -bool CCrySimpleJob::ExecuteCommand(const std::string& rCmd, std::string& outError) -{ - const bool showStdOuput = false; // For Debug: Set to true if you want the compiler's standard ouput printed out as well. - const bool showStdErrorOuput = SEnviropment::Instance().m_PrintWarnings; - -#ifdef _MSC_VER - bool Ret = false; - DWORD ExitCode = 0; - - STARTUPINFO StartupInfo; - PROCESS_INFORMATION ProcessInfo; - memset(&StartupInfo, 0, sizeof(StartupInfo)); - memset(&ProcessInfo, 0, sizeof(ProcessInfo)); - StartupInfo.cb = sizeof(StartupInfo); - - - std::string Path = ""; - std::string::size_type Pt = rCmd.find_first_of(' '); - if (Pt != std::string::npos) - { - std::string First = std::string(rCmd.c_str(), Pt); - std::string::size_type Pt2 = First.find_last_of('/'); - if (Pt2 != std::string::npos) - { - Path = std::string(First.c_str(), Pt2); - } - else - { - Pt = std::string::npos; - } - } - - HANDLE hReadErr, hWriteErr; - - { - CreatePipe(&hReadErr, &hWriteErr, NULL, 0); - SetHandleInformation(hWriteErr, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); - - StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); - StartupInfo.hStdOutput = (showStdOuput) ? GetStdHandle(STD_OUTPUT_HANDLE) : NULL; - StartupInfo.hStdError = hWriteErr; - StartupInfo.dwFlags |= STARTF_USESTDHANDLES; - - BOOL processCreated = CreateProcess(NULL, (char*)rCmd.c_str(), 0, 0, TRUE, CREATE_DEFAULT_ERROR_MODE, 0, Pt != std::string::npos ? Path.c_str() : 0, &StartupInfo, &ProcessInfo) != false; - - if (!processCreated) - { - outError = "Couldn't create process - missing compiler for cmd?: '" + rCmd + "'"; - } - else - { - std::string error; - - DWORD waitResult = 0; - HANDLE waitHandles[] = { ProcessInfo.hProcess, hReadErr }; - while (true) - { - //waitResult = WaitForMultipleObjects(sizeof(waitHandles) / sizeof(waitHandles[0]), waitHandles, FALSE, 1000 ); - waitResult = WaitForSingleObject(ProcessInfo.hProcess, 1000); - if (waitResult == WAIT_FAILED) - { - break; - } - - DWORD bytesRead, bytesAvailable; - while (PeekNamedPipe(hReadErr, NULL, 0, NULL, &bytesAvailable, NULL) && bytesAvailable) - { - char buff[4096]; - ReadFile(hReadErr, buff, sizeof(buff) - 1, &bytesRead, 0); - buff[bytesRead] = '\0'; - error += buff; - } - CSTLHelper::Trim(error," \t\r\n"); - - //if (waitResult == WAIT_OBJECT_0 || waitResult == WAIT_TIMEOUT) - //break; - - if (waitResult == WAIT_OBJECT_0) - { - break; - } - } - - //if (waitResult != WAIT_TIMEOUT) - { - GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode); - if (ExitCode) - { - Ret = false; - outError = error; - } - else - { - if (showStdErrorOuput && !error.empty()) - { - AZ_Printf(0, "\n%s\n", error.c_str()); - } - Ret = true; - } - } - /* - else - { - Ret = false; - outError = std::string("Timed out executing compiler: ") + rCmd; - TerminateProcess(ProcessInfo.hProcess, 1); - } - */ - - CloseHandle(ProcessInfo.hProcess); - CloseHandle(ProcessInfo.hThread); - } - - CloseHandle(hReadErr); - if (hWriteErr) - { - CloseHandle(hWriteErr); - } - } - - return Ret; -#endif - -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) - std::thread::id threadId = std::this_thread::get_id(); - std::stringstream threadIdStream; - threadIdStream << threadId; - - // Multiple threads could execute a command, therefore the temporary file has to be unique per thread. - AZ::IO::Path errorTempFilePath = SEnviropment::Instance().m_TempPath / AZStd::string::format("stderr_%s.log", threadIdStream.str().c_str()); - std::string stdErrorTempFilename{ errorTempFilePath.c_str(), errorTempFilePath.Native().size() }; - - CCrySimpleFileGuard FGTmpOutput(stdErrorTempFilename); // Delete file at the end of this function - - std::string systemCmd = rCmd; - if(!showStdOuput) - { - // Standard output redirected to null to disable it - systemCmd += " > /dev/null"; - } - // Standard error ouput redirected to the temporary file - systemCmd += " 2> \"" + stdErrorTempFilename + "\""; - - int ret = system(systemCmd.c_str()); - - // Obtain standard error output - std::ifstream fileStream(stdErrorTempFilename.c_str()); - std::stringstream stdErrorStream; - stdErrorStream << fileStream.rdbuf(); - std::string stdErrorString = stdErrorStream.str(); - CSTLHelper::Trim(stdErrorString," \t\r\n"); - - if (ret != 0) - { - outError = stdErrorString; - return false; - } - else - { - if (showStdErrorOuput && !stdErrorString.empty()) - { - AZ_Printf(0, "\n%s\n", stdErrorString.c_str()); - } - return true; - } -#endif -} - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.hpp deleted file mode 100644 index 839fdb1543..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJob.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOB__ -#define __CRYSIMPLEJOB__ - -#include -#include -#include -#include -#include - -class TiXmlElement; - -enum ECrySimpleJobState -{ - ECSJS_NONE, - ECSJS_DONE = 1, //this is checked on client side, don't change! - ECSJS_JOBNOTFOUND, - ECSJS_CACHEHIT, - ECSJS_ERROR, - ECSJS_ERROR_COMPILE = 5, //this is checked on client side, don't change! - ECSJS_ERROR_COMPRESS, - ECSJS_ERROR_FILEIO, - ECSJS_ERROR_INVALID_PROFILE, - ECSJS_ERROR_INVALID_PROJECT, - ECSJS_ERROR_INVALID_PLATFORM, - ECSJS_ERROR_INVALID_PROGRAM, - ECSJS_ERROR_INVALID_ENTRY, - ECSJS_ERROR_INVALID_COMPILEFLAGS, - ECSJS_ERROR_INVALID_COMPILER, - ECSJS_ERROR_INVALID_LANGUAGE, - ECSJS_ERROR_INVALID_SHADERREQUESTLINE, - ECSJS_ERROR_INVALID_SHADERLIST, -}; - -class CCrySimpleJob -{ - ECrySimpleJobState m_State; - uint32_t m_RequestIP; - static AZStd::atomic_long m_GlobalRequestNumber; - - -protected: - virtual bool ExecuteCommand(const std::string& rCmd, std::string& outError); -public: - CCrySimpleJob(uint32_t requestIP); - virtual ~CCrySimpleJob(); - - virtual bool Execute(const TiXmlElement* pElement) = 0; - - void State(ECrySimpleJobState S) - { - if (m_State < ECSJS_ERROR || S >= ECSJS_ERROR) - { - m_State = S; - } - } - ECrySimpleJobState State() const { return m_State; } - const uint32_t& RequestIP() const { return m_RequestIP; } - static long GlobalRequestNumber() { return m_GlobalRequestNumber; } -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.cpp deleted file mode 100644 index dd2bac8db2..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleJobCache.hpp" -#include "CrySimpleCache.hpp" - -#include -#include -#include -#include -#include - -CCrySimpleJobCache::CCrySimpleJobCache(uint32_t requestIP) - : CCrySimpleJob(requestIP) -{ -} - -void CCrySimpleJobCache::CheckHashID(std::vector& rVec, size_t Size) -{ - m_HashID = CSTLHelper::Hash(rVec, Size); - if (CCrySimpleCache::Instance().Find(m_HashID, rVec)) - { - State(ECSJS_CACHEHIT); - logmessage("\r"); // Just update cache hit number - } -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.hpp deleted file mode 100644 index 834a3c687a..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCache.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOBCACHE__ -#define __CRYSIMPLEJOBCACHE__ - -#include "CrySimpleJob.hpp" -#include - -class CCrySimpleJobCache - : public CCrySimpleJob -{ - tdHash m_HashID; - -protected: - - void CheckHashID(std::vector& rVec, size_t Size); - -public: - CCrySimpleJobCache(uint32_t requestIP); - - tdHash HashID() const{return m_HashID; } -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.cpp deleted file mode 100644 index 5acc0bc2c8..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - - -#include "CrySimpleSock.hpp" -#include "CrySimpleJobCompile.hpp" -#include "CrySimpleFileGuard.hpp" -#include "CrySimpleServer.hpp" -#include "CrySimpleCache.hpp" -#include "ShaderList.hpp" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS) -#undef AZ_RESTRICTED_SECTION -#define CRYSIMPLEJOBCOMPILE_CPP_SECTION_1 1 -#endif - -#define MAX_COMPILER_WAIT_TIME (60 * 1000) - -AZStd::atomic_long CCrySimpleJobCompile::m_GlobalCompileTasks = {0}; -AZStd::atomic_long CCrySimpleJobCompile::m_GlobalCompileTasksMax = {0}; -volatile int32_t CCrySimpleJobCompile::m_RemoteServerID = 0; -volatile int64_t CCrySimpleJobCompile::m_GlobalCompileTime = 0; - -struct STimer -{ - int64_t m_freq; - STimer() - { - QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq); - } - int64_t GetTime() const - { - int64_t t; - QueryPerformanceCounter((LARGE_INTEGER*)&t); - return t; - } - - double TimeToSeconds(int64_t t) - { - return ((double)t) / m_freq; - } -}; - - -STimer g_Timer; - -// This function validates executables up to version 21 -// because it's received within the compilation flags. -bool ValidateExecutableStringLegacy(const AZStd::string& executableString) -{ - AZStd::string::size_type endOfCommand = executableString.find(" "); - - // Game always sends some type of options after the command. If we don't - // have a space then that implies that there are no options. Reject the - // command as someone being malicious - if (endOfCommand == AZStd::string::npos) - { - return false; - } - - AZStd::string commandString = executableString.substr(0, endOfCommand); - - // The game never sends a parent directory in the compiler flags so lets - // reject any commands that have .. in it - if (commandString.find("..") != AZStd::string::npos) - { - return false; - } - - // Though the code later down would fail gracefully reject any absolute paths here - if (commandString.find("\\\\") != AZStd::string::npos || - commandString.find(":") != AZStd::string::npos) - { - return false; - } - - // Only allow a subset of executables to be accepted... - if (commandString.find("fxc.exe") == AZStd::string::npos && - commandString.find("FXC.exe") == AZStd::string::npos && - commandString.find("HLSLcc.exe") == AZStd::string::npos && - commandString.find("HLSLcc_dedicated.exe") == AZStd::string::npos && - commandString.find("DXProvoShaderCompiler.exe") == AZStd::string::npos && - commandString.find("dxcGL") == AZStd::string::npos && - commandString.find("dxcMetal") == AZStd::string::npos) - { - return false; - } - - return true; -} - -CCrySimpleJobCompile::CCrySimpleJobCompile(uint32_t requestIP, EProtocolVersion Version, std::vector* pRVec) - : CCrySimpleJobCache(requestIP) - , m_Version(Version) - , m_pRVec(pRVec) -{ - ++m_GlobalCompileTasks; - if (m_GlobalCompileTasksMax < m_GlobalCompileTasks) - { - //Need this cast as the copy assignment operator is implicitly deleted - m_GlobalCompileTasksMax = static_cast(m_GlobalCompileTasks); - } -} - -CCrySimpleJobCompile::~CCrySimpleJobCompile() -{ - --m_GlobalCompileTasks; -} - -bool CCrySimpleJobCompile::Execute(const TiXmlElement* pElement) -{ - std::vector& rVec = *m_pRVec; - - size_t Size = SizeOf(rVec); - - CheckHashID(rVec, Size); - - if (State() == ECSJS_CACHEHIT) - { - State(ECSJS_DONE); - return true; - } - - if (!SEnviropment::Instance().m_FallbackServer.empty() && m_GlobalCompileTasks > SEnviropment::Instance().m_FallbackTreshold) - { - tdEntryVec ServerVec; - CSTLHelper::Tokenize(ServerVec, SEnviropment::Instance().m_FallbackServer, ";"); - uint32_t Idx = m_RemoteServerID++; - uint32_t Count = (uint32_t)ServerVec.size(); - std::string Server = ServerVec[Idx % Count]; - printf(" Remote Compile on %s ...\n", Server.c_str()); - CCrySimpleSock Sock(Server, SEnviropment::Instance().m_port); - if (Sock.Valid()) - { - Sock.Forward(rVec); - std::vector Tmp; - if (Sock.Backward(Tmp)) - { - rVec = Tmp; - if (Tmp.size() <= 4 || (m_Version == EPV_V002 && Tmp[4] != ECSJS_DONE)) - { - State(ECSJS_ERROR_COMPILE); - CrySimple_ERROR("failed to compile request"); - return false; - } - State(ECSJS_DONE); - //printf("done\n"); - } - else - { - printf("failed, fallback to local\n"); - } - } - else - { - printf("failed, fallback to local\n"); - } - } - if (State() == ECSJS_NONE) - { - if (!Compile(pElement, rVec) || rVec.size() == 0) - { - State(ECSJS_ERROR_COMPILE); - CrySimple_ERROR("failed to compile request"); - return false; - } - - tdDataVector rDataRaw; - rDataRaw.swap(rVec); - if (!CSTLHelper::Compress(rDataRaw, rVec)) - { - State(ECSJS_ERROR_COMPRESS); - CrySimple_ERROR("failed to compress request"); - return false; - } - State(ECSJS_DONE); - } - - // Cache compiled data - const char* pCaching = pElement->Attribute("Caching"); - if (State() != ECSJS_ERROR && (!pCaching || std::string(pCaching) == "1")) - { - CCrySimpleCache::Instance().Add(HashID(), rVec); - } - - return true; -} - -bool CCrySimpleJobCompile::Compile(const TiXmlElement* pElement, std::vector& rVec) -{ - AZStd::string platform; - AZStd::string compiler; - AZStd::string language; - AZStd::string shaderPath; - - if (m_Version >= EPV_V0023) - { - // NOTE: These attributes were alredy validated. - platform = pElement->Attribute("Platform"); - compiler = pElement->Attribute("Compiler"); - language = pElement->Attribute("Language"); - - shaderPath = AZStd::string::format("%s%s-%s-%s/", SEnviropment::Instance().m_ShaderPath.c_str(), platform.c_str(), compiler.c_str(), language.c_str()); - } - else - { - // In previous versions Platform attribute is the language - platform = "N/A"; - language = pElement->Attribute("Platform"); - - // Map shader language to shader compiler key - const AZStd::unordered_map languageToCompilerMap - { - { - "GL4", SEnviropment::m_GLSL_HLSLcc - },{ - "GLES3_0", SEnviropment::m_GLSL_HLSLcc - },{ - "GLES3_1", SEnviropment::m_GLSL_HLSLcc - },{ - "DX11", SEnviropment::m_D3D11_FXC - },{ - "METAL", SEnviropment::m_METAL_HLSLcc - },{ - "ORBIS", SEnviropment::m_Orbis_DXC - },{ - "JASPER", SEnviropment::m_Jasper_FXC - } - }; - - auto foundShaderLanguage = languageToCompilerMap.find(language); - if (foundShaderLanguage == languageToCompilerMap.end()) - { - State(ECSJS_ERROR_INVALID_LANGUAGE); - CrySimple_ERROR("Trying to compile with invalid shader language"); - return false; - } - - if (m_Version < EPV_V0022) - { - compiler = "N/A"; // Compiler exe will be specified inside 'compile flags', this variable won't be used - } - else - { - compiler = foundShaderLanguage->second; - - if (!SEnviropment::Instance().IsShaderCompilerValid(compiler)) - { - State(ECSJS_ERROR_INVALID_COMPILER); - CrySimple_ERROR("Trying to compile with invalid shader compiler"); - return false; - } - } - - shaderPath = AZStd::string::format("%s%s/", SEnviropment::Instance().m_ShaderPath.c_str(), language.c_str()); - } - - shaderPath = AZ::IO::PathView(shaderPath).LexicallyNormal().Native(); - if (!IsPathValid(shaderPath)) - { - State(ECSJS_ERROR); - CrySimple_ERROR("Shaders output path is invalid"); - return false; - } - - // Create shaders directory - AZ::IO::SystemFile::CreateDir( shaderPath.c_str() ); - - const char* pProfile = pElement->Attribute("Profile"); - const char* pProgram = pElement->Attribute("Program"); - const char* pEntry = pElement->Attribute("Entry"); - const char* pCompileFlags = pElement->Attribute("CompileFlags"); - const char* pShaderRequestLine = pElement->Attribute("ShaderRequest"); - - if (!pProfile) - { - State(ECSJS_ERROR_INVALID_PROFILE); - CrySimple_ERROR("failed to extract Profile of the request"); - return false; - } - if (!pProgram) - { - State(ECSJS_ERROR_INVALID_PROGRAM); - CrySimple_ERROR("failed to extract Program of the request"); - return false; - } - if (!pEntry) - { - State(ECSJS_ERROR_INVALID_ENTRY); - CrySimple_ERROR("failed to extract Entry of the request"); - return false; - } - if (!pShaderRequestLine) - { - State(ECSJS_ERROR_INVALID_SHADERREQUESTLINE); - CrySimple_ERROR("failed to extract ShaderRequest of the request"); - return false; - } - if (!pCompileFlags) - { - State(ECSJS_ERROR_INVALID_COMPILEFLAGS); - CrySimple_ERROR("failed to extract CompileFlags of the request"); - return false; - } - - // Validate that the shader request line has a set of open/close parens as - // the code below this expects at least the open paren to be in the string. - // Without the open paren the code below will crash the compiler - std::string strippedShaderRequestLine(pShaderRequestLine); - const size_t locationOfOpenParen = strippedShaderRequestLine.find("("); - const size_t locationOfCloseParen = strippedShaderRequestLine.find(")"); - if (locationOfOpenParen == std::string::npos || - locationOfCloseParen == std::string::npos || locationOfCloseParen < locationOfOpenParen) - { - State(ECSJS_ERROR_INVALID_SHADERREQUESTLINE); - CrySimple_ERROR("invalid ShaderRequest attribute"); - return false; - } - - static AZStd::atomic_long nTmpCounter = { 0 }; - ++nTmpCounter; - - const auto tmpIndex = AZStd::string::format("%ld", static_cast(nTmpCounter)); - const AZ::IO::Path TmpIn = SEnviropment::Instance().m_TempPath / (tmpIndex + ".In"); - const AZ::IO::Path TmpOut = SEnviropment::Instance().m_TempPath / (tmpIndex + ".Out"); - CCrySimpleFileGuard FGTmpIn(TmpIn.c_str()); - CCrySimpleFileGuard FGTmpOut(TmpOut.c_str()); - CSTLHelper::ToFile(TmpIn.c_str(), std::vector(pProgram, &pProgram[strlen(pProgram)])); - - AZ::IO::Path compilerPath = SEnviropment::Instance().m_CompilerPath; - AZStd::string command; - if (m_Version >= EPV_V0022) - { - AZStd::string compilerExecutable; - bool validCompiler = SEnviropment::Instance().GetShaderCompilerExecutable(compiler, compilerExecutable); - if (!validCompiler) - { - State(ECSJS_ERROR_INVALID_COMPILER); - CrySimple_ERROR("Trying to compile with unknown compiler"); - return false; - } - - AZStd::string commandStringToFormat = (compilerPath / compilerExecutable).Native(); - -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) - // Surrounding compiler path+executable with quotes to support spaces in the path. - // NOTE: Executable has a space at the end on purpose, inserting quote before. - commandStringToFormat.insert(0, "\""); - commandStringToFormat.insert(commandStringToFormat.length()-1, "\""); -#endif - - commandStringToFormat.append(pCompileFlags); - - if (strstr(pCompileFlags, "-fxc") != nullptr) - { - AZStd::string fxcCompilerExecutable; - bool validFXCCompiler = SEnviropment::Instance().GetShaderCompilerExecutable(SEnviropment::m_D3D11_FXC, fxcCompilerExecutable); - if (!validFXCCompiler) - { - State(ECSJS_ERROR_INVALID_COMPILER); - CrySimple_ERROR("FXC compiler executable cannot be found"); - return false; - } - - AZ::IO::Path fxcLocation = compilerPath / fxcCompilerExecutable; - - // Handle an extra string parameter to specify the base directory where the fxc compiler is located - command = AZStd::move(AZStd::string::format(commandStringToFormat.c_str(), fxcLocation.c_str(), pEntry, pProfile, TmpOut.c_str(), TmpIn.c_str())); - } - else - { - command = AZStd::move(AZStd::string::format(commandStringToFormat.c_str(), pEntry, pProfile, TmpOut.c_str(), TmpIn.c_str())); - } - } - else - { - if (!ValidateExecutableStringLegacy(pCompileFlags)) - { - State(ECSJS_ERROR_INVALID_COMPILEFLAGS); - CrySimple_ERROR("CompileFlags failed validation"); - return false; - } - - if (strstr(pCompileFlags, "-fxc=\"%s") != nullptr) - { - // Check that the string after the %s is a valid shader compiler - // executable - AZStd::string tempString(pCompileFlags); - const AZStd::string::size_type fxcOffset = tempString.find("%s") + 2; - const AZStd::string::size_type endOfFxcString = tempString.find(" ", fxcOffset); - tempString = tempString.substr(fxcOffset, endOfFxcString); - if (!ValidateExecutableStringLegacy(tempString)) - { - State(ECSJS_ERROR_INVALID_COMPILEFLAGS); - CrySimple_ERROR("CompileFlags failed validation"); - return false; - } - - // Handle an extra string parameter to specify the base directory where the fxc compiler is located - command = AZStd::move(AZStd::string::format(pCompileFlags, compilerPath.c_str(), pEntry, pProfile, TmpOut.c_str(), TmpIn.c_str())); - - // Need to add the string for escaped quotes around the path to the compiler. This is in case the path has spaces. - // Adding just quotes (escaped) doesn't work because this cmd line is used to execute another process. - AZStd::string insertPattern = "\\\""; - - // Search for the next space until that path exists. Then we assume that's the path to the executable. - size_t startPos = command.find(compilerPath.Native()); - for (size_t pos = command.find(" ", startPos); pos != AZStd::string::npos; pos = command.find(" ", pos + 1)) - { - if (AZ::IO::SystemFile::Exists(command.substr(startPos, pos - startPos).c_str())) - { - command.insert(pos, insertPattern); - command.insert(startPos, insertPattern); - } - } - } - else - { - command = AZStd::move(AZStd::string::format(pCompileFlags, pEntry, pProfile, TmpOut.c_str(), TmpIn.c_str())); - } - - command = compilerPath.Native() + command; - } - - AZStd::string hardwareTarget; - -#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS) - #if defined(TOOLS_SUPPORT_JASPER) - #define AZ_RESTRICTED_SECTION CRYSIMPLEJOBCOMPILE_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleJobCompile_cpp, jasper) - #endif - #if defined(TOOLS_SUPPORT_PROVO) - #define AZ_RESTRICTED_SECTION CRYSIMPLEJOBCOMPILE_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleJobCompile_cpp, provo) - #endif - #if defined(TOOLS_SUPPORT_SALEM) - #define AZ_RESTRICTED_SECTION CRYSIMPLEJOBCOMPILE_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleJobCompile_cpp, salem) - #endif -#endif - - int64_t t0 = g_Timer.GetTime(); - - std::string outError; - - std::string shaderName; - std::stringstream crcStringStream; - - - // Dump source shader - if (SEnviropment::Instance().m_DumpShaders) - { - unsigned long crc = crc32(0l, Z_NULL, 0); - // shader permutations start with '(' - size_t position = strippedShaderRequestLine.find('('); - // split the string into shader name - shaderName = strippedShaderRequestLine.substr(0, position); - // split the string into permutation - std::string permutation = strippedShaderRequestLine.substr(position, strippedShaderRequestLine.length() - position); - // replace illegal filename characters with valid ones - AZStd::replace(shaderName.begin(), shaderName.end(), '<', '('); - AZStd::replace(shaderName.begin(), shaderName.end(), '>', ')'); - AZStd::replace(shaderName.begin(), shaderName.end(), '/', '_'); - AZStd::replace(shaderName.begin(), shaderName.end(), '|', '+'); - AZStd::replace(shaderName.begin(), shaderName.end(), '*', '^'); - AZStd::replace(shaderName.begin(), shaderName.end(), ':', ';'); - AZStd::replace(shaderName.begin(), shaderName.end(), '?', '!'); - AZStd::replace(shaderName.begin(), shaderName.end(), '%', '$'); - - crc = crc32(crc, reinterpret_cast(permutation.c_str()), static_cast(permutation.length())); - crcStringStream << crc; - const std::string HlslDump = shaderPath.c_str() + shaderName + "_" + crcStringStream.str() + ".hlsl"; - CSTLHelper::ToFile(HlslDump, std::vector(pProgram, &pProgram[strlen(pProgram)])); - std::ofstream crcFile; - - std::string crcFileName = shaderPath.c_str() + shaderName + "_" + crcStringStream.str() + ".txt"; - - crcFile.open(crcFileName, std::ios_base::trunc); - - if (!crcFile.fail()) - { - // store permutation - crcFile << permutation; - } - else - { - std::cout << "Error opening file " + crcFileName << std::endl; - } - - crcFile.close(); - } - - if (SEnviropment::Instance().m_PrintCommands) - { - AZ_Printf(0, "Compiler Command:\n%s\n\n", command.c_str()); - } - - if (!ExecuteCommand(command.c_str(), outError)) - { - unsigned char* nIP = (unsigned char*) &RequestIP(); - char sIP[128]; - azsprintf(sIP, "%d.%d.%d.%d", nIP[0], nIP[1], nIP[2], nIP[3]); - - const char* pProject = pElement->Attribute("Project"); - const char* pTags = pElement->Attribute("Tags"); - const char* pEmailCCs = pElement->Attribute("EmailCCs"); - - std::string project = pProject ? pProject : "Unk/"; - std::string ccs = pEmailCCs ? pEmailCCs : ""; - std::string tags = pTags ? pTags : ""; - - std::string filteredError; - AZ::IO::Path patchFilePath = TmpIn; - patchFilePath.ReplaceFilename(AZ::IO::PathView{ AZStd::string{ TmpIn.Filename().Native() } + ".patched" }); - CSTLHelper::Replace(filteredError, outError, patchFilePath.c_str(), "%filename%"); // DXPS does its own patching - CSTLHelper::Replace(filteredError, filteredError, TmpIn.c_str(), "%filename%"); - // replace any that don't have the full path - CSTLHelper::Replace(filteredError, filteredError, (tmpIndex + ".In.patched").c_str(), "%filename%"); // DXPS does its own patching - CSTLHelper::Replace(filteredError, filteredError, (tmpIndex + ".In").c_str(), "%filename%"); - - CSTLHelper::Replace(filteredError, filteredError, "\r\n", "\n"); - - State(ECSJS_ERROR_COMPILE); - throw new CCompilerError(pEntry, filteredError, ccs, sIP, pShaderRequestLine, pProgram, project, platform.c_str(), compiler.c_str(), language.c_str(), tags, pProfile); - } - - if (!CSTLHelper::FromFile(TmpOut.c_str(), rVec)) - { - State(ECSJS_ERROR_FILEIO); - std::string errorString("Could not read: "); - errorString += std::string(TmpOut.c_str(), TmpOut.Native().size()); - CrySimple_ERROR(errorString.c_str()); - return false; - } - - // Dump cross-compiled shader - if (SEnviropment::Instance().m_DumpShaders) - { - AZStd::string fileExtension = language; - AZStd::transform(fileExtension.begin(), fileExtension.end(), fileExtension.begin(), tolower); - - std::string shaderDump = shaderPath.c_str() + shaderName + "_" + crcStringStream.str() + "." + fileExtension.c_str(); - CSTLHelper::ToFile(shaderDump, rVec); - } - - - int64_t t1 = g_Timer.GetTime(); - int64_t dt = t1 - t0; - m_GlobalCompileTime += dt; - - int millis = (int)(g_Timer.TimeToSeconds(dt) * 1000.0); - int secondsTotal = (int)g_Timer.TimeToSeconds(m_GlobalCompileTime); - logmessage("Compiled [%5dms|%8ds] (%s - %s - %s - %s) %s\n", millis, secondsTotal, platform.c_str(), compiler.c_str(), language.c_str(), pProfile, pEntry); - - if (hardwareTarget.empty()) - { - logmessage("Compiled [%5dms|%8ds] (% 5s %s) %s\n", millis, secondsTotal, platform.c_str(), pProfile, pEntry); - } - else - { - logmessage("Compiled [%5dms|%8ds] (% 5s %s) %s %s\n", millis, secondsTotal, platform.c_str(), pProfile, pEntry, hardwareTarget.c_str()); - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -inline bool SortByLinenum(const std::pair& f1, const std::pair& f2) -{ - return f1.first < f2.first; -} - -CCompilerError::CCompilerError(const std::string& entry, const std::string& errortext, const std::string& ccs, const std::string& IP, - const std::string& requestLine, const std::string& program, const std::string& project, - const std::string& platform, const std::string& compiler, const std::string& language, const std::string& tags, const std::string& profile) - : ICryError(COMPILE_ERROR) - , m_entry(entry) - , m_errortext(errortext) - , m_IP(IP) - , m_program(program) - , m_project(project) - , m_platform(platform) - , m_compiler(compiler) - , m_language(language) - , m_tags(tags) - , m_profile(profile) - , m_uniqueID(0) -{ - m_requests.push_back(requestLine); - Init(); - - CSTLHelper::Tokenize(m_CCs, ccs, ";"); -} - -void CCompilerError::Init() -{ - while (!m_errortext.empty() && (m_errortext.back() == '\r' || m_errortext.back() == '\n')) - { - m_errortext.pop_back(); - } - - if (m_requests[0].size()) - { - m_shader = m_requests[0]; - size_t offs = m_shader.find('>'); - if (offs != std::string::npos) - { - m_shader.erase(0, m_shader.find('>') + 1); // remove <2> version - } - offs = m_shader.find('@'); - if (offs != std::string::npos) - { - m_shader.erase(m_shader.find('@')); // remove everything after @ - } - offs = m_shader.find('/'); - if (offs != std::string::npos) - { - m_shader.erase(m_shader.find('/')); // remove everything after / (used on xenon) - } - } - else - { - // default to entry function - m_shader = m_entry; - size_t len = m_shader.length(); - - // if it ends in ?S then trim those two characters - if (m_shader[len - 1] == 'S') - { - m_shader.pop_back(); - m_shader.pop_back(); - } - } - - std::vector lines; - CSTLHelper::Tokenize(lines, m_errortext, "\n"); - - for (uint32_t i = 0; i < lines.size(); i++) - { - std::string& line = lines[i]; - - if (line.substr(0, 5) == "error") - { - m_errors.push_back(std::pair(-1, line)); - m_hasherrors += line; - - continue; - } - - if (line.find(": error") == std::string::npos) - { - continue; - } - - if (line.substr(0, 10) != "%filename%") - { - continue; - } - - if (line[10] != '(') - { - continue; - } - - uint32_t c = 11; - - int linenum = 0; - { - bool ln = true; - while (c < line.length() && - ((line[c] >= '0' && line[c] <= '9') || line[c] == ',' || line[c] == '-') - ) - { - if (line[c] == ',') - { - ln = false; // reached column, don't save the value - just keep reading to the end - } - if (ln) - { - linenum *= 10; - linenum += line[c] - '0'; - } - c++; - } - - if (c >= line.length()) - { - continue; - } - - if (line[c] != ')') - { - continue; - } - - c++; - } - - while (c < line.length() && (line[c] == ' ' || line[c] == ':')) - { - c++; - } - - if (line.substr(c, 5) != "error") - { - continue; - } - - m_errors.push_back(std::pair(linenum, line)); - m_hasherrors += line.substr(c); - } - - AZStd::sort(m_errors.begin(), m_errors.end(), SortByLinenum); -} - -std::string CCompilerError::GetErrorLines() const -{ - std::string ret = ""; - - for (uint32_t i = 0; i < m_errors.size(); i++) - { - if (m_errors[i].first < 0) - { - ret += m_errors[i].second + "\n"; - } - else if (i > 0 && m_errors[i - 1].first < 0) - { - ret += "\n" + GetContext(m_errors[i].first) + "\n" + m_errors[i].second + "\n\n"; - } - else if (i > 0 && m_errors[i - 1].first == m_errors[i].first) - { - ret.pop_back(); // pop extra newline - ret += m_errors[i].second + "\n\n"; - } - else - { - ret += GetContext(m_errors[i].first) + "\n" + m_errors[i].second + "\n\n"; - } - } - - return ret; -} - -std::string CCompilerError::GetContext(int linenum, int context, std::string prefix) const -{ - std::vector lines; - CSTLHelper::Tokenize(lines, m_program, "\n"); - - std::string ret = ""; - - linenum--; // line numbers start at one - - char sLineNum[16]; - - for (uint32_t i = AZStd::GetMax(0U, (uint32_t)(linenum - context)); i <= AZStd::GetMin((uint32_t)lines.size() - 1U, (uint32_t)(linenum + context)); i++) - { - azsprintf(sLineNum, "% 3d", i + 1); - - ret += sLineNum; - ret += " "; - - if (prefix.size()) - { - if (i == linenum) - { - ret += "*"; - } - else - { - ret += " "; - } - - ret += prefix; - - ret += " "; - } - - ret += lines[i] + "\n"; - } - - return ret; -} - -void CCompilerError::AddDuplicate(ICryError* err) -{ - ICryError::AddDuplicate(err); - - if (err->GetType() == COMPILE_ERROR) - { - CCompilerError* comperr = (CCompilerError*)err; - m_requests.insert(m_requests.end(), comperr->m_requests.begin(), comperr->m_requests.end()); - } -} - -bool CCompilerError::Compare(const ICryError* err) const -{ - if (GetType() != err->GetType()) - { - return GetType() < err->GetType(); - } - - CCompilerError* e = (CCompilerError*)err; - - if (m_platform != e->m_platform) - { - return m_platform < e->m_platform; - } - - if (m_compiler != e->m_compiler) - { - return m_compiler < e->m_compiler; - } - - if (m_language != e->m_language) - { - return m_language < e->m_language; - } - - if (m_shader != e->m_shader) - { - return m_shader < e->m_shader; - } - - if (m_entry != e->m_entry) - { - return m_entry < e->m_entry; - } - - return Hash() < err->Hash(); -} - -bool CCompilerError::CanMerge(const ICryError* err) const -{ - if (GetType() != err->GetType()) // don't merge with non compile errors - { - return false; - } - - CCompilerError* e = (CCompilerError*)err; - - if (m_platform != e->m_platform || m_compiler != e->m_compiler || m_language != e->m_language || m_shader != e->m_shader) - { - return false; - } - - if (m_CCs.size() != e->m_CCs.size()) - { - return false; - } - - for (size_t a = 0, S = m_CCs.size(); a < S; a++) - { - if (m_CCs[a] != e->m_CCs[a]) - { - return false; - } - } - - return true; -} - -void CCompilerError::AddCCs(std::set& ccs) const -{ - for (size_t a = 0, S = m_CCs.size(); a < S; a++) - { - ccs.insert(m_CCs[a]); - } -} - -std::string CCompilerError::GetErrorName() const -{ - return std::string("[") + m_tags + "] Shader Compile Errors in " + m_shader + " on " + m_language + " for " + m_platform + " " + m_compiler; -} - -std::string CCompilerError::GetErrorDetails(EOutputFormatType outputType) const -{ - std::string errorString(""); - - char sUniqueID[16], sNumDuplicates[16]; - azsprintf(sUniqueID, "%d", m_uniqueID); - azsprintf(sNumDuplicates, "%d", NumDuplicates()); - - std::string errorOutput; - CSTLHelper::Replace(errorOutput, GetErrorLines(), "%filename%", std::string(sUniqueID) + "-" + GetFilename()); - - std::string fullOutput; - CSTLHelper::Replace(fullOutput, m_errortext, "%filename%", std::string(sUniqueID) + "-" + GetFilename()); - - if (outputType == OUTPUT_HASH) - { - errorString = GetFilename() + m_IP + m_platform + m_compiler + m_language + m_project + m_entry + m_tags + m_profile + m_hasherrors /*+ m_requestline*/; - } - else if (outputType == OUTPUT_EMAIL) - { - errorString = std::string("=== Shader compile error in ") + m_entry + " (" + sNumDuplicates + " duplicates)\n\n"; - - ///// - errorString += std::string("* From: ") + m_IP + " on " + m_language + " for " + m_platform + " " + m_compiler + " " + m_project; - if (m_tags != "") - { - errorString += std::string(" (Tags: ") + m_tags + ")"; - } - errorString += "\n"; - - ///// - errorString += std::string("* Target profile: ") + m_profile + "\n"; - - ///// - bool hasrequests = false; - for (uint32_t i = 0; i < m_requests.size(); i++) - { - if (m_requests[i].size()) - { - errorString += std::string("* Shader request line: ") + m_requests[i] + "\n"; - hasrequests = true; - } - } - - errorString += "\n"; - - if (hasrequests) - { - errorString += "* Shader source from first listed request\n"; - } - - errorString += std::string("* Reported error(s) from ") + sUniqueID + "-" + GetFilename() + "\n\n"; - errorString += errorOutput + "\n\n"; - - errorString += std::string("* Full compiler output:\n\n"); - errorString += fullOutput + "\n"; - } - else if (outputType == OUTPUT_TTY) - { - errorString = std::string("=== Shader compile error in ") + m_entry + " { " + m_requests[0] + " }\n"; - // errors only - errorString += std::string("* Reported error(s):\n\n"); - errorString += errorOutput; - errorString += m_errortext; - } - - return errorString; -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.hpp deleted file mode 100644 index 7f097cbd7c..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOBCOMPILE__ -#define __CRYSIMPLEJOBCOMPILE__ - -#include "CrySimpleJobCache.hpp" -#include -#include - - -class CCrySimpleJobCompile - : public CCrySimpleJobCache -{ -public: - CCrySimpleJobCompile(uint32_t requestIP, EProtocolVersion Version, std::vector* pRVec); - virtual ~CCrySimpleJobCompile(); - - virtual bool Execute(const TiXmlElement* pElement); - - static long GlobalCompileTasks(){return m_GlobalCompileTasks; } - static long GlobalCompileTasksMax(){return m_GlobalCompileTasksMax; } - -private: - static AZStd::atomic_long m_GlobalCompileTasks; - static AZStd::atomic_long m_GlobalCompileTasksMax; - static volatile int32_t m_RemoteServerID; - static volatile int64_t m_GlobalCompileTime; - - EProtocolVersion m_Version; - std::vector* m_pRVec; - - virtual size_t SizeOf(std::vector& rVec) = 0; - - bool Compile(const TiXmlElement* pElement, std::vector& rVec); -}; - -class CCompilerError - : public ICryError -{ -public: - CCompilerError(const std::string& entry, const std::string& errortext, const std::string& ccs, const std::string& IP, - const std::string& requestLine, const std::string& program, const std::string& project, - const std::string& platform, const std::string& compiler, const std::string& language, const std::string& tags, const std::string& profile); - - virtual ~CCompilerError() {} - - virtual void AddDuplicate(ICryError* err); - - virtual void SetUniqueID(int uniqueID) { m_uniqueID = uniqueID; } - - virtual bool Compare(const ICryError* err) const; - virtual bool CanMerge(const ICryError* err) const; - - virtual bool HasFile() const { return true; } - - virtual void AddCCs(std::set& ccs) const; - - virtual std::string GetErrorName() const; - virtual std::string GetErrorDetails(EOutputFormatType outputType) const; - virtual std::string GetFilename() const { return m_entry + ".txt"; } - virtual std::string GetFileContents() const { return m_program; } - - std::vector m_requests; -private: - void Init(); - std::string GetErrorLines() const; - std::string GetContext(int linenum, int context = 2, std::string prefix = ">") const; - - std::vector< std::pair > m_errors; - - tdEntryVec m_CCs; - - std::string m_entry, m_errortext, m_hasherrors, m_IP, - m_program, m_project, m_shader, - m_platform, m_compiler, m_language, m_tags, m_profile; - int m_uniqueID; - - friend CCompilerError; -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.cpp deleted file mode 100644 index 35582a64cd..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include -#include -#include -#include -#include "CrySimpleSock.hpp" -#include "CrySimpleJobCompile1.hpp" - - - -CCrySimpleJobCompile1::CCrySimpleJobCompile1(uint32_t requestIP, std::vector* pRVec) - : CCrySimpleJobCompile(requestIP, EPV_V001, pRVec) -{ -} - -size_t CCrySimpleJobCompile1::SizeOf(std::vector& rVec) -{ - return rVec.size(); -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.hpp deleted file mode 100644 index 839ab2f393..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile1.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOBCOMPILE1__ -#define __CRYSIMPLEJOBCOMPILE1__ - -#include "CrySimpleJobCompile.hpp" - - -class CCrySimpleJobCompile1 - : public CCrySimpleJobCompile -{ - virtual size_t SizeOf(std::vector& rVec); - -public: - CCrySimpleJobCompile1(uint32_t requestIP, std::vector* pRVec); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.cpp deleted file mode 100644 index 4946f7146b..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleSock.hpp" -#include "CrySimpleJobCompile2.hpp" - -#include -#include -#include -#include - - - -CCrySimpleJobCompile2::CCrySimpleJobCompile2(EProtocolVersion version, uint32_t requestIP, std::vector* pRVec) - : CCrySimpleJobCompile(requestIP, version, pRVec) -{ -} - -size_t CCrySimpleJobCompile2::SizeOf(std::vector& rVec) -{ - const char* pXML = reinterpret_cast(&rVec[0]); - const char* pFirst = strstr(pXML, "HashStop"); - return pFirst ? pFirst - pXML : rVec.size(); -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.hpp deleted file mode 100644 index 6d52d9a822..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobCompile2.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOBCOMPILE2__ -#define __CRYSIMPLEJOBCOMPILE2__ - -#include "CrySimpleJobCompile.hpp" - - -class CCrySimpleJobCompile2 - : public CCrySimpleJobCompile -{ - virtual size_t SizeOf(std::vector& rVec); - -public: - CCrySimpleJobCompile2(EProtocolVersion version, uint32_t requestIP, std::vector* pRVec); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.cpp deleted file mode 100644 index b0c87edf90..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "CrySimpleJobGetShaderList.hpp" -#include "ShaderList.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include - - -CCrySimpleJobGetShaderList::CCrySimpleJobGetShaderList(uint32_t requestIP, std::vector* pRVec) - : CCrySimpleJob(requestIP) - , m_pRVec(pRVec) -{ -} - -bool CCrySimpleJobGetShaderList::Execute(const TiXmlElement* pElement) -{ - AZ::IO::Path shaderListFilename; - - const char* project = pElement->Attribute("Project"); - const char* shaderList = pElement->Attribute("ShaderList"); - const char* platform = pElement->Attribute("Platform"); - const char* compiler = pElement->Attribute("Compiler"); - const char* language = pElement->Attribute("Language"); - - shaderListFilename = project; - shaderListFilename /= "Cache"; - shaderListFilename /= AZStd::string::format("%s-%s-%s", platform, compiler, language); - shaderListFilename /= shaderList; - - //open the file and read into the rVec - - FILE* pFile = nullptr; - azfopen(&pFile, shaderListFilename.c_str(), "rb"); - if (!pFile) - { - // Fake a good result. We can't be sure if this file name is bad or if it doesn't exist *yet*, so we'll just assume the latter. - m_pRVec->resize(4, '\0'); - State(ECSJS_DONE); - return true; - } - - fseek(pFile, 0, SEEK_END); - size_t fileSize = ftell(pFile); - m_pRVec->resize(fileSize); - fseek(pFile, 0, SEEK_SET); - - size_t remaining = fileSize; - size_t read = 0; - while (remaining) - { - read += fread(m_pRVec->data() + read, 1, remaining, pFile); - remaining -= read; - } - - fclose(pFile); - - //compress before sending - tdDataVector rDataRaw; - rDataRaw.swap(*m_pRVec); - if (!CSTLHelper::Compress(rDataRaw, *m_pRVec)) - { - State(ECSJS_ERROR_COMPRESS); - CrySimple_ERROR("failed to compress request"); - return false; - } - State(ECSJS_DONE); - - return true; -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.hpp deleted file mode 100644 index 58f2ac16c7..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobGetShaderList.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#ifndef __CRYSIMPLEJOBGETSHADERLIST__ -#define __CRYSIMPLEJOBGETSHADERLIST__ - -#include "CrySimpleJob.hpp" - - -class CCrySimpleJobGetShaderList - : public CCrySimpleJob -{ -public: - CCrySimpleJobGetShaderList(uint32_t requestIP, std::vector* pRVec); - - virtual bool Execute(const TiXmlElement* pElement); - std::vector* m_pRVec = nullptr; -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.cpp deleted file mode 100644 index 878d8921dd..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleJobRequest.hpp" -#include "CrySimpleServer.hpp" -#include "ShaderList.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -CCrySimpleJobRequest::CCrySimpleJobRequest(EProtocolVersion Version, uint32_t requestIP) - : CCrySimpleJob(requestIP) - , m_Version(Version) -{ -} - -bool CCrySimpleJobRequest::Execute(const TiXmlElement* pElement) -{ - const char* shaderRequest = pElement->Attribute("ShaderRequest"); - if (!shaderRequest) - { - State(ECSJS_ERROR_INVALID_SHADERREQUESTLINE); - CrySimple_ERROR("Missing shader request line"); - return false; - } - - AZ::IO::Path shaderListFilename; - if (m_Version >= EPV_V0023) - { - const char* project = pElement->Attribute("Project"); - const char* shaderList = pElement->Attribute("ShaderList"); - if (!project) - { - State(ECSJS_ERROR_INVALID_PROJECT); - CrySimple_ERROR("Missing Project for shader request"); - return false; - } - if (!shaderList) - { - State(ECSJS_ERROR_INVALID_SHADERLIST); - CrySimple_ERROR("Missing Shader List for shader request"); - return false; - } - - // NOTE: These attributes were alredy validated. - AZStd::string platform = pElement->Attribute("Platform"); - AZStd::string compiler = pElement->Attribute("Compiler"); - AZStd::string language = pElement->Attribute("Language"); - - shaderListFilename = project; - shaderListFilename /= "Cache"; - shaderListFilename /= AZStd::string::format("%s-%s-%s", platform.c_str(), compiler.c_str(), language.c_str()); - shaderListFilename /= shaderList; - } - else - { - // In previous versions Platform attribute is the shader list filename directly - shaderListFilename = pElement->Attribute("Platform"); - } - - std::string shaderRequestLine(shaderRequest); - tdEntryVec toks; - CSTLHelper::Tokenize(toks, shaderRequestLine, ";"); - for (size_t a = 0, s = toks.size(); a < s; a++) - { - CShaderList::Instance().Add(shaderListFilename.c_str(), toks[a].c_str()); - } - - State(ECSJS_DONE); - - return true; -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.hpp deleted file mode 100644 index f55334a1da..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleJobRequest.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEJOBREQUEST__ -#define __CRYSIMPLEJOBREQUEST__ - -#include "CrySimpleJob.hpp" -#include "CrySimpleSock.hpp" - - -class CCrySimpleJobRequest - : public CCrySimpleJob -{ -public: - CCrySimpleJobRequest(EProtocolVersion Version, uint32_t requestIP); - - virtual bool Execute(const TiXmlElement* pElement); - -private: - EProtocolVersion m_Version; -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.cpp deleted file mode 100644 index 997d2fe9b0..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleMutex.hpp" - -#include -#include -#include - - -CCrySimpleMutex::CCrySimpleMutex() -{ -#if defined(AZ_PLATFORM_WINDOWS) - InitializeCriticalSectionAndSpinCount(&cs, 10000); -#else - pthread_mutex_init(&m_Mutex, nullptr); -#endif -} - -CCrySimpleMutex::~CCrySimpleMutex() -{ -#if defined(AZ_PLATFORM_WINDOWS) - DeleteCriticalSection(&cs); -#else - pthread_mutex_destroy(&m_Mutex); -#endif -} - - -void CCrySimpleMutex::Lock() -{ -#if defined(AZ_PLATFORM_WINDOWS) - EnterCriticalSection(&cs); -#else - pthread_mutex_lock(&m_Mutex); -#endif -} - -void CCrySimpleMutex::Unlock() -{ -#if defined(AZ_PLATFORM_WINDOWS) - LeaveCriticalSection(&cs); -#else - pthread_mutex_unlock(&m_Mutex); -#endif -} - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.hpp deleted file mode 100644 index 09aa08349d..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleMutex.hpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLEMUTEX__ -#define __CRYSIMPLEMUTEX__ - -#include - -#if !defined(AZ_PLATFORM_WINDOWS) -#include "pthread.h" -#endif - -class CCrySimpleMutex -{ -#if defined(AZ_PLATFORM_WINDOWS) - CRITICAL_SECTION cs; -#else - // Use posix thread support - pthread_mutex_t m_Mutex; -#endif -public: - CCrySimpleMutex(); - ~CCrySimpleMutex(); - - void Lock(); - void Unlock(); -}; - -class CCrySimpleMutexAutoLock -{ - CCrySimpleMutex& m_rMutex; -public: - CCrySimpleMutexAutoLock(CCrySimpleMutex& rMutex) - : m_rMutex(rMutex) - { - rMutex.Lock(); - } - ~CCrySimpleMutexAutoLock() - { - m_rMutex.Unlock(); - } -}; -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.cpp deleted file mode 100644 index ede23c97fc..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.cpp +++ /dev/null @@ -1,722 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include -#include -#include - -#include "CrySimpleServer.hpp" -#include "CrySimpleSock.hpp" -#include "CrySimpleJob.hpp" -#include "CrySimpleJobCompile1.hpp" -#include "CrySimpleJobCompile2.hpp" -#include "CrySimpleJobRequest.hpp" -#include "CrySimpleJobGetShaderList.hpp" -#include "CrySimpleCache.hpp" -#include "CrySimpleErrorLog.hpp" -#include "ShaderList.hpp" - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS) -#undef AZ_RESTRICTED_SECTION -#define CRYSIMPLESERVER_CPP_SECTION_1 1 -#define CRYSIMPLESERVER_CPP_SECTION_2 2 -#endif - -#if defined(AZ_PLATFORM_MAC) -#include -#include -#endif - -#include -#include -#include -#include - - -#ifdef WIN32 - #define EXTENSION ".exe" -#else - #define EXTENSION "" -#endif - -AZStd::atomic_long CCrySimpleServer::ms_ExceptionCount = {0}; - -static const bool autoDeleteJobWhenDone = true; -static const int sleepTimeWhenWaiting = 10; - -static AZStd::atomic_long g_ConnectionCount = {0}; - -SEnviropment* SEnviropment::m_instance=nullptr; - -void SEnviropment::Create() -{ - if (!m_instance) - { - m_instance = new SEnviropment; - } -} - -void SEnviropment::Destroy() -{ - if (m_instance) - { - delete m_instance; - m_instance = nullptr; - } -} - -SEnviropment& SEnviropment::Instance() -{ - AZ_Assert(m_instance, "Using SEnviropment::Instance() before calling SEnviropment::Create()"); - return *m_instance; -} - -// Shader Compilers ID -// NOTE: Values must be in sync with CShaderSrv::GetShaderCompilerName() function in the engine side. -const char* SEnviropment::m_Orbis_DXC = "Orbis_DXC"; -const char* SEnviropment::m_Jasper_FXC = "Jasper_FXC"; -const char* SEnviropment::m_D3D11_FXC = "D3D11_FXC"; -const char* SEnviropment::m_GLSL_HLSLcc = "GLSL_HLSLcc"; -const char* SEnviropment::m_METAL_HLSLcc = "METAL_HLSLcc"; -const char* SEnviropment::m_GLSL_LLVM_DXC = "GLSL_LLVM_DXC"; -const char* SEnviropment::m_METAL_LLVM_DXC = "METAL_LLVM_DXC"; - -void SEnviropment::InitializePlatformAttributes() -{ - // Initialize valid Plaforms - // NOTE: Values must be in sync with CShaderSrv::GetPlatformName() function in the engine side. - m_Platforms.insert("Orbis"); - m_Platforms.insert("Nx"); - m_Platforms.insert("PC"); - m_Platforms.insert("Mac"); - m_Platforms.insert("iOS"); - m_Platforms.insert("Android"); - m_Platforms.insert("Linux"); - m_Platforms.insert("Jasper"); - - // Initialize valid Shader Languages - // NOTE: Values must be in sync with GetShaderLanguageName() function in the engine side. - m_ShaderLanguages.insert("Orbis"); - m_ShaderLanguages.insert("D3D11"); - m_ShaderLanguages.insert("METAL"); - m_ShaderLanguages.insert("GL4"); - m_ShaderLanguages.insert("GLES3"); - m_ShaderLanguages.insert("Jasper"); - // These are added for legacy support (GLES3_0 and GLES3_1 are combined into just GLES3) - m_ShaderLanguages.insert("GL4_1"); - m_ShaderLanguages.insert("GL4_4"); - m_ShaderLanguages.insert("GLES3_0"); - m_ShaderLanguages.insert("GLES3_1"); - - // Initialize valid Shader Compilers ID and Executables. - // Intentionally put a space after the executable name so that attackers can't try to change the executable name that we are going to run. -#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS) -#if defined(TOOLS_SUPPORT_JASPER) -#define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_2 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, jasper) -#endif -#if defined(TOOLS_SUPPORT_PROVO) -#define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_2 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, provo) -#endif -#if defined(TOOLS_SUPPORT_SALEM) -#define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_2 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, salem) -#endif -#endif - - m_ShaderCompilersMap[m_D3D11_FXC] = "PCD3D11/v006/fxc.exe "; - m_ShaderCompilersMap[m_GLSL_HLSLcc] = "PCGL/V006/HLSLcc "; - m_ShaderCompilersMap[m_METAL_HLSLcc] = "PCGMETAL/HLSLcc/HLSLcc "; -#if defined(_DEBUG) - m_ShaderCompilersMap[m_GLSL_LLVM_DXC] = "LLVMGL/debug/dxcGL "; - m_ShaderCompilersMap[m_METAL_LLVM_DXC] = "LLVMMETAL/debug/dxcMetal "; -#else - m_ShaderCompilersMap[m_GLSL_LLVM_DXC] = "LLVMGL/release/dxcGL "; - m_ShaderCompilersMap[m_METAL_LLVM_DXC] = "LLVMMETAL/release/dxcMetal "; -#endif -} - -bool SEnviropment::IsPlatformValid( const AZStd::string& platform ) const -{ - return m_Platforms.find(platform) != m_Platforms.end(); -} - -bool SEnviropment::IsShaderLanguageValid( const AZStd::string& shaderLanguage ) const -{ - return m_ShaderLanguages.find(shaderLanguage) != m_ShaderLanguages.end(); -} - -bool SEnviropment::IsShaderCompilerValid( const AZStd::string& shaderCompilerID ) const -{ - bool validCompiler = (m_ShaderCompilersMap.find(shaderCompilerID) != m_ShaderCompilersMap.end()); - - // Extra check for Mac: Only GL_LLVM_DXC and METAL_LLVM_DXC compilers are supported. - #if defined(AZ_PLATFORM_MAC) - if (validCompiler && - shaderCompilerID != m_GLSL_LLVM_DXC && - shaderCompilerID != m_METAL_LLVM_DXC) - { - printf("error: trying to use an unsupported compiler on Mac.\n"); - return false; - } - #endif - - return validCompiler; -} - -bool SEnviropment::GetShaderCompilerExecutable( const AZStd::string& shaderCompilerID, AZStd::string& shaderCompilerExecutable ) const -{ - auto it = m_ShaderCompilersMap.find(shaderCompilerID); - if (it != m_ShaderCompilersMap.end()) - { - shaderCompilerExecutable = it->second; - return true; - } - else - { - return false; - } -} - -class CThreadData -{ - uint32_t m_Counter; - CCrySimpleSock* m_pSock; -public: - CThreadData(uint32_t Counter, CCrySimpleSock* pSock) - : m_Counter(Counter) - , m_pSock(pSock){} - - ~CThreadData(){delete m_pSock; } - - CCrySimpleSock* Socket(){return m_pSock; } - uint32_t ID() const{return m_Counter; } -}; - -////////////////////////////////////////////////////////////////////////// - -bool CopyFileOnPlatform(const char* nameOfFileToCopy, const char* copiedFileName, bool failIfFileExists) -{ - if (AZ::IO::SystemFile::Exists(copiedFileName) && failIfFileExists) - { - AZ_Warning("CrySimpleServer", false, ("File to copy to, %s, already exists."), copiedFileName); - return false; - } - - AZ::IO::SystemFile fileToCopy; - if (!fileToCopy.Open(nameOfFileToCopy, AZ::IO::SystemFile::SF_OPEN_READ_ONLY)) - { - AZ_Warning("CrySimpleServer", false, ("Unable to open file: %s for copying."), nameOfFileToCopy); - return false; - } - - AZ::IO::SystemFile::SizeType fileLength = fileToCopy.Length(); - - AZ::IO::SystemFile newFile; - if (!newFile.Open(copiedFileName, AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY | AZ::IO::SystemFile::SF_OPEN_CREATE)) - { - AZ_Warning("CrySimpleServer", false, ("Unable to open new file: %s for copying."), copiedFileName); - return false; - } - - char* fileContents = new char[fileLength]; - fileToCopy.Read(fileLength, fileContents); - newFile.Write(fileContents, fileLength); - delete[] fileContents; - - return true; -} - -void MakeErrorVec(const std::string& errorText, tdDataVector& Vec) -{ - Vec.resize(errorText.size() + 1); - for (size_t i = 0; i < errorText.size(); i++) - { - Vec[i] = errorText[i]; - } - Vec[errorText.size()] = 0; - - // Compress output data - tdDataVector rDataRaw; - rDataRaw.swap(Vec); - if (!CSTLHelper::Compress(rDataRaw, Vec)) - { - Vec.resize(0); - } -} - -////////////////////////////////////////////////////////////////////////// -class CompileJob - : public AZ::Job -{ -public: - CompileJob() - : Job(autoDeleteJobWhenDone, nullptr) { } - void SetThreadData(CThreadData* threadData) { m_pThreadData.reset(threadData); } -protected: - void Process() override; - bool ValidatePlatformAttributes(EProtocolVersion Version, const TiXmlElement* pElement); -private: - std::unique_ptr m_pThreadData; -}; - -void CompileJob::Process() -{ - std::vector Vec; - std::unique_ptr Job; - EProtocolVersion Version = EPV_V001; - ECrySimpleJobState State = ECSJS_JOBNOTFOUND; - try - { - if (m_pThreadData->Socket()->Recv(Vec)) - { - std::string Request(reinterpret_cast(&Vec[0]), Vec.size()); - TiXmlDocument ReqParsed("Request.xml"); - ReqParsed.Parse(Request.c_str()); - - if (ReqParsed.Error()) - { - CrySimple_ERROR("failed to parse request XML"); - return; - } - const TiXmlElement* pElement = ReqParsed.FirstChildElement(); - if (!pElement) - { - CrySimple_ERROR("failed to extract First Element of the request"); - return; - } - - const char* pPing = pElement->Attribute("Identify"); - if (pPing) - { - const std::string& rData("ShaderCompilerServer"); - m_pThreadData->Socket()->Send(rData); - return; - } - - const char* pVersion = pElement->Attribute("Version"); - const char* pHardwareTarget = nullptr; - - //new request type? - if (pVersion) - { - if (std::string(pVersion) == "2.3") - { - Version = EPV_V0023; - } - else if (std::string(pVersion) == "2.2") - { - Version = EPV_V0022; - } - else if (std::string(pVersion) == "2.1") - { - Version = EPV_V0021; - } - else if (std::string(pVersion) == "2.0") - { - Version = EPV_V002; - } - } - - - // If the job type is 'GetShaderList', then we dont need to perform a validation on the platform - // attributes, since the command doesnt use them, and the incoming request will not have 'compiler' or 'language' - // attributes. - const char* pJobType = pElement->Attribute("JobType"); - if ((!pJobType) || (azstricmp(pJobType,"GetShaderList")!=0)) - { - if (!ValidatePlatformAttributes(Version, pElement)) - { - return; - } - } - - if (Version >= EPV_V002) - { - const std::string JobType(pJobType); - - if (Version >= EPV_V0023) - { - pHardwareTarget = pElement->Attribute("HardwareTarget"); - } - - if (Version >= EPV_V0021) - { - m_pThreadData->Socket()->WaitForShutDownEvent(true); - } - -#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS) - #if defined(TOOLS_SUPPORT_JASPER) - #define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, jasper) - #endif - #if defined(TOOLS_SUPPORT_PROVO) - #define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, provo) - #endif - #if defined(TOOLS_SUPPORT_SALEM) - #define AZ_RESTRICTED_SECTION CRYSIMPLESERVER_CPP_SECTION_1 -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySimpleServer_cpp, salem) - #endif -#endif - - if (pJobType) - { - if (JobType == "RequestLine") - { - Job = std::make_unique(Version, m_pThreadData->Socket()->PeerIP()); - Job->Execute(pElement); - State = Job->State(); - Vec.resize(0); - } - else - if (JobType == "Compile") - { - Job = std::make_unique(Version, m_pThreadData->Socket()->PeerIP(), &Vec); - Job->Execute(pElement); - State = Job->State(); - } - else - if (JobType == "GetShaderList") - { - Job = std::make_unique(m_pThreadData->Socket()->PeerIP(), &Vec); - Job->Execute(pElement); - State = Job->State(); - } - else - { - printf("\nRequested unkown job %s\n", pJobType); - } - } - else - { - printf("\nVersion 2.0 or higher but has no JobType tag\n"); - } - } - else - { - //legacy request - Version = EPV_V001; - Job = std::make_unique(m_pThreadData->Socket()->PeerIP(), &Vec); - Job->Execute(pElement); - } - m_pThreadData->Socket()->Send(Vec, State, Version); - - if (Version >= EPV_V0021) - { - /* - // wait until message has been succesfully delived before shutting down the connection - if(!m_pThreadData->Socket()->RecvResult()) - { - printf("\nInvalid result from client\n"); - } - */ - } - } - } - catch (const ICryError* err) - { - CCrySimpleServer::IncrementExceptionCount(); - - CRYSIMPLE_LOG(" " + err->GetErrorName()); - - std::string returnStr = err->GetErrorDetails(ICryError::OUTPUT_TTY); - - // Send error back - MakeErrorVec(returnStr, Vec); - - if (Job.get()) - { - State = Job->State(); - - if (State == ECSJS_ERROR_COMPILE && SEnviropment::Instance().m_PrintErrors) - { - printf("\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); - printf("%s\n", err->GetErrorName().c_str()); - printf("%s\n", returnStr.c_str()); - printf("\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\n"); - } - } - - bool added = CCrySimpleErrorLog::Instance().Add((ICryError*)err); - - // error log hasn't taken ownership, delete this error. - if (!added) - { - delete err; - } - - m_pThreadData->Socket()->Send(Vec, State, Version); - } - --g_ConnectionCount; -} - - -bool CompileJob::ValidatePlatformAttributes(EProtocolVersion Version, const TiXmlElement* pElement) -{ - if (Version >= EPV_V0023) - { - const char* platform = pElement->Attribute("Platform"); // eg. PC, Mac... - const char* compiler = pElement->Attribute("Compiler"); // key to shader compiler executable - const char* language = pElement->Attribute("Language"); // eg. D3D11, GL4_1, GL3_1, METAL... - - if (!platform || !SEnviropment::Instance().IsPlatformValid(platform)) - { - CrySimple_ERROR("invalid Platform attribute from request."); - return false; - } - if (!compiler || !SEnviropment::Instance().IsShaderCompilerValid(compiler)) - { - CrySimple_ERROR("invalid Compiler attribute from request."); - return false; - } - if (!language || !SEnviropment::Instance().IsShaderLanguageValid(language)) - { - CrySimple_ERROR("invalid Language attribute from request."); - return false; - } - } - else - { - // In older versions the attribute Platform was used differently depending on the JobType - // - JobType Compile: Platform is the shader language - // - JobType RequestLine: Platform is the shader list filename - const char* platformLegacy = pElement->Attribute("Platform"); - - // The only check we can do here is if the attribute exists. Each JobType will check it has a valid value. - if (!platformLegacy) - { - CrySimple_ERROR("failed to extract required platform attribute from request."); - return false; - } - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -void TickThread() -{ - AZ::u64 t0 = AZStd::GetTimeUTCMilliSecond(); - - while (true) - { - CrySimple_SECURE_START - - AZ::u64 t1 = AZStd::GetTimeUTCMilliSecond(); - if ((t1 < t0) || (t1 - t0 > 100)) - { - t0 = t1; - const int maxStringSize = 512; - char str[maxStringSize] = { 0 }; - azsnprintf(str, maxStringSize, "Amazon Shader Compiler Server (%ld compile tasks | %ld open sockets | %ld exceptions)", - CCrySimpleJobCompile::GlobalCompileTasks(), CCrySimpleSock::GetOpenSockets() + CSMTPMailer::GetOpenSockets(), - CCrySimpleServer::GetExceptionCount()); -#if defined(AZ_PLATFORM_WINDOWS) - SetConsoleTitle(str); -#endif - } - - const AZ::u64 T1 = AZStd::GetTimeUTCMilliSecond(); - CCrySimpleErrorLog::Instance().Tick(); - CShaderList::Instance().Tick(); - CCrySimpleCache::Instance().ThreadFunc_SavePendingCacheEntries(); - const AZ::u64 T2 = AZStd::GetTimeUTCMilliSecond(); - if (T2 - T1 < 100) - { - Sleep(static_cast(100 - T2 + T1)); - } - - CrySimple_SECURE_END - } -} - -////////////////////////////////////////////////////////////////////////// -void LoadCache() -{ - AZ::IO::Path cacheDatFile{ SEnviropment::Instance().m_CachePath }; - AZ::IO::Path cacheBakFile = cacheDatFile; - cacheDatFile /= "Cache.dat"; - cacheBakFile /= "Cache.bak"; - if (CCrySimpleCache::Instance().LoadCacheFile(cacheDatFile.c_str())) - { - AZ::IO::Path cacheBakFile2 = cacheBakFile; - cacheBakFile2.ReplaceFilename("Cache.bak2"); - - printf("Creating cache backup...\n"); - AZ::IO::SystemFile::Delete(cacheBakFile2.c_str()); - printf("Move %s to %s\n", cacheBakFile.c_str(), cacheBakFile2.c_str()); - AZ::IO::SystemFile::Rename(cacheBakFile.c_str(), cacheBakFile2.c_str()); - printf("Copy %s to %s\n", cacheDatFile.c_str(), cacheBakFile.c_str()); - CopyFileOnPlatform(cacheDatFile.c_str(), cacheBakFile.c_str(), false); - printf("Cache backup done.\n"); - } - else - { - // Restoring backup cache! - if (AZ::IO::SystemFile::Exists(cacheDatFile.c_str())) - { - printf("Cache file corrupted!!!\n"); - AZ::IO::SystemFile::Delete(cacheDatFile.c_str()); - } - - printf("Restoring backup cache...\n"); - printf("Copy %s to %s\n", cacheBakFile.c_str(), cacheDatFile.c_str()); - CopyFileOnPlatform(cacheBakFile.c_str(), cacheDatFile.c_str(), false); - if (!CCrySimpleCache::Instance().LoadCacheFile(cacheDatFile.c_str())) - { - // Backup file corrupted too! - if (AZ::IO::SystemFile::Exists(cacheDatFile.c_str())) - { - printf("Backup file corrupted too!!!\n"); - AZ::IO::SystemFile::Delete(cacheDatFile.c_str()); - } - printf("Deleting cache completely\n"); - AZ::IO::SystemFile::Delete(cacheDatFile.c_str()); - } - } - - CCrySimpleCache::Instance().Finalize(); - printf("Ready\n"); -} - - -////////////////////////////////////////////////////////////////////////// -CCrySimpleServer::CCrySimpleServer([[maybe_unused]] const char* pShaderModel, [[maybe_unused]] const char* pDst, [[maybe_unused]] const char* pSrc, [[maybe_unused]] const char* pEntryFunction) - : m_pServerSocket(nullptr) -{ - Init(); -} - -CCrySimpleServer::CCrySimpleServer() - : m_pServerSocket(nullptr) -{ - CrySimple_SECURE_START - - uint32_t Port = SEnviropment::Instance().m_port; - - m_pServerSocket = new CCrySimpleSock(Port, SEnviropment::Instance().m_WhitelistAddresses); - Init(); - m_pServerSocket->Listen(); - - AZ::Job* tickThreadJob = AZ::CreateJobFunction(&TickThread, autoDeleteJobWhenDone); - tickThreadJob->Start(); - - uint32_t JobCounter = 0; - while (1) - { - // New client message, receive new client socket connection. - CCrySimpleSock* newClientSocket = m_pServerSocket->Accept(); - if(!newClientSocket) - { - continue; - } - - // Thread Data for new job - CThreadData* pData = new CThreadData(JobCounter++, newClientSocket); - - // Increase connection count and start new job. - // NOTE: CompileJob will be auto deleted when done, deleting thread data and client socket as well. - ++g_ConnectionCount; - CompileJob* compileJob = new CompileJob(); - compileJob->SetThreadData(pData); - compileJob->Start(); - - bool printedMessage = false; - while (g_ConnectionCount >= SEnviropment::Instance().m_MaxConnections) - { - if (!printedMessage) - { - logmessage("Waiting for a request to finish before accepting another connection...\n"); - printedMessage = true; - } - - AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(sleepTimeWhenWaiting)); - }; - } - CrySimple_SECURE_END -} - -bool IsPathValid(const AZStd::string& path) -{ - return AZ::IO::PathView(path).IsRelativeTo(AZ::IO::PathView(SEnviropment::Instance().m_Root)); -} - -bool IsPathValid(const std::string& path) -{ - const AZStd::string tempString = path.c_str(); - return IsPathValid(tempString); -} - -void CCrySimpleServer::Init() -{ - SEnviropment::Instance().m_Root = AZ::Utils::GetExecutableDirectory(); - SEnviropment::Instance().m_CompilerPath = SEnviropment::Instance().m_Root / "Compiler"; - SEnviropment::Instance().m_CachePath = SEnviropment::Instance().m_Root / "Cache"; - - if (SEnviropment::Instance().m_TempPath.empty()) - { - SEnviropment::Instance().m_TempPath = SEnviropment::Instance().m_Root / "Temp"; - } - if (SEnviropment::Instance().m_ErrorPath.empty()) - { - SEnviropment::Instance().m_ErrorPath = SEnviropment::Instance().m_Root / "Error"; - } - if (SEnviropment::Instance().m_ShaderPath.empty()) - { - SEnviropment::Instance().m_ShaderPath = SEnviropment::Instance().m_Root / "Shaders"; - } - - SEnviropment::Instance().m_Root = SEnviropment::Instance().m_Root.LexicallyNormal(); - SEnviropment::Instance().m_CompilerPath = SEnviropment::Instance().m_CompilerPath.LexicallyNormal(); - SEnviropment::Instance().m_CachePath = SEnviropment::Instance().m_CachePath.LexicallyNormal(); - SEnviropment::Instance().m_ErrorPath = SEnviropment::Instance().m_ErrorPath.LexicallyNormal(); - SEnviropment::Instance().m_TempPath = SEnviropment::Instance().m_TempPath.LexicallyNormal(); - SEnviropment::Instance().m_ShaderPath = SEnviropment::Instance().m_ShaderPath.LexicallyNormal(); - - if (SEnviropment::Instance().m_Caching) - { - AZ::Job* loadCacheJob = AZ::CreateJobFunction(&LoadCache, autoDeleteJobWhenDone); - loadCacheJob->Start(); - } - else - { - printf("\nNO CACHING, disabled by config\n"); - } -} - -void CCrySimpleServer::IncrementExceptionCount() -{ - ++ms_ExceptionCount; -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.hpp deleted file mode 100644 index a7dcdb42ee..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleServer.hpp +++ /dev/null @@ -1,119 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLESERVER__ -#define __CRYSIMPLESERVER__ - -#include -#include -#include -#include -#include -#include -#include -#include - -extern bool g_Success; - - -bool IsPathValid(const AZStd::string& path); -bool IsPathValid(const std::string& path); - -namespace AZ { - class JobManager; -} - -class CCrySimpleSock; - -class SEnviropment -{ -public: - AZ::IO::Path m_Root; - AZ::IO::Path m_CompilerPath; - AZ::IO::Path m_CachePath; - AZ::IO::Path m_TempPath; - AZ::IO::Path m_ErrorPath; - AZ::IO::Path m_ShaderPath; - - std::string m_FailEMail; - std::string m_MailServer; - uint32_t m_port; - uint32_t m_MailInterval; // seconds since last error to flush error mails - - bool m_Caching; - bool m_PrintErrors = 1; - bool m_PrintWarnings; - bool m_PrintCommands; - bool m_PrintListUpdates; - bool m_DedupeErrors; - bool m_DumpShaders = false; - bool m_RunAsRoot = false; - std::string m_FallbackServer; - int32_t m_FallbackTreshold; - int32_t m_MaxConnections; - std::vector m_WhitelistAddresses; - - // Shader Compilers ID - static const char* m_Orbis_DXC; - static const char* m_Jasper_FXC; - static const char* m_D3D11_FXC; - static const char* m_GLSL_HLSLcc; - static const char* m_METAL_HLSLcc; - static const char* m_GLSL_LLVM_DXC; - static const char* m_METAL_LLVM_DXC; - - int m_hardwareTarget = -1; - - static void Create(); - static void Destroy(); - static SEnviropment& Instance(); - - void InitializePlatformAttributes(); - - bool IsPlatformValid( const AZStd::string& platform ) const; - bool IsShaderLanguageValid( const AZStd::string& shaderLanguage ) const; - bool IsShaderCompilerValid( const AZStd::string& shaderCompilerID ) const; - - bool GetShaderCompilerExecutable( const AZStd::string& shaderCompilerID, AZStd::string& shaderCompilerExecutable ) const; - -private: - SEnviropment() = default; - - // The single instance of the environment - static SEnviropment* m_instance; - - // Platforms - AZStd::unordered_set m_Platforms; - - // Shader Languages - AZStd::unordered_set m_ShaderLanguages; - - // Shader Compilers ID to Executable map - AZStd::unordered_map m_ShaderCompilersMap; -}; - -class CCrySimpleServer -{ - static AZStd::atomic_long ms_ExceptionCount; - CCrySimpleSock* m_pServerSocket; - void Init(); -public: - CCrySimpleServer(const char* pShaderModel, const char* pDst, const char* pSrc, const char* pEntryFunction); - CCrySimpleServer(); - - - static long GetExceptionCount() { return ms_ExceptionCount; } - static void IncrementExceptionCount(); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.cpp deleted file mode 100644 index e0cbd8d733..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.cpp +++ /dev/null @@ -1,760 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CrySimpleSock.hpp" - -#include -#include -#include -#include - -#include -#include -#include - -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) -#include -#include -#include -#include -#include -#else -#include -typedef int socklen_t; -#endif - -namespace -{ - enum ECrySimpleS_TYPE - { - ECrySimpleST_ROOT, - ECrySimpleST_SERVER, - ECrySimpleST_CLIENT, - ECrySimpleST_INVALID, - }; - - static AZStd::atomic_long numberOfOpenSockets = {0}; - const int MAX_DATA_SIZE = 1024 * 1024; // Only allow 1 MB of data to come through. Open 3D Engine has the same size constraint - const size_t BLOCKSIZE = 4 * 1024; - const size_t MAX_ERROR_MESSAGE_SIZE = 1024; - const size_t MAX_HOSTNAME_BUFFER_SIZE = 1024; - - struct Ip4WhitelistAddress - { - Ip4WhitelistAddress() : m_address(0), m_mask(-1) { } - // IP Address in network order to whitelist - uint32_t m_address; - // Mask in network order to apply to connecting IP addresses - uint32_t m_mask; - }; -} - -struct CCrySimpleSock::Implementation -{ - - Implementation(ECrySimpleS_TYPE type) - : m_Type(type) { } - - void SetWhitelist(const std::vector& whiteList) - { - // Add in our local address so that we always allow connections from the local machine - char hostNameBuffer[MAX_HOSTNAME_BUFFER_SIZE] = { 0 }; - gethostname(hostNameBuffer, MAX_HOSTNAME_BUFFER_SIZE); - struct addrinfo* addressInfos{}; - struct addrinfo hints{}; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - int addressInfoResultCode = getaddrinfo(hostNameBuffer, nullptr, &hints, &addressInfos); - - if (addressInfoResultCode == 0) - { - int i = 0; - for (auto addressInfoIter = addressInfos; addressInfoIter != nullptr; addressInfoIter = addressInfoIter->ai_next) - { - Ip4WhitelistAddress whitelistAddress; - whitelistAddress.m_address = static_cast(reinterpret_cast(addressInfoIter->ai_addr)->sin_addr.s_addr); - m_ipWhiteList.push_back(whitelistAddress); - ++i; - } - } - else - { - printf("Network error trying to get host computer local address. The host computer's local IP addresses will not be automatically whitelisted."); - } - - for (const auto& address : whiteList) - { - Ip4WhitelistAddress whitelistAddress; - AZStd::string::size_type maskLocation = address.rfind("/"); - if (maskLocation != AZStd::string::npos) - { - //x.x.x.x/0 is all addresses - // For CIDR that specify the network mask, mask out the address that is - // supplied here once instead of everytime we check the address during - // accept calls. - int mask = atoi(address.substr(maskLocation+1).c_str()); - if (mask == 0) - { - whitelistAddress.m_mask = 0; - whitelistAddress.m_address = 0; - - static bool warnOnce = true; - if (warnOnce) - { - warnOnce = false; - printf("\nWARNING: Attempting to run the CrySCompileServer authorizing every IP. This is a security risk and not recommended.\nPlease use a more restrictive whitelist in the config.ini file by not using netmask 0.\n\n"); - } - } - else - { - whitelistAddress.m_mask ^= (1 << (32 - mask)) - 1; - whitelistAddress.m_mask = htonl(whitelistAddress.m_mask); - struct in_addr ipv4Address{}; - if (inet_pton(AF_INET, address.substr(0, maskLocation).c_str(), &ipv4Address) == 1) - { - whitelistAddress.m_address = static_cast(ipv4Address.s_addr); - } - } - } - else - { - struct in_addr ipv4Address{}; - if (inet_pton(AF_INET, address.c_str(), &ipv4Address) == 1) - { - whitelistAddress.m_address = static_cast(ipv4Address.s_addr); - } - } - - m_ipWhiteList.push_back(whitelistAddress); - } - } - - CCrySimpleSock* m_pInstance; - - const ECrySimpleS_TYPE m_Type; - SOCKET m_Socket; - uint16_t m_Port; -#ifdef USE_WSAEVENTS - WSAEVENT m_Event; -#endif - bool m_WaitForShutdownEvent; - bool m_SwapEndian; - - bool m_bHasReceivedData; - bool m_bHasSendData; - - tdDataVector m_tempSendBuffer; - - std::vector m_ipWhiteList; -}; - -#if defined(AZ_PLATFORM_WINDOWS) -typedef BOOL (WINAPI * LPFN_DISCONNECTEX)(SOCKET, LPOVERLAPPED, DWORD, DWORD); -#define WSAID_DISCONNECTEX {0x7fda2e11, 0x8630, 0x436f, {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57} \ -} -#endif - -#ifdef USE_WSAEVENTS -CCrySimpleSock::CCrySimpleSock(SOCKET Sock, CCrySimpleSock* pInstance, WSAEVENT wsaEvent) -#else -CCrySimpleSock::CCrySimpleSock(SOCKET Sock, CCrySimpleSock * pInstance) -#endif - : m_pImpl(new Implementation(ECrySimpleST_SERVER)) -{ - #ifdef USE_WSAEVENTS - m_pImpl->m_Event = wsaEvent; - #endif - - m_pImpl->m_pInstance = pInstance; - m_pImpl->m_Socket = Sock; - m_pImpl->m_WaitForShutdownEvent = false; - m_pImpl->m_bHasReceivedData = false; - m_pImpl->m_bHasSendData = false; - m_pImpl->m_Port = ~0; - - ++numberOfOpenSockets; - - InitClient(); -} - - -CCrySimpleSock::CCrySimpleSock(const std::string& rServerName, uint16_t Port) - : m_pImpl(new Implementation(ECrySimpleST_CLIENT)) -{ - m_pImpl->m_pInstance = nullptr; - m_pImpl->m_Socket = INVALID_SOCKET; - m_pImpl->m_WaitForShutdownEvent = false; - m_pImpl->m_bHasReceivedData = false; - m_pImpl->m_bHasSendData = false; - m_pImpl->m_Port = Port; - - struct sockaddr_in addr; - memset(&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = htons(Port); - const char* pHostName = rServerName.c_str(); - bool IP = true; - for (size_t a = 0, size = strlen(pHostName); a < size; a++) - { - IP &= (pHostName[a] >= '0' && pHostName[a] <= '9') || pHostName[a] == '.'; - } - if (IP) - { - struct in_addr ipv4Address{}; - if (inet_pton(AF_INET, pHostName, &ipv4Address) == 1) - { - addr.sin_addr = ipv4Address; - } - } - else - { - struct addrinfo* addressInfo{}; - struct addrinfo hints{}; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - int addressInfoResultCode = getaddrinfo(pHostName, nullptr, &hints, &addressInfo); - if (addressInfoResultCode != 9) - { - return; - } - addr = *reinterpret_cast(addressInfo->ai_addr); - } - - m_pImpl->m_Socket = socket(AF_INET, SOCK_STREAM, 0); - - ++numberOfOpenSockets; - - int Err = connect(m_pImpl->m_Socket, (struct sockaddr*)&addr, sizeof addr); - if (Err < 0) - { - m_pImpl->m_Socket = INVALID_SOCKET; - } -} - -CCrySimpleSock::~CCrySimpleSock() -{ - Release(); -} - -CCrySimpleSock::CCrySimpleSock(uint16_t Port, const std::vector& ipWhiteList) - : m_pImpl(new Implementation(ECrySimpleST_ROOT)) -{ - m_pImpl->m_pInstance = nullptr; - m_pImpl->m_WaitForShutdownEvent = false; - m_pImpl->m_bHasReceivedData = false; - m_pImpl->m_bHasSendData = false; - m_pImpl->m_Port = Port; - -#ifdef _MSC_VER - WSADATA Data; - m_pImpl->m_Socket = INVALID_SOCKET; - if (WSAStartup(MAKEWORD(2, 0), &Data)) - { - CrySimple_ERROR("Could not init root socket"); - return; - } -#endif - m_pImpl->SetWhitelist(ipWhiteList); - - m_pImpl->m_Socket = socket(AF_INET, SOCK_STREAM, 0); - if (INVALID_SOCKET == m_pImpl->m_Socket) - { - CrySimple_ERROR("Could not initialize basic server due to invalid socket"); - return; - } - -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) - int arg = 1; - setsockopt(m_pImpl->m_Socket, SOL_SOCKET, SO_KEEPALIVE, &arg, sizeof arg); - arg = 1; - setsockopt(m_pImpl->m_Socket, SOL_SOCKET, SO_REUSEADDR, &arg, sizeof arg); -#endif - - sockaddr_in SockAddr; - memset(&SockAddr, 0, sizeof(sockaddr_in)); - SockAddr.sin_family = PF_INET; - SockAddr.sin_port = htons(Port); - if (bind(m_pImpl->m_Socket, (sockaddr*)&SockAddr, sizeof(sockaddr_in)) == SOCKET_ERROR) - { -#if defined(AZ_PLATFORM_WINDOWS) - AZ_Warning(0, false, "bind failed with error = %d", WSAGetLastError()); -#else - shutdown(m_pImpl->m_Socket, SHUT_RDWR); -#endif - closesocket(m_pImpl->m_Socket); - CrySimple_ERROR("Could not bind server socket. This can happen if there is another process running already that is using this port or antivirus software/firewall is blocking the port.\n"); - return; - } - - ++numberOfOpenSockets; -} - -void CCrySimpleSock::Listen() -{ - listen(m_pImpl->m_Socket, SOMAXCONN); -} - -void CCrySimpleSock::InitClient() -{ -} - -void CCrySimpleSock::Release() -{ - if (m_pImpl->m_Socket != INVALID_SOCKET) - { - // check if we have received and sended data but ignore that for the HTTP server - if ((!m_pImpl->m_bHasSendData || !m_pImpl->m_bHasReceivedData) && (!m_pImpl->m_pInstance || m_pImpl->m_pInstance->m_pImpl->m_Port != 80)) - { - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "ERROR : closing socket without both receiving and sending data: receive: %d send: %d", - m_pImpl->m_bHasReceivedData, m_pImpl->m_bHasSendData); - CRYSIMPLE_LOG(acTmp); - } - -#ifdef USE_WSAEVENTS - if (m_pImpl->m_WaitForShutdownEvent) - { - // wait until client has shutdown its socket - DWORD nReturnCode = WSAWaitForMultipleEvents(1, &m_pImpl->m_Event, - FALSE, INFINITE, FALSE); - if ((nReturnCode != WSA_WAIT_FAILED) && (nReturnCode != WSA_WAIT_TIMEOUT)) - { - WSANETWORKEVENTS NetworkEvents; - WSAEnumNetworkEvents(m_pImpl->m_Socket, m_pImpl->m_Event, &NetworkEvents); - if (NetworkEvents.lNetworkEvents & FD_CLOSE) - { - int iErrorCode = NetworkEvents.iErrorCode[FD_CLOSE_BIT]; - if (iErrorCode != 0) - { - // error shutting down - } - } - } - } - - // shutdown the server side of the connection since no more data will be sent - shutdown(m_pImpl->m_Socket, SHUT_RDWR); - closesocket(m_pImpl->m_Socket); -#endif - -#if defined(AZ_PLATFORM_WINDOWS) - LPFN_DISCONNECTEX pDisconnectEx = NULL; - DWORD Bytes; - GUID guidDisconnectEx = WSAID_DISCONNECTEX; - WSAIoctl(m_pImpl->m_Socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guidDisconnectEx, - sizeof(GUID), &pDisconnectEx, sizeof(pDisconnectEx), &Bytes, NULL, NULL); - pDisconnectEx(m_pImpl->m_Socket, NULL, 0, 0); // retrieve this function pointer with WSAIoctl(WSAID_DISCONNECTEX). -#else - shutdown(m_pImpl->m_Socket, SHUT_RDWR); -#endif - closesocket(m_pImpl->m_Socket); - m_pImpl->m_Socket = INVALID_SOCKET; - --numberOfOpenSockets; - } - -#if defined(AZ_PLATFORM_WINDOWS) - switch (m_pImpl->m_Type) - { - case ECrySimpleST_ROOT: - WSACleanup(); - break; - case ECrySimpleST_SERVER: // Intentionally fall through - case ECrySimpleST_CLIENT: - break; - default: - CrySimple_ERROR("unknown SocketType Released"); - } -#endif -} - -CCrySimpleSock* CCrySimpleSock::Accept() -{ - if (m_pImpl->m_Type != ECrySimpleST_ROOT) - { - CrySimple_ERROR("called Accept on non root socket"); - return nullptr; - } - - while (true) - { - sockaddr_in connectingAddress; - int addressSize = sizeof(connectingAddress); - SOCKET Sock = accept(m_pImpl->m_Socket, reinterpret_cast(&connectingAddress), reinterpret_cast(&addressSize)); - if (Sock == INVALID_SOCKET) - { -#if defined(AZ_PLATFORM_MAC) - switch (errno) - { - case EINTR: - // OS X tends to get interupt calls on every other accept call - // so just ignore this particular error and try the accept call - // again. - continue; - default: - // Do nothing - all other errors are "real" and we should exit - break; - } -#endif - AZ_Warning(0, false, "Errno = %d", WSAGetLastError()); - CrySimple_ERROR("Accept recived invalid socket"); - return nullptr; - } - - bool allowConnection = false; - - for (const auto& ip4WhitelistAddress : m_pImpl->m_ipWhiteList) - { - if ((connectingAddress.sin_addr.s_addr & ip4WhitelistAddress.m_mask) == (ip4WhitelistAddress.m_address)) - { - allowConnection = true; - break; - } - } - - if (!allowConnection) - { - constexpr size_t ipAddressBufferSize = 17; - char ipAddressBuffer[ipAddressBufferSize]{}; - inet_ntop(AF_INET, &connectingAddress.sin_addr, ipAddressBuffer, ipAddressBufferSize); - printf("Warning: unauthorized IP %s trying to connect. If this IP is authorized please add it to the whitelist in the config.ini file\n", ipAddressBuffer); - closesocket(Sock); - continue; - } - - int arg = 1; - setsockopt(Sock, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, sizeof arg); - - /* - // keep socket open for another 2 seconds until data has been fully send - LINGER linger; - int len = sizeof(LINGER); - linger.l_onoff = 1; - linger.l_linger = 2; - setsockopt(Sock, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof linger); - */ - -#ifdef USE_WSAEVENTS - WSAEVENT wsaEvent = WSACreateEvent(); - if (wsaEvent == WSA_INVALID_EVENT) - { - closesocket(Sock); - int Error = WSAGetLastError(); - CrySimple_ERROR("Couldn't create wsa event"); - return nullptr; - } - - int Status = WSAEventSelect(Sock, wsaEvent, FD_CLOSE); - if (Status == SOCKET_ERROR) - { - closesocket(Sock); - int Error = WSAGetLastError(); - CrySimple_ERROR("Couldn't create wsa event"); - return nullptr; - } - - return new CCrySimpleSock(Sock, this, wsaEvent); -#else - return new CCrySimpleSock(Sock, this); -#endif - } - - return nullptr; -} - -union CrySimpleRecvSize -{ - uint8_t m_Data8[8]; - uint64_t m_Data64; -}; - -static const int MAX_TIME_TO_WAIT = 10000; - -int CCrySimpleSock::Recv(char* acData, int len, int flags) -{ - int recived = SOCKET_ERROR; - int waitingtime = 0; - while (recived < 0) - { - recived = recv(m_pImpl->m_Socket, acData, len, flags); - if (recived == SOCKET_ERROR) - { - int WSAError = WSAGetLastError(); -#if defined(AZ_PLATFORM_WINDOWS) - if (WSAError == WSAEWOULDBLOCK) - { - // are we out of time - if (waitingtime > MAX_TIME_TO_WAIT) - { - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving size of data - Timeout on blocking. (Error Code: %i)", WSAError); - CrySimple_ERROR(acTmp); - - return recived; - } - - waitingtime += 5; - - // sleep a bit and try again - Sleep(5); - } - else -#endif - { - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving size of data - Network error. (Error Code: %i)", WSAError); - CrySimple_ERROR(acTmp); - - return recived; - } - } - } - - return recived; -} - -bool CCrySimpleSock::Recv(std::vector& rVec) -{ - CrySimpleRecvSize size; - - int received = Recv(reinterpret_cast(&size.m_Data8[0]), 8, 0); - if (received != 8) - { -#if defined(AZ_PLATFORM_WINDOWS) - int WSAError = WSAGetLastError(); -#else - int WSAError = errno; -#endif - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving size of data - Invalid size (Error Code: %i)", WSAError); - CrySimple_ERROR(acTmp); - return false; - } - - if (size.m_Data64 == 0) - { - int WSAError = WSAGetLastError(); - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving size of data - Size of zero (Error Code: %i)", WSAError); - CrySimple_ERROR(acTmp); - - return false; - } - - if (size.m_Data64 > MAX_DATA_SIZE) - { - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving size of data - Size is greater than max support data size."); - CrySimple_ERROR(acTmp); - - return false; - } - - m_pImpl->m_SwapEndian = (size.m_Data64 >> 32) != 0; - if (m_pImpl->m_SwapEndian) - { - CSTLHelper::EndianSwizzleU64(size.m_Data64); - } - - rVec.clear(); - rVec.resize(static_cast(size.m_Data64)); - - for (uint32_t a = 0; a < size.m_Data64; ) - { - int read = Recv(reinterpret_cast(&rVec[a]), static_cast(size.m_Data64) - a, 0); - if (read <= 0) - { - int WSAError = WSAGetLastError(); - char acTmp[MAX_ERROR_MESSAGE_SIZE]; - azsprintf(acTmp, "Error while receiving tcp-data (size: %d - Error Code: %i)", static_cast(size.m_Data64), WSAError); - CrySimple_ERROR(acTmp); - return false; - } - a += read; - } - - m_pImpl->m_bHasReceivedData = true; - - return true; -} - -bool CCrySimpleSock::RecvResult() -{ - CrySimpleRecvSize size; - if (recv(m_pImpl->m_Socket, reinterpret_cast(&size.m_Data8[0]), 8, 0) != 8) - { - CrySimple_ERROR("Error while receiving result"); - return false; - } - - return size.m_Data64 > 0; -} - - -void CCrySimpleSock::Forward(const std::vector& rVecIn) -{ - tdDataVector& rVec = m_pImpl->m_tempSendBuffer; - rVec.resize(rVecIn.size() + 8); - CrySimpleRecvSize& rHeader = *(CrySimpleRecvSize*)(&rVec[0]); - rHeader.m_Data64 = (uint32_t)rVecIn.size(); - memcpy(&rVec[8], &rVecIn[0], rVecIn.size()); - - CrySimpleRecvSize size; - size.m_Data64 = static_cast(rVec.size()); - for (uint64_t a = 0; a < size.m_Data64; a += BLOCKSIZE) - { - char* pData = reinterpret_cast(&rVec[(size_t)a]); - int nSendRes = send(m_pImpl->m_Socket, pData, std::min(static_cast(size.m_Data64 - a), BLOCKSIZE), 0); - if (nSendRes == SOCKET_ERROR) - { - int nLastSendError = WSAGetLastError(); - logmessage("Socket send(forward) error: %d", nLastSendError); - } - } -} - - -bool CCrySimpleSock::Backward(std::vector& rVec) -{ - uint32_t size; - if (recv(m_pImpl->m_Socket, reinterpret_cast(&size), 4, 0) != 4) - { - CrySimple_ERROR("Error while receiving size of data"); - return false; - } - - rVec.clear(); - rVec.resize(static_cast(size)); - - for (uint32_t a = 0; a < size; ) - { - int read = recv(m_pImpl->m_Socket, reinterpret_cast(&rVec[a]), size - a, 0); - if (read <= 0) - { - CrySimple_ERROR("Error while receiving tcp-data"); - return false; - } - a += read; - } - return true; -} - -void CCrySimpleSock::Send(const std::vector& rVecIn, size_t state, EProtocolVersion version) -{ - const size_t offset = version == EPV_V001 ? 4 : 5; - tdDataVector& rVec = m_pImpl->m_tempSendBuffer; - rVec.resize(rVecIn.size() + offset); - if (rVecIn.size()) - { - *(uint32_t*)(&rVec[0]) = (uint32_t)rVecIn.size(); - memcpy(&rVec[offset], &rVecIn[0], rVecIn.size()); - } - - if (version >= EPV_V002) - { - rVec[4] = static_cast(state); - } - - if (m_pImpl->m_SwapEndian) - { - CSTLHelper::EndianSwizzleU32(*(uint32_t*)&rVec[0]); - } - - // send can fail, you must retry unsent parts. - size_t remainingBytes = rVec.size(); - const char* pData = reinterpret_cast(rVec.data()); - - while (remainingBytes != 0) - { - size_t sendThisRound = remainingBytes; - if (sendThisRound > BLOCKSIZE) - { - sendThisRound = BLOCKSIZE; - } - - int bytesActuallySent = send(m_pImpl->m_Socket, pData, static_cast(sendThisRound), 0); - if (bytesActuallySent < 0) - { - int nLastSendError = WSAGetLastError(); - logmessage("Socket send error: %d", nLastSendError); - m_pImpl->m_bHasSendData = true; - return; - } - size_t actuallySent = static_cast(bytesActuallySent); - - remainingBytes -= actuallySent; - pData += actuallySent; - } - - m_pImpl->m_bHasSendData = true; -} - - -void CCrySimpleSock::Send(const std::string& rData) -{ - const size_t S = rData.size(); - - for (uint64_t a = 0; a < S; a += BLOCKSIZE) - { - const char* pData = &rData.c_str()[a]; - const int nSendRes = send(m_pImpl->m_Socket, pData, std::min(static_cast(S - a), BLOCKSIZE), 0); - if (nSendRes == SOCKET_ERROR) - { - int nLastSendError = WSAGetLastError(); - logmessage("Socket send error: %d", nLastSendError); - } - else - { - m_pImpl->m_bHasSendData = true; - } - } -} - -uint32_t CCrySimpleSock::PeerIP() -{ - struct sockaddr_in addr; -#if defined(AZ_PLATFORM_WINDOWS) - int addr_size = sizeof(sockaddr_in); -#else - socklen_t addr_size = sizeof(sockaddr_in); -#endif - int nRes = getpeername(m_pImpl->m_Socket, (sockaddr*) &addr, &addr_size); - if (nRes == SOCKET_ERROR) - { - int nError = WSAGetLastError(); - logmessage("Socket getpeername error: %d", nError); - return 0; - } -#if defined(AZ_PLATFORM_WINDOWS) - return addr.sin_addr.S_un.S_addr; -#else - return addr.sin_addr.s_addr; -#endif -} - -bool CCrySimpleSock::Valid() const -{ - return m_pImpl->m_Socket != INVALID_SOCKET; -} - -void CCrySimpleSock::WaitForShutDownEvent(bool bValue) -{ - m_pImpl->m_WaitForShutdownEvent = bValue; -} - -long CCrySimpleSock::GetOpenSockets() -{ - return numberOfOpenSockets; -} - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.hpp deleted file mode 100644 index ef35f03c03..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleSock.hpp +++ /dev/null @@ -1,104 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __CRYSIMPLESOCK__ -#define __CRYSIMPLESOCK__ - -#include -#include - -#include -#include - -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) -typedef int SOCKET; -#define INVALID_SOCKET (-1) -#define SOCKET_ERROR (-1) -#include -#include -#include -#include -#define closesocket close -#else -#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS -#define _WINSOCK_DEPRECATED_NO_WARNINGS // till we swtich to in inet_pton and getaddrinfo -#endif -#include -#endif - -#include -#include - -//#define USE_WSAEVENTS - -enum EProtocolVersion -{ - EPV_V001, - EPV_V002, - EPV_V0021, - EPV_V0022, - EPV_V0023, -}; - -class CCrySimpleSock -{ -public: - - -#ifdef USE_WSAEVENTS - CCrySimpleSock(SOCKET Sock, CCrySimpleSock* pInstance, WSAEVENT wsaEvent); -#else - CCrySimpleSock(SOCKET Sock, CCrySimpleSock* pInstance); -#endif - CCrySimpleSock(const CCrySimpleSock&); - - CCrySimpleSock(const std::string& rServerName, uint16_t Port); - CCrySimpleSock(uint16_t Port, const std::vector& ipWhiteList); - - ~CCrySimpleSock(); - - void InitClient(); - void Release(); - - int Recv(char* acData, int len, int flags); - - void Listen(); - - - CCrySimpleSock* Accept(); - - bool Recv(std::vector& rVec); - bool RecvResult(); - - bool Backward(std::vector& rVec); - void Send(const std::vector& rVec, size_t State, EProtocolVersion Version); - void Forward(const std::vector& rVec); - - //used for HTML - void Send(const std::string& rData); - - uint32_t PeerIP(); - - bool Valid() const; - - void WaitForShutDownEvent(bool bValue); - - static long GetOpenSockets(); - - -private: - struct Implementation; - std::unique_ptr m_pImpl; -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.cpp deleted file mode 100644 index 5de6e64ae8..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.cpp +++ /dev/null @@ -1,521 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "ShaderList.hpp" -#include -#include - -#include "CrySimpleServer.hpp" - -#include - -#include -#ifdef _MSC_VER -#include -#include -#endif -#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC) -#include -#include -#include -#include -#endif - -static bool g_bSaveThread = false; - -CShaderList& CShaderList::Instance() -{ - static CShaderList g_Cache; - return g_Cache; -} - -////////////////////////////////////////////////////////////////////////// -CShaderList::CShaderList() -{ - m_lastTime = 0; -} - -////////////////////////////////////////////////////////////////////////// -void CShaderList::Tick() -{ -#if defined(AZ_PLATFORM_WINDOWS) - DWORD t = GetTickCount(); -#else - unsigned long t = time(nullptr)*1000; // Current time in milliseconds -#endif - if (t < m_lastTime || (t - m_lastTime) > 1000) //check every second - { - m_lastTime = t; - - Save(); - } -} - -////////////////////////////////////////////////////////////////////////// -void CShaderList::Add(const std::string& rShaderListName, const char* pLine) -{ - tdShaderLists::iterator it; - { - CCrySimpleMutexAutoLock Lock(m_Mutex); - it = m_ShaderLists.find(rShaderListName); - //not existing yet? - if (it == m_ShaderLists.end()) - { - CCrySimpleMutexAutoLock Lock2(m_Mutex2); //load/save mutex - m_ShaderLists[rShaderListName] = new CShaderListFile(rShaderListName); - it = m_ShaderLists.find(rShaderListName); - it->second->Load((SEnviropment::Instance().m_CachePath / AZStd::string_view{ rShaderListName.c_str(), rShaderListName.size() }).c_str()); - } - } - it->second->InsertLine(pLine); -} - - -////////////////////////////////////////////////////////////////////////// -void CShaderList::Save() -{ - CCrySimpleMutexAutoLock Lock(m_Mutex2); //load/save mutex - for (tdShaderLists::iterator it = m_ShaderLists.begin(); it != m_ShaderLists.end(); ++it) - { - it->second->MergeNewLinesAndSave(); - } -} - -////////////////////////////////////////////////////////////////////////// -CShaderListFile::CShaderListFile(std::string ListName) -{ - m_bModified = false; - - m_listname = ListName; - - // some test cases - SMetaData MD; - assert(CheckSyntax("<1>watervolume@WaterVolumeOutofPS()()(0)(0)(0)(ps_2_0)", MD) == true); - assert(CheckSyntax("<1>Blurcloak@BlurCloakPS(%BUMP_MAP)(%_RT_FOG|%_RT_HDR_MODE|%_RT_BUMP)(0)(0)(1)(ps_2_0)", MD) == true); - assert(CheckSyntax("<1>Burninglayer@BurnPS()(%_RT_ADDBLEND|%_RT_)HDR_MODE|%_RT_BUMP|%_RT_3DC)(0)(0)(0)(ps_2_0)", MD) == false); - assert(CheckSyntax("<1>Illum@IlluminationVS(%DIFFUSE|%SPECULAR|%BUMP_MAP|%VERTCOLORS|%STAT_BRANCHING)(%_RT_RAE_GEOMTERM)(101)(0)(0)(vs_2_0)", MD) == true); - - assert(CheckSyntax("<660><2>Cloth@Common_SG_VS()(%_RT_QUALITY|%_RT_SHAPEDEFORM|%_RT_SKELETON_SSD|%_RT_HW_PCF_COMPARE)(0)(0)(0)(VS)", MD) == true); - assert(CheckSyntax("<6452><2>ShadowMaskGen@FrustumClipVolumeVS()()(0)(0)(0)(VS)", MD) == true); - assert(CheckSyntax("<5604><2>ParticlesNoMat@ParticlePS()(%_RT_FOG|%_RT_AMBIENT|%_RT_ALPHABLEND|%_RT_QUALITY1)(0)(0)(0)(PS)", MD) == true); -} - -////////////////////////////////////////////////////////////////////////// -bool CShaderListFile::Reload() -{ - return Load(m_filename.c_str()); -} - -void CShaderListFile::CreatePath(const std::string& rPath) -{ - std::string Path = rPath; - CSTLHelper::Replace(Path, rPath, "\\", "/"); - tdEntryVec rToks; - CSTLHelper::Tokenize(rToks, Path, "/"); - - Path = ""; - for (size_t a = 0; a + 1 < rToks.size(); a++) - { - Path += rToks[a] + "/"; -#if defined(AZ_PLATFORM_WINDOWS) - _mkdir(Path.c_str()); -#else - mkdir(Path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); -#endif - } -} - -////////////////////////////////////////////////////////////////////////// -bool CShaderListFile::Load(const char* filename) -{ - CreatePath(filename); - printf("Loading ShaderList file: %s\n", filename); - m_filename = filename; - m_filenametmp = filename; - m_filenametmp += ".tmp"; - FILE* f = nullptr; - azfopen(&f, filename, "rt"); - if (!f) - { - return false; - } - - int nNumLines = 0; - m_entries.clear(); - char str[65535]; - while (fgets(str, sizeof(str), f) != NULL) - { - if (*str && InsertLineInternal(str)) - { - ++nNumLines; - } - } - fclose(f); - if (nNumLines == m_entries.size()) - { - m_bModified = false; - } - else - { - m_bModified = true; - } - - printf("Loaded %d combination for %s\n", nNumLines, filename); - - return true; -} - -////////////////////////////////////////////////////////////////////////// -bool CShaderListFile::Save() -{ - //not needed regarding timur, m_entries is just accessed by one thread - //CCrySimpleMutexAutoLock Lock(m_Mutex); - - CreatePath(m_filename); - if (m_filename.empty()) - { - return false; - } - - // write to tmp file - FILE* f = nullptr; - azfopen(&f, m_filenametmp.c_str(), "wt"); - if (!f) - { - return false; - } - for (Entries::iterator it = m_entries.begin(); it != m_entries.end(); ++it) - { - const char* str = it->first.c_str(); - if (it->second.m_Count == -1) - { - fprintf(f, "<%d>%s\n", it->second.m_Version, str); - } - else - { - fprintf(f, "<%d><%d>%s\n", it->second.m_Count, it->second.m_Version, str); - } - } - fclose(f); - - // first check if original file excists - f = nullptr; - azfopen(&f, m_filename.c_str(), "rt"); - if (f) - { - fclose(f); - - // remove original file (keep on trying until success - shadercompiler could currently be copying it for example) - int sleeptime = 0; - while (remove(m_filename.c_str())) - { - Sleep(100); - - sleeptime += 100; - if (sleeptime > 5000) - { - break; - } - } - } - - { - int sleeptime = 0; - while (rename(m_filenametmp.c_str(), m_filename.c_str())) - { - Sleep(100); - - sleeptime += 100; - if (sleeptime > 5000) - { - break; - } - } - } - - m_bModified = false; - return true; -} - -////////////////////////////////////////////////////////////////////////// -inline bool IsHexNumberCharacter(const char c) -{ - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); -} - -////////////////////////////////////////////////////////////////////////// -inline bool IsDecNumberCharacter(const char c) -{ - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); -} - -////////////////////////////////////////////////////////////////////////// -inline bool IsNameCharacter(const char c) -{ - return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || c == '@' || c == '/' || c == '%' || c == '_'; -} - -int shGetHex(const char* buf) -{ - if (!buf) - { - return 0; - } - int i = 0; - - azsscanf(buf, "%x", &i); - - return i; -} - -////////////////////////////////////////////////////////////////////////// -bool CShaderListFile::CheckSyntax(const char* szLine, SMetaData& rMD, const char** sOutStr) -{ - assert(szLine); - if (!szLine) - { - return false; - } - - if (sOutStr) - { - *sOutStr = 0; - } - - // e.g. Blurcloak@BlurCloakPS(%BUMP_MAP|%SPECULAR)(%_RT_FOG|%_RT_HDR_MODE|%_RT_BUMP)(0)(0)(0)(ps_2_0) - - const char* p = szLine; - - if (strlen(szLine) < 4) - { - return false; - } - - int Value0 = 0; - int Value1 = 0; - - if (*p != '<') - { - return false; - } - - char Last = 0; - while (IsDecNumberCharacter(Last = *++p)) - { - Value0 = Value0 * 10 + (Last - '0'); - } - - if (*p++ != '>') - { - return false; - } - - if (*p == '<') - { - while (IsDecNumberCharacter(Last = *++p)) - { - Value1 = Value1 * 10 + (Last - '0'); - } - - if (*p++ != '>') - { - return false; - } - - rMD.m_Version = Value1; - rMD.m_Count = Value0; - } - else - { - rMD.m_Version = Value0; - rMD.m_Count = -1; - } - - const char* pStart = p; - - // e.g. "Blurcloak@BlurCloakPS" - while (IsNameCharacter(*p++)) - { - ; - } - p--; - - // e.g. "(%BUMP_MAP|%SPECULAR)(%_RT_FOG|%_RT_HDR_MODE|%_RT_BUMP)" - for (int i = 0; i < 2; ++i) - { - if (*p++ != '(') - { - return false; - } - while (true) - { - while (IsNameCharacter(*p++)) - { - ; - } - p--; - if (*p != '|') - { - break; - } - p++; - } - if (*p++ != ')') - { - return false; - } - } - - // e.g. "(0)(0)(0)" - for (int i = 0; i < 3; ++i) - { - if (*p++ != '(') - { - return false; - } - while (IsHexNumberCharacter(*p++)) - { - ; - } - p--; - if (*p++ != ')') - { - return false; - } - } - - // e.g. "(ps_2_0)" - if (*p++ != '(') - { - return false; - } - while (IsNameCharacter(*p++)) - { - ; - } - p--; - if (*p++ != ')') - { - return false; - } - - // Copy rest of the line. - if (sOutStr) - { - *sOutStr = pStart; - } - - return true; -} - -////////////////////////////////////////////////////////////////////////// -void CShaderListFile::InsertLine(const char* szLine) -{ - if (*szLine != 0) - { - CCrySimpleMutexAutoLock Lock(m_Mutex); - m_newLines.push_back(szLine); - m_bModified = true; - } -} - -////////////////////////////////////////////////////////////////////////// -bool CShaderListFile::InsertLineInternal(const char* szLine) -{ - const char* szCorrectedLine = 0; - SMetaData MD; - if (CheckSyntax(szLine, MD, &szCorrectedLine)) - { - // Trim \n\r - char* s = const_cast(szCorrectedLine); - for (size_t p = strlen(s) - 1; p > 0; p--) - { - if (s[p] == '\n' || s[p] == '\r') - { - s[p] = '\0'; - } - else - { - break; - } - } - - if (szCorrectedLine) - { - Entries::iterator it = m_entries.find(szCorrectedLine); - if (it == m_entries.end()) - { - m_entries[szCorrectedLine] = MD; - m_bModified = true; - } - else - { - if (it->second.m_Version < MD.m_Version) - { - it->second = MD; - m_bModified = true; - } - else - if (it->second.m_Count < MD.m_Count) - { - it->second.m_Count = MD.m_Count; - m_bModified = true; - } - } - } - return true; - } - - - return false; -} - -////////////////////////////////////////////////////////////////////////// -void CShaderListFile::MergeNewLines() -{ - std::vector newLines; - - { - CCrySimpleMutexAutoLock Lock(m_Mutex); - newLines.swap(m_newLines); - } - - m_bModified = false; - - if (newLines.empty()) - { - return; - } - - for (std::vector::iterator it = newLines.begin(); it != newLines.end(); ++it) - { - InsertLineInternal((*it).c_str()); - } -} - -////////////////////////////////////////////////////////////////////////// -void CShaderListFile::MergeNewLinesAndSave() -{ - if (m_bModified) - { - MergeNewLines(); - } - if (m_bModified) - { - if (SEnviropment::Instance().m_PrintListUpdates) - { - logmessage("Updating: %s\n", m_listname.c_str()); - } - Save(); - } -} diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.hpp deleted file mode 100644 index f624581b5f..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/ShaderList.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __SHADERLIST__ -#define __SHADERLIST__ - -#include -#include -#include - -#include "CrySimpleMutex.hpp" - -#include -#include -#include - -class CShaderListFile -{ - ////////////////////////////////////////////////////////////////////////// - struct SMetaData - { - SMetaData() - : m_Version(0) - , m_Count(-1) - {} - int32_t m_Version; - int32_t m_Count; - }; - bool m_bModified; - std::string m_listname; - std::string m_filename; - std::string m_filenametmp; - typedef std::map Entries; - Entries m_entries; - std::vector m_newLines; - - CCrySimpleMutex m_Mutex; - - //do not copy -> not safe - CShaderListFile(const CShaderListFile&); - CShaderListFile& operator=(const CShaderListFile&); - -public: - CShaderListFile(std::string ListName); - - bool Load(const char* filename); - bool Save(); - bool Reload(); - bool IsModified() const { return m_bModified; } - - void InsertLine(const char* szLine); - void MergeNewLinesAndSave(); - -private: - void CreatePath(const std::string& rPath); - void MergeNewLines(); - // Returns: - // true - line was instered, false otherwise - bool InsertLineInternal(const char* szLine); - - // Returns - // true=syntax is ok, false=syntax is wrong - static bool CheckSyntax(const char* szLine, SMetaData& rMD, const char** sOutStr = NULL); -}; - -typedef std::map tdShaderLists; - -class CShaderList -{ - CCrySimpleMutex m_Mutex; - CCrySimpleMutex m_Mutex2; - unsigned long m_lastTime; - - tdShaderLists m_ShaderLists; - - void Save(); -public: - static CShaderList& Instance(); - CShaderList(); - - void Add(const std::string& rShaderListName, const char* pLine); - void Tick(); -}; - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/StdTypes.hpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/StdTypes.hpp deleted file mode 100644 index c505d91a51..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/StdTypes.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef __STDTYPES_DUMMY__ -#define __STDTYPES_DUMMY__ - -#include - - -#if defined(AZ_PLATFORM_WINDOWS) -typedef signed __int8 int8_t; -typedef signed __int16 int16_t; -typedef signed __int32 int32_t; -typedef signed __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -#endif - -#if defined(UNIX) -#include -#include "Core/UnixCompat.h" -#endif - -#if defined(AZ_PLATFORM_MAC) -#include -#endif - -#endif - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.cpp deleted file mode 100644 index 8e23fcfb78..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "WindowsAPIImplementation.h" - -#if defined(AZ_PLATFORM_MAC) || defined(AZ_PLATFORM_LINUX) - -#include -#include -#import -#include - -bool QueryPerformanceCounter(LARGE_INTEGER* counter) -{ -#if defined(LINUX) - // replaced gettimeofday - // http://fixunix.com/kernel/378888-gettimeofday-resolution-linux.html - timespec tv; - clock_gettime(CLOCK_MONOTONIC, &tv); - counter->QuadPart = (uint64_t)tv.tv_sec * 1000000 + tv.tv_nsec / 1000; -#elif defined(APPLE) - counter->QuadPart = mach_absolute_time(); -#endif - return true; -} - -bool QueryPerformanceFrequency(LARGE_INTEGER* frequency) -{ -#if defined(LINUX) - // On Linux we'll use gettimeofday(). The API resolution is microseconds, - // so we'll report that to the caller. - frequency->u.LowPart = 1000000; - frequency->u.HighPart = 0; -#elif defined(APPLE) - static mach_timebase_info_data_t s_kTimeBaseInfoData; - if (s_kTimeBaseInfoData.denom == 0) - { - mach_timebase_info(&s_kTimeBaseInfoData); - } - // mach_timebase_info_data_t expresses the tick period in nanoseconds - frequency->QuadPart = 1e+9 * (uint64_t)s_kTimeBaseInfoData.denom / (uint64_t)s_kTimeBaseInfoData.numer; -#endif - return true; -} - -int WSAGetLastError() -{ - return errno; -} - -DWORD Sleep(DWORD dwMilliseconds) -{ - timespec req; - timespec rem; - - memset(&req, 0, sizeof(req)); - memset(&rem, 0, sizeof(rem)); - - time_t sec = (int)(dwMilliseconds / 1000); - req.tv_sec = sec; - req.tv_nsec = (dwMilliseconds - (sec * 1000)) * 1000000L; - if (nanosleep(&req, &rem) == -1) - { - nanosleep(&rem, 0); - } - - return 0; -} - - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.h b/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.h deleted file mode 100644 index 5879612917..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/WindowsAPIImplementation.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include -#include - -#if defined(AZ_PLATFORM_MAC) || defined(AZ_PLATFORM_LINUX) -#include - -#ifndef MAX_PATH -#define MAX_PATH PATH_MAX -#endif - -typedef uint32_t DWORD; - -typedef union _LARGE_INTEGER -{ - struct - { - uint32_t LowPart; - int32_t HighPart; - }; - struct - { - uint32_t LowPart; - int32_t HighPart; - } u; - - int64_t QuadPart; -} LARGE_INTEGER; - -bool QueryPerformanceCounter(LARGE_INTEGER* counter); - -bool QueryPerformanceFrequency(LARGE_INTEGER* frequency); - -int WSAGetLastError(); - -DWORD Sleep(DWORD dwMilliseconds); - -#if defined(AZ_PLATFORM_LINUX) - -namespace PthreadImplementation -{ - static pthread_mutex_t g_interlockMutex; -} - -template -const volatile T InterlockedIncrement(volatile T* pT) -{ - pthread_mutex_lock(&PthreadImplementation::g_interlockMutex); - ++(*pT); - pthread_mutex_unlock(&PthreadImplementation::g_interlockMutex); - return *pT; -} - -template -const volatile T InterlockedDecrement(volatile T* pT) -{ - pthread_mutex_lock(&PthreadImplementation::g_interlockMutex); - --(*pT); - pthread_mutex_unlock(&PthreadImplementation::g_interlockMutex); - return *pT; -} - -#endif - -#endif diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/CrySCompileServer.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/CrySCompileServer.cpp deleted file mode 100644 index cec8628d30..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/CrySCompileServer.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "Core/StdTypes.hpp" -#include "Core/Server/CrySimpleServer.hpp" -#include "Core/Server/CrySimpleHTTP.hpp" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#if AZ_TRAIT_OS_PLATFORM_APPLE -// Needed for geteuid() -#include -#include -#endif - -namespace -{ - const int STD_TCP_PORT = 61453; - const int DEFAULT_MAX_CONNECTIONS = 255; -} - -////////////////////////////////////////////////////////////////////////// -class CConfigFile -{ -public: - CConfigFile() {} - ////////////////////////////////////////////////////////////////////////// - void OnLoadConfigurationEntry(const std::string& strKey, const std::string& strValue, [[maybe_unused]] const std::string& strGroup) - { - if (azstricmp(strKey.c_str(), "MailError") == 0) - { - SEnviropment::Instance().m_FailEMail = strValue; - } - if (azstricmp(strKey.c_str(), "port") == 0) - { - SEnviropment::Instance().m_port = atoi(strValue.c_str()); - } - if (azstricmp(strKey.c_str(), "MailInterval") == 0) - { - SEnviropment::Instance().m_MailInterval = atoi(strValue.c_str()); - } - if (azstricmp(strKey.c_str(), "TempDir") == 0) - { - SEnviropment::Instance().m_TempPath = AZStd::string_view{ strValue.c_str(), strValue.size() }; - } - if (azstricmp(strKey.c_str(), "MailServer") == 0) - { - SEnviropment::Instance().m_MailServer = strValue; - } - if (azstricmp(strKey.c_str(), "Caching") == 0) - { - SEnviropment::Instance().m_Caching = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "PrintErrors") == 0) - { - SEnviropment::Instance().m_PrintErrors = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "PrintWarnings") == 0) - { - SEnviropment::Instance().m_PrintWarnings = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "PrintCommands") == 0) - { - SEnviropment::Instance().m_PrintCommands = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "PrintListUpdates") == 0) - { - SEnviropment::Instance().m_PrintListUpdates = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "DedupeErrors") == 0) - { - SEnviropment::Instance().m_DedupeErrors = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "FallbackServer") == 0) - { - SEnviropment::Instance().m_FallbackServer = strValue; - } - if (azstricmp(strKey.c_str(), "FallbackTreshold") == 0) - { - SEnviropment::Instance().m_FallbackTreshold = atoi(strValue.c_str()); - } - if (azstricmp(strKey.c_str(), "DumpShaders") == 0) - { - SEnviropment::Instance().m_DumpShaders = atoi(strValue.c_str()) != 0; - } - if (azstricmp(strKey.c_str(), "MaxConnections") == 0) - { - int maxConnections = atoi(strValue.c_str()); - if (maxConnections <= 0) - { - printf("Warning: MaxConnections value is invalid. Using default value of %d\n", DEFAULT_MAX_CONNECTIONS); - } - else - { - SEnviropment::Instance().m_MaxConnections = maxConnections; - } - } - if (azstricmp(strKey.c_str(), "whitelist") == 0 || azstricmp(strKey.c_str(), "white_list") == 0) - { - std::regex ip4_address_regex("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))?$"); - AZStd::vector addresses; - AzFramework::StringFunc::Tokenize(strValue.c_str(), addresses, ','); - for (const auto& address : addresses) - { - if (std::regex_match(address.c_str(), ip4_address_regex)) - { - SEnviropment::Instance().m_WhitelistAddresses.push_back(address); - } - else - { - printf("Warning: invalid IP address in the whitelist field: %s", address.c_str()); - } - } - } - if (azstricmp(strKey.c_str(), "AllowElevatedPermissions") == 0) - { - int runAsRoot = atoi(strValue.c_str()); - SEnviropment::Instance().m_RunAsRoot = (runAsRoot == 1); - } - -#if defined(TOOLS_SUPPORT_JASPER) -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySCompileServer_cpp, jasper) -#endif -#if defined(TOOLS_SUPPORT_PROVO) -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySCompileServer_cpp, provo) -#endif -#if defined(TOOLS_SUPPORT_SALEM) -#include AZ_RESTRICTED_FILE_EXPLICIT(CrySCompileServer_cpp, salem) -#endif - } - - ////////////////////////////////////////////////////////////////////////// - bool ParseConfig(const char* filename) - { - FILE* file = nullptr; - azfopen(&file, filename, "rb"); - if (!file) - { - std::cout << "Config file not found" << std::endl; - return false; - } - - fseek(file, 0, SEEK_END); - int nLen = ftell(file); - fseek(file, 0, SEEK_SET); - - char* sAllText = new char [nLen + 16]; - - fread(sAllText, 1, nLen, file); - - sAllText[nLen] = '\0'; - sAllText[nLen + 1] = '\0'; - - std::string strGroup; // current group e.g. "[General]" - - char* strLast = sAllText + nLen; - char* str = sAllText; - while (str < strLast) - { - char* s = str; - while (str < strLast && *str != '\n' && *str != '\r') - { - str++; - } - *str = '\0'; - str++; - while (str < strLast && (*str == '\n' || *str == '\r')) - { - str++; - } - - - std::string strLine = s; - - // detect groups e.g. "[General]" should set strGroup="General" - { - std::string strTrimmedLine(RemoveWhiteSpaces(strLine)); - size_t size = strTrimmedLine.size(); - - if (size >= 3) - { - if (strTrimmedLine[0] == '[' && strTrimmedLine[size - 1] == ']') // currently no comments are allowed to be behind groups - { - strGroup = &strTrimmedLine[1]; - strGroup.resize(size - 2); // remove [ and ] - continue; // next line - } - } - } - - // skip comments - if (0 < strLine.find("--")) - { - // extract key - std::string::size_type posEq(strLine.find("=", 0)); - if (std::string::npos != posEq) - { - std::string stemp(strLine, 0, posEq); - std::string strKey(RemoveWhiteSpaces(stemp)); - - // if (!strKey.empty()) - { - // extract value - std::string::size_type posValueStart(strLine.find("\"", posEq + 1) + 1); - // std::string::size_type posValueEnd( strLine.find( "\"", posValueStart ) ); - std::string::size_type posValueEnd(strLine.rfind('\"')); - - std::string strValue; - - if (std::string::npos != posValueStart && std::string::npos != posValueEnd) - { - strValue = std::string(strLine, posValueStart, posValueEnd - posValueStart); - } - else - { - std::string strTmp(strLine, posEq + 1, strLine.size() - (posEq + 1)); - strValue = RemoveWhiteSpaces(strTmp); - } - OnLoadConfigurationEntry(strKey, strValue, strGroup); - } - } - } //-- - } - delete []sAllText; - fclose(file); - - return true; - } - std::string RemoveWhiteSpaces(std::string& str) - { - std::string::size_type pos1 = str.find_first_not_of(' '); - std::string::size_type pos2 = str.find_last_not_of(' '); - str = str.substr(pos1 == std::string::npos ? 0 : pos1, pos2 == std::string::npos ? str.length() - 1 : pos2 - pos1 + 1); - return str; - } - std::string AddSlash(const std::string& str) - { - if (!str.empty() && - (str[str.size() - 1] != '\\') && - (str[str.size() - 1] != '/')) - { - return str + "/"; - } - return str; - } -}; - -namespace -{ - AZ::JobManager* jobManager; - AZ::JobContext* globalJobContext; - -#if defined(AZ_PLATFORM_WINDOWS) - BOOL ControlHandler([[maybe_unused]] DWORD controlType) - { - AZ::AllocatorInstance::Destroy(); - AZ::AllocatorInstance::Destroy(); - return FALSE; - } -#endif -} - -void InitDefaults() -{ - SEnviropment::Instance().m_port = STD_TCP_PORT; - SEnviropment::Instance().m_MaxConnections = DEFAULT_MAX_CONNECTIONS; - SEnviropment::Instance().m_FailEMail = ""; - SEnviropment::Instance().m_MailInterval = 10; - SEnviropment::Instance().m_MailServer = "example.com"; - SEnviropment::Instance().m_Caching = true; - SEnviropment::Instance().m_PrintErrors = true; - SEnviropment::Instance().m_PrintWarnings = false; - SEnviropment::Instance().m_PrintCommands = false; - SEnviropment::Instance().m_DedupeErrors = true; - SEnviropment::Instance().m_PrintListUpdates = true; - SEnviropment::Instance().m_FallbackTreshold = 16; - SEnviropment::Instance().m_FallbackServer = ""; - SEnviropment::Instance().m_WhitelistAddresses.push_back("127.0.0.1"); - SEnviropment::Instance().m_RunAsRoot = false; - SEnviropment::Instance().InitializePlatformAttributes(); -} - -bool ReadConfigFile() -{ - char executableDir[AZ_MAX_PATH_LEN]; - if (AZ::Utils::GetExecutableDirectory(executableDir, AZ_MAX_PATH_LEN) == AZ::Utils::ExecutablePathResult::Success) - { - auto configFilename = AZ::IO::Path(executableDir).Append("config.ini"); - CConfigFile config; - config.ParseConfig(configFilename.c_str()); - return true; - } - else - { - printf("error: failed to get executable directory.\n"); - return false; - } -} - -void RunServer(bool isRunningAsRoot) -{ - if (isRunningAsRoot) - { - printf("\nWARNING: Attempting to run the CrySCompileServer as a user that has admininstrator permissions. This is a security risk and not recommended. Please run the service with a user account that does not have administrator permissions.\n\n"); - } - - if (!isRunningAsRoot || SEnviropment::Instance().m_RunAsRoot) - { - CCrySimpleHTTP HTTP; - CCrySimpleServer(); - } - else - { - printf("If you need to run CrySCompileServer with administrator permisions you can create/edit the config.ini file in the same directory as this executable and add the following line to it:\n\tAllowElevatedPermissions=1\n"); - } -} - -int main(int argc, [[maybe_unused]] char* argv[]) -{ - if (argc != 1) - { - printf("usage: run without arguments\n"); - return 0; - } - - bool isRunningAsRoot = false; - -#if defined(AZ_PLATFORM_WINDOWS) - // Check to see if we are running as root... - SID_IDENTIFIER_AUTHORITY ntAuthority = { SECURITY_NT_AUTHORITY }; - PSID administratorsGroup; - BOOL sidAllocated = AllocateAndInitializeSid( - &ntAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, - &administratorsGroup); - - if(sidAllocated) - { - BOOL isRoot = FALSE; - if (!CheckTokenMembership( NULL, administratorsGroup, &isRoot)) - { - isRoot = FALSE; - } - FreeSid(administratorsGroup); - - isRunningAsRoot = (isRoot == TRUE); - } - -#if defined(_DEBUG) - int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - tmpFlag |= _CRTDBG_LEAK_CHECK_DF; - // tmpFlag &= ~_CRTDBG_CHECK_CRT_DF; - _CrtSetDbgFlag(tmpFlag); -#endif - AZ_Verify(SetConsoleCtrlHandler(ControlHandler, TRUE), "Unable to setup windows console control handler"); -#else - // if either the effective user id or effective group id is root, then we - // are running as root - isRunningAsRoot = (geteuid() == 0 || getegid() == 0); -#endif - - AZ::AllocatorInstance::Create(); - AZ::AllocatorInstance::Create(); - - AZ::JobManagerDesc jobManagerDescription; - - int workers = AZStd::GetMin(AZStd::thread::hardware_concurrency(), static_cast(8)); - for (int idx = 0; idx < workers; ++idx) - { - jobManagerDescription.m_workerThreads.push_back(AZ::JobManagerThreadDesc()); - } - - jobManager = aznew AZ::JobManager(jobManagerDescription); - globalJobContext = aznew AZ::JobContext(*jobManager); - AZ::JobContext::SetGlobalContext(globalJobContext); - - SEnviropment::Create(); - - InitDefaults(); - - if (ReadConfigFile()) - { - RunServer(isRunningAsRoot); - } - - SEnviropment::Destroy(); - - AZ::JobContext::SetGlobalContext(nullptr); - delete globalJobContext; - delete jobManager; - - AZ::AllocatorInstance::Destroy(); - AZ::AllocatorInstance::Destroy(); - - return 0; -} - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/readme.txt b/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/readme.txt deleted file mode 100644 index 89d9e8d38b..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/readme.txt +++ /dev/null @@ -1,530 +0,0 @@ -/** @mainpage - -

TinyXML

- -TinyXML is a simple, small, C++ XML parser that can be easily -integrated into other programs. - -

What it does.

- -In brief, TinyXML parses an XML document, and builds from that a -Document Object Model (DOM) that can be read, modified, and saved. - -XML stands for "eXtensible Markup Language." It allows you to create -your own document markups. Where HTML does a very good job of marking -documents for browsers, XML allows you to define any kind of document -markup, for example a document that describes a "to do" list for an -organizer application. XML is a very structured and convenient format. -All those random file formats created to store application data can -all be replaced with XML. One parser for everything. - -The best place for the complete, correct, and quite frankly hard to -read spec is at -http://www.w3.org/TR/2004/REC-xml-20040204/. An intro to XML -(that I really like) can be found at -http://skew.org/xml/tutorial. - -There are different ways to access and interact with XML data. -TinyXML uses a Document Object Model (DOM), meaning the XML data is parsed -into a C++ objects that can be browsed and manipulated, and then -written to disk or another output stream. You can also construct an XML document -from scratch with C++ objects and write this to disk or another output -stream. - -TinyXML is designed to be easy and fast to learn. It is two headers -and four cpp files. Simply add these to your project and off you go. -There is an example file - xmltest.cpp - to get you started. - -TinyXML is released under the ZLib license, -so you can use it in open source or commercial code. The details -of the license are at the top of every source file. - -TinyXML attempts to be a flexible parser, but with truly correct and -compliant XML output. TinyXML should compile on any reasonably C++ -compliant system. It does not rely on exceptions or RTTI. It can be -compiled with or without STL support. TinyXML fully supports -the UTF-8 encoding, and the first 64k character entities. - - -

What it doesn't do.

- -TinyXML doesn't parse or use DTDs (Document Type Definitions) or XSLs -(eXtensible Stylesheet Language.) There are other parsers out there -(check out www.sourceforge.org, search for XML) that are much more fully -featured. But they are also much bigger, take longer to set up in -your project, have a higher learning curve, and often have a more -restrictive license. If you are working with browsers or have more -complete XML needs, TinyXML is not the parser for you. - -The following DTD syntax will not parse at this time in TinyXML: - -@verbatim - - ]> -@endverbatim - -because TinyXML sees this as a !DOCTYPE node with an illegally -embedded !ELEMENT node. This may be addressed in the future. - -

Tutorials.

- -For the impatient, here is a tutorial to get you going. A great way to get started, -but it is worth your time to read this (very short) manual completely. - -- @subpage tutorial0 - -

Code Status.

- -TinyXML is mature, tested code. It is very stable. If you find -bugs, please file a bug report on the sourceforge web site -(www.sourceforge.net/projects/tinyxml). We'll get them straightened -out as soon as possible. - -There are some areas of improvement; please check sourceforge if you are -interested in working on TinyXML. - -

Related Projects

- -TinyXML projects you may find useful! (Descriptions provided by the projects.) - -
    -
  • TinyXPath (http://tinyxpath.sourceforge.net). TinyXPath is a small footprint - XPath syntax decoder, written in C++.
  • -
  • TinyXML++ (http://code.google.com/p/ticpp/). TinyXML++ is a completely new - interface to TinyXML that uses MANY of the C++ strengths. Templates, - exceptions, and much better error handling.
  • -
- -

Features

- -

Using STL

- -TinyXML can be compiled to use or not use STL. When using STL, TinyXML -uses the std::string class, and fully supports std::istream, std::ostream, -operator<<, and operator>>. Many API methods have both 'const char*' and -'const std::string&' forms. - -When STL support is compiled out, no STL files are included whatsoever. All -the string classes are implemented by TinyXML itself. API methods -all use the 'const char*' form for input. - -Use the compile time #define: - - TIXML_USE_STL - -to compile one version or the other. This can be passed by the compiler, -or set as the first line of "tinyxml.h". - -Note: If compiling the test code in Linux, setting the environment -variable TINYXML_USE_STL=YES/NO will control STL compilation. In the -Windows project file, STL and non STL targets are provided. In your project, -It's probably easiest to add the line "#define TIXML_USE_STL" as the first -line of tinyxml.h. - -

UTF-8

- -TinyXML supports UTF-8 allowing to manipulate XML files in any language. TinyXML -also supports "legacy mode" - the encoding used before UTF-8 support and -probably best described as "extended ascii". - -Normally, TinyXML will try to detect the correct encoding and use it. However, -by setting the value of TIXML_DEFAULT_ENCODING in the header file, TinyXML -can be forced to always use one encoding. - -TinyXML will assume Legacy Mode until one of the following occurs: -
    -
  1. If the non-standard but common "UTF-8 lead bytes" (0xef 0xbb 0xbf) - begin the file or data stream, TinyXML will read it as UTF-8.
  2. -
  3. If the declaration tag is read, and it has an encoding="UTF-8", then - TinyXML will read it as UTF-8.
  4. -
  5. If the declaration tag is read, and it has no encoding specified, then TinyXML will - read it as UTF-8.
  6. -
  7. If the declaration tag is read, and it has an encoding="something else", then TinyXML - will read it as Legacy Mode. In legacy mode, TinyXML will work as it did before. It's - not clear what that mode does exactly, but old content should keep working.
  8. -
  9. Until one of the above criteria is met, TinyXML runs in Legacy Mode.
  10. -
- -What happens if the encoding is incorrectly set or detected? TinyXML will try -to read and pass through text seen as improperly encoded. You may get some strange results or -mangled characters. You may want to force TinyXML to the correct mode. - -You may force TinyXML to Legacy Mode by using LoadFile( TIXML_ENCODING_LEGACY ) or -LoadFile( filename, TIXML_ENCODING_LEGACY ). You may force it to use legacy mode all -the time by setting TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Likewise, you may -force it to TIXML_ENCODING_UTF8 with the same technique. - -For English users, using English XML, UTF-8 is the same as low-ASCII. You -don't need to be aware of UTF-8 or change your code in any way. You can think -of UTF-8 as a "superset" of ASCII. - -UTF-8 is not a double byte format - but it is a standard encoding of Unicode! -TinyXML does not use or directly support wchar, TCHAR, or Microsoft's _UNICODE at this time. -It is common to see the term "Unicode" improperly refer to UTF-16, a wide byte encoding -of unicode. This is a source of confusion. - -For "high-ascii" languages - everything not English, pretty much - TinyXML can -handle all languages, at the same time, as long as the XML is encoded -in UTF-8. That can be a little tricky, older programs and operating systems -tend to use the "default" or "traditional" code page. Many apps (and almost all -modern ones) can output UTF-8, but older or stubborn (or just broken) ones -still output text in the default code page. - -For example, Japanese systems traditionally use SHIFT-JIS encoding. -Text encoded as SHIFT-JIS can not be read by TinyXML. -A good text editor can import SHIFT-JIS and then save as UTF-8. - -The Skew.org link does a great -job covering the encoding issue. - -The test file "utf8test.xml" is an XML containing English, Spanish, Russian, -and Simplified Chinese. (Hopefully they are translated correctly). The file -"utf8test.gif" is a screen capture of the XML file, rendered in IE. Note that -if you don't have the correct fonts (Simplified Chinese or Russian) on your -system, you won't see output that matches the GIF file even if you can parse -it correctly. Also note that (at least on my Windows machine) console output -is in a Western code page, so that Print() or printf() cannot correctly display -the file. This is not a bug in TinyXML - just an OS issue. No data is lost or -destroyed by TinyXML. The console just doesn't render UTF-8. - - -

Entities

-TinyXML recognizes the pre-defined "character entities", meaning special -characters. Namely: - -@verbatim - & & - < < - > > - " " - ' ' -@endverbatim - -These are recognized when the XML document is read, and translated to there -UTF-8 equivalents. For instance, text with the XML of: - -@verbatim - Far & Away -@endverbatim - -will have the Value() of "Far & Away" when queried from the TiXmlText object, -and will be written back to the XML stream/file as an ampersand. Older versions -of TinyXML "preserved" character entities, but the newer versions will translate -them into characters. - -Additionally, any character can be specified by its Unicode code point: -The syntax " " or " " are both to the non-breaking space characher. - -

Printing

-TinyXML can print output in several different ways that all have strengths and limitations. - -- Print( FILE* ). Output to a std-C stream, which includes all C files as well as stdout. - - "Pretty prints", but you don't have control over printing options. - - The output is streamed directly to the FILE object, so there is no memory overhead - in the TinyXML code. - - used by Print() and SaveFile() - -- operator<<. Output to a c++ stream. - - Integrates with standart C++ iostreams. - - Outputs in "network printing" mode without line breaks. Good for network transmission - and moving XML between C++ objects, but hard for a human to read. - -- TiXmlPrinter. Output to a std::string or memory buffer. - - API is less concise - - Future printing options will be put here. - - Printing may change slightly in future versions as it is refined and expanded. - -

Streams

-With TIXML_USE_STL on TinyXML supports C++ streams (operator <<,>>) streams as well -as C (FILE*) streams. There are some differences that you may need to be aware of. - -C style output: - - based on FILE* - - the Print() and SaveFile() methods - - Generates formatted output, with plenty of white space, intended to be as - human-readable as possible. They are very fast, and tolerant of ill formed - XML documents. For example, an XML document that contains 2 root elements - and 2 declarations, will still print. - -C style input: - - based on FILE* - - the Parse() and LoadFile() methods - - A fast, tolerant read. Use whenever you don't need the C++ streams. - -C++ style output: - - based on std::ostream - - operator<< - - Generates condensed output, intended for network transmission rather than - readability. Depending on your system's implementation of the ostream class, - these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML: - a document should contain the correct one root element. Additional root level - elements will not be streamed out. - -C++ style input: - - based on std::istream - - operator>> - - Reads XML from a stream, making it useful for network transmission. The tricky - part is knowing when the XML document is complete, since there will almost - certainly be other data in the stream. TinyXML will assume the XML data is - complete after it reads the root element. Put another way, documents that - are ill-constructed with more than one root element will not read correctly. - Also note that operator>> is somewhat slower than Parse, due to both - implementation of the STL and limitations of TinyXML. - -

White space

-The world simply does not agree on whether white space should be kept, or condensed. -For example, pretend the '_' is a space, and look at "Hello____world". HTML, and -at least some XML parsers, will interpret this as "Hello_world". They condense white -space. Some XML parsers do not, and will leave it as "Hello____world". (Remember -to keep pretending the _ is a space.) Others suggest that __Hello___world__ should become -Hello___world. - -It's an issue that hasn't been resolved to my satisfaction. TinyXML supports the -first 2 approaches. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior. -The default is to condense white space. - -If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool ) -before making any calls to Parse XML data, and I don't recommend changing it after -it has been set. - - -

Handles

- -Where browsing an XML document in a robust way, it is important to check -for null returns from method calls. An error safe implementation can -generate a lot of code like: - -@verbatim -TiXmlElement* root = document.FirstChildElement( "Document" ); -if ( root ) -{ - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. -@endverbatim - -Handles have been introduced to clean this up. Using the TiXmlHandle class, -the previous code reduces to: - -@verbatim -TiXmlHandle docHandle( &document ); -TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); -if ( child2 ) -{ - // do something useful -@endverbatim - -Which is much easier to deal with. See TiXmlHandle for more information. - - -

Row and Column tracking

-Being able to track nodes and attributes back to their origin location -in source files can be very important for some applications. Additionally, -knowing where parsing errors occured in the original source can be very -time saving. - -TinyXML can tracks the row and column origin of all nodes and attributes -in a text file. The TiXmlBase::Row() and TiXmlBase::Column() methods return -the origin of the node in the source text. The correct tabs can be -configured in TiXmlDocument::SetTabSize(). - - -

Using and Installing

- -To Compile and Run xmltest: - -A Linux Makefile and a Windows Visual C++ .dsw file is provided. -Simply compile and run. It will write the file demotest.xml to your -disk and generate output on the screen. It also tests walking the -DOM by printing out the number of nodes found using different -techniques. - -The Linux makefile is very generic and runs on many systems - it -is currently tested on mingw and -MacOSX. You do not need to run 'make depend'. The dependecies have been -hard coded. - -

Windows project file for VC6

-
    -
  • tinyxml: tinyxml library, non-STL
  • -
  • tinyxmlSTL: tinyxml library, STL
  • -
  • tinyXmlTest: test app, non-STL
  • -
  • tinyXmlTestSTL: test app, STL
  • -
- -

Makefile

-At the top of the makefile you can set: - -PROFILE, DEBUG, and TINYXML_USE_STL. Details (such that they are) are in -the makefile. - -In the tinyxml directory, type "make clean" then "make". The executable -file 'xmltest' will be created. - - - -

To Use in an Application:

- -Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, and tinystr.h to your -project or make file. That's it! It should compile on any reasonably -compliant C++ system. You do not need to enable exceptions or -RTTI for TinyXML. - - -

How TinyXML works.

- -An example is probably the best way to go. Take: -@verbatim - - - - Go to the Toy store! - Do bills - -@endverbatim - -Its not much of a To Do list, but it will do. To read this file -(say "demo.xml") you would create a document, and parse it in: -@verbatim - TiXmlDocument doc( "demo.xml" ); - doc.LoadFile(); -@endverbatim - -And its ready to go. Now lets look at some lines and how they -relate to the DOM. - -@verbatim - -@endverbatim - - The first line is a declaration, and gets turned into the - TiXmlDeclaration class. It will be the first child of the - document node. - - This is the only directive/special tag parsed by TinyXML. - Generally directive tags are stored in TiXmlUnknown so the - commands wont be lost when it is saved back to disk. - -@verbatim - -@endverbatim - - A comment. Will become a TiXmlComment object. - -@verbatim - -@endverbatim - - The "ToDo" tag defines a TiXmlElement object. This one does not have - any attributes, but does contain 2 other elements. - -@verbatim - -@endverbatim - - Creates another TiXmlElement which is a child of the "ToDo" element. - This element has 1 attribute, with the name "priority" and the value - "1". - -@verbatim -Go to the -@endverbatim - - A TiXmlText. This is a leaf node and cannot contain other nodes. - It is a child of the "Item" TiXmlElement. - -@verbatim - -@endverbatim - - - Another TiXmlElement, this one a child of the "Item" element. - -Etc. - -Looking at the entire object tree, you end up with: -@verbatim -TiXmlDocument "demo.xml" - TiXmlDeclaration "version='1.0'" "standalone=no" - TiXmlComment " Our to do list data" - TiXmlElement "ToDo" - TiXmlElement "Item" Attribtutes: priority = 1 - TiXmlText "Go to the " - TiXmlElement "bold" - TiXmlText "Toy store!" - TiXmlElement "Item" Attributes: priority=2 - TiXmlText "Do bills" -@endverbatim - -

Documentation

- -The documentation is build with Doxygen, using the 'dox' -configuration file. - -

License

- -TinyXML is released under the zlib license: - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. - -

References

- -The World Wide Web Consortium is the definitive standard body for -XML, and their web pages contain huge amounts of information. - -The definitive spec: -http://www.w3.org/TR/2004/REC-xml-20040204/ - -I also recommend "XML Pocket Reference" by Robert Eckstein and published by -OReilly...the book that got the whole thing started. - -

Contributors, Contacts, and a Brief History

- -Thanks very much to everyone who sends suggestions, bugs, ideas, and -encouragement. It all helps, and makes this project fun. A special thanks -to the contributors on the web pages that keep it lively. - -So many people have sent in bugs and ideas, that rather than list here -we try to give credit due in the "changes.txt" file. - -TinyXML was originally written by Lee Thomason. (Often the "I" still -in the documentation.) Lee reviews changes and releases new versions, -with the help of Yves Berquin, Andrew Ellerton, and the tinyXml community. - -We appreciate your suggestions, and would love to know if you -use TinyXML. Hopefully you will enjoy it and find it useful. -Please post questions, comments, file bugs, or contact us at: - -www.sourceforge.net/projects/tinyxml - -Lee Thomason, Yves Berquin, Andrew Ellerton -*/ diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.cpp deleted file mode 100644 index b0e117d674..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -/* - * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. - */ - - -#ifndef TIXML_USE_STL - -#include "tinystr.h" - -// Error value for find primitive -const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); - - -// Null rep. -TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; - - -void TiXmlString::reserve (size_type cap) -{ - if (cap > capacity()) - { - TiXmlString tmp; - tmp.init(length(), cap); - memcpy(tmp.start(), data(), length()); - swap(tmp); - } -} - - -TiXmlString& TiXmlString::assign(const char* str, size_type len) -{ - size_type cap = capacity(); - if (len > cap || cap > 3*(len + 8)) - { - TiXmlString tmp; - tmp.init(len); - memcpy(tmp.start(), str, len); - swap(tmp); - } - else - { - memmove(start(), str, len); - set_size(len); - } - return *this; -} - - -TiXmlString& TiXmlString::append(const char* str, size_type len) -{ - size_type newsize = length() + len; - if (newsize > capacity()) - { - reserve (newsize + capacity()); - } - memmove(finish(), str, len); - set_size(newsize); - return *this; -} - - -TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) -{ - TiXmlString tmp; - tmp.reserve(a.length() + b.length()); - tmp += a; - tmp += b; - return tmp; -} - -TiXmlString operator + (const TiXmlString & a, const char* b) -{ - TiXmlString tmp; - TiXmlString::size_type b_len = static_cast( strlen(b) ); - tmp.reserve(a.length() + b_len); - tmp += a; - tmp.append(b, b_len); - return tmp; -} - -TiXmlString operator + (const char* a, const TiXmlString & b) -{ - TiXmlString tmp; - TiXmlString::size_type a_len = static_cast( strlen(a) ); - tmp.reserve(a_len + b.length()); - tmp.append(a, a_len); - tmp += b; - return tmp; -} - - -#endif // TIXML_USE_STL diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.h b/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.h deleted file mode 100644 index ab0cc81547..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinystr.h +++ /dev/null @@ -1,309 +0,0 @@ -// Modifications copyright Amazon.com, Inc. or its affiliates. - -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#include -#include - -/* The support for explicit isn't that universal, and it isn't really - required - it is used to check that the TiXmlString class isn't incorrectly - used. Be nice to old compilers and macro it here: -*/ -#if defined(_MSC_VER) - // Microsoft visual studio, version 6 and higher. - #define TIXML_EXPLICIT explicit -#elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - #define TIXML_EXPLICIT explicit -#else - #define TIXML_EXPLICIT -#endif - - -/* - TiXmlString is an emulation of a subset of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class TiXmlString -{ - public : - // The size type used - typedef size_t size_type; - - // Error value for find primitive - static const size_type npos; // = -1; - - - // TiXmlString empty constructor - TiXmlString () : rep_(&nullrep_) - { - } - - // TiXmlString copy constructor - TiXmlString ( const TiXmlString & copy) : rep_(0) - { - init(copy.length()); - memcpy(start(), copy.data(), length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) - { - init( static_cast( strlen(copy) )); - memcpy(start(), copy, length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) - { - init(len); - memcpy(start(), str, len); - } - - // TiXmlString destructor - ~TiXmlString () - { - quit(); - } - - // = operator - TiXmlString& operator = (const char * copy) - { - return assign( copy, (size_type)strlen(copy)); - } - - // = operator - TiXmlString& operator = (const TiXmlString & copy) - { - return assign(copy.start(), copy.length()); - } - - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - return append(suffix, static_cast( strlen(suffix) )); - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - return append(&single, 1); - } - - // += operator. Maps to append - TiXmlString& operator += (const TiXmlString & suffix) - { - return append(suffix.data(), suffix.length()); - } - - - // Convert a TiXmlString into a null-terminated char * - const char * c_str () const { return rep_->str; } - - // Convert a TiXmlString into a char * (need not be null terminated). - const char * data () const { return rep_->str; } - - // Return the length of a TiXmlString - size_type length () const { return rep_->size; } - - // Alias for length() - size_type size () const { return rep_->size; } - - // Checks if a TiXmlString is empty - bool empty () const { return rep_->size == 0; } - - // Return capacity of string - size_type capacity () const { return rep_->capacity; } - - - // single char extraction - const char& at (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // [] operator - char& operator [] (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // find a char in a string. Return TiXmlString::npos if not found - size_type find (char lookup) const - { - return find(lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::npos if not found - size_type find (char tofind, size_type offset) const - { - if (offset >= length()) return npos; - - for (const char* p = c_str() + offset; *p != '\0'; ++p) - { - if (*p == tofind) return static_cast< size_type >( p - c_str() ); - } - return npos; - } - - void clear () - { - //Lee: - //The original was just too strange, though correct: - // TiXmlString().swap(*this); - //Instead use the quit & re-init: - quit(); - init(0,0); - } - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function DOES NOT clear the content of the TiXmlString if any exists. - */ - void reserve (size_type cap); - - TiXmlString& assign (const char* str, size_type len); - - TiXmlString& append (const char* str, size_type len); - - void swap (TiXmlString& other) - { - Rep* r = rep_; - rep_ = other.rep_; - other.rep_ = r; - } - - private: - - void init(size_type sz) { init(sz, sz); } - void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } - char* start() const { return rep_->str; } - char* finish() const { return rep_->str + rep_->size; } - - struct Rep - { - size_type size, capacity; - char str[1]; - }; - - void init(size_type sz, size_type cap) - { - if (cap) - { - // Lee: the original form: - // rep_ = static_cast(operator new(sizeof(Rep) + cap)); - // doesn't work in some cases of new being overloaded. Switching - // to the normal allocation, although use an 'int' for systems - // that are overly picky about structure alignment. - const size_type bytesNeeded = sizeof(Rep) + cap; - const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); - rep_ = reinterpret_cast( new int[ intsNeeded ] ); - - rep_->str[ rep_->size = sz ] = '\0'; - rep_->capacity = cap; - } - else - { - rep_ = &nullrep_; - } - } - - void quit() - { - if (rep_ != &nullrep_) - { - // The rep_ is really an array of ints. (see the allocator, above). - // Cast it back before delete, so the compiler won't incorrectly call destructors. - delete [] ( reinterpret_cast( rep_ ) ); - } - } - - Rep * rep_; - static Rep nullrep_; - -} ; - - -inline bool operator == (const TiXmlString & a, const TiXmlString & b) -{ - return ( a.length() == b.length() ) // optimization on some platforms - && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare -} -inline bool operator < (const TiXmlString & a, const TiXmlString & b) -{ - return strcmp(a.c_str(), b.c_str()) < 0; -} - -inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } -inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } -inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } -inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } - -inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } -inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } -inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } -inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } - -TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); -TiXmlString operator + (const TiXmlString & a, const char* b); -TiXmlString operator + (const char* a, const TiXmlString & b); - - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class TiXmlOutStream : public TiXmlString -{ -public : - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const TiXmlString & in) - { - *this += in; - return *this; - } - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const char * in) - { - *this += in; - return *this; - } - -} ; - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.cpp b/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.cpp deleted file mode 100644 index 0915c669b3..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.cpp +++ /dev/null @@ -1,1889 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include - -#ifdef TIXML_USE_STL -#include -#include -#endif - -#include "tinyxml.h" - - -bool TiXmlBase::condenseWhiteSpace = true; - -// Microsoft compiler security -FILE* TiXmlFOpen( const char* filename, const char* mode ) -{ - #if defined(_MSC_VER) - FILE* fp = 0; - errno_t err = fopen_s( &fp, filename, mode ); - if ( !err && fp ) - return fp; - return 0; - #else - // Not using fopen_s() as it's not available in Mac or Linux - return fopen( filename, mode ); - #endif -} - -void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) -{ - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); - #else - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - #endif - - //*ME: warning C4267: convert 'size_t' to 'int' - //*ME: Int-Cast to make compiler happy ... - outString->append( buf, (int)strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } -} - - -TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() -{ - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; -} - - -TiXmlNode::~TiXmlNode() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } -} - - -void TiXmlNode::CopyTo( TiXmlNode* target ) const -{ - target->SetValue (value.c_str() ); - target->userData = userData; -} - - -void TiXmlNode::Clear() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } - - firstChild = 0; - lastChild = 0; -} - - -TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) -{ - assert( node->parent == 0 || node->parent == this ); - assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); - - if ( node->Type() == TiXmlNode::DOCUMENT ) - { - delete node; - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - node->parent = this; - - node->prev = lastChild; - node->next = 0; - - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. - - lastChild = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) -{ - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - - return LinkEndChild( node ); -} - - -TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) { - return 0; - } - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) -{ - if ( !afterThis || afterThis->parent != this ) { - return 0; - } - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; -} - - -TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) -{ - if ( replaceThis->parent != this ) - return 0; - - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; - - node->next = replaceThis->next; - node->prev = replaceThis->prev; - - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; - - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; - - delete replaceThis; - node->parent = this; - return node; -} - - -bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) -{ - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } - - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; - - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; - - delete removeThis; - return true; -} - -const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - - -const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - - -const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -void TiXmlElement::RemoveAttribute( const char * name ) -{ - #ifdef TIXML_USE_STL - TIXML_STRING str( name ); - TiXmlAttribute* node = attributeSet.Find( str ); - #else - TiXmlAttribute* node = attributeSet.Find( name ); - #endif - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } -} - -const TiXmlElement* TiXmlNode::FirstChildElement() const -{ - const TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::NextSiblingElement() const -{ - const TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlDocument* TiXmlNode::GetDocument() const -{ - const TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - - -TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} - - -#ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} -#endif - - -TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - copy.CopyTo( this ); -} - - -void TiXmlElement::operator=( const TiXmlElement& base ) -{ - ClearThis(); - base.CopyTo( this ); -} - - -TiXmlElement::~TiXmlElement() -{ - ClearThis(); -} - - -void TiXmlElement::ClearThis() -{ - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } -} - - -const char* TiXmlElement::Attribute( const char* name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - return node->Value(); - return 0; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - return &node->ValueStr(); - return 0; -} -#endif - - -const char* TiXmlElement::Attribute( const char* name, int* i ) const -{ - const char* s = Attribute( name ); - if ( i ) - { - if ( s ) { - *i = atoi( s ); - } - else { - *i = 0; - } - } - return s; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const -{ - const std::string* s = Attribute( name ); - if ( i ) - { - if ( s ) { - *i = atoi( s->c_str() ); - } - else { - *i = 0; - } - } - return s; -} -#endif - - -const char* TiXmlElement::Attribute( const char* name, double* d ) const -{ - const char* s = Attribute( name ); - if ( d ) - { - if ( s ) { - *d = atof( s ); - } - else { - *d = 0; - } - } - return s; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const -{ - const std::string* s = Attribute( name ); - if ( d ) - { - if ( s ) { - *d = atof( s->c_str() ); - } - else { - *d = 0; - } - } - return s; -} -#endif - - -int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryIntValue( ival ); -} - - -#ifdef TIXML_USE_STL -int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryIntValue( ival ); -} -#endif - - -int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryDoubleValue( dval ); -} - - -#ifdef TIXML_USE_STL -int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryDoubleValue( dval ); -} -#endif - - -void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%d", val ); - #else - sprintf( buf, "%d", val ); - #endif - SetAttribute( name, buf ); -} - - -#ifdef TIXML_USE_STL -void TiXmlElement::SetAttribute( const std::string& name, int val ) -{ - std::ostringstream oss; - oss << val; - SetAttribute( name, oss.str() ); -} -#endif - - -void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[256]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%f", val ); - #else - sprintf( buf, "%f", val ); - #endif - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) -{ - #ifdef TIXML_USE_STL - TIXML_STRING _name( cname ); - TIXML_STRING _value( cvalue ); - #else - const char* _name = cname; - const char* _value = cvalue; - #endif - - TiXmlAttribute* node = attributeSet.Find( _name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( cname, cvalue ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} - - -#ifdef TIXML_USE_STL -void TiXmlElement::SetAttribute( const std::string& name, const std::string& _value ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} -#endif - - -void TiXmlElement::Print( FILE* cfile, int depth ) const -{ - int i; - assert( cfile ); - for ( i=0; iNext() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a node - // 2) An element with only a text child is printed as text - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i", value.c_str() ); - } -} - - -void TiXmlElement::CopyTo( TiXmlElement* target ) const -{ - // superclass: - TiXmlNode::CopyTo( target ); - - // Element class: - // Clone the attributes, then clone the children. - const TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - -bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const -{ - if ( visitor->VisitEnter( *this, attributeSet.First() ) ) - { - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - if ( !node->Accept( visitor ) ) - break; - } - } - return visitor->VisitExit( *this ); -} - - -TiXmlNode* TiXmlElement::Clone() const -{ - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -const char* TiXmlElement::GetText() const -{ - const TiXmlNode* child = this->FirstChild(); - if ( child ) { - const TiXmlText* childText = child->ToText(); - if ( childText ) { - return childText->Value(); - } - } - return 0; -} - - -TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - ClearError(); -} - -TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - value = documentName; - ClearError(); -} - - -#ifdef TIXML_USE_STL -TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - value = documentName; - ClearError(); -} -#endif - - -TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDocument::operator=( const TiXmlDocument& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) -{ - // See STL_STRING_BUG below. - //StringToBuffer buf( value ); - - return LoadFile( Value(), encoding ); -} - - -bool TiXmlDocument::SaveFile() const -{ - // See STL_STRING_BUG below. -// StringToBuffer buf( value ); -// -// if ( buf.buffer && SaveFile( buf.buffer ) ) -// return true; -// -// return false; - return SaveFile( Value() ); -} - -bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) -{ - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // Add an extra string to avoid the crash. - TIXML_STRING filename( _filename ); - value = filename; - - // reading in binary mode so that tinyxml can normalize the EOL - FILE* file = TiXmlFOpen( value.c_str (), "rb" ); - - if ( file ) - { - bool result = LoadFile( file, encoding ); - fclose( file ); - return result; - } - else - { - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } -} - -bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) -{ - if ( !file ) - { - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - // Delete the existing data: - Clear(); - location.Clear(); - - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length <= 0 ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - // Subtle bug here. TinyXml did use fgets. But from the XML spec: - // 2.11 End-of-Line Handling - // - // - // ...the XML processor MUST behave as if it normalized all line breaks in external - // parsed entities (including the document entity) on input, before parsing, by translating - // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to - // a single #xA character. - // - // - // It is not clear fgets does that, and certainly isn't clear it works cross platform. - // Generally, you expect fgets to translate from the convention of the OS to the c/unix - // convention, and not work generally. - - /* - while( fgets( buf, sizeof(buf), file ) ) - { - data += buf; - } - */ - - char* buf = new char[ length+1 ]; - buf[0] = 0; - - if ( fread( buf, length, 1, file ) != 1 ) { - delete [] buf; - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - const char* lastPos = buf; - const char* p = buf; - - buf[length] = 0; - while( *p ) { - assert( p < (buf+length) ); - if ( *p == 0xa ) { - // Newline character. No special rules for this. Append all the characters - // since the last string, and include the newline. - data.append( lastPos, (p-lastPos+1) ); // append, include the newline - ++p; // move past the newline - lastPos = p; // and point to the new buffer (may be 0) - assert( p <= (buf+length) ); - } - else if ( *p == 0xd ) { - // Carriage return. Append what we have so far, then - // handle moving forward in the buffer. - if ( (p-lastPos) > 0 ) { - data.append( lastPos, p-lastPos ); // do not add the CR - } - data += (char)0xa; // a proper newline - - if ( *(p+1) == 0xa ) { - // Carriage return - new line sequence - p += 2; - lastPos = p; - assert( p <= (buf+length) ); - } - else { - // it was followed by something else...that is presumably characters again. - ++p; - lastPos = p; - assert( p <= (buf+length) ); - } - } - else { - ++p; - } - } - // Handle any left over characters. - if ( p-lastPos ) { - data.append( lastPos, p-lastPos ); - } - delete [] buf; - buf = 0; - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; -} - - -bool TiXmlDocument::SaveFile( const char * filename ) const -{ - // The old c stuff lives on... - FILE* fp = TiXmlFOpen( filename, "w" ); - if ( fp ) - { - bool result = SaveFile( fp ); - fclose( fp ); - return result; - } - return false; -} - - -bool TiXmlDocument::SaveFile( FILE* fp ) const -{ - if ( useMicrosoftBOM ) - { - const unsigned char TIXML_UTF_LEAD_0 = 0xefU; - const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; - const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - - fputc( TIXML_UTF_LEAD_0, fp ); - fputc( TIXML_UTF_LEAD_1, fp ); - fputc( TIXML_UTF_LEAD_2, fp ); - } - Print( fp, 0 ); - return (ferror(fp) == 0); -} - - -void TiXmlDocument::CopyTo( TiXmlDocument* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->error = error; - target->errorId = errorId; - target->errorDesc = errorDesc; - target->tabsize = tabsize; - target->errorLocation = errorLocation; - target->useMicrosoftBOM = useMicrosoftBOM; - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlDocument::Clone() const -{ - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlDocument::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } -} - - -bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const -{ - if ( visitor->VisitEnter( *this ) ) - { - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - if ( !node->Accept( visitor ) ) - break; - } - } - return visitor->VisitExit( *this ); -} - - -const TiXmlAttribute* TiXmlAttribute::Next() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -/* -TiXmlAttribute* TiXmlAttribute::Next() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} -*/ - -const TiXmlAttribute* TiXmlAttribute::Previous() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -/* -TiXmlAttribute* TiXmlAttribute::Previous() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} -*/ - -void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const -{ - TIXML_STRING n, v; - - EncodeString( name, &n ); - EncodeString( value, &v ); - - if (value.find ('\"') == TIXML_STRING::npos) { - if ( cfile ) { - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - } - if ( str ) { - (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; - } - } - else { - if ( cfile ) { - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); - } - if ( str ) { - (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; - } - } -} - - -int TiXmlAttribute::QueryIntValue( int* ival ) const -{ - if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -int TiXmlAttribute::QueryDoubleValue( double* dval ) const -{ - if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -void TiXmlAttribute::SetIntValue( int _value ) -{ - char buf [64]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); - #else - sprintf (buf, "%d", _value); - #endif - SetValue (buf); -} - -void TiXmlAttribute::SetDoubleValue( double _value ) -{ - char buf [256]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); - #else - sprintf (buf, "%lf", _value); - #endif - SetValue (buf); -} - -int TiXmlAttribute::IntValue() const -{ - return atoi (value.c_str ()); -} - -double TiXmlAttribute::DoubleValue() const -{ - return atof (value.c_str ()); -} - - -TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlComment::operator=( const TiXmlComment& base ) -{ - Clear(); - base.CopyTo( this ); -} - - -void TiXmlComment::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlComment::CopyTo( TiXmlComment* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlComment::Clone() const -{ - TiXmlComment* clone = new TiXmlComment(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlText::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - if ( cdata ) - { - int i; - fprintf( cfile, "\n" ); - for ( i=0; i\n", value.c_str() ); // unformatted output - } - else - { - TIXML_STRING buffer; - EncodeString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); - } -} - - -void TiXmlText::CopyTo( TiXmlText* target ) const -{ - TiXmlNode::CopyTo( target ); - target->cdata = cdata; -} - - -bool TiXmlText::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} - - -#ifdef TIXML_USE_STL -TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} -#endif - - -TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const -{ - if ( cfile ) fprintf( cfile, "" ); - if ( str ) (*str) += "?>"; -} - - -void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->version = version; - target->encoding = encoding; - target->standalone = standalone; -} - - -bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlUnknown::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlUnknown::Clone() const -{ - TiXmlUnknown* clone = new TiXmlUnknown(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlAttributeSet::TiXmlAttributeSet() -{ - sentinel.next = &sentinel; - sentinel.prev = &sentinel; -} - - -TiXmlAttributeSet::~TiXmlAttributeSet() -{ - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); -} - - -void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) -{ - #ifdef TIXML_USE_STL - assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. - #else - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - #endif - - addMe->next = &sentinel; - addMe->prev = sentinel.prev; - - sentinel.prev->next = addMe; - sentinel.prev = addMe; -} - -void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. -} - - -#ifdef TIXML_USE_STL -const TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const -{ - for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -/* -TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) -{ - for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} -*/ -#endif - - -const TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const -{ - for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( strcmp( node->name.c_str(), name ) == 0 ) - return node; - } - return 0; -} - -/* -TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) -{ - for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( strcmp( node->name.c_str(), name ) == 0 ) - return node; - } - return 0; -} -*/ - -#ifdef TIXML_USE_STL -std::istream& operator>> (std::istream & in, TiXmlNode & base) -{ - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); - - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; -} -#endif - - -#ifdef TIXML_USE_STL -std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) -{ - TiXmlPrinter printer; - printer.SetStreamPrinting(); - base.Accept( &printer ); - out << printer.Str(); - - return out; -} - - -std::string& operator<< (std::string& out, const TiXmlNode& base ) -{ - TiXmlPrinter printer; - printer.SetStreamPrinting(); - base.Accept( &printer ); - out.append( printer.Str() ); - - return out; -} -#endif - - -TiXmlHandle TiXmlHandle::FirstChild() const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement() const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && iNextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && iNextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && iNextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && iNextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) -{ - return true; -} - -bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) -{ - return true; -} - -bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) -{ - DoIndent(); - buffer += "<"; - buffer += element.Value(); - - for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) - { - buffer += " "; - attrib->Print( 0, 0, &buffer ); - } - - if ( !element.FirstChild() ) - { - buffer += " />"; - DoLineBreak(); - } - else - { - buffer += ">"; - if ( element.FirstChild()->ToText() - && element.LastChild() == element.FirstChild() - && element.FirstChild()->ToText()->CDATA() == false ) - { - simpleTextPrint = true; - // no DoLineBreak()! - } - else - { - DoLineBreak(); - } - } - ++depth; - return true; -} - - -bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) -{ - --depth; - if ( !element.FirstChild() ) - { - // nothing. - } - else - { - if ( simpleTextPrint ) - { - simpleTextPrint = false; - } - else - { - DoIndent(); - } - buffer += ""; - DoLineBreak(); - } - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlText& text ) -{ - if ( text.CDATA() ) - { - DoIndent(); - buffer += ""; - DoLineBreak(); - } - else if ( simpleTextPrint ) - { - TIXML_STRING str; - TiXmlBase::EncodeString( text.ValueTStr(), &str ); - buffer += str; - } - else - { - DoIndent(); - TIXML_STRING str; - TiXmlBase::EncodeString( text.ValueTStr(), &str ); - buffer += str; - DoLineBreak(); - } - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) -{ - DoIndent(); - declaration.Print( 0, 0, &buffer ); - DoLineBreak(); - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlComment& comment ) -{ - DoIndent(); - buffer += ""; - DoLineBreak(); - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) -{ - DoIndent(); - buffer += "<"; - buffer += unknown.Value(); - buffer += ">"; - DoLineBreak(); - return true; -} - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.h b/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.h deleted file mode 100644 index c230c02afb..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/External/tinyxml/tinyxml.h +++ /dev/null @@ -1,1785 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#ifdef TIXML_USE_STL - #include - #include - #include - #define TIXML_STRING std::string -#else - #include "tinystr.h" - #define TIXML_STRING TiXmlString -#endif - -// Deprecated library function hell. Compilers want to use the -// new safe versions. This probably doesn't fully address the problem, -// but it gets closer. There are too many compilers for me to fully -// test. If you get compilation troubles, undefine TIXML_SAFE -#define TIXML_SAFE - -#ifdef TIXML_SAFE - #if defined(_MSC_VER) - // Microsoft visual studio, version 2005 and higher. - #define TIXML_SNPRINTF _snprintf_s - #define TIXML_SNSCANF _snscanf_s - #define TIXML_SSCANF sscanf_s - #elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - //#warning( "Using sn* functions." ) - #define TIXML_SNPRINTF snprintf - #define TIXML_SNSCANF snscanf - #define TIXML_SSCANF sscanf - #else - #define TIXML_SSCANF sscanf - #endif -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 5; -const int TIXML_PATCH_VERSION = 3; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -/** - If you call the Accept() method, it requires being passed a TiXmlVisitor - class to handle callbacks. For nodes that contain other nodes (Document, Element) - you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves - are simple called with Visit(). - - If you return 'true' from a Visit method, recursive parsing will continue. If you return - false, no children of this node or its sibilings will be Visited. - - All flavors of Visit methods have a default implementation that returns 'true' (continue - visiting). You need to only override methods that are interesting to you. - - Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. - - You should never change the document from a callback. - - @sa TiXmlNode::Accept() -*/ -class TiXmlVisitor -{ -public: - virtual ~TiXmlVisitor() {} - - /// Visit a document. - virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } - /// Visit a document. - virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } - - /// Visit an element. - virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } - /// Visit an element. - virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } - - /// Visit a declaration - virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } - /// Visit a text node - virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } - /// Visit a comment node - virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } - /// Visit an unknow node - virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } -}; - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream - or the string class (TiXmlString in non-STL mode, std::string - in STL mode.) Either or both cfile and str can be null. - - This is a formatted print, and will insert - tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - value is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. - void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. - const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, - or they will be transformed into entities! - */ - static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - TIXML_ERROR_PARSING_CDATA, - TIXML_ERROR_DOCUMENT_TOP_ONLY, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - inline static bool IsWhiteSpace( int c ) - { - if ( c < 256 ) - return IsWhiteSpace( (char) c ); - return false; // Again, only truly correct for English/Latin...but usually works. - } - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); - static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((const unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), - // and the null terminator isn't needed - for( int i=0; p[i] && i<*length; ++i ) { - _value[i] = p[i]; - } - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to English words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char *Value() const { return value.c_str (); } - - #ifdef TIXML_USE_STL - /** Return Value() as a std::string. If you only use STL, - this is more efficient than calling Value(). - Only available in STL mode. - */ - const std::string& ValueStr() const { return value; } - #endif - - const TIXML_STRING& ValueTStr() const { return value; } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - /// The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * _value ) { - // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) - // call the method, cast the return back to non-const. - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); - } - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * _value ) { - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); - } - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char *_prev ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char* _next ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char *_next ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); - } - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * _value ) const; - TiXmlElement* FirstChildElement( const char * _value ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument() { - return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); - } - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - - /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the - XML tree will be conditionally visited and the host will be called back - via the TiXmlVisitor interface. - - This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse - the XML for the callbacks, so the performance of TinyXML is unchanged by using this - interface versus any other.) - - The interface has been based on ideas from: - - - http://www.saxproject.org/ - - http://c2.com/cgi/wiki?HierarchicalVisitorPattern - - Which are both good references for "visiting". - - An example of using Accept(): - @verbatim - TiXmlPrinter printer; - tinyxmlDoc.Accept( &printer ); - const char* xmlcstr = printer.CStr(); - @endverbatim - */ - virtual bool Accept( TiXmlVisitor* visitor ) const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. - #ifdef TIXML_USE_STL - const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. - #endif - int IntValue() const; ///< Return the value of this attribute, converted to an integer. - double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - // Get the tinyxml string representation - const TIXML_STRING& NameTStr() const { return name; } - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* _value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* _value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int _value ); ///< Set the value from an integer. - void SetDoubleValue( double _value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) { name = _name; } - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); - } - - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); - } - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - const TiXmlAttribute* Find( const char* _name ) const; - TiXmlAttribute* Find( const char* _name ) { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); - } - #ifdef TIXML_USE_STL - const TiXmlAttribute* Find( const std::string& _name ) const; - TiXmlAttribute* Find( const std::string& _name ) { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); - } - - #endif - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - int QueryIntAttribute( const char* name, int* _value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* _value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryFloatAttribute( const char* name, float* _value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - if ( result == TIXML_SUCCESS ) { - *_value = (float)d; - } - return result; - } - - #ifdef TIXML_USE_STL - /** Template form of the attribute query which will try to read the - attribute into the specified type. Very easy, very powerful, but - be careful to make sure to call this with the correct type. - - NOTE: This method doesn't work correctly for 'string' types. - - @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE - */ - template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - std::stringstream sstream( node->ValueStr() ); - sstream >> *outValue; - if ( !sstream.fail() ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; - } - /* - This is - in theory - a bug fix for "QueryValueAtribute returns truncated std::string" - but template specialization is hard to get working cross-compiler. Leaving the bug for now. - - // The above will fail for std::string because the space character is used as a seperator. - // Specialize for strings. Bug [ 1695429 ] QueryValueAtribute returns truncated std::string - template<> int QueryValueAttribute( const std::string& name, std::string* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - *outValue = node->ValueStr(); - return TIXML_SUCCESS; - } - */ - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * _value ); - - #ifdef TIXML_USE_STL - const std::string* Attribute( const std::string& name ) const; - const std::string* Attribute( const std::string& name, int* i ) const; - const std::string* Attribute( const std::string& name, double* d ) const; - int QueryIntAttribute( const std::string& name, int* _value ) const; - int QueryDoubleAttribute( const std::string& name, double* _value ) const; - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ); - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ); - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /** Convenience function for easy access to the text inside an element. Although easy - and concise, GetText() is limited compared to getting the TiXmlText child - and accessing it directly. - - If the first child of 'this' is a TiXmlText, the GetText() - returns the character string of the Text node, else null is returned. - - This is a convenient method for getting the text of simple contained text: - @verbatim - This is text - const char* str = fooElement->GetText(); - @endverbatim - - 'str' will be a pointer to "This is text". - - Note that this function can be misleading. If the element foo was created from - this XML: - @verbatim - This is text - @endverbatim - - then the value of str would be null. The first child node isn't a text node, it is - another element. From this XML: - @verbatim - This is text - @endverbatim - GetText() will return "This is ". - - WARNING: GetText() accesses a child node - don't become confused with the - similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are - safe type casts on the referenced node. - */ - const char* GetText() const; - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} - /// Construct a comment from text. - TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) { - SetValue( _value ); - } - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - // Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif -// virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. A text node can have 2 ways to output the next. "normal" output - and CDATA. It will default to the mode it was parsed from the XML file and - you generally want to leave it alone, but you can change the output mode with - SetCDATA() and query it with CDATA(). -*/ -class TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /** Constructor for text element. By default, it is treated as - normal, encoded text. If you want it be output as a CDATA text - element, set the parameter _cdata to 'true' - */ - TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - cdata = false; - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - cdata = false; - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - - // Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /// Queries whether this represents text using a CDATA section. - bool CDATA() const { return cdata; } - /// Turns on or off a CDATA representation of text. - void SetCDATA( bool _cdata ) { cdata = _cdata; } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - bool cdata; // true if this should be input and output as a CDATA style text element -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - // Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - // Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - /** Load a file using the given FILE*. Returns true if successful. Note that this method - doesn't stream - the entire object pointed at by the FILE* - will be interpreted as an XML file. TinyXML doesn't stream in XML from the current - file location. Streaming may be added in the future. - */ - bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given FILE*. Returns true if successful. - bool SaveFile( FILE* ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { -// StringToBuffer f( filename ); -// return ( f.buffer && LoadFile( f.buffer, encoding )); - return LoadFile( filename.c_str(), encoding ); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { -// StringToBuffer f( filename ); -// return ( f.buffer && SaveFile( f.buffer )); - return SaveFile( filename.c_str() ); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() const { return errorLocation.row+1; } - int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) - to report the correct values for row and column. It does not change the output - or input in any way. - - By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Write the document to standard out using formatted printing ("pretty print"). */ - void Print() const { Print( stdout, 0 ); } - - /* Write the document to a string using formatted printing ("pretty print"). This - will allocate a character array (new char[]) and return it as a pointer. The - calling code pust call delete[] on the return char* to avoid a memory leak. - */ - //char* PrintToMemory() const; - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - - virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; - bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /** Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* ToNode() const { return node; } - /** Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /** Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /** Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - - /** @deprecated use ToNode. - Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* Node() const { return ToNode(); } - /** @deprecated use ToElement. - Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* Element() const { return ToElement(); } - /** @deprecated use ToText() - Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* Text() const { return ToText(); } - /** @deprecated use ToUnknown() - Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* Unknown() const { return ToUnknown(); } - -private: - TiXmlNode* node; -}; - - -/** Print to memory functionality. The TiXmlPrinter is useful when you need to: - - -# Print to memory (especially in non-STL mode) - -# Control formatting (line endings, etc.) - - When constructed, the TiXmlPrinter is in its default "pretty printing" mode. - Before calling Accept() you can call methods to control the printing - of the XML document. After TiXmlNode::Accept() is called, the printed document can - be accessed via the CStr(), Str(), and Size() methods. - - TiXmlPrinter uses the Visitor API. - @verbatim - TiXmlPrinter printer; - printer.SetIndent( "\t" ); - - doc.Accept( &printer ); - fprintf( stdout, "%s", printer.CStr() ); - @endverbatim -*/ -class TiXmlPrinter : public TiXmlVisitor -{ -public: - TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), - buffer(), indent( " " ), lineBreak( "\n" ) {} - - virtual bool VisitEnter( const TiXmlDocument& doc ); - virtual bool VisitExit( const TiXmlDocument& doc ); - - virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); - virtual bool VisitExit( const TiXmlElement& element ); - - virtual bool Visit( const TiXmlDeclaration& declaration ); - virtual bool Visit( const TiXmlText& text ); - virtual bool Visit( const TiXmlComment& comment ); - virtual bool Visit( const TiXmlUnknown& unknown ); - - /** Set the indent characters for printing. By default 4 spaces - but tab (\t) is also useful, or null/empty string for no indentation. - */ - void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } - /// Query the indention string. - const char* Indent() { return indent.c_str(); } - /** Set the line breaking string. By default set to newline (\n). - Some operating systems prefer other characters, or can be - set to the null/empty string for no indenation. - */ - void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } - /// Query the current line breaking string. - const char* LineBreak() { return lineBreak.c_str(); } - - /** Switch over to "stream printing" which is the most dense formatting without - linebreaks. Common when the XML is needed for network transmission. - */ - void SetStreamPrinting() { indent = ""; - lineBreak = ""; - } - /// Return the result. - const char* CStr() { return buffer.c_str(); } - /// Return the length of the result string. - size_t Size() { return buffer.size(); } - - #ifdef TIXML_USE_STL - /// Return the result. - const std::string& Str() { return buffer; } - #endif - -private: - void DoIndent() { - for( int i=0; i -#include - -#include "tinyxml.h" - -//#define DEBUG_PARSER -#if defined( DEBUG_PARSER ) -# if defined( DEBUG ) && defined( _MSC_VER ) -# include -# define TIXML_LOG OutputDebugString -# else -# define TIXML_LOG printf -# endif -#endif - -// Note tha "PutString" hardcodes the same list. This -// is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = -{ - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } -}; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// Including the basic of this table, which determines the #bytes in the -// sequence from the lead byte. 1 placed for invalid sequences -- -// although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: -// ef bb bf (Microsoft "lead bytes") -// ef bf be -// ef bf bf - -const unsigned char TIXML_UTF_LEAD_0 = 0xefU; -const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; -const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - -const int TiXmlBase::utf8ByteTable[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid -}; - - -void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { *length = 0; return; } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } -} - - -/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalpha( anyByte ); -// } -} - - -/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalnum( anyByte ); -// } -} - - -class TiXmlParsingData -{ - friend class TiXmlDocument; - public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() { return cursor; } - - private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; -}; - - -void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) -{ - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Treat p as unsigned, so we have a happy compiler. - const unsigned char* pU = (const unsigned char*)p; - - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*pU) { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case TIXML_UTF_LEAD_0: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) - p += 3; - else - { p +=3; ++col; } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); -} - - -const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) -{ - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - const unsigned char* pU = (const unsigned char*)p; - - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==TIXML_UTF_LEAD_1 - && *(pU+2)==TIXML_UTF_LEAD_2 ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbeU ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbfU ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; -} - -#ifdef TIXML_USE_STL -/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) -{ - for( ;; ) - { - if ( !in->good() ) return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get(); - } -} - -/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) -{ - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get(); - *tag += (char) c; - } - return false; -} -#endif - -// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The -// "assign" optimization removes over 10% of the execution time. -// -const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) -{ - // Oddly, not supported on some comilers, - //name->clear(); - // So use this: - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - const char* start = p; - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - //(*name) += *p; // expensive - ++p; - } - if ( p-start > 0 ) { - name->assign( start, p-start ); - } - return p; - } - return 0; -} - -const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) -{ - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - ptrdiff_t delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; iappend( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - if ( p ) - p += strlen( endTag ); - return p; -} - -#ifdef TIXML_USE_STL - -void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get(); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); -} - -#endif - -const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) -{ - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - const unsigned char* pU = (const unsigned char*)p; - if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 - && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 - && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) - { - encoding = TIXML_ENCODING_UTF8; - useMicrosoftBOM = true; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } - - p = SkipWhiteSpace( p, encoding ); - } - - // Was this empty? - if ( !firstChild ) { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); - return 0; - } - - // All is well. - return p; -} - -void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } -} - - -TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) -{ - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: "; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - - // [ 1475201 ] TinyXML parses entities in comments - // Oops - ReadText doesn't work, because we don't want to parse the entities. - // p = ReadText( p, &value, false, endTag, false, encoding ); - // - // from the XML spec: - /* - [Definition: Comments may appear anywhere in a document outside other markup; in addition, - they may appear within the document type declaration at places allowed by the grammar. - They are not part of the document's character data; an XML processor MAY, but need not, - make it possible for an application to retrieve the text of comments. For compatibility, - the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity - references MUST NOT be recognized within comments. - - An example of a comment: - - - */ - - value = ""; - // Keep all the white space. - while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) - { - value.append( p, 1 ); - ++p; - } - if ( p ) - p += strlen( endTag ); - - return p; -} - - -const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) return 0; - -// int tabsize = 4; -// if ( document ) -// tabsize = document->TabSize(); - - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - const char SINGLE_QUOTE = '\''; - const char DOUBLE_QUOTE = '\"'; - - if ( *p == SINGLE_QUOTE ) - { - ++p; - end = "\'"; // single quote in string - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == DOUBLE_QUOTE ) - { - ++p; - end = "\""; // double quote in string - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { - // [ 1451649 ] Attribute values with trailing quotes not handled correctly - // We did not have an opening quote but seem to have a - // closing one. Give up and throw an error. - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - value += *p; - ++p; - } - } - return p; -} - -#ifdef TIXML_USE_STL -void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->peek(); - if ( !cdata && (c == '<' ) ) - { - return; - } - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get(); // "commits" the peek made above - - if ( cdata && c == '>' && tag->size() >= 3 ) { - size_t len = tag->size(); - if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { - // terminator of cdata. - return; - } - } - } -} -#endif - -const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - value = ""; - TiXmlDocument* document = GetDocument(); - - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - - const char* const startTag = ""; - - if ( cdata || StringEqual( p, startTag, false, encoding ) ) - { - cdata = true; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - - // Keep all the white space, ignore the encoding, etc. - while ( p && *p - && !StringEqual( p, endTag, false, encoding ) - ) - { - value += *p; - ++p; - } - - TIXML_STRING dummy; - p = ReadText( p, &dummy, false, endTag, false, encoding ); - return p; - } - else - { - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; - } -} - -#ifdef TIXML_USE_STL -void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->get(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } -} -#endif - -const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) -{ - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; -} - -bool TiXmlText::Blank() const -{ - for ( unsigned i=0; i - #include -using namespace std; -#else - #include -#endif - -#if defined(WIN32) && defined(TUNE) - #include -_CrtMemState startMemState; -_CrtMemState endMemState; -#endif - -#include "tinyxml.h" - -static int gPass = 0; -static int gFail = 0; - - -bool XmlTest (const char* testString, const char* expected, const char* found, bool noEcho = false) -{ - bool pass = !strcmp(expected, found); - if (pass) - { - printf ("[pass]"); - } - else - { - printf ("[fail]"); - } - - if (noEcho) - { - printf (" %s\n", testString); - } - else - { - printf (" %s [%s][%s]\n", testString, expected, found); - } - - if (pass) - { - ++gPass; - } - else - { - ++gFail; - } - return pass; -} - - -bool XmlTest(const char* testString, int expected, int found, bool noEcho = false) -{ - bool pass = (expected == found); - if (pass) - { - printf ("[pass]"); - } - else - { - printf ("[fail]"); - } - - if (noEcho) - { - printf (" %s\n", testString); - } - else - { - printf (" %s [%d][%d]\n", testString, expected, found); - } - - if (pass) - { - ++gPass; - } - else - { - ++gFail; - } - return pass; -} - - -// -// This file demonstrates some basic functionality of TinyXml. -// Note that the example is very contrived. It presumes you know -// what is in the XML file. But it does test the basic operations, -// and show how to add and remove nodes. -// - -int main() -{ - // - // We start with the 'demoStart' todo list. Process it. And - // should hopefully end up with the todo list as illustrated. - // - const char* demoStart = - "\n" - "" - "\n" - "\n" - " Go to the Toy store!" - " Do bills " - " Look for Evil Dinosaurs! " - ""; - - { - #ifdef TIXML_USE_STL - /* What the todo list should look like after processing. - In stream (no formatting) representation. */ - const char* demoEnd = - "" - "" - "" - "" - "Go to the" - "Toy store!" - "" - "" - "Talk to:" - "" - "" - "" - "" - "" - "" - "Do bills" - "" - ""; - #endif - - // The example parses from the character string (above): - #if defined(WIN32) && defined(TUNE) - _CrtMemCheckpoint(&startMemState); - #endif - - { - // Write to a file and read it back, to check file I/O. - - TiXmlDocument doc("demotest.xml"); - doc.Parse(demoStart); - - if (doc.Error()) - { - printf("Error in %s: %s\n", doc.Value(), doc.ErrorDesc()); - exit(1); - } - doc.SaveFile(); - } - - TiXmlDocument doc("demotest.xml"); - bool loadOkay = doc.LoadFile(); - - if (!loadOkay) - { - printf("Could not load test file 'demotest.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc()); - exit(1); - } - - printf("** Demo doc read from disk: ** \n\n"); - printf("** Printing via doc.Print **\n"); - doc.Print(stdout); - - { - printf("** Printing via TiXmlPrinter **\n"); - TiXmlPrinter printer; - doc.Accept(&printer); - fprintf(stdout, "%s", printer.CStr()); - } - #ifdef TIXML_USE_STL - { - printf("** Printing via operator<< **\n"); - std::cout << doc; - } - #endif - TiXmlNode* node = 0; - TiXmlElement* todoElement = 0; - TiXmlElement* itemElement = 0; - - - // -------------------------------------------------------- - // An example of changing existing attributes, and removing - // an element from the document. - // -------------------------------------------------------- - - // Get the "ToDo" element. - // It is a child of the document, and can be selected by name. - node = doc.FirstChild("ToDo"); - assert(node); - todoElement = node->ToElement(); - assert(todoElement); - - // Going to the toy store is now our second priority... - // So set the "priority" attribute of the first item in the list. - node = todoElement->FirstChildElement(); // This skips the "PDA" comment. - assert(node); - itemElement = node->ToElement(); - assert(itemElement); - itemElement->SetAttribute("priority", 2); - - // Change the distance to "doing bills" from - // "none" to "here". It's the next sibling element. - itemElement = itemElement->NextSiblingElement(); - assert(itemElement); - itemElement->SetAttribute("distance", "here"); - - // Remove the "Look for Evil Dinosaurs!" item. - // It is 1 more sibling away. We ask the parent to remove - // a particular child. - itemElement = itemElement->NextSiblingElement(); - todoElement->RemoveChild(itemElement); - - itemElement = 0; - - // -------------------------------------------------------- - // What follows is an example of created elements and text - // nodes and adding them to the document. - // -------------------------------------------------------- - - // Add some meetings. - TiXmlElement item("Item"); - item.SetAttribute("priority", "1"); - item.SetAttribute("distance", "far"); - - TiXmlText text("Talk to:"); - - TiXmlElement meeting1("Meeting"); - meeting1.SetAttribute("where", "School"); - - TiXmlElement meeting2("Meeting"); - meeting2.SetAttribute("where", "Lunch"); - - TiXmlElement attendee1("Attendee"); - attendee1.SetAttribute("name", "Marple"); - attendee1.SetAttribute("position", "teacher"); - - TiXmlElement attendee2("Attendee"); - attendee2.SetAttribute("name", "Voel"); - attendee2.SetAttribute("position", "counselor"); - - // Assemble the nodes we've created: - meeting1.InsertEndChild(attendee1); - meeting1.InsertEndChild(attendee2); - - item.InsertEndChild(text); - item.InsertEndChild(meeting1); - item.InsertEndChild(meeting2); - - // And add the node to the existing list after the first child. - node = todoElement->FirstChild("Item"); - assert(node); - itemElement = node->ToElement(); - assert(itemElement); - - todoElement->InsertAfterChild(itemElement, item); - - printf("\n** Demo doc processed: ** \n\n"); - doc.Print(stdout); - - - #ifdef TIXML_USE_STL - printf("** Demo doc processed to stream: ** \n\n"); - cout << doc << endl << endl; - #endif - - // -------------------------------------------------------- - // Different tests...do we have what we expect? - // -------------------------------------------------------- - - int count = 0; - TiXmlElement* element; - - ////////////////////////////////////////////////////// - - #ifdef TIXML_USE_STL - cout << "** Basic structure. **\n"; - ostringstream outputStream(ostringstream::out); - outputStream << doc; - XmlTest("Output stream correct.", string(demoEnd).c_str(), - outputStream.str().c_str(), true); - #endif - - node = doc.RootElement(); - assert(node); - XmlTest("Root element exists.", true, (node != 0 && node->ToElement())); - XmlTest ("Root element value is 'ToDo'.", "ToDo", node->Value()); - - node = node->FirstChild(); - XmlTest("First child exists & is a comment.", true, (node != 0 && node->ToComment())); - node = node->NextSibling(); - XmlTest("Sibling element exists & is an element.", true, (node != 0 && node->ToElement())); - XmlTest ("Value is 'Item'.", "Item", node->Value()); - - node = node->FirstChild(); - XmlTest ("First child exists.", true, (node != 0 && node->ToText())); - XmlTest ("Value is 'Go to the'.", "Go to the", node->Value()); - - - ////////////////////////////////////////////////////// - printf ("\n** Iterators. **\n"); - - // Walk all the top level nodes of the document. - count = 0; - for (node = doc.FirstChild(); - node; - node = node->NextSibling()) - { - count++; - } - XmlTest("Top level nodes, using First / Next.", 3, count); - - count = 0; - for (node = doc.LastChild(); - node; - node = node->PreviousSibling()) - { - count++; - } - XmlTest("Top level nodes, using Last / Previous.", 3, count); - - // Walk all the top level nodes of the document, - // using a different syntax. - count = 0; - for (node = doc.IterateChildren(0); - node; - node = doc.IterateChildren(node)) - { - count++; - } - XmlTest("Top level nodes, using IterateChildren.", 3, count); - - // Walk all the elements in a node. - count = 0; - for (element = todoElement->FirstChildElement(); - element; - element = element->NextSiblingElement()) - { - count++; - } - XmlTest("Children of the 'ToDo' element, using First / Next.", - 3, count); - - // Walk all the elements in a node by value. - count = 0; - for (node = todoElement->FirstChild("Item"); - node; - node = node->NextSibling("Item")) - { - count++; - } - XmlTest("'Item' children of the 'ToDo' element, using First/Next.", 3, count); - - count = 0; - for (node = todoElement->LastChild("Item"); - node; - node = node->PreviousSibling("Item")) - { - count++; - } - XmlTest("'Item' children of the 'ToDo' element, using Last/Previous.", 3, count); - - #ifdef TIXML_USE_STL - { - cout << "\n** Parsing. **\n"; - istringstream parse0(""); - TiXmlElement element0("default"); - parse0 >> element0; - - XmlTest ("Element parsed, value is 'Element0'.", "Element0", element0.Value()); - XmlTest ("Reads attribute 'attribute0=\"foo0\"'.", "foo0", element0.Attribute("attribute0")); - XmlTest ("Reads incorrectly formatted 'attribute1=noquotes'.", "noquotes", element0.Attribute("attribute1")); - XmlTest ("Read attribute with entity value '>'.", ">", element0.Attribute("attribute2")); - } - #endif - - { - const char* error = "\n" - "\n" - " \n" - ""; - - TiXmlDocument docTest; - docTest.Parse(error); - XmlTest("Error row", docTest.ErrorRow(), 3); - XmlTest("Error column", docTest.ErrorCol(), 17); - //printf( "error=%d id='%s' row %d col%d\n", (int) doc.Error(), doc.ErrorDesc(), doc.ErrorRow()+1, doc.ErrorCol() + 1 ); - } - - #ifdef TIXML_USE_STL - { - ////////////////////////////////////////////////////// - cout << "\n** Streaming. **\n"; - - // Round trip check: stream in, then stream back out to verify. The stream - // out has already been checked, above. We use the output - - istringstream inputStringStream(outputStream.str()); - TiXmlDocument document0; - - inputStringStream >> document0; - - ostringstream outputStream0(ostringstream::out); - outputStream0 << document0; - - XmlTest("Stream round trip correct.", string(demoEnd).c_str(), - outputStream0.str().c_str(), true); - - std::string str; - str << document0; - - XmlTest("String printing correct.", string(demoEnd).c_str(), - str.c_str(), true); - } - #endif - } - - { - const char* str = ""; - - TiXmlDocument doc; - doc.Parse(str); - - TiXmlElement* ele = doc.FirstChildElement(); - - int iVal, result; - double dVal; - - result = ele->QueryDoubleAttribute("attr0", &dVal); - XmlTest("Query attribute: int as double", result, TIXML_SUCCESS); - XmlTest("Query attribute: int as double", (int)dVal, 1); - result = ele->QueryDoubleAttribute("attr1", &dVal); - XmlTest("Query attribute: double as double", (int)dVal, 2); - result = ele->QueryIntAttribute("attr1", &iVal); - XmlTest("Query attribute: double as int", result, TIXML_SUCCESS); - XmlTest("Query attribute: double as int", iVal, 2); - result = ele->QueryIntAttribute("attr2", &iVal); - XmlTest("Query attribute: not a number", result, TIXML_WRONG_TYPE); - result = ele->QueryIntAttribute("bar", &iVal); - XmlTest("Query attribute: does not exist", result, TIXML_NO_ATTRIBUTE); - } - - { - const char* str = "\t\t\n" - ""; - - TiXmlDocument doc; - doc.SetTabSize(8); - doc.Parse(str); - - TiXmlHandle docHandle(&doc); - TiXmlHandle roomHandle = docHandle.FirstChildElement("room"); - - assert(docHandle.Node()); - assert(roomHandle.Element()); - - TiXmlElement* room = roomHandle.Element(); - assert(room); - TiXmlAttribute* doors = room->FirstAttribute(); - assert(doors); - - XmlTest("Location tracking: Tab 8: room row", room->Row(), 1); - XmlTest("Location tracking: Tab 8: room col", room->Column(), 49); - XmlTest("Location tracking: Tab 8: doors row", doors->Row(), 1); - XmlTest("Location tracking: Tab 8: doors col", doors->Column(), 55); - } - - { - const char* str = "\t\t\n" - " \n" - " A great door!\n" - "\t" - ""; - - TiXmlDocument doc; - doc.Parse(str); - - TiXmlHandle docHandle(&doc); - TiXmlHandle roomHandle = docHandle.FirstChildElement("room"); - TiXmlHandle commentHandle = docHandle.FirstChildElement("room").FirstChild(); - TiXmlHandle textHandle = docHandle.FirstChildElement("room").ChildElement("door", 0).FirstChild(); - TiXmlHandle door0Handle = docHandle.FirstChildElement("room").ChildElement(0); - TiXmlHandle door1Handle = docHandle.FirstChildElement("room").ChildElement(1); - - assert(docHandle.Node()); - assert(roomHandle.Element()); - assert(commentHandle.Node()); - assert(textHandle.Text()); - assert(door0Handle.Element()); - assert(door1Handle.Element()); - - TiXmlDeclaration* declaration = doc.FirstChild()->ToDeclaration(); - assert(declaration); - TiXmlElement* room = roomHandle.Element(); - assert(room); - TiXmlAttribute* doors = room->FirstAttribute(); - assert(doors); - TiXmlText* text = textHandle.Text(); - TiXmlComment* comment = commentHandle.Node()->ToComment(); - assert(comment); - TiXmlElement* door0 = door0Handle.Element(); - TiXmlElement* door1 = door1Handle.Element(); - - XmlTest("Location tracking: Declaration row", declaration->Row(), 1); - XmlTest("Location tracking: Declaration col", declaration->Column(), 5); - XmlTest("Location tracking: room row", room->Row(), 1); - XmlTest("Location tracking: room col", room->Column(), 45); - XmlTest("Location tracking: doors row", doors->Row(), 1); - XmlTest("Location tracking: doors col", doors->Column(), 51); - XmlTest("Location tracking: Comment row", comment->Row(), 2); - XmlTest("Location tracking: Comment col", comment->Column(), 3); - XmlTest("Location tracking: text row", text->Row(), 3); - XmlTest("Location tracking: text col", text->Column(), 24); - XmlTest("Location tracking: door0 row", door0->Row(), 3); - XmlTest("Location tracking: door0 col", door0->Column(), 5); - XmlTest("Location tracking: door1 row", door1->Row(), 4); - XmlTest("Location tracking: door1 col", door1->Column(), 5); - } - - - // -------------------------------------------------------- - // UTF-8 testing. It is important to test: - // 1. Making sure name, value, and text read correctly - // 2. Row, Col functionality - // 3. Correct output - // -------------------------------------------------------- - printf ("\n** UTF-8 **\n"); - { - TiXmlDocument doc("utf8test.xml"); - doc.LoadFile(); - if (doc.Error() && doc.ErrorId() == TiXmlBase::TIXML_ERROR_OPENING_FILE) - { - printf("WARNING: File 'utf8test.xml' not found.\n" - "(Are you running the test from the wrong directory?)\n" - "Could not test UTF-8 functionality.\n"); - } - else - { - TiXmlHandle docH(&doc); - // Get the attribute "value" from the "Russian" element and check it. - TiXmlElement* element = docH.FirstChildElement("document").FirstChildElement("Russian").Element(); - const unsigned char correctValue[] = { - 0xd1U, 0x86U, 0xd0U, 0xb5U, 0xd0U, 0xbdU, 0xd0U, 0xbdU, - 0xd0U, 0xbeU, 0xd1U, 0x81U, 0xd1U, 0x82U, 0xd1U, 0x8cU, 0 - }; - - XmlTest("UTF-8: Russian value.", (const char*)correctValue, element->Attribute("value"), true); - XmlTest("UTF-8: Russian value row.", 4, element->Row()); - XmlTest("UTF-8: Russian value column.", 5, element->Column()); - - const unsigned char russianElementName[] = { - 0xd0U, 0xa0U, 0xd1U, 0x83U, - 0xd1U, 0x81U, 0xd1U, 0x81U, - 0xd0U, 0xbaU, 0xd0U, 0xb8U, - 0xd0U, 0xb9U, 0 - }; - const char russianText[] = "<\xD0\xB8\xD0\xBC\xD0\xB5\xD0\xB5\xD1\x82>"; - - TiXmlText* text = docH.FirstChildElement("document").FirstChildElement((const char*) russianElementName).Child(0).Text(); - XmlTest("UTF-8: Browsing russian element name.", - russianText, - text->Value(), - true); - XmlTest("UTF-8: Russian element name row.", 7, text->Row()); - XmlTest("UTF-8: Russian element name column.", 47, text->Column()); - - TiXmlDeclaration* dec = docH.Child(0).Node()->ToDeclaration(); - XmlTest("UTF-8: Declaration column.", 1, dec->Column()); - XmlTest("UTF-8: Document column.", 1, doc.Column()); - - // Now try for a round trip. - doc.SaveFile("utf8testout.xml"); - - // Check the round trip. - char savedBuf[256]; - char verifyBuf[256]; - int okay = 1; - - FILE* saved = fopen("utf8testout.xml", "r"); - FILE* verify = fopen("utf8testverify.xml", "r"); - if (saved && verify) - { - while (fgets(verifyBuf, 256, verify)) - { - fgets(savedBuf, 256, saved); - if (strcmp(verifyBuf, savedBuf)) - { - okay = 0; - break; - } - } - } - if(saved) - { - fclose(saved); - } - if(verify) - { - fclose(verify); - } - XmlTest("UTF-8: Verified multi-language round trip.", 1, okay); - - // On most Western machines, this is an element that contains - // the word "resume" with the correct accents, in a latin encoding. - // It will be something else completely on non-wester machines, - // which is why TinyXml is switching to UTF-8. - const char latin[] = "r\x82sum\x82"; - - TiXmlDocument latinDoc; - latinDoc.Parse(latin, 0, TIXML_ENCODING_LEGACY); - - text = latinDoc.FirstChildElement()->FirstChild()->ToText(); - XmlTest("Legacy encoding: Verify text element.", "r\x82sum\x82", text->Value()); - } - } - - ////////////////////// - // Copy and assignment - ////////////////////// - printf ("\n** Copy and Assignment **\n"); - { - TiXmlElement element("foo"); - element.Parse("", 0, TIXML_ENCODING_UNKNOWN); - - TiXmlElement elementCopy(element); - TiXmlElement elementAssign("foo"); - elementAssign.Parse("", 0, TIXML_ENCODING_UNKNOWN); - elementAssign = element; - - XmlTest("Copy/Assign: element copy #1.", "element", elementCopy.Value()); - XmlTest("Copy/Assign: element copy #2.", "value", elementCopy.Attribute("name")); - XmlTest("Copy/Assign: element assign #1.", "element", elementAssign.Value()); - XmlTest("Copy/Assign: element assign #2.", "value", elementAssign.Attribute("name")); - XmlTest("Copy/Assign: element assign #3.", true, (0 == elementAssign.Attribute("foo"))); - - TiXmlComment comment; - comment.Parse("", 0, TIXML_ENCODING_UNKNOWN); - TiXmlComment commentCopy(comment); - TiXmlComment commentAssign; - commentAssign = commentCopy; - XmlTest("Copy/Assign: comment copy.", "comment", commentCopy.Value()); - XmlTest("Copy/Assign: comment assign.", "comment", commentAssign.Value()); - - TiXmlUnknown unknown; - unknown.Parse("<[unknown]>", 0, TIXML_ENCODING_UNKNOWN); - TiXmlUnknown unknownCopy(unknown); - TiXmlUnknown unknownAssign; - unknownAssign.Parse("incorrect", 0, TIXML_ENCODING_UNKNOWN); - unknownAssign = unknownCopy; - XmlTest("Copy/Assign: unknown copy.", "[unknown]", unknownCopy.Value()); - XmlTest("Copy/Assign: unknown assign.", "[unknown]", unknownAssign.Value()); - - TiXmlText text("TextNode"); - TiXmlText textCopy(text); - TiXmlText textAssign("incorrect"); - textAssign = text; - XmlTest("Copy/Assign: text copy.", "TextNode", textCopy.Value()); - XmlTest("Copy/Assign: text assign.", "TextNode", textAssign.Value()); - - TiXmlDeclaration dec; - dec.Parse("", 0, TIXML_ENCODING_UNKNOWN); - TiXmlDeclaration decCopy(dec); - TiXmlDeclaration decAssign; - decAssign = dec; - - XmlTest("Copy/Assign: declaration copy.", "UTF-8", decCopy.Encoding()); - XmlTest("Copy/Assign: text assign.", "UTF-8", decAssign.Encoding()); - - TiXmlDocument doc; - elementCopy.InsertEndChild(textCopy); - doc.InsertEndChild(decAssign); - doc.InsertEndChild(elementCopy); - doc.InsertEndChild(unknownAssign); - - TiXmlDocument docCopy(doc); - TiXmlDocument docAssign; - docAssign = docCopy; - - #ifdef TIXML_USE_STL - std::string original, copy, assign; - original << doc; - copy << docCopy; - assign << docAssign; - XmlTest("Copy/Assign: document copy.", original.c_str(), copy.c_str(), true); - XmlTest("Copy/Assign: document assign.", original.c_str(), assign.c_str(), true); - - #endif - } - - ////////////////////////////////////////////////////// -#ifdef TIXML_USE_STL - printf ("\n** Parsing, no Condense Whitespace **\n"); - TiXmlBase::SetCondenseWhiteSpace(false); - { - istringstream parse1("This is \ntext"); - TiXmlElement text1("text"); - parse1 >> text1; - - XmlTest ("Condense white space OFF.", "This is \ntext", - text1.FirstChild()->Value(), - true); - } - TiXmlBase::SetCondenseWhiteSpace(true); -#endif - - ////////////////////////////////////////////////////// - // GetText(); - { - const char* str = "This is text"; - TiXmlDocument doc; - doc.Parse(str); - const TiXmlElement* element = doc.RootElement(); - - XmlTest("GetText() normal use.", "This is text", element->GetText()); - - str = "This is text"; - doc.Clear(); - doc.Parse(str); - element = doc.RootElement(); - - XmlTest("GetText() contained element.", element->GetText() == 0, true); - - str = "This is text"; - doc.Clear(); - TiXmlBase::SetCondenseWhiteSpace(false); - doc.Parse(str); - TiXmlBase::SetCondenseWhiteSpace(true); - element = doc.RootElement(); - - XmlTest("GetText() partial.", "This is ", element->GetText()); - } - - - ////////////////////////////////////////////////////// - // CDATA - { - const char* str = "" - " the rules!\n" - "...since I make symbolic puns" - "]]>" - ""; - TiXmlDocument doc; - doc.Parse(str); - doc.Print(); - - XmlTest("CDATA parse.", doc.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - - #ifdef TIXML_USE_STL - //cout << doc << '\n'; - - doc.Clear(); - - istringstream parse0(str); - parse0 >> doc; - //cout << doc << '\n'; - - XmlTest("CDATA stream.", doc.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - #endif - - TiXmlDocument doc1 = doc; - //doc.Print(); - - XmlTest("CDATA copy.", doc1.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - } - { - // [ 1482728 ] Wrong wide char parsing - char buf[256]; - buf[255] = 0; - for (int i = 0; i < 255; ++i) - { - buf[i] = (char)((i >= 32) ? i : 32); - } - TIXML_STRING str(""; - - TiXmlDocument doc; - doc.Parse(str.c_str()); - - TiXmlPrinter printer; - printer.SetStreamPrinting(); - doc.Accept(&printer); - - XmlTest("CDATA with all bytes #1.", str.c_str(), printer.CStr(), true); - - #ifdef TIXML_USE_STL - doc.Clear(); - istringstream iss(printer.Str()); - iss >> doc; - std::string out; - out << doc; - XmlTest("CDATA with all bytes #2.", out.c_str(), printer.CStr(), true); - #endif - } - { - // [ 1480107 ] Bug-fix for STL-streaming of CDATA that contains tags - // CDATA streaming had a couple of bugs, that this tests for. - const char* str = "" - "I am > the rules!\n" - "...since I make symbolic puns" - "]]>" - ""; - TiXmlDocument doc; - doc.Parse(str); - doc.Print(); - - XmlTest("CDATA parse. [ 1480107 ]", doc.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - - #ifdef TIXML_USE_STL - - doc.Clear(); - - istringstream parse0(str); - parse0 >> doc; - - XmlTest("CDATA stream. [ 1480107 ]", doc.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - #endif - - TiXmlDocument doc1 = doc; - //doc.Print(); - - XmlTest("CDATA copy. [ 1480107 ]", doc1.FirstChildElement()->FirstChild()->Value(), - "I am > the rules!\n...since I make symbolic puns", - true); - } - ////////////////////////////////////////////////////// - // Visit() - - - - ////////////////////////////////////////////////////// - printf("\n** Fuzzing... **\n"); - - const int FUZZ_ITERATION = 300; - - // The only goal is not to crash on bad input. - int len = (int) strlen(demoStart); - for (int i = 0; i < FUZZ_ITERATION; ++i) - { - char* demoCopy = new char[ len + 1 ]; - strcpy(demoCopy, demoStart); - - demoCopy[ i % len ] = (char)((i + 1) * 3); - demoCopy[ (i * 7) % len ] = '>'; - demoCopy[ (i * 11) % len ] = '<'; - - TiXmlDocument xml; - xml.Parse(demoCopy); - - delete [] demoCopy; - } - printf("** Fuzzing Complete. **\n"); - - ////////////////////////////////////////////////////// - printf ("\n** Bug regression tests **\n"); - - // InsertBeforeChild and InsertAfterChild causes crash. - { - TiXmlElement parent("Parent"); - TiXmlElement childText0("childText0"); - TiXmlElement childText1("childText1"); - TiXmlNode* childNode0 = parent.InsertEndChild(childText0); - TiXmlNode* childNode1 = parent.InsertBeforeChild(childNode0, childText1); - - XmlTest("Test InsertBeforeChild on empty node.", (childNode1 == parent.FirstChild()), true); - } - - { - // InsertBeforeChild and InsertAfterChild causes crash. - TiXmlElement parent("Parent"); - TiXmlElement childText0("childText0"); - TiXmlElement childText1("childText1"); - TiXmlNode* childNode0 = parent.InsertEndChild(childText0); - TiXmlNode* childNode1 = parent.InsertAfterChild(childNode0, childText1); - - XmlTest("Test InsertAfterChild on empty node. ", (childNode1 == parent.LastChild()), true); - } - - // Reports of missing constructors, irregular string problems. - { - // Missing constructor implementation. No test -- just compiles. - TiXmlText text("Missing"); - - #ifdef TIXML_USE_STL - // Missing implementation: - TiXmlDocument doc; - string name = "missing"; - doc.LoadFile(name); - - TiXmlText textSTL(name); - #else - // verifying some basic string functions: - TiXmlString a; - TiXmlString b("Hello"); - TiXmlString c("ooga"); - - c = " World!"; - a = b; - a += c; - a = a; - - XmlTest("Basic TiXmlString test. ", "Hello World!", a.c_str()); - #endif - } - - // Long filenames crashing STL version - { - TiXmlDocument doc("midsummerNightsDreamWithAVeryLongFilenameToConfuseTheStringHandlingRoutines.xml"); - bool loadOkay = doc.LoadFile(); - loadOkay = true; // get rid of compiler warning. - // Won't pass on non-dev systems. Just a "no crash" check. - //XmlTest( "Long filename. ", true, loadOkay ); - } - - { - // Entities not being written correctly. - // From Lynn Allen - - const char* passages = - "" - "" - " " - ""; - - TiXmlDocument doc("passages.xml"); - doc.Parse(passages); - TiXmlElement* psg = doc.RootElement()->FirstChildElement(); - const char* context = psg->Attribute("context"); - const char* expected = "Line 5 has \"quotation marks\" and 'apostrophe marks'. It also has <, >, and &, as well as a fake copyright \xC2\xA9."; - - XmlTest("Entity transformation: read. ", expected, context, true); - - FILE* textfile = fopen("textfile.txt", "w"); - if (textfile) - { - psg->Print(textfile, 0); - fclose(textfile); - } - textfile = fopen("textfile.txt", "r"); - assert(textfile); - if (textfile) - { - char buf[ 1024 ]; - fgets(buf, 1024, textfile); - XmlTest("Entity transformation: write. ", - "", - buf, - true); - } - fclose(textfile); - } - - { - FILE* textfile = fopen("test5.xml", "w"); - if (textfile) - { - fputs("", textfile); - fclose(textfile); - - TiXmlDocument doc; - doc.LoadFile("test5.xml"); - XmlTest("dot in element attributes and names", doc.Error(), 0); - } - } - - { - FILE* textfile = fopen("test6.xml", "w"); - if (textfile) - { - fputs("1.1 Start easy ignore fin thickness ", textfile); - fclose(textfile); - - TiXmlDocument doc; - bool result = doc.LoadFile("test6.xml"); - XmlTest("Entity with one digit.", result, true); - - TiXmlText* text = doc.FirstChildElement()->FirstChildElement()->FirstChild()->ToText(); - XmlTest("Entity with one digit.", - text->Value(), "1.1 Start easy ignore fin thickness\n"); - } - } - - { - // DOCTYPE not preserved (950171) - // - const char* doctype = - "" - "" - "" - "" - ""; - - TiXmlDocument doc; - doc.Parse(doctype); - doc.SaveFile("test7.xml"); - doc.Clear(); - doc.LoadFile("test7.xml"); - - TiXmlHandle docH(&doc); - TiXmlUnknown* unknown = docH.Child(1).Unknown(); - XmlTest("Correct value of unknown.", "!DOCTYPE PLAY SYSTEM 'play.dtd'", unknown->Value()); - #ifdef TIXML_USE_STL - TiXmlNode* node = docH.Child(2).Node(); - std::string str; - str << (*node); - XmlTest("Correct streaming of unknown.", "", str.c_str()); - #endif - } - - { - // [ 791411 ] Formatting bug - // Comments do not stream out correctly. - const char* doctype = - ""; - TiXmlDocument doc; - doc.Parse(doctype); - - TiXmlHandle docH(&doc); - TiXmlComment* comment = docH.Child(0).Node()->ToComment(); - - XmlTest("Comment formatting.", " Somewhat ", comment->Value()); - #ifdef TIXML_USE_STL - std::string str; - str << (*comment); - XmlTest("Comment streaming.", "", str.c_str()); - #endif - } - - { - // [ 870502 ] White space issues - TiXmlDocument doc; - TiXmlText* text; - TiXmlHandle docH(&doc); - - const char* doctype0 = " This has leading and trailing space "; - const char* doctype1 = "This has internal space"; - const char* doctype2 = " This has leading, trailing, and internal space "; - - TiXmlBase::SetCondenseWhiteSpace(false); - doc.Clear(); - doc.Parse(doctype0); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space kept.", " This has leading and trailing space ", text->Value()); - - doc.Clear(); - doc.Parse(doctype1); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space kept.", "This has internal space", text->Value()); - - doc.Clear(); - doc.Parse(doctype2); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space kept.", " This has leading, trailing, and internal space ", text->Value()); - - TiXmlBase::SetCondenseWhiteSpace(true); - doc.Clear(); - doc.Parse(doctype0); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space condensed.", "This has leading and trailing space", text->Value()); - - doc.Clear(); - doc.Parse(doctype1); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space condensed.", "This has internal space", text->Value()); - - doc.Clear(); - doc.Parse(doctype2); - text = docH.FirstChildElement("element").Child(0).Text(); - XmlTest("White space condensed.", "This has leading, trailing, and internal space", text->Value()); - } - - { - // Double attributes - const char* doctype = ""; - - TiXmlDocument doc; - doc.Parse(doctype); - - XmlTest("Parsing repeated attributes.", 0, (int)doc.Error()); // not an error to tinyxml - XmlTest("Parsing repeated attributes.", "blue", doc.FirstChildElement("element")->Attribute("attr")); - } - - { - // Embedded null in stream. - const char* doctype = ""; - - TiXmlDocument doc; - doc.Parse(doctype); - XmlTest("Embedded null throws error.", true, doc.Error()); - - #ifdef TIXML_USE_STL - istringstream strm(doctype); - doc.Clear(); - doc.ClearError(); - strm >> doc; - XmlTest("Embedded null throws error.", true, doc.Error()); - #endif - } - - { - // Legacy mode test. (This test may only pass on a western system) - const char* str = - "" - "<ä>" - "CöntäntßäöüÄÖÜ" - ""; - - TiXmlDocument doc; - doc.Parse(str); - - TiXmlHandle docHandle(&doc); - TiXmlHandle aHandle = docHandle.FirstChildElement("ä"); - TiXmlHandle tHandle = aHandle.Child(0); - assert(aHandle.Element()); - assert(tHandle.Text()); - XmlTest("ISO-8859-1 Parsing.", "CöntäntßäöüÄÖÜ", tHandle.Text()->Value()); - } - - { - // Empty documents should return TIXML_ERROR_PARSING_EMPTY, bug 1070717 - const char* str = " "; - TiXmlDocument doc; - doc.Parse(str); - XmlTest("Empty document error TIXML_ERROR_DOCUMENT_EMPTY", TiXmlBase::TIXML_ERROR_DOCUMENT_EMPTY, doc.ErrorId()); - } - #ifndef TIXML_USE_STL - { - // String equality. [ 1006409 ] string operator==/!= no worky in all cases - TiXmlString temp; - XmlTest("Empty tinyxml string compare equal", (temp == ""), true); - - TiXmlString foo; - TiXmlString bar(""); - XmlTest("Empty tinyxml string compare equal", (foo == bar), true); - } - - #endif - { - // Bug [ 1195696 ] from marlonism - TiXmlBase::SetCondenseWhiteSpace(false); - TiXmlDocument xml; - xml.Parse("This hangs"); - XmlTest("Test safe error return.", xml.Error(), false); - } - - { - // Bug [ 1243992 ] - another infinite loop - TiXmlDocument doc; - doc.SetCondenseWhiteSpace(false); - doc.Parse("

test

"); - } - { - // Low entities - TiXmlDocument xml; - xml.Parse(""); - const char result[] = { 0x0e, 0 }; - XmlTest("Low entities.", xml.FirstChildElement()->GetText(), result); - xml.Print(); - } - { - // Bug [ 1451649 ] Attribute values with trailing quotes not handled correctly - TiXmlDocument xml; - xml.Parse(""); - XmlTest("Throw error with bad end quotes.", xml.Error(), true); - } - #ifdef TIXML_USE_STL - { - // Bug [ 1449463 ] Consider generic query - TiXmlDocument xml; - xml.Parse(""); - - TiXmlElement* ele = xml.FirstChildElement(); - double d; - int i; - float f; - bool b; - //std::string str; - - XmlTest("QueryValueAttribute", ele->QueryValueAttribute("bar", &d), TIXML_SUCCESS); - XmlTest("QueryValueAttribute", ele->QueryValueAttribute("bar", &i), TIXML_SUCCESS); - XmlTest("QueryValueAttribute", ele->QueryValueAttribute("bar", &f), TIXML_SUCCESS); - XmlTest("QueryValueAttribute", ele->QueryValueAttribute("bar", &b), TIXML_WRONG_TYPE); - XmlTest("QueryValueAttribute", ele->QueryValueAttribute("nobar", &b), TIXML_NO_ATTRIBUTE); - //XmlTest( "QueryValueAttribute", ele->QueryValueAttribute( "barStr", &str ), TIXML_SUCCESS ); - - XmlTest("QueryValueAttribute", (d == 3.0), true); - XmlTest("QueryValueAttribute", (i == 3), true); - XmlTest("QueryValueAttribute", (f == 3.0f), true); - //XmlTest( "QueryValueAttribute", (str==std::string( "a string" )), true ); - } - #endif - - #ifdef TIXML_USE_STL - { - // [ 1505267 ] redundant malloc in TiXmlElement::Attribute - TiXmlDocument xml; - xml.Parse(""); - TiXmlElement* ele = xml.FirstChildElement(); - double d; - int i; - - std::string bar = "bar"; - - const std::string* atrrib = ele->Attribute(bar); - ele->Attribute(bar, &d); - ele->Attribute(bar, &i); - - XmlTest("Attribute", atrrib->empty(), false); - XmlTest("Attribute", (d == 3.0), true); - XmlTest("Attribute", (i == 3), true); - } - #endif - - { - // [ 1356059 ] Allow TiXMLDocument to only be at the top level - TiXmlDocument xml, xml2; - xml.InsertEndChild(xml2); - XmlTest("Document only at top level.", xml.Error(), true); - XmlTest("Document only at top level.", xml.ErrorId(), TiXmlBase::TIXML_ERROR_DOCUMENT_TOP_ONLY); - } - - { - // [ 1663758 ] Failure to report error on bad XML - TiXmlDocument xml; - xml.Parse(""); - XmlTest("Missing end tag at end of input", xml.Error(), true); - xml.Parse(" "); - XmlTest("Missing end tag with trailing whitespace", xml.Error(), true); - } - - { - // [ 1635701 ] fail to parse files with a tag separated into two lines - // I'm not sure this is a bug. Marked 'pending' for feedback. - TiXmlDocument xml; - xml.Parse("<p>text</p\n><title>"); - //xml.Print(); - //XmlTest( "Tag split by newline", xml.Error(), false ); - } - - #ifdef TIXML_USE_STL - { - // [ 1475201 ] TinyXML parses entities in comments - TiXmlDocument xml; - istringstream parse1("<!-- declarations for <head> & <body> -->" - "<!-- far & away -->"); - parse1 >> xml; - - TiXmlNode* e0 = xml.FirstChild(); - TiXmlNode* e1 = e0->NextSibling(); - TiXmlComment* c0 = e0->ToComment(); - TiXmlComment* c1 = e1->ToComment(); - - XmlTest("Comments ignore entities.", " declarations for <head> & <body> ", c0->Value(), true); - XmlTest("Comments ignore entities.", " far & away ", c1->Value(), true); - } - #endif - - { - // [ 1475201 ] TinyXML parses entities in comments - TiXmlDocument xml; - xml.Parse("<!-- declarations for <head> & <body> -->" - "<!-- far & away -->"); - - TiXmlNode* e0 = xml.FirstChild(); - TiXmlNode* e1 = e0->NextSibling(); - TiXmlComment* c0 = e0->ToComment(); - TiXmlComment* c1 = e1->ToComment(); - - XmlTest("Comments ignore entities.", " declarations for <head> & <body> ", c0->Value(), true); - XmlTest("Comments ignore entities.", " far & away ", c1->Value(), true); - } - /* - { - TiXmlDocument xml; - xml.Parse( "<tag>/</tag>" ); - xml.Print(); - xml.FirstChild()->Print( stdout, 0 ); - xml.FirstChild()->Type(); - } - */ - - /* 1417717 experiment - { - TiXmlDocument xml; - xml.Parse("<text>Dan & Tracie</text>"); - xml.Print(stdout); - } - { - TiXmlDocument xml; - xml.Parse("<text>Dan &foo; Tracie</text>"); - xml.Print(stdout); - } - */ - #if defined(WIN32) && defined(TUNE) - _CrtMemCheckpoint(&endMemState); - //_CrtMemDumpStatistics( &endMemState ); - - _CrtMemState diffMemState; - _CrtMemDifference(&diffMemState, &startMemState, &endMemState); - _CrtMemDumpStatistics(&diffMemState); - #endif - - printf ("\nPass %d, Fail %d\n", gPass, gFail); - return gFail; -} - - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/ListCache.bat b/Code/Tools/CrySCompileServer/CrySCompileServer/ListCache.bat deleted file mode 100644 index ba6badf0c0..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/ListCache.bat +++ /dev/null @@ -1,16 +0,0 @@ -@echo off -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM -REM -REM Original file Copyright Crytek GMBH or its affiliates, used under license. -REM - -dir Cache /a:-d /s /b >dir.txt \ No newline at end of file diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/PAL_android.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/PAL_android.cmake deleted file mode 100644 index c89a9eb1cd..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/PAL_android.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED FALSE) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/platform_android.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/platform_android.cmake deleted file mode 100644 index 4d5680a30d..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Android/platform_android.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/Clang/cryscompileserver_clang.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/Clang/cryscompileserver_clang.cmake deleted file mode 100644 index 5963f882c3..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/Clang/cryscompileserver_clang.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_COMPILE_OPTIONS - PRIVATE - -fexceptions -) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/MSVC/cryscompileserver_msvc.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/MSVC/cryscompileserver_msvc.cmake deleted file mode 100644 index 74ca22aaea..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Common/MSVC/cryscompileserver_msvc.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_COMPILE_OPTIONS - PRIVATE - /EHsc -) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/PAL_linux.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/PAL_linux.cmake deleted file mode 100644 index c89a9eb1cd..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/PAL_linux.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED FALSE) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/platform_linux.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/platform_linux.cmake deleted file mode 100644 index 4d5680a30d..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Linux/platform_linux.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/PAL_mac.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/PAL_mac.cmake deleted file mode 100644 index 6fa34f74b4..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/PAL_mac.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED TRUE) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/platform_mac.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/platform_mac.cmake deleted file mode 100644 index c46eb1cb4e..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Mac/platform_mac.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_RUNTIME_DEPENDENCIES - 3rdParty::DirectXShaderCompiler::dxcGL - 3rdParty::DirectXShaderCompiler::dxcMetal -) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/PAL_windows.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/PAL_windows.cmake deleted file mode 100644 index 6fa34f74b4..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/PAL_windows.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED TRUE) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/platform_windows.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/platform_windows.cmake deleted file mode 100644 index 9bb1423231..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/Windows/platform_windows.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_RUNTIME_DEPENDENCIES - 3rdParty::DirectXShaderCompiler::dxcGL - 3rdParty::DirectXShaderCompiler::dxcMetal -) - -file(TO_CMAKE_PATH "$ENV{ProgramFiles\(x86\)}" program_files_path) - -ly_add_target_files( - TARGETS CrySCompileServer - OUTPUT_SUBDIRECTORY Compiler/PCD3D11/v006 - FILES - "${program_files_path}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64/fxc.exe" - "${program_files_path}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64/d3dcompiler_47.dll" - "${program_files_path}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64/d3dcsx_47.dll" - "${program_files_path}/Windows Kits/10/bin/${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}/x64/d3dcsxd_47.dll" -) - -ly_add_target_files( - TARGETS CrySCompileServer - OUTPUT_SUBDIRECTORY Compiler/PCGL/V006 - FILES - "${LY_ROOT_FOLDER}/Tools/CrySCompileServer/Compiler/PCGL/V006/D3DCompiler_47.dll" - "${LY_ROOT_FOLDER}/Tools/CrySCompileServer/Compiler/PCGL/V006/HLSLcc.exe" -) - -ly_add_target_files( - TARGETS CrySCompileServer - OUTPUT_SUBDIRECTORY Compiler/PCGMETAL/HLSLcc - FILES - "${LY_ROOT_FOLDER}/Tools/CrySCompileServer/Compiler/PCGMETAL/HLSLcc/HLSLcc_d.exe" - "${LY_ROOT_FOLDER}/Tools/CrySCompileServer/Compiler/PCGMETAL/HLSLcc/HLSLcc.exe" -) - diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/PAL_ios.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/PAL_ios.cmake deleted file mode 100644 index c89a9eb1cd..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/PAL_ios.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_BUILD_CRYSCOMPILESERVER_SUPPORTED FALSE) diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/platform_ios.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/platform_ios.cmake deleted file mode 100644 index a6510a297f..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Platform/iOS/platform_ios.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/cryscompileserver_files.cmake b/Code/Tools/CrySCompileServer/CrySCompileServer/cryscompileserver_files.cmake deleted file mode 100644 index b57c6a3dfe..0000000000 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/cryscompileserver_files.cmake +++ /dev/null @@ -1,60 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - CrySCompileServer.cpp - Core/Common.h - Core/Error.cpp - Core/Error.hpp - Core/WindowsAPIImplementation.h - Core/WindowsAPIImplementation.cpp - Core/Mailer.cpp - Core/Mailer.h - Core/MD5.hpp - Core/StdTypes.hpp - Core/STLHelper.cpp - Core/STLHelper.hpp - Core/Server/CrySimpleCache.cpp - Core/Server/CrySimpleCache.hpp - Core/Server/CrySimpleErrorLog.cpp - Core/Server/CrySimpleErrorLog.hpp - Core/Server/CrySimpleFileGuard.hpp - Core/Server/CrySimpleHTTP.cpp - Core/Server/CrySimpleHTTP.hpp - Core/Server/CrySimpleJob.cpp - Core/Server/CrySimpleJob.hpp - Core/Server/CrySimpleJobCache.cpp - Core/Server/CrySimpleJobCache.hpp - Core/Server/CrySimpleJobCompile.cpp - Core/Server/CrySimpleJobCompile.hpp - Core/Server/CrySimpleJobCompile1.cpp - Core/Server/CrySimpleJobCompile1.hpp - Core/Server/CrySimpleJobCompile2.cpp - Core/Server/CrySimpleJobCompile2.hpp - Core/Server/CrySimpleJobRequest.cpp - Core/Server/CrySimpleJobRequest.hpp - Core/Server/CrySimpleJobGetShaderList.cpp - Core/Server/CrySimpleJobGetShaderList.hpp - Core/Server/CrySimpleMutex.cpp - Core/Server/CrySimpleMutex.hpp - Core/Server/CrySimpleServer.cpp - Core/Server/CrySimpleServer.hpp - Core/Server/CrySimpleSock.cpp - Core/Server/CrySimpleSock.hpp - Core/Server/ShaderList.cpp - Core/Server/ShaderList.hpp - External/tinyxml/tinystr.cpp - External/tinyxml/tinystr.h - External/tinyxml/tinyxml.cpp - External/tinyxml/tinyxml.h - External/tinyxml/tinyxmlerror.cpp - External/tinyxml/tinyxmlparser.cpp -) diff --git a/Code/Tools/CryXML/CryXML.def b/Code/Tools/CryXML/CryXML.def index e2db91cb85..6275474eab 100644 --- a/Code/Tools/CryXML/CryXML.def +++ b/Code/Tools/CryXML/CryXML.def @@ -1,3 +1,3 @@ LIBRARY CryXML EXPORTS - GetICryXML @1 \ No newline at end of file + GetICryXML @1 diff --git a/Code/Tools/CryXML/XML/xml.h b/Code/Tools/CryXML/XML/xml.h index f8352a105d..8e9072acbf 100644 --- a/Code/Tools/CryXML/XML/xml.h +++ b/Code/Tools/CryXML/XML/xml.h @@ -468,4 +468,4 @@ private: }; #endif // CRYINCLUDE_CRYXML_XML_XML_H -*/ \ No newline at end of file +*/ diff --git a/Code/Tools/CryXML/cryxml_files.cmake b/Code/Tools/CryXML/cryxml_files.cmake index ef63189e01..d81ace11b7 100644 --- a/Code/Tools/CryXML/cryxml_files.cmake +++ b/Code/Tools/CryXML/cryxml_files.cmake @@ -19,4 +19,4 @@ set(FILES XML/xml.h CryXML_precompiled.h CryXML_precompiled.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/GridHub/GridHub/Images.xcassets/AppIcon.appiconset/Contents.json b/Code/Tools/GridHub/GridHub/Images.xcassets/AppIcon.appiconset/Contents.json index 8d8496f05e..4ff268ae45 100644 --- a/Code/Tools/GridHub/GridHub/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Code/Tools/GridHub/GridHub/Images.xcassets/AppIcon.appiconset/Contents.json @@ -11,4 +11,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Tools/GridHub/GridHub/Images.xcassets/Contents.json b/Code/Tools/GridHub/GridHub/Images.xcassets/Contents.json index da4a164c91..2d92bd53fd 100644 --- a/Code/Tools/GridHub/GridHub/Images.xcassets/Contents.json +++ b/Code/Tools/GridHub/GridHub/Images.xcassets/Contents.json @@ -3,4 +3,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/Code/Tools/GridHub/GridHub/Resources/style_dark.qss b/Code/Tools/GridHub/GridHub/Resources/style_dark.qss index f6213f3edb..c7bde1f653 100644 --- a/Code/Tools/GridHub/GridHub/Resources/style_dark.qss +++ b/Code/Tools/GridHub/GridHub/Resources/style_dark.qss @@ -985,4 +985,4 @@ SearchLineEdit{ SearchLineEdit>QLineEdit{ background-color: rgb(160, 160, 160); -} \ No newline at end of file +} diff --git a/Code/Tools/HLSLCrossCompiler/README b/Code/Tools/HLSLCrossCompiler/README index 4369f1a3b2..2f1dd1f966 100644 --- a/Code/Tools/HLSLCrossCompiler/README +++ b/Code/Tools/HLSLCrossCompiler/README @@ -68,4 +68,4 @@ Submitting: /Code/CryEngine/RenderDll/Common/Shaders/ShaderCache.cpp /Code/CryEngine/RenderDll/Common/Shaders/Shader.h /Tools/RemoteShaderCompiler/Compiler/PCGL/[rsc_version]/HLSLcc.exe - This will make sure there is no mismatch between any cached shaders, and remotely or locally compiled shaders. \ No newline at end of file + This will make sure there is no mismatch between any cached shaders, and remotely or locally compiled shaders. diff --git a/Code/Tools/HLSLCrossCompiler/hlslcc_files.cmake b/Code/Tools/HLSLCrossCompiler/hlslcc_files.cmake index f19b52084a..554d960278 100644 --- a/Code/Tools/HLSLCrossCompiler/hlslcc_files.cmake +++ b/Code/Tools/HLSLCrossCompiler/hlslcc_files.cmake @@ -57,4 +57,4 @@ set(FILES set(SKIP_UNITY_BUILD_INCLUSION_FILES # 'bsafe.c' tries to forward declar 'strncpy', 'strncat', etc, but they are already declared in other modules. Remove from unity builds conideration src/cbstring/bsafe.c -) \ No newline at end of file +) diff --git a/Code/Tools/HLSLCrossCompiler/src/hlslccToolkit.c b/Code/Tools/HLSLCrossCompiler/src/hlslccToolkit.c index 22abd1a5e2..368b75c955 100644 --- a/Code/Tools/HLSLCrossCompiler/src/hlslccToolkit.c +++ b/Code/Tools/HLSLCrossCompiler/src/hlslccToolkit.c @@ -164,4 +164,4 @@ const char * GetAuxArgumentName(const SHADER_VARIABLE_TYPE varType) ASSERT(0); return ""; } -} \ No newline at end of file +} diff --git a/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslccToolkit.h b/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslccToolkit.h index d0875613a4..d96a4b17be 100644 --- a/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslccToolkit.h +++ b/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslccToolkit.h @@ -32,4 +32,4 @@ bool IsGmemReservedSlot(FRAMEBUFFER_FETCH_TYPE type, const uint32_t regNumber); // Return the name of an auxiliary variable used to save intermediate values to bypass driver issues const char * GetAuxArgumentName(const SHADER_VARIABLE_TYPE varType); -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslcc_malloc.h b/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslcc_malloc.h index 533050e17b..8f74eb5d6e 100644 --- a/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslcc_malloc.h +++ b/Code/Tools/HLSLCrossCompiler/src/internal_includes/hlslcc_malloc.h @@ -12,4 +12,4 @@ extern void* (* hlslcc_realloc)(void* p, size_t size); #define bstr__alloc hlslcc_malloc #define bstr__free hlslcc_free #define bstr__realloc hlslcc_realloc -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Linux/PAL_linux.cmake b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Linux/PAL_linux.cmake index 6dc23ee057..7115fcc725 100644 --- a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Linux/PAL_linux.cmake +++ b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_HLSLCC_METAL FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_HLSLCC_METAL FALSE) diff --git a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Mac/PAL_mac.cmake b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Mac/PAL_mac.cmake index 6dc23ee057..7115fcc725 100644 --- a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Mac/PAL_mac.cmake +++ b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_HLSLCC_METAL FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_HLSLCC_METAL FALSE) diff --git a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Windows/PAL_windows.cmake b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Windows/PAL_windows.cmake index ee003b245b..eb5580be07 100644 --- a/Code/Tools/HLSLCrossCompilerMETAL/Platform/Windows/PAL_windows.cmake +++ b/Code/Tools/HLSLCrossCompilerMETAL/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_HLSLCC_METAL TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_HLSLCC_METAL TRUE) diff --git a/Code/Tools/HLSLCrossCompilerMETAL/hlslcc_metal_files.cmake b/Code/Tools/HLSLCrossCompilerMETAL/hlslcc_metal_files.cmake index ffeb9d9755..a10ee7ed78 100644 --- a/Code/Tools/HLSLCrossCompilerMETAL/hlslcc_metal_files.cmake +++ b/Code/Tools/HLSLCrossCompilerMETAL/hlslcc_metal_files.cmake @@ -62,4 +62,4 @@ set(FILES set(SKIP_UNITY_BUILD_INCLUSION_FILES # 'bsafe.c' tries to forward declar 'strncpy', 'strncat', etc, but they are already declared in other modules. Remove from unity builds conideration src/cbstring/bsafe.c -) \ No newline at end of file +) diff --git a/Code/Tools/HLSLCrossCompilerMETAL/src/toMETAL.c b/Code/Tools/HLSLCrossCompilerMETAL/src/toMETAL.c index 8e3a719950..acf5a58094 100644 --- a/Code/Tools/HLSLCrossCompilerMETAL/src/toMETAL.c +++ b/Code/Tools/HLSLCrossCompilerMETAL/src/toMETAL.c @@ -437,4 +437,4 @@ HLSLCC_API int HLSLCC_APIENTRY TranslateHLSLFromFileToMETAL(const char* filename hlslcc_free(shader); return success; -} \ No newline at end of file +} diff --git a/Code/Tools/LoadingProfilerViewer/XML/Expat/COPYING.txt b/Code/Tools/LoadingProfilerViewer/XML/Expat/COPYING.txt deleted file mode 100644 index dcb4506429..0000000000 --- a/Code/Tools/LoadingProfilerViewer/XML/Expat/COPYING.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - and Clark Cooper -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Code/Tools/MBCryExport/README.txt b/Code/Tools/MBCryExport/README.txt deleted file mode 100644 index 00140aaf3c..0000000000 --- a/Code/Tools/MBCryExport/README.txt +++ /dev/null @@ -1 +0,0 @@ -MotionBuilder support was removed in CL 88235, please back it out if this decision is reversed. This was for bug LMBR-9220 \ No newline at end of file diff --git a/Code/Tools/News/NewsBuilder/Qt/ImageItem.h b/Code/Tools/News/NewsBuilder/Qt/ImageItem.h index 42ed604d81..6c2b56aadf 100644 --- a/Code/Tools/News/NewsBuilder/Qt/ImageItem.h +++ b/Code/Tools/News/NewsBuilder/Qt/ImageItem.h @@ -48,4 +48,4 @@ namespace News { private Q_SLOTS: void imageClickedSlot(); }; -} \ No newline at end of file +} diff --git a/Code/Tools/News/NewsBuilder/Qt/SelectImage.h b/Code/Tools/News/NewsBuilder/Qt/SelectImage.h index e7127ae6fc..27b4a6415e 100644 --- a/Code/Tools/News/NewsBuilder/Qt/SelectImage.h +++ b/Code/Tools/News/NewsBuilder/Qt/SelectImage.h @@ -48,4 +48,4 @@ namespace News { void ImageSelected(ImageItem* imageItem); }; -} // namespace News \ No newline at end of file +} // namespace News diff --git a/Code/Tools/News/NewsBuilder/ResourceManagement/BuilderResourceManifest.h b/Code/Tools/News/NewsBuilder/ResourceManagement/BuilderResourceManifest.h index bfe56cd874..94d8f8c8bc 100644 --- a/Code/Tools/News/NewsBuilder/ResourceManagement/BuilderResourceManifest.h +++ b/Code/Tools/News/NewsBuilder/ResourceManagement/BuilderResourceManifest.h @@ -127,4 +127,4 @@ namespace News //! Initializes S3 connector with selected endpoint bool InitS3Connector() const; }; -} // namespace News \ No newline at end of file +} // namespace News diff --git a/Code/Tools/News/NewsBuilder/Resources/NewsBuilder.qss b/Code/Tools/News/NewsBuilder/Resources/NewsBuilder.qss index d4563dbf8c..01ca308585 100644 --- a/Code/Tools/News/NewsBuilder/Resources/NewsBuilder.qss +++ b/Code/Tools/News/NewsBuilder/Resources/NewsBuilder.qss @@ -41,4 +41,4 @@ QFrame#imageFrame News--ArticleView.SelectedArticle > QWidget { background: #333333; -} \ No newline at end of file +} diff --git a/Code/Tools/News/NewsBuilder/UidGenerator.h b/Code/Tools/News/NewsBuilder/UidGenerator.h index 7d2fb00f0d..eaf08d66ec 100644 --- a/Code/Tools/News/NewsBuilder/UidGenerator.h +++ b/Code/Tools/News/NewsBuilder/UidGenerator.h @@ -29,4 +29,4 @@ namespace News private: std::vector<int> m_uids; }; -} \ No newline at end of file +} diff --git a/Code/Tools/News/NewsBuilder/news_builder.qrc b/Code/Tools/News/NewsBuilder/news_builder.qrc index 012c99f3d6..010ac598f1 100644 --- a/Code/Tools/News/NewsBuilder/news_builder.qrc +++ b/Code/Tools/News/NewsBuilder/news_builder.qrc @@ -2,4 +2,4 @@ <qresource> <file>Resources/NewsBuilder.qss</file> </qresource> -</RCC> \ No newline at end of file +</RCC> diff --git a/Code/Tools/News/NewsShared/ErrorCodes.h b/Code/Tools/News/NewsShared/ErrorCodes.h index a21d4c0247..f16540bf28 100644 --- a/Code/Tools/News/NewsShared/ErrorCodes.h +++ b/Code/Tools/News/NewsShared/ErrorCodes.h @@ -53,4 +53,4 @@ namespace News } return errors[typeIndex]; } -} // namespace News \ No newline at end of file +} // namespace News diff --git a/Code/Tools/News/NewsShared/LogType.h b/Code/Tools/News/NewsShared/LogType.h index 52f4b2d405..b0d865c617 100644 --- a/Code/Tools/News/NewsShared/LogType.h +++ b/Code/Tools/News/NewsShared/LogType.h @@ -20,4 +20,4 @@ namespace News { LogError, LogWarning }; -} // namespace News \ No newline at end of file +} // namespace News diff --git a/Code/Tools/News/NewsShared/Qt/ArticleViewContainer.h b/Code/Tools/News/NewsShared/Qt/ArticleViewContainer.h index aaa1add5ca..6bb72cacc5 100644 --- a/Code/Tools/News/NewsShared/Qt/ArticleViewContainer.h +++ b/Code/Tools/News/NewsShared/Qt/ArticleViewContainer.h @@ -83,4 +83,4 @@ namespace News private Q_SLOTS: virtual void articleSelectedSlot(QString id); }; -} \ No newline at end of file +} diff --git a/Code/Tools/PythonBindingsExample/tests/test_framework.py b/Code/Tools/PythonBindingsExample/tests/test_framework.py index 607022c5f8..fd33b1a2d9 100755 --- a/Code/Tools/PythonBindingsExample/tests/test_framework.py +++ b/Code/Tools/PythonBindingsExample/tests/test_framework.py @@ -47,4 +47,4 @@ def main(): framework.Terminate(4) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/Code/Tools/PythonBindingsExample/tool_dependencies.cmake b/Code/Tools/PythonBindingsExample/tool_dependencies.cmake index cee74ce6f8..c0bbdd27db 100644 --- a/Code/Tools/PythonBindingsExample/tool_dependencies.cmake +++ b/Code/Tools/PythonBindingsExample/tool_dependencies.cmake @@ -11,4 +11,4 @@ set(GEM_DEPENDENCIES Gem::EditorPythonBindings.Editor -) \ No newline at end of file +) diff --git a/Code/Tools/RC/Config/rc/RCJob_Build_DBAs.xml b/Code/Tools/RC/Config/rc/RCJob_Build_DBAs.xml index 9668237a50..7c755a73e9 100644 --- a/Code/Tools/RC/Config/rc/RCJob_Build_DBAs.xml +++ b/Code/Tools/RC/Config/rc/RCJob_Build_DBAs.xml @@ -14,4 +14,4 @@ </DBAJob> <Run Job="DBAJob" /> <!-- Run the only job --> -</RCJobs> \ No newline at end of file +</RCJobs> diff --git a/Code/Tools/RC/Config/rc/RCJob_Convert_TIF.xml b/Code/Tools/RC/Config/rc/RCJob_Convert_TIF.xml index d8a70c74f9..ad0cdc863b 100644 --- a/Code/Tools/RC/Config/rc/RCJob_Convert_TIF.xml +++ b/Code/Tools/RC/Config/rc/RCJob_Convert_TIF.xml @@ -7,4 +7,4 @@ </TexturesJob> <Run Job="TexturesJob" /> <!-- Run the only job --> -</RCJobs> \ No newline at end of file +</RCJobs> diff --git a/Code/Tools/RC/Config/rc/rc.ini b/Code/Tools/RC/Config/rc/rc.ini index d4af9f50ac..7cb97bd8f8 100644 --- a/Code/Tools/RC/Config/rc/rc.ini +++ b/Code/Tools/RC/Config/rc/rc.ini @@ -36,4 +36,4 @@ pointersize=4 [_platform] name=ios bigendian=0 -pointersize=8 \ No newline at end of file +pointersize=8 diff --git a/Code/Tools/RC/ResourceCompiler/Platform/Windows/platform_windows.cmake b/Code/Tools/RC/ResourceCompiler/Platform/Windows/platform_windows.cmake index 5bf237e9e1..b0ef0c00c9 100644 --- a/Code/Tools/RC/ResourceCompiler/Platform/Windows/platform_windows.cmake +++ b/Code/Tools/RC/ResourceCompiler/Platform/Windows/platform_windows.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE psapi.lib -) \ No newline at end of file +) diff --git a/Code/Tools/RC/ResourceCompiler/WindowsCompatibility.xml b/Code/Tools/RC/ResourceCompiler/WindowsCompatibility.xml index 285707469b..d1f93af54c 100644 --- a/Code/Tools/RC/ResourceCompiler/WindowsCompatibility.xml +++ b/Code/Tools/RC/ResourceCompiler/WindowsCompatibility.xml @@ -7,4 +7,4 @@ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> </application> </compatibility> -</assembly> \ No newline at end of file +</assembly> diff --git a/Code/Tools/RC/ResourceCompiler/resourcecompiler_files.cmake b/Code/Tools/RC/ResourceCompiler/resourcecompiler_files.cmake index 4cdac99b11..f2ca849c51 100644 --- a/Code/Tools/RC/ResourceCompiler/resourcecompiler_files.cmake +++ b/Code/Tools/RC/ResourceCompiler/resourcecompiler_files.cmake @@ -11,4 +11,4 @@ set(FILES main.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.cpp b/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.cpp index a61781f92a..615a575651 100644 --- a/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.cpp +++ b/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.cpp @@ -26,4 +26,4 @@ namespace AZ return {}; } } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.h b/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.h index e0429b62fb..423e5072db 100644 --- a/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.h +++ b/Code/Tools/RC/ResourceCompilerLegacy/LegacyAssetParser/AssetParser.h @@ -31,4 +31,4 @@ namespace AZ AZStd::string m_assetName; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerLegacy/LegacyConverter.h b/Code/Tools/RC/ResourceCompilerLegacy/LegacyConverter.h index 6cce25b7fb..7643d209b1 100644 --- a/Code/Tools/RC/ResourceCompilerLegacy/LegacyConverter.h +++ b/Code/Tools/RC/ResourceCompilerLegacy/LegacyConverter.h @@ -34,4 +34,4 @@ namespace AZ const char* GetExt(int index) const override; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExportContexts.cpp b/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExportContexts.cpp index 6f40cb5c19..2c9c654dd8 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExportContexts.cpp +++ b/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExportContexts.cpp @@ -45,4 +45,4 @@ namespace AZ { } } // RC -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExporter.h b/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExporter.h index 591158e9dc..1dd9689917 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Cgf/CgfExporter.h @@ -43,4 +43,4 @@ namespace AZ IConvertContext* m_convertContext; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/BlendShapeExporter.h b/Code/Tools/RC/ResourceCompilerScene/Common/BlendShapeExporter.h index 78a4b6a203..1804a97aa8 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/BlendShapeExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/BlendShapeExporter.h @@ -34,4 +34,4 @@ namespace AZ SceneAPI::Events::ProcessingResult ProcessBlendShapes(MeshNodeExportContext& context); }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.cpp index 91a96708b1..145fcfc76a 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.cpp +++ b/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.cpp @@ -108,4 +108,4 @@ namespace AZ return SceneEvents::ProcessingResult::Success; } } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.h b/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.h index 014d0e6739..3abe4e1b23 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/ColorStreamExporter.h @@ -34,4 +34,4 @@ namespace AZ SceneAPI::Events::ProcessingResult CopyVertexColorStream(MeshNodeExportContext& context) const; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.cpp b/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.cpp index 1124342670..b23acb1d33 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.cpp +++ b/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.cpp @@ -64,4 +64,4 @@ namespace AZ } } } // RC -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.h b/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.h index a449fd2a57..22d66c7430 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/ContainerSettingsExporter.h @@ -34,4 +34,4 @@ namespace AZ SceneAPI::Events::ProcessingResult ProcessContext(ContainerExportContext& context) const; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/ExportContextGlobal.h b/Code/Tools/RC/ResourceCompilerScene/Common/ExportContextGlobal.h index 1f17b086c2..f10d960c48 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/ExportContextGlobal.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/ExportContextGlobal.h @@ -23,4 +23,4 @@ namespace AZ Finalizing // Work on the target has completed. }; } -} \ No newline at end of file +} diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/SkinWeightExporter.h b/Code/Tools/RC/ResourceCompilerScene/Common/SkinWeightExporter.h index 9ae1510321..7d0442ce58 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/SkinWeightExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/SkinWeightExporter.h @@ -54,4 +54,4 @@ namespace AZ int GetGlobalBoneId(const AZStd::shared_ptr<const SceneAPI::DataTypes::ISkinWeightData>& skinWeights, BoneNameIdMap boneNameIdMap, int boneId); }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Common/UVStreamExporter.h b/Code/Tools/RC/ResourceCompilerScene/Common/UVStreamExporter.h index c86a066bc0..522de0e24e 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Common/UVStreamExporter.h +++ b/Code/Tools/RC/ResourceCompilerScene/Common/UVStreamExporter.h @@ -38,4 +38,4 @@ namespace AZ static const size_t s_uvMaxStreamCount = 2; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/SceneConverter.h b/Code/Tools/RC/ResourceCompilerScene/SceneConverter.h index 6f7c2b48ef..db143deb50 100644 --- a/Code/Tools/RC/ResourceCompilerScene/SceneConverter.h +++ b/Code/Tools/RC/ResourceCompilerScene/SceneConverter.h @@ -40,4 +40,4 @@ namespace AZ AZStd::string m_appRoot; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/RC/ResourceCompilerScene/SceneSerializationHandler.h b/Code/Tools/RC/ResourceCompilerScene/SceneSerializationHandler.h index 0e4921fce7..44b79e2578 100644 --- a/Code/Tools/RC/ResourceCompilerScene/SceneSerializationHandler.h +++ b/Code/Tools/RC/ResourceCompilerScene/SceneSerializationHandler.h @@ -40,4 +40,4 @@ namespace AZ const AZStd::string& sceneFilePath, Uuid sceneSourceGuid) override; }; } // namespace RC -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/RC/ResourceCompilerScene/Tests/Cgf/CgfExportContextTestBase.h b/Code/Tools/RC/ResourceCompilerScene/Tests/Cgf/CgfExportContextTestBase.h index 4485c7cb8e..43521f3411 100644 --- a/Code/Tools/RC/ResourceCompilerScene/Tests/Cgf/CgfExportContextTestBase.h +++ b/Code/Tools/RC/ResourceCompilerScene/Tests/Cgf/CgfExportContextTestBase.h @@ -117,4 +117,4 @@ namespace AZ MeshNodeExportContext m_stubMeshNodeExportContext; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/RC/ResourceCompilerScene/TraceDrillerHook.h b/Code/Tools/RC/ResourceCompilerScene/TraceDrillerHook.h index 1a8891b8a7..fcf01d5e5f 100644 --- a/Code/Tools/RC/ResourceCompilerScene/TraceDrillerHook.h +++ b/Code/Tools/RC/ResourceCompilerScene/TraceDrillerHook.h @@ -50,4 +50,4 @@ namespace AZ size_t m_errorCount; }; } // RC -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/RemoteConsole/Platform/Android/RemoteConsole_Traits_Platform.h b/Code/Tools/RemoteConsole/Platform/Android/RemoteConsole_Traits_Platform.h index deb37d714e..fec6d05fda 100644 --- a/Code/Tools/RemoteConsole/Platform/Android/RemoteConsole_Traits_Platform.h +++ b/Code/Tools/RemoteConsole/Platform/Android/RemoteConsole_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <RemoteConsole_Traits_Android.h> \ No newline at end of file +#include <RemoteConsole_Traits_Android.h> diff --git a/Code/Tools/RemoteConsole/Platform/Linux/RemoteConsole_Traits_Platform.h b/Code/Tools/RemoteConsole/Platform/Linux/RemoteConsole_Traits_Platform.h index 2898a29533..8cde497604 100644 --- a/Code/Tools/RemoteConsole/Platform/Linux/RemoteConsole_Traits_Platform.h +++ b/Code/Tools/RemoteConsole/Platform/Linux/RemoteConsole_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <RemoteConsole_Traits_Linux.h> \ No newline at end of file +#include <RemoteConsole_Traits_Linux.h> diff --git a/Code/Tools/RemoteConsole/Platform/Mac/RemoteConsole_Traits_Platform.h b/Code/Tools/RemoteConsole/Platform/Mac/RemoteConsole_Traits_Platform.h index 1613d5fdaa..e02b3135cc 100644 --- a/Code/Tools/RemoteConsole/Platform/Mac/RemoteConsole_Traits_Platform.h +++ b/Code/Tools/RemoteConsole/Platform/Mac/RemoteConsole_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <RemoteConsole_Traits_Mac.h> \ No newline at end of file +#include <RemoteConsole_Traits_Mac.h> diff --git a/Code/Tools/RemoteConsole/Platform/Windows/RemoteConsole_Traits_Platform.h b/Code/Tools/RemoteConsole/Platform/Windows/RemoteConsole_Traits_Platform.h index f5fd60d764..3cac384a82 100644 --- a/Code/Tools/RemoteConsole/Platform/Windows/RemoteConsole_Traits_Platform.h +++ b/Code/Tools/RemoteConsole/Platform/Windows/RemoteConsole_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <RemoteConsole_Traits_Windows.h> \ No newline at end of file +#include <RemoteConsole_Traits_Windows.h> diff --git a/Code/Tools/RemoteConsole/Platform/iOS/RemoteConsole_Traits_Platform.h b/Code/Tools/RemoteConsole/Platform/iOS/RemoteConsole_Traits_Platform.h index b674e8e575..4134278b02 100644 --- a/Code/Tools/RemoteConsole/Platform/iOS/RemoteConsole_Traits_Platform.h +++ b/Code/Tools/RemoteConsole/Platform/iOS/RemoteConsole_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <RemoteConsole_Traits_iOS.h> \ No newline at end of file +#include <RemoteConsole_Traits_iOS.h> diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/CMakeLists.txt b/Code/Tools/SceneAPI/FbxSDKWrapper/CMakeLists.txt index ac8af3fdaa..ddbabe604d 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/CMakeLists.txt +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/CMakeLists.txt @@ -9,13 +9,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(sdkwrapper_dir ${CMAKE_CURRENT_LIST_DIR}/../SDKWrapper) - if (NOT PAL_TRAIT_BUILD_HOST_TOOLS) return() endif() -ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) +set(sdkwrapper_dir ${CMAKE_CURRENT_LIST_DIR}/../SDKWrapper) ly_add_target( NAME FbxSDKWrapper STATIC diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.cpp b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.cpp index cc2ef7fdff..78d7c713e0 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.cpp +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.cpp @@ -44,4 +44,4 @@ namespace AZ return AZStd::make_shared<const FbxAnimCurveWrapper>(static_cast<FbxAnimCurve*>(m_fbxAnimCurveNode->GetCurve(channelID, index))); } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h index 043ea60e05..a1213de32b 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h @@ -37,4 +37,4 @@ namespace AZ FbxAnimCurveNode* m_fbxAnimCurveNode; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.cpp b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.cpp index 9687d9226c..e1e32278d9 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.cpp +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.cpp @@ -31,4 +31,4 @@ namespace AZ return m_fbxAnimCurve->Evaluate(time.m_fbxTime); } } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h index f14fd0653f..f8793f53cd 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h @@ -31,4 +31,4 @@ namespace AZ FbxAnimCurve* m_fbxAnimCurve; }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.cpp b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.cpp index 1bf59cda94..92cf655dbd 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.cpp +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.cpp @@ -97,4 +97,4 @@ namespace AZ return nullptr; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h index fb640d0920..80912d1a1b 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h @@ -86,4 +86,4 @@ namespace AZ FbxMesh* m_fbxMesh; }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAnimStackWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAnimStackWrapper.h index 8d03a52015..122ab05ecb 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAnimStackWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAnimStackWrapper.h @@ -29,4 +29,4 @@ namespace AZ FbxAnimLayer * (int index)); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAxisSystemWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAxisSystemWrapper.h index ff231ffdfa..7cd022ce50 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAxisSystemWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxAxisSystemWrapper.h @@ -29,4 +29,4 @@ namespace AZ Transform(UpVector)); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxMaterialWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxMaterialWrapper.h index 49a4f43d29..ac19831be7 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxMaterialWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxMaterialWrapper.h @@ -35,4 +35,4 @@ namespace AZ bool()); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxNodeWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxNodeWrapper.h index a760415a12..aa02d633b0 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxNodeWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxNodeWrapper.h @@ -64,4 +64,4 @@ namespace AZ bool()); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxPropertyWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxPropertyWrapper.h index 31734ecd10..f49521f136 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxPropertyWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxPropertyWrapper.h @@ -39,4 +39,4 @@ namespace AZ const char*(int index)); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSceneWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSceneWrapper.h index a3f81b53d3..8f3d1903ac 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSceneWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSceneWrapper.h @@ -52,4 +52,4 @@ namespace AZ void()); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSkinWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSkinWrapper.h index 17f1f814c2..dd17a12146 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSkinWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSkinWrapper.h @@ -37,4 +37,4 @@ namespace AZ AZStd::shared_ptr<const FbxNodeWrapper>(int index)); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSystemUnitWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSystemUnitWrapper.h index eebccfcc69..822a700edd 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSystemUnitWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxSystemUnitWrapper.h @@ -29,4 +29,4 @@ namespace AZ float(Unit)); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxUVWrapper.h b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxUVWrapper.h index bb8edcddfc..73fb2af587 100644 --- a/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxUVWrapper.h +++ b/Code/Tools/SceneAPI/FbxSDKWrapper/Mocks/MockFbxUVWrapper.h @@ -31,4 +31,4 @@ namespace AZ bool()); }; } // namespace FbxSDKWrapper -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp index 4df5844359..155209f1b5 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp @@ -75,4 +75,4 @@ namespace AZ } } // namespace Import } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h index e526a38158..8b33051f1e 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h @@ -43,4 +43,4 @@ namespace AZ }; } // namespace FbxSceneImporter } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.cpp index 8bbe62c913..650eb4c935 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.cpp @@ -73,7 +73,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context); if (serializeContext) { - serializeContext->Class<FbxImporter, SceneCore::LoadingComponent>()->Version(1); + serializeContext->Class<FbxImporter, SceneCore::LoadingComponent>()->Version(2); // SPEC-5776 } } diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.h index 7aa43ca389..5bf9ab84c9 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImporter.h @@ -51,7 +51,7 @@ namespace AZ AZStd::unique_ptr<SDKScene::SceneWrapperBase> m_sceneWrapper; AZStd::shared_ptr<FbxSceneSystem> m_sceneSystem; - bool m_useAssetImporterSDK = false; + bool m_useAssetImporterSDK = true; }; } // namespace FbxSceneBuilder } // namespace SceneAPI diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.cpp index 25ab9830c3..bbb1ac12ea 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.cpp @@ -112,4 +112,4 @@ namespace AZ } } // namespace SceneAPI } // namespace FbxSceneBuilder -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp index 9522512619..e456f2dbab 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.cpp @@ -51,6 +51,7 @@ namespace AZ AZ_Warning("AnimationImporter", false, "Animation ticks per second should not be zero, defaulting to %d keyframes for animation.", keysSize); return keysSize; } + const double totalTicks = duration / ticksPerSecond; AZ::u32 numKeys = keysSize; // +1 because the animation is from [0, duration] - we have a keyframe at the end of the duration which needs to be included @@ -422,10 +423,12 @@ namespace AZ // If there is no bone animation on the current node, then generate one here. AZStd::shared_ptr<SceneData::GraphData::AnimationData> createdAnimationData = AZStd::make_shared<SceneData::GraphData::AnimationData>(); - createdAnimationData->ReserveKeyFrames( - animation->mDuration + - 1); // +1 because we start at 0 and the last keyframe is at mDuration instead of mDuration-1 - createdAnimationData->SetTimeStepBetweenFrames(1.0 / animation->mTicksPerSecond); + + const size_t numKeyframes = animation->mDuration + 1; // +1 because we start at 0 and the last keyframe is at mDuration instead of mDuration-1 + createdAnimationData->ReserveKeyFrames(numKeyframes); + + const double timeStepBetweenFrames = 1.0 / animation->mTicksPerSecond; + createdAnimationData->SetTimeStepBetweenFrames(timeStepBetweenFrames); // Set every frame of the animation to the start location of the node. aiMatrix4x4 combinedTransform = GetConcatenatedLocalTransform(currentNode); @@ -527,7 +530,7 @@ namespace AZ // are less predictable than just using a fixed time step. // AssImp documentation claims animation->mDuration is the duration of the animation in ticks, but // not all animations we've tested follow that pattern. Sometimes duration is in seconds. - const AZ::u32 numKeyFrames = GetNumKeyFrames( + const size_t numKeyFrames = GetNumKeyFrames( AZStd::max(AZStd::max(anim->mNumScalingKeys, anim->mNumPositionKeys), anim->mNumRotationKeys), animation->mDuration, animation->mTicksPerSecond); @@ -543,8 +546,10 @@ namespace AZ for (AZ::u32 frame = 0; frame < numKeyFrames; ++frame) { const double time = GetTimeForFrame(frame, animation->mTicksPerSecond); - aiVector3D scale = aiVector3D(1.f, 1.f, 1.f), position = aiVector3D(0.f, 0.f, 0.f); - aiQuaternion rotation(1.f, 0.f, 0.f, 0.f); + + aiVector3D scale(1.0f, 1.0f, 1.0f); + aiVector3D position(0.0f, 0.0f, 0.0f); + aiQuaternion rotation(1.0f, 0.0f, 0.0f, 0.0f); if (!SampleKeyFrame(scale, anim->mScalingKeys, anim->mNumScalingKeys, time, lastScaleIndex) || !SampleKeyFrame(position, anim->mPositionKeys, anim->mNumPositionKeys, time, lastPositionIndex) || !SampleKeyFrame(rotation, anim->mRotationKeys, anim->mNumRotationKeys, time, lastRotationIndex)) @@ -553,7 +558,6 @@ namespace AZ } aiMatrix4x4 transform(scale, rotation, position); - DataTypes::MatrixType animTransform = AssImpSDKWrapper::AssImpTypeConverter::ToTransform(transform); context.m_sourceSceneSystem.SwapTransformForUpAxis(animTransform); @@ -618,7 +622,7 @@ namespace AZ AZStd::shared_ptr<SceneData::GraphData::BlendShapeAnimationData> morphAnimNode = AZStd::make_shared<SceneData::GraphData::BlendShapeAnimationData>(); - const AZ::u32 numKeyFrames = GetNumKeyFrames(keys.size(), animation->mDuration, animation->mTicksPerSecond); + const size_t numKeyFrames = GetNumKeyFrames(keys.size(), animation->mDuration, animation->mTicksPerSecond); morphAnimNode->ReserveKeyFrames(numKeyFrames); morphAnimNode->SetTimeStepBetweenFrames(s_defaultTimeStepBetweenFrames); @@ -627,7 +631,7 @@ namespace AZ const AZ::u32 maxKeys = keys.size(); AZ::u32 keyIdx = 0; - for (AZ::u32 frame = 0; frame <= numKeyFrames; ++frame) + for (AZ::u32 frame = 0; frame < numKeyFrames; ++frame) { const double time = GetTimeForFrame(frame, animation->mTicksPerSecond); @@ -640,7 +644,6 @@ namespace AZ morphAnimNode->AddKeyFrame(weight); } - const size_t dotIndex = nodeName.find_last_of('.'); nodeName = nodeName.substr(dotIndex + 1); diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp index 6d9189c1de..65e7c00d74 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.cpp @@ -32,7 +32,7 @@ namespace AZ { namespace FbxSceneBuilder { - const char* AssImpUvMapImporter::m_defaultNodeName = "UVMap"; + const char* AssImpUvMapImporter::m_defaultNodeName = "UV"; AssImpUvMapImporter::AssImpUvMapImporter() { @@ -44,7 +44,7 @@ namespace AZ SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context); if (serializeContext) { - serializeContext->Class<AssImpUvMapImporter, SceneCore::LoadingComponent>()->Version(2); // LYN-2576 + serializeContext->Class<AssImpUvMapImporter, SceneCore::LoadingComponent>()->Version(3); // LYN-2506 } } @@ -84,7 +84,13 @@ namespace AZ AZStd::shared_ptr<SceneData::GraphData::MeshVertexUVData> uvMap = AZStd::make_shared<AZ::SceneData::GraphData::MeshVertexUVData>(); uvMap->ReserveContainerSpace(vertexCount); + AZStd::string name(AZStd::string::format("%s%d", m_defaultNodeName, texCoordIndex)); + if (mesh->mTextureCoordsNames[texCoordIndex].length) + { + name = mesh->mTextureCoordsNames[texCoordIndex].C_Str(); + } + uvMap->SetCustomName(name.c_str()); for (int v = 0; v < mesh->mNumVertices; ++v) diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h index b1cd3f7ba3..2abb7f1170 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h @@ -43,4 +43,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.cpp index 821e9ee443..cc20d76d87 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.cpp @@ -125,4 +125,4 @@ namespace AZ } } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h index 1b186184e8..b56a622383 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h @@ -36,4 +36,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h index 118473a15f..29ac288149 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h @@ -36,4 +36,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h index 2782af4824..bf614cf0d3 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h @@ -54,4 +54,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.cpp index 89582ea4e0..90d4dceb6c 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.cpp @@ -66,4 +66,4 @@ namespace AZ } } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h index 423786dcfc..6d205c7bfa 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h @@ -51,4 +51,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h index 3c3fed900a..2ed63a2acd 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h @@ -36,4 +36,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h index 972d0bdcf9..dfe4ee4ecc 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h @@ -76,4 +76,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h index 2aec4729f8..38f561eb04 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h @@ -55,4 +55,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h index 902f371aed..d9e3b5371b 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h @@ -40,4 +40,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h index 9fef5984cf..f64de0034f 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h @@ -55,4 +55,4 @@ namespace AZ }; } // namespace FbxSceneBuilder } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h index a17325e79e..efb85e5275 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h @@ -39,4 +39,4 @@ namespace AZ const AZStd::shared_ptr<const FbxSDKWrapper::FbxMeshWrapper>& sourceMesh, const FbxSceneSystem& sceneSystem); } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.cpp index 2f97f1c347..775f757c4e 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.cpp @@ -182,4 +182,4 @@ namespace AZ return m_vertexControlPoints[m_expectedFaceVertexIndices[faceIndex][vertexIndex]]; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.h index 0ab0c1e439..797e31286d 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxMesh.h @@ -87,4 +87,4 @@ namespace AZ std::vector<std::vector<int> > m_expectedFaceVertexIndices; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.cpp index 3f26955bf3..d2ad7cbcda 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.cpp @@ -35,4 +35,4 @@ namespace AZ m_name = name; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.h index 8cf05b125f..d3b76e54c0 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxNode.h @@ -38,4 +38,4 @@ namespace AZ AZStd::string m_name; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.cpp index 2909ed67b8..b47a340f9f 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.cpp +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.cpp @@ -92,4 +92,4 @@ namespace AZ return m_expectedWeights[vertextIndex][linkIndex]; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.h b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.h index 4dfe1f543f..34cb2f2126 100644 --- a/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.h +++ b/Code/Tools/SceneAPI/FbxSceneBuilder/Tests/TestFbxSkin.h @@ -51,4 +51,4 @@ namespace AZ AZStd::vector<AZStd::vector<float>> m_expectedWeights; }; } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.cpp b/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.cpp index 19f17ea010..b56fc53696 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.cpp @@ -37,4 +37,4 @@ namespace AZ } } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.h index 9a0ae0b9c0..6f44ec2a46 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/BehaviorComponent.h @@ -41,4 +41,4 @@ namespace AZ }; } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/ExportingComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/ExportingComponent.h index f05ca8d697..59c6b63f52 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/ExportingComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/ExportingComponent.h @@ -45,4 +45,4 @@ namespace AZ }; } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/LoadingComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/LoadingComponent.h index f874094af9..425d7773dc 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/LoadingComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/LoadingComponent.h @@ -44,4 +44,4 @@ namespace AZ }; } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/RCExportingComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/RCExportingComponent.h index 6a29a1b1c3..7a087f781f 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/RCExportingComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/RCExportingComponent.h @@ -42,4 +42,4 @@ namespace AZ }; } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.cpp b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.cpp index c4bb5f5642..bda1de6c4e 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.cpp @@ -37,4 +37,4 @@ namespace AZ } } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h index 83dd914b0b..c4f24bee8b 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h @@ -40,4 +40,4 @@ namespace AZ }; } // namespace SceneCore } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/RuleContainer.inl b/Code/Tools/SceneAPI/SceneCore/Containers/RuleContainer.inl index b39616bc94..9ee5b2d760 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/RuleContainer.inl +++ b/Code/Tools/SceneAPI/SceneCore/Containers/RuleContainer.inl @@ -55,4 +55,4 @@ namespace AZ } // Containers } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.inl b/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.inl index bc20522599..0f5c129fbb 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.inl +++ b/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.inl @@ -72,4 +72,4 @@ namespace AZ } } // Containers } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/Filters.h b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/Filters.h index e5c9270b29..a62d070ade 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/Filters.h +++ b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/Filters.h @@ -139,4 +139,4 @@ namespace AZ } // SceneAPI } // AZ -#include <SceneAPI/SceneCore/Containers/Utilities/Filters.inl> \ No newline at end of file +#include <SceneAPI/SceneCore/Containers/Utilities/Filters.inl> diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.h b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.h index 4c55784da2..2456b0a540 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.h +++ b/Code/Tools/SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.h @@ -50,4 +50,4 @@ namespace AZ } // SceneAPI } // AZ -#include <SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.inl> \ No newline at end of file +#include <SceneAPI/SceneCore/Containers/Utilities/ProxyPointer.inl> diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h index 5c76c94581..7ac451c62c 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h @@ -70,4 +70,4 @@ namespace AZ } // SceneAPI } // AZ -#include <SceneAPI/SceneCore/DataTypes/DataTypeUtilities.inl> \ No newline at end of file +#include <SceneAPI/SceneCore/DataTypes/DataTypeUtilities.inl> diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexColorData.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexColorData.h index f4b7a3165e..e2f53c33f9 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexColorData.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexColorData.h @@ -97,6 +97,9 @@ namespace AZ }; } // DataTypes } // SceneAPI + + AZ_TYPE_INFO_SPECIALIZE(SceneAPI::DataTypes::Color, "{937E3BF8-5204-4D40-A8DA-C8F083C89F9F}"); + } // AZ namespace AZStd diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/IAnimationGroup.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/IAnimationGroup.h index 802b214e30..65ab7513cc 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/IAnimationGroup.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/IAnimationGroup.h @@ -57,4 +57,4 @@ namespace AZ }; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h index 6782daba24..2cb1614f92 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h @@ -41,4 +41,4 @@ namespace AZ }; } // DataTypes } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISkeletonGroup.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISkeletonGroup.h index 6d91f88516..ee31db955e 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISkeletonGroup.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/Groups/ISkeletonGroup.h @@ -34,4 +34,4 @@ namespace AZ }; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/IClothRule.h b/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/IClothRule.h index 18162674e4..b88a0897b8 100644 --- a/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/IClothRule.h +++ b/Code/Tools/SceneAPI/SceneCore/DataTypes/Rules/IClothRule.h @@ -18,6 +18,7 @@ #include <SceneAPI/SceneCore/Containers/SceneGraph.h> #include <SceneAPI/SceneCore/Containers/RuleContainer.h> #include <SceneAPI/SceneCore/Utilities/Reporting.h> +#include <SceneAPI/SceneCore/Utilities/SceneGraphSelector.h> namespace AZ { @@ -50,7 +51,12 @@ namespace AZ { AZStd::vector<AZ::Color> clothData; - const char* meshNodeName = graph.GetNodeName(meshNodeIndex).GetPath(); + AZStd::string_view meshNodeName = graph.GetNodeName(meshNodeIndex).GetPath(); + + if (meshNodeName.ends_with(Utilities::OptimizedMeshSuffix)) + { + meshNodeName.remove_suffix(Utilities::OptimizedMeshSuffix.size()); + } for (size_t ruleIndex = 0; ruleIndex < rules.GetRuleCount(); ++ruleIndex) { diff --git a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.cpp b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.cpp index ff54a5653b..587046dca4 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.cpp @@ -37,4 +37,4 @@ namespace AZ } } // namespace Events } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.inl b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.inl index 84cd3695e1..d6d6c39533 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.inl +++ b/Code/Tools/SceneAPI/SceneCore/Events/CallProcessorBus.inl @@ -26,4 +26,4 @@ namespace AZ } } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.cpp b/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.cpp index 37431a1b0b..7c6c6ac1b4 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.cpp @@ -147,4 +147,4 @@ namespace AZ } } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.h b/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.h index 1df1ba3d58..9d65c1e922 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.h +++ b/Code/Tools/SceneAPI/SceneCore/Events/ExportEventContext.h @@ -123,4 +123,4 @@ namespace AZ }; } // namespace Events } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.cpp b/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.cpp index 3ffb7b27fa..7faf496f89 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.cpp @@ -90,4 +90,4 @@ namespace AZ } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.h b/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.h index b1db98fc19..7bef9998d2 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.h +++ b/Code/Tools/SceneAPI/SceneCore/Events/ImportEventContext.h @@ -81,4 +81,4 @@ namespace AZ }; } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ProcessingResult.cpp b/Code/Tools/SceneAPI/SceneCore/Events/ProcessingResult.cpp index eb2730ff6a..92234a4632 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ProcessingResult.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/ProcessingResult.cpp @@ -54,4 +54,4 @@ namespace AZ } } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Events/SceneSerializationBus.h b/Code/Tools/SceneAPI/SceneCore/Events/SceneSerializationBus.h index c7dec14649..4bee60cd0e 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/SceneSerializationBus.h +++ b/Code/Tools/SceneAPI/SceneCore/Events/SceneSerializationBus.h @@ -55,4 +55,4 @@ namespace AZ inline SceneSerialization::~SceneSerialization() = default; } // namespace Events } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Export/MtlMaterialExporter.cpp b/Code/Tools/SceneAPI/SceneCore/Export/MtlMaterialExporter.cpp index f364167173..261b7be33f 100644 --- a/Code/Tools/SceneAPI/SceneCore/Export/MtlMaterialExporter.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Export/MtlMaterialExporter.cpp @@ -86,7 +86,7 @@ namespace AZ if (sourceFileExists && !updateMaterial) { - // Don't write to the cache if there's a source material as this will be the master material. + // Don't write to the cache if there's a source material as this will be the primary material. continue; } diff --git a/Code/Tools/SceneAPI/SceneCore/Mocks/Events/MockAssetImportRequest.h b/Code/Tools/SceneAPI/SceneCore/Mocks/Events/MockAssetImportRequest.h index 2bb2c6c27c..20d41c1c72 100644 --- a/Code/Tools/SceneAPI/SceneCore/Mocks/Events/MockAssetImportRequest.h +++ b/Code/Tools/SceneAPI/SceneCore/Mocks/Events/MockAssetImportRequest.h @@ -92,4 +92,4 @@ namespace AZ }; } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/SceneBuilderDependencyBus.h b/Code/Tools/SceneAPI/SceneCore/SceneBuilderDependencyBus.h index 692a9b55e8..b213a9f3a9 100644 --- a/Code/Tools/SceneAPI/SceneCore/SceneBuilderDependencyBus.h +++ b/Code/Tools/SceneAPI/SceneCore/SceneBuilderDependencyBus.h @@ -32,4 +32,4 @@ namespace AZ }; using SceneBuilderDependencyBus = EBus<SceneBuilderDependencyRequests>; } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/DataObjectTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/DataObjectTests.cpp index e189f613ba..745f6f0507 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/DataObjectTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/DataObjectTests.cpp @@ -296,4 +296,4 @@ TEST_F(DataObjectTest, Reflect_ReflectIsCalledMultipleTimesOnSameStoredObject_Re AZ::SerializeContext context; result->ReflectData(&context); result->ReflectData(&context); -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Events/AssetImporterRequestTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Events/AssetImporterRequestTests.cpp index 43345ab0ab..d2eda4f987 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Events/AssetImporterRequestTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Events/AssetImporterRequestTests.cpp @@ -323,4 +323,4 @@ namespace AZ } // Events } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Export/MaterialIOTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Export/MaterialIOTests.cpp index ec4966d619..0ba4fc70b9 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Export/MaterialIOTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Export/MaterialIOTests.cpp @@ -55,4 +55,4 @@ TEST(MaterialIO, Material_SetDataFromMtl_TextureMissingMapAndFile_DoesNotGetStuc material.SetDataFromMtl(materialXmlNode); azdestroy(xmlDoc); -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Utilities/PatternMatcherTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Utilities/PatternMatcherTests.cpp index 72b109e87d..41f35d59d9 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Utilities/PatternMatcherTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Utilities/PatternMatcherTests.cpp @@ -62,4 +62,4 @@ namespace AZ } } // SceneCore } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.cpp b/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.cpp index 7c9322b262..03dcd4b325 100644 --- a/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.cpp @@ -64,4 +64,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.h b/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.h index 14f6003f96..97babb92ee 100644 --- a/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.h +++ b/Code/Tools/SceneAPI/SceneCore/Utilities/FileUtilities.h @@ -30,4 +30,4 @@ namespace AZ }; } } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.cpp b/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.cpp index 981380fe00..ee637dd4dc 100644 --- a/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.cpp @@ -47,7 +47,7 @@ namespace AZ Containers::SceneGraph::NodeIndex SceneGraphSelector::RemapToOptimizedMesh(const Containers::SceneGraph& graph, const Containers::SceneGraph::NodeIndex& index) { const auto& nodeName = graph.GetNodeName(index); - const AZStd::string optimizedName = AZStd::string(nodeName.GetPath(), nodeName.GetPathLength()) + "_optimized"; + const AZStd::string optimizedName = AZStd::string(nodeName.GetPath(), nodeName.GetPathLength()).append(OptimizedMeshSuffix); if (auto optimizedIndex = graph.Find(optimizedName); optimizedIndex.IsValid()) { return optimizedIndex; diff --git a/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.h b/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.h index 535a7a9637..8a86bf9dc2 100644 --- a/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.h +++ b/Code/Tools/SceneAPI/SceneCore/Utilities/SceneGraphSelector.h @@ -22,6 +22,8 @@ namespace AZ::SceneAPI::DataTypes { class ISceneNodeSelectionList; } namespace AZ::SceneAPI::Utilities { + inline constexpr AZStd::string_view OptimizedMeshSuffix = "_optimized"; + // SceneGraphSelector provides utilities including converting selected and unselected node lists // in the MeshGroup into the final target node list. class SceneGraphSelector diff --git a/Code/Tools/SceneAPI/SceneData/Behaviors/AnimationGroup.h b/Code/Tools/SceneAPI/SceneData/Behaviors/AnimationGroup.h index 46672eaf8f..f4def6b178 100644 --- a/Code/Tools/SceneAPI/SceneData/Behaviors/AnimationGroup.h +++ b/Code/Tools/SceneAPI/SceneData/Behaviors/AnimationGroup.h @@ -54,4 +54,4 @@ namespace AZ }; } // namespace Behaviors } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.cpp index 083adeff50..b54aa1e421 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.cpp @@ -11,6 +11,8 @@ */ #include <SceneAPI/SceneData/GraphData/AnimationData.h> +#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/RTTI/BehaviorContext.h> namespace AZ { @@ -18,6 +20,31 @@ namespace AZ { namespace GraphData { + void AnimationData::Reflect(ReflectContext* context) + { + SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context); + if (serializeContext) + { + serializeContext->Class<AnimationData, SceneAPI::DataTypes::IAnimationData>() + ->Version(1); + } + + BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context); + if (behaviorContext) + { + behaviorContext->Class<SceneAPI::DataTypes::IAnimationData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Method("GetKeyFrameCount", &SceneAPI::DataTypes::IAnimationData::GetKeyFrameCount) + ->Method("GetKeyFrame", &SceneAPI::DataTypes::IAnimationData::GetKeyFrame) + ->Method("GetTimeStepBetweenFrames", &SceneAPI::DataTypes::IAnimationData::GetTimeStepBetweenFrames); + + behaviorContext->Class<AnimationData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene"); + } + } + AnimationData::AnimationData() : m_timeStepBetweenFrames(1.0/30.0) // default value { @@ -61,6 +88,32 @@ namespace AZ } + void BlendShapeAnimationData::Reflect(ReflectContext* context) + { + SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context); + if (serializeContext) + { + serializeContext->Class<BlendShapeAnimationData, SceneAPI::DataTypes::IBlendShapeAnimationData>() + ->Version(1); + } + + BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context); + if (behaviorContext) + { + behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeAnimationData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Method("GetBlendShapeName", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetBlendShapeName) + ->Method("GetKeyFrameCount", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetKeyFrameCount) + ->Method("GetKeyFrame", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetKeyFrame) + ->Method("GetTimeStepBetweenFrames", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetTimeStepBetweenFrames); + + behaviorContext->Class<BlendShapeAnimationData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene"); + } + } + BlendShapeAnimationData::BlendShapeAnimationData() : m_timeStepBetweenFrames(1 / 30.0) // default value { diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.h b/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.h index 6f3f9a05f5..af44618878 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.h +++ b/Code/Tools/SceneAPI/SceneData/GraphData/AnimationData.h @@ -30,6 +30,8 @@ namespace AZ public: AZ_RTTI(AnimationData, "{D350732E-4727-41C8-95E0-FBAF5F2AC074}", SceneAPI::DataTypes::IAnimationData); + static void Reflect(ReflectContext* context); + SCENE_DATA_API AnimationData(); SCENE_DATA_API ~AnimationData() override = default; SCENE_DATA_API virtual void AddKeyFrame(const SceneAPI::DataTypes::MatrixType& keyFrameTransform); @@ -53,6 +55,8 @@ namespace AZ public: AZ_RTTI(BlendShapeAnimationData, "{02766CCF-BDA7-46B6-9BB1-58A90C1AD6AA}", SceneAPI::DataTypes::IBlendShapeAnimationData); + static void Reflect(ReflectContext* context); + SCENE_DATA_API BlendShapeAnimationData(); SCENE_DATA_API ~BlendShapeAnimationData() override = default; SCENE_DATA_API void CloneAttributesFrom(const IGraphObject* sourceObject) override; diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp index a26f07ae53..902928d404 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.cpp @@ -12,9 +12,13 @@ #include <AzCore/Casting/numeric_cast.h> #include <SceneAPI/SceneData/GraphData/BlendShapeData.h> +#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/RTTI/BehaviorContext.h> namespace AZ { + AZ_TYPE_INFO_SPECIALIZE(SceneAPI::DataTypes::IBlendShapeData::Face, "{C972EC9A-3A5C-47CD-9A92-ECB4C0C0451C}"); + namespace SceneData { namespace GraphData @@ -23,6 +27,82 @@ namespace AZ BlendShapeData::~BlendShapeData() = default; + void BlendShapeData::Reflect(ReflectContext* context) + { + SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context); + if (serializeContext) + { + serializeContext->Class<BlendShapeData, SceneAPI::DataTypes::IBlendShapeData>() + ->Version(1); + } + + BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context); + if (behaviorContext) + { + behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Method("GetUsedControlPointCount", &SceneAPI::DataTypes::IBlendShapeData::GetUsedControlPointCount) + ->Method("GetControlPointIndex", &SceneAPI::DataTypes::IBlendShapeData::GetControlPointIndex) + ->Method("GetUsedPointIndexForControlPoint", &SceneAPI::DataTypes::IBlendShapeData::GetUsedPointIndexForControlPoint) + ->Method("GetVertexCount", &SceneAPI::DataTypes::IBlendShapeData::GetVertexCount) + ->Method("GetFaceCount", &SceneAPI::DataTypes::IBlendShapeData::GetFaceCount) + ->Method("GetFaceInfo", &SceneAPI::DataTypes::IBlendShapeData::GetFaceInfo) + ->Method("GetPosition", &SceneAPI::DataTypes::IBlendShapeData::GetPosition) + ->Method("GetNormal", &SceneAPI::DataTypes::IBlendShapeData::GetNormal) + ->Method("GetFaceVertexIndex", &SceneAPI::DataTypes::IBlendShapeData::GetFaceVertexIndex); + + behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeData::Face>("BlendShapeDataFace") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Method("GetVertexIndex", [](const SceneAPI::DataTypes::IBlendShapeData::Face& self, int index) + { + if (index >= 0 && index < 3) + { + return self.vertexIndex[index]; + } + return aznumeric_cast<unsigned int>(0); + }); + + behaviorContext->Class<BlendShapeData>() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Method("GetUV", &BlendShapeData::GetUV) + ->Method("GetTangent", [](const BlendShapeData& self, size_t index) + { + if (index < self.GetTangents().size()) + { + return self.GetTangents().at(index); + } + AZ_Error("SceneGraphData", false, "Cannot get to tangent at index(%zu)", index); + return Vector4::CreateZero(); + }) + ->Method("GetBitangent", [](const BlendShapeData& self, size_t index) + { + if (index < self.GetBitangents().size()) + { + return self.GetBitangents().at(index); + } + AZ_Error("SceneGraphData", false, "Cannot get to bitangents at index(%zu)", index); + return Vector3::CreateZero(); + }) + ->Method("GetColor", [](const BlendShapeData& self, AZ::u8 colorSetIndex, AZ::u8 colorIndex) + { + SceneAPI::DataTypes::Color color(0,0,0,0); + if (colorSetIndex < MaxNumColorSets) + { + const AZStd::vector<SceneAPI::DataTypes::Color>& colorChannel = self.GetColors(colorSetIndex); + if (colorIndex < colorChannel.size()) + { + return colorChannel[colorIndex]; + } + } + AZ_Error("SceneGraphData", false, "Cannot get to color setIndex(%d) at colorIndex(%d)", colorSetIndex, colorIndex); + return color; + }); + } + } + void BlendShapeData::AddPosition(const Vector3& position) { m_positions.push_back(position); diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h index 0626b6b6cf..9ae287da46 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h +++ b/Code/Tools/SceneAPI/SceneData/GraphData/BlendShapeData.h @@ -31,6 +31,8 @@ namespace AZ public: AZ_RTTI(BlendShapeData, "{FF875C22-2E4F-4CE3-BA49-09BF78C70A09}", SceneAPI::DataTypes::IBlendShapeData) + SCENE_DATA_API static void Reflect(ReflectContext* context); + // Maximum number of color sets matches limitation set in assImp (AI_MAX_NUMBER_OF_COLOR_SETS) static constexpr AZ::u8 MaxNumColorSets = 8; // Maximum number of uv sets matches limitation set in assImp (AI_MAX_NUMBER_OF_TEXTURECOORDS) diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/MeshVertexColorData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/MeshVertexColorData.cpp index fe3cede475..a5ed4132ea 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/MeshVertexColorData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/MeshVertexColorData.cpp @@ -16,8 +16,6 @@ namespace AZ { - AZ_TYPE_INFO_SPECIALIZE(SceneAPI::DataTypes::Color, "{937E3BF8-5204-4D40-A8DA-C8F083C89F9F}"); - namespace SceneData { namespace GraphData @@ -40,7 +38,7 @@ namespace AZ ->Method("GetCount", &MeshVertexColorData::GetCount ) ->Method("GetColor", &MeshVertexColorData::GetColor); - behaviorContext->Class<AZ::SceneAPI::DataTypes::Color>("MeshVertexColor") + behaviorContext->Class<AZ::SceneAPI::DataTypes::Color>("VertexColor") ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Module, "scene") ->Property("red", BehaviorValueGetter(&AZ::SceneAPI::DataTypes::Color::red), nullptr) diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/RootBoneData.h b/Code/Tools/SceneAPI/SceneData/GraphData/RootBoneData.h index f13240b790..fd0a7ef2d1 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/RootBoneData.h +++ b/Code/Tools/SceneAPI/SceneData/GraphData/RootBoneData.h @@ -34,4 +34,4 @@ namespace AZ }; } // namespace GraphData } // namespace SceneData -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/SkinMeshData.h b/Code/Tools/SceneAPI/SceneData/GraphData/SkinMeshData.h index 8d1b0593ac..1bd78cffd5 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/SkinMeshData.h +++ b/Code/Tools/SceneAPI/SceneData/GraphData/SkinMeshData.h @@ -31,4 +31,4 @@ namespace AZ }; } // GraphData } // SceneData -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.cpp b/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.cpp index 00d023530e..978a30aebb 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.cpp +++ b/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.cpp @@ -205,4 +205,4 @@ namespace AZ } // namespace SceneData } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/Groups/MeshGroup.cpp b/Code/Tools/SceneAPI/SceneData/Groups/MeshGroup.cpp index 6ba39e6a65..1449c1f7a8 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/MeshGroup.cpp +++ b/Code/Tools/SceneAPI/SceneData/Groups/MeshGroup.cpp @@ -132,4 +132,4 @@ namespace AZ } // namespace SceneData } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.cpp b/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.cpp index bed8397714..c2ffb5340e 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.cpp +++ b/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.cpp @@ -132,4 +132,4 @@ namespace AZ } // namespace SceneData } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.cpp b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.cpp index 6b16ab14b4..1a350d50d1 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.cpp +++ b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.cpp @@ -138,4 +138,4 @@ namespace AZ } // namespace SceneData } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h index da149f8142..5e0247d7ca 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h +++ b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h @@ -68,4 +68,4 @@ namespace AZ } // SceneData } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp index 6a04e071d7..a9e0c7b1a5 100644 --- a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp +++ b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp @@ -81,8 +81,9 @@ namespace AZ SceneData::SceneNodeSelectionList::Reflect(context); // Graph objects - context->Class<AZ::SceneData::GraphData::AnimationData>()->Version(1); - context->Class<AZ::SceneData::GraphData::BlendShapeData>()->Version(1); + AZ::SceneData::GraphData::AnimationData::Reflect(context); + AZ::SceneData::GraphData::BlendShapeAnimationData::Reflect(context); + AZ::SceneData::GraphData::BlendShapeData::Reflect(context); AZ::SceneData::GraphData::BoneData::Reflect(context); AZ::SceneData::GraphData::MaterialData::Reflect(context); AZ::SceneData::GraphData::MeshData::Reflect(context); @@ -107,6 +108,9 @@ namespace AZ AZ::SceneData::GraphData::MeshVertexUVData::Reflect(context); AZ::SceneData::GraphData::MeshVertexTangentData::Reflect(context); AZ::SceneData::GraphData::MeshVertexBitangentData::Reflect(context); + AZ::SceneData::GraphData::AnimationData::Reflect(context); + AZ::SceneData::GraphData::BlendShapeAnimationData::Reflect(context); + AZ::SceneData::GraphData::BlendShapeData::Reflect(context); } } // namespace SceneAPI } // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.h b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.h index 340ff61ea7..e2d86f86df 100644 --- a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.h +++ b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.h @@ -21,4 +21,4 @@ namespace AZ SCENE_DATA_API void RegisterDataTypeReflection(AZ::SerializeContext* context); SCENE_DATA_API void RegisterDataTypeBehaviorReflection(AZ::BehaviorContext* context); } -} \ No newline at end of file +} diff --git a/Code/Tools/SceneAPI/SceneData/SceneDataConfiguration.h b/Code/Tools/SceneAPI/SceneData/SceneDataConfiguration.h index f9277107cf..c19ccdc763 100644 --- a/Code/Tools/SceneAPI/SceneData/SceneDataConfiguration.h +++ b/Code/Tools/SceneAPI/SceneData/SceneDataConfiguration.h @@ -38,4 +38,4 @@ #define SCENE_DATA_API AZ_DLL_IMPORT #endif #endif -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp index 404950b4c0..79c6cfea7e 100644 --- a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp +++ b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp @@ -29,6 +29,8 @@ #include <SceneAPI/SceneData/GraphData/MeshVertexColorData.h> #include <SceneAPI/SceneData/GraphData/MeshVertexTangentData.h> #include <SceneAPI/SceneData/GraphData/MeshVertexUVData.h> +#include <SceneAPI/SceneData/GraphData/AnimationData.h> +#include <SceneAPI/SceneData/GraphData/BlendShapeData.h> namespace AZ { @@ -101,6 +103,53 @@ namespace AZ tangentData->SetTangentSetIndex(2); return true; } + else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::AnimationData>()) + { + auto* animationData = AZStd::any_cast<AZ::SceneData::GraphData::AnimationData>(&data); + animationData->ReserveKeyFrames(3); + animationData->AddKeyFrame(DataTypes::MatrixType::CreateFromValue(1.0)); + animationData->AddKeyFrame(DataTypes::MatrixType::CreateFromValue(2.0)); + animationData->AddKeyFrame(DataTypes::MatrixType::CreateFromValue(3.0)); + animationData->SetTimeStepBetweenFrames(4.0); + return true; + } + else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::BlendShapeAnimationData>()) + { + auto* blendShapeAnimationData = AZStd::any_cast<AZ::SceneData::GraphData::BlendShapeAnimationData>(&data); + blendShapeAnimationData->SetBlendShapeName("mockBlendShapeName"); + blendShapeAnimationData->ReserveKeyFrames(3); + blendShapeAnimationData->AddKeyFrame(1.0); + blendShapeAnimationData->AddKeyFrame(2.0); + blendShapeAnimationData->AddKeyFrame(3.0); + blendShapeAnimationData->SetTimeStepBetweenFrames(4.0); + return true; + } + else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::BlendShapeData>()) + { + auto* blendShapeData = AZStd::any_cast<AZ::SceneData::GraphData::BlendShapeData>(&data); + blendShapeData->AddPosition({ 1.0, 2.0, 3.0 }); + blendShapeData->AddPosition({ 2.0, 3.0, 4.0 }); + blendShapeData->AddPosition({ 3.0, 4.0, 5.0 }); + blendShapeData->AddNormal({ 0.1, 0.2, 0.3 }); + blendShapeData->AddNormal({ 0.2, 0.3, 0.4 }); + blendShapeData->AddNormal({ 0.3, 0.4, 0.5 }); + blendShapeData->AddTangentAndBitangent(Vector4{ 0.1f, 0.2f, 0.3f, 0.4f }, { 0.0, 0.1, 0.2 }); + blendShapeData->AddTangentAndBitangent(Vector4{ 0.2f, 0.3f, 0.4f, 0.5f }, { 0.1, 0.2, 0.3 }); + blendShapeData->AddTangentAndBitangent(Vector4{ 0.3f, 0.4f, 0.5f, 0.6f }, { 0.2, 0.3, 0.4 }); + blendShapeData->AddUV(Vector2{ 0.9, 0.8 }, 0); + blendShapeData->AddUV(Vector2{ 0.7, 0.7 }, 1); + blendShapeData->AddUV(Vector2{ 0.6, 0.6 }, 2); + blendShapeData->AddColor(DataTypes::Color{ 0.1, 0.2, 0.3, 0.4 }, 0); + blendShapeData->AddColor(DataTypes::Color{ 0.2, 0.3, 0.4, 0.5 }, 1); + blendShapeData->AddColor(DataTypes::Color{ 0.3, 0.4, 0.5, 0.6 }, 2); + blendShapeData->AddFace({ 0, 1, 2 }); + blendShapeData->AddFace({ 1, 2, 0 }); + blendShapeData->AddFace({ 2, 0, 1 }); + blendShapeData->SetVertexIndexToControlPointIndexMap(0, 1); + blendShapeData->SetVertexIndexToControlPointIndexMap(1, 2); + blendShapeData->SetVertexIndexToControlPointIndexMap(2, 0); + return true; + } return false; } @@ -296,6 +345,116 @@ namespace AZ ExpectExecute("TestExpectIntegerEquals(meshVertexTangentData:GetTangentSetIndex(), 2)"); ExpectExecute("TestExpectTrue(meshVertexTangentData:GetTangentSpace(), MeshVertexTangentData.EMotionFX)"); } + + TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_AnimationData_AccessWorks) + { + ExpectExecute("animationData = AnimationData()"); + ExpectExecute("TestExpectTrue(animationData ~= nil)"); + ExpectExecute("MockGraphData.FillData(animationData)"); + ExpectExecute("TestExpectIntegerEquals(animationData:GetKeyFrameCount(), 3)"); + ExpectExecute("TestExpectFloatEquals(animationData:GetTimeStepBetweenFrames(), 4.0)"); + ExpectExecute("TestExpectFloatEquals(animationData:GetKeyFrame(0).basisX.x, 1.0)"); + ExpectExecute("TestExpectFloatEquals(animationData:GetKeyFrame(1).basisX.y, 2.0)"); + ExpectExecute("TestExpectFloatEquals(animationData:GetKeyFrame(2).basisX.z, 3.0)"); + } + + TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_BlendShapeAnimationData_AccessWorks) + { + ExpectExecute("blendShapeAnimationData = BlendShapeAnimationData()"); + ExpectExecute("TestExpectTrue(blendShapeAnimationData ~= nil)"); + ExpectExecute("MockGraphData.FillData(blendShapeAnimationData)"); + ExpectExecute("TestExpectTrue(blendShapeAnimationData:GetBlendShapeName() == 'mockBlendShapeName')"); + ExpectExecute("TestExpectIntegerEquals(blendShapeAnimationData:GetKeyFrameCount(), 3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeAnimationData:GetKeyFrame(0), 1.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeAnimationData:GetKeyFrame(1), 2.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeAnimationData:GetKeyFrame(2), 3.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeAnimationData:GetTimeStepBetweenFrames(), 4.0)"); + } + + TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_BlendShapeData_AccessWorks) + { + ExpectExecute("blendShapeData = BlendShapeData()"); + ExpectExecute("TestExpectTrue(blendShapeData ~= nil)"); + ExpectExecute("MockGraphData.FillData(blendShapeData)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetUsedControlPointCount(), 3)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetVertexCount(), 3)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetFaceCount(), 3)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetFaceVertexIndex(0, 2), 2)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetFaceVertexIndex(1, 0), 1)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetFaceVertexIndex(2, 1), 0)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetControlPointIndex(0), 1)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetControlPointIndex(1), 2)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetControlPointIndex(2), 0)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetUsedPointIndexForControlPoint(0), 2)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetUsedPointIndexForControlPoint(1), 0)"); + ExpectExecute("TestExpectIntegerEquals(blendShapeData:GetUsedPointIndexForControlPoint(2), 1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(0).x, 1.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(0).y, 2.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(0).z, 3.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(1).x, 2.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(1).y, 3.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(1).z, 4.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(2).x, 3.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(2).y, 4.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetPosition(2).z, 5.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(0).x, 0.1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(0).y, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(0).z, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(1).x, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(1).y, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(1).z, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(2).x, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(2).y, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetNormal(2).z, 0.5)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(0):GetVertexIndex(0), 0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(0):GetVertexIndex(1), 1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(0):GetVertexIndex(2), 2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(1):GetVertexIndex(0), 1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(1):GetVertexIndex(1), 2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(1):GetVertexIndex(2), 0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(2):GetVertexIndex(0), 2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(2):GetVertexIndex(1), 0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetFaceInfo(2):GetVertexIndex(2), 1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 0).x, 0.9)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 0).y, 0.8)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 1).x, 0.7)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 1).y, 0.7)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 2).x, 0.6)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetUV(0, 2).y, 0.6)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(0, 0).red, 0.1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(0, 0).green, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(0, 0).blue, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(0, 0).alpha, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(1, 0).red, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(1, 0).green, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(1, 0).blue, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(1, 0).alpha, 0.5)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(2, 0).red, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(2, 0).green, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(2, 0).blue, 0.5)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetColor(2, 0).alpha, 0.6)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(0).x, 0.1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(0).y, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(0).z, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(0).w, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(1).x, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(1).y, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(1).z, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(1).w, 0.5)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(2).x, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(2).y, 0.4)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(2).z, 0.5)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetTangent(2).w, 0.6)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(0).x, 0.0)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(0).y, 0.1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(0).z, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(1).x, 0.1)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(1).y, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(1).z, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).x, 0.2)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).y, 0.3)"); + ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).z, 0.4)"); + } } } } diff --git a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.cpp b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.cpp index 61c47de69e..2c31975b54 100644 --- a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.cpp @@ -58,4 +58,4 @@ namespace AZ } // SceneAPI } // AZ -#include <CommonWidgets/moc_ExpandCollapseToggler.cpp> \ No newline at end of file +#include <CommonWidgets/moc_ExpandCollapseToggler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.h b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.h index 85b5c07d0c..a5700c8240 100644 --- a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.h +++ b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/ExpandCollapseToggler.h @@ -52,4 +52,4 @@ namespace AZ }; } // SceneUI } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/JobWatcher.cpp b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/JobWatcher.cpp index ac98e93d3e..5b82ce0ad5 100644 --- a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/JobWatcher.cpp +++ b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/JobWatcher.cpp @@ -98,4 +98,4 @@ namespace AZ } // namespace SceneAPI } // namespace AZ -#include <CommonWidgets/moc_JobWatcher.cpp> \ No newline at end of file +#include <CommonWidgets/moc_JobWatcher.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidget.h b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidget.h index d7f4f37d50..0ae33406f8 100644 --- a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidget.h +++ b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidget.h @@ -37,4 +37,4 @@ namespace AZ }; } // namespace SceneUI } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidgetLayer.h b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidgetLayer.h index 0d3de60d88..e17b40cfe3 100644 --- a/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidgetLayer.h +++ b/Code/Tools/SceneAPI/SceneUI/CommonWidgets/OverlayWidgetLayer.h @@ -30,4 +30,4 @@ namespace AZ }; } // namespace UI } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.cpp b/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.cpp index 1ef03da258..79e496e6b2 100644 --- a/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.cpp @@ -63,4 +63,4 @@ namespace AZ } } // SceneData } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.h b/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.h index dbdfd5a747..a8a4d08a32 100644 --- a/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/GraphMetaInfoHandler.h @@ -34,4 +34,4 @@ namespace AZ }; } // SceneData } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/AsyncOperationProcessingHandler.cpp b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/AsyncOperationProcessingHandler.cpp index a1dd1e02dd..5931616b93 100644 --- a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/AsyncOperationProcessingHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/AsyncOperationProcessingHandler.cpp @@ -59,4 +59,4 @@ namespace AZ } } -#include <Handlers/ProcessingHandlers/moc_AsyncOperationProcessingHandler.cpp> \ No newline at end of file +#include <Handlers/ProcessingHandlers/moc_AsyncOperationProcessingHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ExportJobProcessingHandler.cpp b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ExportJobProcessingHandler.cpp index a392a463ba..83c69ef779 100644 --- a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ExportJobProcessingHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ExportJobProcessingHandler.cpp @@ -84,4 +84,4 @@ namespace AZ } } -#include <Handlers/ProcessingHandlers/moc_ExportJobProcessingHandler.cpp> \ No newline at end of file +#include <Handlers/ProcessingHandlers/moc_ExportJobProcessingHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ProcessingHandler.cpp b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ProcessingHandler.cpp index c16ac44adc..22e463b3b4 100644 --- a/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ProcessingHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/Handlers/ProcessingHandlers/ProcessingHandler.cpp @@ -27,4 +27,4 @@ namespace AZ } } -#include <Handlers/ProcessingHandlers/moc_ProcessingHandler.cpp> \ No newline at end of file +#include <Handlers/ProcessingHandlers/moc_ProcessingHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.cpp b/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.cpp index d0b2fff9d5..3d49c04228 100644 --- a/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.cpp @@ -56,4 +56,4 @@ namespace AZ } } // SceneData } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.h b/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.h index febe28761b..0e69fb884a 100644 --- a/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/ManifestMetaInfoHandler.h @@ -33,4 +33,4 @@ namespace AZ }; } // SceneData } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.cpp b/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.cpp index 5a3214305f..e83c2bfdad 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.cpp @@ -85,4 +85,4 @@ namespace AZ } // SceneAPI } // AZ -#include <RowWidgets/moc_HeaderHandler.cpp> \ No newline at end of file +#include <RowWidgets/moc_HeaderHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.h index ebfe48072c..2c270f3d78 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/HeaderHandler.h @@ -66,4 +66,4 @@ namespace AZ }; } // UI } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.cpp b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.cpp index 2d2741ae48..d654c8c98b 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.cpp @@ -105,4 +105,4 @@ namespace AZ } // SceneAPI } // AZ -#include <RowWidgets/moc_ManifestNameHandler.cpp> \ No newline at end of file +#include <RowWidgets/moc_ManifestNameHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h index 0f81d4c86f..9ed29f582f 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h @@ -59,4 +59,4 @@ namespace AZ }; } // SceneUI } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestVectorHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestVectorHandler.h index e86c091505..907c8058ca 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestVectorHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestVectorHandler.h @@ -69,4 +69,4 @@ namespace AZ }; } // UI } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.cpp b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.cpp index dfcded16d3..972d13477f 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.cpp @@ -197,4 +197,4 @@ namespace AZ } // SceneAPI } // AZ -#include <RowWidgets/moc_NodeListSelectionHandler.cpp> \ No newline at end of file +#include <RowWidgets/moc_NodeListSelectionHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h index d573dc4a6d..207e738118 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h @@ -92,4 +92,4 @@ namespace AZ }; } // UI } // SceneAPI -} // AZ \ No newline at end of file +} // AZ diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeTreeSelectionHandler.cpp b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeTreeSelectionHandler.cpp index e34c969b96..5ebc2dbc4e 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeTreeSelectionHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeTreeSelectionHandler.cpp @@ -169,4 +169,4 @@ namespace AZ } // SceneAPI } // AZ -#include <RowWidgets/moc_NodeTreeSelectionHandler.cpp> \ No newline at end of file +#include <RowWidgets/moc_NodeTreeSelectionHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.cpp b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.cpp index 09588a606e..322aa9ac51 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.cpp +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.cpp @@ -109,4 +109,4 @@ namespace AZ } // namespace SceneAPI } // namespace AZ -#include <RowWidgets/moc_TransformRowHandler.cpp> \ No newline at end of file +#include <RowWidgets/moc_TransformRowHandler.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h index a020ee8198..582f32649e 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h @@ -60,4 +60,4 @@ namespace AZ }; } // namespace SceneUI } // namespace SceneAPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SceneAPI/SceneUI/SceneUI.qrc b/Code/Tools/SceneAPI/SceneUI/SceneUI.qrc index 3f8dcae2be..9b4ad04628 100644 --- a/Code/Tools/SceneAPI/SceneUI/SceneUI.qrc +++ b/Code/Tools/SceneAPI/SceneUI/SceneUI.qrc @@ -18,4 +18,4 @@ <file alias="ExpandIcon.png">../../../../Editor/Icons/PropertyEditor/group_closed.png</file> <file alias="CollapseIcon.png">../../../../Editor/Icons/PropertyEditor/group_open.png</file> </qresource> -</RCC> \ No newline at end of file +</RCC> diff --git a/Code/Tools/SceneAPI/SceneUI/SceneUIConfiguration.h b/Code/Tools/SceneAPI/SceneUI/SceneUIConfiguration.h index 3e1c5ac627..372085d045 100644 --- a/Code/Tools/SceneAPI/SceneUI/SceneUIConfiguration.h +++ b/Code/Tools/SceneAPI/SceneUI/SceneUIConfiguration.h @@ -22,4 +22,4 @@ #else #define SCENE_UI_API AZ_DLL_IMPORT #endif -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/SceneAPI/SceneUI/SceneWidgets/ManifestWidget.cpp b/Code/Tools/SceneAPI/SceneUI/SceneWidgets/ManifestWidget.cpp index 47f58412d1..5c4daeb639 100644 --- a/Code/Tools/SceneAPI/SceneUI/SceneWidgets/ManifestWidget.cpp +++ b/Code/Tools/SceneAPI/SceneUI/SceneWidgets/ManifestWidget.cpp @@ -202,4 +202,4 @@ namespace AZ } // namespace SceneAPI } // namespace AZ -#include <SceneWidgets/moc_ManifestWidget.cpp> \ No newline at end of file +#include <SceneWidgets/moc_ManifestWidget.cpp> diff --git a/Code/Tools/SceneAPI/SceneUI/SceneWidgets/SceneGraphWidget.h b/Code/Tools/SceneAPI/SceneUI/SceneWidgets/SceneGraphWidget.h index 4f2406206f..ce01889a63 100644 --- a/Code/Tools/SceneAPI/SceneUI/SceneWidgets/SceneGraphWidget.h +++ b/Code/Tools/SceneAPI/SceneUI/SceneWidgets/SceneGraphWidget.h @@ -84,7 +84,7 @@ namespace AZ NoneCheckable, // No nodes can be checked. OnlyFilterTypesCheckable // Only nodes in the filter type list can be checked. }; - // Updates the tree to include/exclude check boxes and the master selection. Call "BuildTree()" to rebuild the tree. + // Updates the tree to include/exclude check boxes and the primary selection. Call "BuildTree()" to rebuild the tree. virtual void MakeCheckable(CheckableOption option); // Add a type to filter for. Filter types are used to determine if a check box is added and/or to be shown if // the type is an end point. See "IncludeEndPoints" and "MakeCheckable" for more details. diff --git a/Code/Tools/SerializeContextTools/Dumper.h b/Code/Tools/SerializeContextTools/Dumper.h index 0161347186..854a69bfa5 100644 --- a/Code/Tools/SerializeContextTools/Dumper.h +++ b/Code/Tools/SerializeContextTools/Dumper.h @@ -58,4 +58,4 @@ namespace AZ static void AppendTypeName(AZStd::string& output, const SerializeContext::ClassData* classData, const Uuid& classId); }; } // namespace SerializeContextTools -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Code/Tools/SerializeContextTools/Platform/Linux/PAL_linux.cmake b/Code/Tools/SerializeContextTools/Platform/Linux/PAL_linux.cmake index 89cdec830c..ecfdcccea0 100644 --- a/Code/Tools/SerializeContextTools/Platform/Linux/PAL_linux.cmake +++ b/Code/Tools/SerializeContextTools/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS FALSE) diff --git a/Code/Tools/SerializeContextTools/Platform/Mac/PAL_mac.cmake b/Code/Tools/SerializeContextTools/Platform/Mac/PAL_mac.cmake index 315dc7c760..6821ca40eb 100644 --- a/Code/Tools/SerializeContextTools/Platform/Mac/PAL_mac.cmake +++ b/Code/Tools/SerializeContextTools/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS TRUE) diff --git a/Code/Tools/SerializeContextTools/Platform/Windows/PAL_windows.cmake b/Code/Tools/SerializeContextTools/Platform/Windows/PAL_windows.cmake index 315dc7c760..6821ca40eb 100644 --- a/Code/Tools/SerializeContextTools/Platform/Windows/PAL_windows.cmake +++ b/Code/Tools/SerializeContextTools/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_SERIALIZECONTEXTTOOLS TRUE) diff --git a/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows.cmake b/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows.cmake index 0164da4152..ed4ec3e0a1 100644 --- a/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows.cmake +++ b/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows.cmake @@ -11,4 +11,4 @@ set(LY_RUNTIME_DEPENDENCIES Legacy::CryRenderD3D11 -) \ No newline at end of file +) diff --git a/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows_files.cmake b/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows_files.cmake index 644548ab8f..de3425c5e6 100644 --- a/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows_files.cmake +++ b/Code/Tools/ShaderCacheGen/ShaderCacheGen/Platform/Windows/platform_windows_files.cmake @@ -11,4 +11,4 @@ set(FILES Alert_win.cpp -) \ No newline at end of file +) diff --git a/Code/Tools/Standalone/Source/AssetDatabaseLocationListener.cpp b/Code/Tools/Standalone/Source/AssetDatabaseLocationListener.cpp index e234cb6ac9..cf8698d6f9 100644 --- a/Code/Tools/Standalone/Source/AssetDatabaseLocationListener.cpp +++ b/Code/Tools/Standalone/Source/AssetDatabaseLocationListener.cpp @@ -44,4 +44,4 @@ namespace LUAEditor result = m_root; return true; } -}//namespace AssetBrowserTester \ No newline at end of file +}//namespace AssetBrowserTester diff --git a/Code/Tools/Standalone/Source/Driller/Axis.hxx b/Code/Tools/Standalone/Source/Driller/Axis.hxx index 12b5327536..a2f7306346 100644 --- a/Code/Tools/Standalone/Source/Driller/Axis.hxx +++ b/Code/Tools/Standalone/Source/Driller/Axis.hxx @@ -99,4 +99,4 @@ public slots: } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/CSVExportSettings.h b/Code/Tools/Standalone/Source/Driller/CSVExportSettings.h index d06950ade1..218fc36247 100644 --- a/Code/Tools/Standalone/Source/Driller/CSVExportSettings.h +++ b/Code/Tools/Standalone/Source/Driller/CSVExportSettings.h @@ -49,4 +49,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataParser.h b/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataParser.h index adcf01a26a..8aaaa54e3b 100644 --- a/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataParser.h +++ b/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataParser.h @@ -51,4 +51,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataView.hxx b/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataView.hxx index 32c8159a69..5ad09f579c 100644 --- a/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataView.hxx +++ b/Code/Tools/Standalone/Source/Driller/Carrier/CarrierDataView.hxx @@ -71,4 +71,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/ChannelConfigurationDialog.hxx b/Code/Tools/Standalone/Source/Driller/ChannelConfigurationDialog.hxx index b77266fd46..89f49aea23 100644 --- a/Code/Tools/Standalone/Source/Driller/ChannelConfigurationDialog.hxx +++ b/Code/Tools/Standalone/Source/Driller/ChannelConfigurationDialog.hxx @@ -39,4 +39,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/ChannelConfigurationWidget.hxx b/Code/Tools/Standalone/Source/Driller/ChannelConfigurationWidget.hxx index 742c73d116..df3e142617 100644 --- a/Code/Tools/Standalone/Source/Driller/ChannelConfigurationWidget.hxx +++ b/Code/Tools/Standalone/Source/Driller/ChannelConfigurationWidget.hxx @@ -38,4 +38,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/ChannelProfilerWidget.hxx b/Code/Tools/Standalone/Source/Driller/ChannelProfilerWidget.hxx index df89aa398d..15f950ca8f 100644 --- a/Code/Tools/Standalone/Source/Driller/ChannelProfilerWidget.hxx +++ b/Code/Tools/Standalone/Source/Driller/ChannelProfilerWidget.hxx @@ -93,4 +93,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/ChartTypes.hxx b/Code/Tools/Standalone/Source/Driller/ChartTypes.hxx index 92a1133415..4d4bd4c3fb 100644 --- a/Code/Tools/Standalone/Source/Driller/ChartTypes.hxx +++ b/Code/Tools/Standalone/Source/Driller/ChartTypes.hxx @@ -45,4 +45,4 @@ namespace Charts }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/CollapsiblePanel.hxx b/Code/Tools/Standalone/Source/Driller/CollapsiblePanel.hxx index 3d1da6946d..e21cf1512d 100644 --- a/Code/Tools/Standalone/Source/Driller/CollapsiblePanel.hxx +++ b/Code/Tools/Standalone/Source/Driller/CollapsiblePanel.hxx @@ -61,4 +61,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/CustomizeCSVExportWidget.hxx b/Code/Tools/Standalone/Source/Driller/CustomizeCSVExportWidget.hxx index 4153d5dba5..b7f7af7915 100644 --- a/Code/Tools/Standalone/Source/Driller/CustomizeCSVExportWidget.hxx +++ b/Code/Tools/Standalone/Source/Driller/CustomizeCSVExportWidget.hxx @@ -44,4 +44,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/DoubleListSelector.hxx b/Code/Tools/Standalone/Source/Driller/DoubleListSelector.hxx index 22f2acfac5..fb2b0668fb 100644 --- a/Code/Tools/Standalone/Source/Driller/DoubleListSelector.hxx +++ b/Code/Tools/Standalone/Source/Driller/DoubleListSelector.hxx @@ -61,4 +61,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/DrillerDataTypes.h b/Code/Tools/Standalone/Source/Driller/DrillerDataTypes.h index 425dd4819c..448ecd2105 100644 --- a/Code/Tools/Standalone/Source/Driller/DrillerDataTypes.h +++ b/Code/Tools/Standalone/Source/Driller/DrillerDataTypes.h @@ -31,4 +31,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/DrillerOperationTelemetryEvent.cpp b/Code/Tools/Standalone/Source/Driller/DrillerOperationTelemetryEvent.cpp index 2ee2e53dea..6bff8e3403 100644 --- a/Code/Tools/Standalone/Source/Driller/DrillerOperationTelemetryEvent.cpp +++ b/Code/Tools/Standalone/Source/Driller/DrillerOperationTelemetryEvent.cpp @@ -31,4 +31,4 @@ namespace Driller m_telemetryEvent.SetMetric("WindowId", m_windowId); m_telemetryEvent.Log(); } -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/Driller/EventTrace/EventTraceDataAggregator.h b/Code/Tools/Standalone/Source/Driller/EventTrace/EventTraceDataAggregator.h index bec0ff0a9b..d1080f741f 100644 --- a/Code/Tools/Standalone/Source/Driller/EventTrace/EventTraceDataAggregator.h +++ b/Code/Tools/Standalone/Source/Driller/EventTrace/EventTraceDataAggregator.h @@ -92,4 +92,4 @@ namespace Driller EventTraceDataParser m_parser; }; -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/Driller/FilteredListView.hxx b/Code/Tools/Standalone/Source/Driller/FilteredListView.hxx index 0fe01dd88e..30a6b51f72 100644 --- a/Code/Tools/Standalone/Source/Driller/FilteredListView.hxx +++ b/Code/Tools/Standalone/Source/Driller/FilteredListView.hxx @@ -90,4 +90,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailView.inl b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailView.inl index e95091af2c..d15a86a0e0 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailView.inl +++ b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailView.inl @@ -457,4 +457,4 @@ namespace Driller } } } -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewQObject.hxx b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewQObject.hxx index 955bb08efe..a74f382cef 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewQObject.hxx +++ b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewQObject.hxx @@ -89,4 +89,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewSavedState.h b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewSavedState.h index f980c1474a..0ee4b0f0bf 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewSavedState.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/BaseDetailViewSavedState.h @@ -63,4 +63,4 @@ namespace Driller } }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaChunkUsageDataContainers.h b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaChunkUsageDataContainers.h index 730d4c4a17..20a67e2f55 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaChunkUsageDataContainers.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaChunkUsageDataContainers.h @@ -70,4 +70,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataAggregatorConfigurationPanel.hxx b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataAggregatorConfigurationPanel.hxx index 3bd8b4e87e..2a2ddc416a 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataAggregatorConfigurationPanel.hxx +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataAggregatorConfigurationPanel.hxx @@ -60,4 +60,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataEvents.h b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataEvents.h index 5d5f6e7ac7..103acb7efa 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataEvents.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataEvents.h @@ -292,4 +292,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataParser.h b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataParser.h index eaa053936b..7210bb3fb8 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataParser.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDataParser.h @@ -51,4 +51,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDisplayHelpers.h b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDisplayHelpers.h index 8dd9854617..b941d0cf4d 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDisplayHelpers.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDisplayHelpers.h @@ -513,4 +513,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDrillerConfigToolbar.hxx b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDrillerConfigToolbar.hxx index e12caed19c..03075cc553 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDrillerConfigToolbar.hxx +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaDrillerConfigToolbar.hxx @@ -59,4 +59,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaTreeViewModel.hxx b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaTreeViewModel.hxx index 42fd2c90a0..3999bd9b63 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaTreeViewModel.hxx +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaTreeViewModel.hxx @@ -47,4 +47,4 @@ namespace Driller } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaUsageDataContainers.h b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaUsageDataContainers.h index 2d8ff07367..3b3c563ac5 100644 --- a/Code/Tools/Standalone/Source/Driller/Replica/ReplicaUsageDataContainers.h +++ b/Code/Tools/Standalone/Source/Driller/Replica/ReplicaUsageDataContainers.h @@ -68,4 +68,4 @@ namespace Driller }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/BasicScriptChecker.h b/Code/Tools/Standalone/Source/LUA/BasicScriptChecker.h index ccca53b98a..bbde22a411 100644 --- a/Code/Tools/Standalone/Source/LUA/BasicScriptChecker.h +++ b/Code/Tools/Standalone/Source/LUA/BasicScriptChecker.h @@ -28,4 +28,4 @@ namespace LUAEditor }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompleter.hxx b/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompleter.hxx index 582d8e7e65..754d762f9b 100644 --- a/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompleter.hxx +++ b/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompleter.hxx @@ -45,4 +45,4 @@ namespace LUAEditor }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompletionModel.hxx b/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompletionModel.hxx index 3641a70e13..3e314915df 100644 --- a/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompletionModel.hxx +++ b/Code/Tools/Standalone/Source/LUA/CodeCompletion/LUACompletionModel.hxx @@ -72,4 +72,4 @@ namespace LUAEditor }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/LUADebuggerComponent.h b/Code/Tools/Standalone/Source/LUA/LUADebuggerComponent.h index a5e5cdabd9..603141d782 100644 --- a/Code/Tools/Standalone/Source/LUA/LUADebuggerComponent.h +++ b/Code/Tools/Standalone/Source/LUA/LUADebuggerComponent.h @@ -107,4 +107,4 @@ namespace LUADebugger }; }; -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/LUADebuggerMessages.h b/Code/Tools/Standalone/Source/LUA/LUADebuggerMessages.h index ec80b2e2e9..bc591d0d46 100644 --- a/Code/Tools/Standalone/Source/LUA/LUADebuggerMessages.h +++ b/Code/Tools/Standalone/Source/LUA/LUADebuggerMessages.h @@ -36,4 +36,4 @@ namespace LUADebugger }; }; -#endif//LUADEBUGGER_API_H \ No newline at end of file +#endif//LUADEBUGGER_API_H diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorBlockState.h b/Code/Tools/Standalone/Source/LUA/LUAEditorBlockState.h index aaf4fec815..ab1995ccba 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorBlockState.h +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorBlockState.h @@ -30,4 +30,4 @@ namespace LUAEditor int m_qtBlockState; }; static_assert(sizeof(QTBlockState) == sizeof(int), "QT stores block state in an int"); -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorBreakpointWidget.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorBreakpointWidget.hxx index f4e9166c7d..fe756fb87b 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorBreakpointWidget.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorBreakpointWidget.hxx @@ -74,4 +74,4 @@ namespace LUAEditor void OnBlockCountChange(); void OnCharsRemoved(int position, int charsRemoved); }; -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorDebuggerMessages.h b/Code/Tools/Standalone/Source/LUA/LUAEditorDebuggerMessages.h index eac8ea1cde..a4bdf6997f 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorDebuggerMessages.h +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorDebuggerMessages.h @@ -111,4 +111,4 @@ namespace LUAEditor }; } -#endif//LUAEDITOR_LUAEditorDebuggerMessages_H \ No newline at end of file +#endif//LUAEDITOR_LUAEditorDebuggerMessages_H diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorFindDialog.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorFindDialog.hxx index c851f98f7e..506c464d7a 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorFindDialog.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorFindDialog.hxx @@ -193,4 +193,4 @@ namespace LUAEditor } -#endif //LUAEDITOR_FINDDIALOG_H \ No newline at end of file +#endif //LUAEDITOR_FINDDIALOG_H diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorFindResults.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorFindResults.hxx index e5d65a4730..ed7f673eb2 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorFindResults.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorFindResults.hxx @@ -105,4 +105,4 @@ namespace LUAEditor class FindResultsHighlighter* m_highlighter; QColor m_resultLineHighlightColor; }; -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorFoldingWidget.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorFoldingWidget.hxx index 498ee767cb..6ccb710f2d 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorFoldingWidget.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorFoldingWidget.hxx @@ -57,4 +57,4 @@ namespace LUAEditor }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorGoToLineDialog.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorGoToLineDialog.hxx index d7a05814a1..d878968207 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorGoToLineDialog.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorGoToLineDialog.hxx @@ -57,4 +57,4 @@ namespace LUAEditor } -#endif //LUAEDITOR_FINDDIALOG_H \ No newline at end of file +#endif //LUAEDITOR_FINDDIALOG_H diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorPlainTextEdit.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorPlainTextEdit.hxx index 20f2e6329f..c430674cc6 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorPlainTextEdit.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorPlainTextEdit.hxx @@ -67,4 +67,4 @@ namespace LUAEditor private slots: void CompletionSelected(const QString& text); }; -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorSettingsDialog.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorSettingsDialog.hxx index 2c289733cc..e721bc7bae 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorSettingsDialog.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorSettingsDialog.hxx @@ -51,4 +51,4 @@ namespace LUAEditor SyntaxStyleSettings m_originalSettings; Ui::LUAEditorSettingsDialog* m_gui; }; -} \ No newline at end of file +} diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorViewMessages.h b/Code/Tools/Standalone/Source/LUA/LUAEditorViewMessages.h index 6219775827..d82dcf29d1 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorViewMessages.h +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorViewMessages.h @@ -52,4 +52,4 @@ namespace LUAEditor }; } -#endif//LUAEDITOR_VIEWMESSAGES_H \ No newline at end of file +#endif//LUAEDITOR_VIEWMESSAGES_H diff --git a/Code/Tools/Standalone/Source/LUA/ScriptCheckerAPI.h b/Code/Tools/Standalone/Source/LUA/ScriptCheckerAPI.h index 755ee0c14c..e7a1cc046e 100644 --- a/Code/Tools/Standalone/Source/LUA/ScriptCheckerAPI.h +++ b/Code/Tools/Standalone/Source/LUA/ScriptCheckerAPI.h @@ -41,4 +41,4 @@ namespace LUAEditor #pragma once -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/Standalone/Source/Telemetry/TelemetryEvent.h b/Code/Tools/Standalone/Source/Telemetry/TelemetryEvent.h index 3155eba50c..3c3240b7ad 100644 --- a/Code/Tools/Standalone/Source/Telemetry/TelemetryEvent.h +++ b/Code/Tools/Standalone/Source/Telemetry/TelemetryEvent.h @@ -46,4 +46,4 @@ namespace Telemetry }; } -#endif \ No newline at end of file +#endif diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/Bump2NormalHighQ.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/Bump2NormalHighQ.tif.exportsettings index c58bd18903..e7bbaccd46 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/Bump2NormalHighQ.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/Bump2NormalHighQ.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /bumptype=1 /mipmirror=1 /preset=Bump2Normalmap_highQ /reduce=1 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /bumptype=1 /mipmirror=1 /preset=Bump2Normalmap_highQ /reduce=1 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha256512.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha256512.tif.exportsettings index f3fa0259aa..5f78477ca8 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha256512.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha256512.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_highQ /reduce=1 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_highQ /reduce=1 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha512256.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha512256.tif.exportsettings index f3fa0259aa..5f78477ca8 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha512256.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/DiffusehighQWithAlpha512256.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_highQ /reduce=1 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_highQ /reduce=1 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/LuminanceOnly.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/LuminanceOnly.tif.exportsettings index 7bc85ae585..6466dc9099 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/LuminanceOnly.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/LuminanceOnly.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /mipalphacoverage=0 /mipmirror=1 /preset=Diffuse_highQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /mipalphacoverage=0 /mipmirror=1 /preset=Diffuse_highQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPreset3DC_ddn.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPreset3DC_ddn.tif.exportsettings index 6bdcd332bb..acfbe2a750 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPreset3DC_ddn.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPreset3DC_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=0 /preset=Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=0 /preset=Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8.tif.exportsettings index 872631a069..00ecf3a56e 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8WithAlpha.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8WithAlpha.tif.exportsettings index 872631a069..00ecf3a56e 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8WithAlpha.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8WithAlpha.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Diffuse_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_bump.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_bump.tif.exportsettings index fc78727ed3..cab995b31e 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_bump.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_bump.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Bump2Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Bump2Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_ddn.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_ddn.tif.exportsettings index 42d7a0c819..c5a53f8bd5 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_ddn.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoPresetX8R8G8B8_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings.tif.exportsettings index 0653bb85eb..1048249b71 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Diffuse_lowQ \ No newline at end of file +/autooptimizefile=0 /preset=Diffuse_lowQ diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings300400.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings300400.tif.exportsettings index 11f6c88e68..db0b877f24 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings300400.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings300400.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=ReferenceImage \ No newline at end of file +/autooptimizefile=0 /preset=ReferenceImage diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettingsGrey_DDNDIF.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettingsGrey_DDNDIF.tif.exportsettings index 0653bb85eb..1048249b71 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettingsGrey_DDNDIF.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettingsGrey_DDNDIF.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Diffuse_lowQ \ No newline at end of file +/autooptimizefile=0 /preset=Diffuse_lowQ diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings_DDNDIF.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings_DDNDIF.tif.exportsettings index 8d002b5711..84c0416421 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings_DDNDIF.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NoTIFSettings_DDNDIF.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /ms=0 /preset=Diffuse_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /ms=0 /preset=Diffuse_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ.tif.exportsettings index 42d7a0c819..c5a53f8bd5 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQReduce1_ddn.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQReduce1_ddn.tif.exportsettings index a86c5d3e2d..cb9f25b5d9 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQReduce1_ddn.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQReduce1_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=1 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=1 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ_ddn.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ_ddn.tif.exportsettings index 42d7a0c819..c5a53f8bd5 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ_ddn.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/NormalmapLowQ_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumpblur=0.000000 /bumpstrength=5.000000 /mipmirror=1 /preset=Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/TestColorChart_cch.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/TestColorChart_cch.tif.exportsettings index 5b43521555..47b9f504fd 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/TestColorChart_cch.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/TestColorChart_cch.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=ColorChart \ No newline at end of file +/autooptimizefile=0 /preset=ColorChart diff --git a/Code/Tools/TestBed/ResourceCompilerImage/Input/diamand_plate_ddn.tif.exportsettings b/Code/Tools/TestBed/ResourceCompilerImage/Input/diamand_plate_ddn.tif.exportsettings index 87edd65c1f..3e5edcd652 100644 --- a/Code/Tools/TestBed/ResourceCompilerImage/Input/diamand_plate_ddn.tif.exportsettings +++ b/Code/Tools/TestBed/ResourceCompilerImage/Input/diamand_plate_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumptype=1 /preset=Bump2Normalmap_lowQ /reduce=0 \ No newline at end of file +/autooptimizefile=0 /bumptype=1 /preset=Bump2Normalmap_lowQ /reduce=0 diff --git a/Code/Tools/TestImpactFramework/CMakeLists.txt b/Code/Tools/TestImpactFramework/CMakeLists.txt index 46d6ab95fe..90fff2b1c5 100644 --- a/Code/Tools/TestImpactFramework/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/CMakeLists.txt @@ -16,4 +16,4 @@ include(${pal_source_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) if(${LY_TEST_IMPACT_ACTIVE} AND PAL_TRAIT_TEST_IMPACT_FRAMEWORK_SUPPORTED) add_subdirectory(Runtime) add_subdirectory(Frontend) -endif() \ No newline at end of file +endif() diff --git a/Code/Tools/TestImpactFramework/Frontend/CMakeLists.txt b/Code/Tools/TestImpactFramework/Frontend/CMakeLists.txt index a02a1597e6..fe8406c804 100644 --- a/Code/Tools/TestImpactFramework/Frontend/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/Frontend/CMakeLists.txt @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -add_subdirectory(Console) \ No newline at end of file +add_subdirectory(Console) diff --git a/Code/Tools/TestImpactFramework/Frontend/Console/CMakeLists.txt b/Code/Tools/TestImpactFramework/Frontend/Console/CMakeLists.txt index 8298bb7123..20a680bce9 100644 --- a/Code/Tools/TestImpactFramework/Frontend/Console/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/Frontend/Console/CMakeLists.txt @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -add_subdirectory(Code) \ No newline at end of file +add_subdirectory(Code) diff --git a/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt b/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt index da2c707cb8..7a043a30ca 100644 --- a/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt @@ -20,4 +20,4 @@ ly_add_target( BUILD_DEPENDENCIES PRIVATE AZ::TestImpact.Runtime.Static -) \ No newline at end of file +) diff --git a/Code/Tools/TestImpactFramework/Runtime/CMakeLists.txt b/Code/Tools/TestImpactFramework/Runtime/CMakeLists.txt index 8298bb7123..20a680bce9 100644 --- a/Code/Tools/TestImpactFramework/Runtime/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/Runtime/CMakeLists.txt @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -add_subdirectory(Code) \ No newline at end of file +add_subdirectory(Code) diff --git a/Gems/AWSClientAuth/cdk/auth/__init__.py b/Gems/AWSClientAuth/cdk/auth/__init__.py index b50ffb3586..5587430e1c 100755 --- a/Gems/AWSClientAuth/cdk/auth/__init__.py +++ b/Gems/AWSClientAuth/cdk/auth/__init__.py @@ -7,4 +7,4 @@ or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSClientAuth/cdk/aws_client_auth/__init__.py b/Gems/AWSClientAuth/cdk/aws_client_auth/__init__.py index b50ffb3586..5587430e1c 100755 --- a/Gems/AWSClientAuth/cdk/aws_client_auth/__init__.py +++ b/Gems/AWSClientAuth/cdk/aws_client_auth/__init__.py @@ -7,4 +7,4 @@ or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSClientAuth/cdk/cognito/__init__.py b/Gems/AWSClientAuth/cdk/cognito/__init__.py index b50ffb3586..5587430e1c 100755 --- a/Gems/AWSClientAuth/cdk/cognito/__init__.py +++ b/Gems/AWSClientAuth/cdk/cognito/__init__.py @@ -7,4 +7,4 @@ or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSClientAuth/cdk/requirements.txt b/Gems/AWSClientAuth/cdk/requirements.txt index e0f46f4add..fef43b12f7 100644 --- a/Gems/AWSClientAuth/cdk/requirements.txt +++ b/Gems/AWSClientAuth/cdk/requirements.txt @@ -1,3 +1,3 @@ aws-cdk.core>=1.91.0 aws-cdk.aws_iam>=1.91.0 -aws-cdk.aws_cognito>=1.91.0 \ No newline at end of file +aws-cdk.aws_cognito>=1.91.0 diff --git a/Gems/AWSClientAuth/cdk/utils/__init__.py b/Gems/AWSClientAuth/cdk/utils/__init__.py index b50ffb3586..5587430e1c 100755 --- a/Gems/AWSClientAuth/cdk/utils/__init__.py +++ b/Gems/AWSClientAuth/cdk/utils/__init__.py @@ -7,4 +7,4 @@ or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSCore/Code/CMakeLists.txt b/Gems/AWSCore/Code/CMakeLists.txt index 6ec0f72180..cfb646710e 100644 --- a/Gems/AWSCore/Code/CMakeLists.txt +++ b/Gems/AWSCore/Code/CMakeLists.txt @@ -70,6 +70,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_target( NAME AWSCore.Editor MODULE NAMESPACE Gem + OUTPUT_SUBDIRECTORY AWSCoreEditorPlugins FILES_CMAKE awscore_editor_shared_files.cmake INCLUDE_DIRECTORIES diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md b/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md index 578592f77c..d90f78465b 100644 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/README.md @@ -1,7 +1,50 @@ # Welcome to the AWS Core Resource Mapping Tool project! -This project is set up like a standard Python project. The initialization +## Setup aws config and credential +Resource mapping tool is using boto3 to interact with aws services: + * Follow boto3 + [Configuration](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) to setup default aws region. + * Follow boto3 + [Credentials](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) to setup default profile or credential keys. + +Or follow **AWS CLI** configuration which can be reused by boto3 lib: + * Follow + [Quick configuration with aws configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) + +**In Progress** - Override default aws profile in resource mapping tool + +## Python Environment Setup Options +### 1. Engine python environment +In order to use engine python environment, it requires to link Qt binaries for this tool. +Follow cmake instructions to configure your project, for example: + +``` +$ cmake -B <BUILD_FOLDER> -S . -G "Visual Studio 16 2019" -DLY_3RDPARTY_PATH=<PATH_TO_3RDPARTY> -DLY_PROJECTS=<PROJECT_NAME> +``` + +Build project with **AWSCore.Editor** target to generate required Qt binaries. +(Or use **Editor** target) + +``` +$ cmake --build <BUILD_FOLDER> --target AWSCore.Editor --config <CONFIG> -j <NUM_JOBS> +``` + +Launch resource mapping tool under engine root folder: + +#### Windows +##### release mode +``` +$ python\python.cmd Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\profile\AWSCoreEditorPlugins +``` +##### debug mode +``` +$ python\python.cmd debug Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\debug\AWSCoreEditorPlugins +``` + + +### 2. Python virtual environment +This project is set up like a standard Python project. The initialization process also creates a virtualenv within this project, stored under the `.env` directory. To create the virtualenv it assumes that there is a `python3` (or `python` for Windows) executable in your path with access to the `venv` @@ -32,28 +75,15 @@ Once the virtualenv is activated, you can install the required dependencies. $ pip install -r requirements.txt ``` -## Setup aws config and credential -Resource mapping tool is using boto3 to interact with aws services: - * Follow boto3 - [Configuration](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) to setup default aws region. - * Follow boto3 - [Credentials](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) to setup default profile or credential keys. - -Or follow **AWS CLI** configuration which can be reused by boto3 lib: - * Follow - [Quick configuration with aws configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) - -**In Progress** - Override default aws profile in resource mapping tool - -## Launch Options -### 1. Launch Resource Mapping Tool from python directly +#### 2.1 Launch Options +##### 2.1.1 Launch Resource Mapping Tool from python directly At this point you can launch tool like other standard python project. ``` $ python resource_mapping_tool.py ``` -### 2. Launch Resource Mapping Tool from batch script/Editor +##### 2.1.2 Launch Resource Mapping Tool from batch script/Editor Update `resource_mapping_tool.cmd` with your virtualenv full path. * **VIRTUALENV_PATH**: Fill this variable with your virtualenv full path. diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/import_resources_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/import_resources_controller.py index 1425772bec..33160b1960 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/import_resources_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/import_resources_controller.py @@ -28,13 +28,12 @@ logger = logging.getLogger(__name__) class ImportResourcesController(QObject): - add_import_resources = Signal(list) + add_import_resources_sender: Signal = Signal(list) + set_notification_frame_text_sender: Signal = Signal(str) """ ImportResourcesController is the place to bind ImportResource view with its corresponding behavior - - TODO: add error handling once it is ready """ def __init__(self) -> None: @@ -44,6 +43,8 @@ class ImportResourcesController(QObject): self._view_manager: ViewManager = ViewManager.get_instance() # Initialize view and model related references self._import_resources_page: ImportResourcesPage = self._view_manager.get_import_resources_page() + self.set_notification_frame_text_sender.connect( + self._import_resources_page.notification_frame.set_frame_text_receiver) self._tree_view: ResourceTreeView = self._import_resources_page.tree_view self._proxy_model: ResourceProxyModel = self._tree_view.resource_proxy_model @@ -60,11 +61,10 @@ class ImportResourcesController(QObject): self._proxy_model.deduplicate_selected_import_resources(self._tree_view.selectedIndexes()) if unique_resources: logger.debug(f"Importing selected resources: {unique_resources} ...") - self.add_import_resources.emit(unique_resources) + self.add_import_resources_sender.emit(unique_resources) self._back_to_view_edit_page() else: - self._import_resources_page.set_notification_frame_text( - error_messages.IMPORT_RESOURCES_PAGE_NO_RESOURCES_SELECTED_ERROR_MESSAGE) + self.set_notification_frame_text_sender.emit(error_messages.IMPORT_RESOURCES_PAGE_NO_RESOURCES_SELECTED_ERROR_MESSAGE) def _start_search_resources_async(self) -> None: configuration: Configuration = self._configuration_manager.configuration @@ -77,8 +77,7 @@ class ImportResourcesController(QObject): async_worker = FunctionWorker(self._request_cfn_resources_callback, configuration.region) async_worker.signals.result.connect(self._load_cfn_resources_callback) else: - self._import_resources_page.set_notification_frame_text( - error_messages.IMPORT_RESOURCES_PAGE_SEARCH_VERSION_ERROR_MESSAGE) + self.set_notification_frame_text_sender.emit(error_messages.IMPORT_RESOURCES_PAGE_SEARCH_VERSION_ERROR_MESSAGE) return self._tree_view.reset_view() @@ -100,7 +99,7 @@ class ImportResourcesController(QObject): resources[stack_name] = resource_type_and_names return resources except RuntimeError as e: - self._import_resources_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) def _request_typed_resources_callback(self, region: str) -> List[str]: resource_type_index: int = self._import_resources_page.typed_resources_combobox.currentIndex() @@ -115,12 +114,11 @@ class ImportResourcesController(QObject): elif resource_type_index == constants.AWS_RESOURCE_S3_BUCKET_INDEX: resources = aws_utils.list_s3_buckets(region) else: - self._import_resources_page.set_notification_frame_text( - error_messages.IMPORT_RESOURCES_PAGE_RESOURCE_TYPE_ERROR_MESSAGE) + self.set_notification_frame_text_sender.emit(error_messages.IMPORT_RESOURCES_PAGE_RESOURCE_TYPE_ERROR_MESSAGE) return resources except RuntimeError as e: - self._import_resources_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) def _load_cfn_resources_callback(self, resources: Dict[str, List[BasicResourceAttributes]]) -> None: if not resources: @@ -179,7 +177,7 @@ class ImportResourcesController(QObject): def reset_page(self): """Reset import resources page to its default state""" self._tree_view.reset_view() - self._import_resources_page.hide_notification_frame() + self._import_resources_page.notification_frame.setVisible(False) self._import_resources_page.set_current_main_view_index(ImportResourcesPageConstants.TREE_VIEW_PAGE_INDEX) self._import_resources_page.typed_resources_combobox.setCurrentIndex(-1) self._import_resources_page.search_version = None diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py index be7bde3b6d..aa0a74b090 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py @@ -10,7 +10,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ import logging -from PySide2.QtCore import (QCoreApplication, QModelIndex, QObject, Slot) +from PySide2.QtCore import (QCoreApplication, QModelIndex, QObject, Signal, Slot) from PySide2.QtWidgets import QFileDialog from typing import (Dict, List) @@ -32,6 +32,9 @@ logger = logging.getLogger(__name__) class ViewEditController(QObject): + set_notification_frame_text_sender: Signal = Signal(str) + set_notification_page_frame_text_sender: Signal = Signal(str) + """ ViewEditController is the place to bind ViewEdit view with its corresponding behavior @@ -45,6 +48,10 @@ class ViewEditController(QObject): self._view_manager: ViewManager = ViewManager.get_instance() # Initialize view and model related references self._view_edit_page: ViewEditPage = self._view_manager.get_view_edit_page() + self.set_notification_frame_text_sender.connect( + self._view_edit_page.notification_frame.set_frame_text_receiver) + self.set_notification_page_frame_text_sender.connect( + self._view_edit_page.notification_page_frame.set_frame_text_receiver) self._table_view: ResourceTableView = self._view_edit_page.table_view self._proxy_model: ResourceProxyModel = self._table_view.resource_proxy_model @@ -78,7 +85,7 @@ class ViewEditController(QObject): return True except IOError as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) return False def _convert_and_load_into_model(self, config_file_name: str) -> None: @@ -92,7 +99,7 @@ class ViewEditController(QObject): resources = json_utils.convert_json_dict_to_resources(self._config_file_json_source) except (IOError, ValueError, KeyError) as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) self._view_edit_page.set_table_view_page_interactions_enabled(False) # load resources into model @@ -109,7 +116,7 @@ class ViewEditController(QObject): new_config_file_path, configuration.account_id, configuration.region) except IOError as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) return self._rescan_config_directory() @@ -145,7 +152,7 @@ class ViewEditController(QObject): self._start_search_config_files_async(new_config_directory) except RuntimeError as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) def _rescan_config_directory(self) -> None: configuration: Configuration = self._configuration_manager.configuration @@ -155,14 +162,14 @@ class ViewEditController(QObject): configuration.config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) except FileNotFoundError as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) return self._configuration_manager.configuration.config_files = config_files self._view_edit_page.set_config_files(config_files) def _reset_page(self) -> None: - self._view_edit_page.hide_notification_frame() + self._view_edit_page.notification_frame.setVisible(False) self._view_edit_page.set_table_view_page_interactions_enabled(True) def _save_changes(self) -> None: @@ -178,14 +185,14 @@ class ViewEditController(QObject): self._proxy_model.override_all_resources_status( ResourceMappingAttributesStatus(ResourceMappingAttributesStatus.SUCCESS_STATUS_VALUE, [ResourceMappingAttributesStatus.SUCCESS_STATUS_VALUE])) - self._view_edit_page.set_notification_frame_text( + self.set_notification_frame_text_sender.emit( notification_label_text.VIEW_EDIT_PAGE_SAVING_SUCCEED_MESSAGE.format(config_file)) def _search_complete_callback(self) -> None: self._reset_page() def _start_search_config_files_async(self, config_directory: str) -> None: - self._view_edit_page.set_notification_page_text(notification_label_text.NOTIFICATION_LOADING_MESSAGE) + self.set_notification_page_frame_text_sender.emit(notification_label_text.NOTIFICATION_LOADING_MESSAGE) self._view_edit_page.set_current_main_view_index(ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) self._config_file_json_source.clear() self._table_view.reset_view() @@ -202,7 +209,7 @@ class ViewEditController(QObject): config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) except FileNotFoundError as e: logger.exception(e) - self._view_edit_page.set_notification_frame_text(str(e)) + self.set_notification_frame_text_sender.emit(str(e)) def _select_config_file(self) -> None: if self._view_edit_page.config_file_combobox.currentIndex() == -1: @@ -219,7 +226,7 @@ class ViewEditController(QObject): self._proxy_model.emit_source_model_layout_changed() else: self._view_edit_page.set_table_view_page_interactions_enabled(False) - self._view_edit_page.set_notification_frame_text( + self.set_notification_frame_text_sender.emit( error_messages.VIEW_EDIT_PAGE_READ_FROM_JSON_FAILED_WITH_UNEXPECTED_FILE_ERROR_MESSAGE.format(config_file_name)) self._view_edit_page.set_current_main_view_index(ViewEditPageConstants.TABLE_VIEW_PAGE_INDEX) @@ -262,13 +269,13 @@ class ViewEditController(QObject): invalid_details)) invalid_proxy_rows: List[int] = self._proxy_model.map_from_source_rows(list(invalid_sources.keys())) - self._view_edit_page.set_notification_frame_text( + self.set_notification_frame_text_sender.emit( error_messages.VIEW_EDIT_PAGE_SAVING_FAILED_WITH_INVALID_ROW_ERROR_MESSAGE.format(invalid_proxy_rows)) return False return True @Slot(list) - def add_import_resources(self, resources: List[BasicResourceAttributes]) -> None: + def add_import_resources_receiver(self, resources: List[BasicResourceAttributes]) -> None: resource: BasicResourceAttributes for resource in resources: resource_builder: ResourceMappingAttributesBuilder = ResourceMappingAttributesBuilder() \ diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/controller_manager.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/controller_manager.py index 5d0a00e74e..48c45d0350 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/controller_manager.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/controller_manager.py @@ -51,4 +51,5 @@ class ControllerManager(object): logger.info("Setting up ViewEdit and ImportResource controllers ...") self._view_edit_controller.setup() self._import_resources_controller.setup() - self._import_resources_controller.add_import_resources.connect(self._view_edit_controller.add_import_resources) + self._import_resources_controller.add_import_resources_sender.connect( + self._view_edit_controller.add_import_resources_receiver) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py index d8f1d1821c..1819e4c4ce 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py @@ -32,7 +32,7 @@ VIEW_EDIT_PAGE_SAVING_SUCCEED_MESSAGE: str = "Config file {} is saved successful IMPORT_RESOURCES_PAGE_BACK_TEXT: str = "Back" IMPORT_RESOURCES_PAGE_AWS_SEARCH_TYPE_TEXT: str = "AWS Resource Type" -IMPORT_RESOURCES_PAGE_SEARCH_TEXT: str = " Search" +IMPORT_RESOURCES_PAGE_SEARCH_TEXT: str = "Search" IMPORT_RESOURCES_PAGE_IMPORT_TEXT: str = "Import" IMPORT_RESOURCES_PAGE_SEARCH_PLACEHOLDER_TEXT: str = "Search for resources by Type or Name/ID" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py index dea4cea773..c01d81b75c 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py @@ -25,10 +25,10 @@ VIEW_EDIT_PAGE_FOOTER_AREA_HEIGHT: int = 50 VIEW_EDIT_PAGE_MARGIN_TOPBOTTOM: int = 10 # header area -CONFIG_FILE_LABEL_WIDTH: int = 70 +CONFIG_FILE_LABEL_WIDTH: int = 65 CONFIG_FILE_COMBOBOX_WIDTH: int = 250 -CONFIG_LOCATION_LABEL_WIDTH: int = 110 -CONFIG_LOCATION_TEXT_WIDTH: int = 190 +CONFIG_LOCATION_LABEL_WIDTH: int = 100 +CONFIG_LOCATION_TEXT_WIDTH: int = 180 HEADER_AREA_SEPARATOR_WIDTH: int = 5 # center area diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py index 8febe76111..b067105ce3 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.py @@ -9,32 +9,56 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ +from argparse import (ArgumentParser, Namespace) import logging import sys -from PySide2.QtCore import Qt -from PySide2.QtWidgets import QApplication - -from manager.configuration_manager import ConfigurationManager -from manager.controller_manager import ControllerManager -from manager.thread_manager import ThreadManager -from manager.view_manager import ViewManager -from style import azqtcomponents_resources +from utils import environment_utils from utils import file_utils +# arguments setup +argument_parser: ArgumentParser = ArgumentParser() +argument_parser.add_argument('--binaries_path', help='Path to QT Binaries necessary for PySide.') +argument_parser.add_argument('--debug', action='store_true', help='Execute on debug mode.') +arguments: Namespace = argument_parser.parse_args() + # logging setup -logging.basicConfig(filename="resource_mapping_tool.log", filemode='w', level=logging.INFO, +logging_level: int = logging.INFO +if arguments.debug: + logging_level = logging.DEBUG +logging_path: str = file_utils.join_path(file_utils.get_parent_directory_path(__file__), + 'resource_mapping_tool.log') +logging.basicConfig(filename=logging_path, filemode='w', level=logging_level, format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', datefmt='%H:%M:%S') logging.getLogger('boto3').setLevel(logging.CRITICAL) logging.getLogger('botocore').setLevel(logging.CRITICAL) logging.getLogger('s3transfer').setLevel(logging.CRITICAL) logging.getLogger('urllib3').setLevel(logging.CRITICAL) - logger = logging.getLogger(__name__) + if __name__ == "__main__": + if arguments.binaries_path and not environment_utils.is_qt_linked(): + logger.info("Setting up Qt environment ...") + environment_utils.setup_qt_environment(arguments.binaries_path) + + try: + logger.info("Importing tool required modules ...") + from PySide2.QtCore import Qt + from PySide2.QtWidgets import QApplication + from manager.configuration_manager import ConfigurationManager + from manager.controller_manager import ControllerManager + from manager.thread_manager import ThreadManager + from manager.view_manager import ViewManager + from style import azqtcomponents_resources + except ImportError as e: + logger.error(f"Failed to import module [{e.name}] {e}") + environment_utils.cleanup_qt_environment() + exit(-1) + QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) app: QApplication = QApplication(sys.argv) + app.aboutToQuit.connect(environment_utils.cleanup_qt_environment) try: style_sheet_path: str = file_utils.join_path(file_utils.get_parent_directory_path(__file__), @@ -62,5 +86,5 @@ if __name__ == "__main__": controller_manager.setup() view_manager.show() - + sys.exit(app.exec_()) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_import_resources_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_import_resources_controller.py index f2eb51ee60..eb3815e788 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_import_resources_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_import_resources_controller.py @@ -62,7 +62,8 @@ class TestImportResourcesController(TestCase): self._mocked_proxy_model: MagicMock = self._mocked_tree_view.resource_proxy_model self._test_import_resources_controller: ImportResourcesController = ImportResourcesController() - self._test_import_resources_controller.add_import_resources = MagicMock() + self._test_import_resources_controller.add_import_resources_sender = MagicMock() + self._test_import_resources_controller.set_notification_frame_text_sender = MagicMock() self._test_import_resources_controller.setup() def test_reset_page_resetting_page_with_expected_state(self) -> None: @@ -116,7 +117,7 @@ class TestImportResourcesController(TestCase): self._mocked_import_resources_page.typed_resources_search_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering search_button connected function - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_tree_view.reset_view.assert_not_called() self._mocked_import_resources_page.set_current_main_view_index.assert_not_called() @@ -170,7 +171,7 @@ class TestImportResourcesController(TestCase): mock_aws_utils.list_cloudformation_stacks.assert_called_once_with( TestImportResourcesController._expected_region) mock_aws_utils.list_cloudformation_stack_resources.assert_not_called() - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.load_resource.assert_not_called() self._mocked_proxy_model.emit_source_model_layout_changed.assert_called_once() self._mocked_import_resources_page.set_current_main_view_index.assert_called_with( @@ -195,7 +196,7 @@ class TestImportResourcesController(TestCase): TestImportResourcesController._expected_region) mock_aws_utils.list_cloudformation_stack_resources.assert_called_once_with( TestImportResourcesController._expected_cfn_stack_name, TestImportResourcesController._expected_region) - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.load_resource.assert_not_called() self._mocked_proxy_model.emit_source_model_layout_changed.assert_called_once() self._mocked_import_resources_page.set_current_main_view_index.assert_called_with( @@ -258,8 +259,8 @@ class TestImportResourcesController(TestCase): self._mocked_import_resources_page.cfn_stacks_import_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering cfn_stacks_import_button connected function - self._test_import_resources_controller.add_import_resources.emit.assert_not_called() - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.add_import_resources_sender.emit.assert_not_called() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() def test_page_cfn_stacks_import_button_emit_signal_with_expected_resources_and_switch_to_expected_page(self) -> None: self._mocked_proxy_model.deduplicate_selected_import_resources.return_value = \ @@ -268,7 +269,7 @@ class TestImportResourcesController(TestCase): self._mocked_import_resources_page.cfn_stacks_import_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering cfn_stacks_import_button connected function - self._test_import_resources_controller.add_import_resources.emit.assert_called_once_with( + self._test_import_resources_controller.add_import_resources_sender.emit.assert_called_once_with( [TestImportResourcesController._expected_lambda_resource]) self._mocked_view_manager.switch_to_view_edit_page.assert_called_once() self._mocked_tree_view.reset_view.assert_called_once() @@ -329,7 +330,7 @@ class TestImportResourcesController(TestCase): mock_aws_utils.list_lambda_functions.assert_called_once_with( TestImportResourcesController._expected_region) - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.load_resource.assert_not_called() self._mocked_proxy_model.emit_source_model_layout_changed.assert_called_once() self._mocked_import_resources_page.set_current_main_view_index.assert_called_with( @@ -348,7 +349,7 @@ class TestImportResourcesController(TestCase): mocked_async_call_args: call = mock_thread_manager.get_instance.return_value.start.call_args[0] mocked_async_call_args[0].run() # triggering async function - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.load_resource.assert_not_called() self._mocked_proxy_model.emit_source_model_layout_changed.assert_called_once() self._mocked_import_resources_page.set_current_main_view_index.assert_called_with( @@ -383,8 +384,8 @@ class TestImportResourcesController(TestCase): self._mocked_import_resources_page.typed_resources_import_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering typed_resources_import_button connected function - self._test_import_resources_controller.add_import_resources.emit.assert_not_called() - self._mocked_import_resources_page.set_notification_frame_text.assert_called_once() + self._test_import_resources_controller.add_import_resources_sender.emit.assert_not_called() + self._test_import_resources_controller.set_notification_frame_text_sender.emit.assert_called_once() def test_page_typed_resources_import_button_emit_signal_with_expected_resources_and_switch_to_expected_page(self) -> None: self._mocked_proxy_model.deduplicate_selected_import_resources.return_value = \ @@ -393,7 +394,7 @@ class TestImportResourcesController(TestCase): self._mocked_import_resources_page.typed_resources_import_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering typed_resources_import_button connected function - self._test_import_resources_controller.add_import_resources.emit.assert_called_once_with( + self._test_import_resources_controller.add_import_resources_sender.emit.assert_called_once_with( [TestImportResourcesController._expected_lambda_resource]) self._mocked_view_manager.switch_to_view_edit_page.assert_called_once() self._mocked_tree_view.reset_view.assert_called_once() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py index 5442ef87a7..86bb9bd227 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py @@ -62,10 +62,12 @@ class TestViewEditController(TestCase): self._mocked_proxy_model: MagicMock = self._mocked_table_view.resource_proxy_model self._test_view_edit_controller: ViewEditController = ViewEditController() + self._test_view_edit_controller.set_notification_frame_text_sender = MagicMock() + self._test_view_edit_controller.set_notification_page_frame_text_sender = MagicMock() self._test_view_edit_controller.setup() def test_add_import_resources_expected_resource_gets_loaded_into_model(self) -> None: - self._test_view_edit_controller.add_import_resources([TestViewEditController._expected_resource]) + self._test_view_edit_controller.add_import_resources_receiver([TestViewEditController._expected_resource]) self._mocked_proxy_model.add_resource.assert_called_once() mocked_call_args: call = self._mocked_proxy_model.add_resource.call_args[0] # mock call args index is 0 @@ -128,7 +130,7 @@ class TestViewEditController(TestCase): self._mocked_proxy_model.emit_source_model_layout_changed.assert_not_called() self._mocked_proxy_model.load_resource.assert_not_called() self._mocked_view_edit_page.set_table_view_page_interactions_enabled.assert_called_with(False) - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_view_edit_page.set_current_main_view_index.assert_called_with( ViewEditPageConstants.TABLE_VIEW_PAGE_INDEX) @@ -189,7 +191,7 @@ class TestViewEditController(TestCase): mock_json_utils.validate_json_dict_according_to_json_schema.assert_called_once_with({}) mock_json_utils.convert_json_dict_to_resources.assert_not_called() self._mocked_proxy_model.load_resource.assert_not_called() - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_view_edit_page.set_table_view_page_interactions_enabled.assert_called_with(False) @patch("controller.view_edit_controller.file_utils") @@ -239,7 +241,7 @@ class TestViewEditController(TestCase): self._mocked_view_edit_page.config_file_combobox.currentText.assert_called_once() self._mocked_table_view.reset_view.assert_called_once() self._mocked_proxy_model.override_resource_status.assert_called_once() - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.emit_source_model_layout_changed.assert_has_calls([call(), call()]) self._mocked_view_edit_page.set_current_main_view_index.assert_called_with( ViewEditPageConstants.TABLE_VIEW_PAGE_INDEX) @@ -275,7 +277,7 @@ class TestViewEditController(TestCase): mocked_call_args[0]() # triggering config_location_button connected function mock_file_dialog.getExistingDirectory.assert_called_once() - self._mocked_view_edit_page.set_notification_page_text.assert_called_with( + self._test_view_edit_controller.set_notification_page_frame_text_sender.emit.assert_called_with( notification_label_text.NOTIFICATION_LOADING_MESSAGE) self._mocked_view_edit_page.set_current_main_view_index.assert_called_with( ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) @@ -303,7 +305,7 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == [] self._mocked_view_edit_page.set_config_files.assert_called_with([]) - self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + self._test_view_edit_controller.set_notification_page_frame_text_sender.emit.assert_called_once_with( notification_label_text.NOTIFICATION_LOADING_MESSAGE) @patch("controller.view_edit_controller.ThreadManager") @@ -325,7 +327,7 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == [] self._mocked_view_edit_page.set_config_files.assert_called_with([]) - self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + self._test_view_edit_controller.set_notification_page_frame_text_sender.emit.assert_called_once_with( notification_label_text.NOTIFICATION_LOADING_MESSAGE) @patch("controller.view_edit_controller.ThreadManager") @@ -348,7 +350,7 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == expected_new_config_files self._mocked_view_edit_page.set_config_files.assert_called_with(expected_new_config_files) - self._mocked_view_edit_page.set_notification_page_text.assert_called_once_with( + self._test_view_edit_controller.set_notification_page_frame_text_sender.emit.assert_called_once_with( notification_label_text.NOTIFICATION_LOADING_MESSAGE) def test_page_add_row_button_expected_resource_gets_loaded_into_model(self) -> None: @@ -395,7 +397,7 @@ class TestViewEditController(TestCase): mocked_call_args[0]() # triggering save_changes_button connected function self._mocked_proxy_model.override_resource_status.assert_called_once() - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.override_all_resources_status.assert_not_called() @patch("controller.view_edit_controller.json_utils") @@ -451,7 +453,7 @@ class TestViewEditController(TestCase): mock_json_utils.convert_resources_to_json_dict.assert_called_once() mock_json_utils.write_into_json_file.assert_called_once_with( TestViewEditController._expected_config_file_full_path, expected_json_dict) - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() self._mocked_proxy_model.override_all_resources_status.assert_not_called() def test_page_search_filter_input_invoke_proxy_model_with_expected_filter_text(self) -> None: @@ -498,7 +500,7 @@ class TestViewEditController(TestCase): mock_file_utils.join_path.assert_called_once() mock_json_utils.create_empty_resource_mapping_file.assert_called_once() mock_file_utils.find_files_with_suffix_under_directory.assert_not_called() - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() @patch("controller.view_edit_controller.file_utils") def test_page_rescan_button_post_notification_when_find_files_throw_exception( @@ -509,4 +511,4 @@ class TestViewEditController(TestCase): mocked_call_args[0]() # triggering rescan_button connected function mock_file_utils.find_files_with_suffix_under_directory.assert_called_once() - self._mocked_view_edit_page.set_notification_frame_text.assert_called_once() + self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_controller_manager.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_controller_manager.py index 3a9b368bfd..93e49415ca 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_controller_manager.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_controller_manager.py @@ -55,5 +55,5 @@ class TestControllerManager(TestCase): TestControllerManager._expected_controller_manager.setup() mocked_view_edit_controller.setup.assert_called_once() mocked_import_resources_controller.setup.assert_called_once() - mocked_import_resources_controller.add_import_resources.connect.assert_called_once_with( - mocked_view_edit_controller.add_import_resources) + mocked_import_resources_controller.add_import_resources_sender.connect.assert_called_once_with( + mocked_view_edit_controller.add_import_resources_receiver) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_view_manager.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_view_manager.py index 12e9a9e6be..eb8304182f 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_view_manager.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/manager/test_view_manager.py @@ -18,7 +18,7 @@ from manager.view_manager import (ViewManager, ViewManagerConstants) class TestViewManager(TestCase): """ - ThreadManager unit test cases + ViewManager unit test cases """ _mock_import_resources_page: MagicMock _mock_view_edit_page: MagicMock @@ -36,6 +36,8 @@ class TestViewManager(TestCase): main_window_patcher: patch = patch("manager.view_manager.QMainWindow") cls._mock_main_window = main_window_patcher.start() + window_icon_patcher: patch = patch("manager.view_manager.QPixmap") + window_icon_patcher.start() stacked_pages_patcher: patch = patch("manager.view_manager.QStackedWidget") cls._mock_stacked_pages = stacked_pages_patcher.start() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_environment_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_environment_utils.py new file mode 100644 index 0000000000..7f7892bf00 --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_environment_utils.py @@ -0,0 +1,44 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +from typing import List +from unittest import TestCase +from unittest.mock import (ANY, call, MagicMock, patch) + +from model import constants +from model.basic_resource_attributes import (BasicResourceAttributes, BasicResourceAttributesBuilder) +from utils import environment_utils + + +class TestEnvironmentUtils(TestCase): + """ + environment utils unit test cases + """ + def setUp(self) -> None: + os_environ_patcher: patch = patch("os.environ") + self.addCleanup(os_environ_patcher.stop) + self._mock_os_environ: MagicMock = os_environ_patcher.start() + + os_pathsep_patcher: patch = patch("os.pathsep") + self.addCleanup(os_pathsep_patcher.stop) + self._mock_os_pathsep: MagicMock = os_pathsep_patcher.start() + + def test_setup_qt_environment_global_flag_is_set(self) -> None: + environment_utils.setup_qt_environment("dummy") + self._mock_os_environ.copy.assert_called_once() + self._mock_os_pathsep.join.assert_called_once() + assert environment_utils.is_qt_linked() is True + + def test_cleanup_qt_environment_global_flag_is_set(self) -> None: + environment_utils.setup_qt_environment("dummy") + assert environment_utils.is_qt_linked() is True + environment_utils.cleanup_qt_environment() + assert environment_utils.is_qt_linked() is False diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py index 70c45f3622..f7361150ea 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_file_utils.py @@ -30,10 +30,6 @@ class TestFileUtils(TestCase): self.addCleanup(path_patcher.stop) self._mock_path: MagicMock = path_patcher.start() - windows_path_patcher: patch = patch("pathlib.WindowsPath") - self.addCleanup(windows_path_patcher.stop) - self._mock_windows_path: MagicMock = windows_path_patcher.start() - def test_check_path_exists_returns_true(self) -> None: mocked_path: MagicMock = self._mock_path.return_value mocked_path.exists.return_value = True @@ -105,12 +101,35 @@ class TestFileUtils(TestCase): assert not actual_files def test_join_path_return_expected_result(self) -> None: - mocked_windows_path: MagicMock = self._mock_windows_path.return_value + mocked_path: MagicMock = self._mock_path.return_value expected_join_path_name: str = f"{TestFileUtils._expected_path_name}{TestFileUtils._expected_file_name}" - mocked_windows_path.joinpath.return_value = expected_join_path_name + mocked_path.joinpath.return_value = expected_join_path_name actual_join_path_name: str = file_utils.join_path(TestFileUtils._expected_path_name, TestFileUtils._expected_file_name) - self._mock_windows_path.assert_called_once_with(TestFileUtils._expected_path_name) - mocked_windows_path.joinpath.assert_called_once_with(TestFileUtils._expected_file_name) + self._mock_path.assert_called_once_with(TestFileUtils._expected_path_name) + mocked_path.joinpath.assert_called_once_with(TestFileUtils._expected_file_name) assert actual_join_path_name == expected_join_path_name + + def test_normalize_file_path_return_empty_when_input_is_empty(self) -> None: + actual_normalized_path: str = file_utils.normalize_file_path("") + assert actual_normalized_path == "" + + def test_normalize_file_path_return_expected_result(self) -> None: + mocked_path: MagicMock = self._mock_path.return_value + expected_resolve_path: str = TestFileUtils._expected_path_name + mocked_path.resolve.return_value = expected_resolve_path + + actual_resolve_path: str = file_utils.normalize_file_path("dummy") + self._mock_path.assert_called_once() + mocked_path.resolve.assert_called_once() + assert actual_resolve_path == expected_resolve_path + + def test_normalize_file_path_return_empty_when_exception_raised(self) -> None: + mocked_path: MagicMock = self._mock_path.return_value + mocked_path.resolve.side_effect = RuntimeError() + + actual_resolve_path: str = file_utils.normalize_file_path("dummy") + self._mock_path.assert_called_once() + mocked_path.resolve.assert_called_once() + assert actual_resolve_path == "" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/aws_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/aws_utils.py index b05ac08575..329d3ff44e 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/aws_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/aws_utils.py @@ -44,15 +44,26 @@ class AWSConstants(object): S3_SERVICE_NAME: str = "s3" +def _close_client_connection(client: BaseClient) -> None: + session: boto3.session.Session = client._endpoint.http_session + managers: List[object] = [session._manager, *session._proxy_managers.values()] + for manager in managers: + manager.clear() + + def _initialize_boto3_aws_client(service: str, region: str = "") -> BaseClient: if region: - return boto3.client(service, region_name=region) + boto3_client: BaseClient = boto3.client(service, region_name=region) else: - return boto3.client(service) + boto3_client: BaseClient = boto3.client(service) + boto3_client.meta.events.register( + f"after-call.{service}.*", lambda **kwargs: _close_client_connection(boto3_client) + ) + return boto3_client def get_default_account_id() -> str: - sts_client: BaseClient = boto3.client(AWSConstants.STS_SERVICE_NAME) + sts_client: BaseClient = _initialize_boto3_aws_client(AWSConstants.STS_SERVICE_NAME) try: return sts_client.get_caller_identity()["Account"] except ClientError as error: @@ -65,7 +76,7 @@ def get_default_region() -> str: if region: return region - sts_client: BaseClient = boto3.client(AWSConstants.STS_SERVICE_NAME) + sts_client: BaseClient = _initialize_boto3_aws_client(AWSConstants.STS_SERVICE_NAME) region = sts_client.meta.region_name if region: return region diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/environment_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/environment_utils.py new file mode 100644 index 0000000000..040d95829f --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/environment_utils.py @@ -0,0 +1,70 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" + +import logging +import os +from typing import Dict + +from utils import file_utils + +""" +Environment Utils provide functions to setup python environment libs for resource mapping tool +""" +logger = logging.getLogger(__name__) + +qt_binaries_linked: bool = False +old_os_env: Dict[str, str] = os.environ.copy() + + +def setup_qt_environment(bin_path: str) -> None: + """ + Setup Qt binaries for o3de python runtime environment + :param bin_path: The path of Qt binaries + """ + if is_qt_linked(): + logger.info("Qt binaries have already been linked, skip Qt setup") + return + global old_os_env + old_os_env = os.environ.copy() + binaries_path: str = file_utils.normalize_file_path(bin_path) + os.environ["QT_PLUGIN_PATH"] = binaries_path + + path = os.environ['PATH'] + + new_path = os.pathsep.join([binaries_path, path]) + os.environ['PATH'] = new_path + + global qt_binaries_linked + qt_binaries_linked = True + + +def is_qt_linked() -> bool: + """ + Check whether Qt binaries have been linked in o3de python runtime environment + :return: True if Qt binaries have been linked; False if not + """ + return qt_binaries_linked + + +def cleanup_qt_environment() -> None: + """ + Clean up the linked Qt binaries in o3de python runtime environment + """ + if not is_qt_linked(): + logger.info("Qt binaries have not been linked, skip Qt uninstall") + return + global old_os_env + if old_os_env.get("QT_PLUGIN_PATH"): + old_os_env.pop("QT_PLUGIN_PATH") + os.environ = old_os_env + + global qt_binaries_linked + qt_binaries_linked = False diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py index a320f2ac1b..365d25834e 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/file_utils.py @@ -20,8 +20,8 @@ path, check file existence, etc logger = logging.getLogger(__name__) -def check_path_exists(full_path: str) -> bool: - return pathlib.Path(full_path).exists() +def check_path_exists(file_path: str) -> bool: + return pathlib.Path(file_path).exists() def get_current_directory_path() -> str: @@ -42,8 +42,16 @@ def find_files_with_suffix_under_directory(dir_path: str, suffix: str) -> List[s if matched_path.is_file(): results.append(str(matched_path.name)) return results - - -def join_path(dir_path: str, file_name: str) -> str: - # TODO: expand usage to support Mac and Linux - return str(pathlib.WindowsPath(dir_path).joinpath(file_name)) + + +def normalize_file_path(file_path: str) -> str: + if file_path: + try: + return str(pathlib.Path(file_path).resolve(True)) + except (FileNotFoundError, RuntimeError): + logger.warning(f"Failed to normalize file path {file_path}, return empty string instead") + return "" + + +def join_path(this_path: str, other_path: str) -> str: + return str(pathlib.Path(this_path).joinpath(other_path)) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py index f5ac5bf436..8aad0a785c 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py @@ -9,6 +9,7 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ +from PySide2.QtCore import Slot from PySide2.QtGui import (QIcon, QPixmap) from PySide2.QtWidgets import (QFrame, QHBoxLayout, QLabel, QLayout, QLineEdit, QPushButton, QSizePolicy, QWidget) @@ -58,5 +59,7 @@ class NotificationFrame(QFrame): self.setVisible(False) - def set_text(self, text: str) -> None: + @Slot(str) + def set_frame_text_receiver(self, text: str) -> None: self._title_label.setText(text) + self.setVisible(True) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py index 004eeb1f6b..15af8e6aad 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/import_resources_page.py @@ -136,7 +136,6 @@ class ImportResourcesPage(QWidget): self._back_button.setObjectName("Secondary") self._back_button.setText(f" {notification_label_text.IMPORT_RESOURCES_PAGE_BACK_TEXT}") self._back_button.setIcon(QIcon(":/Breadcrumb/img/UI20/Breadcrumb/arrow_left-default.svg")) - self._back_button.setFlat(True) self._back_button.setMinimumSize(view_size_constants.BACK_BUTTON_WIDTH, view_size_constants.INTERACTION_COMPONENT_HEIGHT) header_area_layout.addWidget(self._back_button) @@ -325,6 +324,10 @@ class ImportResourcesPage(QWidget): def search_version(self) -> str: return self._search_version + @property + def notification_frame(self) -> NotificationFrame: + return self._notification_frame + @search_version.setter def search_version(self, new_search_version: str) -> None: self._search_version = new_search_version @@ -343,10 +346,3 @@ class ImportResourcesPage(QWidget): def set_current_main_view_index(self, index: int) -> None: """Switch main view page based on given index""" self._stacked_pages.setCurrentIndex(index) - - def hide_notification_frame(self) -> None: - self._notification_frame.setVisible(False) - - def set_notification_frame_text(self, text: str) -> None: - self._notification_frame.set_text(text) - self._notification_frame.setVisible(True) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py index cb082b428b..8e43b1a348 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py @@ -410,6 +410,14 @@ class ViewEditPage(QWidget): def rescan_button(self) -> QPushButton: return self._rescan_button + @property + def notification_frame(self) -> NotificationFrame: + return self._notification_frame + + @property + def notification_page_frame(self) -> NotificationFrame: + return self._notification_page_frame + def set_current_main_view_index(self, index: int) -> None: """Switch main view page based on given index""" if index == ViewEditPageConstants.NOTIFICATION_PAGE_INDEX: @@ -436,11 +444,13 @@ class ViewEditPage(QWidget): self._config_file_combobox.setCurrentIndex(-1) if config_files: - self._notification_page_frame.set_text(notification_label_text.VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE) + self._notification_page_frame.set_frame_text_receiver( + notification_label_text.VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE) self._create_new_button.setVisible(False) self._rescan_button.setVisible(False) else: - self._notification_page_frame.set_text(notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE) + self._notification_page_frame.set_frame_text_receiver( + notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE) self._create_new_button.setVisible(True) self._rescan_button.setVisible(True) @@ -455,16 +465,6 @@ class ViewEditPage(QWidget): self._config_location_text.setText(elided_text) self._config_location_text.setToolTip(config_location) - def set_notification_page_text(self, text: str) -> None: - self._notification_page_frame.set_text(text) - - def hide_notification_frame(self) -> None: - self._notification_frame.setVisible(False) - - def set_notification_frame_text(self, text: str) -> None: - self._notification_frame.set_text(text) - self._notification_frame.setVisible(True) - def set_table_view_page_interactions_enabled(self, enabled: bool) -> None: self._table_view_page.setEnabled(enabled) self._save_changes_button.setEnabled(enabled) diff --git a/Gems/AWSCore/cdk/example/__init__.py b/Gems/AWSCore/cdk/example/__init__.py index 6ed3dc4bda..79f8fa4422 100755 --- a/Gems/AWSCore/cdk/example/__init__.py +++ b/Gems/AWSCore/cdk/example/__init__.py @@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSCore/cdk/example/s3_content/example.txt b/Gems/AWSCore/cdk/example/s3_content/example.txt index 3377b6864c..b96ea727c2 100644 --- a/Gems/AWSCore/cdk/example/s3_content/example.txt +++ b/Gems/AWSCore/cdk/example/s3_content/example.txt @@ -1 +1 @@ -This is the content from the example s3 bucket \ No newline at end of file +This is the content from the example s3 bucket diff --git a/Gems/AWSCore/gem.json b/Gems/AWSCore/gem.json index fc97bf95e7..af52acf746 100644 --- a/Gems/AWSCore/gem.json +++ b/Gems/AWSCore/gem.json @@ -15,4 +15,4 @@ "Connected" ], "IconPath": "preview.png" -} \ No newline at end of file +} diff --git a/Gems/AWSMetrics/cdk/api_spec.json b/Gems/AWSMetrics/cdk/api_spec.json index 038bc41941..74a19ba460 100644 --- a/Gems/AWSMetrics/cdk/api_spec.json +++ b/Gems/AWSMetrics/cdk/api_spec.json @@ -219,4 +219,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AWSMetrics/cdk/aws_metrics/__init__.py b/Gems/AWSMetrics/cdk/aws_metrics/__init__.py index 6ed3dc4bda..79f8fa4422 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/__init__.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/__init__.py @@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSMetrics/cdk/aws_metrics/policy_statements_builder/__init__.py b/Gems/AWSMetrics/cdk/aws_metrics/policy_statements_builder/__init__.py index 6ed3dc4bda..79f8fa4422 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/policy_statements_builder/__init__.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/policy_statements_builder/__init__.py @@ -7,4 +7,4 @@ distribution (the "License"). All use of this software is governed by the Licens or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" \ No newline at end of file +""" diff --git a/Gems/AWSMetrics/gem.json b/Gems/AWSMetrics/gem.json index 176551bd6d..014434d408 100644 --- a/Gems/AWSMetrics/gem.json +++ b/Gems/AWSMetrics/gem.json @@ -13,4 +13,4 @@ "Cloud" ], "IconPath": "preview.png" -} \ No newline at end of file +} diff --git a/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer.cpp b/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer.cpp index 1083ec876a..ac3ab0dd04 100644 --- a/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer.cpp +++ b/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer.cpp @@ -308,7 +308,7 @@ namespace AssetMemoryAnalyzer AZStd::function<void(AssetInfo*, AssetTreeNode*, int)> recurse; recurse = [&recurse](AssetInfo* outAsset, AssetTreeNode* inAsset, int depth) { - outAsset->m_id = inAsset->m_masterInfo ? inAsset->m_masterInfo->m_id->m_id.c_str() : nullptr; + outAsset->m_id = inAsset->m_primaryinfo ? inAsset->m_primaryinfo->m_id->m_id.c_str() : nullptr; // For every code point in this asset node, record its allocations for (auto& codePointInfo : inAsset->m_data.m_codePointsToAllocations) diff --git a/Gems/AssetMemoryAnalyzer/www/AssetMemoryViewer/index.html b/Gems/AssetMemoryAnalyzer/www/AssetMemoryViewer/index.html index e115329025..85a4e47db8 100644 --- a/Gems/AssetMemoryAnalyzer/www/AssetMemoryViewer/index.html +++ b/Gems/AssetMemoryAnalyzer/www/AssetMemoryViewer/index.html @@ -265,4 +265,4 @@ function loadFileSelected(event) { </script> </body> -</html> \ No newline at end of file +</html> diff --git a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/cubemapgen.json b/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/cubemapgen.json deleted file mode 100644 index c5dc8a7486..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/3rdParty/cubemapgen.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "cubemapgen", - "source": "@GEM@/External/CubeMapGen", - "description": "CubeMapGen", - "defines": [], - "lib_required": "False", - "includes": [""] -} - diff --git a/Gems/Atom/Asset/ImageProcessingAtom/CMakeLists.txt b/Gems/Atom/Asset/ImageProcessingAtom/CMakeLists.txt index 7f322b615a..1126af2afa 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/CMakeLists.txt +++ b/Gems/Atom/Asset/ImageProcessingAtom/CMakeLists.txt @@ -10,6 +10,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) - add_subdirectory(Code) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettingManager.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettingManager.cpp index e30fb9c6a2..3b6c906c10 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettingManager.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettingManager.cpp @@ -524,6 +524,10 @@ namespace ImageProcessingAtom { return outPreset; } + else + { + AZ_Warning("Image Processing", false, "Image dimensions are not compatible with preset '%s'. The default preset will be used.", presetInfo->m_name.c_str()); + } } //uncompressed one which could be used for almost everything diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.cpp index 508749392d..87db5c7c07 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.cpp @@ -29,4 +29,4 @@ namespace ImageProcessingAtom ; } } -} // namespace ImageProcessingAtom \ No newline at end of file +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.h index 4e27a37462..dc93276718 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/BuilderSettings.h @@ -29,4 +29,4 @@ namespace ImageProcessingAtom bool m_enableStreaming = true; bool m_enablePlatform = true; }; -} // namespace ImageProcessingAtom \ No newline at end of file +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/ImageProcessingDefines.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/ImageProcessingDefines.h index e1da1cf756..48b6c02548 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/ImageProcessingDefines.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/ImageProcessingDefines.h @@ -116,4 +116,4 @@ namespace AZ AZ_TYPE_INFO_SPECIALIZE(ImageProcessingAtom::ColorSpace, "{C924C0BB-1154-4341-A25A-698A3950B286}"); AZ_TYPE_INFO_SPECIALIZE(ImageProcessingAtom::CubemapFilterType, "{0D69E9F3-8F4C-4415-96B5-64ACA0B0888B}"); AZ_TYPE_INFO_SPECIALIZE(ImageProcessingAtom::MipGenType, "{8524F650-1417-44DA-BBB0-C707A7A1A709}"); -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/TextureSettings.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/TextureSettings.h index e15bf84400..7bc6c2edf9 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/TextureSettings.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/BuilderSettings/TextureSettings.h @@ -161,4 +161,4 @@ namespace ImageProcessingAtom bool operator==(const TextureSettings& other) const; bool operator!=(const TextureSettings& other) const; }; -} // namespace ImageProcessingAtom \ No newline at end of file +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/Cubemap.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/Cubemap.h index e6ac1e3977..5f7dece8a6 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/Cubemap.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/Cubemap.h @@ -116,4 +116,4 @@ namespace ImageProcessingAtom // Helper function to convert Latitude-longitude map to cubemap bool IsValidLatLongMap(IImageObjectPtr latitudeMap); IImageObjectPtr ConvertLatLongMapToCubemap(IImageObjectPtr latitudeMap); -}//end namspace ImageProcessing \ No newline at end of file +}//end namspace ImageProcessing diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.h index 8f42a49ab2..e8ffb218c1 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.h @@ -82,4 +82,4 @@ namespace ImageProcessingAtom unsigned int dstFactor, int dstFirst, int dstLast, signed short int numRepetitions, double blurFactor, class IWindowFunction<double>* windowFunction, bool peaknorm, bool& plusminus); -} //end namespace ImageProcessingAtom \ No newline at end of file +} //end namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/HighPass.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/HighPass.cpp index 20c93f5641..7d817b4b1e 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/HighPass.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/HighPass.cpp @@ -105,4 +105,4 @@ namespace ImageProcessingAtom m_img = newImage; } -} // namespace ImageProcessingAtom \ No newline at end of file +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp index 4de024c088..5d5fd21b44 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp @@ -79,7 +79,7 @@ namespace ImageProcessingAtom builderDescriptor.m_busId = azrtti_typeid<ImageBuilderWorker>(); builderDescriptor.m_createJobFunction = AZStd::bind(&ImageBuilderWorker::CreateJobs, &m_imageBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); builderDescriptor.m_processJobFunction = AZStd::bind(&ImageBuilderWorker::ProcessJob, &m_imageBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); - builderDescriptor.m_version = 19; // [ATOM-14459] + builderDescriptor.m_version = 22; // [ATOM-14765] builderDescriptor.m_analysisFingerprint = ImageProcessingAtom::BuilderSettingManager::Instance()->GetAnalysisFingerprint(); m_imageBuilder.BusConnect(builderDescriptor.m_busId); AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDescriptor); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessingModule.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessingModule.cpp index 5df9ac68c9..84d69ed2dc 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessingModule.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessingModule.cpp @@ -14,6 +14,7 @@ #include <AzCore/Module/Module.h> #include "ImageProcessingSystemComponent.h" #include "ImageBuilderComponent.h" +#include "Thumbnail/ImageThumbnailSystemComponent.h" namespace ImageProcessingAtom { @@ -28,8 +29,9 @@ namespace ImageProcessingAtom { // Push results of the components' ::CreateDescriptor() into m_descriptors here. m_descriptors.insert(m_descriptors.end(), { - ImageProcessingSystemComponent::CreateDescriptor(), //system component for editor - BuilderPluginComponent::CreateDescriptor(), //builder component for AP + Thumbnails::ImageThumbnailSystemComponent::CreateDescriptor(), + ImageProcessingSystemComponent::CreateDescriptor(), // system component for editor + BuilderPluginComponent::CreateDescriptor(), // builder component for AP }); } @@ -40,6 +42,7 @@ namespace ImageProcessingAtom { return AZ::ComponentTypeList{ azrtti_typeid<ImageProcessingSystemComponent>(), + azrtti_typeid<Thumbnails::ImageThumbnailSystemComponent>(), }; } }; diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Common/Clang/imageprocessingatom_editor_static_clang.cmake b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Common/Clang/imageprocessingatom_editor_static_clang.cmake index 1854cb6090..7fd8d2ea86 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Common/Clang/imageprocessingatom_editor_static_clang.cmake +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Common/Clang/imageprocessingatom_editor_static_clang.cmake @@ -12,4 +12,4 @@ set(LY_COMPILE_OPTIONS PRIVATE -fexceptions #ImageLoader/ExrLoader.cpp uses exceptions -) \ No newline at end of file +) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Mac/platform_mac.cmake b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Mac/platform_mac.cmake index 923c1a27fd..d6c20c0037 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Mac/platform_mac.cmake +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Platform/Mac/platform_mac.cmake @@ -12,4 +12,4 @@ set(LY_COMPILE_OPTIONS PRIVATE -fexceptions #ImageLoader/ExrLoader.cpp and PVRTC.cpp uses exceptions -) \ No newline at end of file +) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewer.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewer.cpp index 1e481c56ef..fcdc9cd0d3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewer.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewer.cpp @@ -218,12 +218,10 @@ namespace ImageProcessingAtom AZ::Data::Asset<AZ::RPI::StreamingImageAsset> imageAsset = Utils::LoadImageAsset(product->GetAssetId()); IImageObjectPtr image = Utils::LoadImageFromImageAsset(imageAsset); - AZStd::string productInfo; - - QImage previewImage; if (image) { // Add product image info + AZStd::string productInfo; GetImageInfoString(imageAsset, productInfo); m_fileinfo += QStringLiteral("\r\n"); @@ -242,11 +240,11 @@ namespace ImageProcessingAtom m_fileinfo += GetFileSize(source->GetFullPath().c_str()); IImageObjectPtr image = IImageObjectPtr(LoadImageFromFile(source->GetFullPath())); - AZStd::string sourceInfo; - QImage previewImage; + if (image) { // Add source image info + AZStd::string sourceInfo; GetImageInfoString(image, sourceInfo); m_fileinfo += QStringLiteral("\r\n"); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewerFactory.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewerFactory.h index c7c54f1a64..bd05e16793 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewerFactory.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Previewer/ImagePreviewerFactory.h @@ -35,4 +35,4 @@ namespace ImageProcessingAtom private: QString m_name = "ImagePreviewer"; }; -} //namespace ImageProcessingAtom \ No newline at end of file +} //namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvertJob.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvertJob.cpp index ee23ce6d63..c6f0d3946a 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvertJob.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvertJob.cpp @@ -146,4 +146,4 @@ namespace ImageProcessingAtom { return m_isCancelled || IsCancelled(); } -}// namespace ImageProcessingAtom \ No newline at end of file +}// namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp new file mode 100644 index 0000000000..a586de9724 --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp @@ -0,0 +1,140 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <AssetBrowser/Thumbnails/ProductThumbnail.h> +#include <AssetBrowser/Thumbnails/SourceThumbnail.h> +#include <Atom/RPI.Reflect/Image/StreamingImageAsset.h> +#include <AzToolsFramework/API/EditorAssetSystemAPI.h> +#include <QtConcurrent/QtConcurrent> +#include <Source/ImageLoader/ImageLoaders.h> +#include <Source/Thumbnail/ImageThumbnail.h> + +namespace ImageProcessingAtom +{ + namespace Thumbnails + { + const int ImageThumbnailSize = 200; + + ////////////////////////////////////////////////////////////////////////// + // ImageThumbnail + ////////////////////////////////////////////////////////////////////////// + ImageThumbnail::ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize) + : Thumbnail(key, thumbnailSize) + { + auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(key.data()); + if (sourceKey) + { + bool foundIt = false; + AZStd::vector<AZ::Data::AssetInfo> productAssetInfo; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult( + foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetAssetsProducedBySourceUUID, sourceKey->GetSourceUuid(), + productAssetInfo); + + for (const auto& assetInfo : productAssetInfo) + { + m_assetIds.insert(assetInfo.m_assetId); + } + } + + auto productKey = azrtti_cast<const AzToolsFramework::AssetBrowser::ProductThumbnailKey*>(key.data()); + if (productKey && productKey->GetAssetType() == AZ::RPI::StreamingImageAsset::RTTI_Type()) + { + m_assetIds.insert(productKey->GetAssetId()); + } + + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusConnect(key); + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); + } + + ImageThumbnail::~ImageThumbnail() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect(); + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); + } + + void ImageThumbnail::LoadThread() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent( + AZ::RPI::StreamingImageAsset::RTTI_Type(), &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail, + m_key, + m_thumbnailSize); + // wait for response from thumbnail renderer + m_renderWait.acquire(); + } + + void ImageThumbnail::ThumbnailRendered(QPixmap& thumbnailImage) + { + m_pixmap = thumbnailImage; + m_renderWait.release(); + } + + void ImageThumbnail::ThumbnailFailedToRender() + { + m_state = State::Failed; + m_renderWait.release(); + } + + void ImageThumbnail::OnCatalogAssetChanged([[maybe_unused]] const AZ::Data::AssetId& assetId) + { + if (m_state == State::Ready && m_assetIds.find(assetId) != m_assetIds.end()) + { + m_state = State::Unloaded; + Load(); + } + } + + ////////////////////////////////////////////////////////////////////////// + // ImageThumbnailCache + ////////////////////////////////////////////////////////////////////////// + ImageThumbnailCache::ImageThumbnailCache() + : ThumbnailCache<ImageThumbnail>() + { + } + + ImageThumbnailCache::~ImageThumbnailCache() = default; + + int ImageThumbnailCache::GetPriority() const + { + // Image thumbnails override default source thumbnails, so carry higher priority + return 1; + } + + const char* ImageThumbnailCache::GetProviderName() const + { + return ProviderName; + } + + bool ImageThumbnailCache::IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const + { + auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(key.data()); + if (sourceKey) + { + bool foundIt = false; + AZ::Data::AssetInfo assetInfo; + AZStd::string watchFolder; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult( + foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(), + assetInfo, watchFolder); + + if (foundIt) + { + AZStd::string ext; + AZ::StringFunc::Path::GetExtension(assetInfo.m_relativePath.c_str(), ext, false); + return IsExtensionSupported(ext.c_str()); + } + } + + auto productKey = azrtti_cast<const AzToolsFramework::AssetBrowser::ProductThumbnailKey*>(key.data()); + return productKey && productKey->GetAssetType() == AZ::RPI::StreamingImageAsset::RTTI_Type(); + } + } // namespace Thumbnails +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.h new file mode 100644 index 0000000000..85ce9d59e6 --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.h @@ -0,0 +1,74 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#if !defined(Q_MOC_RUN) +#include <AzCore/std/containers/unordered_set.h> +#include <AzCore/std/parallel/binary_semaphore.h> +#include <AzFramework/Asset/AssetCatalogBus.h> +#include <AzToolsFramework/Thumbnails/Thumbnail.h> +#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h> +#endif + +namespace ImageProcessingAtom +{ + namespace Thumbnails + { + /** + * Custom image thumbnail that detects when an asset changes and updates the thumbnail + */ + class ImageThumbnail + : public AzToolsFramework::Thumbnailer::Thumbnail + , public AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler + , public AzFramework::AssetCatalogEventBus::Handler + { + Q_OBJECT + public: + ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize); + ~ImageThumbnail() override; + + //! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides... + void ThumbnailRendered(QPixmap& thumbnailImage) override; + void ThumbnailFailedToRender() override; + + protected: + void LoadThread() override; + + private: + // AzFramework::AssetCatalogEventBus::Handler interface overrides... + void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override; + + AZStd::binary_semaphore m_renderWait; + AZStd::unordered_set<AZ::Data::AssetId> m_assetIds; + }; + + /** + * Cache configuration for large image thumbnails + */ + class ImageThumbnailCache + : public AzToolsFramework::Thumbnailer::ThumbnailCache<ImageThumbnail> + { + public: + ImageThumbnailCache(); + ~ImageThumbnailCache() override; + + int GetPriority() const override; + const char* GetProviderName() const override; + + static constexpr const char* ProviderName = "Image Thumbnails"; + + protected: + bool IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const override; + }; + } // namespace Thumbnails +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp new file mode 100644 index 0000000000..14f125c283 --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp @@ -0,0 +1,180 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include "ImageProcessing_precompiled.h" + +#include <AzCore/Serialization/EditContext.h> +#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/Utils/Utils.h> +#include <AzFramework/Asset/AssetSystemBus.h> +#include <AzFramework/StringFunc/StringFunc.h> +#include <AzToolsFramework/API/EditorAssetSystemAPI.h> +#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h> +#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h> +#include <AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h> +#include <AzToolsFramework/Thumbnails/ThumbnailContext.h> +#include <ImageLoader/ImageLoaders.h> +#include <Processing/ImageConvert.h> +#include <Processing/ImageToProcess.h> +#include <Processing/Utils.h> +#include <Thumbnail/ImageThumbnail.h> +#include <Thumbnail/ImageThumbnailSystemComponent.h> + +namespace ImageProcessingAtom +{ + namespace Thumbnails + { + void ImageThumbnailSystemComponent::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context)) + { + serialize->Class<ImageThumbnailSystemComponent, AZ::Component>() + ->Version(0); + + if (AZ::EditContext* ec = serialize->GetEditContext()) + { + ec->Class<ImageThumbnailSystemComponent>("ImageThumbnailSystemComponent", "System component for image thumbnails.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System")) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true); + } + } + } + + void ImageThumbnailSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("ImageThumbnailSystem")); + } + + void ImageThumbnailSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) + { + incompatible.push_back(AZ_CRC_CE("ImageThumbnailSystem")); + } + + void ImageThumbnailSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC_CE("ThumbnailerService")); + } + + void ImageThumbnailSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + AZ_UNUSED(dependent); + } + + void ImageThumbnailSystemComponent::Activate() + { + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusConnect(AZ::RPI::StreamingImageAsset::RTTI_Type()); + SetupThumbnails(); + } + + void ImageThumbnailSystemComponent::Deactivate() + { + TeardownThumbnails(); + AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler::BusDisconnect(); + AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); + } + + void ImageThumbnailSystemComponent::SetupThumbnails() + { + using namespace AzToolsFramework::Thumbnailer; + + ThumbnailerRequestsBus::Broadcast( + &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(Thumbnails::ImageThumbnailCache), + ThumbnailContext::DefaultContext); + } + + void ImageThumbnailSystemComponent::TeardownThumbnails() + { + using namespace AzToolsFramework::Thumbnailer; + + ThumbnailerRequestsBus::Broadcast( + &ThumbnailerRequests::UnregisterThumbnailProvider, Thumbnails::ImageThumbnailCache::ProviderName, + ThumbnailContext::DefaultContext); + } + + void ImageThumbnailSystemComponent::OnApplicationAboutToStop() + { + TeardownThumbnails(); + } + + bool ImageThumbnailSystemComponent::Installed() const + { + return true; + } + + void ImageThumbnailSystemComponent::RenderThumbnail( + AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize) + { + auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(thumbnailKey.data()); + if (sourceKey) + { + bool foundIt = false; + AZ::Data::AssetInfo assetInfo; + AZStd::string watchFolder; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult( + foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(), + assetInfo, watchFolder); + + if (foundIt) + { + AZStd::string fullPath; + AZ::StringFunc::Path::Join(watchFolder.c_str(), assetInfo.m_relativePath.c_str(), fullPath); + if (RenerThumbnailFromImage(thumbnailKey, thumbnailSize, IImageObjectPtr(LoadImageFromFile(fullPath)))) + { + return; + } + } + } + + auto productKey = azrtti_cast<const AzToolsFramework::AssetBrowser::ProductThumbnailKey*>(thumbnailKey.data()); + if (productKey) + { + if (RenerThumbnailFromImage(thumbnailKey, thumbnailSize, Utils::LoadImageFromImageAsset(productKey->GetAssetId()))) + { + return; + } + } + + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender); + } + + bool ImageThumbnailSystemComponent::RenerThumbnailFromImage( + AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize, IImageObjectPtr previewImage) const + { + if (!previewImage) + { + return false; + } + + ImageToProcess imageToProcess(previewImage); + imageToProcess.ConvertFormat(ePixelFormat_R8G8B8A8); + previewImage = imageToProcess.Get(); + + AZ::u8* imageBuf = nullptr; + AZ::u32 mip = 0; + AZ::u32 pitch = 0; + previewImage->GetImagePointer(mip, imageBuf, pitch); + const AZ::u32 width = previewImage->GetWidth(mip); + const AZ::u32 height = previewImage->GetHeight(mip); + + QImage image(imageBuf, width, height, pitch, QImage::Format_RGBA8888); + + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event( + thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, + QPixmap::fromImage(image.scaled(QSize(thumbnailSize, thumbnailSize), Qt::KeepAspectRatio, Qt::SmoothTransformation))); + + return true; + } + } // namespace Thumbnails +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.h new file mode 100644 index 0000000000..943857fd35 --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.h @@ -0,0 +1,59 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ +#pragma once + +#include <AzCore/Component/Component.h> +#include <AzFramework/Application/Application.h> +#include <AzToolsFramework/Thumbnails/Thumbnail.h> +#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h> + +namespace ImageProcessingAtom +{ + namespace Thumbnails + { + //! System component for image thumbnails. + class ImageThumbnailSystemComponent + : public AZ::Component + , public AzFramework::ApplicationLifecycleEvents::Bus::Handler + , public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Handler + { + public: + AZ_COMPONENT(ImageThumbnailSystemComponent, "{C45D69BB-4A3B-49CF-916B-580F05CAA755}"); + + static void Reflect(AZ::ReflectContext* context); + + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + + protected: + // AZ::Component interface overrides... + void Activate() override; + void Deactivate() override; + + private: + void SetupThumbnails(); + void TeardownThumbnails(); + + // AzFramework::ApplicationLifecycleEvents overrides... + void OnApplicationAboutToStop() override; + + // ThumbnailerRendererRequestsBus::Handler interface overrides... + bool Installed() const override; + void RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize) override; + + bool RenerThumbnailFromImage( + AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize, IImageObjectPtr previewImage) const; + }; + } // namespace Thumbnails +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings index 0491c1ab85..0417122033 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumptype=none /M=62,18,32,83,50,50 /preset=Diffuse_highQ /mipgentype=kaiser /reduce="es3:0,ios:3,osx_gl:0,pc:4,provo:1" /ser=0 \ No newline at end of file +/autooptimizefile=0 /bumptype=none /M=62,18,32,83,50,50 /preset=Diffuse_highQ /mipgentype=kaiser /reduce="es3:0,ios:3,osx_gl:0,pc:4,provo:1" /ser=0 diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/temp/128x128_RGBA8.tga.streamingimage b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/temp/128x128_RGBA8.tga.streamingimage new file mode 100644 index 0000000000..b867b7cfb1 Binary files /dev/null and b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/temp/128x128_RGBA8.tga.streamingimage differ diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake b/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake index 0392e667ef..dfcfdfc319 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake @@ -133,4 +133,8 @@ set(FILES Source/Compressors/CryTextureSquisher/ColorBlockRGBA4x4s.h Source/Compressors/CryTextureSquisher/ColorBlockRGBA4x4c.h Source/Compressors/CryTextureSquisher/ColorTypes.h + Source/Thumbnail/ImageThumbnail.cpp + Source/Thumbnail/ImageThumbnail.h + Source/Thumbnail/ImageThumbnailSystemComponent.cpp + Source/Thumbnail/ImageThumbnailSystemComponent.h ) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Albedo.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Albedo.preset index d81fefede2..0b68493198 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Albedo.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Albedo.preset @@ -11,6 +11,7 @@ "_basecolor", "_diff", "_color", + "_col", "_albedo", "_alb", "_bc", @@ -31,6 +32,7 @@ "FileMasks": [ "_diff", "_color", + "_col", "_albedo", "_alb", "_basecolor", @@ -51,6 +53,7 @@ "FileMasks": [ "_diff", "_color", + "_col", "_albedo", "_alb", "_basecolor", @@ -71,6 +74,7 @@ "FileMasks": [ "_diff", "_color", + "_col", "_albedo", "_alb", "_basecolor", @@ -91,6 +95,7 @@ "FileMasks": [ "_diff", "_color", + "_col", "_albedo", "_alb", "_basecolor", @@ -106,4 +111,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithCoverage.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithCoverage.preset index 4ed7591f18..3773857e0a 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithCoverage.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithCoverage.preset @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithGenericAlpha.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithGenericAlpha.preset index 4de1f1cca0..530e36038d 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithGenericAlpha.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithGenericAlpha.preset @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithOpacity.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithOpacity.preset index 03208ad7ba..6d6c156683 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithOpacity.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/AlbedoWithOpacity.preset @@ -101,4 +101,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/AmbientOcclusion.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/AmbientOcclusion.preset index 222a1d4c7b..4e69ae67f2 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/AmbientOcclusion.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/AmbientOcclusion.preset @@ -9,7 +9,10 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ao" + "_ao", + "_ambocc", + "_amb", + "_ambientocclusion" ], "PixelFormat": "BC4" }, @@ -33,7 +36,10 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ao" + "_ao", + "_ambocc", + "_amb", + "_ambientocclusion" ], "PixelFormat": "EAC_R11" }, @@ -43,7 +49,10 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ao" + "_ao", + "_ambocc", + "_amb", + "_ambientocclusion" ], "PixelFormat": "BC4" }, @@ -53,10 +62,13 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ao" + "_ao", + "_ambocc", + "_amb", + "_ambientocclusion" ], "PixelFormat": "BC4" } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/CloudShadows.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/CloudShadows.preset index f7ebb1bc2d..f37acd2f9d 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/CloudShadows.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/CloudShadows.preset @@ -41,4 +41,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ColorChart.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ColorChart.preset index 3af388906c..46327e87ed 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ColorChart.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ColorChart.preset @@ -61,4 +61,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ConvolvedCubemap.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ConvolvedCubemap.preset index 9ec54069bb..fe87f49426 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ConvolvedCubemap.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ConvolvedCubemap.preset @@ -136,4 +136,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Decal_AlbedoWithOpacity.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Decal_AlbedoWithOpacity.preset index 8022420cf5..2c47f9eaed 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Decal_AlbedoWithOpacity.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Decal_AlbedoWithOpacity.preset @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness.preset index 76ef1966bf..23ec2347cd 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness.preset @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness_Lossless.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness_Lossless.preset index e4c31f1fee..3145c5cf8a 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness_Lossless.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Detail_MergedAlbedoNormalsSmoothness_Lossless.preset @@ -71,4 +71,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Displacement.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Displacement.preset index 1cac9c1d3a..86ba9d74c0 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Displacement.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Displacement.preset @@ -9,12 +9,20 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_displ" + "_displ", + "_disp", + "_dsp", + "_d", + "_dm", + "_displacement", + "_height", + "_hm", + "_ht", + "_h" ], "PixelFormat": "BC4", "DiscardAlpha": true, "IsPowerOf2": true, - "Swizzle": "aaa1", "MipMapSetting": { "MipGenType": "Box" } @@ -26,13 +34,21 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_displ" + "_displ", + "_disp", + "_dsp", + "_d", + "_dm", + "_displacement", + "_height", + "_hm", + "_ht", + "_h" ], "PixelFormat": "EAC_R11", "DiscardAlpha": true, "IsPowerOf2": true, "SizeReduceLevel": 3, - "Swizzle": "aaa1", "MipMapSetting": { "MipGenType": "Box" } @@ -57,7 +73,6 @@ "PixelFormat": "EAC_R11", "DiscardAlpha": true, "IsPowerOf2": true, - "Swizzle": "aaa1", "MipMapSetting": { "MipGenType": "Box" } @@ -68,12 +83,20 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_displ" + "_displ", + "_disp", + "_dsp", + "_d", + "_dm", + "_displacement", + "_height", + "_hm", + "_ht", + "_h" ], "PixelFormat": "BC4", "DiscardAlpha": true, "IsPowerOf2": true, - "Swizzle": "aaa1", "MipMapSetting": { "MipGenType": "Box" } @@ -84,16 +107,24 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_displ" + "_displ", + "_disp", + "_dsp", + "_d", + "_dm", + "_displacement", + "_height", + "_hm", + "_ht", + "_h" ], "PixelFormat": "BC4", "DiscardAlpha": true, "IsPowerOf2": true, - "Swizzle": "aaa1", "MipMapSetting": { "MipGenType": "Box" } } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Emissive.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Emissive.preset index d3290eb469..5a98d2cd30 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Emissive.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Emissive.preset @@ -8,7 +8,11 @@ "Name": "Emissive", "RGB_Weight": "CIEXYZ", "FileMasks": [ - "_emissive" + "_emissive", + "_e", + "_glow", + "_em", + "_emit" ], "PixelFormat": "BC7", "DiscardAlpha": true @@ -33,7 +37,11 @@ "Name": "Emissive", "RGB_Weight": "CIEXYZ", "FileMasks": [ - "_emissive" + "_emissive", + "_e", + "_glow", + "_em", + "_emit" ], "PixelFormat": "ASTC_6x6", "DiscardAlpha": true @@ -43,7 +51,11 @@ "Name": "Emissive", "RGB_Weight": "CIEXYZ", "FileMasks": [ - "_emissive" + "_emissive", + "_e", + "_glow", + "_em", + "_emit" ], "PixelFormat": "BC7", "DiscardAlpha": true @@ -53,11 +65,15 @@ "Name": "Emissive", "RGB_Weight": "CIEXYZ", "FileMasks": [ - "_emissive" + "_emissive", + "_e", + "_glow", + "_em", + "_emit" ], "PixelFormat": "BC7", "DiscardAlpha": true } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Gradient.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Gradient.preset index 790b3c8013..9cf32093d1 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Gradient.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Gradient.preset @@ -41,4 +41,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Greyscale.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Greyscale.preset index 5156908ff3..c77c77b988 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Greyscale.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Greyscale.preset @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLDiffuse.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLDiffuse.preset index 1945a121ed..fb4155a974 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLDiffuse.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLDiffuse.preset @@ -122,4 +122,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLGlobal.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLGlobal.preset index 05b4045bb1..eb829c3120 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLGlobal.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLGlobal.preset @@ -21,4 +21,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSkybox.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSkybox.preset index 867fc73959..530eb3d048 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSkybox.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSkybox.preset @@ -27,7 +27,7 @@ }, "PlatformsPresets": { "es3": { - "UUID": "{E6441EAC-9843-484B-8EFC-C03B2935B48D}", + "UUID": "{E6441EAC-9843-484B-8EFC-C03B2935B48D}", "Name": "IBLSkybox", "FileMasks": [ "_iblskyboxcm" @@ -61,7 +61,7 @@ "MinTextureSize": 256, "IsPowerOf2": true, "CubemapSettings": { - "RequiresConvolve": false, + "RequiresConvolve": false, "GenerateIBLSpecular": true, "IBLSpecularPreset": "{908DA68C-97FB-4C4A-97BC-5A55F30F14FA}", "GenerateIBLDiffuse": true, @@ -69,7 +69,7 @@ } }, "osx_gl": { - "UUID": "{E6441EAC-9843-484B-8EFC-C03B2935B48D}", + "UUID": "{E6441EAC-9843-484B-8EFC-C03B2935B48D}", "Name": "IBLSkybox", "FileMasks": [ "_iblskyboxcm" @@ -112,4 +112,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSpecular.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSpecular.preset index e900662d5d..db5a9276bd 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSpecular.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/IBLSpecular.preset @@ -132,4 +132,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ImageBuilder.settings b/Gems/Atom/Asset/ImageProcessingAtom/Config/ImageBuilder.settings index 8674d1282f..c8d921a8ff 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ImageBuilder.settings +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ImageBuilder.settings @@ -62,4 +62,4 @@ "DefaultPresetAlpha": "{5D9ECB52-4CD9-4CB8-80E3-10CAE5EFB8A2}", "DefaultPresetNonePOT": "{C659D222-F56B-4B61-A2F8-C1FA547F3C39}" } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG16.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG16.preset index ae12aa470a..6bfb697a5e 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG16.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG16.preset @@ -41,4 +41,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG32F.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG32F.preset index 95fb99a1c0..a010d26a9c 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG32F.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG32F.preset @@ -42,4 +42,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG8.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG8.preset index 316fca5069..ca636f486a 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG8.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RG8.preset @@ -56,4 +56,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA32F.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA32F.preset index fa07bf6dd8..717ece058d 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA32F.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA32F.preset @@ -42,4 +42,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA8.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA8.preset index 02f7fef961..6dbb29f830 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA8.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LUT_RGBA8.preset @@ -36,4 +36,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LayerMask.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LayerMask.preset index 363a6f9f9d..9c57f80709 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LayerMask.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LayerMask.preset @@ -9,7 +9,8 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_layers" + "_layers", + "_rgbmask" ], "PixelFormat": "R8G8B8X8" }, @@ -20,7 +21,8 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_layers" + "_layers", + "_rgbmask" ], "PixelFormat": "R8G8B8X8" }, @@ -30,7 +32,8 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_layers" + "_layers", + "_rgbmask" ], "PixelFormat": "R8G8B8X8" }, @@ -40,7 +43,8 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_layers" + "_layers", + "_rgbmask" ], "PixelFormat": "R8G8B8X8" }, @@ -50,10 +54,11 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_layers" + "_layers", + "_rgbmask" ], "PixelFormat": "R8G8B8X8" } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LensOptics.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LensOptics.preset index 2ae24f9ebc..84294dfbcc 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LensOptics.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LensOptics.preset @@ -31,4 +31,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LightProjector.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LightProjector.preset index c3c7be162e..8c98394d36 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LightProjector.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LightProjector.preset @@ -56,4 +56,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/LoadingScreen.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/LoadingScreen.preset index a13e99e87b..f64c48eb95 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/LoadingScreen.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/LoadingScreen.preset @@ -31,4 +31,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Minimap.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Minimap.preset index ca70e47035..a402a2636c 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Minimap.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Minimap.preset @@ -61,4 +61,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/MuzzleFlash.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/MuzzleFlash.preset index 7e11754e26..f5ecc58d1a 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/MuzzleFlash.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/MuzzleFlash.preset @@ -56,4 +56,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Normals.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Normals.preset index fad1610f01..104f3b4a39 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Normals.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Normals.preset @@ -123,4 +123,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsFromDisplacement.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsFromDisplacement.preset index 0d79770437..c513720b68 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsFromDisplacement.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsFromDisplacement.preset @@ -81,4 +81,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness.preset index fb8b1da6a4..e773f7d910 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness.preset @@ -9,7 +9,11 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ddna" + "_ddna", + "_normala", + "_nrma", + "_nma", + "_na" ], "PixelFormat": "BC5s", "PixelFormatAlpha": "BC4", @@ -48,7 +52,11 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ddna" + "_ddna", + "_normala", + "_nrma", + "_nma", + "_na" ], "PixelFormat": "ASTC_4x4", "PixelFormatAlpha": "ASTC_4x4", @@ -65,7 +73,11 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ddna" + "_ddna", + "_normala", + "_nrma", + "_nma", + "_na" ], "PixelFormat": "BC5s", "PixelFormatAlpha": "BC4", @@ -82,7 +94,11 @@ "SourceColor": "Linear", "DestColor": "Linear", "FileMasks": [ - "_ddna" + "_ddna", + "_normala", + "_nrma", + "_nma", + "_na" ], "PixelFormat": "BC5s", "PixelFormatAlpha": "BC4", @@ -95,4 +111,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness_Legacy.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness_Legacy.preset index f40a8bf479..4cf7af6f29 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness_Legacy.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/NormalsWithSmoothness_Legacy.preset @@ -96,4 +96,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Opacity.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Opacity.preset index bd9299d71d..265379d053 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Opacity.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Opacity.preset @@ -11,7 +11,14 @@ "FileMasks": [ "_sss", "_trans", - "_opac" + "_opac", + "_opacity", + "_o", + "_opac", + "_op", + "_mask", + "_msk", + "_blend" ], "PixelFormat": "BC4", "IsPowerOf2": true, @@ -28,7 +35,14 @@ "FileMasks": [ "_sss", "_trans", - "_opac" + "_opac", + "_opacity", + "_o", + "_opac", + "_op", + "_mask", + "_msk", + "_blend" ], "PixelFormat": "EAC_R11", "IsPowerOf2": true, @@ -67,7 +81,14 @@ "FileMasks": [ "_sss", "_trans", - "_opac" + "_opac", + "_opacity", + "_o", + "_opac", + "_op", + "_mask", + "_msk", + "_blend" ], "PixelFormat": "BC4", "IsPowerOf2": true, @@ -83,7 +104,14 @@ "FileMasks": [ "_sss", "_trans", - "_opac" + "_opac", + "_opacity", + "_o", + "_opac", + "_op", + "_mask", + "_msk", + "_blend" ], "PixelFormat": "BC4", "IsPowerOf2": true, @@ -93,4 +121,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage.preset index 181f7b9047..03744dee9e 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage.preset @@ -26,4 +26,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinear.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinear.preset index 66575ceca0..4d75e7ae1d 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinear.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinear.preset @@ -51,4 +51,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinearUncompressed.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinearUncompressed.preset index 9269434a77..8344102425 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinearUncompressed.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_HDRLinearUncompressed.preset @@ -51,4 +51,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_Linear.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_Linear.preset index 37ff1b981d..515e9b0512 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_Linear.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReferenceImage_Linear.preset @@ -41,4 +41,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance.preset index ca773debbb..58e283add7 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance.preset @@ -24,7 +24,8 @@ "_mt", "_metalness", "_metallic", - "_roughness" + "_roughness", + "_rough" ], "PixelFormat": "BC1", "IsPowerOf2": true, @@ -53,7 +54,8 @@ "_mt", "_metalness", "_metallic", - "_roughness" + "_roughness", + "_rough" ], "PixelFormat": "ETC2", "IsPowerOf2": true, @@ -81,7 +83,8 @@ "_mt", "_metalness", "_metallic", - "_roughness" + "_roughness", + "_rough" ], "PixelFormat": "ASTC_6x6", "IsPowerOf2": true, @@ -109,7 +112,8 @@ "_mt", "_metalness", "_metallic", - "_roughness" + "_roughness", + "_rough" ], "PixelFormat": "BC1", "IsPowerOf2": true, @@ -137,7 +141,8 @@ "_mt", "_metalness", "_metallic", - "_roughness" + "_roughness", + "_rough" ], "PixelFormat": "BC1", "IsPowerOf2": true, @@ -147,4 +152,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReflectanceWithSmoothness_Legacy.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReflectanceWithSmoothness_Legacy.preset index ff529c5107..e386d08a35 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/ReflectanceWithSmoothness_Legacy.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/ReflectanceWithSmoothness_Legacy.preset @@ -66,4 +66,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance_Linear.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance_Linear.preset index 84f5dae36f..767b0b67eb 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance_Linear.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Reflectance_Linear.preset @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Font.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Font.preset index cc1065bbb4..b2bbf905db 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Font.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Font.preset @@ -46,4 +46,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Gradient.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Gradient.preset index 4818781caf..41ba10f55c 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Gradient.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Gradient.preset @@ -46,4 +46,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image.preset index ac6b7be162..e36e42860d 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image.preset @@ -51,4 +51,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image_nonpower2.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image_nonpower2.preset index c67f801061..fa2fe2ae72 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image_nonpower2.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/SF_Image_nonpower2.preset @@ -46,4 +46,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Skybox.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Skybox.preset index 880dd71e79..9102bd53bb 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Skybox.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Skybox.preset @@ -91,4 +91,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo.preset index d283cbb895..19881f93d7 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo.preset @@ -66,4 +66,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo_HighPassed.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo_HighPassed.preset index 2f126b63c8..2fcbb012d4 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo_HighPassed.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Terrain_Albedo_HighPassed.preset @@ -61,4 +61,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/Uncompressed.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/Uncompressed.preset index fd918a6686..d0dbbcba6f 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/Uncompressed.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/Uncompressed.preset @@ -51,4 +51,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Compressed.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Compressed.preset index 6cbf3293fd..dcbaea96aa 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Compressed.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Compressed.preset @@ -36,4 +36,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Lossless.preset b/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Lossless.preset index bfa18bf514..5ccaa3ac16 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Lossless.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Config/UserInterface_Lossless.preset @@ -36,4 +36,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp index d50e5ff719..a0f9f7db22 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp @@ -102,7 +102,7 @@ namespace AZ // Register Shader Resource Group Layout Builder AssetBuilderSDK::AssetBuilderDesc srgLayoutBuilderDescriptor; srgLayoutBuilderDescriptor.m_name = "Shader Resource Group Layout Builder"; - srgLayoutBuilderDescriptor.m_version = 53; // ATOM-15196 + srgLayoutBuilderDescriptor.m_version = 54; // Enable Null Rhi for AutomatedTesting srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsl", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsli", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); @@ -118,7 +118,7 @@ namespace AZ // Register Shader Asset Builder AssetBuilderSDK::AssetBuilderDesc shaderAssetBuilderDescriptor; shaderAssetBuilderDescriptor.m_name = "Shader Asset Builder"; - shaderAssetBuilderDescriptor.m_version = 97; // ATOM-15196 + shaderAssetBuilderDescriptor.m_version = 98; // Enable Null Rhi for AutomatedTesting // .shader file changes trigger rebuilds shaderAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern( AZStd::string::format("*.%s", RPI::ShaderSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); shaderAssetBuilderDescriptor.m_busId = azrtti_typeid<ShaderAssetBuilder>(); @@ -133,7 +133,7 @@ namespace AZ shaderVariantAssetBuilderDescriptor.m_name = "Shader Variant Asset Builder"; // Both "Shader Variant Asset Builder" and "Shader Asset Builder" produce ShaderVariantAsset products. If you update // ShaderVariantAsset you will need to update BOTH version numbers, not just "Shader Variant Asset Builder". - shaderVariantAssetBuilderDescriptor.m_version = 18; // ATOM-15196 + shaderVariantAssetBuilderDescriptor.m_version = 19; // Enable Null Rhi for AutomatedTesting shaderVariantAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", RPI::ShaderVariantListSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard)); shaderVariantAssetBuilderDescriptor.m_busId = azrtti_typeid<ShaderVariantAssetBuilder>(); shaderVariantAssetBuilderDescriptor.m_createJobFunction = AZStd::bind(&ShaderVariantAssetBuilder::CreateJobs, &m_shaderVariantAssetBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 1e3c7b6759..02cb8bd242 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -405,18 +405,29 @@ namespace AZ void ShaderVariantAssetBuilder::ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const { const auto& jobParameters = request.m_jobDescription.m_jobParameters; + if (jobParameters.find(ShaderVariantLoadErrorParam) != jobParameters.end()) { - if (jobParameters.find(ShouldExitEarlyFromProcessJobParam) != jobParameters.end()) - { - AZ_TracePrintf(ShaderVariantAssetBuilderName, "Doing nothing on behalf of [%s] because it's been overriden by game project.", jobParameters.at(ShaderVariantLoadErrorParam).c_str()); - response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; - return; - } AZ_Error(ShaderVariantAssetBuilderName, false, "Error during CreateJobs: %s", jobParameters.at(ShaderVariantLoadErrorParam).c_str()); response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed; return; } + + if (jobParameters.find(ShouldExitEarlyFromProcessJobParam) != jobParameters.end()) + { + AZ_TracePrintf(ShaderVariantAssetBuilderName, "Doing nothing on behalf of [%s] because it's been overridden by game project.", jobParameters.at(ShaderVariantLoadErrorParam).c_str()); + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; + return; + } + + if (jobParameters.find(ShouldExitEarlyFromProcessJobParam) != jobParameters.end()) + { + AZ_TracePrintf( + ShaderVariantAssetBuilderName, "Doing nothing on behalf of [%s] because it's been overriden by game project.", + jobParameters.at(ShaderVariantLoadErrorParam).c_str()); + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success; + return; + } AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId); if (jobCancelListener.IsCancelled()) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Android/PAL_android.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Android/PAL_android.cmake index 6d87792958..57e21d7c35 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Android/PAL_android.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Android/PAL_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Linux/PAL_linux.cmake index 6d87792958..57e21d7c35 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/PAL_mac.cmake index 7f0171d053..c508dcb516 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED TRUE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED TRUE) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/PAL_windows.cmake index 7f0171d053..c508dcb516 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED TRUE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED TRUE) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Platform/iOS/PAL_ios.cmake b/Gems/Atom/Asset/Shader/Code/Source/Platform/iOS/PAL_ios.cmake index 6d87792958..57e21d7c35 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Platform/iOS/PAL_ios.cmake +++ b/Gems/Atom/Asset/Shader/Code/Source/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_ASSET_SHADER_SUPPORTED FALSE) diff --git a/Gems/Atom/Component/DebugCamera/Code/Include/Atom/Component/DebugCamera/CameraControllerComponent.h b/Gems/Atom/Component/DebugCamera/Code/Include/Atom/Component/DebugCamera/CameraControllerComponent.h index 05b66ad338..4b2b19cff0 100644 --- a/Gems/Atom/Component/DebugCamera/Code/Include/Atom/Component/DebugCamera/CameraControllerComponent.h +++ b/Gems/Atom/Component/DebugCamera/Code/Include/Atom/Component/DebugCamera/CameraControllerComponent.h @@ -60,4 +60,4 @@ namespace AZ }; } // namespace Debug -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.cpp b/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.cpp index 2ff84a0bef..0f619d19c5 100644 --- a/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.cpp +++ b/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.cpp @@ -40,4 +40,4 @@ namespace AZ return angle; } } // namespace Debug -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.h b/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.h index f759d68d58..f467ffc5cc 100644 --- a/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.h +++ b/Gems/Atom/Component/DebugCamera/Code/Source/DebugCameraUtils.h @@ -19,4 +19,4 @@ namespace AZ float NormalizeAngle(float angle); } // namespace Debug -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Assets/Config/Platform/Mac/Metal/PlatformLimits.azasset b/Gems/Atom/Feature/Common/Assets/Config/Platform/Mac/Metal/PlatformLimits.azasset index c3146f0015..573862cc40 100644 --- a/Gems/Atom/Feature/Common/Assets/Config/Platform/Mac/Metal/PlatformLimits.azasset +++ b/Gems/Atom/Feature/Common/Assets/Config/Platform/Mac/Metal/PlatformLimits.azasset @@ -9,4 +9,4 @@ } } } - \ No newline at end of file + diff --git a/Gems/Atom/Feature/Common/Assets/Config/Platform/iOS/Metal/PlatformLimits.azasset b/Gems/Atom/Feature/Common/Assets/Config/Platform/iOS/Metal/PlatformLimits.azasset index c3146f0015..4556073118 100644 --- a/Gems/Atom/Feature/Common/Assets/Config/Platform/iOS/Metal/PlatformLimits.azasset +++ b/Gems/Atom/Feature/Common/Assets/Config/Platform/iOS/Metal/PlatformLimits.azasset @@ -9,4 +9,4 @@ } } } - \ No newline at end of file + diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset index 0a470c74dc..ee14d95572 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/HighContrast/goegap.lightingpreset.azasset @@ -47,4 +47,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset index d5e5cc8ea1..608702022f 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/artist_workshop.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset index cdeaface6e..05eebf5341 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blau_river.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset index fb93d91a2f..a9de4fa15f 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/blouberg_sunrise_1.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset index b659b89e66..bca1626cae 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/champagne_castle_1.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset index e7e694cef1..8b3da55cec 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/kloetzle_blei.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset index 68fa1ea655..f49a67fd69 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/palermo_sidewalk.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/readme.txt b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/readme.txt index ca10d2b319..9c8d61ecb0 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/readme.txt +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/LowContrast/readme.txt @@ -72,4 +72,4 @@ The input cubemap is pre-convolved and passed through untouched, including all m _cm -Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. \ No newline at end of file +Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/default.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/default.lightingpreset.azasset index adca37cd81..5e79234750 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/default.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/default.lightingpreset.azasset @@ -39,4 +39,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/readme.txt b/Gems/Atom/Feature/Common/Assets/LightingPresets/readme.txt index ca10d2b319..9c8d61ecb0 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/readme.txt +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/readme.txt @@ -72,4 +72,4 @@ The input cubemap is pre-convolved and passed through untouched, including all m _cm -Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. \ No newline at end of file +Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. diff --git a/Gems/Atom/Feature/Common/Assets/LightingPresets/thumbnail.lightingpreset.azasset b/Gems/Atom/Feature/Common/Assets/LightingPresets/thumbnail.lightingpreset.azasset index d5dfa5b35c..fac04458a5 100644 --- a/Gems/Atom/Feature/Common/Assets/LightingPresets/thumbnail.lightingpreset.azasset +++ b/Gems/Atom/Feature/Common/Assets/LightingPresets/thumbnail.lightingpreset.azasset @@ -32,4 +32,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant.material index d7060073a2..d49ca5dfe8 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant.material @@ -18,4 +18,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant_tex.material index ef19e60639..49014ae2b1 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/00_illuminant_tex.material @@ -8,4 +8,4 @@ "textureMap": "Materials/Presets/MacBeth/00_illuminant_sRGB.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin.material index 9133e35566..0fcedddf9d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin_tex.material index e5beea0e80..7b10a3b5f5 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/01_dark_skin_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin.material index b9a6d518cd..2ca339cadc 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin_tex.material index 6d5f2b368c..b2f9c271b9 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/02_light_skin_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky.material index 9498d2797a..6432314ff2 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky_tex.material index 3cedbf16a3..606d958818 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/03_blue_sky_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage.material index cf246876c3..6b43cabedb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage_tex.material index ee47efb489..5ea1a31afc 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/04_foliage_tex.material @@ -14,4 +14,4 @@ "textureMap": "Materials/Presets/MacBeth/04_foliage_sRGB.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower.material index de2577cd96..fa8302b859 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower_tex.material index 369f4607bb..2d3ecdea6f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/05_blue_flower_tex.material @@ -14,4 +14,4 @@ "textureMap": "Materials/Presets/MacBeth/05_blue_flower_sRGB.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green.material index bf60fa2ff5..86e4fcb19d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green_tex.material index b31760f75b..13b3cf293d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/06_bluish_green_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange.material index ad050b72ea..f60f82f16c 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange_tex.material index 6b80af34bf..8db258d41f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/07_orange_tex.material @@ -14,4 +14,4 @@ "textureMap": "Materials/Presets/MacBeth/07_orange_sRGB.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue.material index 92319c0392..5e978ea495 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue_tex.material index 420a1a3f2c..0ae7ea5e92 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/08_purplish_blue_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red.material index 312e13f14b..86d9714b41 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red_tex.material index c99319f973..a738a10dfd 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/09_moderate_red_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple.material index b636acab9b..cf9d9c2f03 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple_tex.material index df2d14a7b0..f0deb97c0c 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/10_purple_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green.material index af9256788d..11b67ee518 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green_tex.material index f285d2c859..e7c081c496 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/11_yellow_green_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow.material index bf42808485..eb194f7990 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow_tex.material index 3ccaf1661d..392c99b0ba 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/12_orange_yellow_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue.material index 57fab09b48..0403aff6fe 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue_tex.material index e521f4be8c..fe9929f7d4 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/13_blue_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green.material index f1926eda53..f199575b58 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green_tex.material index 26066b905e..15adcf4788 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/14_green_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red.material index ac5c9772cb..6489638ba6 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red_tex.material index 2229bf6c2c..79ce245674 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow.material index bae6abeced..f5d302126f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow_tex.material index f2993c76f1..6daa82a310 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/16_yellow_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta.material index 588d266398..7d3019913d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta_tex.material index b223b8f998..c346a3e29d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/17_magenta_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan.material index ba4a8e3993..6b2ab75dbd 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan_tex.material index a5eb8b8add..d0d5234498 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/18_cyan_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D.material index d204ca0e25..de5c5f6281 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D_tex.material index 5760a11347..9fd79a1633 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/19_white_9-5_0-05D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D.material index 8607407ca9..748471138d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D_tex.material index 87a41c9ff4..3a23f07bfa 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/20_neutral_8-0_0-23D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D.material index 065be45086..edfae0689f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D_tex.material index 437d8ccc0c..bf4fe1218a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/21_neutral_6-5_0-44D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D.material index 488f64127f..a758b474f7 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D_tex.material index 81c42cad91..69b18cb115 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/22_neutral_5-0_0-70D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D.material index b3d6b1fa5a..7ce60b545b 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D_tex.material index d14da4eeda..1b77a786c9 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/23_neutral_3-5_1-05D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D.material index fa2a26365e..f448eea265 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D.material @@ -15,4 +15,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D_tex.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D_tex.material index d056832772..8530dc7ffc 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D_tex.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/24_black_2-0_1-50D_tex.material @@ -14,4 +14,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/macbeth_lab_16bit_2014_sRGB.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/macbeth_lab_16bit_2014_sRGB.material index 6ea5356798..a67b484c31 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/macbeth_lab_16bit_2014_sRGB.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/macbeth_lab_16bit_2014_sRGB.material @@ -8,4 +8,4 @@ "textureMap": "Materials/Presets/MacBeth/ColorChecker_sRGB_from_Lab_16bit_AfterNov2014.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/readme.txt b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/readme.txt index fba4a8b809..70145b0e8e 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/readme.txt +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/readme.txt @@ -35,4 +35,4 @@ Additional information about colors are here, along with what seems to be a pret http://www.nukepedia.com/gizmos/draw/x-rite-colorchecker-classic-2005-gretagmacbeth -Note: picking against the visual macbeth chart image versus the values in the original pdf there is a slight difference. I have leaned on the side of the spectral average in the original pdf. \ No newline at end of file +Note: picking against the visual macbeth chart image versus the values in the original pdf there is a slight difference. I have leaned on the side of the spectral average in the original pdf. diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/default_grid.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/default_grid.material index ab2f48f987..387d022bd2 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/default_grid.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/default_grid.material @@ -14,4 +14,4 @@ "textureMap": "Textures/Default/default_roughness.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal.txt b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal.txt index 8c37d30285..114efe7f18 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal.txt +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal.txt @@ -39,4 +39,4 @@ Zinc = d5eaed (213, 234, 237) Mercury = e5e4e4 (229, 228, 228) -Palladium = ded9d3 (222, 217, 211) \ No newline at end of file +Palladium = ded9d3 (222, 217, 211) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum.material index 250b09cbf3..ece08a3492 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_matte.material index 5bfabf412d..afc2bb56f3 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_polished.material index 1084a32a34..27fa2bb11e 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_aluminum_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass.material index 783f4c57fe..77f658aafa 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_matte.material index a1d781dc0d..d9c72471c8 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_polished.material index a6b32128b5..57b5a15e54 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_brass_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome.material index 2195d638be..50e21d481c 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_matte.material index 2f56aa3968..55e1b0c3bc 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_matte.material @@ -23,4 +23,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_polished.material index 8c29913fc1..ce6599837c 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_chrome_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt.material index 0293a17aca..be4067570d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_matte.material index c8cad183b1..09aed7ba63 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_polished.material index d0f9fc4921..c1e6ca7798 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_cobalt_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper.material index 2cdcb90c46..3970606e7d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_matte.material index 8fcb8ae0d4..d0385eebde 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_polished.material index f46f761f17..5e52702d21 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_copper_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold.material index 2d5fa3a49a..2638e76a74 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_matte.material index 21d357a2ac..fd21141048 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_polished.material index 155aa0c191..5861c7b533 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_gold_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron.material index 96a5f03250..c35f8ca755 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_matte.material index c6d7229b44..1ed1dd4dad 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_polished.material index 56757390d0..e60d31bd6d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_iron_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_mercury.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_mercury.material index 60114a2559..e2d304ab32 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_mercury.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_mercury.material @@ -23,4 +23,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel.material index 2c45aad36e..a158fa2777 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_matte.material index 9b8a4cb9c8..4ae75d3a42 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_polished.material index 6de77748a2..48effb1c94 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_nickel_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium.material index a5b3bcd912..2b2a6f148a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_matte.material index 549648171e..1ab89f90ad 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_polished.material index 2c2775ba8d..5b7879c3fa 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_palladium_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum.material index ab5be51c88..678c3321ce 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_matte.material index 204103a3f8..7afa0809bb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_polished.material index 2cd7301670..df6a8fb595 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_platinum_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver.material index 0eb396defc..a53c252144 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver.material @@ -23,4 +23,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_matte.material index 1ed7ed2d1c..588f90c3d1 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_matte.material @@ -23,4 +23,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_polished.material index 39539bce57..96fbdee686 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_silver_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium.material index 4ac56687d4..a34430bd7d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium.material @@ -24,4 +24,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_matte.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_matte.material index e50d755060..52ebc71d9c 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_matte.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_matte.material @@ -24,4 +24,4 @@ "factor": 0.8799999952316284 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_polished.material b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_polished.material index 054bb8956c..b9dd832849 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_polished.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Presets/PBR/metal_titanium_polished.material @@ -26,4 +26,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.material b/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.material index 74bd19dad6..e9bb191532 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.material @@ -32,4 +32,4 @@ "factor": 0.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.materialtype index e401b42644..214fc02660 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/ReflectionProbe/ReflectionProbeVisualization.materialtype @@ -401,38 +401,6 @@ "step": 0.1 } ], - "ambientOcclusion": [ - { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", - "type": "Float", - "defaultValue": 1.0, - "min": 0.0, - "max": 2.0, - "connection": { - "type": "ShaderInput", - "id": "m_ambientOcclusionFactor" - } - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", - "type": "Image", - "connection": { - "type": "ShaderInput", - "id": "m_ambientOcclusionMap" - } - } - ], "emissive": [ { "id": "enable", diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.azsl index 60cfc11d40..942db3ed5f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.azsl @@ -99,4 +99,4 @@ PSOutput ShadowCatcherPS(VSOutput IN) return OUT; } - \ No newline at end of file + diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.material b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.material index 6334deddcd..f92871980f 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.material +++ b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.material @@ -1,3 +1,3 @@ { "materialType": "ShadowCatcher.materialtype" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.shader b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.shader index f98ce5f3e3..f4784440b1 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Special/ShadowCatcher.shader @@ -19,4 +19,4 @@ }, "DrawList": "transparent" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype index e95c82e435..cb66a987ae 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype @@ -49,9 +49,9 @@ "description": "Properties for configuring UV transforms." }, { - "id": "ambientOcclusion", - "displayName": "Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "occlusion", + "displayName": "Occlusion", + "description": "Properties for baked textures that represent geometric occlusion of light." }, { "id": "emissive", @@ -780,47 +780,89 @@ "step": 0.1 } ], - "ambientOcclusion": [ + "occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", - "type": "Float", - "defaultValue": 1.0, - "min": 0.0, - "max": 2.0, - "connection": { - "type": "ShaderInput", - "id": "m_ambientOcclusionFactor" - } - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMap" + "id": "m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", - "enumValues": [ "UV0", "UV1" ], - "defaultValue": "UV0", + "enumIsUv": true, + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMapUvIndex" + "id": "m_diffuseOcclusionMapUvIndex" + } + }, + { + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionFactor" } } ], @@ -1641,17 +1683,21 @@ } }, { - // See the comment above for details. "type": "UseTexture", "args": { - "textureProperty": "ambientOcclusion.textureMap", - "dependentProperties": ["ambientOcclusion.textureMapUv"], - "useTextureProperty": "ambientOcclusion.enable", - "shaderTags": [ - "ForwardPass", - "ForwardPass_EDS" - ], - "shaderOption": "o_ambientOcclusion_useTexture" + "textureProperty": "occlusion.diffuseTextureMap", + "useTextureProperty": "occlusion.diffuseUseTexture", + "dependentProperties": ["occlusion.diffuseTextureMapUv", "occlusion.diffuseFactor"], + "shaderOption": "o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "occlusion.specularTextureMap", + "useTextureProperty": "occlusion.specularUseTexture", + "dependentProperties": ["occlusion.specularTextureMapUv", "occlusion.specularFactor"], + "shaderOption": "o_specularOcclusion_useTexture" } }, { @@ -1712,31 +1758,6 @@ "shaderOption": "o_transmission_useTexture" } }, - { - // Controls visibility for properties in the editor. - // @param actions - a list of actions that are executed in order. visibility will be set when triggerProperty hits the triggerValue. - // @param affectedProperties - the properties that are affected by actions. - "type": "UpdatePropertyVisibility", - "args": { - "actions": [ - { - "triggerProperty": "ambientOcclusion.enable", - "triggerValue": true, - "visibility": "Enabled" - }, - { - "triggerProperty": "ambientOcclusion.enable", - "triggerValue": false, - "visibility": "Disabled" - } - ], - "affectedProperties": [ - "ambientOcclusion.factor", - "ambientOcclusion.textureMap", - "ambientOcclusion.textureMapUv" - ] - } - }, { // Controls visibility for properties in the editor. // @param actions - a list of actions that are executed in order. visibility will be set when triggerProperty hits the triggerValue. 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 fd6961c50d..f9bfb75fea 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli @@ -13,6 +13,7 @@ #pragma once #include <Atom/Features/SrgSemantics.azsli> +#include <viewsrg.srgi> #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli> #include "MaterialInputs/BaseColorInput.azsli" diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl index 81601860ed..28968b5941 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.azsl @@ -10,7 +10,6 @@ * */ -#include <viewsrg.srgi> #include <Atom/Features/PBR/AlphaUtils.azsli> #include "./EnhancedPBR_Common.azsli" #include <Atom/Features/PBR/DefaultObjectSrg.azsli> diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.shader index d1311c9769..567ecd45ca 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_DepthPass_WithPS.shader @@ -25,4 +25,4 @@ }, "DrawList" : "depth" -} \ No newline at end of file +} 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 a9d6f243c1..36c8e81a94 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl @@ -10,11 +10,25 @@ * */ -#include <viewsrg.srgi> #include "EnhancedPBR_Common.azsli" + +// SRGs #include <Atom/Features/PBR/DefaultObjectSrg.azsli> -#include <Atom/Features/PBR/ForwardPassOutput.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> + +// Pass Output +#include <Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli> + +// Utility #include <Atom/Features/ColorManagement/TransformColor.azsli> +#include <Atom/Features/PBR/AlphaUtils.azsli> + +// Custom Surface & Lighting +#include <Atom/Features/PBR/Lighting/EnhancedLighting.azsli> + +// Decals +#include <Atom/Features/PBR/Decals.azsli> + // ---------- Material Parameters ---------- @@ -39,6 +53,8 @@ COMMON_OPTIONS_DETAIL_MAPS() #include "MaterialInputs/TransmissionInput.azsli" +// ---------- Vertex Shader ---------- + struct VSInput { // Base fields (required by the template azsli file)... @@ -67,8 +83,6 @@ struct VSOutput float2 m_detailUv[UvSetCount] : UV3; }; -#include <Atom/Features/PBR/AlphaUtils.azsli> -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput EnhancedPbr_ForwardPassVS(VSInput IN) @@ -94,6 +108,9 @@ VSOutput EnhancedPbr_ForwardPassVS(VSInput IN) return OUT; } + +// ---------- Pixel Shader ---------- + PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float depth) { // ------- Tangents & Bitangets ------- @@ -144,6 +161,9 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float } } + Surface surface; + surface.position = IN.m_worldPosition; + // ------- Alpha & Clip ------- float2 baseColorUv = IN.m_uv[MaterialSrg::m_baseColorMapUvIndex]; @@ -172,7 +192,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float3x3 uvMatrix = MaterialSrg::m_normalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); // By design, only UV0 is allowed to apply transforms. float detailLayerNormalFactor = MaterialSrg::m_detail_normal_factor * detailLayerBlendFactor; - float3 normal = GetDetailedNormalInputWS( + surface.normal = GetDetailedNormalInputWS( isFrontFace, IN.m_normal, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], MaterialSrg::m_normalMap, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_normalFactor, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY, uvMatrix, o_normal_useTexture, tangents[MaterialSrg::m_detail_allMapsUvIndex], bitangents[MaterialSrg::m_detail_allMapsUvIndex], MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, detailUv, detailLayerNormalFactor, MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, MaterialSrg::m_detailUvMatrix, o_detail_normal_useTexture); @@ -196,26 +216,19 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float metallic = GetMetallicInput(MaterialSrg::m_metallicMap, MaterialSrg::m_sampler, metallicUv, MaterialSrg::m_metallicFactor, o_metallic_useTexture); } - // ------- Roughness ------- - - float2 roughnessUv = IN.m_uv[MaterialSrg::m_roughnessMapUvIndex]; - float roughness = GetRoughnessInput(MaterialSrg::m_roughnessMap, MaterialSrg::m_sampler, roughnessUv, MaterialSrg::m_roughnessFactor, - MaterialSrg::m_roughnessLowerBound, MaterialSrg::m_roughnessUpperBound, o_roughness_useTexture); - // ------- Specular ------- float2 specularUv = IN.m_uv[MaterialSrg::m_specularF0MapUvIndex]; float specularF0Factor = GetSpecularInput(MaterialSrg::m_specularF0Map, MaterialSrg::m_sampler, specularUv, MaterialSrg::m_specularF0Factor, o_specularF0_useTexture); - // ------- Emissive ------- + surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); - float2 emissiveUv = IN.m_uv[MaterialSrg::m_emissiveMapUvIndex]; - float3 emissive = GetEmissiveInput(MaterialSrg::m_emissiveMap, MaterialSrg::m_sampler, emissiveUv, MaterialSrg::m_emissiveIntensity, MaterialSrg::m_emissiveColor.rgb, o_emissiveEnabled, o_emissive_useTexture); + // ------- Roughness ------- - // ------- Occlusion ------- - - float2 occlusionUv = IN.m_uv[MaterialSrg::m_ambientOcclusionMapUvIndex]; - float occlusion = GetOcclusionInput(MaterialSrg::m_ambientOcclusionMap, MaterialSrg::m_sampler, occlusionUv, MaterialSrg::m_ambientOcclusionFactor, o_ambientOcclusion_useTexture); + float2 roughnessUv = IN.m_uv[MaterialSrg::m_roughnessMapUvIndex]; + surface.roughnessLinear = GetRoughnessInput(MaterialSrg::m_roughnessMap, MaterialSrg::m_sampler, roughnessUv, MaterialSrg::m_roughnessFactor, + MaterialSrg::m_roughnessLowerBound, MaterialSrg::m_roughnessUpperBound, o_roughness_useTexture); + surface.CalculateRoughnessA(); // ------- Subsurface ------- @@ -226,33 +239,99 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float2 transmissionUv = IN.m_uv[MaterialSrg::m_transmissionThicknessMapUvIndex]; float4 transmissionTintThickness = GeTransmissionInput(MaterialSrg::m_transmissionThicknessMap, MaterialSrg::m_sampler, transmissionUv, MaterialSrg::m_transmissionTintThickness); + surface.transmission.tint = transmissionTintThickness.rgb; + surface.transmission.thickness = transmissionTintThickness.w; + surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; + + // ------- Anisotropy ------- + + if (o_enableAnisotropy) + { + // Convert the angle from [0..1] = [0 .. 180 degrees] to radians [0 .. PI] + const float anisotropyAngle = MaterialSrg::m_anisotropicAngle * PI; + const float anisotropyFactor = MaterialSrg::m_anisotropicFactor; + surface.anisotropy.Init(surface.normal, tangents[0], bitangents[0], anisotropyAngle, anisotropyFactor, surface.roughnessA); + } + + // ------- Lighting Data ------- + + LightingData lightingData; + + // Light iterator + lightingData.tileIterator.Init(IN.m_position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); + lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); + + // Directional light shadow coordinates + lightingData.shadowCoords = IN.m_shadowCoords; + + // ------- Occlusion ------- + + 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); + + // ------- Emissive ------- + + float2 emissiveUv = IN.m_uv[MaterialSrg::m_emissiveMapUvIndex]; + lightingData.emissiveLighting = GetEmissiveInput(MaterialSrg::m_emissiveMap, MaterialSrg::m_sampler, emissiveUv, MaterialSrg::m_emissiveIntensity, MaterialSrg::m_emissiveColor.rgb, o_emissiveEnabled, o_emissive_useTexture); // ------- Clearcoat ------- - float clearCoatFactor = 0.0; - float clearCoatRoughness = 0.0; - float3 clearCoatNormal = float3(0.0, 0.0, 0.0); - // TODO: Clean up the double uses of these clear coat flags - if(o_clearCoat_enabled && o_clearCoat_feature_enabled) + // [GFX TODO][ATOM-14603]: Clean up the double uses of these clear coat flags + if(o_clearCoat_feature_enabled) { - float3x3 uvMatrix = MaterialSrg::m_clearCoatNormalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); - GetClearCoatInputs(MaterialSrg::m_clearCoatInfluenceMap, IN.m_uv[MaterialSrg::m_clearCoatInfluenceMapUvIndex], MaterialSrg::m_clearCoatFactor, o_clearCoat_factor_useTexture, - MaterialSrg::m_clearCoatRoughnessMap, IN.m_uv[MaterialSrg::m_clearCoatRoughnessMapUvIndex], MaterialSrg::m_clearCoatRoughness, o_clearCoat_roughness_useTexture, - MaterialSrg::m_clearCoatNormalMap, IN.m_uv[MaterialSrg::m_clearCoatNormalMapUvIndex], IN.m_normal, o_clearCoat_normal_useTexture, MaterialSrg::m_clearCoatNormalStrength, - uvMatrix, tangents[MaterialSrg::m_clearCoatNormalMapUvIndex], bitangents[MaterialSrg::m_clearCoatNormalMapUvIndex], - MaterialSrg::m_sampler, isFrontFace, - clearCoatFactor, clearCoatRoughness, clearCoatNormal); + if(o_clearCoat_enabled) + { + float3x3 uvMatrix = MaterialSrg::m_clearCoatNormalMapUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); + GetClearCoatInputs(MaterialSrg::m_clearCoatInfluenceMap, IN.m_uv[MaterialSrg::m_clearCoatInfluenceMapUvIndex], MaterialSrg::m_clearCoatFactor, o_clearCoat_factor_useTexture, + MaterialSrg::m_clearCoatRoughnessMap, IN.m_uv[MaterialSrg::m_clearCoatRoughnessMapUvIndex], MaterialSrg::m_clearCoatRoughness, o_clearCoat_roughness_useTexture, + MaterialSrg::m_clearCoatNormalMap, IN.m_uv[MaterialSrg::m_clearCoatNormalMapUvIndex], IN.m_normal, o_clearCoat_normal_useTexture, MaterialSrg::m_clearCoatNormalStrength, + uvMatrix, tangents[MaterialSrg::m_clearCoatNormalMapUvIndex], bitangents[MaterialSrg::m_clearCoatNormalMapUvIndex], + MaterialSrg::m_sampler, isFrontFace, + surface.clearCoat.factor, surface.clearCoat.roughness, surface.clearCoat.normal); + } + + // manipulate base layer f0 if clear coat is enabled + // modify base layer's normal incidence reflectance + // for the derivation of the following equation please refer to: + // https://google.github.io/filament/Filament.md.html#materialsystem/clearcoatmodel/baselayermodification + float3 f0 = (1.0 - 5.0 * sqrt(surface.specularF0)) / (5.0 - sqrt(surface.specularF0)); + surface.specularF0 = lerp(surface.specularF0, f0 * f0, surface.clearCoat.factor); } + + // Diffuse and Specular response (used in IBL calculations) + lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); + lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; + + if(o_clearCoat_feature_enabled) + { + // Clear coat layer has fixed IOR = 1.5 and transparent => F0 = (1.5 - 1)^2 / (1.5 + 1)^2 = 0.04 + lightingData.diffuseResponse *= 1.0 - (FresnelSchlickWithRoughness(lightingData.NdotV, float3(0.04, 0.04, 0.04), surface.clearCoat.roughness) * surface.clearCoat.factor); + } + + // ------- Multiscatter ------- + + lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation); // ------- Lighting Calculation ------- - // Convert the angle from [0..1] = [0 .. 180 degrees] to radians [0 .. PI] - const float2 anisotropy = float2(MaterialSrg::m_anisotropicAngle * PI, MaterialSrg::m_anisotropicFactor); + // Apply Decals + ApplyDecals(lightingData.tileIterator, surface); - PbrLightingOutput lightingOutput = PbrLighting(IN, - baseColor, metallic, roughness, specularF0Factor, - normal, IN.m_tangent, IN.m_bitangent, anisotropy, - emissive, occlusion, transmissionTintThickness, MaterialSrg::m_transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, o_opacity_mode); + // Apply Direct Lighting + ApplyDirectLighting(surface, lightingData); + + // Apply Image Based Lighting (IBL) + ApplyIBL(surface, lightingData); + + // Finalize Lighting + lightingData.FinalizeLighting(surface.transmission.tint); + + if (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent) + { + alpha = FresnelSchlickWithRoughness(lightingData.NdotV, alpha, surface.roughnessLinear).x; // Increase opacity at grazing angles. + } + + PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); // ------- Opacity ------- @@ -311,7 +390,6 @@ ForwardPassOutputWithDepth EnhancedPbr_ForwardPassPS(VSOutput IN, bool isFrontFa OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; OUT.m_scatterDistance = lightingOutput.m_scatterDistance; OUT.m_depth = depth; return OUT; @@ -330,7 +408,6 @@ ForwardPassOutput EnhancedPbr_ForwardPassPS_EDS(VSOutput IN, bool isFrontFace : OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; OUT.m_scatterDistance = lightingOutput.m_scatterDistance; return OUT; diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader index 49725bedc9..7964e3c84a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shader @@ -50,5 +50,5 @@ ] }, - "DrawList" : "forward" -} \ No newline at end of file + "DrawList" : "forwardWithSubsurfaceOutput" +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shadervariantlist b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shadervariantlist index ca4eff9dcd..ba431e8fd6 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shadervariantlist +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.shadervariantlist @@ -26,4 +26,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shader index 6adbba952d..f7fcfd6c21 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shader @@ -49,5 +49,5 @@ ] }, - "DrawList" : "forward" -} \ No newline at end of file + "DrawList" : "forwardWithSubsurfaceOutput" +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shadervariantlist b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shadervariantlist index c5e79ed607..2a650b5f91 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shadervariantlist +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass_EDS.shadervariantlist @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl index e051a238bd..15b58c4deb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Shadowmap_WithPS.azsl @@ -11,7 +11,6 @@ */ #include <scenesrg.srgi> -#include <viewsrg.srgi> #include "EnhancedPBR_Common.azsli" #include <Atom/Features/PBR/AlphaUtils.azsli> #include <Atom/Features/PBR/DefaultObjectSrg.azsli> @@ -129,4 +128,4 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) OUT.m_depth = pdo.m_depth; } return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/OcclusionInput.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/OcclusionInput.azsli index 6149934ba5..103745cf56 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/OcclusionInput.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/MaterialInputs/OcclusionInput.azsli @@ -12,19 +12,23 @@ #pragma once -// This file provides utilities for common handling of inputs for ambient occlusion maps for PBR materials. +// This file provides utilities for common handling of inputs for baked occlusion maps for PBR materials. // These macros can be used to declare common shader inputs for this feature. // Use the COMMON_SRG_INPUTS_* macro in your material SRG definition, and use the COMMON_OPTIONS_* macro at the global scope in your shader. Then you can pass these variables to the Get*Input() function below. // You can optionally provide a prefix for the set of inputs which corresponds to a prefix string supplied by the .materialtype file. This is common for multi-layered material types. #define COMMON_SRG_INPUTS_OCCLUSION(prefix) \ -float prefix##m_ambientOcclusionFactor; \ -Texture2D prefix##m_ambientOcclusionMap; \ -uint prefix##m_ambientOcclusionMapUvIndex; +float prefix##m_diffuseOcclusionFactor; \ +Texture2D prefix##m_diffuseOcclusionMap; \ +uint prefix##m_diffuseOcclusionMapUvIndex; \ +float prefix##m_specularOcclusionFactor; \ +Texture2D prefix##m_specularOcclusionMap; \ +uint prefix##m_specularOcclusionMapUvIndex; #define COMMON_OPTIONS_OCCLUSION(prefix) \ -option bool prefix##o_ambientOcclusion_useTexture; +option bool prefix##o_diffuseOcclusion_useTexture; \ +option bool prefix##o_specularOcclusion_useTexture; float GetOcclusionInput(Texture2D map, sampler mapSampler, float2 uv, float factor, bool useTexture) { diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl index dc79a94007..84095ac163 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl @@ -10,11 +10,24 @@ * */ -#include <viewsrg.srgi> #include "Skin_Common.azsli" + +// SRGs #include <Atom/Features/PBR/DefaultObjectSrg.azsli> -#include <Atom/Features/PBR/ForwardPassOutput.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> + +// Pass Output +#include <Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli> + +// Utility #include <Atom/Features/ColorManagement/TransformColor.azsli> +#include <Atom/Features/PBR/AlphaUtils.azsli> // TODO: Remove this after OpacityMode is removed from LightingModel + +// Custom Surface & Lighting +#include <Atom/Features/PBR/Lighting/SkinLighting.azsli> + +// Decals +#include <Atom/Features/PBR/Decals.azsli> // ---------- Material Parameters ---------- @@ -53,6 +66,8 @@ option bool o_blendMask_isBound; #include "MaterialInputs/TransmissionInput.azsli" +// ---------- Vertex Shader ---------- + struct VSInput { // Base fields (required by the template azsli file)... @@ -89,8 +104,6 @@ struct VSOutput float4 m_blendMask : UV8; }; -#include <Atom/Features/PBR/AlphaUtils.azsli> // TODO: Remove this after OpacityMode is removed from LightingModel -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput SkinVS(VSInput IN) @@ -131,6 +144,9 @@ VSOutput SkinVS(VSInput IN) return OUT; } + +// ---------- Pixel Shader ---------- + float3 ApplyBaseColorWrinkleMap(bool shouldApply, float3 baseColor, Texture2D map, sampler mapSampler, float2 uv, float factor) { if (shouldApply) @@ -177,6 +193,9 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) PrepareGeneratedTangent(IN.m_normal, IN.m_worldPosition, isFrontFace, IN.m_uv, UvSetCount, tangents, bitangents, startIndex); } + Surface surface; + surface.position = IN.m_worldPosition; + // ------- Detail Layer Setup ------- // When the detail maps and the detail blend mask are on the same UV, they both use the transformed detail UVs because they are 'attached' to each other @@ -212,19 +231,18 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) normalMapSample = ApplyNormalWrinkleMap(o_wrinkleLayers_normal_useTexture4, normalMapSample, MaterialSrg::m_wrinkle_normal_texture4, MaterialSrg::m_sampler, normalUv, MaterialSrg::m_flipNormalX, MaterialSrg::m_flipNormalY, IN.m_blendMask.a); } - float3 normalWS; if(o_detail_normal_useTexture) { float3 normalTS = GetTangentSpaceNormal(normalMapSample, uvMatrix, MaterialSrg::m_normalFactor); bool applyOverlay = true; - normalWS = ApplyNormalMapOverlayWS(applyOverlay, IN.m_normal, normalTS, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], + surface.normal = ApplyNormalMapOverlayWS(applyOverlay, IN.m_normal, normalTS, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], MaterialSrg::m_detail_normal_texture, MaterialSrg::m_sampler, IN.m_detailUv, MaterialSrg::m_detail_normal_flipX, MaterialSrg::m_detail_normal_flipY, detailLayerNormalFactor, tangents[MaterialSrg::m_detail_allMapsUvIndex], bitangents[MaterialSrg::m_detail_allMapsUvIndex], MaterialSrg::m_detailUvMatrix); } else { - normalWS = GetWorldSpaceNormal(normalMapSample, IN.m_normal, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], + surface.normal = GetWorldSpaceNormal(normalMapSample, IN.m_normal, tangents[MaterialSrg::m_normalMapUvIndex], bitangents[MaterialSrg::m_normalMapUvIndex], uvMatrix, MaterialSrg::m_normalFactor); } @@ -265,18 +283,29 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) baseColor = ApplyTextureOverlay(o_detail_baseColor_useTexture, baseColor, MaterialSrg::m_detail_baseColor_texture, MaterialSrg::m_sampler, IN.m_detailUv, detailLayerBaseColorFactor); - - // ------- Roughness ------- - - float2 roughnessUv = IN.m_uv[MaterialSrg::m_roughnessMapUvIndex]; - float roughness = GetRoughnessInput(MaterialSrg::m_roughnessMap, MaterialSrg::m_sampler, roughnessUv, MaterialSrg::m_roughnessFactor, - MaterialSrg::m_roughnessLowerBound, MaterialSrg::m_roughnessUpperBound, o_roughness_useTexture); + if(o_wrinkleLayers_enabled && o_wrinkleLayers_showBlendMaskValues && o_blendMask_isBound) + { + // Overlay debug colors to highlight the different blend weights coming from the vertex color stream. + if(o_wrinkleLayers_count > 0) { baseColor = lerp(baseColor, float3(1,0,0), IN.m_blendMask.r); } + if(o_wrinkleLayers_count > 1) { baseColor = lerp(baseColor, float3(0,1,0), IN.m_blendMask.g); } + if(o_wrinkleLayers_count > 2) { baseColor = lerp(baseColor, float3(0,0,1), IN.m_blendMask.b); } + if(o_wrinkleLayers_count > 3) { baseColor = lerp(baseColor, float3(1,1,1), IN.m_blendMask.a); } + } // ------- Specular ------- float2 specularUv = IN.m_uv[MaterialSrg::m_specularF0MapUvIndex]; float specularF0Factor = GetSpecularInput(MaterialSrg::m_specularF0Map, MaterialSrg::m_sampler, specularUv, MaterialSrg::m_specularF0Factor, o_specularF0_useTexture); + surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor); + + // ------- Roughness ------- + + float2 roughnessUv = IN.m_uv[MaterialSrg::m_roughnessMapUvIndex]; + surface.roughnessLinear = GetRoughnessInput(MaterialSrg::m_roughnessMap, MaterialSrg::m_sampler, roughnessUv, MaterialSrg::m_roughnessFactor, + MaterialSrg::m_roughnessLowerBound, MaterialSrg::m_roughnessUpperBound, o_roughness_useTexture); + surface.CalculateRoughnessA(); + // ------- Subsurface ------- float2 subsurfaceUv = IN.m_uv[MaterialSrg::m_subsurfaceScatteringInfluenceMapUvIndex]; @@ -286,30 +315,49 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) float2 transmissionUv = IN.m_uv[MaterialSrg::m_transmissionThicknessMapUvIndex]; float4 transmissionTintThickness = GeTransmissionInput(MaterialSrg::m_transmissionThicknessMap, MaterialSrg::m_sampler, transmissionUv, MaterialSrg::m_transmissionTintThickness); + surface.transmission.tint = transmissionTintThickness.rgb; + surface.transmission.thickness = transmissionTintThickness.w; + surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; + + // ------- Lighting Data ------- + + LightingData lightingData; + + // Light iterator + lightingData.tileIterator.Init(IN.m_position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); + lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); + + // Directional light shadow coordinates + lightingData.shadowCoords = IN.m_shadowCoords; + + // Diffuse and Specular response (used in IBL calculations) + lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); + lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; + + // ------- Occlusion ------- + + 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); // ------- Lighting Calculation ------- - if(o_wrinkleLayers_enabled && o_wrinkleLayers_showBlendMaskValues && o_blendMask_isBound) - { - // Overlay debug colors to highlight the different blend weights coming from the vertex color stream. - if(o_wrinkleLayers_count > 0) { baseColor = lerp(baseColor, float3(1,0,0), IN.m_blendMask.r); } - if(o_wrinkleLayers_count > 1) { baseColor = lerp(baseColor, float3(0,1,0), IN.m_blendMask.g); } - if(o_wrinkleLayers_count > 2) { baseColor = lerp(baseColor, float3(0,0,1), IN.m_blendMask.b); } - if(o_wrinkleLayers_count > 3) { baseColor = lerp(baseColor, float3(1,1,1), IN.m_blendMask.a); } - } + surface.clearCoat.factor = 0.0; + surface.clearCoat.roughness = 0.0; + surface.clearCoat.normal = float3(0.0, 0.0, 0.0); - float metallic = 0; - float3 emissive = float3(0,0,0); - float occlusion = 1; - float2 anisotropy = float2(0,0); - float clearCoatFactor = 0.0; - float clearCoatRoughness = 0.0; - float3 clearCoatNormal = float3(0.0, 0.0, 0.0); - float alpha = 1; + // Apply Decals + ApplyDecals(lightingData.tileIterator, surface); - PbrLightingOutput lightingOutput = PbrLighting(IN, baseColor, metallic, roughness, specularF0Factor, - normalWS, tangents[0], bitangents[0], anisotropy, - emissive, occlusion, transmissionTintThickness, MaterialSrg::m_transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, o_opacity_mode); + // Apply Direct Lighting + ApplyDirectLighting(surface, lightingData); + + // Apply Image Based Lighting (IBL) + ApplyIBL(surface, lightingData); + + // Finalize Lighting + lightingData.FinalizeLighting(surface.transmission.tint); + + PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData); // ------- Preparing output ------- @@ -333,7 +381,6 @@ ForwardPassOutput SkinPS(VSOutput IN) OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; OUT.m_scatterDistance = lightingOutput.m_scatterDistance; return OUT; diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype index 5912bc1484..b8951d69c7 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype @@ -24,9 +24,9 @@ "description": "Properties related to configuring surface normal." }, { - "id": "ambientOcclusion", - "displayName": "Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "occlusion", + "displayName": "Occlusion", + "description": "Properties for baked textures that represent geometric occlusion of light." }, { "id": "subsurfaceScattering", @@ -383,48 +383,89 @@ } } ], - - "ambientOcclusion": [ + "occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMap" + "id": "m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", "enumIsUv": true, - "defaultValue": "Unwrapped", + "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMapUvIndex" + "id": "m_diffuseOcclusionMapUvIndex" } }, { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", "type": "Float", "defaultValue": 1.0, "min": 0.0, - "max": 2.0, + "softMax": 2.0, "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionFactor" + "id": "m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionFactor" } } ], @@ -1021,9 +1062,21 @@ } }, { - "type": "Lua", + "type": "UseTexture", "args": { - "file": "StandardPBR_AoState.lua" + "textureProperty": "occlusion.diffuseTextureMap", + "useTextureProperty": "occlusion.diffuseUseTexture", + "dependentProperties": ["occlusion.diffuseTextureMapUv", "occlusion.diffuseFactor"], + "shaderOption": "o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "occlusion.specularTextureMap", + "useTextureProperty": "occlusion.specularUseTexture", + "dependentProperties": ["occlusion.specularTextureMapUv", "occlusion.specularFactor"], + "shaderOption": "o_specularOcclusion_useTexture" } }, { @@ -1055,4 +1108,4 @@ "UV0": "Tiled", "UV1": "Unwrapped" } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.shader index 763f3a23a1..b2bfd5e6bb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.shader @@ -42,5 +42,5 @@ ] }, - "DrawList" : "forward" -} \ No newline at end of file + "DrawList" : "forwardWithSubsurfaceOutput" +} 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 9754698101..20bf7c1f2a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli @@ -13,6 +13,7 @@ #pragma once #include <Atom/Features/SrgSemantics.azsli> +#include <viewsrg.srgi> #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli> #include "MaterialInputs/BaseColorInput.azsli" diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype index 3b40d80b67..7610a4c9db 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype @@ -73,9 +73,9 @@ "description": "Properties for configuring gloss clear coat" }, { - "id": "layer1_ambientOcclusion", - "displayName": "Layer 1: Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "layer1_occlusion", + "displayName": "Layer 1: Occlusion", + "description": "Properties for baked textures for diffuse and specular occlusion of ambient lighting." }, { "id": "layer1_emissive", @@ -126,9 +126,9 @@ "description": "Properties for configuring gloss clear coat" }, { - "id": "layer2_ambientOcclusion", - "displayName": "Layer 2: Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "layer2_occlusion", + "displayName": "Layer 2: Occlusion", + "description": "Properties for baked textures for diffuse and specular occlusion of ambient lighting." }, { "id": "layer2_emissive", @@ -179,9 +179,9 @@ "description": "Properties for configuring gloss clear coat" }, { - "id": "layer3_ambientOcclusion", - "displayName": "Layer 3: Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "layer3_occlusion", + "displayName": "Layer 3: Occlusion", + "description": "Properties for baked textures for diffuse and specular occlusion of ambient lighting." }, { "id": "layer3_emissive", @@ -1169,47 +1169,89 @@ } } ], - "layer1_ambientOcclusion": [ + "layer1_occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_layer1_m_ambientOcclusionMap" + "id": "m_layer1_m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", "enumIsUv": true, "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_layer1_m_ambientOcclusionMapUvIndex" + "id": "m_layer1_m_diffuseOcclusionMapUvIndex" } }, { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", "type": "Float", "defaultValue": 1.0, "min": 0.0, - "max": 2.0, + "softMax": 2.0, "connection": { "type": "ShaderInput", - "id": "m_layer1_m_ambientOcclusionFactor" + "id": "m_layer1_m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_layer1_m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_layer1_m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_layer1_m_specularOcclusionFactor" } } ], @@ -1820,47 +1862,89 @@ } } ], - "layer2_ambientOcclusion": [ + "layer2_occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_layer2_m_ambientOcclusionMap" + "id": "m_layer2_m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", "enumIsUv": true, "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_layer2_m_ambientOcclusionMapUvIndex" + "id": "m_layer2_m_diffuseOcclusionMapUvIndex" } }, { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", "type": "Float", "defaultValue": 1.0, "min": 0.0, - "max": 2.0, + "softMax": 2.0, "connection": { "type": "ShaderInput", - "id": "m_layer2_m_ambientOcclusionFactor" + "id": "m_layer2_m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_layer2_m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_layer2_m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_layer2_m_specularOcclusionFactor" } } ], @@ -2471,47 +2555,89 @@ } } ], - "layer3_ambientOcclusion": [ + "layer3_occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_layer3_m_ambientOcclusionMap" + "id": "m_layer3_m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", "enumIsUv": true, "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_layer3_m_ambientOcclusionMapUvIndex" + "id": "m_layer3_m_diffuseOcclusionMapUvIndex" } }, { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", "type": "Float", "defaultValue": 1.0, "min": 0.0, - "max": 2.0, + "softMax": 2.0, "connection": { "type": "ShaderInput", - "id": "m_layer3_m_ambientOcclusionFactor" + "id": "m_layer3_m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_layer3_m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_layer3_m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_layer3_m_specularOcclusionFactor" } } ], @@ -2894,12 +3020,21 @@ } }, { - "type": "Lua", + "type": "UseTexture", "args": { - "file": "StandardPBR_AoState.lua", - "propertyNamePrefix": "layer1_", - "srgNamePrefix": "m_layer1_", - "optionsNamePrefix": "o_layer1_" + "textureProperty": "layer1_occlusion.diffuseTextureMap", + "useTextureProperty": "layer1_occlusion.diffuseUseTexture", + "dependentProperties": ["layer1_occlusion.diffuseTextureMapUv", "layer1_occlusion.diffuseFactor"], + "shaderOption": "o_layer1_o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "layer1_occlusion.specularTextureMap", + "useTextureProperty": "layer1_occlusion.specularUseTexture", + "dependentProperties": ["layer1_occlusion.specularTextureMapUv", "layer1_occlusion.specularFactor"], + "shaderOption": "o_layer1_o_specularOcclusion_useTexture" } }, { @@ -3022,12 +3157,21 @@ } }, { - "type": "Lua", + "type": "UseTexture", "args": { - "file": "StandardPBR_AoState.lua", - "propertyNamePrefix": "layer2_", - "srgNamePrefix": "m_layer2_", - "optionsNamePrefix": "o_layer2_" + "textureProperty": "layer2_occlusion.diffuseTextureMap", + "useTextureProperty": "layer2_occlusion.diffuseUseTexture", + "dependentProperties": ["layer2_occlusion.diffuseTextureMapUv", "layer2_occlusion.diffuseFactor"], + "shaderOption": "o_layer2_o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "layer2_occlusion.specularTextureMap", + "useTextureProperty": "layer2_occlusion.specularUseTexture", + "dependentProperties": ["layer2_occlusion.specularTextureMapUv", "layer2_occlusion.specularFactor"], + "shaderOption": "o_layer2_o_specularOcclusion_useTexture" } }, { @@ -3150,12 +3294,21 @@ } }, { - "type": "Lua", + "type": "UseTexture", "args": { - "file": "StandardPBR_AoState.lua", - "propertyNamePrefix": "layer3_", - "srgNamePrefix": "m_layer3_", - "optionsNamePrefix": "o_layer3_" + "textureProperty": "layer3_occlusion.diffuseTextureMap", + "useTextureProperty": "layer3_occlusion.diffuseUseTexture", + "dependentProperties": ["layer3_occlusion.diffuseTextureMapUv", "layer3_occlusion.diffuseFactor"], + "shaderOption": "o_layer3_o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "layer3_occlusion.specularTextureMap", + "useTextureProperty": "layer3_occlusion.specularUseTexture", + "dependentProperties": ["layer3_occlusion.specularTextureMapUv", "layer3_occlusion.specularFactor"], + "shaderOption": "o_layer3_o_specularOcclusion_useTexture" } }, { diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.shader index 386185327a..e544299e73 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_DepthPass_WithPS.shader @@ -25,4 +25,4 @@ }, "DrawList" : "depth" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl index 9e5c29ba34..560c7ab7eb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl @@ -10,10 +10,23 @@ * */ +// SRGs #include <viewsrg.srgi> #include <Atom/Features/PBR/DefaultObjectSrg.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> + +// Pass Output #include <Atom/Features/PBR/ForwardPassOutput.azsli> + +// Utility #include <Atom/Features/ColorManagement/TransformColor.azsli> +#include <Atom/Features/PBR/AlphaUtils.azsli> + +// Custom Surface & Lighting +#include <Atom/Features/PBR/Lighting/StandardLighting.azsli> + +// Decals +#include <Atom/Features/PBR/Decals.azsli> // ---------- Material Parameters ---------- @@ -47,6 +60,9 @@ DEFINE_LAYER_OPTIONS(o_layer3_) #include "MaterialInputs/TransmissionInput.azsli" #include "StandardMultilayerPBR_Common.azsli" + +// ---------- Vertex Shader ---------- + struct VSInput { // Base fields (required by the template azsli file)... @@ -83,8 +99,6 @@ struct VSOutput float3 m_blendMask : UV7; }; -#include <Atom/Features/PBR/AlphaUtils.azsli> -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput ForwardPassVS(VSInput IN) @@ -115,6 +129,9 @@ VSOutput ForwardPassVS(VSInput IN) return OUT; } + +// ---------- Pixel Shader ---------- + PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float depth) { depth = IN.m_position.z; @@ -144,14 +161,14 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float if(o_debugDrawMode == DebugDrawMode::BlendMaskValues) { float3 blendMaskValues = GetBlendMaskValues(IN.m_uv[MaterialSrg::m_blendMaskUvIndex], IN.m_blendMask); - return MakeDebugOutput(IN, blendMaskValues); + return DebugOutput(blendMaskValues); } if(o_debugDrawMode == DebugDrawMode::DepthMaps) { GetDepth_Setup(IN.m_blendMask); float depth = GetDepth(IN.m_uv[MaterialSrg::m_parallaxUvIndex], float2(0,0), float2(0,0)); - return MakeDebugOutput(IN, float3(depth,depth,depth)); + return DebugOutput(float3(depth,depth,depth)); } // ------- Parallax ------- @@ -179,6 +196,9 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float } } + Surface surface; + surface.position = IN.m_worldPosition; + // ------- Setup the per-layer UV transforms ------- float2 uvLayer1[UvSetCount]; @@ -222,7 +242,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float3 normalTS = ReorientTangentSpaceNormal(layer1_normalTS, layer2_normalTS); normalTS = ReorientTangentSpaceNormal(normalTS, layer3_normalTS); // [GFX TODO][ATOM-14591]: This will only work if the normal maps all use the same UV stream. We would need to add support for having them in different UV streams. - float3 normalWS = normalize(TangentSpaceToWorld(normalTS, IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex])); + surface.normal = normalize(TangentSpaceToWorld(normalTS, IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex])); // ------- Base Color ------- @@ -244,14 +264,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float layer3_metallic = GetMetallicInput(MaterialSrg::m_layer3_m_metallicMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_metallicMapUvIndex], MaterialSrg::m_layer3_m_metallicFactor, o_layer3_o_metallic_useTexture); metallic = BlendLayers(layer1_metallic, layer2_metallic, layer3_metallic, blendMaskValues); } - - // ------- Roughness ------- - - float layer1_roughness = GetRoughnessInput(MaterialSrg::m_layer1_m_roughnessMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_roughnessMapUvIndex], MaterialSrg::m_layer1_m_roughnessFactor, MaterialSrg::m_layer1_m_roughnessLowerBound, MaterialSrg::m_layer1_m_roughnessUpperBound, o_layer1_o_roughness_useTexture); - float layer2_roughness = GetRoughnessInput(MaterialSrg::m_layer2_m_roughnessMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_roughnessMapUvIndex], MaterialSrg::m_layer2_m_roughnessFactor, MaterialSrg::m_layer2_m_roughnessLowerBound, MaterialSrg::m_layer2_m_roughnessUpperBound, o_layer2_o_roughness_useTexture); - float layer3_roughness = GetRoughnessInput(MaterialSrg::m_layer3_m_roughnessMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_roughnessMapUvIndex], MaterialSrg::m_layer3_m_roughnessFactor, MaterialSrg::m_layer3_m_roughnessLowerBound, MaterialSrg::m_layer3_m_roughnessUpperBound, o_layer3_o_roughness_useTexture); - float roughness = BlendLayers(layer1_roughness, layer2_roughness, layer3_roughness, blendMaskValues); - + // ------- Specular ------- float layer1_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer1_m_specularF0Map, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularF0MapUvIndex], MaterialSrg::m_layer1_m_specularF0Factor, o_layer1_o_specularF0_useTexture); @@ -259,19 +272,16 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float layer3_specularF0Factor = GetSpecularInput(MaterialSrg::m_layer3_m_specularF0Map, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularF0MapUvIndex], MaterialSrg::m_layer3_m_specularF0Factor, o_layer3_o_specularF0_useTexture); float specularF0Factor = BlendLayers(layer1_specularF0Factor, layer2_specularF0Factor, layer3_specularF0Factor, blendMaskValues); - // ------- Emissive ------- - - float3 layer1_emissive = GetEmissiveInput(MaterialSrg::m_layer1_m_emissiveMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_emissiveMapUvIndex], MaterialSrg::m_layer1_m_emissiveIntensity, MaterialSrg::m_layer1_m_emissiveColor.rgb, o_layer1_o_emissiveEnabled, o_layer1_o_emissive_useTexture); - float3 layer2_emissive = GetEmissiveInput(MaterialSrg::m_layer2_m_emissiveMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_emissiveMapUvIndex], MaterialSrg::m_layer2_m_emissiveIntensity, MaterialSrg::m_layer2_m_emissiveColor.rgb, o_layer2_o_emissiveEnabled, o_layer2_o_emissive_useTexture); - float3 layer3_emissive = GetEmissiveInput(MaterialSrg::m_layer3_m_emissiveMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_emissiveMapUvIndex], MaterialSrg::m_layer3_m_emissiveIntensity, MaterialSrg::m_layer3_m_emissiveColor.rgb, o_layer3_o_emissiveEnabled, o_layer3_o_emissive_useTexture); - float3 emissive = BlendLayers(layer1_emissive, layer2_emissive, layer3_emissive, blendMaskValues); + surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); - // ------- Occlusion ------- - - float layer1_occlusion = GetOcclusionInput(MaterialSrg::m_layer1_m_ambientOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_ambientOcclusionMapUvIndex], MaterialSrg::m_layer1_m_ambientOcclusionFactor, o_layer1_o_ambientOcclusion_useTexture); - float layer2_occlusion = GetOcclusionInput(MaterialSrg::m_layer2_m_ambientOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_ambientOcclusionMapUvIndex], MaterialSrg::m_layer2_m_ambientOcclusionFactor, o_layer2_o_ambientOcclusion_useTexture); - float layer3_occlusion = GetOcclusionInput(MaterialSrg::m_layer3_m_ambientOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_ambientOcclusionMapUvIndex], MaterialSrg::m_layer3_m_ambientOcclusionFactor, o_layer3_o_ambientOcclusion_useTexture); - float occlusion = BlendLayers(layer1_occlusion, layer2_occlusion, layer3_occlusion, blendMaskValues); + // ------- Roughness ------- + + float layer1_roughness = GetRoughnessInput(MaterialSrg::m_layer1_m_roughnessMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_roughnessMapUvIndex], MaterialSrg::m_layer1_m_roughnessFactor, MaterialSrg::m_layer1_m_roughnessLowerBound, MaterialSrg::m_layer1_m_roughnessUpperBound, o_layer1_o_roughness_useTexture); + float layer2_roughness = GetRoughnessInput(MaterialSrg::m_layer2_m_roughnessMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_roughnessMapUvIndex], MaterialSrg::m_layer2_m_roughnessFactor, MaterialSrg::m_layer2_m_roughnessLowerBound, MaterialSrg::m_layer2_m_roughnessUpperBound, o_layer2_o_roughness_useTexture); + float layer3_roughness = GetRoughnessInput(MaterialSrg::m_layer3_m_roughnessMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_roughnessMapUvIndex], MaterialSrg::m_layer3_m_roughnessFactor, MaterialSrg::m_layer3_m_roughnessLowerBound, MaterialSrg::m_layer3_m_roughnessUpperBound, o_layer3_o_roughness_useTexture); + surface.roughnessLinear = BlendLayers(layer1_roughness, layer2_roughness, layer3_roughness, blendMaskValues); + + surface.CalculateRoughnessA(); // ------- Subsurface ------- @@ -282,14 +292,46 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float float2 transmissionUv = IN.m_uv[MaterialSrg::m_transmissionThicknessMapUvIndex]; float4 transmissionTintThickness = GeTransmissionInput(MaterialSrg::m_transmissionThicknessMap, MaterialSrg::m_sampler, transmissionUv, MaterialSrg::m_transmissionTintThickness); + surface.transmission.tint = transmissionTintThickness.rgb; + surface.transmission.thickness = transmissionTintThickness.w; + surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; + + // ------- Lighting Data ------- + + LightingData lightingData; + + // Light iterator + lightingData.tileIterator.Init(IN.m_position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); + lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); + + // Directional light shadow coordinates + lightingData.shadowCoords = IN.m_shadowCoords; + + // ------- Emissive ------- + + float3 layer1_emissive = GetEmissiveInput(MaterialSrg::m_layer1_m_emissiveMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_emissiveMapUvIndex], MaterialSrg::m_layer1_m_emissiveIntensity, MaterialSrg::m_layer1_m_emissiveColor.rgb, o_layer1_o_emissiveEnabled, o_layer1_o_emissive_useTexture); + float3 layer2_emissive = GetEmissiveInput(MaterialSrg::m_layer2_m_emissiveMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_emissiveMapUvIndex], MaterialSrg::m_layer2_m_emissiveIntensity, MaterialSrg::m_layer2_m_emissiveColor.rgb, o_layer2_o_emissiveEnabled, o_layer2_o_emissive_useTexture); + float3 layer3_emissive = GetEmissiveInput(MaterialSrg::m_layer3_m_emissiveMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_emissiveMapUvIndex], MaterialSrg::m_layer3_m_emissiveIntensity, MaterialSrg::m_layer3_m_emissiveColor.rgb, o_layer3_o_emissiveEnabled, o_layer3_o_emissive_useTexture); + lightingData.emissiveLighting = BlendLayers(layer1_emissive, layer2_emissive, layer3_emissive, blendMaskValues); + + // ------- Occlusion ------- + + float layer1_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer1_m_diffuseOcclusionFactor, o_layer1_o_diffuseOcclusion_useTexture); + float layer2_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer2_m_diffuseOcclusionFactor, o_layer2_o_diffuseOcclusion_useTexture); + float layer3_diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_diffuseOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_diffuseOcclusionMapUvIndex], MaterialSrg::m_layer3_m_diffuseOcclusionFactor, o_layer3_o_diffuseOcclusion_useTexture); + lightingData.diffuseAmbientOcclusion = BlendLayers(layer1_diffuseAmbientOcclusion, layer2_diffuseAmbientOcclusion, layer3_diffuseAmbientOcclusion, blendMaskValues); + + float layer1_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer1_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer1[MaterialSrg::m_layer1_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer1_m_specularOcclusionFactor, o_layer1_o_specularOcclusion_useTexture); + float layer2_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer2_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer2[MaterialSrg::m_layer2_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer2_m_specularOcclusionFactor, o_layer2_o_specularOcclusion_useTexture); + float layer3_specularOcclusion = GetOcclusionInput(MaterialSrg::m_layer3_m_specularOcclusionMap, MaterialSrg::m_sampler, uvLayer3[MaterialSrg::m_layer3_m_specularOcclusionMapUvIndex], MaterialSrg::m_layer3_m_specularOcclusionFactor, o_layer3_o_specularOcclusion_useTexture); + lightingData.specularOcclusion = BlendLayers(layer1_specularOcclusion, layer2_specularOcclusion, layer3_specularOcclusion, blendMaskValues); // ------- Clearcoat ------- - float clearCoatFactor = 0.0f; - float clearCoatRoughness = 0.0f; - float3 clearCoatNormal = float3(0.0, 0.0, 0.0); if(o_clearCoat_feature_enabled) { + // --- Layer 1 --- + float layer1_clearCoatFactor = 0.0f; float layer1_clearCoatRoughness = 0.0f; float3 layer1_clearCoatNormal = float3(0.0, 0.0, 0.0); @@ -305,6 +347,8 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float layer1_clearCoatFactor, layer1_clearCoatRoughness, layer1_clearCoatNormal); } + // --- Layer 2 --- + float layer2_clearCoatFactor = 0.0f; float layer2_clearCoatRoughness = 0.0f; float3 layer2_clearCoatNormal = float3(0.0, 0.0, 0.0); @@ -320,6 +364,8 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float layer2_clearCoatFactor, layer2_clearCoatRoughness, layer2_clearCoatNormal); } + // --- Layer 3 --- + float layer3_clearCoatFactor = 0.0f; float layer3_clearCoatRoughness = 0.0f; float3 layer3_clearCoatNormal = float3(0.0, 0.0, 0.0); @@ -335,22 +381,58 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float layer3_clearCoatFactor, layer3_clearCoatRoughness, layer3_clearCoatNormal); } - clearCoatFactor = BlendLayers(layer1_clearCoatFactor, layer2_clearCoatFactor, layer3_clearCoatFactor, blendMaskValues); - clearCoatRoughness = BlendLayers(layer1_clearCoatRoughness, layer2_clearCoatRoughness, layer3_clearCoatRoughness, blendMaskValues); + // --- Blend Layers --- + + surface.clearCoat.factor = BlendLayers(layer1_clearCoatFactor, layer2_clearCoatFactor, layer3_clearCoatFactor, blendMaskValues); + surface.clearCoat.roughness = BlendLayers(layer1_clearCoatRoughness, layer2_clearCoatRoughness, layer3_clearCoatRoughness, blendMaskValues); // [GFX TODO][ATOM-14592] This is not the right way to blend the normals. We need to use ReorientTangentSpaceNormal(), and that requires GetClearCoatInputs() to return the normal in TS instead of WS. - clearCoatNormal = BlendLayers(layer1_clearCoatNormal, layer2_clearCoatNormal, layer3_clearCoatNormal, blendMaskValues); - clearCoatNormal = normalize(clearCoatNormal); + surface.clearCoat.normal = BlendLayers(layer1_clearCoatNormal, layer2_clearCoatNormal, layer3_clearCoatNormal, blendMaskValues); + surface.clearCoat.normal = normalize(surface.clearCoat.normal); + + // manipulate base layer f0 if clear coat is enabled + // modify base layer's normal incidence reflectance + // for the derivation of the following equation please refer to: + // https://google.github.io/filament/Filament.md.html#materialsystem/clearcoatmodel/baselayermodification + float3 f0 = (1.0 - 5.0 * sqrt(surface.specularF0)) / (5.0 - sqrt(surface.specularF0)); + surface.specularF0 = lerp(surface.specularF0, f0 * f0, surface.clearCoat.factor); } + // Diffuse and Specular response (used in IBL calculations) + lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); + lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; + + if(o_clearCoat_feature_enabled) + { + // Clear coat layer has fixed IOR = 1.5 and transparent => F0 = (1.5 - 1)^2 / (1.5 + 1)^2 = 0.04 + lightingData.diffuseResponse *= 1.0 - (FresnelSchlickWithRoughness(lightingData.NdotV, float3(0.04, 0.04, 0.04), surface.clearCoat.roughness) * surface.clearCoat.factor); + } + + // ------- Multiscatter ------- + + lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation); + // ------- Lighting Calculation ------- - const float2 anisotropy = 0.0; // Does not affect calculations unless 'o_enableAnisotropy' is enabled + // Apply Decals + ApplyDecals(lightingData.tileIterator, surface); - PbrLightingOutput lightingOutput = PbrLighting(IN, - baseColor, metallic, roughness, specularF0Factor, - normalWS, tangents[0], bitangents[0], anisotropy, - emissive, occlusion, transmissionTintThickness, MaterialSrg::m_transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, o_opacity_mode); + // Apply Direct Lighting + ApplyDirectLighting(surface, lightingData); + + // Apply Image Based Lighting (IBL) + ApplyIBL(surface, lightingData); + + // Finalize Lighting + lightingData.FinalizeLighting(surface.transmission.tint); + + + if (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent) + { + alpha = FresnelSchlickWithRoughness(lightingData.NdotV, alpha, surface.roughnessLinear).x; // Increase opacity at grazing angles. + } + + PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); // ------- Opacity ------- @@ -370,7 +452,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float // Pack factor and quality, drawback: because of precision limit of float16 cannot represent exact 1, maximum representable value is 0.9961 uint factorAndQuality = dot(round(float2(saturate(surfaceScatteringFactor), MaterialSrg::m_subsurfaceScatteringQuality) * 255), float2(256, 1)); lightingOutput.m_diffuseColor.w = factorAndQuality * (o_enableSubsurfaceScattering ? 1.0 : -1.0); - lightingOutput.m_scatterDistance = MaterialSrg::m_scatterDistance; } @@ -389,8 +470,6 @@ ForwardPassOutputWithDepth ForwardPassPS(VSOutput IN, bool isFrontFace : SV_IsFr OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = lightingOutput.m_scatterDistance; OUT.m_depth = depth; return OUT; } @@ -408,8 +487,6 @@ ForwardPassOutput ForwardPassPS_EDS(VSOutput IN, bool isFrontFace : SV_IsFrontFa OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = lightingOutput.m_scatterDistance; return OUT; } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.shader index 1af03e49da..28322d68ed 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.shader @@ -50,4 +50,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass_EDS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass_EDS.shader index ad2a06c208..42366d6067 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass_EDS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass_EDS.shader @@ -50,4 +50,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl index fa7d12f1fb..1274e07f7d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl @@ -133,4 +133,4 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) } return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype index 9750d09538..e071a793a5 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype @@ -44,9 +44,9 @@ "description": "Properties for configuring UV transforms." }, { - "id": "ambientOcclusion", - "displayName": "Ambient Occlusion", - "description": "Properties for baked AO texture." + "id": "occlusion", + "displayName": "Occlusion", + "description": "Properties for baked textures that represent geometric occlusion of light." }, { "id": "emissive", @@ -724,47 +724,89 @@ "step": 0.1 } ], - "ambientOcclusion": [ + "occlusion": [ { - "id": "enable", - "displayName": "Enable", - "description": "Whether to enable the ambient occlusion feature.", - "type": "Bool", - "defaultValue": false - }, - { - "id": "textureMap", - "displayName": "Texture Map", - "description": "Texture map for defining ambient occlusion area.", + "id": "diffuseTextureMap", + "displayName": "Diffuse AO", + "description": "Texture map for defining occlusion area for diffuse ambient lighting.", "type": "Image", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMap" + "id": "m_diffuseOcclusionMap" } }, { - "id": "textureMapUv", - "displayName": "UV", - "description": "Ambient occlusion texture map UV set", + "id": "diffuseUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Diffuse AO texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "diffuseTextureMapUv", + "displayName": " UV", + "description": "Diffuse AO texture map UV set.", "type": "Enum", "enumIsUv": true, "defaultValue": "Tiled", "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionMapUvIndex" + "id": "m_diffuseOcclusionMapUvIndex" } }, { - "id": "factor", - "displayName": "Factor", - "description": "Strength factor for scaling the values", + "id": "diffuseFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Diffuse AO", "type": "Float", "defaultValue": 1.0, "min": 0.0, - "max": 2.0, + "softMax": 2.0, "connection": { "type": "ShaderInput", - "id": "m_ambientOcclusionFactor" + "id": "m_diffuseOcclusionFactor" + } + }, + { + "id": "specularTextureMap", + "displayName": "Specular Cavity", + "description": "Texture map for defining occlusion area for specular lighting.", + "type": "Image", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMap" + } + }, + { + "id": "specularUseTexture", + "displayName": " Use Texture", + "description": "Whether to use the Specular Cavity texture map.", + "type": "Bool", + "defaultValue": true + }, + { + "id": "specularTextureMapUv", + "displayName": " UV", + "description": "Specular Cavity texture map UV set.", + "type": "Enum", + "enumIsUv": true, + "defaultValue": "Tiled", + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionMapUvIndex" + } + }, + { + "id": "specularFactor", + "displayName": " Factor", + "description": "Strength factor for scaling the values of Specular Cavity", + "type": "Float", + "defaultValue": 1.0, + "min": 0.0, + "softMax": 2.0, + "connection": { + "type": "ShaderInput", + "id": "m_specularOcclusionFactor" } } ], @@ -1270,9 +1312,21 @@ } }, { - "type": "Lua", + "type": "UseTexture", "args": { - "file": "StandardPBR_AoState.lua" + "textureProperty": "occlusion.diffuseTextureMap", + "useTextureProperty": "occlusion.diffuseUseTexture", + "dependentProperties": ["occlusion.diffuseTextureMapUv", "occlusion.diffuseFactor"], + "shaderOption": "o_diffuseOcclusion_useTexture" + } + }, + { + "type": "UseTexture", + "args": { + "textureProperty": "occlusion.specularTextureMap", + "useTextureProperty": "occlusion.specularUseTexture", + "dependentProperties": ["occlusion.specularTextureMapUv", "occlusion.specularFactor"], + "shaderOption": "o_specularOcclusion_useTexture" } }, { diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_AoState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_AoState.lua deleted file mode 100644 index a27817d925..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_AoState.lua +++ /dev/null @@ -1,48 +0,0 @@ --------------------------------------------------------------------------------------- --- --- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or --- its licensors. --- --- For complete copyright and license terms please see the LICENSE at the root of this --- distribution (the "License"). All use of this software is governed by the License, --- or, if provided, by the license below or the license accompanying this file. Do not --- remove or modify any license notices. This file is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- --- ----------------------------------------------------------------------------------------------------- - -function GetMaterialPropertyDependencies() - return {"ambientOcclusion.enable", "ambientOcclusion.textureMap"} -end - -function GetShaderOptionDependencies() - return {"o_ambientOcclusion_useTexture"} -end - -function Process(context) - local enableAo = context:GetMaterialPropertyValue_bool("ambientOcclusion.enable") - local textureMap = context:GetMaterialPropertyValue_image("ambientOcclusion.textureMap") - - context:SetShaderOptionValue_bool("o_ambientOcclusion_useTexture", enableAo and textureMap ~= nil) -end - -function ProcessEditor(context) - local enableAo = context:GetMaterialPropertyValue_bool("ambientOcclusion.enable") - - if(not enableAo) then - context:SetMaterialPropertyVisibility("ambientOcclusion.factor", MaterialPropertyVisibility_Hidden) - context:SetMaterialPropertyVisibility("ambientOcclusion.textureMap", MaterialPropertyVisibility_Hidden) - context:SetMaterialPropertyVisibility("ambientOcclusion.textureMapUv", MaterialPropertyVisibility_Hidden) - else - context:SetMaterialPropertyVisibility("ambientOcclusion.textureMap", MaterialPropertyVisibility_Enabled) - local textureMap = context:GetMaterialPropertyValue_image("ambientOcclusion.textureMap") - if(textureMap == nil) then - context:SetMaterialPropertyVisibility("ambientOcclusion.factor", MaterialPropertyVisibility_Hidden) - context:SetMaterialPropertyVisibility("ambientOcclusion.textureMapUv", MaterialPropertyVisibility_Hidden) - else - context:SetMaterialPropertyVisibility("ambientOcclusion.factor", MaterialPropertyVisibility_Enabled) - context:SetMaterialPropertyVisibility("ambientOcclusion.textureMapUv", MaterialPropertyVisibility_Enabled) - end - end -end diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatEnableFeature.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatEnableFeature.lua index c132e3d927..1c520c6274 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatEnableFeature.lua +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ClearCoatEnableFeature.lua @@ -26,4 +26,5 @@ end function Process(context) local enable = context:GetMaterialPropertyValue_bool("clearCoat.enable") context:SetShaderOptionValue_bool("o_clearCoat_feature_enabled", enable) + context:SetShaderOptionValue_bool("o_materialUseForwardPassIBLSpecular", enable) end diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Common.azsli index 70137a88c1..1a7e039da3 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Common.azsli @@ -13,6 +13,7 @@ #pragma once #include <Atom/Features/SrgSemantics.azsli> +#include <viewsrg.srgi> #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli> #include "MaterialInputs/BaseColorInput.azsli" diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl index 2e64f5102a..4d4f7b195a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.azsl @@ -10,7 +10,6 @@ * */ -#include <viewsrg.srgi> #include <Atom/Features/PBR/AlphaUtils.azsli> #include "./StandardPBR_Common.azsli" #include <Atom/Features/PBR/DefaultObjectSrg.azsli> diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.shader index 12ef2b2341..13a9cb68e9 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_DepthPass_WithPS.shader @@ -25,4 +25,4 @@ }, "DrawList" : "depth" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl index 999db3c5da..d3bc72d162 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.azsl @@ -10,11 +10,25 @@ * */ -#include <viewsrg.srgi> #include "StandardPBR_Common.azsli" + +// SRGs #include <Atom/Features/PBR/DefaultObjectSrg.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> + +// Pass Output #include <Atom/Features/PBR/ForwardPassOutput.azsli> + +// Utility #include <Atom/Features/ColorManagement/TransformColor.azsli> +#include <Atom/Features/PBR/AlphaUtils.azsli> + +// Custom Surface & Lighting +#include <Atom/Features/PBR/Lighting/StandardLighting.azsli> + +// Decals +#include <Atom/Features/PBR/Decals.azsli> + // ---------- Material Parameters ---------- @@ -38,6 +52,8 @@ COMMON_OPTIONS_PARALLAX() #include "MaterialInputs/TransmissionInput.azsli" +// ---------- Vertex Shader ---------- + struct VSInput { // Base fields (required by the template azsli file)... @@ -66,8 +82,6 @@ struct VSOutput float2 m_uv[UvSetCount] : UV1; }; -#include <Atom/Features/PBR/AlphaUtils.azsli> -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput StandardPbr_ForwardPassVS(VSInput IN) @@ -85,6 +99,9 @@ VSOutput StandardPbr_ForwardPassVS(VSInput IN) return OUT; } + +// ---------- Pixel Shader ---------- + PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float depth) { // ------- Tangents & Bitangets ------- @@ -112,7 +129,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float { float3x3 uvMatrix = MaterialSrg::m_parallaxUvIndex == 0 ? MaterialSrg::m_uvMatrix : CreateIdentity3x3(); float3x3 uvMatrixInverse = MaterialSrg::m_parallaxUvIndex == 0 ? MaterialSrg::m_uvMatrixInverse : CreateIdentity3x3(); - GetParallaxInput(IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex], MaterialSrg::m_depthFactor, + GetParallaxInput(IN.m_normal, tangents[MaterialSrg::m_parallaxUvIndex], bitangents[MaterialSrg::m_parallaxUvIndex], MaterialSrg::m_depthFactor, ObjectSrg::GetWorldMatrix(), uvMatrix, uvMatrixInverse, IN.m_uv[MaterialSrg::m_parallaxUvIndex], IN.m_worldPosition, depth); @@ -130,7 +147,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float Surface surface; surface.position = IN.m_worldPosition.xyz; - // ------- Alpha & Clip ------- float2 baseColorUv = IN.m_uv[MaterialSrg::m_baseColorMapUvIndex]; @@ -162,9 +178,9 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float // ------- Specular ------- float2 specularUv = IN.m_uv[MaterialSrg::m_specularF0MapUvIndex]; - float specularF0 = GetSpecularInput(MaterialSrg::m_specularF0Map, MaterialSrg::m_sampler, specularUv, MaterialSrg::m_specularF0Factor, o_specularF0_useTexture); + float specularF0Factor = GetSpecularInput(MaterialSrg::m_specularF0Map, MaterialSrg::m_sampler, specularUv, MaterialSrg::m_specularF0Factor, o_specularF0_useTexture); - surface.SetAlbedoAndSpecularF0(baseColor, specularF0, metallic); + surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); // ------- Roughness ------- @@ -175,25 +191,8 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float // ------- Subsurface ------- - float2 subsurfaceUv = IN.m_uv[MaterialSrg::m_subsurfaceScatteringInfluenceMapUvIndex]; - float surfaceScatteringFactor = GetSubsurfaceInput(MaterialSrg::m_subsurfaceScatteringInfluenceMap, MaterialSrg::m_sampler, subsurfaceUv, MaterialSrg::m_subsurfaceScatteringFactor); - - // ------- Transmission ------- - - float2 transmissionUv = IN.m_uv[MaterialSrg::m_transmissionThicknessMapUvIndex]; - float4 transmissionTintThickness = GeTransmissionInput(MaterialSrg::m_transmissionThicknessMap, MaterialSrg::m_sampler, transmissionUv, MaterialSrg::m_transmissionTintThickness); - surface.transmission.tint = transmissionTintThickness.rgb; - surface.transmission.thickness = transmissionTintThickness.w; - surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; - - // ------- Anisotropy ------- - - if (o_enableAnisotropy) - { - const float anisotropyAngle = 0.0f; - const float anisotropyFactor = 0.0f; - surface.anisotropy.Init(surface.normal, tangents[0], bitangents[0], anisotropyAngle, anisotropyFactor, surface.roughnessA); - } + float surfaceScatteringFactor = 0.0f; + surface.transmission.InitializeToZero(); // ------- Lighting Data ------- @@ -212,9 +211,9 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float lightingData.emissiveLighting = GetEmissiveInput(MaterialSrg::m_emissiveMap, MaterialSrg::m_sampler, emissiveUv, MaterialSrg::m_emissiveIntensity, MaterialSrg::m_emissiveColor.rgb, o_emissiveEnabled, o_emissive_useTexture); // ------- Occlusion ------- - - float2 occlusionUv = IN.m_uv[MaterialSrg::m_ambientOcclusionMapUvIndex]; - lightingData.occlusion = GetOcclusionInput(MaterialSrg::m_ambientOcclusionMap, MaterialSrg::m_sampler, occlusionUv, MaterialSrg::m_ambientOcclusionFactor, o_ambientOcclusion_useTexture); + + 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); // ------- Clearcoat ------- @@ -250,9 +249,9 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float lightingData.diffuseResponse *= 1.0 - (FresnelSchlickWithRoughness(lightingData.NdotV, float3(0.04, 0.04, 0.04), surface.clearCoat.roughness) * surface.clearCoat.factor); } - // Multiscatter compensation factor - lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation); + // ------- Multiscatter ------- + lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation); // ------- Lighting Calculation ------- @@ -312,9 +311,8 @@ ForwardPassOutputWithDepth StandardPbr_ForwardPassPS(VSOutput IN, bool isFrontFa OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = lightingOutput.m_scatterDistance; OUT.m_depth = depth; + return OUT; } @@ -331,8 +329,6 @@ ForwardPassOutput StandardPbr_ForwardPassPS_EDS(VSOutput IN, bool isFrontFace : OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = lightingOutput.m_scatterDistance; return OUT; } diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shader index ce444d9222..d8df49f4b0 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shader @@ -51,4 +51,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shadervariantlist b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shadervariantlist index bc41c2150e..39f101aca9 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shadervariantlist +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass.shadervariantlist @@ -26,4 +26,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shader b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shader index 4e7221d91c..db7e2a10a8 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shader +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shader @@ -50,4 +50,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shadervariantlist b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shadervariantlist index 7de28362db..d899ad0fc5 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shadervariantlist +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ForwardPass_EDS.shadervariantlist @@ -28,4 +28,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua index 6e2b29afae..7c3d989c35 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_ShaderEnable.lua @@ -53,4 +53,4 @@ function Process(context) context:GetShaderByTag("DepthPassTransparentMin"):SetEnabled((opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent)) context:GetShaderByTag("DepthPassTransparentMax"):SetEnabled((opacityMode == OpacityMode_Blended) or (opacityMode == OpacityMode_TintedTransparent)) -end \ No newline at end of file +end diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl index 520c4cc580..e792c25778 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR_Shadowmap_WithPS.azsl @@ -11,7 +11,6 @@ */ #include <scenesrg.srgi> -#include <viewsrg.srgi> #include "StandardPBR_Common.azsli" #include <Atom/Features/PBR/AlphaUtils.azsli> #include <Atom/Features/PBR/DefaultObjectSrg.azsli> @@ -134,4 +133,4 @@ PSDepthOutput MainPS(VertexOutput IN, bool isFrontFace : SV_IsFrontFace) OUT.m_depth = pdo.m_depth + ShadowMapDepthBias; } return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/AuxGeom.pass b/Gems/Atom/Feature/Common/Assets/Passes/AuxGeom.pass index 65f0e9973c..4e53e3721a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/AuxGeom.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/AuxGeom.pass @@ -20,4 +20,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexture.pass b/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexture.pass index 597f3c2a3d..c6d3c40cf9 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexture.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexture.pass @@ -45,4 +45,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexturePipeline.pass b/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexturePipeline.pass index 46ac6d5375..86cb9ba9d8 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexturePipeline.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BRDFTexturePipeline.pass @@ -14,4 +14,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BlendColorGradingLuts.pass b/Gems/Atom/Feature/Common/Assets/Passes/BlendColorGradingLuts.pass index 785bd3e28f..3818df2339 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BlendColorGradingLuts.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BlendColorGradingLuts.pass @@ -18,4 +18,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Bloom.pass b/Gems/Atom/Feature/Common/Assets/Passes/Bloom.pass index fb80240136..07dce9812c 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Bloom.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Bloom.pass @@ -70,4 +70,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BloomBlur.pass b/Gems/Atom/Feature/Common/Assets/Passes/BloomBlur.pass index c1bbc3f16f..cdf7bf56ae 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BloomBlur.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BloomBlur.pass @@ -26,4 +26,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BloomComposite.pass b/Gems/Atom/Feature/Common/Assets/Passes/BloomComposite.pass index 6fe4ac1b74..51fb61381f 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BloomComposite.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BloomComposite.pass @@ -26,4 +26,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/BloomDownsample.pass b/Gems/Atom/Feature/Common/Assets/Passes/BloomDownsample.pass index b257723bbf..83507cea50 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/BloomDownsample.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/BloomDownsample.pass @@ -104,4 +104,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/CameraMotionVector.pass b/Gems/Atom/Feature/Common/Assets/Passes/CameraMotionVector.pass index ad88576e90..0d2b72dd3e 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/CameraMotionVector.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/CameraMotionVector.pass @@ -58,4 +58,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveColor.pass b/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveColor.pass index 0c77cb4c5d..582b636731 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveColor.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveColor.pass @@ -224,4 +224,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveDepth.pass b/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveDepth.pass index e2d4452673..cb9a6984d6 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveDepth.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/CheckerboardResolveDepth.pass @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ConvertToAcescg.pass b/Gems/Atom/Feature/Common/Assets/Passes/ConvertToAcescg.pass index 5fab8a8f1d..a6a267b03f 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ConvertToAcescg.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ConvertToAcescg.pass @@ -53,4 +53,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Depth.pass b/Gems/Atom/Feature/Common/Assets/Passes/Depth.pass index 4900064062..fe3113decd 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Depth.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Depth.pass @@ -51,4 +51,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthCheckerboard.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthCheckerboard.pass index 12a664754d..c6a4776784 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthCheckerboard.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthCheckerboard.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthDownsample.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthDownsample.pass index e13752fff0..0e38d73beb 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthDownsample.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthDownsample.pass @@ -64,4 +64,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass index 9afed92c0a..c08f5c9e4a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthExponentiation.pass @@ -69,4 +69,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA.pass index 64a86f4d50..05bfa3aa7f 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA2x.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA2x.pass index 1820e85448..21f054dfef 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA2x.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA2x.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA4x.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA4x.pass index 3fe3a31e0e..173381e6dc 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA4x.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA4x.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA8x.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA8x.pass index f637064e1c..161eb8dcdd 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA8x.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthMSAA8x.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthMax.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthMax.pass index dbc6f75f17..08d06205f6 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthMax.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthMax.pass @@ -61,4 +61,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthToLinearDepth.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthToLinearDepth.pass index 5bb5472d5f..2f1e3a1345 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthToLinearDepth.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthToLinearDepth.pass @@ -59,4 +59,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DepthUpsample.pass b/Gems/Atom/Feature/Common/Assets/Passes/DepthUpsample.pass index d3a68fe6f8..70455c32ae 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DepthUpsample.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DepthUpsample.pass @@ -73,4 +73,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseComposite.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseComposite.pass index a017b160b2..615ee8a162 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseComposite.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseComposite.pass @@ -68,7 +68,7 @@ "ShaderAsset": { "FilePath": "Shaders/DiffuseGlobalIllumination/DiffuseComposite.shader" }, - "StencilRef": 1, + "StencilRef": 128, // See RenderCommon.h and DiffuseComposite.shader "PipelineViewTag": "MainCamera" } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen.pass index fcf7011720..8808666f6d 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen.pass @@ -48,7 +48,7 @@ "ShaderAsset": { "FilePath": "Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.shader" }, - "StencilRef": 1, + "StencilRef": 128, // See RenderCommon.h and DiffuseGlobalFullscreen.shader "PipelineViewTag": "MainCamera" } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen_nomsaa.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen_nomsaa.pass index ffbdfa9175..71121967a0 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen_nomsaa.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseGlobalFullscreen_nomsaa.pass @@ -43,7 +43,7 @@ "ShaderAsset": { "FilePath": "Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.shader" }, - "StencilRef": 1, + "StencilRef": 128, // See RenderCommon.h and DiffuseGlobalFullscreen.shader "PipelineViewTag": "MainCamera" } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendDistance.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendDistance.pass index 34bf95a61b..2c36a77e4e 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendDistance.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendDistance.pass @@ -8,4 +8,4 @@ "PassClass": "DiffuseProbeGridBlendDistancePass" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendIrradiance.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendIrradiance.pass index c55a3e2685..28606dad61 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendIrradiance.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBlendIrradiance.pass @@ -8,4 +8,4 @@ "PassClass": "DiffuseProbeGridBlendIrradiancePass" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBorderUpdate.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBorderUpdate.pass index 63530bdc4e..f14ddc8f6c 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBorderUpdate.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridBorderUpdate.pass @@ -8,4 +8,4 @@ "PassClass": "DiffuseProbeGridBorderUpdatePass" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridClassification.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridClassification.pass new file mode 100644 index 0000000000..c50890dac2 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridClassification.pass @@ -0,0 +1,11 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "PassAsset", + "ClassData": { + "PassTemplate": { + "Name": "DiffuseProbeGridClassificationPassTemplate", + "PassClass": "DiffuseProbeGridClassificationPass" + } + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRayTracing.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRayTracing.pass index 032605feda..a46384b2d9 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRayTracing.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRayTracing.pass @@ -8,4 +8,4 @@ "PassClass": "DiffuseProbeGridRayTracingPass" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRelocation.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRelocation.pass index 63023f1250..cf83484002 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRelocation.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridRelocation.pass @@ -8,4 +8,4 @@ "PassClass": "DiffuseProbeGridRelocationPass" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridUpdate.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridUpdate.pass index 3d4057f6df..6852cc2d1a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridUpdate.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseProbeGridUpdate.pass @@ -26,6 +26,10 @@ { "Name": "DiffuseProbeGridRelocationPass", "TemplateName": "DiffuseProbeGridRelocationPassTemplate" + }, + { + "Name": "DiffuseProbeGridClassificationPass", + "TemplateName": "DiffuseProbeGridClassificationPassTemplate" } ] } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseSpecularMerge.pass b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseSpecularMerge.pass index 6abaa01d2f..b3eae18856 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DiffuseSpecularMerge.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DiffuseSpecularMerge.pass @@ -64,4 +64,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DisplayMapper.pass b/Gems/Atom/Feature/Common/Assets/Passes/DisplayMapper.pass index 0cf314040c..31cf7d130d 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DisplayMapper.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DisplayMapper.pass @@ -64,4 +64,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleLuminanceMinAvgMaxCS.pass b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleLuminanceMinAvgMaxCS.pass index 31b6b0ffc4..0f609ca1d7 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleLuminanceMinAvgMaxCS.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleLuminanceMinAvgMaxCS.pass @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMinAvgMaxCS.pass b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMinAvgMaxCS.pass index a8dbb8c0a2..032538b619 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMinAvgMaxCS.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMinAvgMaxCS.pass @@ -61,4 +61,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMipChain.pass b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMipChain.pass index eb195c4a82..b288aed40d 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMipChain.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/DownsampleMipChain.pass @@ -15,4 +15,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapDepthMSAA.pass b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapDepthMSAA.pass index 3311795172..5abbe7d62d 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapDepthMSAA.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapDepthMSAA.pass @@ -54,4 +54,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapForwardMSAA.pass b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapForwardMSAA.pass index aa422aa227..cd52ce946b 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapForwardMSAA.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapForwardMSAA.pass @@ -148,22 +148,6 @@ "LoadAction": "Clear" } }, - { - "Name": "ClearCoatNormalOutput", - "SlotType": "Output", - "ScopeAttachmentUsage": "RenderTarget", - "LoadStoreAction": { - "ClearValue": { - "Value": [ - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "LoadAction": "Clear" - } - }, { "Name": "ScatterDistanceOutput", "SlotType": "Output", @@ -274,23 +258,6 @@ "FilePath": "Textures/BRDFTexture.attimage" } }, - { - "Name": "ClearCoatNormalImage", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "Output" - } - }, - "MultisampleSource": { - "Pass": "This", - "Attachment": "DepthStencilInputOutput" - }, - "ImageDescriptor": { - "Format": "R16G16B16A16_FLOAT", - "SharedQueueMask": "Graphics" - } - }, { "Name": "ScatterDistanceImage", "SizeSource": { @@ -352,13 +319,6 @@ "Attachment": "BRDFTexture" } }, - { - "LocalSlot": "ClearCoatNormalOutput", - "AttachmentRef": { - "Pass": "This", - "Attachment": "ClearCoatNormalImage" - } - }, { "LocalSlot": "ScatterDistanceOutput", "AttachmentRef": { @@ -369,4 +329,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapPipeline.pass b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapPipeline.pass index 0e2fb93359..e086f62e27 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapPipeline.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapPipeline.pass @@ -296,7 +296,7 @@ "ShaderAsset": { "FilePath": "Shaders/Reflections/ReflectionComposite.shader" }, - "StencilRef": 1 + "StencilRef": 1 // See RenderCommon.h and ReflectionComposite.shader } }, { @@ -368,4 +368,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapSkyBox.pass b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapSkyBox.pass index 4c74f9e967..bd8ce6ed01 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapSkyBox.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EnvironmentCubeMapSkyBox.pass @@ -68,4 +68,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass b/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass index d69615c089..27b777d549 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass @@ -78,4 +78,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EyeAdaptation.pass b/Gems/Atom/Feature/Common/Assets/Passes/EyeAdaptation.pass index 55eac2e29c..702eaaeafa 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EyeAdaptation.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EyeAdaptation.pass @@ -30,4 +30,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurHor.pass b/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurHor.pass index 58817ac738..e1b90d49de 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurHor.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurHor.pass @@ -58,4 +58,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurVer.pass b/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurVer.pass index fe572ac67e..8e2c05cf01 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurVer.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FastDepthAwareBlurVer.pass @@ -58,4 +58,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass index 1112d6d360..2b2ae40fdc 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass @@ -69,4 +69,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass index 277047d14e..321d0abf4a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass @@ -69,4 +69,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass index 66cf330fc5..31a8ed1879 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Forward.pass @@ -149,22 +149,6 @@ "LoadAction": "Clear" } }, - { - "Name": "ClearCoatNormalOutput", - "SlotType": "Output", - "ScopeAttachmentUsage": "RenderTarget", - "LoadStoreAction": { - "ClearValue": { - "Value": [ - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "LoadAction": "Clear" - } - }, { "Name": "ScatterDistanceOutput", "SlotType": "Output", @@ -255,19 +239,6 @@ "FilePath": "Textures/BRDFTexture.attimage" } }, - { - "Name": "ClearCoatNormalImage", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - }, - "ImageDescriptor": { - "Format": "R16G16B16A16_FLOAT", - "SharedQueueMask": "Graphics" - } - }, { "Name": "ScatterDistanceImage", "SizeSource": { @@ -325,13 +296,6 @@ "Attachment": "BRDFTexture" } }, - { - "LocalSlot": "ClearCoatNormalOutput", - "AttachmentRef": { - "Pass": "This", - "Attachment": "ClearCoatNormalImage" - } - }, { "LocalSlot": "ScatterDistanceOutput", "AttachmentRef": { diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ForwardCheckerboard.pass b/Gems/Atom/Feature/Common/Assets/Passes/ForwardCheckerboard.pass index 13fffd9e08..e66ad47ced 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ForwardCheckerboard.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ForwardCheckerboard.pass @@ -106,14 +106,6 @@ "LoadAction": "Clear" } }, - { - "Name": "ClearCoatNormalOutput", - "SlotType": "Output", - "ScopeAttachmentUsage": "RenderTarget", - "LoadStoreAction": { - "LoadAction": "Clear" - } - }, { "Name": "ScatterDistanceOutput", "SlotType": "Output", @@ -226,22 +218,6 @@ "AssetRef": { "FilePath": "Textures/BRDFTexture.attimage" } - }, - { - "Name": "ClearCoatNormalImage", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - }, - "ImageDescriptor": { - "Format": "R16G16B16A16_FLOAT", - "MultisampleState": { - "samples": 2 - }, - "SharedQueueMask": "Graphics" - } } ], "Connections": [ @@ -293,15 +269,8 @@ "Pass": "This", "Attachment": "BRDFTexture" } - }, - { - "LocalSlot": "ClearCoatNormalOutput", - "AttachmentRef": { - "Pass": "This", - "Attachment": "ClearCoatNormalImage" - } } ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ForwardMSAA.pass b/Gems/Atom/Feature/Common/Assets/Passes/ForwardMSAA.pass index b5d5f9f92c..52cf3a2aaa 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ForwardMSAA.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ForwardMSAA.pass @@ -148,38 +148,6 @@ }, "LoadAction": "Clear" } - }, - { - "Name": "ClearCoatNormalOutput", - "SlotType": "Output", - "ScopeAttachmentUsage": "RenderTarget", - "LoadStoreAction": { - "ClearValue": { - "Value": [ - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "LoadAction": "Clear" - } - }, - { - "Name": "ScatterDistanceOutput", - "SlotType": "Output", - "ScopeAttachmentUsage": "RenderTarget", - "LoadStoreAction": { - "ClearValue": { - "Value": [ - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "LoadAction": "Clear" - } } ], "ImageAttachments": [ @@ -274,40 +242,6 @@ "AssetRef": { "FilePath": "Textures/BRDFTexture.attimage" } - }, - { - "Name": "ClearCoatNormalImage", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - }, - "MultisampleSource": { - "Pass": "This", - "Attachment": "DepthStencilInputOutput" - }, - "ImageDescriptor": { - "Format": "R16G16B16A16_FLOAT", - "SharedQueueMask": "Graphics" - } - }, - { - "Name": "ScatterDistanceImage", - "SizeSource": { - "Source": { - "Pass": "Parent", - "Attachment": "SwapChainOutput" - } - }, - "MultisampleSource": { - "Pass": "This", - "Attachment": "DepthStencilInputOutput" - }, - "ImageDescriptor": { - "Format": "R11G11B10_FLOAT", - "SharedQueueMask": "Graphics" - } } ], "Connections": [ @@ -352,22 +286,8 @@ "Pass": "This", "Attachment": "BRDFTexture" } - }, - { - "LocalSlot": "ClearCoatNormalOutput", - "AttachmentRef": { - "Pass": "This", - "Attachment": "ClearCoatNormalImage" - } - }, - { - "LocalSlot": "ScatterDistanceOutput", - "AttachmentRef": { - "Pass": "This", - "Attachment": "ScatterDistanceImage" - } } ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ForwardSubsurfaceMSAA.pass b/Gems/Atom/Feature/Common/Assets/Passes/ForwardSubsurfaceMSAA.pass new file mode 100644 index 0000000000..7c3c49a0c9 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Passes/ForwardSubsurfaceMSAA.pass @@ -0,0 +1,158 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "PassAsset", + "ClassData": { + "PassTemplate": { + "Name": "ForwardSubsurfaceMSAAPassTemplate", + "PassClass": "RasterPass", + "Slots": [ + // Inputs... + { + "Name": "BRDFTextureInput", + "ShaderInputName": "m_brdfMap", + "SlotType": "Input", + "ScopeAttachmentUsage": "Shader" + }, + { + "Name": "DirectionalLightShadowmap", + "ShaderInputName": "m_directionalLightShadowmap", + "SlotType": "Input", + "ScopeAttachmentUsage": "Shader", + "ImageViewDesc": { + "IsArray": 1 + } + }, + { + "Name": "ExponentialShadowmapDirectional", + "ShaderInputName": "m_directionalLightExponentialShadowmap", + "SlotType": "Input", + "ScopeAttachmentUsage": "Shader", + "ImageViewDesc": { + "IsArray": 1 + } + }, + { + "Name": "ProjectedShadowmap", + "ShaderInputName": "m_projectedShadowmaps", + "SlotType": "Input", + "ScopeAttachmentUsage": "Shader", + "ImageViewDesc": { + "IsArray": 1 + } + }, + { + "Name": "ExponentialShadowmapProjected", + "ShaderInputName": "m_projectedExponentialShadowmap", + "SlotType": "Input", + "ScopeAttachmentUsage": "Shader", + "ImageViewDesc": { + "IsArray": 1 + } + }, + { + "Name": "TileLightData", + "SlotType": "Input", + "ShaderInputName": "m_tileLightData", + "ScopeAttachmentUsage": "Shader" + }, + { + "Name": "LightListRemapped", + "SlotType": "Input", + "ShaderInputName": "m_lightListRemapped", + "ScopeAttachmentUsage": "Shader" + }, + // Input/Outputs... + { + "Name": "DepthStencilInputOutput", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "DepthStencil" + }, + { + "Name": "DiffuseOutput", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "RenderTarget" + }, + { + "Name": "SpecularOutput", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "RenderTarget" + }, + { + "Name": "AlbedoOutput", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "RenderTarget" + }, + { + "Name": "SpecularF0Output", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "RenderTarget" + }, + { + "Name": "NormalOutput", + "SlotType": "InputOutput", + "ScopeAttachmentUsage": "RenderTarget" + }, + // Outputs... + { + "Name": "ScatterDistanceOutput", + "SlotType": "Output", + "ScopeAttachmentUsage": "RenderTarget", + "LoadStoreAction": { + "ClearValue": { + "Value": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "LoadAction": "Clear" + } + } + ], + "ImageAttachments": [ + { + "Name": "BRDFTexture", + "Lifetime": "Imported", + "AssetRef": { + "FilePath": "Textures/BRDFTexture.attimage" + } + }, + { + "Name": "ScatterDistanceImage", + "SizeSource": { + "Source": { + "Pass": "Parent", + "Attachment": "SwapChainOutput" + } + }, + "MultisampleSource": { + "Pass": "This", + "Attachment": "DepthStencilInputOutput" + }, + "ImageDescriptor": { + "Format": "R11G11B10_FLOAT", + "SharedQueueMask": "Graphics" + } + } + ], + "Connections": [ + { + "LocalSlot": "BRDFTextureInput", + "AttachmentRef": { + "Pass": "This", + "Attachment": "BRDFTexture" + } + }, + { + "LocalSlot": "ScatterDistanceOutput", + "AttachmentRef": { + "Pass": "This", + "Attachment": "ScatterDistanceImage" + } + } + ] + } + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenCopy.pass b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenCopy.pass index a5dd0ee0dd..0a37644f48 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenCopy.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenCopy.pass @@ -39,4 +39,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass index ca4e38c5ff..03d3e80539 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/FullscreenOutputOnly.pass @@ -26,4 +26,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ImGui.pass b/Gems/Atom/Feature/Common/Assets/Passes/ImGui.pass index 0cb91f67ca..def07ee3ba 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ImGui.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ImGui.pass @@ -15,4 +15,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LightCullingHeatmap.pass b/Gems/Atom/Feature/Common/Assets/Passes/LightCullingHeatmap.pass index 6d41607bdc..bcb36ed9ab 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LightCullingHeatmap.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LightCullingHeatmap.pass @@ -27,4 +27,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LookModificationComposite.pass b/Gems/Atom/Feature/Common/Assets/Passes/LookModificationComposite.pass index 170517b1c4..92c53a4201 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LookModificationComposite.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LookModificationComposite.pass @@ -63,4 +63,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LookModificationTransform.pass b/Gems/Atom/Feature/Common/Assets/Passes/LookModificationTransform.pass index 2a6a4f3bc3..fab912be82 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LookModificationTransform.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LookModificationTransform.pass @@ -75,4 +75,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHeatmap.pass b/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHeatmap.pass index 9024d87946..8acc97e402 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHeatmap.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHeatmap.pass @@ -39,4 +39,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHistogramGenerator.pass b/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHistogramGenerator.pass index bb70579e38..2fb5a48026 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHistogramGenerator.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/LuminanceHistogramGenerator.pass @@ -40,4 +40,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveColor.pass b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveColor.pass index 8fe052ac5a..94e42f9202 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveColor.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveColor.pass @@ -53,4 +53,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass index 7222b0fb24..c9f93b433d 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveCustom.pass @@ -71,4 +71,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveDepth.pass b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveDepth.pass index 6c4a3b617f..738f83c168 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveDepth.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MSAAResolveDepth.pass @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass b/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass index 38a616313b..ee943f6d39 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MainPipeline.pass @@ -439,4 +439,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MainPipelineRenderToTexture.pass b/Gems/Atom/Feature/Common/Assets/Passes/MainPipelineRenderToTexture.pass index d812813ffb..468fc10b63 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MainPipelineRenderToTexture.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MainPipelineRenderToTexture.pass @@ -29,4 +29,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MainRenderPipeline.azasset b/Gems/Atom/Feature/Common/Assets/Passes/MainRenderPipeline.azasset index 7a82ac85ca..bc12f61a8f 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MainRenderPipeline.azasset +++ b/Gems/Atom/Feature/Common/Assets/Passes/MainRenderPipeline.azasset @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MeshMotionVector.pass b/Gems/Atom/Feature/Common/Assets/Passes/MeshMotionVector.pass index 6384e9b769..57600440b4 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MeshMotionVector.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MeshMotionVector.pass @@ -91,4 +91,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ModulateTexture.pass b/Gems/Atom/Feature/Common/Assets/Passes/ModulateTexture.pass index b287cbb988..b5290cfe48 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ModulateTexture.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ModulateTexture.pass @@ -23,4 +23,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/MorphTarget.pass b/Gems/Atom/Feature/Common/Assets/Passes/MorphTarget.pass index 9276e3d65e..5562988c11 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/MorphTarget.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/MorphTarget.pass @@ -22,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass index 8131bbdf5d..dda120e164 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/OpaqueParent.pass @@ -127,6 +127,106 @@ } } }, + { + "Name": "ForwardSubsurfaceMSAAPass", + "TemplateName": "ForwardSubsurfaceMSAAPassTemplate", + "Connections": [ + // Inputs... + { + "LocalSlot": "DirectionalLightShadowmap", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "DirectionalShadowmap" + } + }, + { + "LocalSlot": "ExponentialShadowmapDirectional", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "DirectionalESM" + } + }, + { + "LocalSlot": "ProjectedShadowmap", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "ProjectedShadowmap" + } + }, + { + "LocalSlot": "ExponentialShadowmapProjected", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "ProjectedESM" + } + }, + { + "LocalSlot": "TileLightData", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "TileLightData" + } + }, + { + "LocalSlot": "LightListRemapped", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "LightListRemapped" + } + }, + // Input/Outputs... + { + "LocalSlot": "DepthStencilInputOutput", + "AttachmentRef": { + "Pass": "Parent", + "Attachment": "DepthStencil" + } + }, + { + "LocalSlot": "DiffuseOutput", + "AttachmentRef": { + "Pass": "ForwardMSAAPass", + "Attachment": "DiffuseOutput" + } + }, + { + "LocalSlot": "SpecularOutput", + "AttachmentRef": { + "Pass": "ForwardMSAAPass", + "Attachment": "SpecularOutput" + } + }, + { + "LocalSlot": "AlbedoOutput", + "AttachmentRef": { + "Pass": "ForwardMSAAPass", + "Attachment": "AlbedoOutput" + } + }, + { + "LocalSlot": "SpecularF0Output", + "AttachmentRef": { + "Pass": "ForwardMSAAPass", + "Attachment": "SpecularF0Output" + } + }, + { + "LocalSlot": "NormalOutput", + "AttachmentRef": { + "Pass": "ForwardMSAAPass", + "Attachment": "NormalOutput" + } + } + ], + "PassData": { + "$type": "RasterPassData", + "DrawListTag": "forwardWithSubsurfaceOutput", + "PipelineViewTag": "MainCamera", + "PassSrgAsset": { + "FilePath": "shaderlib/atom/features/pbr/forwardpasssrg.azsli:PassSrg" + } + } + }, { "Name": "DiffuseGlobalIlluminationPass", "TemplateName": "DiffuseGlobalIlluminationPassTemplate", @@ -181,10 +281,10 @@ } }, { - "LocalSlot": "ClearCoatNormalInput", + "LocalSlot": "AlbedoInput", "AttachmentRef": { "Pass": "ForwardMSAAPass", - "Attachment": "ClearCoatNormalOutput" + "Attachment": "AlbedoOutput" } }, { @@ -262,7 +362,7 @@ "ShaderAsset": { "FilePath": "Shaders/Reflections/ReflectionComposite.shader" }, - "StencilRef": 1, + "StencilRef": 1, // See RenderCommon.h and ReflectionComposite.shader "PipelineViewTag": "MainCamera" } }, @@ -320,7 +420,7 @@ { "LocalSlot": "Input", "AttachmentRef": { - "Pass": "ForwardMSAAPass", + "Pass": "ForwardSubsurfaceMSAAPass", "Attachment": "ScatterDistanceOutput" } } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset index 3cedd78210..b83ab65ff2 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset +++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset @@ -48,6 +48,10 @@ "Name": "ForwardMSAAPassTemplate", "Path": "Passes/ForwardMSAA.pass" }, + { + "Name": "ForwardSubsurfaceMSAAPassTemplate", + "Path": "Passes/ForwardSubsurfaceMSAA.pass" + }, { "Name": "MainPipeline", "Path": "Passes/MainPipeline.pass" @@ -416,6 +420,10 @@ "Name": "DiffuseProbeGridRelocationPassTemplate", "Path": "Passes/DiffuseProbeGridRelocation.pass" }, + { + "Name": "DiffuseProbeGridClassificationPassTemplate", + "Path": "Passes/DiffuseProbeGridClassification.pass" + }, { "Name": "DiffuseGlobalIlluminationPassTemplate", "Path": "Passes/DiffuseGlobalIllumination.pass" @@ -478,4 +486,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ProjectedShadowmaps.pass b/Gems/Atom/Feature/Common/Assets/Passes/ProjectedShadowmaps.pass index 1bfbea527e..2cbe57aa8a 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ProjectedShadowmaps.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ProjectedShadowmaps.pass @@ -37,4 +37,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/RayTracingAccelerationStructure.pass b/Gems/Atom/Feature/Common/Assets/Passes/RayTracingAccelerationStructure.pass index bdcc76bf53..139ca857bc 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/RayTracingAccelerationStructure.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/RayTracingAccelerationStructure.pass @@ -15,4 +15,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionCopyFrameBuffer.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionCopyFrameBuffer.pass index b77b186f52..ac7ea3754c 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionCopyFrameBuffer.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionCopyFrameBuffer.pass @@ -33,4 +33,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen.pass index d77ba74cf9..c699fe6d57 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen.pass @@ -28,7 +28,8 @@ "ScopeAttachmentUsage": "Shader" }, { - "Name": "ClearCoatNormalInput", + // This is needed for the alpha channel which has specularOcclusion factor + "Name": "AlbedoInput", "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen_nomsaa.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen_nomsaa.pass index 54d3757a52..26c90b90e5 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen_nomsaa.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionGlobalFullscreen_nomsaa.pass @@ -27,11 +27,6 @@ "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, - { - "Name": "ClearCoatNormalInput", - "SlotType": "Input", - "ScopeAttachmentUsage": "Shader" - }, { "Name": "ReflectionBlendWeightInput", "SlotType": "Input", diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderInner.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderInner.pass index 17110ef368..a55ebe9cfb 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderInner.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderInner.pass @@ -27,11 +27,6 @@ "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, - { - "Name": "ClearCoatNormalInput", - "SlotType": "Input", - "ScopeAttachmentUsage": "Shader" - }, { "Name": "BRDFTextureInput", "ShaderInputName": "m_brdfMap", diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderOuter.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderOuter.pass index 987b65440b..cf751ec4b0 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderOuter.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeRenderOuter.pass @@ -27,11 +27,6 @@ "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, - { - "Name": "ClearCoatNormalInput", - "SlotType": "Input", - "ScopeAttachmentUsage": "Shader" - }, { "Name": "ReflectionBlendWeightInput", "SlotType": "Input", diff --git a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeStencil.pass b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeStencil.pass index 3eef071d32..76720f08bc 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeStencil.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/ReflectionProbeStencil.pass @@ -15,4 +15,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Reflections.pass b/Gems/Atom/Feature/Common/Assets/Passes/Reflections.pass index 083c6bd16f..3442102291 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Reflections.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Reflections.pass @@ -18,7 +18,7 @@ "ScopeAttachmentUsage": "Shader" }, { - "Name": "ClearCoatNormalInput", + "Name": "AlbedoInput", "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, @@ -128,10 +128,10 @@ } }, { - "LocalSlot": "ClearCoatNormalInput", + "LocalSlot": "AlbedoInput", "AttachmentRef": { "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" + "Attachment": "AlbedoInput" } }, { @@ -147,7 +147,7 @@ "ShaderAsset": { "FilePath": "Shaders/Reflections/ReflectionGlobalFullscreen.shader" }, - "StencilRef": 15, + "StencilRef": 3, // See RenderCommon.h and ReflectionGlobalFullscreen.shader "PipelineViewTag": "MainCamera" } }, @@ -191,13 +191,6 @@ "Attachment": "SpecularF0Input" } }, - { - "LocalSlot": "ClearCoatNormalInput", - "AttachmentRef": { - "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" - } - }, { "LocalSlot": "ReflectionBlendWeightInput", "AttachmentRef": { @@ -254,13 +247,6 @@ "Pass": "Parent", "Attachment": "SpecularF0Input" } - }, - { - "LocalSlot": "ClearCoatNormalInput", - "AttachmentRef": { - "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" - } } ], "PassData": { diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Reflections_nomsaa.pass b/Gems/Atom/Feature/Common/Assets/Passes/Reflections_nomsaa.pass index 1973727719..5e69ded5ac 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Reflections_nomsaa.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Reflections_nomsaa.pass @@ -17,11 +17,6 @@ "SlotType": "Input", "ScopeAttachmentUsage": "Shader" }, - { - "Name": "ClearCoatNormalInput", - "SlotType": "Input", - "ScopeAttachmentUsage": "Shader" - }, { "Name": "DepthStencilInputOutput", "SlotType": "InputOutput", @@ -127,13 +122,6 @@ "Attachment": "SpecularF0Input" } }, - { - "LocalSlot": "ClearCoatNormalInput", - "AttachmentRef": { - "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" - } - }, { "LocalSlot": "ReflectionBlendWeightInput", "AttachmentRef": { @@ -147,7 +135,7 @@ "ShaderAsset": { "FilePath": "Shaders/Reflections/ReflectionGlobalFullscreen_nomsaa.shader" }, - "StencilRef": 15, + "StencilRef": 3, // See RenderCommon.h and ReflectionGlobalFullscreen_nomsaa.shader "PipelineViewTag": "MainCamera" } }, @@ -191,13 +179,6 @@ "Attachment": "SpecularF0Input" } }, - { - "LocalSlot": "ClearCoatNormalInput", - "AttachmentRef": { - "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" - } - }, { "LocalSlot": "ReflectionBlendWeightInput", "AttachmentRef": { @@ -254,13 +235,6 @@ "Pass": "Parent", "Attachment": "SpecularF0Input" } - }, - { - "LocalSlot": "ClearCoatNormalInput", - "AttachmentRef": { - "Pass": "Parent", - "Attachment": "ClearCoatNormalInput" - } } ], "PassData": { diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SMAABlendingWeightCalculation.pass b/Gems/Atom/Feature/Common/Assets/Passes/SMAABlendingWeightCalculation.pass index bb82745aad..a73f829d28 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SMAABlendingWeightCalculation.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SMAABlendingWeightCalculation.pass @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SMAAConvertToPerceptualColor.pass b/Gems/Atom/Feature/Common/Assets/Passes/SMAAConvertToPerceptualColor.pass index 0dc8f091fb..a737ac669e 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SMAAConvertToPerceptualColor.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SMAAConvertToPerceptualColor.pass @@ -62,4 +62,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SMAAEdgeDetection.pass b/Gems/Atom/Feature/Common/Assets/Passes/SMAAEdgeDetection.pass index 0d0023f204..ab03ea01ef 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SMAAEdgeDetection.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SMAAEdgeDetection.pass @@ -67,4 +67,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SMAANeighborhoodBlending.pass b/Gems/Atom/Feature/Common/Assets/Passes/SMAANeighborhoodBlending.pass index 3857fad285..c232dca1a2 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SMAANeighborhoodBlending.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SMAANeighborhoodBlending.pass @@ -78,4 +78,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/Skinning.pass b/Gems/Atom/Feature/Common/Assets/Passes/Skinning.pass index ff2429b7b0..ab2d997862 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/Skinning.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/Skinning.pass @@ -22,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass index 2f08097686..57f442e5de 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SkyBox.pass @@ -40,4 +40,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SsaoCompute.pass b/Gems/Atom/Feature/Common/Assets/Passes/SsaoCompute.pass index 4bed5e9422..034b4359b4 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SsaoCompute.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SsaoCompute.pass @@ -54,4 +54,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/SubsurfaceScattering.pass b/Gems/Atom/Feature/Common/Assets/Passes/SubsurfaceScattering.pass index e92a54fe21..9ced5ced6b 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/SubsurfaceScattering.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/SubsurfaceScattering.pass @@ -66,4 +66,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/UI.pass b/Gems/Atom/Feature/Common/Assets/Passes/UI.pass index 379f9e7a13..569fe1d722 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/UI.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/UI.pass @@ -15,4 +15,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Scripts/material_property_overrides_demo.lua b/Gems/Atom/Feature/Common/Assets/Scripts/material_property_overrides_demo.lua index 35f11b1f97..352076033e 100644 --- a/Gems/Atom/Feature/Common/Assets/Scripts/material_property_overrides_demo.lua +++ b/Gems/Atom/Feature/Common/Assets/Scripts/material_property_overrides_demo.lua @@ -161,4 +161,4 @@ function PropertyOverrideTest:OnTick(deltaTime, timePoint) end end -return PropertyOverrideTest \ No newline at end of file +return PropertyOverrideTest diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/AlphaUtils.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/AlphaUtils.azsli index 99f56f1fd3..09d8332ee8 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/AlphaUtils.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/AlphaUtils.azsli @@ -12,7 +12,6 @@ #pragma once -// TODO: Move this to LightingModel.azsli option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opacity_mode; void CheckClipping(float alpha, float opacityFactor) 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 2df17a41a9..62f77dd701 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 @@ -1,7 +1,23 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + #pragma once +// ------------------------------------------------------------------------------ +// NOTE: The following must be included or defined before including this file: +// - Surface - LightingData +// --------------------------------------------------------------------------------- + #include <Atom/Features/PBR/LightingOptions.azsli> -#include <Atom/Features/PBR/Surface.azsli> // Analytical integation (approximation) of diffusion profile over radius, could be replaced by other pre integrated kernels // such as sum of Gaussian diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Decals.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Decals.azsli index b452f08c22..d2eb978eb6 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Decals.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Decals.azsli @@ -12,23 +12,27 @@ #pragma once +// ------------------------------------------------------------------------------ +// NOTE: The following must be included or defined before including this file: +// - Surface +// --------------------------------------------------------------------------------- + #include <Atom/Features/MatrixUtility.azsli> #include <Atom/Features/Decals/DecalTextureUtil.azsli> #include <Atom/Features/LightCulling/LightCullingTileIterator.azsli> -#include <Atom/Features/PBR/Surface.azsli> void ApplyDecal(uint currDecalIndex, inout Surface surface); void ApplyDecals(inout LightCullingTileIterator tileIterator, inout Surface surface) { tileIterator.LoadAdvance(); - - while( !tileIterator.IsDone() ) - { - uint currDecalIndex = tileIterator.GetValue(); + + while( !tileIterator.IsDone() ) + { + uint currDecalIndex = tileIterator.GetValue(); tileIterator.LoadAdvance(); - ApplyDecal(currDecalIndex, surface); + ApplyDecal(currDecalIndex, surface); } } @@ -44,13 +48,13 @@ float GetDecalAttenuation(float3 surfNormal, float3 decalUp, float decalAngleAtt void ApplyDecal(uint currDecalIndex, inout Surface surface) { - ViewSrg::Decal decal = ViewSrg::m_decals[currDecalIndex]; + ViewSrg::Decal decal = ViewSrg::m_decals[currDecalIndex]; float3x3 decalRot = MatrixFromQuaternion(decal.m_quaternion); - float3 localPos = surface.position - decal.m_position; + float3 localPos = surface.position - decal.m_position; localPos = mul(localPos, decalRot); - + float3 decalUVW = localPos * rcp(decal.m_halfSize); if(decalUVW.x >= -1.0f && decalUVW.x <= 1.0f && decalUVW.y >= -1.0f && decalUVW.y <= 1.0f && @@ -70,25 +74,23 @@ void ApplyDecal(uint currDecalIndex, inout Surface surface) switch(textureArrayIndex) { case 0: - baseMap = ViewSrg::m_decalTextureArray0.Sample(PassSrg::LinearSampler, decalUV); + baseMap = ViewSrg::m_decalTextureArray0.Sample(PassSrg::LinearSampler, decalUV); break; case 1: - baseMap = ViewSrg::m_decalTextureArray1.Sample(PassSrg::LinearSampler, decalUV); + baseMap = ViewSrg::m_decalTextureArray1.Sample(PassSrg::LinearSampler, decalUV); break; case 2: - baseMap = ViewSrg::m_decalTextureArray2.Sample(PassSrg::LinearSampler, decalUV); + baseMap = ViewSrg::m_decalTextureArray2.Sample(PassSrg::LinearSampler, decalUV); break; case 3: - baseMap = ViewSrg::m_decalTextureArray3.Sample(PassSrg::LinearSampler, decalUV); + baseMap = ViewSrg::m_decalTextureArray3.Sample(PassSrg::LinearSampler, decalUV); break; case 4: - baseMap = ViewSrg::m_decalTextureArray4.Sample(PassSrg::LinearSampler, decalUV); + baseMap = ViewSrg::m_decalTextureArray4.Sample(PassSrg::LinearSampler, decalUV); break; } - float opacity = baseMap.a * decal.m_opacity * GetDecalAttenuation(surface.normal, decalRot[2], decal.m_angleAttenuation); - surface.albedo = lerp(surface.albedo, baseMap.rgb, opacity); - } + float opacity = baseMap.a * decal.m_opacity * GetDecalAttenuation(surface.normal, decalRot[2], decal.m_angleAttenuation); + surface.albedo = lerp(surface.albedo, baseMap.rgb, opacity); + } } - - diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli index 4185b08571..acc215f1c9 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli @@ -12,25 +12,21 @@ struct ForwardPassOutput { - // m_diffuseColor.a should be encoded with subsurface scattering's strength factor and quality factor if enabled - float4 m_diffuseColor : SV_Target0; - float4 m_specularColor : SV_Target1; - float4 m_albedo : SV_Target2; - float4 m_specularF0 : SV_Target3; - float4 m_normal : SV_Target4; - float4 m_clearCoatNormal : SV_Target5; - float3 m_scatterDistance : SV_Target6; + float4 m_diffuseColor : SV_Target0; //!< RGB = Diffuse Lighting, A = Blend Alpha (for blended surfaces) OR A = special encoding of surfaceScatteringFactor, m_subsurfaceScatteringQuality, o_enableSubsurfaceScattering + float4 m_specularColor : SV_Target1; //!< RGB = Specular Lighting, A = Unused + float4 m_albedo : SV_Target2; //!< RGB = Surface albedo pre-multiplied by other factors that will be multiplied later by diffuse GI, A = specularOcclusion + float4 m_specularF0 : SV_Target3; //!< RGB = Specular F0, A = roughness + float4 m_normal : SV_Target4; //!< RGB10 = EncodeNormalSignedOctahedron(worldNormal), A2 = multiScatterCompensationEnabled }; struct ForwardPassOutputWithDepth { - // m_diffuseColor.a should be encoded with subsurface scattering's strength factor and quality factor if enabled + // See above for descriptions of special encodings + float4 m_diffuseColor : SV_Target0; float4 m_specularColor : SV_Target1; float4 m_albedo : SV_Target2; float4 m_specularF0 : SV_Target3; float4 m_normal : SV_Target4; - float4 m_clearCoatNormal : SV_Target5; - float3 m_scatterDistance : SV_Target6; float m_depth : SV_Depth; }; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli new file mode 100644 index 0000000000..351e33eaf5 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli @@ -0,0 +1,34 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +struct ForwardPassOutput +{ + // m_diffuseColor.a should be encoded with subsurface scattering's strength factor and quality factor if enabled + float4 m_diffuseColor : SV_Target0; + float4 m_specularColor : SV_Target1; + float4 m_albedo : SV_Target2; + float4 m_specularF0 : SV_Target3; + float4 m_normal : SV_Target4; + float3 m_scatterDistance : SV_Target5; +}; + +struct ForwardPassOutputWithDepth +{ + // m_diffuseColor.a should be encoded with subsurface scattering's strength factor and quality factor if enabled + float4 m_diffuseColor : SV_Target0; + float4 m_specularColor : SV_Target1; + float4 m_albedo : SV_Target2; + float4 m_specularF0 : SV_Target3; + float4 m_normal : SV_Target4; + float3 m_scatterDistance : SV_Target5; + float m_depth : SV_Depth; +}; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/EnhancedLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/EnhancedLighting.azsli new file mode 100644 index 0000000000..010de59ec9 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/EnhancedLighting.azsli @@ -0,0 +1,115 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +// Include options first +#include <Atom/Features/PBR/LightingOptions.azsli> + +// Then include custom surface and lighting data types +#include <Atom/Features/PBR/Lighting/LightingData.azsli> +#include <Atom/Features/PBR/Surfaces/EnhancedSurface.azsli> + +#include <Atom/Features/PBR/LightingUtils.azsli> +#include <Atom/Features/PBR/Microfacet/Brdf.azsli> + +// Then define the Diffuse and Specular lighting functions +float3 GetDiffuseLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight) +{ + float3 diffuse; + if(o_enableSubsurfaceScattering) + { + // Use diffuse brdf contains double Fresnel (enter/exit surface) terms if subsurface scattering is enabled + diffuse = NormalizedDisneyDiffuse(surface.albedo, surface.normal, lightingData.dirToCamera, dirToLight, surface.roughnessLinear); + } + else + { + diffuse = DiffuseLambertian(surface.albedo, surface.normal, dirToLight); + } + + if(o_clearCoat_feature_enabled) + { + // Attenuate diffuse term by clear coat's fresnel term to account for energy loss + float HdotV = saturate(dot(normalize(dirToLight + lightingData.dirToCamera), lightingData.dirToCamera)); + diffuse *= 1.0 - (FresnelSchlick(HdotV, 0.04) * surface.clearCoat.factor); + } + + diffuse *= lightIntensity; + return diffuse; +} + +float3 GetSpecularLighting(Surface surface, LightingData lightingData, const float3 lightIntensity, const float3 dirToLight) +{ + float3 specular; + if (o_enableAnisotropy) + { + specular = AnisotropicGGX( lightingData.dirToCamera, dirToLight, surface.normal, surface.anisotropy.tangent, surface.anisotropy.bitangent, surface.anisotropy.anisotropyFactors, + surface.specularF0, lightingData.NdotV, lightingData.multiScatterCompensation ); + } + else + { + specular = SpecularGGX(lightingData.dirToCamera, dirToLight, surface.normal, surface.specularF0, lightingData.NdotV, surface.roughnessA2, lightingData.multiScatterCompensation); + } + + if(o_clearCoat_feature_enabled) + { + float3 halfVector = normalize(dirToLight + lightingData.dirToCamera); + float NdotH = saturate(dot(surface.clearCoat.normal, halfVector)); + float NdotL = saturate(dot(surface.clearCoat.normal, dirToLight)); + float HdotL = saturate(dot(halfVector, dirToLight)); + + // HdotV = HdotL due to the definition of half vector + float3 clearCoatF = FresnelSchlick(HdotL, 0.04) * surface.clearCoat.factor; + float clearCoatRoughness = max(surface.clearCoat.roughness * surface.clearCoat.roughness, 0.0005f); + float3 clearCoatSpecular = ClearCoatGGX(NdotH, HdotL, NdotL, surface.clearCoat.normal, clearCoatRoughness, clearCoatF ); + + specular = specular * (1.0 - clearCoatF) * (1.0 - clearCoatF) + clearCoatSpecular; + } + + specular *= lightIntensity; + + return specular; +} + + +// Then include everything else +#include <Atom/Features/PBR/Lights/Lights.azsli> +#include <Atom/Features/PBR/Lights/Ibl.azsli> + + +struct PbrLightingOutput +{ + float4 m_diffuseColor; + float4 m_specularColor; + float4 m_albedo; + float4 m_specularF0; + float4 m_normal; + float3 m_scatterDistance; +}; + + +PbrLightingOutput GetPbrLightingOutput(Surface surface, LightingData lightingData, float alpha) +{ + PbrLightingOutput lightingOutput; + + lightingOutput.m_diffuseColor = float4(lightingData.diffuseLighting, alpha); + lightingOutput.m_specularColor = float4(lightingData.specularLighting, 1.0); + + // albedo, specularF0, roughness, and normals for later passes (specular IBL, Diffuse GI, SSR, AO, etc) + lightingOutput.m_specularF0 = float4(surface.specularF0, surface.roughnessLinear); + lightingOutput.m_albedo.rgb = surface.albedo * lightingData.diffuseResponse * lightingData.diffuseAmbientOcclusion; + lightingOutput.m_albedo.a = lightingData.specularOcclusion; + lightingOutput.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal); + lightingOutput.m_normal.a = o_specularF0_enableMultiScatterCompensation ? 1.0f : 0.0f; + + return lightingOutput; +} 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 aa5fa05bcf..37cae0acb1 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 @@ -47,8 +47,10 @@ class LightingData // Normal . View float NdotV; + // Occlusion factors // 0 = dark, 1 = light - float occlusion; + float diffuseAmbientOcclusion; + float specularOcclusion; void Init(float3 positionWS, float3 normal, float roughnessLinear); void CalculateMultiscatterCompensation(float3 specularF0, bool enabled); @@ -62,7 +64,8 @@ void LightingData::Init(float3 positionWS, float3 normal, float roughnessLinear) translucentBackLighting = 0; multiScatterCompensation = 1.0f; emissiveLighting = float3(0.0f, 0.0f, 0.0f); - occlusion = 1.0f; + diffuseAmbientOcclusion = 1.0f; + specularOcclusion = 1.0f; dirToCamera = normalize(ViewSrg::m_worldPosition.xyz - positionWS); @@ -79,6 +82,7 @@ void LightingData::CalculateMultiscatterCompensation(float3 specularF0, bool ena void LightingData::FinalizeLighting(float3 transmissionTint) { + specularLighting *= specularOcclusion; specularLighting += emissiveLighting; // Transmitted light diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/SkinLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/SkinLighting.azsli new file mode 100644 index 0000000000..9f18d43f8b --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/SkinLighting.azsli @@ -0,0 +1,106 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +// Include options first +#include <Atom/Features/PBR/LightingOptions.azsli> + +// Then include custom surface and lighting data types +#include <Atom/Features/PBR/Lighting/LightingData.azsli> +#include <Atom/Features/PBR/Surfaces/SkinSurface.azsli> + +#include <Atom/Features/PBR/LightingUtils.azsli> +#include <Atom/Features/PBR/Microfacet/Brdf.azsli> + +// Then define the Diffuse and Specular lighting functions +float3 GetDiffuseLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight) +{ + float3 diffuse; + if(o_enableSubsurfaceScattering) + { + // Use diffuse brdf contains double Fresnel (enter/exit surface) terms if subsurface scattering is enabled + diffuse = NormalizedDisneyDiffuse(surface.albedo, surface.normal, lightingData.dirToCamera, dirToLight, surface.roughnessLinear); + } + else + { + diffuse = DiffuseLambertian(surface.albedo, surface.normal, dirToLight); + } + + if(o_clearCoat_feature_enabled) + { + // Attenuate diffuse term by clear coat's fresnel term to account for energy loss + float HdotV = saturate(dot(normalize(dirToLight + lightingData.dirToCamera), lightingData.dirToCamera)); + diffuse *= 1.0 - (FresnelSchlick(HdotV, 0.04) * surface.clearCoat.factor); + } + + diffuse *= lightIntensity; + return diffuse; +} + +float3 GetSpecularLighting(Surface surface, LightingData lightingData, const float3 lightIntensity, const float3 dirToLight) +{ + float3 specular = SpecularGGX(lightingData.dirToCamera, dirToLight, surface.normal, surface.specularF0, lightingData.NdotV, surface.roughnessA2, lightingData.multiScatterCompensation); + + if(o_clearCoat_feature_enabled) + { + float3 halfVector = normalize(dirToLight + lightingData.dirToCamera); + float NdotH = saturate(dot(surface.clearCoat.normal, halfVector)); + float NdotL = saturate(dot(surface.clearCoat.normal, dirToLight)); + float HdotL = saturate(dot(halfVector, dirToLight)); + + // HdotV = HdotL due to the definition of half vector + float3 clearCoatF = FresnelSchlick(HdotL, 0.04) * surface.clearCoat.factor; + float clearCoatRoughness = max(surface.clearCoat.roughness * surface.clearCoat.roughness, 0.0005f); + float3 clearCoatSpecular = ClearCoatGGX(NdotH, HdotL, NdotL, surface.clearCoat.normal, clearCoatRoughness, clearCoatF ); + + specular = specular * (1.0 - clearCoatF) * (1.0 - clearCoatF) + clearCoatSpecular; + } + + specular *= lightIntensity; + + return specular; +} + + +// Then include everything else +#include <Atom/Features/PBR/Lights/Lights.azsli> +#include <Atom/Features/PBR/Lights/Ibl.azsli> + + +struct PbrLightingOutput +{ + float4 m_diffuseColor; + float4 m_specularColor; + float4 m_albedo; + float4 m_specularF0; + float4 m_normal; + float3 m_scatterDistance; +}; + + +PbrLightingOutput GetPbrLightingOutput(Surface surface, LightingData lightingData) +{ + PbrLightingOutput lightingOutput; + + lightingOutput.m_diffuseColor = float4(lightingData.diffuseLighting, 1.0f); + lightingOutput.m_specularColor = float4(lightingData.specularLighting, 1.0f); + + // albedo, specularF0, roughness, and normals for later passes (specular IBL, Diffuse GI, SSR, AO, etc) + lightingOutput.m_specularF0 = float4(surface.specularF0, surface.roughnessLinear); + lightingOutput.m_albedo.rgb = surface.albedo * lightingData.diffuseResponse * lightingData.diffuseAmbientOcclusion; + lightingOutput.m_albedo.a = lightingData.specularOcclusion; + lightingOutput.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal); + lightingOutput.m_normal.a = o_specularF0_enableMultiScatterCompensation ? 1.0f : 0.0f; + + return lightingOutput; +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli index 31fbbd2138..45aabeede4 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli @@ -19,6 +19,50 @@ #include <Atom/Features/PBR/Lighting/LightingData.azsli> #include <Atom/Features/PBR/Surfaces/StandardSurface.azsli> +#include <Atom/Features/PBR/LightingUtils.azsli> +#include <Atom/Features/PBR/Microfacet/Brdf.azsli> + +// Then define the Diffuse and Specular lighting functions +float3 GetDiffuseLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight) +{ + float3 diffuse = DiffuseLambertian(surface.albedo, surface.normal, dirToLight); + + if(o_clearCoat_feature_enabled) + { + // Attenuate diffuse term by clear coat's fresnel term to account for energy loss + float HdotV = saturate(dot(normalize(dirToLight + lightingData.dirToCamera), lightingData.dirToCamera)); + diffuse *= 1.0 - (FresnelSchlick(HdotV, 0.04) * surface.clearCoat.factor); + } + + diffuse *= lightIntensity; + return diffuse; +} + +float3 GetSpecularLighting(Surface surface, LightingData lightingData, const float3 lightIntensity, const float3 dirToLight) +{ + float3 specular = SpecularGGX(lightingData.dirToCamera, dirToLight, surface.normal, surface.specularF0, lightingData.NdotV, surface.roughnessA2, lightingData.multiScatterCompensation); + + if(o_clearCoat_feature_enabled) + { + float3 halfVector = normalize(dirToLight + lightingData.dirToCamera); + float NdotH = saturate(dot(surface.clearCoat.normal, halfVector)); + float NdotL = saturate(dot(surface.clearCoat.normal, dirToLight)); + float HdotL = saturate(dot(halfVector, dirToLight)); + + // HdotV = HdotL due to the definition of half vector + float3 clearCoatF = FresnelSchlick(HdotL, 0.04) * surface.clearCoat.factor; + float clearCoatRoughness = max(surface.clearCoat.roughness * surface.clearCoat.roughness, 0.0005f); + float3 clearCoatSpecular = ClearCoatGGX(NdotH, HdotL, NdotL, surface.clearCoat.normal, clearCoatRoughness, clearCoatF ); + + specular = specular * (1.0 - clearCoatF) * (1.0 - clearCoatF) + clearCoatSpecular; + } + + specular *= lightIntensity; + + return specular; +} + + // Then include everything else #include <Atom/Features/PBR/Lights/Lights.azsli> #include <Atom/Features/PBR/Lights/Ibl.azsli> @@ -31,7 +75,6 @@ struct PbrLightingOutput float4 m_albedo; float4 m_specularF0; float4 m_normal; - float4 m_clearCoatNormal; float3 m_scatterDistance; }; @@ -45,19 +88,22 @@ PbrLightingOutput GetPbrLightingOutput(Surface surface, LightingData lightingDat // albedo, specularF0, roughness, and normals for later passes (specular IBL, Diffuse GI, SSR, AO, etc) lightingOutput.m_specularF0 = float4(surface.specularF0, surface.roughnessLinear); - lightingOutput.m_albedo.rgb = surface.albedo * lightingData.diffuseResponse; - lightingOutput.m_albedo.a = lightingData.occlusion; + lightingOutput.m_albedo.rgb = surface.albedo * lightingData.diffuseResponse * lightingData.diffuseAmbientOcclusion; + lightingOutput.m_albedo.a = lightingData.specularOcclusion; lightingOutput.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal); lightingOutput.m_normal.a = o_specularF0_enableMultiScatterCompensation ? 1.0f : 0.0f; - // layout: (packedNormal.x, packedNormal.y, strength factor, clear coat roughness (not base material's roughness)) - lightingOutput.m_clearCoatNormal = float4(EncodeNormalSphereMap(surface.clearCoat.normal), o_clearCoat_feature_enabled ? surface.clearCoat.factor : 0.0, surface.clearCoat.roughness); - return lightingOutput; } +PbrLightingOutput DebugOutput(float3 color) +{ + PbrLightingOutput output = (PbrLightingOutput)0; + float defaultNormal = float3(0.0f, 0.0f, 1.0f); + output.m_diffuseColor = float4(color.rgb, 1.0f); + output.m_normal.rgb = EncodeNormalSignedOctahedron(defaultNormal); - - + return output; +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingModel.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingModel.azsli deleted file mode 100644 index 581ca2f172..0000000000 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingModel.azsli +++ /dev/null @@ -1,203 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include <Atom/Features/PBR/LightingOptions.azsli> - -#include <viewsrg.srgi> -#include <scenesrg.srgi> - -#include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli> - -#include <Atom/RPI/Math.azsli> -#include <Atom/RPI/TangentSpace.azsli> - -#include <Atom/Features/PBR/DefaultObjectSrg.azsli> -#include <Atom/Features/PBR/ForwardPassSrg.azsli> - -#include <Atom/Features/PBR/Lighting/StandardLighting.azsli> -#include <Atom/Features/PBR/Decals.azsli> - -// VSInput, VSOutput, ObjectSrg must be defined before including this file. - -// DEPRECATED: Please use the VertexHelper(...) function in VertexHelper.azsli instead. -//! @param skipShadowCoords can be useful for example when PixelDepthOffset is enable, because the pixel shader will have to run before the final world position is known -void PbrVsHelper(in VSInput IN, inout VSOutput OUT, float3 worldPosition, bool skipShadowCoords = false) -{ - OUT.m_worldPosition = worldPosition; - OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPosition, 1.0)); - - float4x4 objectToWorld = ObjectSrg::GetWorldMatrix(); - float3x3 objectToWorldIT = ObjectSrg::GetWorldMatrixInverseTranspose(); - - ConstructTBN(IN.m_normal, IN.m_tangent, IN.m_bitangent, objectToWorld, objectToWorldIT, OUT.m_normal, OUT.m_tangent, OUT.m_bitangent); - - // directional light shadow - const uint shadowIndex = ViewSrg::m_shadowIndexDirectionalLight; - if (o_enableShadows && !skipShadowCoords && shadowIndex < SceneSrg::m_directionalLightCount) - { - DirectionalLightShadow::GetShadowCoords( - shadowIndex, - worldPosition, - OUT.m_shadowCoords); - } -} - - -// DEPRECATED: Please use the functions in StandardLighting.azsli instead. -// For an example on how to use those functions, see StandardPBR_forwardPass.azsl -PbrLightingOutput PbrLighting( VSOutput IN, - float3 baseColor, - float metallic, - float roughness, - float specularF0Factor, - float3 normal, - float3 vtxTangent, - float3 vtxBitangent, - float2 anisotropy, // angle and factor - float3 emissive, - float occlusion, - float4 transmissionTintThickness, - float4 transmissionParams, - float clearCoatFactor, - float clearCoatRoughness, - float3 clearCoatNormal, - float alpha, - OpacityMode opacityMode) -{ - float3 worldPosition = IN.m_worldPosition; - float4 position = IN.m_position; - float3 shadowCoords[ViewSrg::MaxCascadeCount] = IN.m_shadowCoords; - - // ______________________________________________________________________________________________ - // Surface - - Surface surface; - - surface.position = worldPosition; - surface.normal = normal; - surface.roughnessLinear = roughness; - surface.transmission.tint = transmissionTintThickness.rgb; - surface.transmission.thickness = transmissionTintThickness.w; - surface.transmission.transmissionParams = transmissionParams; - surface.clearCoat.factor = clearCoatFactor; - surface.clearCoat.roughness = clearCoatRoughness; - surface.clearCoat.normal = clearCoatNormal; - - surface.CalculateRoughnessA(); - surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); - surface.anisotropy.Init(normal, vtxTangent, vtxBitangent, anisotropy.x, anisotropy.y, surface.roughnessA); - - // ______________________________________________________________________________________________ - // LightingData - - LightingData lightingData; - - // Light iterator - lightingData.tileIterator.Init(position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); - lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); - - lightingData.emissiveLighting = emissive; - lightingData.occlusion = occlusion; - - // Directional light shadow coordinates - lightingData.shadowCoords = shadowCoords; - - // manipulate base layer f0 if clear coat is enabled - if(o_clearCoat_feature_enabled) - { - // modify base layer's normal incidence reflectance - // for the derivation of the following equation please refer to: - // https://google.github.io/filament/Filament.md.html#materialsystem/clearcoatmodel/baselayermodification - float3 f0 = (1.0 - 5.0 * sqrt(surface.specularF0)) / (5.0 - sqrt(surface.specularF0)); - surface.specularF0 = lerp(surface.specularF0, f0 * f0, clearCoatFactor); - } - - // Diffuse and Specular response (used in IBL calculations) - lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); - lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; - - if(o_clearCoat_feature_enabled) - { - // Clear coat layer has fixed IOR = 1.5 and transparent => F0 = (1.5 - 1)^2 / (1.5 + 1)^2 = 0.04 - lightingData.diffuseResponse *= 1.0 - (FresnelSchlickWithRoughness(lightingData.NdotV, float3(0.04, 0.04, 0.04), surface.clearCoat.roughness) * surface.clearCoat.factor); - } - - // Multiscatter compensation factor - lightingData.CalculateMultiscatterCompensation(surface.specularF0, o_specularF0_enableMultiScatterCompensation); - - // ______________________________________________________________________________________________ - // Lighting - - // Apply Decals - ApplyDecals(lightingData.tileIterator, surface); - - // Apply Direct Lighting - ApplyDirectLighting(surface, lightingData); - - // Apply Image Based Lighting (IBL) - ApplyIBL(surface, lightingData); - - // Finalize Lighting - lightingData.FinalizeLighting(surface.transmission.tint); - - if (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent) - { - alpha = FresnelSchlickWithRoughness(lightingData.NdotV, alpha, surface.roughnessLinear).x; // Increase opacity at grazing angles. - } - - PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); - - return lightingOutput; -} - -//! Populates a PbrLightingOutput struct with values that can be used to render a simple debug color in the PBR pipeline. -//! Note that this will not give you a the exact color screen pixels since it is used in the PBR pipeline, it may -//! still have lighting or other affects applied on top of it. But this is still a convenient way to quickly get some -//! colors on screen. -//! @param IN the pixel shader input structure -//! @param debugColor the color to be drawn -//! @param normalWS world space normal vector -//! @return a PbrLightingOutput as returned by the main PbrLighting() function - -PbrLightingOutput MakeDebugOutput(VSOutput IN, float3 debugColor, float3 normalWS) -{ - // We happen to set this up initially using baseColor, but we could consider adding an option to use - // emissive instead to avoid depending on scene lighting. - const float3 baseColor = debugColor; - const float metallic = 0; - const float roughness = 1; - const float specularF0Factor = 0.5; - const float3 normal = normalWS; - const float3 emissive = {0,0,0}; - const float occlusion = 1; - const float clearCoatFactor = 0.0f; - const float clearCoatRoughness = 0.0f; - const float3 clearCoatNormal = {0,0,0}; - const float4 transmissionTintThickness = {0,0,0,0}; - const float4 transmissionParams = {0,0,0,0}; - const float2 anisotropy = 0.0; // Does not affect calculations unless 'o_enableAnisotropy' is enabled - const float alpha = 1.0; - - PbrLightingOutput lightingOutput = PbrLighting(IN, baseColor, metallic, roughness, specularF0Factor, - normal, IN.m_tangent, IN.m_bitangent, anisotropy, - emissive, occlusion, transmissionTintThickness, transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, OpacityMode::Opaque); - - return lightingOutput; -} - -//! Same as above, using the vertex normal -PbrLightingOutput MakeDebugOutput(VSOutput IN, float3 debugColor) -{ - return MakeDebugOutput(IN, debugColor, normalize(IN.m_normal)); -} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli index f08acd2684..7400005508 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli @@ -18,7 +18,11 @@ #include <Atom/Features/PBR/Lights/LightTypesCommon.azsli> #include <Atom/Features/PBR/LightingUtils.azsli> -void ApplyIblDiffuse(float3 normal, float3 albedo, float3 diffuseResponse, out float3 outDiffuse) +void ApplyIblDiffuse( + float3 normal, + float3 albedo, + float3 diffuseResponse, + out float3 outDiffuse) { float3 irradianceDir = MultiplyVectorQuaternion(normal, SceneSrg::m_iblOrientation); float3 diffuseSample = SceneSrg::m_diffuseEnvMap.Sample(SceneSrg::m_samplerEnv, GetCubemapCoords(irradianceDir)).rgb; @@ -26,10 +30,18 @@ void ApplyIblDiffuse(float3 normal, float3 albedo, float3 diffuseResponse, out f outDiffuse = diffuseResponse * albedo * diffuseSample; } -void ApplyIblSpecular(float3 position, float3 normal, float3 specularF0, float roughnessLinear, float3 specularResponse, float3 dirToCamera, float2 brdf, out float3 outSpecular) +void ApplyIblSpecular( + float3 position, + float3 normal, + float3 specularF0, + float roughnessLinear, + float3 dirToCamera, + float2 brdf, + out float3 outSpecular) { float3 reflectDir = reflect(-dirToCamera, normal); - + reflectDir = MultiplyVectorQuaternion(reflectDir, SceneSrg::m_iblOrientation); + // global outSpecular = SceneSrg::m_specularEnvMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(reflectDir), GetRoughnessMip(roughnessLinear)).rgb; outSpecular *= (specularF0 * brdf.x + brdf.y); @@ -70,13 +82,25 @@ void ApplyIBL(Surface surface, inout LightingData lightingData) if (o_enableIBL) { float3 iblDiffuse = 0.0f; + ApplyIblDiffuse( + surface.normal, + surface.albedo, + lightingData.diffuseResponse, + iblDiffuse); + float3 iblSpecular = 0.0f; - ApplyIblDiffuse(surface.normal, surface.albedo, lightingData.diffuseResponse, iblDiffuse); - ApplyIblSpecular(surface.position, surface.normal, surface.specularF0, surface.roughnessLinear, lightingData.specularResponse, lightingData.dirToCamera, lightingData.brdf, iblSpecular); + ApplyIblSpecular( + surface.position, + surface.normal, + surface.specularF0, + surface.roughnessLinear, + lightingData.dirToCamera, + lightingData.brdf, + iblSpecular); // Adjust IBL lighting by exposure. float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure); - lightingData.diffuseLighting += (iblDiffuse * iblExposureFactor * lightingData.occlusion); + lightingData.diffuseLighting += (iblDiffuse * iblExposureFactor * lightingData.diffuseAmbientOcclusion); lightingData.specularLighting += (iblSpecular * iblExposureFactor); } } @@ -85,7 +109,47 @@ void ApplyIBL(Surface surface, inout LightingData lightingData) if (o_enableIBL) { float3 iblSpecular = 0.0f; - ApplyIblSpecular(surface.position, surface.normal, surface.specularF0, surface.roughnessLinear, lightingData.specularResponse, lightingData.dirToCamera, lightingData.brdf, iblSpecular); + ApplyIblSpecular( + surface.position, + surface.normal, + surface.specularF0, + surface.roughnessLinear, + lightingData.dirToCamera, + lightingData.brdf, + iblSpecular); + + iblSpecular *= lightingData.multiScatterCompensation; + + if (o_clearCoat_feature_enabled) + { + if (surface.clearCoat.factor > 0.0f) + { + float clearCoatNdotV = saturate(dot(surface.clearCoat.normal, lightingData.dirToCamera)); + clearCoatNdotV = max(clearCoatNdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles. + float2 clearCoatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(surface.clearCoat.roughness, clearCoatNdotV)).rg; + + // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat + // coat layer assumed to be dielectric thus don't need multiple scattering compensation + float3 clearCoatSpecularF0 = float3(0.04f, 0.04f, 0.04f); + float3 clearCoatIblSpecular = 0.0f; + + ApplyIblSpecular( + surface.position, + surface.clearCoat.normal, + clearCoatSpecularF0, + surface.clearCoat.roughness, + lightingData.dirToCamera, + clearCoatBrdf, + clearCoatIblSpecular); + + clearCoatIblSpecular *= surface.clearCoat.factor; + + // attenuate base layer energy + float3 clearCoatResponse = FresnelSchlickWithRoughness(clearCoatNdotV, clearCoatSpecularF0, surface.clearCoat.roughness) * surface.clearCoat.factor; + iblSpecular = iblSpecular * (1.0 - clearCoatResponse) * (1.0 - clearCoatResponse) + clearCoatIblSpecular; + } + } + float iblExposureFactor = pow(2.0f, SceneSrg::m_iblExposure); lightingData.specularLighting += (iblSpecular * iblExposureFactor); 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 a668691b75..ac28000148 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 @@ -16,71 +16,9 @@ #include <Atom/Features/PBR/BackLighting.azsli> #include <Atom/Features/PBR/Hammersley.azsli> -#include <Atom/Features/PBR/LightingUtils.azsli> -#include <Atom/Features/PBR/Surface.azsli> -#include <Atom/Features/PBR/Microfacet/Brdf.azsli> option bool o_area_light_validation = false; -float3 GetDiffuseLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight) -{ - float3 diffuse; - if(o_enableSubsurfaceScattering) - { - // Use diffuse brdf contains double Fresnel (enter/exit surface) terms if subsurface scattering is enabled - diffuse = NormalizedDisneyDiffuse(surface.albedo, surface.normal, lightingData.dirToCamera, dirToLight, surface.roughnessLinear); - } - else - { - diffuse = DiffuseLambertian(surface.albedo, surface.normal, dirToLight); - } - - if(o_clearCoat_feature_enabled) - { - // Attenuate diffuse term by clear coat's fresnel term to account for energy loss - float HdotV = saturate(dot(normalize(dirToLight + lightingData.dirToCamera), lightingData.dirToCamera)); - diffuse *= 1.0 - (FresnelSchlick(HdotV, 0.04) * surface.clearCoat.factor); - } - - diffuse *= lightIntensity; - return diffuse; -} - -float3 GetSpecularLighting(Surface surface, LightingData lightingData, const float3 lightIntensity, const float3 dirToLight) -{ - float3 specular; - if (o_enableAnisotropy) - { - //AnisotropicGGX( float3 dirToCamera, float3 dirToLight, float3 normal, float3 tangent, float3 bitangent, float2 anisotropyFactors, - // float3 specularF0, float NdotV, float multiScatterCompensation ) - - specular = AnisotropicGGX( lightingData.dirToCamera, dirToLight, surface.normal, surface.anisotropy.tangent, surface.anisotropy.bitangent, surface.anisotropy.anisotropyFactors, - surface.specularF0, lightingData.NdotV, lightingData.multiScatterCompensation ); - } - else - { - specular = SpecularGGX(lightingData.dirToCamera, dirToLight, surface.normal, surface.specularF0, lightingData.NdotV, surface.roughnessA2, lightingData.multiScatterCompensation); - } - - if(o_clearCoat_feature_enabled) - { - float3 halfVector = normalize(dirToLight + lightingData.dirToCamera); - float NdotH = saturate(dot(surface.clearCoat.normal, halfVector)); - float NdotL = saturate(dot(surface.clearCoat.normal, dirToLight)); - float HdotL = saturate(dot(halfVector, dirToLight)); - - // HdotV = HdotL due to the definition of half vector - float3 clearCoatF = FresnelSchlick(HdotL, 0.04) * surface.clearCoat.factor; - float clearCoatRoughness = max(surface.clearCoat.roughness * surface.clearCoat.roughness, 0.0005f); - float3 clearCoatSpecular = ClearCoatGGX(NdotH, HdotL, NdotL, surface.clearCoat.normal, clearCoatRoughness, clearCoatF ); - - specular = specular * (1.0 - clearCoatF) * (1.0 - clearCoatF) + clearCoatSpecular; - } - - specular *= lightIntensity; - - return specular; -} //! Adjust the intensity of specular light based on the radius of the light source and roughness of the surface to approximate energy conservation. float GetIntensityAdjustedByRadiusAndRoughness(float roughnessA, float radius, float distance2) diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Microfacet/Brdf.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Microfacet/Brdf.azsli index fa60e9485d..0f6c16f619 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Microfacet/Brdf.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Microfacet/Brdf.azsli @@ -18,7 +18,6 @@ * rather than transmit. **/ -#include <Atom/Features/PBR/Surface.azsli> #include <Atom/RPI/Math.azsli> #include "Ggx.azsli" #include "Fresnel.azsli" @@ -81,9 +80,6 @@ float3 DiffuseTitanfall(float roughnessA, float3 albedo, float3 normal, float3 d } - - - // ------- Specular Lighting ------- //! Computes specular response from surfaces with microgeometry. The common form for microfacet diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surface.azsli deleted file mode 100644 index 104eaf140e..0000000000 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surface.azsli +++ /dev/null @@ -1,68 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -// //! The surface struct should contain all the info for a pixel that can be -// //! passed onto the rendering logic for shading. -// //! Note that metallic workflow can be supported by first converting to these physical properties first. -// struct Surface -// { -// float3 position; -// float3 normal; -// float3 tangentAniso; //! surface space tangent for anisotropic use -// float3 bitangentAniso; //! surface space bitangent for anisotropic use -// float2 anisotropyFactors; //! anisotory factors along the tangent and the bitangent directions -// float3 albedo; -// float3 specularF0; //!< actual fresnel f0 spectral value of the surface (as opposed to a "factor") -// float3 multiScatterCompensation; //!< the constant scaling term to approximate multiscattering contribution in specular BRDF -// float roughnessLinear; //!< perceptually linear roughness value authored by artists. Must be remapped to roughnessA before use -// float roughnessA; //!< actual roughness value ( a.k.a. "alpha roughness") to be used in microfacet calculations -// 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) -// float clearCoatFactor; //!< clear coat strength factor -// float clearCoatRoughness; //!< clear coat linear roughness (not base layer one) -// float3 clearCoatNormal; //!< normal used for top layer clear coat -// }; -// -// //! Calculate and fill the data required for fast directional anisotropty surface response. -// //! Assumption: the normal and roughnessA surface properties were filled and are valid -// //! Notice that since the newly created surface tangent and bitangent will be rotated -// //! according to the anisotropy direction and should not be used for other purposes uness -// //! rotated back. -// void CalculateSurfaceDirectionalAnisotropicData( -// inout Surface surface, float2 anisotropyAngleAndFactor, -// float3 vtxTangent, float3 vtxBitangent ) -// { -// const float anisotropyAngle = anisotropyAngleAndFactor.x; -// const float anisotropyFactor = anisotropyAngleAndFactor.y; -// -// surface.anisotropyFactors = max( 0.01, -// float2( surface.roughnessA * (1.0 + anisotropyFactor), -// surface.roughnessA * (1.0 - anisotropyFactor) ) -// ); -// -// if (anisotropyAngle > 0.01) -// { -// // Base rotation according to anisotropic main direction -// float aniSin, aniCos; -// sincos(anisotropyAngle, aniSin, aniCos); -// -// // Rotate the vertex tangent to get new aligned to surface normal tangent -// vtxTangent = aniCos * vtxTangent - aniSin * vtxBitangent; -// } -// -// // Now create the new surface base according to the surface normal -// // If rotation was required it was already applied to the tangent, hence to the bitangent -// surface.bitangentAniso = normalize(cross(surface.normal, vtxTangent)); -// surface.tangentAniso = cross(surface.bitangentAniso, surface.normal); -// } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli index da4c44e1d8..ecb2a2f09b 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli @@ -43,7 +43,7 @@ class BasePbrSurfaceData void CalculateRoughnessA(); //! Sets albedo and specularF0 using metallic workflow - void SetAlbedoAndSpecularF0(float3 baseColor, float inSpecularF0, float metallic); + void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic); }; // ------- Functions ------- @@ -63,6 +63,9 @@ void BasePbrSurfaceData::ApplySpecularAA() float kernelRoughnessA2 = min(2.0 * variance , varianceThresh ); float filteredRoughnessA2 = saturate ( roughnessA2 + kernelRoughnessA2 ); roughnessA2 = filteredRoughnessA2; + + roughnessA = sqrt(roughnessA2); + roughnessLinear = sqrt(roughnessA); } void BasePbrSurfaceData::CalculateRoughnessA() @@ -82,9 +85,9 @@ void BasePbrSurfaceData::CalculateRoughnessA() } } -void BasePbrSurfaceData::SetAlbedoAndSpecularF0(float3 baseColor, float inSpecularF0, float metallic) +void BasePbrSurfaceData::SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic) { - float3 dielectricSpecularF0 = MaxDielectricSpecularF0 * inSpecularF0; + float3 dielectricSpecularF0 = MaxDielectricSpecularF0 * specularF0Factor; // Compute albedo and specularF0 based on metalness albedo = lerp(baseColor, float3(0.0f, 0.0f, 0.0f), metallic); diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli index c0fc626075..71f0d8a0e8 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli @@ -17,4 +17,13 @@ class ClearCoatSurfaceData float factor; //!< clear coat strength factor float roughness; //!< clear coat linear roughness (not base layer one) float3 normal; //!< normal used for top layer clear coat + + void InitializeToZero(); }; + +void ClearCoatSurfaceData::InitializeToZero() +{ + factor = 0.0f; + roughness = 0.0f; + normal = float3(0.0f, 0.0f, 0.0f); +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/EnhancedSurface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/EnhancedSurface.azsli new file mode 100644 index 0000000000..baa50436dc --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/EnhancedSurface.azsli @@ -0,0 +1,90 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <Atom/Features/PBR/Surfaces/AnisotropicSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli> + +class Surface +{ + AnisotropicSurfaceData anisotropy; + ClearCoatSurfaceData clearCoat; + TransmissionSurfaceData transmission; + + // ------- BasePbrSurfaceData ------- + + float3 position; //!< Position in world-space + float3 normal; //!< Normal in world-space + float3 albedo; //!< Albedo color of the non-metallic material, will be multiplied against the diffuse lighting value + float3 specularF0; //!< Fresnel f0 spectral value of the surface + float roughnessLinear; //!< Perceptually linear roughness value authored by artists. Must be remapped to roughnessA before use + float roughnessA; //!< Actual roughness value ( a.k.a. "alpha roughness") to be used in microfacet calculations + float roughnessA2; //!< Alpha roughness ^ 2 (i.e. roughnessA * roughnessA), used in GGX, cached here for perfromance + + //! Applies specular anti-aliasing to roughnessA2 + void ApplySpecularAA(); + + //! Calculates roughnessA and roughnessA2 after roughness has been set + void CalculateRoughnessA(); + + //! Sets albedo and specularF0 using metallic workflow + void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic); + +}; + + +// Specular Anti-Aliasing technique from this paper: +// http://www.jp.square-enix.com/tech/library/pdf/ImprovedGeometricSpecularAA.pdf +void Surface::ApplySpecularAA() +{ + // Constants for formula below + const float screenVariance = 0.25f; + const float varianceThresh = 0.18f; + + // Specular Anti-Aliasing + float3 dndu = ddx_fine( normal ); + float3 dndv = ddy_fine( normal ); + float variance = screenVariance * (dot( dndu , dndu ) + dot( dndv , dndv )); + float kernelRoughnessA2 = min(2.0 * variance , varianceThresh ); + float filteredRoughnessA2 = saturate ( roughnessA2 + kernelRoughnessA2 ); + roughnessA2 = filteredRoughnessA2; +} + +void Surface::CalculateRoughnessA() +{ + // The roughness value in microfacet calculations (called "alpha" in the literature) does not give perceptually + // linear results. Disney found that squaring the roughness value before using it in microfacet equations causes + // the user-provided roughness parameter to be more perceptually linear. We keep both values available as some + // equations need roughnessLinear (i.e. IBL sampling) while others need roughnessA (i.e. GGX equations). + // See Burley's Disney PBR: https://pdfs.semanticscholar.org/eeee/3b125c09044d3e2f58ed0e4b1b66a677886d.pdf + + roughnessA = max(roughnessLinear * roughnessLinear, MinRoughnessA); + + roughnessA2 = roughnessA * roughnessA; + if(o_applySpecularAA) + { + ApplySpecularAA(); + } +} + +void Surface::SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic) +{ + float3 dielectricSpecularF0 = MaxDielectricSpecularF0 * specularF0Factor; + + // Compute albedo and specularF0 based on metalness + albedo = lerp(baseColor, float3(0.0f, 0.0f, 0.0f), metallic); + specularF0 = lerp(dielectricSpecularF0, baseColor, metallic); +} + diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/SkinSurface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/SkinSurface.azsli new file mode 100644 index 0000000000..44a502b1b7 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/SkinSurface.azsli @@ -0,0 +1,86 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <Atom/Features/PBR/Surfaces/AnisotropicSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli> +#include <Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli> + +class Surface +{ + ClearCoatSurfaceData clearCoat; + TransmissionSurfaceData transmission; + + // ------- BasePbrSurfaceData ------- + + float3 position; //!< Position in world-space + float3 normal; //!< Normal in world-space + float3 albedo; //!< Albedo color of the non-metallic material, will be multiplied against the diffuse lighting value + float3 specularF0; //!< Fresnel f0 spectral value of the surface + float roughnessLinear; //!< Perceptually linear roughness value authored by artists. Must be remapped to roughnessA before use + float roughnessA; //!< Actual roughness value ( a.k.a. "alpha roughness") to be used in microfacet calculations + float roughnessA2; //!< Alpha roughness ^ 2 (i.e. roughnessA * roughnessA), used in GGX, cached here for perfromance + + //! Applies specular anti-aliasing to roughnessA2 + void ApplySpecularAA(); + + //! Calculates roughnessA and roughnessA2 after roughness has been set + void CalculateRoughnessA(); + + //! Sets albedo and specularF0 using metallic workflow + void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor); + +}; + + +// Specular Anti-Aliasing technique from this paper: +// http://www.jp.square-enix.com/tech/library/pdf/ImprovedGeometricSpecularAA.pdf +void Surface::ApplySpecularAA() +{ + // Constants for formula below + const float screenVariance = 0.25f; + const float varianceThresh = 0.18f; + + // Specular Anti-Aliasing + float3 dndu = ddx_fine( normal ); + float3 dndv = ddy_fine( normal ); + float variance = screenVariance * (dot( dndu , dndu ) + dot( dndv , dndv )); + float kernelRoughnessA2 = min(2.0 * variance , varianceThresh ); + float filteredRoughnessA2 = saturate ( roughnessA2 + kernelRoughnessA2 ); + roughnessA2 = filteredRoughnessA2; +} + +void Surface::CalculateRoughnessA() +{ + // The roughness value in microfacet calculations (called "alpha" in the literature) does not give perceptually + // linear results. Disney found that squaring the roughness value before using it in microfacet equations causes + // the user-provided roughness parameter to be more perceptually linear. We keep both values available as some + // equations need roughnessLinear (i.e. IBL sampling) while others need roughnessA (i.e. GGX equations). + // See Burley's Disney PBR: https://pdfs.semanticscholar.org/eeee/3b125c09044d3e2f58ed0e4b1b66a677886d.pdf + + roughnessA = max(roughnessLinear * roughnessLinear, MinRoughnessA); + + roughnessA2 = roughnessA * roughnessA; + if(o_applySpecularAA) + { + ApplySpecularAA(); + } +} + +void Surface::SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor) +{ + albedo = baseColor; + specularF0 = MaxDielectricSpecularF0 * specularF0Factor; +} + diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli index 9d4163c474..bb63d27df0 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli @@ -17,10 +17,8 @@ #include <Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli> #include <Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli> -class Surface //: BasePbrSurfaceData +class Surface { - //BasePbrSurfaceData pbr; - AnisotropicSurfaceData anisotropy; ClearCoatSurfaceData clearCoat; TransmissionSurfaceData transmission; @@ -41,7 +39,7 @@ class Surface //: BasePbrSurfaceData void CalculateRoughnessA(); //! Sets albedo and specularF0 using metallic workflow - void SetAlbedoAndSpecularF0(float3 baseColor, float inSpecularF0, float metallic); + void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic); }; @@ -80,9 +78,9 @@ void Surface::CalculateRoughnessA() } } -void Surface::SetAlbedoAndSpecularF0(float3 baseColor, float inSpecularF0, float metallic) +void Surface::SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic) { - float3 dielectricSpecularF0 = MaxDielectricSpecularF0 * inSpecularF0; + float3 dielectricSpecularF0 = MaxDielectricSpecularF0 * specularF0Factor; // Compute albedo and specularF0 based on metalness albedo = lerp(baseColor, float3(0.0f, 0.0f, 0.0f), metallic); 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 987e4ea575..cff91d5180 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 @@ -17,4 +17,13 @@ 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) + + void InitializeToZero(); }; + +void TransmissionSurfaceData::InitializeToZero() +{ + tint = float3(0.0f, 0.0f, 0.0f); + thickness = 0.0f; + transmissionParams = float4(0.0f, 0.0f, 0.0f, 0.0f); +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Vertex/VertexHelper.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Vertex/VertexHelper.azsli index 24cca8dc87..eaac9d82df 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Vertex/VertexHelper.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Vertex/VertexHelper.azsli @@ -13,7 +13,9 @@ #pragma once // ------------------------------------------------------------------------------ -// NOTE: VSInput, VSOutput, ObjectSrg must be defined before including this file. +// NOTE: The following must be included or defined before including this file: +// - VSInput - ObjectSrg +// - VSOutput - PassSrg // --------------------------------------------------------------------------------- // Options @@ -23,8 +25,6 @@ #include <viewsrg.srgi> #include <scenesrg.srgi> #include <Atom/RPI/ShaderResourceGroups/DefaultDrawSrg.azsli> -#include <Atom/Features/PBR/DefaultObjectSrg.azsli> -#include <Atom/Features/PBR/ForwardPassSrg.azsli> // Math #include <Atom/RPI/Math.azsli> @@ -33,7 +33,6 @@ // Shadow Coords #include <Atom/Features/Shadow/DirectionalLightShadow.azsli> - //! @param skipShadowCoords can be useful for example when PixelDepthOffset is enable, because the pixel shader will have to run before the final world position is known void VertexHelper(in VSInput IN, inout VSOutput OUT, float3 worldPosition, bool skipShadowCoords = false) { diff --git a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/RayTracingSceneSrg.azsli b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/RayTracingSceneSrg.azsli index 2025e3b81b..0aeb43bcf2 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/RayTracingSceneSrg.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/RayTracingSceneSrg.azsli @@ -18,7 +18,7 @@ partial ShaderResourceGroup RayTracingSceneSrg { RaytracingAccelerationStructure m_scene; - // directional Lights + // directional lights struct DirectionalLight { float3 m_direction; @@ -30,7 +30,33 @@ partial ShaderResourceGroup RayTracingSceneSrg StructuredBuffer<DirectionalLight> m_directionalLights; uint m_directionalLightCount; - // point Lights + // simple point lights + struct SimplePointLight + { + float3 m_position; + float m_invAttenuationRadiusSquared; // For a radius at which this light no longer has an effect, 1 / radius^2. + float3 m_rgbIntensityCandelas; + float m_padding; // explicit padding. + }; + + StructuredBuffer<SimplePointLight> m_simplePointLights; + uint m_simplePointLightCount; + + // simple spot lights + struct SimpleSpotLight + { + float3 m_position; + float m_invAttenuationRadiusSquared; // For a radius at which this light no longer has an effect, 1 / radius^2. + float3 m_direction; + float m_cosInnerConeAngle; // cosine of the outer cone angle + float3 m_rgbIntensityCandelas; + float m_cosOuterConeAngle; // cosine of the inner cone angle + }; + + StructuredBuffer<SimpleSpotLight> m_simpleSpotLights; + uint m_simpleSpotLightCount; + + // point lights (sphere) struct PointLight { float3 m_position; @@ -42,7 +68,7 @@ partial ShaderResourceGroup RayTracingSceneSrg StructuredBuffer<PointLight> m_pointLights; uint m_pointLightCount; - // disk Lights + // disk lights struct DiskLight { float3 m_position; @@ -60,7 +86,7 @@ partial ShaderResourceGroup RayTracingSceneSrg StructuredBuffer<DiskLight> m_diskLights; uint m_diskLightCount; - // capsule Lights + // capsule lights struct CapsuleLight { float3 m_startPoint; // one of the end points of the capsule @@ -74,7 +100,7 @@ partial ShaderResourceGroup RayTracingSceneSrg StructuredBuffer<CapsuleLight> m_capsuleLights; uint m_capsuleLightCount; - // quad Lights + // quad lights struct QuadLight { float3 m_position; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObject.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObject.azsl index e99b2641b8..ef021cae01 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObject.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObject.azsl @@ -55,4 +55,4 @@ PSOutput MainPS() PSOutput OUT; OUT.m_color = ObjectSrg::m_color; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObjectLit.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObjectLit.azsl index 88caf8be78..5949066a0d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObjectLit.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/AuxGeom/AuxGeomObjectLit.azsl @@ -73,4 +73,4 @@ PSOutput MainPS(VSOutput input) OUT.m_color.a = ObjectSrg::m_color.a; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.azsl index 3ebd916ee5..35330637e4 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.azsl @@ -77,4 +77,4 @@ void MainCS(uint3 dispatch_id: SV_DispatchThreadID) uint2 outTexel = uint2(dispatch_id.x, (textureSize - 1) - dispatch_id.y); PassSrg::m_outputTexture[outTexel] = float2(A, B); -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.shader index 2fa477eae7..50ce945edd 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/BRDFTexture/BRDFTextureCS.shader @@ -11,4 +11,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.azsl index d16f4d56c4..7e2c01583b 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.azsl @@ -461,4 +461,4 @@ void MainCS(uint3 dispatchThreadID : SV_DispatchThreadID) } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.shader index b45ea0633d..f21f3e5c01 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Checkerboard/CheckerboardColorResolveCS.shader @@ -16,4 +16,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPass.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPass.shader index 01f7914433..fe76eb06cb 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPass.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPass.shader @@ -10,4 +10,4 @@ }, "DrawList" : "depth" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMax.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMax.shader index 622fb6e1cf..a56959e357 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMax.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMax.shader @@ -14,4 +14,4 @@ }, "DrawList" : "depthTransparentMax" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMin.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMin.shader index 3188e4d9b4..709e467479 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMin.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Depth/DepthPassTransparentMin.shader @@ -12,4 +12,4 @@ }, "DrawList" : "depthTransparentMin" -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.azsl index 9b4e703f89..b3b26c4d42 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.azsl @@ -24,7 +24,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass Texture2DMS<float4> m_downsampledProbeIrradiance; Texture2DMS<float> m_downsampledDepth; Texture2DMS<float4> m_downsampledNormal; - Texture2DMS<float4> m_albedo; // RGB8 = Albedo, A = Occlusion + Texture2DMS<float4> m_albedo; // RGB8 = Albedo with pre-multiplied factors, A = Unused here Texture2DMS<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags Texture2DMS<float> m_depth; @@ -118,7 +118,7 @@ float3 SampleProbeIrradiance(uint sampleIndex, uint2 probeIrradianceCoords, floa } // retrieve irradiance from the global IBL diffuse cubemap -float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal, float3 albedo) +float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal) { uint2 dimensions; uint samples; @@ -160,23 +160,19 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) float4 encodedNormal = PassSrg::m_normal.Load(screenCoords, sampleIndex); float3 normal = DecodeNormalSignedOctahedron(encodedNormal.rgb); float4 albedo = PassSrg::m_albedo.Load(screenCoords, sampleIndex); - float occlusion = albedo.a; float useProbeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(probeIrradianceCoords, sampleIndex).a; float3 diffuse = float3(0.0f, 0.0f, 0.0f); if (useProbeIrradiance > 0.0f) { float3 irradiance = SampleProbeIrradiance(sampleIndex, probeIrradianceCoords, depth, normal, albedo, ImageScale); - diffuse = (albedo.rgb / PI) * irradiance * occlusion; + diffuse = (albedo.rgb / PI) * irradiance; } else { - float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal, albedo); + float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal); diffuse = albedo * irradiance; - // apply ambient occlusion to indirect diffuse - diffuse *= occlusion; - // adjust IBL lighting by exposure. float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure); diffuse *= iblExposureFactor; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.shader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.shader index fe2414de0e..f074dcb0dd 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite.shader @@ -15,11 +15,11 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x80", "WriteMask" : "0x00", "FrontFace" : { - "Func" : "LessEqual", + "Func" : "Equal", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Keep" diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl index 74571b5c6a..a5d761d815 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.azsl @@ -27,7 +27,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass Texture2D<float4> m_downsampledProbeIrradiance; Texture2D<float> m_downsampledDepth; Texture2D<float4> m_downsampledNormal; - Texture2D<float4> m_albedo; // RGB8 = Albedo, A = Occlusion + Texture2D<float4> m_albedo; // RGB8 = Albedo with pre-multiplied factors, A = Unused here Texture2D<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags Texture2D<float> m_depth; @@ -121,7 +121,7 @@ float3 SampleProbeIrradiance(uint2 probeIrradianceCoords, float depth, float3 no } // retrieve irradiance from the global IBL diffuse cubemap -float3 SampleGlobalIBL(uint2 screenCoords, float depth, float3 normal, float3 albedo) +float3 SampleGlobalIBL(uint2 screenCoords, float depth, float3 normal) { uint2 dimensions; PassSrg::m_depth.GetDimensions(dimensions.x, dimensions.y); @@ -162,23 +162,19 @@ PSOutput MainPS(VSOutput IN) float4 encodedNormal = PassSrg::m_normal.Load(int3(screenCoords, 0)); float3 normal = DecodeNormalSignedOctahedron(encodedNormal.rgb); float4 albedo = PassSrg::m_albedo.Load(int3(screenCoords, 0)); - float occlusion = albedo.a; float useProbeIrradiance = PassSrg::m_downsampledProbeIrradiance.Load(int3(probeIrradianceCoords,0)).a; float3 diffuse = float3(0.0f, 0.0f, 0.0f); if (useProbeIrradiance > 0.0f) { float3 irradiance = SampleProbeIrradiance(probeIrradianceCoords, depth, normal, albedo, ImageScale); - diffuse = (albedo.rgb / PI) * irradiance * occlusion; + diffuse = (albedo.rgb / PI) * irradiance; } else { - float3 irradiance = SampleGlobalIBL(screenCoords, depth, normal, albedo); + float3 irradiance = SampleGlobalIBL(screenCoords, depth, normal); diffuse = albedo * irradiance; - // apply ambient occlusion to indirect diffuse - diffuse *= occlusion; - // adjust IBL lighting by exposure. float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure); diffuse *= iblExposureFactor; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.shader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.shader index 99d46124c4..76b64b6a19 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseComposite_nomsaa.shader @@ -15,11 +15,11 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x80", "WriteMask" : "0x00", "FrontFace" : { - "Func" : "LessEqual", + "Func" : "Equal", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Keep" diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.azsl index d6a0de8159..dbc134d2ff 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.azsl @@ -21,7 +21,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass { - Texture2DMS<float4> m_albedo; // RGB8 = Albedo, A = Occlusion + Texture2DMS<float4> m_albedo; // RGB8 = Albedo with pre-multiplied factors, A = Unused here Texture2DMS<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags Texture2DMS<float> m_depth; } @@ -41,7 +41,7 @@ VSOutput MainVS(VSInput input) } // retrieve irradiance from the global IBL diffuse cubemap -float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal, float3 albedo) +float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal) { uint2 dimensions; uint samples; @@ -76,14 +76,10 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) float4 encodedNormal = PassSrg::m_normal.Load(screenCoords, sampleIndex); float3 normal = DecodeNormalSignedOctahedron(encodedNormal.rgb); float4 albedo = PassSrg::m_albedo.Load(screenCoords, sampleIndex); - float occlusion = albedo.a; - float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal, albedo); + float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal); float3 diffuse = albedo * irradiance; - // apply ambient occlusion to indirect diffuse - diffuse *= occlusion; - // adjust IBL lighting by exposure. float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure); diffuse *= iblExposureFactor; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.shader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.shader index c6844467a3..06967548bb 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen.shader @@ -15,11 +15,11 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x80", "WriteMask" : "0x00", "FrontFace" : { - "Func" : "LessEqual", + "Func" : "Equal", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Keep" diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.azsl index fe3523210a..803046efd4 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.azsl @@ -24,7 +24,7 @@ ShaderResourceGroup PassSrg : SRG_PerPass { - Texture2D<float4> m_albedo; // RGB8 = Albedo, A = Occlusion + Texture2D<float4> m_albedo; // RGB8 = Albedo with pre-multiplied factors, A = Unused here Texture2D<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags Texture2D<float> m_depth; } @@ -44,7 +44,7 @@ VSOutput MainVS(VSInput input) } // retrieve irradiance from the global IBL diffuse cubemap -float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal, float3 albedo) +float3 SampleGlobalIBL(uint sampleIndex, uint2 screenCoords, float depth, float3 normal) { uint2 dimensions; PassSrg::m_depth.GetDimensions(dimensions.x, dimensions.y); @@ -78,14 +78,10 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) float4 encodedNormal = PassSrg::m_normal.Load(int3(screenCoords, 0)); float3 normal = DecodeNormalSignedOctahedron(encodedNormal.rgb); float4 albedo = PassSrg::m_albedo.Load(int3(screenCoords, 0)); - float occlusion = albedo.a; - float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal, albedo); + float3 irradiance = SampleGlobalIBL(sampleIndex, screenCoords, depth, normal); float3 diffuse = albedo * irradiance; - // apply ambient occlusion to indirect diffuse - diffuse *= occlusion; - // adjust IBL lighting by exposure. float iblExposureFactor = pow(2.0, SceneSrg::m_iblExposure); diffuse *= iblExposureFactor; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.shader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.shader index 3425716e49..c8aba3e4a7 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseGlobalFullscreen_nomsaa.shader @@ -15,11 +15,11 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x80", "WriteMask" : "0x00", "FrontFace" : { - "Func" : "LessEqual", + "Func" : "Equal", "DepthFailOp" : "Keep", "FailOp" : "Keep", "PassOp" : "Keep" diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendDistance.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendDistance.precompiledshader index db98b37366..ff862d587f 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendDistance.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendDistance.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendIrradiance.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendIrradiance.precompiledshader index 2395d79e91..fa2f9db810 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendIrradiance.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBlendIrradiance.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateColumn.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateColumn.precompiledshader index 9a6d4cc55d..1c8c4852c4 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateColumn.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateColumn.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateRow.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateRow.precompiledshader index c8201df41b..fd99d34541 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateRow.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridBorderUpdateRow.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridClassification.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridClassification.precompiledshader new file mode 100644 index 0000000000..e7b15190e5 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridClassification.precompiledshader @@ -0,0 +1,32 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "PrecompiledShaderAssetSourceData", + "ClassData": + { + "ShaderAssetFileName": "diffuseprobegridclassification.azshader", + "PlatformIdentifiers": + [ + "pc" + ], + "ShaderResourceGroupAssets": + [ + "diffuseprobegridclassification_passsrg.azsrg" + ], + "RootShaderVariantAssets": + [ + { + "APIName": "dx12", + "RootShaderVariantAssetFileName": "diffuseprobegridclassification_dx12_0.azshadervariant" + }, + { + "APIName": "vulkan", + "RootShaderVariantAssetFileName": "diffuseprobegridclassification_vulkan_0.azshadervariant" + }, + { + "APIName": "null", + "RootShaderVariantAssetFileName": "diffuseprobegridclassification_null_0.azshadervariant" + } + ] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracing.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracing.precompiledshader index 6040239317..5826fc086f 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracing.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracing.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingClosestHit.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingClosestHit.precompiledshader index e9cbab9298..fc99fb97a1 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingClosestHit.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingClosestHit.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingMiss.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingMiss.precompiledshader index a24b9132d2..75db2ce8c1 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingMiss.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRayTracingMiss.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRelocation.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRelocation.precompiledshader index 676dc59faa..05c3c7d87a 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRelocation.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRelocation.precompiledshader @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRender.precompiledshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRender.precompiledshader index 2c12dd3f4c..e8249fa178 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRender.precompiledshader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/DiffuseProbeGridRender.precompiledshader @@ -30,4 +30,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance.azshader index ae07080eba..4a5edc370b 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_dx12_0.azshadervariant index dbd3c9ee71..e362a352c2 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_null_0.azshadervariant index 575eb94769..17b4f0c3cb 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_passsrg.azsrg index c050a315a1..14b61f9e93 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_passsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_passsrg.azsrg @@ -136,6 +136,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -203,6 +241,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -221,7 +279,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -318,6 +376,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -2691,7 +2777,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "10722138557170830784" + "value": "13399614758886099705" } ] } @@ -2818,6 +2904,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -2885,6 +3009,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -2903,7 +3047,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -3000,6 +3144,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -5373,7 +5545,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "10722138557170830784" + "value": "13399614758886099705" } ] } @@ -5500,6 +5672,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -5567,6 +5777,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -5585,7 +5815,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -5682,6 +5912,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -5766,7 +6024,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5798,7 +6056,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5830,7 +6088,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5862,7 +6120,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5894,7 +6152,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5926,7 +6184,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5958,7 +6216,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5990,7 +6248,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6022,7 +6280,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6054,7 +6312,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6086,7 +6344,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6118,7 +6376,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6150,7 +6408,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6182,7 +6440,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6214,7 +6472,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6246,7 +6504,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6278,7 +6536,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6310,7 +6568,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6342,7 +6600,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6374,7 +6632,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6406,7 +6664,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6438,7 +6696,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6470,7 +6728,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6502,7 +6760,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6534,7 +6792,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6566,7 +6824,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6598,7 +6856,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6630,7 +6888,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -8011,7 +8269,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "2959428625184507101" + "value": "8603598590297091788" } ] } @@ -8055,7 +8313,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "6463331605863849001" + "value": "6181996982157220722" } ] } @@ -8068,4 +8326,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_vulkan_0.azshadervariant index d2fa9789ef..8ed12bf81c 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblenddistance_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance.azshader index 3eb4955132..f0bfc085cb 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_dx12_0.azshadervariant index 4ce4dbbe63..c51aec01bb 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_null_0.azshadervariant index 594cb48e02..912946db79 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_passsrg.azsrg index 062882a45b..0ffa18808f 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_passsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_passsrg.azsrg @@ -136,6 +136,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -203,6 +241,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -221,7 +279,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -318,6 +376,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -2691,7 +2777,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "2253369087368484601" + "value": "4760130259633911968" } ] } @@ -2818,6 +2904,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -2885,6 +3009,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -2903,7 +3047,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -3000,6 +3144,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -5373,7 +5545,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "2253369087368484601" + "value": "4760130259633911968" } ] } @@ -5500,6 +5672,44 @@ "value": "1" } ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] } ] }, @@ -5567,6 +5777,26 @@ "value": "2" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] } ] }, @@ -5585,7 +5815,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -5682,6 +5912,34 @@ ] } ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] } ] } @@ -5766,7 +6024,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5798,7 +6056,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5830,7 +6088,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5862,7 +6120,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5894,7 +6152,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5926,7 +6184,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5958,7 +6216,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -5990,7 +6248,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6022,7 +6280,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6054,7 +6312,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6086,7 +6344,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6118,7 +6376,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6150,7 +6408,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6182,7 +6440,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6214,7 +6472,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6246,7 +6504,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6278,7 +6536,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6310,7 +6568,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6342,7 +6600,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6374,7 +6632,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6406,7 +6664,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6438,7 +6696,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6470,7 +6728,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6502,7 +6760,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6534,7 +6792,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6566,7 +6824,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6598,7 +6856,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6630,7 +6888,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -8011,7 +8269,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "2959428625184507101" + "value": "8603598590297091788" } ] } @@ -8055,7 +8313,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "1715809227613203910" + "value": "15482970526060535234" } ] } @@ -8068,4 +8326,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_vulkan_0.azshadervariant index 7178a643b1..7e790aa0f1 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridblendirradiance_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdate_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdate_passsrg.azsrg index a773d510d2..edac0f6e41 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdate_passsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdate_passsrg.azsrg @@ -1330,4 +1330,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn.azshader index f2d6a2e169..d70f7ac139 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_dx12_0.azshadervariant index 16d5486bc2..8d904928c9 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_null_0.azshadervariant index 2b6f721009..7b48ea0631 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_vulkan_0.azshadervariant index 5dfb42f212..3c2b178ac2 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdatecolumn_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow.azshader index 3fabad6385..a817f1dd82 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_dx12_0.azshadervariant index 5555d90646..7335bfca4d 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_null_0.azshadervariant index f1eca35745..4c967f5e97 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_vulkan_0.azshadervariant index 4f9d140b86..46f9f92877 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridborderupdaterow_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification.azshader new file mode 100644 index 0000000000..39322fc484 Binary files /dev/null and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_dx12_0.azshadervariant new file mode 100644 index 0000000000..29125865a1 Binary files /dev/null and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_null_0.azshadervariant new file mode 100644 index 0000000000..58124203ee Binary files /dev/null and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_passsrg.azsrg new file mode 100644 index 0000000000..a435420d2b --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_passsrg.azsrg @@ -0,0 +1,8071 @@ +{ + "name": "ObjectStream", + "version": 3, + "Objects": [ + { + "typeName": "ShaderResourceGroupAsset", + "typeId": "{F8C9F4AE-3F6A-45AD-B4FB-0CA415FCC2E1}", + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "PassSrg" + }, + { + "field": "m_perAPILayout", + "typeName": "AZStd::vector", + "typeId": "{D41FAB43-0CAA-5170-B2BF-9D547C097E4F}", + "Objects": [ + { + "field": "element", + "typeName": "AZStd::pair", + "typeId": "{5C6406C8-77C9-597F-A3E9-249628D94902}", + "Objects": [ + { + "field": "value1", + "typeName": "Crc32", + "typeId": "{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}", + "Objects": [ + { + "field": "Value", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3244871826" + } + ] + }, + { + "field": "value2", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{FF05CAD3-238F-5E19-8FF2-083353BBEC47}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderResourceGroupLayout", + "typeId": "{1F92C651-9B83-4379-AB5C-5201F1B2C278}", + "version": 6, + "Objects": [ + { + "field": "m_staticSamplers", + "typeName": "AZStd::vector", + "typeId": "{D3BC4729-3DE0-57A1-96E0-DCFF98D4D975}" + }, + { + "field": "m_inputsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{A4650430-04B9-589A-991F-4B443DCD20EA}" + }, + { + "field": "m_inputsForImages", + "typeName": "AZStd::vector", + "typeId": "{909BE4D8-5A22-59A4-A135-4E73662E2D83}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "m_inputsForBufferUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{DD5102EE-72A9-55F7-AB54-14F228FAE38F}" + }, + { + "field": "m_inputsForImageUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{8042FF1E-9115-53F7-BE33-3DCDE9C0AB7F}" + }, + { + "field": "m_inputsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{4CF286E1-5297-581D-93E9-891166EDAD9A}" + }, + { + "field": "m_intervalsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_intervalsForImages", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "m_intervalsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_groupSizeForBuffers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImages", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_groupSizeForBufferUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImageUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForSamplers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_idReflectionForBuffers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferDescriptor>>", + "typeId": "{A85E274A-4C1D-546F-B18C-452C5700BAE4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{F4529C0B-A2C0-5A32-A348-59D45FB1776B}" + } + ] + }, + { + "field": "m_idReflectionForImages", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{BB6D1ABE-9A2F-5F51-93CB-B1B866EFD5B4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{BBD5D625-992D-5296-A631-9B84B00CE2F1}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_idReflectionForBufferUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferUnboundedArrayDescriptor>>", + "typeId": "{46520159-BC56-5E90-89AD-3CB0A5D295B0}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{CD6D3195-A87A-5E0C-AD4D-23457B3B8DCF}" + } + ] + }, + { + "field": "m_idReflectionForImageUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageUnboundedArrayDescriptor>>", + "typeId": "{A33C41AC-ABA0-5A34-9A6B-89BABDC151D7}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{14C5FF00-B370-575F-866B-B19B97F76D82}" + } + ] + }, + { + "field": "m_idReflectionForSamplers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputSamplerDescriptor>>", + "typeId": "{2665EED7-CFB4-582B-B265-107348B1DFAC}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{1545A615-BFD7-515C-A1E9-710570135F08}" + } + ] + }, + { + "field": "m_constantsDataLayout", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{CEB3049A-A620-56C8-AFBA-D0A98304333D}", + "Objects": [ + { + "field": "element", + "typeName": "ConstantsLayout", + "typeId": "{66EDAC32-7730-4F05-AF9D-B3CB0F5D90E0}", + "Objects": [ + { + "field": "m_inputs", + "typeName": "AZStd::vector", + "typeId": "{5FC25C85-DF2F-5219-918C-EBC47D7D6451}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "m_idReflection", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{7DE7E4B8-5C98-5F7A-985F-DDEEA5BB5366}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{4B54CC87-1340-5B29-8040-2003033F9B93}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "20" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "27" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "10" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "26" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "18" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "9" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "13" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "6" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "24" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "25" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "22" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "23" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "7" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "21" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "19" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "11" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "15" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "17" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "14" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_intervals", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + } + ] + }, + { + "field": "m_sizeInBytes", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "7181601620235669059" + } + ] + } + ] + }, + { + "field": "m_bindingSlot", + "typeName": "AZ::RHI::Handle<unsigned int, DefaultNamespaceType>", + "typeId": "{1811456D-0C3D-58C8-ACE8-FD47F4E80E25}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + }, + { + "field": "m_shaderVariantKeyFallbackSize", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_shaderVariantKeyFallbackConstantIndex", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4294967295" + } + ] + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "10614022793008117732" + } + ] + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZStd::pair", + "typeId": "{5C6406C8-77C9-597F-A3E9-249628D94902}", + "Objects": [ + { + "field": "value1", + "typeName": "Crc32", + "typeId": "{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}", + "Objects": [ + { + "field": "Value", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "634125391" + } + ] + }, + { + "field": "value2", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{FF05CAD3-238F-5E19-8FF2-083353BBEC47}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderResourceGroupLayout", + "typeId": "{1F92C651-9B83-4379-AB5C-5201F1B2C278}", + "version": 6, + "Objects": [ + { + "field": "m_staticSamplers", + "typeName": "AZStd::vector", + "typeId": "{D3BC4729-3DE0-57A1-96E0-DCFF98D4D975}" + }, + { + "field": "m_inputsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{A4650430-04B9-589A-991F-4B443DCD20EA}" + }, + { + "field": "m_inputsForImages", + "typeName": "AZStd::vector", + "typeId": "{909BE4D8-5A22-59A4-A135-4E73662E2D83}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "m_inputsForBufferUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{DD5102EE-72A9-55F7-AB54-14F228FAE38F}" + }, + { + "field": "m_inputsForImageUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{8042FF1E-9115-53F7-BE33-3DCDE9C0AB7F}" + }, + { + "field": "m_inputsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{4CF286E1-5297-581D-93E9-891166EDAD9A}" + }, + { + "field": "m_intervalsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_intervalsForImages", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "m_intervalsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_groupSizeForBuffers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImages", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_groupSizeForBufferUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImageUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForSamplers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_idReflectionForBuffers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferDescriptor>>", + "typeId": "{A85E274A-4C1D-546F-B18C-452C5700BAE4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{F4529C0B-A2C0-5A32-A348-59D45FB1776B}" + } + ] + }, + { + "field": "m_idReflectionForImages", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{BB6D1ABE-9A2F-5F51-93CB-B1B866EFD5B4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{BBD5D625-992D-5296-A631-9B84B00CE2F1}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_idReflectionForBufferUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferUnboundedArrayDescriptor>>", + "typeId": "{46520159-BC56-5E90-89AD-3CB0A5D295B0}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{CD6D3195-A87A-5E0C-AD4D-23457B3B8DCF}" + } + ] + }, + { + "field": "m_idReflectionForImageUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageUnboundedArrayDescriptor>>", + "typeId": "{A33C41AC-ABA0-5A34-9A6B-89BABDC151D7}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{14C5FF00-B370-575F-866B-B19B97F76D82}" + } + ] + }, + { + "field": "m_idReflectionForSamplers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputSamplerDescriptor>>", + "typeId": "{2665EED7-CFB4-582B-B265-107348B1DFAC}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{1545A615-BFD7-515C-A1E9-710570135F08}" + } + ] + }, + { + "field": "m_constantsDataLayout", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{CEB3049A-A620-56C8-AFBA-D0A98304333D}", + "Objects": [ + { + "field": "element", + "typeName": "ConstantsLayout", + "typeId": "{66EDAC32-7730-4F05-AF9D-B3CB0F5D90E0}", + "Objects": [ + { + "field": "m_inputs", + "typeName": "AZStd::vector", + "typeId": "{5FC25C85-DF2F-5219-918C-EBC47D7D6451}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "m_idReflection", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{7DE7E4B8-5C98-5F7A-985F-DDEEA5BB5366}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{4B54CC87-1340-5B29-8040-2003033F9B93}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "20" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "27" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "10" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "26" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "18" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "9" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "13" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "6" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "24" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "25" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "22" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "23" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "7" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "21" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "19" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "11" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "15" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "17" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "14" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_intervals", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + } + ] + }, + { + "field": "m_sizeInBytes", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "7181601620235669059" + } + ] + } + ] + }, + { + "field": "m_bindingSlot", + "typeName": "AZ::RHI::Handle<unsigned int, DefaultNamespaceType>", + "typeId": "{1811456D-0C3D-58C8-ACE8-FD47F4E80E25}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + }, + { + "field": "m_shaderVariantKeyFallbackSize", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_shaderVariantKeyFallbackConstantIndex", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4294967295" + } + ] + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "10614022793008117732" + } + ] + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZStd::pair", + "typeId": "{5C6406C8-77C9-597F-A3E9-249628D94902}", + "Objects": [ + { + "field": "value1", + "typeName": "Crc32", + "typeId": "{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}", + "Objects": [ + { + "field": "Value", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3189070339" + } + ] + }, + { + "field": "value2", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{FF05CAD3-238F-5E19-8FF2-083353BBEC47}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderResourceGroupLayout", + "typeId": "{1F92C651-9B83-4379-AB5C-5201F1B2C278}", + "version": 6, + "Objects": [ + { + "field": "m_staticSamplers", + "typeName": "AZStd::vector", + "typeId": "{D3BC4729-3DE0-57A1-96E0-DCFF98D4D975}" + }, + { + "field": "m_inputsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{A4650430-04B9-589A-991F-4B443DCD20EA}" + }, + { + "field": "m_inputsForImages", + "typeName": "AZStd::vector", + "typeId": "{909BE4D8-5A22-59A4-A135-4E73662E2D83}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "m_inputsForBufferUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{DD5102EE-72A9-55F7-AB54-14F228FAE38F}" + }, + { + "field": "m_inputsForImageUnboundedArrays", + "typeName": "AZStd::vector", + "typeId": "{8042FF1E-9115-53F7-BE33-3DCDE9C0AB7F}" + }, + { + "field": "m_inputsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{4CF286E1-5297-581D-93E9-891166EDAD9A}" + }, + { + "field": "m_intervalsForBuffers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_intervalsForImages", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "m_intervalsForSamplers", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}" + }, + { + "field": "m_groupSizeForBuffers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImages", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + }, + { + "field": "m_groupSizeForBufferUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForImageUnboundedArrays", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_groupSizeForSamplers", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_idReflectionForBuffers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferDescriptor>>", + "typeId": "{A85E274A-4C1D-546F-B18C-452C5700BAE4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{F4529C0B-A2C0-5A32-A348-59D45FB1776B}" + } + ] + }, + { + "field": "m_idReflectionForImages", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{BB6D1ABE-9A2F-5F51-93CB-B1B866EFD5B4}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{BBD5D625-992D-5296-A631-9B84B00CE2F1}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeRayTrace" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_idReflectionForBufferUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputBufferUnboundedArrayDescriptor>>", + "typeId": "{46520159-BC56-5E90-89AD-3CB0A5D295B0}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{CD6D3195-A87A-5E0C-AD4D-23457B3B8DCF}" + } + ] + }, + { + "field": "m_idReflectionForImageUnboundedArrays", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputImageUnboundedArrayDescriptor>>", + "typeId": "{A33C41AC-ABA0-5A34-9A6B-89BABDC151D7}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{14C5FF00-B370-575F-866B-B19B97F76D82}" + } + ] + }, + { + "field": "m_idReflectionForSamplers", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputSamplerDescriptor>>", + "typeId": "{2665EED7-CFB4-582B-B265-107348B1DFAC}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{1545A615-BFD7-515C-A1E9-710570135F08}" + } + ] + }, + { + "field": "m_constantsDataLayout", + "typeName": "AZStd::intrusive_ptr", + "typeId": "{CEB3049A-A620-56C8-AFBA-D0A98304333D}", + "Objects": [ + { + "field": "element", + "typeName": "ConstantsLayout", + "typeId": "{66EDAC32-7730-4F05-AF9D-B3CB0F5D90E0}", + "Objects": [ + { + "field": "m_inputs", + "typeName": "AZStd::vector", + "typeId": "{5FC25C85-DF2F-5219-918C-EBC47D7D6451}", + "Objects": [ + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, + { + "field": "element", + "typeName": "ShaderInputConstantDescriptor", + "typeId": "{C8DC7D2D-CCA0-45AD-9430-52C06B69325C}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "m_constantByteOffset", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_constantByteCount", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "m_idReflection", + "typeName": "AZ::RHI::NameIdReflectionMap<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{7DE7E4B8-5C98-5F7A-985F-DDEEA5BB5366}", + "Objects": [ + { + "field": "ReflectionMap", + "typeName": "AZStd::vector", + "typeId": "{4B54CC87-1340-5B29-8040-2003033F9B93}", + "Objects": [ + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMinFrontfaceDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "20" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumDistanceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "27" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeInverseIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "10" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "26" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeScrollOffsets" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "18" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeIrradianceEncodingGamma" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "9" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.normalBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "13" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBrightnessThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "8" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeHysteresis" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "6" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeRayRotationTransform" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[2]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "24" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[3]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "25" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[0]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "22" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding1[1]" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "23" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeChangeThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "7" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.padding" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "21" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.origin" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.numRaysPerProbe" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridSpacing" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeBackfaceThreshold" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "19" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeMaxRayDistance" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeNumIrradianceTexels" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "11" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeGridCounts" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeVariablePad0" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "15" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.volumeMovementType" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "17" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.probeDistanceExponent" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>>", + "typeId": "{285A5B8D-8218-5E10-B8AE-138374D8D113}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeGrid.viewBias" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "14" + } + ] + } + ] + } + ] + } + ] + }, + { + "field": "m_intervals", + "typeName": "AZStd::vector", + "typeId": "{908FF0AE-802D-5311-A2E0-A6D595FBC480}", + "Objects": [ + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "12" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "16" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "28" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "32" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "44" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "48" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "52" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "56" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "60" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "64" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "68" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "72" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "76" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "80" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "84" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "96" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "160" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "164" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "176" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "180" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "184" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "208" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "224" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "240" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "192" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + } + ] + } + ] + }, + { + "field": "m_sizeInBytes", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "256" + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "2959428625184507101" + } + ] + } + ] + }, + { + "field": "m_bindingSlot", + "typeName": "AZ::RHI::Handle<unsigned int, DefaultNamespaceType>", + "typeId": "{1811456D-0C3D-58C8-ACE8-FD47F4E80E25}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] + }, + { + "field": "m_shaderVariantKeyFallbackSize", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "0" + }, + { + "field": "m_shaderVariantKeyFallbackConstantIndex", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputConstantDescriptor>", + "typeId": "{3F860893-1F57-5615-92CA-389B49687A9C}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4294967295" + } + ] + }, + { + "field": "m_hash", + "typeName": "AZ::u64", + "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", + "value": "4240011884224364085" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_vulkan_0.azshadervariant new file mode 100644 index 0000000000..3a22d2cd55 Binary files /dev/null and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridclassification_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader index 24f8b7f470..a781a598ba 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant index 46c99b0d3d..e9f841047e 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant index df447c8da0..e399dbcef0 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant index e2d34e23f7..1580aa2477 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader index d1a669bacf..bfed840feb 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant index 8f5f4c1ee0..ee2031bf1a 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant index c82fa140f1..3b37084adf 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant index 1a0ec0f962..e2f5a8cb50 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingcommon_raytracingglobalsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingcommon_raytracingglobalsrg.azsrg index 889e5a51fe..930d34171e 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingcommon_raytracingglobalsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingcommon_raytracingglobalsrg.azsrg @@ -251,6 +251,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -433,6 +471,26 @@ "value": "4" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] } ] }, @@ -451,7 +509,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "4" + "value": "5" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -515,7 +573,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -599,7 +657,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" } ] } @@ -3217,7 +3303,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "3506265182085703910" + "value": "2492931172876496388" } ] } @@ -3459,6 +3545,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -3641,6 +3765,26 @@ "value": "4" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] } ] }, @@ -3659,7 +3803,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "4" + "value": "5" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -3723,7 +3867,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -3807,7 +3951,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" } ] } @@ -6425,7 +6597,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "3506265182085703910" + "value": "2492931172876496388" } ] } @@ -6575,7 +6747,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "4" + "value": "5" } ] } @@ -6667,6 +6839,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -6701,7 +6911,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] }, @@ -6739,7 +6949,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] } @@ -6849,6 +7059,26 @@ "value": "4" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "5" + } + ] } ] }, @@ -6867,7 +7097,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "4" + "value": "5" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -6931,7 +7161,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -7015,7 +7245,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "2" } ] } @@ -7104,7 +7362,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7136,7 +7394,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7168,7 +7426,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7200,7 +7458,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7232,7 +7490,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7264,7 +7522,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7296,7 +7554,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7328,7 +7586,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7360,7 +7618,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7392,7 +7650,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7424,7 +7682,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7456,7 +7714,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7488,7 +7746,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7520,7 +7778,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7552,7 +7810,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7584,7 +7842,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7616,7 +7874,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7648,7 +7906,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7680,7 +7938,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7712,7 +7970,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7744,7 +8002,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7776,7 +8034,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7808,7 +8066,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7840,7 +8098,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7872,7 +8130,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7904,7 +8162,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7936,7 +8194,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -7968,7 +8226,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -8000,7 +8258,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -8032,7 +8290,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] }, @@ -8064,7 +8322,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "5" + "value": "6" } ] } @@ -9589,7 +9847,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "16848591129341445217" + "value": "1426176521634445605" } ] } @@ -9633,7 +9891,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "4017610420074377641" + "value": "1425135468820160161" } ] } @@ -9646,4 +9904,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader index 91c528661a..84e773d9db 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant index 57660de9e8..b288bb7647 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant index 74e6d6263d..0f2473b606 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant index 15d17bca27..bfd979e588 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader index e5446589e8..d827fbe2a1 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_dx12_0.azshadervariant index abfbda4bae..7d76080dd7 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_null_0.azshadervariant index c2689bcb40..c301dc4790 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_passsrg.azsrg index 8930714c55..c7d3b3a113 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_passsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_passsrg.azsrg @@ -8548,4 +8548,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_vulkan_0.azshadervariant index cc5cc30818..2a077e0bbf 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrelocation_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender.azshader b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender.azshader index 9e62bc1927..b88c7e4ec5 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender.azshader and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender.azshader differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_dx12_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_dx12_0.azshadervariant index ae976a7cd9..48bdc89867 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_dx12_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_dx12_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_null_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_null_0.azshadervariant index 674ed7b1ac..af7c962694 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_null_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_null_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_objectsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_objectsrg.azsrg index 856baff38e..dee11c7a6a 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_objectsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_objectsrg.azsrg @@ -99,6 +99,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -261,6 +299,26 @@ "value": "3" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] } ] }, @@ -279,7 +337,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -343,7 +401,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "1" + "value": "2" } ] } @@ -399,7 +457,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" } ] } @@ -3177,7 +3263,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "10943999648486519461" + "value": "12354971452077948474" } ] } @@ -3267,6 +3353,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -3429,6 +3553,26 @@ "value": "3" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] } ] }, @@ -3447,7 +3591,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -3511,7 +3655,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "1" + "value": "2" } ] } @@ -3567,7 +3711,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" } ] } @@ -6345,7 +6517,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "10943999648486519461" + "value": "12354971452077948474" } ] } @@ -6435,6 +6607,44 @@ } ] }, + { + "field": "element", + "typeName": "ShaderInputImageDescriptor", + "typeId": "{913DBF3C-5556-4524-B928-174A42516D31}", + "version": 3, + "Objects": [ + { + "field": "m_name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "m_type", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_access", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_count", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + }, + { + "field": "m_registerId", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" + } + ] + }, { "field": "element", "typeName": "ShaderInputImageDescriptor", @@ -6469,7 +6679,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "1" + "value": "2" } ] }, @@ -6507,7 +6717,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" } ] } @@ -6597,6 +6807,26 @@ "value": "3" } ] + }, + { + "field": "element", + "typeName": "Interval", + "typeId": "{B121C9FE-1C23-4721-9C3E-6BE036612743}", + "version": 1, + "Objects": [ + { + "field": "m_min", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "3" + }, + { + "field": "m_max", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "4" + } + ] } ] }, @@ -6615,7 +6845,7 @@ "field": "m_groupSizeForImages", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" }, { "field": "m_groupSizeForBufferUnboundedArrays", @@ -6679,7 +6909,7 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "1" + "value": "2" } ] } @@ -6735,7 +6965,35 @@ "field": "m_index", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "2" + "value": "3" + } + ] + } + ] + }, + { + "field": "element", + "typeName": "AZ::RHI::ReflectionNamePair<AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>>", + "typeId": "{DB3620EE-8854-52A8-B421-BFA17E6A687D}", + "version": 2, + "Objects": [ + { + "field": "Name", + "typeName": "Name", + "typeId": "{3D2B920C-9EFD-40D5-AAE0-DF131C3D4931}", + "value": "m_probeStates" + }, + { + "field": "Index", + "typeName": "AZ::RHI::Handle<unsigned int, ShaderInputImageDescriptor>", + "typeId": "{5C8C0729-5D41-5299-80F1-395F79B02D70}", + "version": 1, + "Objects": [ + { + "field": "m_index", + "typeName": "unsigned int", + "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", + "value": "1" } ] } @@ -6824,7 +7082,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -6856,7 +7114,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -6888,7 +7146,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -6920,7 +7178,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -6952,7 +7210,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -6984,7 +7242,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7016,7 +7274,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7048,7 +7306,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7080,7 +7338,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7112,7 +7370,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7144,7 +7402,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7176,7 +7434,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7208,7 +7466,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7240,7 +7498,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7272,7 +7530,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7304,7 +7562,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7336,7 +7594,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7368,7 +7626,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7400,7 +7658,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7432,7 +7690,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7464,7 +7722,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7496,7 +7754,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7528,7 +7786,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7560,7 +7818,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7592,7 +7850,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7624,7 +7882,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7656,7 +7914,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7688,7 +7946,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7720,7 +7978,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7752,7 +8010,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7784,7 +8042,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7816,7 +8074,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] }, @@ -7848,7 +8106,7 @@ "field": "m_registerId", "typeName": "unsigned int", "typeId": "{43DA906B-7DEF-4CA8-9790-854106D3F983}", - "value": "3" + "value": "4" } ] } @@ -9469,7 +9727,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "14153574899631108967" + "value": "11445921412800959080" } ] } @@ -9513,7 +9771,7 @@ "field": "m_hash", "typeName": "AZ::u64", "typeId": "{D6597933-47CD-4FC8-B911-63F3E2B0993A}", - "value": "8072403242124824453" + "value": "16873325821914315993" } ] } @@ -9526,4 +9784,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_passsrg.azsrg b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_passsrg.azsrg index 03c16a18c1..63be26a393 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_passsrg.azsrg +++ b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_passsrg.azsrg @@ -1672,4 +1672,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_vulkan_0.azshadervariant b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_vulkan_0.azshadervariant index 1dfcbd3ac3..4e9771d614 100644 Binary files a/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_vulkan_0.azshadervariant and b/Gems/Atom/Feature/Common/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridrender_vulkan_0.azshadervariant differ diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/ImGui/ImGui.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/ImGui/ImGui.azsl index 12ad9f2e9a..f85d180ae7 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/ImGui/ImGui.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/ImGui/ImGui.azsl @@ -64,4 +64,4 @@ PixelOutput MainPS(in VertexOutput input) float4 color = ObjectSrg::FontImage.Sample(ObjectSrg::LinearSampler, input.UV) * input.Color; output.m_color = float4(color.rgb * color.a, color.a); return output; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.azsl index 640491234f..367720d13b 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.azsl @@ -701,4 +701,4 @@ void MainCS( { PassSrg::m_lightCount[groupID.xy] = lightCount; } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.shader b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.shader index 9dad380096..6a4adcaade 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCulling.shader @@ -17,4 +17,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingHeatmap.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingHeatmap.azsl index 1f5ba515f0..14a5f810cf 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingHeatmap.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingHeatmap.azsl @@ -245,4 +245,4 @@ PSOutput MainPS(VSOutput IN) // https://jira.agscollab.com/browse/ATOM-3682 (improve heatmap integration with the pass system) return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingRemap.shader b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingRemap.shader index e473ab05b2..d1b52525b6 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingRemap.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingRemap.shader @@ -16,4 +16,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shader b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shader index 9f1ffc7ad9..d101424e65 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shader @@ -16,4 +16,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shadervariantlist b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shadervariantlist index 85a15aecce..a17fab5448 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shadervariantlist +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LightCulling/LightCullingTilePrepare.shadervariantlist @@ -26,4 +26,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/LuxCore/RenderTexture.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/LuxCore/RenderTexture.azsl index 112ce4934b..9b007f05ef 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/LuxCore/RenderTexture.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/LuxCore/RenderTexture.azsl @@ -62,4 +62,4 @@ PSOutput MainPS(VSOutput IN) } return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader index a3223da6e8..db303e1ea7 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetCS.shader index bd2d0dbfab..c6180c8873 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/MorphTargets/MorphTargetCS.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/CameraMotionVector.shader b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/CameraMotionVector.shader index 0716115dac..4dee7cc702 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/CameraMotionVector.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/CameraMotionVector.shader @@ -19,4 +19,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/AcesOutputTransformLut.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/AcesOutputTransformLut.azsl index 0c491e57cd..8b90b18bc1 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/AcesOutputTransformLut.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/AcesOutputTransformLut.azsl @@ -47,4 +47,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.a = 1.0f; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ApplyShaperLookupTable.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ApplyShaperLookupTable.azsl index 6ca3c70110..200ca8fd85 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ApplyShaperLookupTable.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ApplyShaperLookupTable.azsl @@ -80,4 +80,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.a = 1.0; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.azsl index 1bf5d6cdc5..314962ca08 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.azsl @@ -90,4 +90,4 @@ void MainCS(uint3 dispatch_id: SV_DispatchThreadID) output.a = 1.0; PassSrg::m_lutTexture[outPixel] = output; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.shader index 056d6170c2..9274fa701e 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BakeAcesOutputTransformLutCS.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.azsl index 111559022b..3cd6e11cab 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.azsl @@ -158,4 +158,4 @@ void MainCS(uint3 dispatch_id: SV_DispatchThreadID) output.a = 1.0; PassSrg::m_blendedLut[outPixel] = output; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.shader index bee148d49d..10bccf1d42 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BlendColorGradingLuts.shader @@ -14,4 +14,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomBlurCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomBlurCS.shader index 04887bdc8b..467ccbf867 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomBlurCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomBlurCS.shader @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomCompositeCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomCompositeCS.shader index c7c03c6475..0be9455da1 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomCompositeCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomCompositeCS.shader @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomDownsampleCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomDownsampleCS.shader index 236a3d35ff..7f33a041db 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomDownsampleCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/BloomDownsampleCS.shader @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ConvertToAcescg.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ConvertToAcescg.azsl index 8932d22a21..b9791084f3 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ConvertToAcescg.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ConvertToAcescg.azsl @@ -42,4 +42,4 @@ PSOutput MainPS(VSOutput IN) Out.m_color.a = 1.0; return Out; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DepthToLinearDepth.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DepthToLinearDepth.azsl index a319642ff6..e048870260 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DepthToLinearDepth.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DepthToLinearDepth.azsl @@ -44,4 +44,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_linearDepth = linearDepth; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DiffuseSpecularMerge.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DiffuseSpecularMerge.azsl index cd223c425e..d78d3b31f5 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DiffuseSpecularMerge.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DiffuseSpecularMerge.azsl @@ -74,4 +74,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = float4(diffuse.rgb, 1.0) + specular; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapper.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapper.azsl index 3167d3c8e1..98ffa3f7d6 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapper.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapper.azsl @@ -80,4 +80,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.w = 1; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapperOnlyGammaCorrection.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapperOnlyGammaCorrection.azsl index 10b44bec6b..aa4306bc9d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapperOnlyGammaCorrection.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DisplayMapperOnlyGammaCorrection.azsl @@ -44,4 +44,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.w = 1; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.azsl index f4173aa6c4..6e04a194f1 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.azsl @@ -89,4 +89,4 @@ void MainCS(uint3 dispatch_id: SV_DispatchThreadID) // Output the color PassSrg::m_outputTexture[outPixel] = output; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.shader index 29813a9d63..3b541fe132 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleLuminanceMinAvgMaxCS.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.azsl index 1549a0c83c..187dd938ae 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.azsl @@ -86,4 +86,4 @@ void MainCS(uint3 dispatch_id: SV_DispatchThreadID) // Output the color PassSrg::m_outputTexture[outPixel] = output; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader index fc54dffa3d..a3eb7e6bdb 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/DownsampleMinAvgMaxCS.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl index 63b4c2031f..7368d7f590 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl @@ -88,4 +88,4 @@ void MainCS(uint3 dispatch_id : SV_DispatchThreadID) // Store the linear exposure so it can be used by the look modification transform later. // newExposureLog2 is negated because m_exposureValue is used to correct for a given exposure. PassSrg::m_eyeAdaptationData[0].m_exposureValue = pow(2.0f, -newExposureLog2); -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.shader index ff6ce2883e..e6e81b88fe 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.shader @@ -13,4 +13,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FullscreenCopy.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FullscreenCopy.azsl index 70e1306411..e1763dab9c 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FullscreenCopy.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FullscreenCopy.azsl @@ -37,4 +37,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = PassSrg::m_framebuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LookModificationTransform.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LookModificationTransform.azsl index db5b2f420c..3e708a2ca3 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LookModificationTransform.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LookModificationTransform.azsl @@ -103,4 +103,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.w = 1; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHeatmap.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHeatmap.azsl index bbd52d329d..df92e36f9a 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHeatmap.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHeatmap.azsl @@ -342,4 +342,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = DrawHeatmap(IN.m_texCoord); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHistogramGenerator.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHistogramGenerator.shader index ffefd20901..f9b3f5f72d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHistogramGenerator.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/LuminanceHistogramGenerator.shader @@ -14,4 +14,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl index 119bb7552d..6301aab8ab 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.azsl @@ -183,4 +183,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = float4(color, 1.0); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.shader index 831817356e..e23dba6d73 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveCustom.shader @@ -21,4 +21,4 @@ }, "ProgramVariants": [] -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveDepth.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveDepth.azsl index 096133911d..ee9972ef4d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveDepth.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/MSAAResolveDepth.azsl @@ -42,4 +42,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_depth = PassSrg::m_depthTexture.Load(coord, sampleIndex); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/OutputTransform.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/OutputTransform.azsl index b2b12ac504..b480d6e5c5 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/OutputTransform.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/OutputTransform.azsl @@ -97,4 +97,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.w = 1; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAABlendingWeightCalculation.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAABlendingWeightCalculation.azsl index 03ccc171ba..04d6a8bf8b 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAABlendingWeightCalculation.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAABlendingWeightCalculation.azsl @@ -99,4 +99,4 @@ PSOutput MainPS(VSOutputBlendingWeightCalculation IN) OUT.m_color = SMAABlendingWeightCalculationPS(IN.m_texCoord, IN.m_pixcoord, IN.m_offset, PassSrg::m_framebuffer, PassSrg::m_areaTexture, PassSrg::m_searchTexture, float4(0.0, 0.0, 0.0, 0.0)); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAConvertToPerceptualColor.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAConvertToPerceptualColor.azsl index a1f64e8f3b..93a7457ae7 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAConvertToPerceptualColor.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAConvertToPerceptualColor.azsl @@ -38,4 +38,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = ApplyProvisionalTonemap(PassSrg::m_framebuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord)); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAEdgeDetection.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAEdgeDetection.azsl index cd608f5e17..eca2e56ae2 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAEdgeDetection.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAAEdgeDetection.azsl @@ -113,4 +113,4 @@ PSOutput MainPS(VSOutputSMAAEdgeDetection IN) } return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ScreenSpaceSubsurfaceScatteringCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ScreenSpaceSubsurfaceScatteringCS.shader index 510db915ff..a54060f093 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ScreenSpaceSubsurfaceScatteringCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/ScreenSpaceSubsurfaceScatteringCS.shader @@ -11,4 +11,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.shader index fdff957281..c1d272e857 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionComposite.shader @@ -17,7 +17,7 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x7F", "WriteMask" : "0x00", "FrontFace" : { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.azsl index 6e41e5123c..9e0d51ccef 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.azsl @@ -43,9 +43,9 @@ ShaderResourceGroup PassSrg : SRG_PerPass { Texture2DMS<float> m_depth; - Texture2DMS<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags + Texture2DMS<float4> m_normal; // RGB10 = EncodeNormalSignedOctahedron(worldNormal), A2 = multiScatterCompensationEnabled Texture2DMS<float4> m_specularF0; // RGB8 = SpecularF0, A8 = Roughness - Texture2DMS<float4> m_clearCoatNormal; // R16G16 = Normal (Packed), B16A16 = (factor, perceptual roughness) + Texture2DMS<float4> m_albedo; // RGB8 = Albedo, A = specularOcclusion Texture2DMS<float> m_blendWeight; Texture2D<float2> m_brdfMap; @@ -80,6 +80,9 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) float4 encodedNormal = PassSrg::m_normal.Load(IN.m_position.xy, sampleIndex); float3 normal = DecodeNormalSignedOctahedron(encodedNormal.rgb); bool multiScatterCompensationEnabled = (encodedNormal.a > 0.0f); + + float4 albedo = PassSrg::m_albedo.Load(IN.m_position.xy, sampleIndex); + float specularOcclusion = albedo.a; // reconstruct world space position from the depth at this location in screenspace float3 positionWS = ReconstructWorldPositionFromDepth(IN.m_position.xy, sampleIndex).xyz; @@ -105,37 +108,12 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) float3 multiScatterCompensation = GetMultiScatterCompensation(specularF0, brdf, multiScatterCompensationEnabled); float3 specular = blendWeight * globalSpecular * multiScatterCompensation * (specularF0 * brdf.x + brdf.y); - float4 encodedClearCoatNormal = PassSrg::m_clearCoatNormal.Load(IN.m_position.xy, sampleIndex); - if(encodedClearCoatNormal.z > 0.0) - { - float3 clearCoatNormal = DecodedNormalSphereMap(encodedClearCoatNormal.xy); - - float factor = encodedClearCoatNormal.z; - float roughness = encodedClearCoatNormal.w; - - // recompute reflection direction based on coat's normal - float3 reflectDir = reflect(-dirToCamera, clearCoatNormal); - reflectDir = MultiplyVectorQuaternion(reflectDir, SceneSrg::m_iblOrientation); - - float NdotV = saturate(dot(clearCoatNormal, dirToCamera)); - NdotV = max(NdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles. - - float3 coatGlobalSpecular = SceneSrg::m_specularEnvMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(reflectDir), GetRoughnessMip(roughness)).rgb; - float2 coatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(roughness, NdotV)).rg; - - // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat - // coat layer assumed to be dielectric thus don't need multiple scattering compensation - float3 clearCoat = blendWeight * coatGlobalSpecular * (float3(0.04, 0.04, 0.04) * coatBrdf.x + coatBrdf.y) * factor; - - // attenuate base layer energy - float3 coatResponse = FresnelSchlickWithRoughness(NdotV, float3(0.04, 0.04, 0.04), roughness) * factor; - - specular = specular * (1.0 - coatResponse) * (1.0 - coatResponse) + clearCoat; - } - // apply exposure setting specular *= pow(2.0, SceneSrg::m_iblExposure); + // maybe attenuate the specular + specular *= specularOcclusion; + PSOutput OUT; OUT.m_color = float4(specular, 1.0f); return OUT; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.shader index e33cf3a4a7..069700191a 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen.shader @@ -15,7 +15,7 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x7F", "WriteMask" : "0x00", "FrontFace" : { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen_nomsaa.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen_nomsaa.azsl index f90048b7ab..088546c604 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen_nomsaa.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionGlobalFullscreen_nomsaa.azsl @@ -49,7 +49,6 @@ ShaderResourceGroup PassSrg : SRG_PerPass Texture2D<float> m_depth; Texture2D<float4> m_normal; // RGB10 = Normal (Encoded), A2 = Flags Texture2D<float4> m_specularF0; // RGB8 = SpecularF0, A8 = Roughness - Texture2D<float4> m_clearCoatNormal; // R16G16 = Normal (Packed), B16A16 = (factor, perceptual roughness) Texture2D<float> m_blendWeight; Texture2D<float2> m_brdfMap; @@ -126,34 +125,6 @@ PSOutput MainPS(VSOutput IN) float3 multiScatterCompensation = GetMultiScatterCompensation(specularF0, brdf, multiScatterCompensationEnabled); float3 specular = blendWeight * globalSpecular * multiScatterCompensation * (specularF0 * brdf.x + brdf.y); - float4 encodedClearCoatNormal = PassSrg::m_clearCoatNormal.Load(int3(IN.m_position.xy, 0)); - if(encodedClearCoatNormal.z > 0.0) - { - float3 clearCoatNormal = DecodedNormalSphereMap(encodedClearCoatNormal.xy); - - float factor = encodedClearCoatNormal.z; - float roughness = encodedClearCoatNormal.w; - - // recompute reflection direction based on coat's normal - float3 reflectDir = reflect(-dirToCamera, clearCoatNormal); - reflectDir = MultiplyVectorQuaternion(reflectDir, SceneSrg::m_iblOrientation); - - float NdotV = saturate(dot(clearCoatNormal, dirToCamera)); - NdotV = max(NdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles. - - float3 coatGlobalSpecular = SceneSrg::m_specularEnvMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(reflectDir), GetRoughnessMip(roughness)).rgb; - float2 coatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(roughness, NdotV)).rg; - - // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat - // coat layer assumed to be dielectric thus don't need multiple scattering compensation - float3 clearCoat = blendWeight * coatGlobalSpecular * (float3(0.04, 0.04, 0.04) * coatBrdf.x + coatBrdf.y) * factor; - - // attenuate base layer energy - float3 coatResponse = FresnelSchlickWithRoughness(NdotV, float3(0.04, 0.04, 0.04), roughness) * factor; - - specular = specular * (1.0 - coatResponse) * (1.0 - coatResponse) + clearCoat; - } - // apply exposure setting specular *= pow(2.0, SceneSrg::m_iblExposure); diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.azsl index aed1c9f8f7..1ca954583a 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.azsl @@ -86,4 +86,4 @@ PSOutput MainPS(VSOutput IN, in uint sampleIndex : SV_SampleIndex) PSOutput OUT; OUT.m_blendWeight = blendWeight; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.shader index 6547374718..645f635743 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeBlendWeight.shader @@ -15,7 +15,7 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x7F", "WriteMask" : "0x00", "BackFace" : { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderCommon.azsli b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderCommon.azsli index d81477fdd9..688f8555d6 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderCommon.azsli +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderCommon.azsli @@ -61,40 +61,5 @@ bool ComputeProbeSpecular(float2 screenCoords, float3 positionWS, float3 aabbMin float3 multiScatterCompensation = GetMultiScatterCompensation(specularF0, brdf, multiScatterCompensationEnabled); specular = probeSpecular * multiScatterCompensation * (specularF0.xyz * brdf.x + brdf.y); - // compute clear coat specular amount - float4 encodedClearCoatNormal = PassSrg::m_clearCoatNormal.Load(screenCoords, sampleIndex); - if(encodedClearCoatNormal.z > 0.0) - { - float3 clearCoatNormal = DecodedNormalSphereMap(encodedClearCoatNormal.xy); - float factor = encodedClearCoatNormal.z; - float roughness = encodedClearCoatNormal.w; - - // recompute reflection direction based on coat's normal - float3 reflectDir = reflect(-dirToCamera, clearCoatNormal); - - // compute parallax corrected reflection vector, if necessary - // clear coat uses different normal from bottom layer, so reflection direction should be recalculated - float3 localReflectDir = reflectDir; - if (ObjectSrg::m_useParallaxCorrection) - { - localReflectDir = ApplyParallaxCorrection(ObjectSrg::m_outerAabbMin, ObjectSrg::m_outerAabbMax, ObjectSrg::m_aabbPos, positionWS, reflectDir); - } - - float NdotV = saturate(dot(clearCoatNormal, dirToCamera)); - NdotV = max(NdotV, 0.01f); // [GFX TODO][ATOM-4466] This is a current band-aid for specular noise at grazing angles. - - float3 coatProbeSpecular = ObjectSrg::m_reflectionCubeMap.SampleLevel(SceneSrg::m_samplerEnv, GetCubemapCoords(localReflectDir), GetRoughnessMip(roughness)).rgb; - float2 coatBrdf = PassSrg::m_brdfMap.Sample(PassSrg::LinearSampler, GetBRDFTexCoords(roughness, NdotV)).rg; - - // clear coat uses fixed IOR = 1.5 represents polyurethane which is the most common material for gloss clear coat - // coat layer assumed to be dielectric thus don't need multiple scattering compensation - float3 clearCoat = coatProbeSpecular * (float3(0.04, 0.04, 0.04) * coatBrdf.x + coatBrdf.y) * factor; - - // attenuate base layer energy - float3 coatResponse = FresnelSchlickWithRoughness(NdotV, float3(0.04, 0.04, 0.04), roughness) * factor; - - specular = specular * (1.0 - coatResponse) * (1.0 - coatResponse) + clearCoat; - } - return true; } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.azsl index cb01754e46..8d80a183f3 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.azsl @@ -28,7 +28,6 @@ ShaderResourceGroup PassSrg : SRG_PerPass Texture2DMS<float> m_depth; Texture2DMS<float4> m_normal; Texture2DMS<float4> m_specularF0; - Texture2DMS<float4> m_clearCoatNormal; Texture2D<float2> m_brdfMap; Sampler LinearSampler diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.shader index e6e4311e3d..24ba5c250b 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderInner.shader @@ -15,7 +15,7 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x7F", "WriteMask" : "0x00", "BackFace" : { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.azsl index 381d1459c1..0541824ef0 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.azsl @@ -30,7 +30,6 @@ ShaderResourceGroup PassSrg : SRG_PerPass Texture2DMS<float> m_depth; Texture2DMS<float4> m_normal; Texture2DMS<float4> m_specularF0; - Texture2DMS<float4> m_clearCoatNormal; Texture2DMS<float> m_blendWeight; Texture2D<float2> m_brdfMap; diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.shader index 62a979b458..68a2344fb5 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeRenderOuter.shader @@ -15,7 +15,7 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", + "ReadMask" : "0x7F", "WriteMask" : "0x00", "BackFace" : { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.azsl index ce96e436a4..4b33089199 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.azsl @@ -17,8 +17,8 @@ // This shader stencils the pixels covered by inner probe volumes. This will // exclude them from blending operations in the later passes since inner volumes // always blend at 100%. Note that this shader only considers pixels that were -// stenciled with the UseSpecularIBLPass value when they were rendered in the forward pass. -// It increases the stencil value if they are in an inner volume (i.e., makes their stencil > 1). +// stenciled with the UseIBLSpecularPass value when they were rendered in the forward pass. +// It increases the stencil value if they are in an inner volume. #include <viewsrg.srgi> @@ -62,4 +62,4 @@ VSOutput MainVS(VSInput vsInput) return OUT; } -// No PS since this shader just sets the stencil \ No newline at end of file +// No PS since this shader just sets the stencil diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.shader index a6d6301009..c4a0bb3c8b 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionProbeStencil.shader @@ -17,8 +17,8 @@ "Stencil" : { "Enable" : true, - "ReadMask" : "0xFF", - "WriteMask" : "0xFF", + "ReadMask" : "0x7F", + "WriteMask" : "0x7F", "FrontFace" : { "Func" : "Less", diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurHorizontal.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurHorizontal.azsl index 5a94b50c7f..4b7304511d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurHorizontal.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurHorizontal.azsl @@ -38,4 +38,4 @@ PSOutput MainPS(VSOutput IN) PSOutput OUT; OUT.m_color = float4(result, 1.0f); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurVertical.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurVertical.azsl index 4e4043ceea..5b856e436d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurVertical.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceBlurVertical.azsl @@ -39,4 +39,4 @@ PSOutput MainPS(VSOutput IN) PSOutput OUT; OUT.m_color = float4(result, 1.0f); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceTrace.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceTrace.azsl index 0c26f3f1f0..9a41ac867e 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceTrace.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Reflections/ReflectionScreenSpaceTrace.azsl @@ -99,4 +99,4 @@ PSOutput MainPS(VSOutput IN) PSOutput OUT; OUT.m_color = result; return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/ScreenSpace/DeferredFog.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/ScreenSpace/DeferredFog.azsl index 07dc858259..831b89fe7f 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/ScreenSpace/DeferredFog.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/ScreenSpace/DeferredFog.azsl @@ -176,4 +176,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color = float4(PassSrg::m_fogColor, layerFogAmountWithStartDist); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.azsl index cae3011688..a89e25e3df 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.azsl @@ -159,7 +159,8 @@ void MainCS(uint3 thread_id: SV_DispatchThreadID) blendWeights.z = InstanceSrg::m_sourceBlendWeights[i * 4 + 2]; blendWeights.w = InstanceSrg::m_sourceBlendWeights[i * 4 + 3]; - // When all the blend weights of a vertex are zero it means its data is set by the CPU directly + // [TODO ATOM-15288] + // Temporary workaround. When all the blend weights of a vertex are zero it means its data is set by the CPU directly // and skinning must be skipped to not overwrite it (e.g. cloth simulation). if(!any(blendWeights)) { diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.shader b/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.shader index c2d84245b8..6bb4f3c289 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkinnedMesh/LinearSkinningCS.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl index f12a5ebf9c..1ee30a4f98 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/SkyBox/SkyBox.azsl @@ -165,4 +165,4 @@ PSOutput MainPS(VSOutput input) OUT.m_specular = float4(color, 1.0); OUT.m_reflection = float4(color, 1.0); return OUT; -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Textures/BRDFTexture.attimage b/Gems/Atom/Feature/Common/Assets/Textures/BRDFTexture.attimage index 9a79f38f3c..c31954c5c6 100644 --- a/Gems/Atom/Feature/Common/Assets/Textures/BRDFTexture.attimage +++ b/Gems/Atom/Feature/Common/Assets/Textures/BRDFTexture.attimage @@ -15,4 +15,4 @@ "Format": 24 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/Textures/NoiseLayers_CloudVoronoi.attimage b/Gems/Atom/Feature/Common/Assets/Textures/NoiseLayers_CloudVoronoi.attimage index a6663bc575..387449e8cb 100644 --- a/Gems/Atom/Feature/Common/Assets/Textures/NoiseLayers_CloudVoronoi.attimage +++ b/Gems/Atom/Feature/Common/Assets/Textures/NoiseLayers_CloudVoronoi.attimage @@ -15,4 +15,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake index 1b8c0e0987..f14fb4f4a0 100644 --- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake +++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake @@ -41,7 +41,6 @@ set(FILES Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.azsl Materials/Types/StandardMultilayerPBR_Shadowmap_WithPS.shader Materials/Types/StandardPBR.materialtype - Materials/Types/StandardPBR_AoState.lua Materials/Types/StandardPBR_ClearCoatEnableFeature.lua Materials/Types/StandardPBR_ClearCoatState.lua Materials/Types/StandardPBR_Common.azsli @@ -141,6 +140,7 @@ set(FILES Passes/Forward.pass Passes/ForwardCheckerboard.pass Passes/ForwardMSAA.pass + Passes/ForwardSubsurfaceMSAA.pass Passes/FullscreenCopy.pass Passes/FullscreenOutputOnly.pass Passes/ImGui.pass @@ -165,6 +165,7 @@ set(FILES Passes/MSAAResolveDepth.pass Passes/OpaqueParent.pass Passes/PostProcessParent.pass + Passes/ProjectedShadowmaps.pass Passes/RayTracingAccelerationStructure.pass Passes/ReflectionComposite.pass Passes/ReflectionCopyFrameBuffer.pass @@ -191,7 +192,6 @@ set(FILES Passes/SMAAConvertToPerceptualColor.pass Passes/SMAAEdgeDetection.pass Passes/SMAANeighborhoodBlending.pass - Passes/ProjectedShadowmaps.pass Passes/SsaoCompute.pass Passes/SsaoHalfRes.pass Passes/SsaoParent.pass @@ -230,14 +230,15 @@ set(FILES ShaderLib/Atom/Features/PBR/DefaultObjectSrg.azsli ShaderLib/Atom/Features/PBR/ForwardPassOutput.azsli ShaderLib/Atom/Features/PBR/ForwardPassSrg.azsli + ShaderLib/Atom/Features/PBR/ForwardSubsurfacePassOutput.azsli ShaderLib/Atom/Features/PBR/Hammersley.azsli - ShaderLib/Atom/Features/PBR/LightingModel.azsli ShaderLib/Atom/Features/PBR/LightingOptions.azsli ShaderLib/Atom/Features/PBR/LightingUtils.azsli - ShaderLib/Atom/Features/PBR/Surface.azsli ShaderLib/Atom/Features/PBR/TransparentPassSrg.azsli ShaderLib/Atom/Features/PBR/Lighting/DualSpecularLighting.azsli + ShaderLib/Atom/Features/PBR/Lighting/EnhancedLighting.azsli ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli + ShaderLib/Atom/Features/PBR/Lighting/SkinLighting.azsli ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli @@ -249,6 +250,8 @@ set(FILES ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli + ShaderLib/Atom/Features/PBR/Lights/SimplePointLight.azsli + ShaderLib/Atom/Features/PBR/Lights/SimpleSpotLight.azsli ShaderLib/Atom/Features/PBR/Microfacet/Brdf.azsli ShaderLib/Atom/Features/PBR/Microfacet/Fresnel.azsli ShaderLib/Atom/Features/PBR/Microfacet/Ggx.azsli @@ -256,6 +259,8 @@ set(FILES ShaderLib/Atom/Features/PBR/Surfaces/BasePbrSurfaceData.azsli ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli ShaderLib/Atom/Features/PBR/Surfaces/DualSpecularSurface.azsli + ShaderLib/Atom/Features/PBR/Surfaces/EnhancedSurface.azsli + ShaderLib/Atom/Features/PBR/Surfaces/SkinSurface.azsli ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli ShaderLib/Atom/Features/PostProcessing/Aces.azsli @@ -271,9 +276,12 @@ set(FILES ShaderLib/Atom/Features/Shadow/BicubicPcfFilters.azsli ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli ShaderLib/Atom/Features/Shadow/JitterTablePcf.azsli + ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli ShaderLib/Atom/Features/Shadow/Shadow.azsli ShaderLib/Atom/Features/Shadow/ShadowmapAtlasLib.azsli - ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli + ShaderLib/Atom/Features/Vertex/VertexHelper.azsli + ShaderResourceGroups/RayTracingSceneSrg.azsli + ShaderResourceGroups/RayTracingSceneSrgAll.azsli ShaderResourceGroups/SceneSrg.azsli ShaderResourceGroups/SceneSrgAll.azsli ShaderResourceGroups/SceneTimeSrg.azsli diff --git a/Gems/Atom/Feature/Common/Assets/generate_asset_cmake.bat b/Gems/Atom/Feature/Common/Assets/generate_asset_cmake.bat index 6642db5689..e341d5e686 100644 --- a/Gems/Atom/Feature/Common/Assets/generate_asset_cmake.bat +++ b/Gems/Atom/Feature/Common/Assets/generate_asset_cmake.bat @@ -50,4 +50,4 @@ echo set(FILES>> %OUTPUT_FILE% ) ) >> %OUTPUT_FILE% -@echo ) >> %OUTPUT_FILE% \ No newline at end of file +@echo ) >> %OUTPUT_FILE% diff --git a/Gems/Atom/Feature/Common/CMakeLists.txt b/Gems/Atom/Feature/Common/CMakeLists.txt index d96d812af0..20a680bce9 100644 --- a/Gems/Atom/Feature/Common/CMakeLists.txt +++ b/Gems/Atom/Feature/Common/CMakeLists.txt @@ -9,6 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) - add_subdirectory(Code) diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h index 7ad8bd8283..7875e38fc0 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h @@ -40,7 +40,6 @@ namespace AZ const RPI::Cullable& GetCullable() { return m_cullable; } private: - class MeshLoader : private Data::AssetBus::Handler { @@ -84,6 +83,11 @@ namespace AZ MaterialAssignmentMap m_materialAssignments; Data::Instance<RPI::Model> m_model; + + //! A reference to the original model asset in case it got cloned before creating the model instance. + Data::Asset<RPI::ModelAsset> m_originalModelAsset; + MeshFeatureProcessorInterface::RequiresCloneCallback m_requiresCloningCallback; + Data::Instance<RPI::ShaderResourceGroup> m_shaderResourceGroup; AZStd::unique_ptr<MeshLoader> m_meshLoader; RPI::Scene* m_scene = nullptr; @@ -99,6 +103,7 @@ namespace AZ bool m_rayTracingEnabled = true; bool m_visible = true; bool m_useForwardPassIblSpecular = false; + bool m_hasForwardPassIblSpecularMaterial = false; }; //! This feature processor handles static and dynamic non-skinned meshes. @@ -130,23 +135,28 @@ namespace AZ const Data::Asset<RPI::ModelAsset>& modelAsset, const MaterialAssignmentMap& materials = {}, bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true) override; + bool rayTracingEnabled = true, + RequiresCloneCallback requiresCloneCallback = {}) override; MeshHandle AcquireMesh( const Data::Asset<RPI::ModelAsset> &modelAsset, const Data::Instance<RPI::Material>& material, bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true) override; + bool rayTracingEnabled = true, + RequiresCloneCallback requiresCloneCallback = {}) override; bool ReleaseMesh(MeshHandle& meshHandle) override; MeshHandle CloneMesh(const MeshHandle& meshHandle) override; Data::Instance<RPI::Model> GetModel(const MeshHandle& meshHandle) const override; + Data::Asset<RPI::ModelAsset> GetModelAsset(const MeshHandle& meshHandle) const override; void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance<RPI::Material>& material) override; void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const MaterialAssignmentMap& materials) override; const MaterialAssignmentMap& GetMaterialAssignmentMap(const MeshHandle& meshHandle) const override; void ConnectModelChangeEventHandler(const MeshHandle& meshHandle, ModelChangedEvent::Handler& handler) override; - void SetTransform(const MeshHandle& meshHandle, const AZ::Transform& transform) override; + void SetTransform(const MeshHandle& meshHandle, const AZ::Transform& transform, + const AZ::Vector3& nonUniformScale = AZ::Vector3::CreateOne()) override; Transform GetTransform(const MeshHandle& meshHandle) override; + Vector3 GetNonUniformScale(const MeshHandle& meshHandle) override; void SetSortKey(const MeshHandle& meshHandle, RHI::DrawItemSortKey sortKey) override; RHI::DrawItemSortKey GetSortKey(const MeshHandle& meshHandle) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h index 77e3467fb9..c2360068de 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h @@ -12,9 +12,12 @@ #pragma once #include <AzCore/EBus/Event.h> +#include <AzCore/Outcome/Outcome.h> +#include <AzCore/std/functional.h> #include <Atom/Feature/Material/MaterialAssignment.h> #include <Atom/RPI.Public/Culling.h> #include <Atom/RPI.Public/FeatureProcessor.h> +#include <Atom/RPI.Reflect/Model/ModelAsset.h> #include <Atom/Utils/StableDynamicArray.h> namespace AZ @@ -32,19 +35,23 @@ namespace AZ using MeshHandle = StableDynamicArrayHandle<MeshDataInstance>; using ModelChangedEvent = Event<const Data::Instance<RPI::Model>>; + using RequiresCloneCallback = AZStd::function<bool(const Data::Asset<RPI::ModelAsset>& modelAsset)>; //! Acquires a model with an optional collection of material assignments. + //! @param requiresCloneCallback The callback indicates whether cloning is required for a given model asset. virtual MeshHandle AcquireMesh( const Data::Asset<RPI::ModelAsset>& modelAsset, const MaterialAssignmentMap& materials = {}, bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true) = 0; + bool rayTracingEnabled = true, + RequiresCloneCallback requiresCloneCallback = {}) = 0; //! Acquires a model with a single material applied to all its meshes. virtual MeshHandle AcquireMesh( const Data::Asset<RPI::ModelAsset>& modelAsset, const Data::Instance<RPI::Material>& material, bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true) = 0; + bool rayTracingEnabled = true, + RequiresCloneCallback requiresCloneCallback = {}) = 0; //! Releases the mesh handle virtual bool ReleaseMesh(MeshHandle& meshHandle) = 0; //! Creates a new instance and handle of a mesh using an existing MeshId. Currently, this will reset the new mesh to default materials. @@ -52,6 +59,8 @@ namespace AZ //! Gets the underlying RPI::Model instance for a meshHandle. May be null if the model has not loaded. virtual Data::Instance<RPI::Model> GetModel(const MeshHandle& meshHandle) const = 0; + //! Gets the underlying RPI::ModelAsset for a meshHandle. + virtual Data::Asset<RPI::ModelAsset> GetModelAsset(const MeshHandle& meshHandle) const = 0; //! Sets the MaterialAssignmentMap for a meshHandle, using just a single material for the DefaultMaterialAssignmentId. //! Note if there is already a material assignment map, this will replace the entire map with just a single material. virtual void SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance<RPI::Material>& material) = 0; @@ -61,15 +70,19 @@ namespace AZ virtual const MaterialAssignmentMap& GetMaterialAssignmentMap(const MeshHandle& meshHandle) const = 0; //! Connects a handler to any changes to an RPI::Model. Changes include loading and reloading. virtual void ConnectModelChangeEventHandler(const MeshHandle& meshHandle, ModelChangedEvent::Handler& handler) = 0; + //! Sets the transform for a given mesh handle. - virtual void SetTransform(const MeshHandle& meshHandle, const AZ::Transform& transform) = 0; + virtual void SetTransform(const MeshHandle& meshHandle, const Transform& transform, + const Vector3& nonUniformScale = Vector3::CreateOne()) = 0; //! Gets the transform for a given mesh handle. virtual Transform GetTransform(const MeshHandle& meshHandle) = 0; + //! Gets the non-uniform scale for a given mesh handle. + virtual Vector3 GetNonUniformScale(const MeshHandle& meshHandle) = 0; //! Sets the sort key for a given mesh handle. virtual void SetSortKey(const MeshHandle& meshHandle, RHI::DrawItemSortKey sortKey) = 0; //! Gets the sort key for a given mesh handle. virtual RHI::DrawItemSortKey GetSortKey(const MeshHandle& meshHandle) = 0; - //! Sets an LOD override for a given mesh handle. This LOD will always be rendered instead being automatitcally determined. + //! Sets an LOD override for a given mesh handle. This LOD will always be rendered instead being automatically determined. virtual void SetLodOverride(const MeshHandle& meshHandle, RPI::Cullable::LodOverride lodOverride) = 0; //! Gets the LOD override for a given mesh handle. virtual RPI::Cullable::LodOverride GetLodOverride(const MeshHandle& meshHandle) = 0; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshFeatureProcessorBus.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshFeatureProcessorBus.h index fc3140602e..e35e91a1f9 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshFeatureProcessorBus.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkinnedMesh/SkinnedMeshFeatureProcessorBus.h @@ -28,4 +28,4 @@ namespace AZ }; using SkinnedMeshFeatureProcessorNotificationBus = AZ::EBus<SkinnedMeshFeatureProcessorNotifications>; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkyBox/SkyBoxLUT.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkyBox/SkyBoxLUT.h index 9091174f78..e90f4c2b0b 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkyBox/SkyBoxLUT.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/SkyBox/SkyBoxLUT.h @@ -3813,4 +3813,4 @@ namespace AZ }; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h index 2344f745f8..ddec9a6a1d 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h @@ -50,8 +50,10 @@ namespace AZ // TransformServiceFeatureProcessorInterface overrides ... ObjectId ReserveObjectId() override; void ReleaseObjectId(ObjectId& id) override; - void SetTransformForId(ObjectId id, const AZ::Transform& transform) override; + void SetTransformForId(ObjectId id, const AZ::Transform& transform, + const AZ::Vector3& nonUniformScale = AZ::Vector3::CreateOne()) override; AZ::Transform GetTransformForId(ObjectId id) const override; + AZ::Vector3 GetNonUniformScaleForId(ObjectId id) const override; private: diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessorInterface.h index 0b17a9a5a0..bb3606b12b 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessorInterface.h @@ -13,6 +13,7 @@ #pragma once #include <AzCore/Math/Transform.h> +#include <AzCore/Math/Vector3.h> #include <Atom/RPI.Public/FeatureProcessor.h> namespace AZ @@ -34,11 +35,13 @@ namespace AZ //! Releases an object ID to be used by others. The passed in handle is invalidated. virtual void ReleaseObjectId(ObjectId& id) = 0; - //! Sets the transform for a given id. Id must be one reserved earlier. - virtual void SetTransformForId(ObjectId id, const AZ::Transform& transform) = 0; + //! Sets the transform (and optionally non-uniform scale) for a given id. Id must be one reserved earlier. + virtual void SetTransformForId(ObjectId id, const AZ::Transform& transform, + const AZ::Vector3& nonUniformScale = AZ::Vector3::CreateOne()) = 0; //! Gets the transform for a given id. Id must be one reserved earlier. virtual AZ::Transform GetTransformForId(ObjectId) const = 0; - + //! Gets the non-uniform scale for a given id. Id must be one reserved earlier. + virtual AZ::Vector3 GetNonUniformScaleForId(ObjectId id) const = 0; }; } } diff --git a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h index 6fc1ac0e30..39fd7b4380 100644 --- a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h @@ -19,29 +19,24 @@ namespace UnitTest class MockMeshFeatureProcessor : public AZ::Render::MeshFeatureProcessorInterface { public: - MOCK_METHOD3( - AcquireMesh, - MeshHandle(const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZ::Render::MaterialAssignmentMap&, bool)); - MOCK_METHOD3( - AcquireMesh, - MeshHandle( - const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZStd::intrusive_ptr<AZ ::RPI::Material>&, bool)); MOCK_METHOD1(ReleaseMesh, bool(MeshHandle&)); MOCK_METHOD1(CloneMesh, MeshHandle(const MeshHandle&)); MOCK_CONST_METHOD1(GetModel, AZStd::intrusive_ptr<AZ::RPI::Model>(const MeshHandle&)); + MOCK_CONST_METHOD1(GetModelAsset, AZ::Data::Asset<AZ::RPI::ModelAsset>(const MeshHandle&)); MOCK_CONST_METHOD1(GetMaterialAssignmentMap, const AZ::Render::MaterialAssignmentMap&(const MeshHandle&)); MOCK_METHOD2(ConnectModelChangeEventHandler, void(const MeshHandle&, ModelChangedEvent::Handler&)); - MOCK_METHOD2(SetTransform, void(const MeshHandle&, const AZ::Transform&)); + MOCK_METHOD3(SetTransform, void(const MeshHandle&, const AZ::Transform&, const AZ::Vector3&)); MOCK_METHOD2(SetExcludeFromReflectionCubeMaps, void(const MeshHandle&, bool)); MOCK_METHOD2(SetMaterialAssignmentMap, void(const MeshHandle&, const AZ::Data::Instance<AZ::RPI::Material>&)); MOCK_METHOD2(SetMaterialAssignmentMap, void(const MeshHandle&, const AZ::Render::MaterialAssignmentMap&)); - MOCK_METHOD1(GetTransform, AZ::Transform (const MeshHandle&)); + MOCK_METHOD1(GetTransform, AZ::Transform(const MeshHandle&)); + MOCK_METHOD1(GetNonUniformScale, AZ::Vector3(const MeshHandle&)); MOCK_METHOD2(SetSortKey, void (const MeshHandle&, AZ::RHI::DrawItemSortKey)); MOCK_METHOD1(GetSortKey, AZ::RHI::DrawItemSortKey(const MeshHandle&)); MOCK_METHOD2(SetLodOverride, void(const MeshHandle&, AZ::RPI::Cullable::LodOverride)); MOCK_METHOD1(GetLodOverride, AZ::RPI::Cullable::LodOverride(const MeshHandle&)); - MOCK_METHOD4(AcquireMesh, MeshHandle (const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZ::Render::MaterialAssignmentMap&, bool, bool)); - MOCK_METHOD4(AcquireMesh, MeshHandle (const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZ::Data::Instance<AZ::RPI::Material>&, bool, bool)); + MOCK_METHOD5(AcquireMesh, MeshHandle (const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZ::Render::MaterialAssignmentMap&, bool, bool, AZ::Render::MeshFeatureProcessorInterface::RequiresCloneCallback)); + MOCK_METHOD5(AcquireMesh, MeshHandle (const AZ::Data::Asset<AZ::RPI::ModelAsset>&, const AZ::Data::Instance<AZ::RPI::Material>&, bool, bool, AZ::Render::MeshFeatureProcessorInterface::RequiresCloneCallback)); MOCK_METHOD2(SetRayTracingEnabled, void (const MeshHandle&, bool)); MOCK_METHOD2(SetVisible, void (const MeshHandle&, bool)); MOCK_METHOD2(SetUseForwardPassIblSpecular, void (const MeshHandle&, bool)); diff --git a/Gems/Atom/Feature/Common/Code/Platform/Common/atom_feature_common_clang.cmake b/Gems/Atom/Feature/Common/Code/Platform/Common/atom_feature_common_clang.cmake index c15d0f9a05..5963f882c3 100644 --- a/Gems/Atom/Feature/Common/Code/Platform/Common/atom_feature_common_clang.cmake +++ b/Gems/Atom/Feature/Common/Code/Platform/Common/atom_feature_common_clang.cmake @@ -12,4 +12,4 @@ set(LY_COMPILE_OPTIONS PRIVATE -fexceptions -) \ No newline at end of file +) diff --git a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/AuxGeomDrawQueue.cpp b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/AuxGeomDrawQueue.cpp index dc53498c8b..7845c8f402 100644 --- a/Gems/Atom/Feature/Common/Code/Source/AuxGeom/AuxGeomDrawQueue.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/AuxGeom/AuxGeomDrawQueue.cpp @@ -504,7 +504,7 @@ namespace AZ box.m_faceCullMode = ConvertRPIFaceCullFlag(faceCull); box.m_color = color; box.m_scale = localMatrix3x4.ExtractScale() * extents; - box.m_position = localMatrix3x4.GetTranslation() + center; + box.m_position = matrix3x4 * center; box.m_rotationMatrix = Matrix3x3::CreateFromMatrix3x4(localMatrix3x4); box.m_pointSize = m_pointSize; box.m_viewProjOverrideIndex = viewProjOverrideIndex; diff --git a/Gems/Atom/Feature/Common/Code/Source/CommonSystemComponent.cpp b/Gems/Atom/Feature/Common/Code/Source/CommonSystemComponent.cpp index 5f7057c9be..be6d438a62 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CommonSystemComponent.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CommonSystemComponent.cpp @@ -96,6 +96,7 @@ #include <DiffuseProbeGrid/DiffuseProbeGridBlendDistancePass.h> #include <DiffuseProbeGrid/DiffuseProbeGridBorderUpdatePass.h> #include <DiffuseProbeGrid/DiffuseProbeGridRelocationPass.h> +#include <DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h> #include <DiffuseProbeGrid/DiffuseProbeGridRenderPass.h> #include <DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.h> #include <ReflectionScreenSpace/ReflectionScreenSpaceBlurPass.h> @@ -261,6 +262,7 @@ namespace AZ passSystem->AddPassCreator(Name("DiffuseProbeGridBlendDistancePass"), &Render::DiffuseProbeGridBlendDistancePass::Create); passSystem->AddPassCreator(Name("DiffuseProbeGridBorderUpdatePass"), &Render::DiffuseProbeGridBorderUpdatePass::Create); passSystem->AddPassCreator(Name("DiffuseProbeGridRelocationPass"), &Render::DiffuseProbeGridRelocationPass::Create); + passSystem->AddPassCreator(Name("DiffuseProbeGridClassificationPass"), &Render::DiffuseProbeGridClassificationPass::Create); passSystem->AddPassCreator(Name("DiffuseProbeGridRenderPass"), &Render::DiffuseProbeGridRenderPass::Create); passSystem->AddPassCreator(Name("LuminanceHistogramGeneratorPass"), &LuminanceHistogramGeneratorPass::Create); diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp index f44a56233e..04175c461f 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp @@ -1238,6 +1238,8 @@ namespace AZ void DirectionalLightFeatureProcessor::SetFilterParameterToPass(LightHandle handle, const RPI::View* cameraView) { + AZ_ATOM_PROFILE_FUNCTION("DirectionalLightFeatureProcessor", "DirectionalLightFeatureProcessor::SetFilterParameterToPass"); + if (handle != m_shadowingLightHandle) { return; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp index 91b8836cc9..987ed299b3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.cpp @@ -139,7 +139,6 @@ namespace AZ GetLightDataFromFeatureProcessor(); SetLightBuffersToSRG(); - SetLightListToSRG(); SetLightsCountToSRG(); SetConstantdataToSRG(); @@ -187,13 +186,6 @@ namespace AZ } } - void LightCullingPass::SetLightListToSRG() - { - auto inputIndex = m_shaderResourceGroup->FindShaderInputBufferIndex(AZ::Name("m_lightList")); - [[maybe_unused]] bool succeeded = m_shaderResourceGroup->SetBuffer(inputIndex, m_lightList); - AZ_Assert(succeeded, "SetImage failed for light list"); - } - void LightCullingPass::SetLightsCountToSRG() { for (auto& elem : m_lightdata) diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h index a84c531c06..d8699ea0c7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/LightCullingPass.h @@ -59,7 +59,6 @@ namespace AZ void SetLightBuffersToSRG(); void SetLightsCountToSRG(); void SetConstantdataToSRG(); - void SetLightListToSRG(); AZ::RHI::Size GetDepthBufferResolution(); float CreateTraceValues(const AZ::Vector2& unprojection); diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.cpp index eeb32cdd07..8a349083ea 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.cpp @@ -41,6 +41,7 @@ namespace AZ m_irradianceImageAttachmentId = AZStd::string::format("ProbeIrradianceImageAttachmentId_%s", uuidString.c_str()); m_distanceImageAttachmentId = AZStd::string::format("ProbeDistanceImageAttachmentId_%s", uuidString.c_str()); m_relocationImageAttachmentId = AZStd::string::format("ProbeRelocationImageAttachmentId_%s", uuidString.c_str()); + m_classificationImageAttachmentId = AZStd::string::format("ProbeClassificationImageAttachmentId_%s", uuidString.c_str()); // setup culling m_cullable.m_cullData.m_scene = m_scene; @@ -252,6 +253,20 @@ namespace AZ AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeRelocationImage image"); } + // probe classification + { + uint32_t width = probeCountX; + uint32_t height = probeCountY; + + m_classificationImage[m_currentImageIndex] = RHI::Factory::Get().CreateImage(); + + RHI::ImageInitRequest request; + request.m_image = m_classificationImage[m_currentImageIndex].get(); + request.m_descriptor = RHI::ImageDescriptor::Create2D(RHI::ImageBindFlags::ShaderReadWrite, width, height, DiffuseProbeGridRenderData::ClassificationImageFormat); + RHI::ResultCode result = m_renderData->m_imagePool->InitImage(request); + AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeClassificationImage image"); + } + m_updateTextures = false; // textures have changed so we need to update the render Srg to bind the new ones @@ -401,6 +416,10 @@ namespace AZ imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeOffsets")); m_rayTraceSrg->SetImageView(imageIndex, m_relocationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRelocationImageViewDescriptor).get()); + // probe classification + imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeStates")); + m_rayTraceSrg->SetImageView(imageIndex, m_classificationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeClassificationImageViewDescriptor).get()); + // grid settings constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_ambientMultiplier")); m_rayTraceSrg->SetConstant(constantIndex, m_ambientMultiplier); @@ -431,6 +450,9 @@ namespace AZ imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeIrradiance")); m_blendIrradianceSrg->SetImageView(imageIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get()); + imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeStates")); + m_blendIrradianceSrg->SetImageView(imageIndex, m_classificationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeClassificationImageViewDescriptor).get()); + SetGridConstants(m_blendIrradianceSrg); } @@ -451,6 +473,9 @@ namespace AZ imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeDistance")); m_blendDistanceSrg->SetImageView(imageIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get()); + imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeStates")); + m_blendDistanceSrg->SetImageView(imageIndex, m_classificationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeClassificationImageViewDescriptor).get()); + SetGridConstants(m_blendDistanceSrg); } @@ -559,6 +584,27 @@ namespace AZ SetGridConstants(m_relocationSrg); } + void DiffuseProbeGrid::UpdateClassificationSrg(const Data::Asset<RPI::ShaderResourceGroupAsset>& srgAsset) + { + if (!m_classificationSrg) + { + m_classificationSrg = RPI::ShaderResourceGroup::Create(srgAsset); + AZ_Error("DiffuseProbeGrid", m_classificationSrg.get(), "Failed to create Classification shader resource group"); + } + + const RHI::ShaderResourceGroupLayout* srgLayout = m_classificationSrg->GetLayout(); + RHI::ShaderInputConstantIndex constantIndex; + RHI::ShaderInputImageIndex imageIndex; + + imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace")); + m_classificationSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get()); + + imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeStates")); + m_classificationSrg->SetImageView(imageIndex, m_classificationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeClassificationImageViewDescriptor).get()); + + SetGridConstants(m_classificationSrg); + } + void DiffuseProbeGrid::UpdateRenderObjectSrg() { if (!m_updateRenderObjectSrg) @@ -601,6 +647,9 @@ namespace AZ imageIndex = srgLayout->FindShaderInputImageIndex(Name("m_probeOffsets")); m_renderObjectSrg->SetImageView(imageIndex, m_relocationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRelocationImageViewDescriptor).get()); + imageIndex = srgLayout->FindShaderInputImageIndex(Name("m_probeStates")); + m_renderObjectSrg->SetImageView(imageIndex, m_classificationImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeClassificationImageViewDescriptor).get()); + SetGridConstants(m_renderObjectSrg); m_updateRenderObjectSrg = false; diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.h b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.h index a92daeffaa..e1ca2123a5 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.h +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGrid.h @@ -30,6 +30,7 @@ namespace AZ static const RHI::Format IrradianceImageFormat = RHI::Format::R16G16B16A16_UNORM; static const RHI::Format DistanceImageFormat = RHI::Format::R32G32_FLOAT; static const RHI::Format RelocationImageFormat = RHI::Format::R16G16B16A16_FLOAT; + static const RHI::Format ClassificationImageFormat = RHI::Format::R8_UINT; // image pool RHI::Ptr<RHI::ImagePool> m_imagePool; @@ -43,6 +44,7 @@ namespace AZ RHI::ImageViewDescriptor m_probeIrradianceImageViewDescriptor; RHI::ImageViewDescriptor m_probeDistanceImageViewDescriptor; RHI::ImageViewDescriptor m_probeRelocationImageViewDescriptor; + RHI::ImageViewDescriptor m_probeClassificationImageViewDescriptor; // render pipeline state RPI::Ptr<RPI::PipelineStateForDraw> m_pipelineState; @@ -118,6 +120,7 @@ namespace AZ const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateRowDistanceSrg() const { return m_borderUpdateRowDistanceSrg; } const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateColumnDistanceSrg() const { return m_borderUpdateColumnDistanceSrg; } const Data::Instance<RPI::ShaderResourceGroup>& GetRelocationSrg() const { return m_relocationSrg; } + const Data::Instance<RPI::ShaderResourceGroup>& GetClassificationSrg() const { return m_classificationSrg; } const Data::Instance<RPI::ShaderResourceGroup>& GetRenderObjectSrg() const { return m_renderObjectSrg; } // Srg updates @@ -126,6 +129,7 @@ namespace AZ void UpdateBlendDistanceSrg(const Data::Asset<RPI::ShaderResourceGroupAsset>& srgAsset); void UpdateBorderUpdateSrgs(const Data::Asset<RPI::ShaderResourceGroupAsset>& rowSrgAsset, const Data::Asset<RPI::ShaderResourceGroupAsset>& columnSrgAsset); void UpdateRelocationSrg(const Data::Asset<RPI::ShaderResourceGroupAsset>& srgAsset); + void UpdateClassificationSrg(const Data::Asset<RPI::ShaderResourceGroupAsset>& srgAsset); void UpdateRenderObjectSrg(); // textures @@ -133,12 +137,14 @@ namespace AZ const RHI::Ptr<RHI::Image>& GetIrradianceImage() { return m_irradianceImage[m_currentImageIndex]; } const RHI::Ptr<RHI::Image>& GetDistanceImage() { return m_distanceImage[m_currentImageIndex]; } const RHI::Ptr<RHI::Image>& GetRelocationImage() { return m_relocationImage[m_currentImageIndex]; } + const RHI::Ptr<RHI::Image>& GetClassificationImage() { return m_classificationImage[m_currentImageIndex]; } // attachment Ids const RHI::AttachmentId GetRayTraceImageAttachmentId() const { return m_rayTraceImageAttachmentId; } const RHI::AttachmentId GetIrradianceImageAttachmentId() const { return m_irradianceImageAttachmentId; } const RHI::AttachmentId GetDistanceImageAttachmentId() const { return m_distanceImageAttachmentId; } const RHI::AttachmentId GetRelocationImageAttachmentId() const { return m_relocationImageAttachmentId; } + const RHI::AttachmentId GetClassificationImageAttachmentId() const { return m_classificationImageAttachmentId; } const DiffuseProbeGridRenderData* GetRenderData() const { return m_renderData; } @@ -222,6 +228,7 @@ namespace AZ RHI::Ptr<RHI::Image> m_irradianceImage[ImageFrameCount]; RHI::Ptr<RHI::Image> m_distanceImage[ImageFrameCount]; RHI::Ptr<RHI::Image> m_relocationImage[ImageFrameCount]; + RHI::Ptr<RHI::Image> m_classificationImage[ImageFrameCount]; uint32_t m_currentImageIndex = 0; bool m_updateTextures = false; bool m_irradianceClearRequired = true; @@ -235,6 +242,7 @@ namespace AZ Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateRowDistanceSrg; Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateColumnDistanceSrg; Data::Instance<RPI::ShaderResourceGroup> m_relocationSrg; + Data::Instance<RPI::ShaderResourceGroup> m_classificationSrg; Data::Instance<RPI::ShaderResourceGroup> m_renderObjectSrg; bool m_updateRenderObjectSrg = true; @@ -243,6 +251,7 @@ namespace AZ RHI::AttachmentId m_irradianceImageAttachmentId; RHI::AttachmentId m_distanceImageAttachmentId; RHI::AttachmentId m_relocationImageAttachmentId; + RHI::AttachmentId m_classificationImageAttachmentId; }; } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendDistancePass.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendDistancePass.cpp index 33c14afe86..3df13556d3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendDistancePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendDistancePass.cpp @@ -132,6 +132,16 @@ namespace AZ frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); } + + // probe classification image + { + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetClassificationImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeClassificationImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } } } diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendIrradiancePass.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendIrradiancePass.cpp index 5d25b68b18..4e05b8ef31 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendIrradiancePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridBlendIrradiancePass.cpp @@ -132,6 +132,16 @@ namespace AZ frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); } + + // probe classification image + { + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetClassificationImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeClassificationImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } } } diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.cpp new file mode 100644 index 0000000000..db85914cee --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.cpp @@ -0,0 +1,182 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h> +#include <Atom/RHI/Factory.h> +#include <Atom/RHI/PipelineState.h> +#include <Atom/RHI/FrameGraphInterface.h> +#include <Atom/RHI/FrameGraphAttachmentInterface.h> +#include <Atom/RHI/Device.h> +#include <Atom/RPI.Public/Pass/PassUtils.h> +#include <Atom/RPI.Public/RenderPipeline.h> +#include <Atom/RPI.Public/RPIUtils.h> +#include <Atom/RPI.Reflect/Pass/PassTemplate.h> +#include <Atom/RPI.Public/View.h> +#include <Atom/RPI.Public/Scene.h> +#include <DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.h> +#include <RayTracing/RayTracingFeatureProcessor.h> + +namespace AZ +{ + namespace Render + { + RPI::Ptr<DiffuseProbeGridClassificationPass> DiffuseProbeGridClassificationPass::Create(const RPI::PassDescriptor& descriptor) + { + RPI::Ptr<DiffuseProbeGridClassificationPass> pass = aznew DiffuseProbeGridClassificationPass(descriptor); + return AZStd::move(pass); + } + + DiffuseProbeGridClassificationPass::DiffuseProbeGridClassificationPass(const RPI::PassDescriptor& descriptor) + : RPI::RenderPass(descriptor) + { + LoadShader(); + } + + void DiffuseProbeGridClassificationPass::LoadShader() + { + // load shader + // Note: the shader may not be available on all platforms + AZStd::string shaderFilePath = "Shaders/DiffuseGlobalIllumination/DiffuseProbeGridClassification.azshader"; + m_shader = RPI::LoadShader(shaderFilePath); + if (m_shader == nullptr) + { + return; + } + + // load pipeline state + RHI::PipelineStateDescriptorForDispatch pipelineStateDescriptor; + const auto& shaderVariant = m_shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId); + shaderVariant.ConfigurePipelineState(pipelineStateDescriptor); + m_pipelineState = m_shader->AcquirePipelineState(pipelineStateDescriptor); + + // load Pass Srg asset + m_srgAsset = m_shader->FindShaderResourceGroupAsset(RPI::SrgBindingSlot::Pass); + + // retrieve the number of threads per thread group from the shader + const auto numThreads = m_shader->GetAsset()->GetAttribute(RHI::ShaderStage::Compute, Name{ "numthreads" }); + if (numThreads) + { + const RHI::ShaderStageAttributeArguments& args = *numThreads; + bool validArgs = args.size() == 3; + if (validArgs) + { + validArgs &= args[0].type() == azrtti_typeid<int>(); + validArgs &= args[1].type() == azrtti_typeid<int>(); + validArgs &= args[2].type() == azrtti_typeid<int>(); + } + + if (!validArgs) + { + AZ_Error("PassSystem", false, "[DiffuseProbeClassificationPass '%s']: Shader '%s' contains invalid numthreads arguments.", GetPathName().GetCStr(), shaderFilePath.c_str()); + return; + } + + m_dispatchArgs.m_threadsPerGroupX = AZStd::any_cast<int>(args[0]); + m_dispatchArgs.m_threadsPerGroupY = AZStd::any_cast<int>(args[1]); + m_dispatchArgs.m_threadsPerGroupZ = AZStd::any_cast<int>(args[2]); + } + } + + void DiffuseProbeGridClassificationPass::FrameBeginInternal(FramePrepareParams params) + { + RPI::Scene* scene = m_pipeline->GetScene(); + DiffuseProbeGridFeatureProcessor* diffuseProbeGridFeatureProcessor = scene->GetFeatureProcessor<DiffuseProbeGridFeatureProcessor>(); + + if (!diffuseProbeGridFeatureProcessor || diffuseProbeGridFeatureProcessor->GetProbeGrids().empty()) + { + // no diffuse probe grids + return; + } + + RayTracingFeatureProcessor* rayTracingFeatureProcessor = scene->GetFeatureProcessor<RayTracingFeatureProcessor>(); + AZ_Assert(rayTracingFeatureProcessor, "DiffuseProbeGridClassificationPass requires the RayTracingFeatureProcessor"); + + if (!rayTracingFeatureProcessor->GetSubMeshCount()) + { + // empty scene + return; + } + + RenderPass::FrameBeginInternal(params); + } + + void DiffuseProbeGridClassificationPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) + { + RenderPass::SetupFrameGraphDependencies(frameGraph); + + RPI::Scene* scene = m_pipeline->GetScene(); + DiffuseProbeGridFeatureProcessor* diffuseProbeGridFeatureProcessor = scene->GetFeatureProcessor<DiffuseProbeGridFeatureProcessor>(); + for (auto& diffuseProbeGrid : diffuseProbeGridFeatureProcessor->GetProbeGrids()) + { + // probe raytrace image + { + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetRayTraceImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeRayTraceImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } + + // probe classification image + { + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetClassificationImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeClassificationImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } + } + } + + void DiffuseProbeGridClassificationPass::CompileResources([[maybe_unused]] const RHI::FrameGraphCompileContext& context) + { + RPI::Scene* scene = m_pipeline->GetScene(); + DiffuseProbeGridFeatureProcessor* diffuseProbeGridFeatureProcessor = scene->GetFeatureProcessor<DiffuseProbeGridFeatureProcessor>(); + for (auto& diffuseProbeGrid : diffuseProbeGridFeatureProcessor->GetProbeGrids()) + { + // the diffuse probe grid Srg must be updated in the Compile phase in order to successfully bind the ReadWrite shader inputs + // (see ValidateSetImageView() in ShaderResourceGroupData.cpp) + diffuseProbeGrid->UpdateClassificationSrg(m_srgAsset); + diffuseProbeGrid->GetClassificationSrg()->Compile(); + } + } + + void DiffuseProbeGridClassificationPass::BuildCommandListInternal(const RHI::FrameGraphExecuteContext& context) + { + RHI::CommandList* commandList = context.GetCommandList(); + RPI::Scene* scene = m_pipeline->GetScene(); + DiffuseProbeGridFeatureProcessor* diffuseProbeGridFeatureProcessor = scene->GetFeatureProcessor<DiffuseProbeGridFeatureProcessor>(); + + // submit the DispatchItems for each DiffuseProbeGrid + for (auto& diffuseProbeGrid : diffuseProbeGridFeatureProcessor->GetProbeGrids()) + { + const RHI::ShaderResourceGroup* shaderResourceGroup = diffuseProbeGrid->GetClassificationSrg()->GetRHIShaderResourceGroup(); + commandList->SetShaderResourceGroupForDispatch(*shaderResourceGroup); + + uint32_t probeCountX; + uint32_t probeCountY; + diffuseProbeGrid->GetTexture2DProbeCount(probeCountX, probeCountY); + + RHI::DispatchItem dispatchItem; + dispatchItem.m_arguments = m_dispatchArgs; + dispatchItem.m_pipelineState = m_pipelineState; + dispatchItem.m_arguments.m_direct.m_totalNumberOfThreadsX = probeCountX; + dispatchItem.m_arguments.m_direct.m_totalNumberOfThreadsY = probeCountY; + dispatchItem.m_arguments.m_direct.m_totalNumberOfThreadsZ = 1; + + commandList->Submit(dispatchItem); + } + } + } // namespace Render +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h new file mode 100644 index 0000000000..677e16ac42 --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h @@ -0,0 +1,63 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include <AzCore/Memory/SystemAllocator.h> + +#include <Atom/RHI/CommandList.h> +#include <Atom/RHI/DrawItem.h> +#include <Atom/RHI/ScopeProducer.h> +#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h> +#include <Atom/RPI.Public/Pass/ComputePass.h> +#include <Atom/RPI.Public/Shader/Shader.h> +#include <Atom/RPI.Public/Shader/ShaderResourceGroup.h> +#include <Atom/RPI.Reflect/Pass/PassName.h> +#include <Atom/RPI.Public/Image/AttachmentImage.h> +#include <DiffuseProbeGrid/DiffuseProbeGrid.h> + +namespace AZ +{ + namespace Render + { + //! Compute shader that classifies probes as active or inactive in the diffuse probe grid. + class DiffuseProbeGridClassificationPass final + : public RPI::RenderPass + { + public: + AZ_RPI_PASS(DiffuseProbeGridClassificationPass); + + AZ_RTTI(AZ::Render::DiffuseProbeGridClassificationPass, "{98A6477A-F31C-4390-9BEB-9DB8E30BB281}", RPI::RenderPass); + AZ_CLASS_ALLOCATOR(DiffuseProbeGridClassificationPass, SystemAllocator, 0); + virtual ~DiffuseProbeGridClassificationPass() = default; + + static RPI::Ptr<DiffuseProbeGridClassificationPass> Create(const RPI::PassDescriptor& descriptor); + + private: + DiffuseProbeGridClassificationPass(const RPI::PassDescriptor& descriptor); + + void LoadShader(); + + // Pass overrides + void FrameBeginInternal(FramePrepareParams params) override; + + void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; + void CompileResources(const RHI::FrameGraphCompileContext& context) override; + void BuildCommandListInternal(const RHI::FrameGraphExecuteContext& context) override; + + // shader + Data::Instance<RPI::Shader> m_shader; + const RHI::PipelineState* m_pipelineState = nullptr; + Data::Asset<RPI::ShaderResourceGroupAsset> m_srgAsset; + RHI::DispatchDirect m_dispatchArgs; + }; + } // namespace Render +} // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.cpp index 8f39b6e1b3..1aaa06c797 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessor.cpp @@ -73,6 +73,7 @@ namespace AZ m_probeGridRenderData.m_probeIrradianceImageViewDescriptor = RHI::ImageViewDescriptor::Create(DiffuseProbeGridRenderData::IrradianceImageFormat, 0, 0); m_probeGridRenderData.m_probeDistanceImageViewDescriptor = RHI::ImageViewDescriptor::Create(DiffuseProbeGridRenderData::DistanceImageFormat, 0, 0); m_probeGridRenderData.m_probeRelocationImageViewDescriptor = RHI::ImageViewDescriptor::Create(DiffuseProbeGridRenderData::RelocationImageFormat, 0, 0); + m_probeGridRenderData.m_probeClassificationImageViewDescriptor = RHI::ImageViewDescriptor::Create(DiffuseProbeGridRenderData::ClassificationImageFormat, 0, 0); // load shader // Note: the shader may not be available on all platforms diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRayTracingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRayTracingPass.cpp index ddda810eb7..6a0e618830 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRayTracingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRayTracingPass.cpp @@ -291,6 +291,19 @@ namespace AZ frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); } + + // probe classification + { + RHI::ResultCode result = frameGraph.GetAttachmentDatabase().ImportImage(diffuseProbeGrid->GetClassificationImageAttachmentId(), diffuseProbeGrid->GetClassificationImage()); + AZ_Assert(result == RHI::ResultCode::Success, "Failed to import probeClassificationImage"); + + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetClassificationImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeClassificationImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } } } diff --git a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.cpp index c5ac94607e..af6fce6f6a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.cpp @@ -117,6 +117,16 @@ namespace AZ frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); } + + // probe classification image + { + RHI::ImageScopeAttachmentDescriptor desc; + desc.m_attachmentId = diffuseProbeGrid->GetClassificationImageAttachmentId(); + desc.m_imageViewDescriptor = diffuseProbeGrid->GetRenderData()->m_probeClassificationImageViewDescriptor; + desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::Load; + + frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::ReadWrite); + } } Base::SetupFrameGraphDependencies(frameGraph); diff --git a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp index 8c86169d5c..a29354f723 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp @@ -197,6 +197,7 @@ namespace AZ AzFramework::InputDeviceKeyboard::Key::EditSpace, // ImGuiKey_Space AzFramework::InputDeviceKeyboard::Key::EditEnter, // ImGuiKey_Enter AzFramework::InputDeviceKeyboard::Key::Escape, // ImGuiKey_Escape + AzFramework::InputDeviceKeyboard::Key::NumPadEnter, // ImGuiKey_KeyPadEnter AzFramework::InputDeviceKeyboard::Key::AlphanumericA, // ImGuiKey_A AzFramework::InputDeviceKeyboard::Key::AlphanumericC, // ImGuiKey_C AzFramework::InputDeviceKeyboard::Key::AlphanumericV, // ImGuiKey_V diff --git a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp index 5f39c6bc38..29f0636e9e 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp @@ -21,6 +21,8 @@ #include <Atom/RPI.Public/Culling.h> #include <Atom/Utils/StableDynamicArray.h> +#include <Atom/RPI.Reflect/Model/ModelAssetCreator.h> + #include <AtomCore/Instance/InstanceDatabase.h> #include <AzCore/Console/IConsole.h> @@ -150,7 +152,8 @@ namespace AZ const Data::Asset<RPI::ModelAsset>& modelAsset, const MaterialAssignmentMap& materials, bool skinnedMeshWithMotion, - bool rayTracingEnabled) + bool rayTracingEnabled, + RequiresCloneCallback requiresCloneCallback) { AZ_PROFILE_FUNCTION(Debug::ProfileCategory::AzRender); @@ -166,8 +169,9 @@ namespace AZ meshDataHandle->m_scene = GetParentScene(); meshDataHandle->m_materialAssignments = materials; - meshDataHandle->m_objectId = m_transformService->ReserveObjectId(); + meshDataHandle->m_originalModelAsset = modelAsset; + meshDataHandle->m_requiresCloningCallback = requiresCloneCallback; meshDataHandle->m_meshLoader = AZStd::make_unique<MeshDataInstance::MeshLoader>(modelAsset, &*meshDataHandle); return meshDataHandle; @@ -177,13 +181,14 @@ namespace AZ const Data::Asset<RPI::ModelAsset>& modelAsset, const Data::Instance<RPI::Material>& material, bool skinnedMeshWithMotion, - bool rayTracingEnabled) + bool rayTracingEnabled, + RequiresCloneCallback requiresCloneCallback) { Render::MaterialAssignmentMap materials; Render::MaterialAssignment& defaultMaterial = materials[AZ::Render::DefaultMaterialAssignmentId]; defaultMaterial.m_materialInstance = material; - return AcquireMesh(modelAsset, materials, skinnedMeshWithMotion, rayTracingEnabled); + return AcquireMesh(modelAsset, materials, skinnedMeshWithMotion, rayTracingEnabled, requiresCloneCallback); } bool MeshFeatureProcessor::ReleaseMesh(MeshHandle& meshHandle) @@ -205,7 +210,7 @@ namespace AZ { if (meshHandle.IsValid()) { - MeshHandle clone = AcquireMesh(meshHandle->m_model->GetModelAsset(), meshHandle->m_materialAssignments); + MeshHandle clone = AcquireMesh(meshHandle->m_originalModelAsset, meshHandle->m_materialAssignments); return clone; } return MeshFeatureProcessor::MeshHandle(); @@ -216,6 +221,16 @@ namespace AZ return meshHandle.IsValid() ? meshHandle->m_model : nullptr; } + Data::Asset<RPI::ModelAsset> MeshFeatureProcessor::GetModelAsset(const MeshHandle& meshHandle) const + { + if (meshHandle.IsValid()) + { + return meshHandle->m_originalModelAsset; + } + + return {}; + } + void MeshFeatureProcessor::SetMaterialAssignmentMap(const MeshHandle& meshHandle, const Data::Instance<RPI::Material>& material) { Render::MaterialAssignmentMap materials; @@ -240,6 +255,8 @@ namespace AZ { meshHandle->m_materialAssignments = materials; } + + meshHandle->m_objectSrgNeedsUpdate = true; } } @@ -256,7 +273,7 @@ namespace AZ } } - void MeshFeatureProcessor::SetTransform(const MeshHandle& meshHandle, const AZ::Transform& transform) + void MeshFeatureProcessor::SetTransform(const MeshHandle& meshHandle, const AZ::Transform& transform, const AZ::Vector3& nonUniformScale) { if (meshHandle.IsValid()) { @@ -264,12 +281,12 @@ namespace AZ meshData.m_cullBoundsNeedsUpdate = true; meshData.m_objectSrgNeedsUpdate = true; - m_transformService->SetTransformForId(meshHandle->m_objectId, transform); + m_transformService->SetTransformForId(meshHandle->m_objectId, transform, nonUniformScale); // ray tracing data needs to be updated with the new transform if (m_rayTracingFeatureProcessor) { - m_rayTracingFeatureProcessor->SetMeshTransform(meshHandle->m_objectId, transform); + m_rayTracingFeatureProcessor->SetMeshTransform(meshHandle->m_objectId, transform, nonUniformScale); } } } @@ -287,6 +304,19 @@ namespace AZ } } + Vector3 MeshFeatureProcessor::GetNonUniformScale(const MeshHandle& meshHandle) + { + if (meshHandle.IsValid()) + { + return m_transformService->GetNonUniformScaleForId(meshHandle->m_objectId); + } + else + { + AZ_Assert(false, "Invalid mesh handle"); + return Vector3::CreateOne(); + } + } + void MeshFeatureProcessor::SetSortKey(const MeshHandle& meshHandle, RHI::DrawItemSortKey sortKey) { if (meshHandle.IsValid()) @@ -415,7 +445,6 @@ namespace AZ } // MeshDataInstance::MeshLoader... - MeshDataInstance::MeshLoader::MeshLoader(const Data::Asset<RPI::ModelAsset>& modelAsset, MeshDataInstance* parent) : m_modelAsset(modelAsset) , m_parent(parent) @@ -428,10 +457,13 @@ namespace AZ return; } - // Check if the model is in the instance database + // Check if the model is in the instance database and skip the loading process in this case. + // The model asset id is used as instance id to indicate that it is a static and shared. Data::Instance<RPI::Model> model = Data::InstanceDatabase<RPI::Model>::Instance().Find(Data::InstanceId::CreateFromAssetId(m_modelAsset.GetId())); if (model) { + // In case the mesh asset requires instancing (e.g. when containing a cloth buffer), the model will always be cloned and there will not be a + // model instance with the asset id as instance id as searched above. m_parent->Init(model); m_modelChangedEvent.Signal(AZStd::move(model)); return; @@ -455,8 +487,35 @@ namespace AZ void MeshDataInstance::MeshLoader::OnAssetReady(Data::Asset<Data::AssetData> asset) { AZ_PROFILE_FUNCTION(Debug::ProfileCategory::AzRender); + Data::Asset<RPI::ModelAsset> modelAsset = asset; - Data::Instance<RPI::Model> model = RPI::Model::FindOrCreate(asset); + // Assign the fully loaded asset back to the mesh handle to not only hold asset id, but the actual data as well. + m_parent->m_originalModelAsset = asset; + + Data::Instance<RPI::Model> model; + // Check if a requires cloning callback got set and if so check if cloning the model asset is requested. + if (m_parent->m_requiresCloningCallback && + m_parent->m_requiresCloningCallback(modelAsset)) + { + // Clone the model asset to force create another model instance. + AZ::Data::AssetId newId(AZ::Uuid::CreateRandom(), /*subId=*/0); + Data::Asset<RPI::ModelAsset> clonedAsset; + if (AZ::RPI::ModelAssetCreator::Clone(modelAsset, clonedAsset, newId)) + { + model = RPI::Model::FindOrCreate(clonedAsset); + } + else + { + AZ_Error("MeshDataInstance", false, "Cannot clone model for '%s'. Cloth simulation results won't be individual per entity.", modelAsset->GetName().GetCStr()); + model = RPI::Model::FindOrCreate(modelAsset); + } + } + else + { + // Static mesh, no cloth buffer present. + model = RPI::Model::FindOrCreate(modelAsset); + } + if (model) { m_parent->Init(model); @@ -547,6 +606,8 @@ namespace AZ drawPacketListOut.clear(); drawPacketListOut.reserve(meshCount); + m_hasForwardPassIblSpecularMaterial = false; + for (size_t meshIndex = 0; meshIndex < meshCount; ++meshIndex) { Data::Instance<RPI::Material> material = modelLod.GetMeshes()[meshIndex].m_material; @@ -602,7 +663,16 @@ namespace AZ AZ_Warning("MeshDrawPacket", false, "Failed to set o_meshUseForwardPassIBLSpecular on mesh draw packet"); } - drawPacket.SetStencilRef(m_useForwardPassIblSpecular || MaterialRequiresForwardPassIblSpecular(material) ? Render::StencilRefs::None : Render::StencilRefs::UseIBLSpecularPass); + bool materialRequiresForwardPassIblSpecular = MaterialRequiresForwardPassIblSpecular(material); + + // track whether any materials in this mesh require ForwardPassIblSpecular, we need this information when the ObjectSrg is updated + m_hasForwardPassIblSpecularMaterial |= materialRequiresForwardPassIblSpecular; + + // stencil bits + uint8_t stencilRef = m_useForwardPassIblSpecular || materialRequiresForwardPassIblSpecular ? Render::StencilRefs::None : Render::StencilRefs::UseIBLSpecularPass; + stencilRef |= Render::StencilRefs::UseDiffuseGIPass; + + drawPacket.SetStencilRef(stencilRef); drawPacket.SetSortKey(m_sortKey); drawPacket.Update(*m_scene, false); drawPacketListOut.emplace_back(AZStd::move(drawPacket)); @@ -845,10 +915,13 @@ namespace AZ AZ_Assert(m_model, "The model has not finished loading yet"); Transform localToWorld = transformService->GetTransformForId(m_objectId); + Vector3 nonUniformScale = transformService->GetNonUniformScaleForId(m_objectId); Vector3 center; float radius; Aabb localAabb = m_model->GetAabb(); + localAabb.MultiplyByScale(nonUniformScale); + localAabb.GetTransformedAabb(localToWorld).GetAsSphere(center, radius); m_cullable.m_cullData.m_boundingSphere = Sphere(center, radius); @@ -891,7 +964,9 @@ namespace AZ return; } - if (m_useForwardPassIblSpecular) + ReflectionProbeFeatureProcessor* reflectionProbeFeatureProcessor = m_scene->GetFeatureProcessor<ReflectionProbeFeatureProcessor>(); + + if (reflectionProbeFeatureProcessor && (m_useForwardPassIblSpecular || m_hasForwardPassIblSpecularMaterial)) { // retrieve probe constant indices AZ::RHI::ShaderInputConstantIndex posConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_aabbPos")); @@ -924,7 +999,6 @@ namespace AZ TransformServiceFeatureProcessor* transformServiceFeatureProcessor = m_scene->GetFeatureProcessor<TransformServiceFeatureProcessor>(); Transform transform = transformServiceFeatureProcessor->GetTransformForId(m_objectId); - ReflectionProbeFeatureProcessor* reflectionProbeFeatureProcessor = m_scene->GetFeatureProcessor<ReflectionProbeFeatureProcessor>(); ReflectionProbeFeatureProcessor::ReflectionProbeVector reflectionProbes; reflectionProbeFeatureProcessor->FindReflectionProbes(transform.GetTranslation(), reflectionProbes); @@ -952,10 +1026,25 @@ namespace AZ bool MeshDataInstance::MaterialRequiresForwardPassIblSpecular(Data::Instance<RPI::Material> material) const { - RPI::MaterialPropertyIndex propertyIndex = material->FindPropertyIndex(AZ::Name("general.forwardPassIBLSpecular")); - if (propertyIndex.IsValid()) + // look for a shader that has the o_materialUseForwardPassIBLSpecular option set + // Note: this should be changed to have the material automatically set the forwardPassIBLSpecular + // property and look for that instead of the shader option. + // [GFX TODO][ATOM-5040] Address Property Metadata Feedback Loop + for (auto& shaderItem : material->GetShaderCollection()) { - return material->GetPropertyValue<bool>(propertyIndex); + if (shaderItem.IsEnabled()) + { + RPI::ShaderOptionIndex index = shaderItem.GetShaderOptionGroup().GetShaderOptionLayout()->FindShaderOptionIndex(Name{ "o_materialUseForwardPassIBLSpecular" }); + if (index.IsValid()) + { + RPI::ShaderOptionValue value = shaderItem.GetShaderOptionGroup().GetValue(Name{ "o_materialUseForwardPassIBLSpecular" }); + if (value.GetIndex() == 1) + { + return true; + } + } + + } } return false; diff --git a/Gems/Atom/Feature/Common/Code/Source/Platform/Android/Atom_Feature_Traits_Android.h b/Gems/Atom/Feature/Common/Code/Source/Platform/Android/Atom_Feature_Traits_Android.h index 848a4c07c1..80b2ecb66a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Platform/Android/Atom_Feature_Traits_Android.h +++ b/Gems/Atom/Feature/Common/Code/Source/Platform/Android/Atom_Feature_Traits_Android.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_LUXCORE_SUPPORTED 0 -#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT \ No newline at end of file +#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT diff --git a/Gems/Atom/Feature/Common/Code/Source/Platform/Linux/Atom_Feature_Traits_Linux.h b/Gems/Atom/Feature/Common/Code/Source/Platform/Linux/Atom_Feature_Traits_Linux.h index 848a4c07c1..80b2ecb66a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Platform/Linux/Atom_Feature_Traits_Linux.h +++ b/Gems/Atom/Feature/Common/Code/Source/Platform/Linux/Atom_Feature_Traits_Linux.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_LUXCORE_SUPPORTED 0 -#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT \ No newline at end of file +#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT diff --git a/Gems/Atom/Feature/Common/Code/Source/Platform/Mac/Atom_Feature_Traits_Mac.h b/Gems/Atom/Feature/Common/Code/Source/Platform/Mac/Atom_Feature_Traits_Mac.h index 848a4c07c1..80b2ecb66a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Platform/Mac/Atom_Feature_Traits_Mac.h +++ b/Gems/Atom/Feature/Common/Code/Source/Platform/Mac/Atom_Feature_Traits_Mac.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_LUXCORE_SUPPORTED 0 -#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT \ No newline at end of file +#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT diff --git a/Gems/Atom/Feature/Common/Code/Source/Platform/iOS/Atom_Feature_Traits_iOS.h b/Gems/Atom/Feature/Common/Code/Source/Platform/iOS/Atom_Feature_Traits_iOS.h index 848a4c07c1..80b2ecb66a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Platform/iOS/Atom_Feature_Traits_iOS.h +++ b/Gems/Atom/Feature/Common/Code/Source/Platform/iOS/Atom_Feature_Traits_iOS.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_LUXCORE_SUPPORTED 0 -#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT \ No newline at end of file +#define AZ_TRAIT_LUXCORE_EXEPATH UNUSED_TRAIT diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingAccelerationStructurePass.cpp b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingAccelerationStructurePass.cpp index 4aff31c552..2bb2fa2ac2 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingAccelerationStructurePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingAccelerationStructurePass.cpp @@ -81,6 +81,7 @@ namespace AZ ->HitGroupIndex(blasIndex) ->Blas(rayTracingSubMesh.m_blas) ->Transform(rayTracingMesh.second.m_transform) + ->NonUniformScale(rayTracingMesh.second.m_nonUniformScale) ; } diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp index 9df7f262ac..0c24c2953d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp @@ -21,6 +21,8 @@ #include <Atom/RPI.Reflect/Asset/AssetUtils.h> #include <Atom/Feature/ImageBasedLights/ImageBasedLightFeatureProcessor.h> #include <CoreLights/DirectionalLightFeatureProcessor.h> +#include <CoreLights/SimplePointLightFeatureProcessor.h> +#include <CoreLights/SimpleSpotLightFeatureProcessor.h> #include <CoreLights/PointLightFeatureProcessor.h> #include <CoreLights/DiskLightFeatureProcessor.h> #include <CoreLights/CapsuleLightFeatureProcessor.h> @@ -116,6 +118,7 @@ namespace AZ // set initial transform mesh.m_transform = m_transformServiceFeatureProcessor->GetTransformForId(objectId); + mesh.m_nonUniformScale = m_transformServiceFeatureProcessor->GetNonUniformScaleForId(objectId); m_revision++; m_subMeshCount += aznumeric_cast<uint32_t>(subMeshes.size()); @@ -141,7 +144,7 @@ namespace AZ m_meshInfoBufferNeedsUpdate = true; } - void RayTracingFeatureProcessor::SetMeshTransform(const ObjectId objectId, AZ::Transform transform) + void RayTracingFeatureProcessor::SetMeshTransform(const ObjectId objectId, const AZ::Transform transform, const AZ::Vector3 nonUniformScale) { if (!m_rayTracingEnabled) { @@ -152,6 +155,7 @@ namespace AZ if (itMesh != m_meshes.end()) { itMesh->second.m_transform = transform; + itMesh->second.m_nonUniformScale = nonUniformScale; m_revision++; } @@ -195,7 +199,23 @@ namespace AZ constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_directionalLightCount")); m_rayTracingSceneSrg->SetConstant(constantIndex, directionalLightFP->GetLightCount()); - // point lights + // simple point lights + const auto simplePointLightFP = GetParentScene()->GetFeatureProcessor<SimplePointLightFeatureProcessor>(); + bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_simplePointLights")); + m_rayTracingSceneSrg->SetBufferView(bufferIndex, simplePointLightFP->GetLightBuffer()->GetBufferView()); + + constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_simplePointLightCount")); + m_rayTracingSceneSrg->SetConstant(constantIndex, simplePointLightFP->GetLightCount()); + + // simple spot lights + const auto simpleSpotLightFP = GetParentScene()->GetFeatureProcessor<SimpleSpotLightFeatureProcessor>(); + bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_simpleSpotLights")); + m_rayTracingSceneSrg->SetBufferView(bufferIndex, simpleSpotLightFP->GetLightBuffer()->GetBufferView()); + + constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_simpleSpotLightCount")); + m_rayTracingSceneSrg->SetConstant(constantIndex, simpleSpotLightFP->GetLightCount()); + + // point lights (sphere) const auto pointLightFP = GetParentScene()->GetFeatureProcessor<PointLightFeatureProcessor>(); bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_pointLights")); m_rayTracingSceneSrg->SetBufferView(bufferIndex, pointLightFP->GetLightBuffer()->GetBufferView()); diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.h index 9dee35716b..f317f1c096 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.h @@ -68,6 +68,9 @@ namespace AZ // mesh transform AZ::Transform m_transform = AZ::Transform::CreateIdentity(); + // mesh non-uniform scale + AZ::Vector3 m_nonUniformScale = AZ::Vector3::CreateOne(); + // flag indicating if the Blas objects in the sub-meshes are built bool m_blasBuilt = false; }; @@ -85,7 +88,8 @@ namespace AZ //! Sets the ray tracing mesh transform //! This will cause an update to the RayTracing acceleration structure on the next frame - void SetMeshTransform(const ObjectId objectId, const AZ::Transform transform); + void SetMeshTransform(const ObjectId objectId, const AZ::Transform transform, + const AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne()); //! Retrieves ray tracing data for all meshes in the scene const MeshMap& GetMeshes() const { return m_meshes; } diff --git a/Gems/Atom/Feature/Common/Code/Source/RenderCommon.h b/Gems/Atom/Feature/Common/Code/Source/RenderCommon.h index 6a60f38120..129d05636b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RenderCommon.h +++ b/Gems/Atom/Feature/Common/Code/Source/RenderCommon.h @@ -22,13 +22,31 @@ namespace AZ { const uint32_t None = 0x00; - // The MeshFeatureProcessor sets this stencil bit on any geometry that should receive IBL specular in the reflections pass, - // otherwise IBL specular is rendered in the Forward pass. - // The Reflections pass only renders to areas with this stencil bit set. + // UseIBLSpecularPass // - // Pass Range: Forward -> Reflections. - // Note: The Reflections pass may also overwrite other bits in the stencil buffer. - const uint32_t UseIBLSpecularPass = 0xF; + // The MeshFeatureProcessor sets the UseIBLSpecularPass stencil value on any geometry that should receive IBL Specular + // in the Reflections pass, otherwise IBL specular is rendered in the Forward pass. The Reflections pass only renders + // to areas with these stencil bits set. + // + // Used in pass range: Forward -> Reflections + // + // Notes: + // - Two bits are needed here (0x3) so that the ReflectionProbeStencilPass can use "Less" on its stencil test to + // properly handle the DecrSat on the FrontFace stencil operation depth-fail. + // - The ReflectionProbeStencilPass pass may overwrite other bits in the stencil buffer, depending on the amount of + // reflection probe volume nesting in the content. + // - New stencil bits for other purposes should be added to the most signficant bits and masked out of the Reflection passes. + // This is necessary to allow the most amount of bits to be used by the ReflectionProbeStencilPass for nested probe volumes. + // - The Reflection passes currently use 0x7F for the ReadMask and WriteMask to exclude the UseDiffuseGIPass stencil bit (see below). + // If other stencil bits are added then these masks will need to be updated. + const uint32_t UseIBLSpecularPass = 0x3; + + // UseDiffuseGIPass + // + // The MeshFeatureProcessor sets this stencil bit on any geometry that should receive Diffuse GI in the DiffuseGlobalIllumination pass. + // + // Used in pass range: Forward -> DiffuseGlobalIllumination + const uint32_t UseDiffuseGIPass = 0x80; } } } diff --git a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp index a4f255185a..acb6e4a287 100644 --- a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp @@ -210,14 +210,14 @@ namespace AZ } } - void TransformServiceFeatureProcessor::SetTransformForId(ObjectId id, const AZ::Transform& transform) + void TransformServiceFeatureProcessor::SetTransformForId(ObjectId id, const AZ::Transform& transform, const AZ::Vector3& nonUniformScale) { AZ_Error("TransformServiceFeatureProcessor", m_isWriteable, "Transform data cannot be written to during this phase"); AZ_Error("TransformServiceFeatureProcessor", id.IsValid(), "Attempting to set the transform for an invalid handle."); if (id.IsValid()) { AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromTransform(transform); - + matrix3x4.MultiplyByScale(nonUniformScale); matrix3x4.StoreToRowMajorFloat12(m_objectToWorldTransforms.at(id.GetIndex()).m_transform); // Inverse transpose to take the non-uniform scale out of the transform for usage with normals. @@ -228,8 +228,18 @@ namespace AZ AZ::Transform TransformServiceFeatureProcessor::GetTransformForId(ObjectId id) const { - AZ_Error("TransformServiceFeatureProcessor", id.IsValid(), "Attempting to set the transform for an invalid handle."); - return AZ::Transform::CreateFromMatrix3x4( Matrix3x4::CreateFromRowMajorFloat12(m_objectToWorldTransforms.at(id.GetIndex()).m_transform) ); + AZ_Error("TransformServiceFeatureProcessor", id.IsValid(), "Attempting to get the transform for an invalid handle."); + AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromRowMajorFloat12(m_objectToWorldTransforms.at(id.GetIndex()).m_transform); + AZ::Transform transform = AZ::Transform::CreateFromMatrix3x4(matrix3x4); + transform.ExtractScale(); + return transform; + } + + AZ::Vector3 TransformServiceFeatureProcessor::GetNonUniformScaleForId(ObjectId id) const + { + AZ_Error("TransformServiceFeatureProcessor", id.IsValid(), "Attempting to get the non-uniform scale for an invalid handle."); + AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromRowMajorFloat12(m_objectToWorldTransforms.at(id.GetIndex()).m_transform); + return matrix3x4.RetrieveScale(); } } } diff --git a/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake b/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake index 7e23bc340f..47000d8a5c 100644 --- a/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake +++ b/Gems/Atom/Feature/Common/Code/atom_feature_common_files.cmake @@ -131,6 +131,8 @@ set(FILES Source/DiffuseProbeGrid/DiffuseProbeGridBorderUpdatePass.h Source/DiffuseProbeGrid/DiffuseProbeGridRelocationPass.cpp Source/DiffuseProbeGrid/DiffuseProbeGridRelocationPass.h + Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.cpp + Source/DiffuseProbeGrid/DiffuseProbeGridClassificationPass.h Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.cpp Source/DiffuseProbeGrid/DiffuseProbeGridRenderPass.h Source/DiffuseProbeGrid/DiffuseProbeGrid.cpp diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ImagePoolDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ImagePoolDescriptor.h index 6df04d9c48..f2ae2dcd51 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ImagePoolDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ImagePoolDescriptor.h @@ -34,4 +34,4 @@ namespace AZ ImageBindFlags m_bindFlags = ImageBindFlags::Color; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/InputStreamLayoutBuilder.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/InputStreamLayoutBuilder.h index 51442b9a88..12e174cef0 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/InputStreamLayoutBuilder.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/InputStreamLayoutBuilder.h @@ -107,4 +107,4 @@ namespace AZ BufferDescriptorBuilder m_dummyBufferDescriptorBuilder; }; } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Interval.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Interval.h index 58ec2965f5..d528740dca 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Interval.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Interval.h @@ -34,4 +34,4 @@ namespace AZ bool operator != (const Interval& rhs) const; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Limits.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Limits.h index 80e8ad268f..1b18ab7671 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Limits.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Limits.h @@ -34,6 +34,7 @@ namespace AZ constexpr uint32_t StreamCountMax = 12; constexpr uint32_t StreamChannelCountMax = 16; constexpr uint32_t DrawListTagCountMax = 64; + constexpr uint32_t DrawFilterTagCountMax = 32; constexpr uint32_t MultiSampleCustomLocationsCountMax = 16; constexpr uint32_t MultiSampleCustomLocationGridSize = 16; constexpr uint32_t SubpassCountMax = 10; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/MultisampleState.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/MultisampleState.h index 915c43c1b3..2ea08be993 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/MultisampleState.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/MultisampleState.h @@ -63,4 +63,4 @@ namespace AZ AZ_ASSERT_NO_ALIGNMENT_PADDING_END } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PipelineLibraryData.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PipelineLibraryData.h index 44ba842fd9..17f3244988 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PipelineLibraryData.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PipelineLibraryData.h @@ -62,4 +62,4 @@ namespace AZ AZStd::vector<uint8_t> m_data; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ReflectSystemComponent.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ReflectSystemComponent.h index 2d748649bc..bac70fe145 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ReflectSystemComponent.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ReflectSystemComponent.h @@ -37,4 +37,4 @@ namespace AZ void Deactivate() override {} }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResolveScopeAttachmentDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResolveScopeAttachmentDescriptor.h index 1b7327c745..5a257cc80a 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResolveScopeAttachmentDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResolveScopeAttachmentDescriptor.h @@ -39,4 +39,4 @@ namespace AZ AttachmentId m_resolveAttachmentId; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResourcePoolDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResourcePoolDescriptor.h index e8c4460cdf..149c289e6f 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResourcePoolDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ResourcePoolDescriptor.h @@ -41,4 +41,4 @@ namespace AZ AZ::u64 m_budgetInBytes = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Scissor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Scissor.h index 646174520b..c36dcd348d 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Scissor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Scissor.h @@ -47,4 +47,4 @@ namespace AZ int32_t m_maxY = DefaultScissorMax; }; } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ScopeAttachmentDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ScopeAttachmentDescriptor.h index 5f555083a0..feec67d18c 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ScopeAttachmentDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ScopeAttachmentDescriptor.h @@ -45,4 +45,4 @@ namespace AZ AttachmentLoadStoreAction m_loadStoreAction; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderResourceGroupPoolDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderResourceGroupPoolDescriptor.h index 73745b4470..24823f4df6 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderResourceGroupPoolDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/ShaderResourceGroupPoolDescriptor.h @@ -49,4 +49,4 @@ namespace AZ ShaderResourceGroupUsage m_usage = ShaderResourceGroupUsage::Persistent; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Size.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Size.h index 52fd50ca4b..882feef11a 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Size.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Size.h @@ -46,4 +46,4 @@ namespace AZ uint32_t operator [] (uint32_t idx) const; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/StreamingImagePoolDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/StreamingImagePoolDescriptor.h index 5cce77b511..64c222c289 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/StreamingImagePoolDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/StreamingImagePoolDescriptor.h @@ -34,4 +34,4 @@ namespace AZ // Currently empty. }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Viewport.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Viewport.h index d5828cdf6d..8b95df52a1 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Viewport.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/Viewport.h @@ -53,4 +53,4 @@ namespace AZ float m_maxZ = 1.0f; }; } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferFrameAttachment.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferFrameAttachment.h index 2f78567059..a70dddfe94 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferFrameAttachment.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferFrameAttachment.h @@ -61,4 +61,4 @@ namespace AZ BufferDescriptor m_bufferDescriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPool.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPool.h index c8281ace05..760aa88f00 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPool.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPool.h @@ -232,4 +232,4 @@ namespace AZ BufferPoolDescriptor m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPoolBase.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPoolBase.h index 860f72ba75..61f2949e5d 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPoolBase.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferPoolBase.h @@ -58,4 +58,4 @@ namespace AZ AZStd::atomic_uint m_mapRefCount = {0}; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferScopeAttachment.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferScopeAttachment.h index a16a633a48..6f75f68f3f 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferScopeAttachment.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/BufferScopeAttachment.h @@ -64,4 +64,4 @@ namespace AZ BufferScopeAttachmentDescriptor m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceBusTraits.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceBusTraits.h index cf9f0290e5..596a15bdf1 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceBusTraits.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceBusTraits.h @@ -32,4 +32,4 @@ namespace AZ using BusIdType = Device*; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceObject.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceObject.h index 8706354b96..c4c6054da6 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceObject.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DeviceObject.h @@ -50,4 +50,4 @@ namespace AZ Ptr<Device> m_device; }; } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawFilterTagRegistry.h similarity index 66% rename from Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp rename to Gems/Atom/RHI/Code/Include/Atom/RHI/DrawFilterTagRegistry.h index 50c4d07cc5..04668b1994 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawFilterTagRegistry.h @@ -1,6 +1,6 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, @@ -9,14 +9,15 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "CryRenderOther_precompiled.h" +#pragma once -namespace Platform +#include <Atom/RHI/DrawItem.h> +#include <Atom/RHI/TagRegistry.h> + +namespace AZ { - WIN_HWND GetNativeWindowHandle() + namespace RHI { - return NULL; + using DrawFilterTagRegistry = TagRegistry<DrawFilterTag, Limits::Pipeline::DrawFilterTagCountMax>; } } - - diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawItem.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawItem.h index 65ca1d3a97..23fa2e691c 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawItem.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawItem.h @@ -11,6 +11,7 @@ */ #pragma once +#include <Atom/RHI.Reflect/Handle.h> #include <Atom/RHI.Reflect/Limits.h> #include <Atom/RHI/StreamBufferView.h> #include <Atom/RHI/IndexBufferView.h> @@ -152,36 +153,53 @@ namespace AZ }; using DrawItemSortKey = int64_t; - - struct DrawItemKeyPair + + // A filter associate to a DrawItem which can be used to filter the DrawItem when submitting to command list + using DrawFilterTag = Handle<uint8_t>; + using DrawFilterMask = uint32_t; // AZStd::bitset's impelmentation is too expensive. + constexpr uint32_t DrawFilterMaskDefaultValue = uint32_t(-1); // Default all bit to 1. + static_assert(sizeof(DrawFilterMask) * 8 >= Limits::Pipeline::DrawFilterTagCountMax, "DrawFilterMask doesn't have enough bits for maximum tag count"); + + struct DrawItemProperties { - DrawItemKeyPair() = default; + DrawItemProperties() = default; - DrawItemKeyPair(const DrawItem* item, DrawItemSortKey sortKey) + DrawItemProperties(const DrawItem* item, DrawItemSortKey sortKey = 0, DrawFilterMask filterMask = DrawFilterMaskDefaultValue) : m_item{item} , m_sortKey{sortKey} - {} + , m_drawFilterMask{filterMask} + { + } - bool operator == (const DrawItemKeyPair& rhs) const + bool operator==(const DrawItemProperties& rhs) const { return m_item == rhs.m_item && m_sortKey == rhs.m_sortKey && - m_depth == rhs.m_depth; + m_depth == rhs.m_depth && + m_drawFilterMask == rhs.m_drawFilterMask + ; } - bool operator != (const DrawItemKeyPair& rhs) const + bool operator!=(const DrawItemProperties& rhs) const { return !(*this == rhs); } - bool operator < (const DrawItemKeyPair& rhs) const + bool operator<(const DrawItemProperties& rhs) const { return m_sortKey < rhs.m_sortKey; } + //! A pointer to the draw item const DrawItem* m_item = nullptr; + //! A sorting key of this draw item which is used for sorting draw items in DrawList + // Check RHI::SortDrawList() function for detail DrawItemSortKey m_sortKey = 0; + //! A depth value this draw item which is used for sorting draw items in DrawList + //! Check RHI::SortDrawList() function for detail float m_depth = 0.0f; + //! A filter mask which helps decide whether to submit this draw item to a Scope's command list or not + DrawFilterMask m_drawFilterMask = DrawFilterMaskDefaultValue; }; } diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawList.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawList.h index 71c1cc026c..e232b1cf07 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawList.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawList.h @@ -39,8 +39,8 @@ namespace AZ using DrawListTag = Handle<uint8_t>; using DrawListMask = AZStd::bitset<RHI::Limits::Pipeline::DrawListTagCountMax>; - using DrawList = AZStd::vector<RHI::DrawItemKeyPair>; - using DrawListView = AZStd::array_view<RHI::DrawItemKeyPair>; + using DrawList = AZStd::vector<RHI::DrawItemProperties>; + using DrawListView = AZStd::array_view<RHI::DrawItemProperties>; /// Contains a table of draw lists, indexed by the tag. using DrawListsByTag = AZStd::array<DrawList, RHI::Limits::Pipeline::DrawListTagCountMax>; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListContext.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListContext.h index 00514ef3ef..c8f792ac49 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListContext.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListContext.h @@ -53,7 +53,7 @@ namespace AZ /// Adds an individual draw item to the draw list associated with the provided tag. This will /// no-op if the tag is not present in the internal draw list mask. - void AddDrawItem(DrawListTag drawListTag, DrawItemKeyPair drawItemKeyPair); + void AddDrawItem(DrawListTag drawListTag, DrawItemProperties drawItemProperties); /// Coalesces the draw lists in preparation for access via GetList. This should /// be called from a single thread as a sync point between the append / consume phases. diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListTagRegistry.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListTagRegistry.h index 471066a6e2..7c6e9899d8 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListTagRegistry.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawListTagRegistry.h @@ -12,83 +12,12 @@ #pragma once #include <Atom/RHI/DrawList.h> -#include <AzCore/Name/Name.h> -#include <AzCore/std/smart_ptr/intrusive_base.h> -#include <AzCore/std/parallel/shared_mutex.h> +#include <Atom/RHI/TagRegistry.h> namespace AZ { namespace RHI { - /** - * Allocates and registers draw list tags by name, allowing the user to acquire and find tags from names. - * The class is designed to map user-friendly tag names defined through content or higher level code to - * low-level tags, which are simple handles. - * - * Some notes about usage and design: - * - DrawListTag values represent indexes into a bitmask, which allows for fast comparison when filtering - * draw items into draw lists (see View::HasDrawListTag()). - * - Tags are reference counted, which means multiple calls to 'Acquire' with the same name will increment - * the internal reference count on the tag. This allows shared ownership between systems, if necessary. - * - FindTag is provided to search for a tag reference without taking ownership. - * - Names are case sensitive. - */ - class DrawListTagRegistry final - : public AZStd::intrusive_base - { - public: - AZ_CLASS_ALLOCATOR(DrawListTagRegistry, AZ::SystemAllocator, 0); - AZ_DISABLE_COPY_MOVE(DrawListTagRegistry); - - static Ptr<DrawListTagRegistry> Create(); - - /** - * Resets the registry back to an empty state. All references are released. - */ - void Reset(); - - /** - * Acquires a draw list tag from the provided name (case sensitive). If the tag already existed, it is ref-counted. - * Returns a valid tag on success; returns a null tag if the registry is at full capacity. You must - * call ReleaseTag() if successful. - */ - DrawListTag AcquireTag(const Name& drawListName); - - /** - * Releases a reference to a tag. Tags are ref-counted, so it's necessary to maintain ownership of the - * tag and release when its no longer needed. - */ - void ReleaseTag(DrawListTag drawListTag); - - /** - * Finds the tag associated with the provided name (case sensitive). If a tag exists with that name, the tag - * is returned. The reference count is NOT incremented on success; ownership is not passed to the user. If - * the tag does not exist, a null tag is returned. - */ - DrawListTag FindTag(const Name& drawListName) const; - - /** - * Returns the name of the given DrawListTag, or empty string if the tag is not registered. - */ - Name GetName(DrawListTag tag) const; - - /** - * Returns the number of allocated tags in the registry. - */ - size_t GetAllocatedTagCount() const; - - private: - DrawListTagRegistry() = default; - - struct Entry - { - Name m_name; - size_t m_refCount = 0; - }; - - mutable AZStd::shared_mutex m_mutex; - AZStd::array<Entry, Limits::Pipeline::DrawListTagCountMax> m_entriesByTag; - size_t m_allocatedTagCount = 0; - }; + using DrawListTagRegistry = TagRegistry<DrawListTag, Limits::Pipeline::DrawListTagCountMax>; } } diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacket.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacket.h index 124cbe2c1b..988c3a73dd 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacket.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacket.h @@ -21,45 +21,48 @@ namespace AZ namespace RHI { - /** - * DrawPacket is a packed data structure (one contiguous allocation) containing a collection of - * DrawItems and their associated array data. Each draw item in the packet is associated - * with a DrawListTag. All draw items in the packet share the same set of shader resource - * groups, index buffer, and draw arguments. - * - * Some notes about design and usage: - * - Draw packets should be used to 'broadcast' variations of the same 'object' to multiple passes. - * For example: 'Shadow', 'Depth', 'Forward'. - * - * - Draw packets can be re-used between different views, scenes, or passes. The embedded shader resource groups - * should represent only the local data necessary to describe the 'object', not the full context including - * scene / view / pass specific state. They serve as a 'template'. - * - * - The packet is self-contained and does not reference external memory. Use DrawPacketBuilder to construct - * an instance and either store in an RHI::Ptr or call 'delete' to release. - */ + //! + //! DrawPacket is a packed data structure (one contiguous allocation) containing a collection of + //! DrawItems and their associated array data. Each draw item in the packet is associated + //! with a DrawListTag. All draw items in the packet share the same set of shader resource + //! groups, index buffer, one DrawFilterMask, and draw arguments. + //! + //! Some notes about design and usage: + //! - Draw packets should be used to 'broadcast' variations of the same 'object' to multiple passes. + //! For example: 'Shadow', 'Depth', 'Forward'. + //! + //! - Draw packets can be re-used between different views, scenes, or passes. The embedded shader resource groups + //! should represent only the local data necessary to describe the 'object', not the full context including + //! scene / view / pass specific state. They serve as a 'template'. + //! + //! - The packet is self-contained and does not reference external memory. Use DrawPacketBuilder to construct + //! an instance and either store in an RHI::Ptr or call 'delete' to release. + //! class DrawPacket final : public AZStd::intrusive_base { friend class DrawPacketBuilder; public: - using DrawItemVisitor = AZStd::function<void(DrawListTag, DrawItemKeyPair)>; + using DrawItemVisitor = AZStd::function<void(DrawListTag, DrawItemProperties)>; - /// Draw packets cannot be move constructed or copied, as they contain an additional memory payload. + //! Draw packets cannot be move constructed or copied, as they contain an additional memory payload. AZ_DISABLE_COPY_MOVE(DrawPacket); - /// Returns the mask representing all the draw lists affected by the packet. + //! Returns the mask representing all the draw lists affected by the packet. DrawListMask GetDrawListMask() const; - /// Returns the number of draw items stored in the packet. + //! Returns the number of draw items stored in the packet. size_t GetDrawItemCount() const; - /// Returns the draw item / sort key associated with the provided index. - DrawItemKeyPair GetDrawItem(size_t index) const; + //! Returns the draw item and its properties associated with the provided index. + DrawItemProperties GetDrawItem(size_t index) const; - /// Returns the draw list tag associated with the provided index. + //! Returns the draw list tag associated with the provided index. DrawListTag GetDrawListTag(size_t index) const; - /// Overloaded operator delete for freeing a draw packet. + //! Returns the draw filter mask which applied to all the draw items. + DrawFilterMask GetDrawFilterMask() const; + + //! Overloaded operator delete for freeing a draw packet. void operator delete(void* p, size_t size); private: @@ -72,6 +75,9 @@ namespace AZ // The bit-mask of all active filter tags. DrawListMask m_drawListMask = 0; + // The draw filter applies to each draw item + DrawFilterMask m_drawFilterMask = DrawFilterMaskDefaultValue; + // The index buffer view used when the draw call is indexed. IndexBufferView m_indexBufferView; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacketBuilder.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacketBuilder.h index 9a091980bc..15303158f9 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacketBuilder.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/DrawPacketBuilder.h @@ -29,23 +29,26 @@ namespace AZ { DrawRequest() = default; - /// The filter tag used to direct the draw item. + //! The filter tag used to direct the draw item. DrawListTag m_listTag; - /// The stencil ref value used for this draw item. + //! The stencil ref value used for this draw item. uint8_t m_stencilRef = 0; - /// The array of stream buffers to bind for this draw item. + //! The array of stream buffers to bind for this draw item. AZStd::array_view<StreamBufferView> m_streamBufferViews; - /// Shader resource group unique for this draw request + //! Shader resource group unique for this draw request const ShaderResourceGroup* m_uniqueShaderResourceGroup = nullptr; - /// The pipeline state assigned to this draw item. + //! The pipeline state assigned to this draw item. const PipelineState* m_pipelineState = nullptr; - /// The sort key assigned to this draw item. + //! The sort key assigned to this draw item. DrawItemSortKey m_sortKey = 0; + + //! The filter associated to this draw item. + DrawFilterMask m_drawFilterMask = DrawFilterMaskDefaultValue; }; // NOTE: This is configurable; just used to control the amount of memory held by the builder. @@ -69,6 +72,8 @@ namespace AZ void AddShaderResourceGroup(const ShaderResourceGroup* shaderResourceGroup); + void SetDrawFilterMask(DrawFilterMask filterMask); + void AddDrawItem(const DrawRequest& request); const DrawPacket* End(); @@ -79,6 +84,7 @@ namespace AZ IAllocatorAllocate* m_allocator = nullptr; DrawArguments m_drawArguments; DrawListMask m_drawListMask = 0; + DrawFilterMask m_drawFilterMask = DrawFilterMaskDefaultValue; size_t m_streamBufferViewCount = 0; IndexBufferView m_indexBufferView; AZStd::fixed_vector<DrawRequest, DrawItemCountMax> m_drawRequests; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/Fence.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/Fence.h index 9d7fccd453..a1d5bdfc80 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/Fence.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/Fence.h @@ -83,4 +83,4 @@ namespace AZ AZStd::thread m_waitThread; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphCompileContext.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphCompileContext.h index 8e11ca3f56..7657409db8 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphCompileContext.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphCompileContext.h @@ -73,4 +73,4 @@ namespace AZ const FrameGraphAttachmentDatabase* m_attachmentDatabase = nullptr; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphExecuteContext.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphExecuteContext.h index ee857a5e9b..1c8a421d1a 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphExecuteContext.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphExecuteContext.h @@ -65,4 +65,4 @@ namespace AZ Descriptor m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphLogger.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphLogger.h index 932598659e..c3192cda13 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphLogger.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/FrameGraphLogger.h @@ -29,4 +29,4 @@ namespace AZ static void DumpGraphVis(const FrameGraph& frameGraph); }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h index 4f2cda8249..2328d44d25 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h @@ -136,4 +136,4 @@ namespace AZ size_t m_byteCountTotal = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePool.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePool.h index bcf0f21f3e..de2948d010 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePool.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePool.h @@ -118,4 +118,4 @@ namespace AZ ImagePoolDescriptor m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePoolBase.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePoolBase.h index 630f8f733a..e9ca3730f4 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePoolBase.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ImagePoolBase.h @@ -42,4 +42,4 @@ namespace AZ using ResourcePool::InitResource; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/LinearAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/LinearAllocator.h index 85055fa4d6..00602ab05e 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/LinearAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/LinearAllocator.h @@ -59,4 +59,4 @@ namespace AZ size_t m_garbageCollectIteration = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryAllocation.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryAllocation.h index 3f8b4f49ee..d42a3996cc 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryAllocation.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryAllocation.h @@ -52,4 +52,4 @@ namespace AZ { } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBuilder.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBuilder.h index d435cbab54..105c45d64d 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBuilder.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBuilder.h @@ -68,4 +68,4 @@ namespace AZ MemoryStatistics* m_statistics = nullptr; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBus.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBus.h index 8826a76a55..4f0eac21fe 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBus.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/MemoryStatisticsBus.h @@ -44,4 +44,4 @@ namespace AZ using MemoryStatisticsEventBus = AZ::EBus<MemoryStatisticsEventInterface>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ObjectCollector.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ObjectCollector.h index b1ac9f6701..98d63accc9 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ObjectCollector.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ObjectCollector.h @@ -218,4 +218,4 @@ namespace AZ return objectCount; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h index f52bf42fc6..bc4c49b606 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h @@ -101,4 +101,4 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h index 5cafc9bd86..897e43ee70 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h @@ -84,4 +84,4 @@ namespace AZ uint32_t m_allocationCountTotal = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/QueryPoolSubAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/QueryPoolSubAllocator.h index 285fdadc15..78189483e0 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/QueryPoolSubAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/QueryPoolSubAllocator.h @@ -87,4 +87,4 @@ namespace AZ uint32_t m_totalFreeSpace = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/RHISystemInterface.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/RHISystemInterface.h index e7aea89993..784f9344b4 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/RHISystemInterface.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/RHISystemInterface.h @@ -15,13 +15,13 @@ #include <AzCore/Name/Name.h> #include <AzCore/EBus/EBus.h> #include <Atom/RHI.Reflect/FrameSchedulerEnums.h> +#include <Atom/RHI/DrawListTagRegistry.h> namespace AZ { namespace RHI { class Device; - class DrawListTagRegistry; class FrameGraphBuilder; class PipelineState; class PipelineStateCache; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/RayTracingAccelerationStructure.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/RayTracingAccelerationStructure.h index 09ba2b1d59..5fde518cb2 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/RayTracingAccelerationStructure.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/RayTracingAccelerationStructure.h @@ -111,6 +111,7 @@ namespace AZ uint32_t m_instanceID = 0; uint32_t m_hitGroupIndex = 0; AZ::Transform m_transform = AZ::Transform::CreateIdentity(); + AZ::Vector3 m_nonUniformScale = AZ::Vector3::CreateOne(); RHI::Ptr<RHI::RayTracingBlas> m_blas; }; using RayTracingTlasInstanceVector = AZStd::vector<RayTracingTlasInstance>; @@ -154,6 +155,7 @@ namespace AZ RayTracingTlasDescriptor* InstanceID(uint32_t instanceID); RayTracingTlasDescriptor* HitGroupIndex(uint32_t hitGroupIndex); RayTracingTlasDescriptor* Transform(const AZ::Transform& transform); + RayTracingTlasDescriptor* NonUniformScale(const AZ::Vector3& nonUniformScale); RayTracingTlasDescriptor* Blas(RHI::Ptr<RHI::RayTracingBlas>& blas); RayTracingTlasDescriptor* InstancesBuffer(RHI::Ptr<RHI::Buffer>& tlasInstances); RayTracingTlasDescriptor* NumInstances(uint32_t numInstancesInBuffer); diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResolveScopeAttachment.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResolveScopeAttachment.h index fb5a834aed..534ac1df4e 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResolveScopeAttachment.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResolveScopeAttachment.h @@ -40,4 +40,4 @@ namespace AZ ResolveScopeAttachmentDescriptor m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourceInvalidateBus.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourceInvalidateBus.h index 62c04c9c9e..9ff8958910 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourceInvalidateBus.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourceInvalidateBus.h @@ -69,4 +69,4 @@ namespace AZ using ResourceInvalidateBus = AZ::EBus<ResourceEventInterface>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePool.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePool.h index 6cba352229..d846d79344 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePool.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePool.h @@ -226,4 +226,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePoolDatabase.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePoolDatabase.h index dfdb4f3590..40fa3a4051 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePoolDatabase.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ResourcePoolDatabase.h @@ -194,4 +194,4 @@ namespace AZ AZStd::for_each(m_poolResolvers.begin(), m_poolResolvers.end(), predicate); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupInvalidateRegistry.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupInvalidateRegistry.h index e099394d01..18541b57a6 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupInvalidateRegistry.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupInvalidateRegistry.h @@ -77,4 +77,4 @@ namespace AZ CompileGroupFunction m_compileGroupFunction; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/StreamingImagePool.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/StreamingImagePool.h index ef8ccc2148..23dd5a1c3e 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/StreamingImagePool.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/StreamingImagePool.h @@ -159,4 +159,4 @@ namespace AZ AZStd::shared_mutex m_frameMutex; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChainFrameAttachment.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChainFrameAttachment.h index 7f4768eab3..832d1bbf33 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChainFrameAttachment.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChainFrameAttachment.h @@ -42,4 +42,4 @@ namespace AZ Ptr<SwapChain> m_swapChain; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/TagRegistry.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/TagRegistry.h new file mode 100644 index 0000000000..429a49657b --- /dev/null +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/TagRegistry.h @@ -0,0 +1,188 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include <AzCore/Name/Name.h> +#include <AzCore/std/smart_ptr/intrusive_base.h> +#include <AzCore/std/parallel/shared_mutex.h> + +namespace AZ +{ + namespace RHI + { + //! + //! Allocates and registers tags by name, allowing the user to acquire and find tags from names. + //! The class is designed to map user-friendly tag names defined through content or higher level code to + //! low-level tags, which are simple handles. + //! + //! Some notes about usage and design: + //! - TagType need to be a Handle<Integer> type. + //! - Tags are reference counted, which means multiple calls to 'Acquire' with the same name will increment + //! the internal reference count on the tag. This allows shared ownership between systems, if necessary. + //! - FindTag is provided to search for a tag reference without taking ownership. + //! - Names are case sensitive. + //! + template<typename TagType, size_t MaxTagCount> + class TagRegistry final + : public AZStd::intrusive_base + { + public: + AZ_CLASS_ALLOCATOR(TagRegistry, AZ::SystemAllocator, 0); + AZ_DISABLE_COPY_MOVE(TagRegistry); + + static Ptr<TagRegistry> Create(); + + //! Resets the registry back to an empty state. All references are released. + void Reset(); + + //! Acquires a tag from the provided name (case sensitive). If the tag already existed, it is ref-counted. + //! Returns a valid tag on success; returns a null tag if the registry is at full capacity. You must + //! call ReleaseTag() if successful. + TagType AcquireTag(const Name& tagName); + + //! Releases a reference to a tag. Tags are ref-counted, so it's necessary to maintain ownership of the + //! tag and release when its no longer needed. + void ReleaseTag(TagType tagName); + + //! Finds the tag associated with the provided name (case sensitive). If a tag exists with that name, the tag + //! is returned. The reference count is NOT incremented on success; ownership is not passed to the user. If + //! the tag does not exist, a null tag is returned. + TagType FindTag(const Name& tagName) const; + + //! Returns the name of the given tag, or empty string if the tag is not registered. + Name GetName(TagType tag) const; + + //! Returns the number of allocated tags in the registry. + size_t GetAllocatedTagCount() const; + + private: + TagRegistry() = default; + + struct Entry + { + Name m_name; + size_t m_refCount = 0; + }; + + mutable AZStd::shared_mutex m_mutex; + AZStd::array<Entry, MaxTagCount> m_entriesByTag; + size_t m_allocatedTagCount = 0; + }; + + template<typename TagType, size_t MaxTagCount> + Ptr<TagRegistry<TagType, MaxTagCount>> TagRegistry<TagType, MaxTagCount>::Create() + { + return aznew TagRegistry<TagType, MaxTagCount>(); + } + + template<typename TagType, size_t MaxTagCount> + void TagRegistry<TagType, MaxTagCount>::Reset() + { + AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); + m_entriesByTag.fill({}); + m_allocatedTagCount = 0; + } + + template<typename TagType, size_t MaxTagCount> + TagType TagRegistry<TagType, MaxTagCount>::AcquireTag(const Name& tagName) + { + if (tagName.IsEmpty()) + { + return {}; + } + + TagType tag; + Entry* foundEmptyEntry = nullptr; + + AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); + for (size_t i = 0; i < m_entriesByTag.size(); ++i) + { + Entry& entry = m_entriesByTag[i]; + + // Found an empty entry. Cache off the tag and pointer, but keep searching to find if + // another entry holds the same name. + if (entry.m_refCount == 0 && !foundEmptyEntry) + { + foundEmptyEntry = &entry; + tag = TagType(i); + } + else if (entry.m_name == tagName) + { + entry.m_refCount++; + return TagType(i); + } + } + + // No other entry holds the name, so allocate the empty entry. + if (foundEmptyEntry) + { + foundEmptyEntry->m_refCount = 1; + foundEmptyEntry->m_name = tagName; + ++m_allocatedTagCount; + } + + return tag; + } + + template<typename TagType, size_t MaxTagCount> + void TagRegistry<TagType, MaxTagCount>::ReleaseTag(TagType tag) + { + if (tag.IsValid()) + { + AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); + Entry& entry = m_entriesByTag[tag.GetIndex()]; + const size_t refCount = --entry.m_refCount; + AZ_Assert( + refCount != static_cast<size_t>(-1), "Attempted to forfeit a tag that is not valid. Tag{%d},Name{'%s'}", tag, + entry.m_name.GetCStr()); + if (refCount == 0) + { + entry.m_name = Name(); + --m_allocatedTagCount; + } + } + } + + template<typename TagType, size_t MaxTagCount> + TagType TagRegistry<TagType, MaxTagCount>::FindTag(const Name& tagName) const + { + AZStd::shared_lock<AZStd::shared_mutex> lock(m_mutex); + for (size_t i = 0; i < m_entriesByTag.size(); ++i) + { + if (m_entriesByTag[i].m_name == tagName) + { + return TagType(i); + } + } + return {}; + } + + template<typename TagType, size_t MaxTagCount> + Name TagRegistry<TagType, MaxTagCount>::GetName(TagType tag) const + { + if (tag.GetIndex() < m_entriesByTag.size()) + { + return m_entriesByTag[tag.GetIndex()].m_name; + } + else + { + return Name(); + } + } + + template<typename TagType, size_t MaxTagCount> + size_t TagRegistry<TagType, MaxTagCount>::GetAllocatedTagCount() const + { + return m_allocatedTagCount; + } + } +} diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ThreadLocalContext.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ThreadLocalContext.h index eb93ece9ff..58664379da 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ThreadLocalContext.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ThreadLocalContext.h @@ -230,4 +230,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryRegistrationFinalizerSystemComponent.h b/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryRegistrationFinalizerSystemComponent.h index 07efd9723b..808b6afcad 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryRegistrationFinalizerSystemComponent.h +++ b/Gems/Atom/RHI/Code/Source/RHI.Private/FactoryRegistrationFinalizerSystemComponent.h @@ -46,4 +46,4 @@ namespace AZ FactoryRegistrationFinalizerSystemComponent(const FactoryRegistrationFinalizerSystemComponent&) = delete; }; } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/BufferScopeAttachmentDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/BufferScopeAttachmentDescriptor.cpp index a2653e2369..13bc9a6da0 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/BufferScopeAttachmentDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/BufferScopeAttachmentDescriptor.cpp @@ -36,4 +36,4 @@ namespace AZ , m_bufferViewDescriptor(bufferViewDescriptor) {} } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImagePoolDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImagePoolDescriptor.cpp index d1ced423ab..9b38dae2b8 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImagePoolDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImagePoolDescriptor.cpp @@ -26,4 +26,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImageScopeAttachmentDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImageScopeAttachmentDescriptor.cpp index 5afb639877..da6c78e434 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImageScopeAttachmentDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ImageScopeAttachmentDescriptor.cpp @@ -36,4 +36,4 @@ namespace AZ , m_imageViewDescriptor{ imageViewDescriptor } {} } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/InputStreamLayoutBuilder.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/InputStreamLayoutBuilder.cpp index 832bc254dd..0ab9023bd8 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/InputStreamLayoutBuilder.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/InputStreamLayoutBuilder.cpp @@ -108,4 +108,4 @@ namespace AZ return builder; } } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Interval.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Interval.cpp index 64ebeb4cfe..4e95e9f7b0 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Interval.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Interval.cpp @@ -43,4 +43,4 @@ namespace AZ return m_min != rhs.m_min || m_max != rhs.m_max; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/MemoryUsage.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/MemoryUsage.cpp index a9e269c8cf..32c009fd64 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/MemoryUsage.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/MemoryUsage.cpp @@ -40,4 +40,4 @@ namespace AZ return *this; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/MultisampleState.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/MultisampleState.cpp index 465cf3e86d..fca1dc3522 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/MultisampleState.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/MultisampleState.cpp @@ -52,4 +52,4 @@ namespace AZ return !(*this == other); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/PipelineLibraryData.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/PipelineLibraryData.cpp index 696b28a35e..581111c16c 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/PipelineLibraryData.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/PipelineLibraryData.cpp @@ -40,4 +40,4 @@ namespace AZ return m_data; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/QueryPoolDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/QueryPoolDescriptor.cpp index d3c4f8f71f..6839c1496b 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/QueryPoolDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/QueryPoolDescriptor.cpp @@ -30,4 +30,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ResourcePoolDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ResourcePoolDescriptor.cpp index af01e643fa..1ea9352981 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ResourcePoolDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ResourcePoolDescriptor.cpp @@ -27,4 +27,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Scissor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Scissor.cpp index d759a01b74..2c665f4c05 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Scissor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Scissor.cpp @@ -66,4 +66,4 @@ namespace AZ } } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ScopeAttachmentDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ScopeAttachmentDescriptor.cpp index ebd000082d..54a30ff217 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ScopeAttachmentDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ScopeAttachmentDescriptor.cpp @@ -37,4 +37,4 @@ namespace AZ , m_loadStoreAction(loadStoreAction) { } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderResourceGroupPoolDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderResourceGroupPoolDescriptor.cpp index f18a64a6cc..3553c7eae1 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderResourceGroupPoolDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/ShaderResourceGroupPoolDescriptor.cpp @@ -28,4 +28,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Size.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Size.cpp index e2ced19d16..6065205e4f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Size.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Size.cpp @@ -70,4 +70,4 @@ namespace AZ return *(ptr + idx); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/StreamingImagePoolDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/StreamingImagePoolDescriptor.cpp index 15bfa1fde5..df513ab54b 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/StreamingImagePoolDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/StreamingImagePoolDescriptor.cpp @@ -25,4 +25,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Viewport.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Viewport.cpp index 9884270ef7..6181c80781 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/Viewport.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/Viewport.cpp @@ -77,4 +77,4 @@ namespace AZ } } // namespace RHI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Code/Source/RHI/Allocator.cpp b/Gems/Atom/RHI/Code/Source/RHI/Allocator.cpp index a17f3c5ab5..023b40bde4 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/Allocator.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/Allocator.cpp @@ -49,4 +49,4 @@ namespace AZ : m_addressBase{0} {} } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/BufferFrameAttachment.cpp b/Gems/Atom/RHI/Code/Source/RHI/BufferFrameAttachment.cpp index d4bdb9c200..7574cc77d7 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/BufferFrameAttachment.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/BufferFrameAttachment.cpp @@ -74,4 +74,4 @@ namespace AZ return static_cast<Buffer*>(GetResource()); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/BufferScopeAttachment.cpp b/Gems/Atom/RHI/Code/Source/RHI/BufferScopeAttachment.cpp index f6e1494e97..b75d02ed6b 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/BufferScopeAttachment.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/BufferScopeAttachment.cpp @@ -83,4 +83,4 @@ namespace AZ return static_cast<BufferScopeAttachment*>(ScopeAttachment::GetNext()); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/CommandList.cpp b/Gems/Atom/RHI/Code/Source/RHI/CommandList.cpp index 6624f9962e..f08284753c 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/CommandList.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/CommandList.cpp @@ -16,4 +16,4 @@ namespace AZ namespace RHI { } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/DeviceObject.cpp b/Gems/Atom/RHI/Code/Source/RHI/DeviceObject.cpp index 95fd0d5c31..4aeeaf12e5 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/DeviceObject.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/DeviceObject.cpp @@ -37,4 +37,4 @@ namespace AZ m_device = nullptr; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/DrawList.cpp b/Gems/Atom/RHI/Code/Source/RHI/DrawList.cpp index 518ec59ac5..c50255224f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/DrawList.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/DrawList.cpp @@ -35,8 +35,7 @@ namespace AZ switch (sortType) { case DrawListSortType::KeyThenDepth: - AZStd::sort(drawList.begin(), drawList.end(), - [](const DrawItemKeyPair& a, const DrawItemKeyPair& b) + AZStd::sort(drawList.begin(), drawList.end(), [](const DrawItemProperties& a, const DrawItemProperties& b) { if (a.m_sortKey != b.m_sortKey) { @@ -48,8 +47,7 @@ namespace AZ break; case DrawListSortType::KeyThenReverseDepth: - AZStd::sort(drawList.begin(), drawList.end(), - [](const DrawItemKeyPair& a, const DrawItemKeyPair& b) + AZStd::sort(drawList.begin(), drawList.end(), [](const DrawItemProperties& a, const DrawItemProperties& b) { if (a.m_sortKey != b.m_sortKey) { @@ -61,8 +59,7 @@ namespace AZ break; case DrawListSortType::DepthThenKey: - AZStd::sort(drawList.begin(), drawList.end(), - [](const DrawItemKeyPair& a, const DrawItemKeyPair& b) + AZStd::sort(drawList.begin(), drawList.end(), [](const DrawItemProperties& a, const DrawItemProperties& b) { if (a.m_depth != b.m_depth) { @@ -74,8 +71,7 @@ namespace AZ break; case DrawListSortType::ReverseDepthThenKey: - AZStd::sort(drawList.begin(), drawList.end(), - [](const DrawItemKeyPair& a, const DrawItemKeyPair& b) + AZStd::sort(drawList.begin(), drawList.end(), [](const DrawItemProperties& a, const DrawItemProperties& b) { if (a.m_depth != b.m_depth) { diff --git a/Gems/Atom/RHI/Code/Source/RHI/DrawListContext.cpp b/Gems/Atom/RHI/Code/Source/RHI/DrawListContext.cpp index dbd06c6969..8cec5ba39b 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/DrawListContext.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/DrawListContext.cpp @@ -63,14 +63,14 @@ namespace AZ if (m_drawListMask[drawListTag.GetIndex()]) { - DrawItemKeyPair drawItem = drawPacket->GetDrawItem(i); + DrawItemProperties drawItem = drawPacket->GetDrawItem(i); drawItem.m_depth = depth; threadListsByTag[drawListTag.GetIndex()].push_back(drawItem); } } } - void DrawListContext::AddDrawItem(DrawListTag drawListTag, DrawItemKeyPair drawItemKeyPair) + void DrawListContext::AddDrawItem(DrawListTag drawListTag, DrawItemProperties drawItemProperties) { if (Validation::IsEnabled()) { @@ -84,7 +84,7 @@ namespace AZ if (m_drawListMask[drawListTag.GetIndex()]) { DrawListsByTag& drawListsByTag = m_threadListsByTag.GetStorage(); - drawListsByTag[drawListTag.GetIndex()].push_back(drawItemKeyPair); + drawListsByTag[drawListTag.GetIndex()].push_back(drawItemProperties); } } diff --git a/Gems/Atom/RHI/Code/Source/RHI/DrawListTagRegistry.cpp b/Gems/Atom/RHI/Code/Source/RHI/DrawListTagRegistry.cpp deleted file mode 100644 index 14d517962a..0000000000 --- a/Gems/Atom/RHI/Code/Source/RHI/DrawListTagRegistry.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include <Atom/RHI/DrawListTagRegistry.h> - -namespace AZ -{ - namespace RHI - { - Ptr<DrawListTagRegistry> DrawListTagRegistry::Create() - { - return aznew DrawListTagRegistry; - } - - void DrawListTagRegistry::Reset() - { - AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); - m_entriesByTag.fill({}); - m_allocatedTagCount = 0; - } - - DrawListTag DrawListTagRegistry::AcquireTag(const Name& drawListName) - { - if (drawListName.IsEmpty()) - { - return {}; - } - - DrawListTag drawListTag; - Entry* foundEmptyEntry = nullptr; - - AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); - for (size_t i = 0; i < m_entriesByTag.size(); ++i) - { - Entry& entry = m_entriesByTag[i]; - - // Found an empty entry. Cache off the tag and pointer, but keep searching to find if - // another entry holds the same name. - if (entry.m_refCount == 0 && !foundEmptyEntry) - { - foundEmptyEntry = &entry; - drawListTag = DrawListTag(i); - } - else if (entry.m_name == drawListName) - { - entry.m_refCount++; - return DrawListTag(i); - } - } - - // No other entry holds the name, so allocate the empty entry. - if (foundEmptyEntry) - { - foundEmptyEntry->m_refCount = 1; - foundEmptyEntry->m_name = drawListName; - ++m_allocatedTagCount; - } - - return drawListTag; - } - - void DrawListTagRegistry::ReleaseTag(DrawListTag drawListTag) - { - if (drawListTag.IsValid()) - { - AZStd::unique_lock<AZStd::shared_mutex> lock(m_mutex); - Entry& entry = m_entriesByTag[drawListTag.GetIndex()]; - const size_t refCount = --entry.m_refCount; - AZ_Assert(refCount != static_cast<size_t>(-1), "Attempted to forfeit a tag that is not valid. Tag{%d},Name{'%s'}", drawListTag, entry.m_name.GetCStr()); - if (refCount == 0) - { - entry.m_name = Name(); - --m_allocatedTagCount; - } - } - } - - DrawListTag DrawListTagRegistry::FindTag(const Name& drawListName) const - { - AZStd::shared_lock<AZStd::shared_mutex> lock(m_mutex); - for (size_t i = 0; i < m_entriesByTag.size(); ++i) - { - if (m_entriesByTag[i].m_name == drawListName) - { - return DrawListTag(i); - } - } - return {}; - } - - Name DrawListTagRegistry::GetName(DrawListTag tag) const - { - if (tag.GetIndex() < m_entriesByTag.size()) - { - return m_entriesByTag[tag.GetIndex()].m_name; - } - else - { - return Name(); - } - } - - size_t DrawListTagRegistry::GetAllocatedTagCount() const - { - return m_allocatedTagCount; - } - } -} diff --git a/Gems/Atom/RHI/Code/Source/RHI/DrawPacket.cpp b/Gems/Atom/RHI/Code/Source/RHI/DrawPacket.cpp index 391bcf3d99..85580fdc84 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/DrawPacket.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/DrawPacket.cpp @@ -24,10 +24,10 @@ namespace AZ return m_drawItemCount; } - DrawItemKeyPair DrawPacket::GetDrawItem(size_t index) const + DrawItemProperties DrawPacket::GetDrawItem(size_t index) const { AZ_Assert(index < GetDrawItemCount(), "Out of bounds array access!"); - return DrawItemKeyPair(&m_drawItems[index], m_drawItemSortKeys[index]); + return DrawItemProperties(&m_drawItems[index], m_drawItemSortKeys[index], m_drawFilterMask); } DrawListTag DrawPacket::GetDrawListTag(size_t index) const @@ -36,6 +36,11 @@ namespace AZ return m_drawListTags[index]; } + DrawFilterMask DrawPacket::GetDrawFilterMask() const + { + return m_drawFilterMask; + } + DrawListMask DrawPacket::GetDrawListMask() const { return m_drawListMask; @@ -46,4 +51,4 @@ namespace AZ reinterpret_cast<const DrawPacket*>(p)->m_allocator->DeAllocate(p); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/DrawPacketBuilder.cpp b/Gems/Atom/RHI/Code/Source/RHI/DrawPacketBuilder.cpp index 203818b166..45732e66a7 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/DrawPacketBuilder.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/DrawPacketBuilder.cpp @@ -82,6 +82,11 @@ namespace AZ } } + void DrawPacketBuilder::SetDrawFilterMask(DrawFilterMask filterMask) + { + m_drawFilterMask = filterMask; + } + void DrawPacketBuilder::AddDrawItem(const DrawRequest& request) { if (request.m_listTag.IsValid()) @@ -165,6 +170,7 @@ namespace AZ drawPacket->m_allocator = m_allocator; drawPacket->m_indexBufferView = m_indexBufferView; drawPacket->m_drawListMask = m_drawListMask; + drawPacket->m_drawFilterMask = m_drawFilterMask; if (shaderResourceGroupsOffset.IsValid()) { @@ -288,6 +294,7 @@ namespace AZ m_rootConstants = {}; m_scissors.clear(); m_viewports.clear(); + m_drawFilterMask = DrawFilterMaskDefaultValue; } } } diff --git a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompileContext.cpp b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompileContext.cpp index ebebe7cf8b..c554ff8adc 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompileContext.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphCompileContext.cpp @@ -101,4 +101,4 @@ namespace AZ return m_scopeId; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteContext.cpp b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteContext.cpp index a1185cd24b..c4d765cb4e 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteContext.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteContext.cpp @@ -44,4 +44,4 @@ namespace AZ m_descriptor.m_commandList = &commandList; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/ImageFrameAttachment.cpp b/Gems/Atom/RHI/Code/Source/RHI/ImageFrameAttachment.cpp index 9c1ebb25f9..988fc848ee 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ImageFrameAttachment.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ImageFrameAttachment.cpp @@ -101,4 +101,4 @@ namespace AZ return ClearValue{}; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/LinearAllocator.cpp b/Gems/Atom/RHI/Code/Source/RHI/LinearAllocator.cpp index 64f94f2737..5c59dd570d 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/LinearAllocator.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/LinearAllocator.cpp @@ -82,4 +82,4 @@ namespace AZ (void)offset; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/Object.cpp b/Gems/Atom/RHI/Code/Source/RHI/Object.cpp index 8202db5b3d..36a54a954f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/Object.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/Object.cpp @@ -33,4 +33,4 @@ namespace AZ return m_name; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/PhysicalDevice.cpp b/Gems/Atom/RHI/Code/Source/RHI/PhysicalDevice.cpp index b9a5c0822f..6a6d40f0f5 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/PhysicalDevice.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/PhysicalDevice.cpp @@ -21,4 +21,4 @@ namespace AZ return m_descriptor; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/PoolAllocator.cpp b/Gems/Atom/RHI/Code/Source/RHI/PoolAllocator.cpp index 565aa97880..7cca5c64b0 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/PoolAllocator.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/PoolAllocator.cpp @@ -116,4 +116,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/QueryPoolSubAllocator.cpp b/Gems/Atom/RHI/Code/Source/RHI/QueryPoolSubAllocator.cpp index bb94fc6d88..d72e0593cb 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/QueryPoolSubAllocator.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/QueryPoolSubAllocator.cpp @@ -160,4 +160,4 @@ namespace AZ AZStd::sort(m_freeAllocations.begin(), m_freeAllocations.end(), SortBySize()); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp index 067090e909..f92d2621b1 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp @@ -60,7 +60,7 @@ namespace AZ AZ_Assert(false, "RHISystem", "Unable to initialize RHI! \n"); return; } - + m_drawListTagRegistry = RHI::DrawListTagRegistry::Create(); m_pipelineStateCache = RHI::PipelineStateCache::Create(*m_device); @@ -199,7 +199,6 @@ namespace AZ m_frameScheduler.Shutdown(); m_platformLimitsDescriptor = nullptr; - m_drawListTagRegistry = nullptr; m_pipelineStateCache = nullptr; m_device->PreShutdown(); AZ_Assert(m_device->use_count()==1, "The ref count for Device is %i but it should be 1 here to ensure all the resources are released", m_device->use_count()); diff --git a/Gems/Atom/RHI/Code/Source/RHI/RayTracingAccelerationStructure.cpp b/Gems/Atom/RHI/Code/Source/RHI/RayTracingAccelerationStructure.cpp index 37e5b316d6..4349761eb5 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/RayTracingAccelerationStructure.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/RayTracingAccelerationStructure.cpp @@ -85,6 +85,13 @@ namespace AZ return this; } + RayTracingTlasDescriptor* RayTracingTlasDescriptor::NonUniformScale(const AZ::Vector3& nonUniformScale) + { + AZ_Assert(m_buildContext, "NonUniformSCale property can only be added to an Instance entry"); + m_buildContext->m_nonUniformScale = nonUniformScale; + return this; + } + RayTracingTlasDescriptor* RayTracingTlasDescriptor::Blas(RHI::Ptr<RHI::RayTracingBlas>& blas) { AZ_Assert(m_buildContext, "Blas property can only be added to an Instance entry"); diff --git a/Gems/Atom/RHI/Code/Source/RHI/ResolveScopeAttachment.cpp b/Gems/Atom/RHI/Code/Source/RHI/ResolveScopeAttachment.cpp index 3cc85a88c0..623a7dedf7 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ResolveScopeAttachment.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ResolveScopeAttachment.cpp @@ -30,4 +30,4 @@ namespace AZ return m_descriptor; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/ResourcePoolDatabase.cpp b/Gems/Atom/RHI/Code/Source/RHI/ResourcePoolDatabase.cpp index 1f650b1359..3c5f287f0e 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ResourcePoolDatabase.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ResourcePoolDatabase.cpp @@ -98,4 +98,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/ScopeProducer.cpp b/Gems/Atom/RHI/Code/Source/RHI/ScopeProducer.cpp index c81758e350..caf584cb8d 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ScopeProducer.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ScopeProducer.cpp @@ -56,4 +56,4 @@ namespace AZ m_scope->Init(scopeId); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupInvalidateRegistry.cpp b/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupInvalidateRegistry.cpp index 85feafc85b..a417db30bc 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupInvalidateRegistry.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/ShaderResourceGroupInvalidateRegistry.cpp @@ -78,4 +78,4 @@ namespace AZ return ResultCode::Success; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Source/RHI/SwapChainFrameAttachment.cpp b/Gems/Atom/RHI/Code/Source/RHI/SwapChainFrameAttachment.cpp index 5cd7b7152d..8ad772989f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/SwapChainFrameAttachment.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/SwapChainFrameAttachment.cpp @@ -34,4 +34,4 @@ namespace AZ return m_swapChain.get(); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Buffer.h b/Gems/Atom/RHI/Code/Tests/Buffer.h index 7e95b24b71..cfa216293f 100644 --- a/Gems/Atom/RHI/Code/Tests/Buffer.h +++ b/Gems/Atom/RHI/Code/Tests/Buffer.h @@ -73,4 +73,4 @@ namespace UnitTest AZ::RHI::ResultCode StreamBufferInternal(const AZ::RHI::BufferStreamRequest& request) override; }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/DrawPacketTests.cpp b/Gems/Atom/RHI/Code/Tests/DrawPacketTests.cpp index 75a9081100..7fc393cd0c 100644 --- a/Gems/Atom/RHI/Code/Tests/DrawPacketTests.cpp +++ b/Gems/Atom/RHI/Code/Tests/DrawPacketTests.cpp @@ -80,11 +80,11 @@ namespace UnitTest m_indexBufferView = RHI::IndexBufferView(*m_bufferEmpty, random.GetRandom(), random.GetRandom(), RHI::IndexFormat::Uint16); } - void ValidateDrawItem(const DrawItemData& drawItemData, RHI::DrawItemKeyPair itemKeyPair) const + void ValidateDrawItem(const DrawItemData& drawItemData, RHI::DrawItemProperties itemProperties) const { - const RHI::DrawItem* drawItem = itemKeyPair.m_item; + const RHI::DrawItem* drawItem = itemProperties.m_item; - EXPECT_EQ(itemKeyPair.m_sortKey, drawItemData.m_sortKey); + EXPECT_EQ(itemProperties.m_sortKey, drawItemData.m_sortKey); EXPECT_EQ(drawItem->m_stencilRef, drawItemData.m_stencilRef); EXPECT_EQ(drawItem->m_pipelineState, drawItemData.m_pipelineState); diff --git a/Gems/Atom/RHI/Code/Tests/Image.cpp b/Gems/Atom/RHI/Code/Tests/Image.cpp index 640b1b8b2d..260b832c60 100644 --- a/Gems/Atom/RHI/Code/Tests/Image.cpp +++ b/Gems/Atom/RHI/Code/Tests/Image.cpp @@ -46,4 +46,4 @@ namespace UnitTest void ImagePool::ShutdownResourceInternal(RHI::Resource&) { } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Image.h b/Gems/Atom/RHI/Code/Tests/Image.h index 2b2ac51ab1..b1096d84b7 100644 --- a/Gems/Atom/RHI/Code/Tests/Image.h +++ b/Gems/Atom/RHI/Code/Tests/Image.h @@ -56,4 +56,4 @@ namespace UnitTest void ShutdownResourceInternal(AZ::RHI::Resource& image) override; }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Query.cpp b/Gems/Atom/RHI/Code/Tests/Query.cpp index 84f3ee8f5d..e81482b3ba 100644 --- a/Gems/Atom/RHI/Code/Tests/Query.cpp +++ b/Gems/Atom/RHI/Code/Tests/Query.cpp @@ -48,4 +48,4 @@ namespace UnitTest } return RHI::ResultCode::Success; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Query.h b/Gems/Atom/RHI/Code/Tests/Query.h index 77f2c3be18..6220ae5f55 100644 --- a/Gems/Atom/RHI/Code/Tests/Query.h +++ b/Gems/Atom/RHI/Code/Tests/Query.h @@ -44,4 +44,4 @@ namespace UnitTest AZ::RHI::ResultCode InitQueryInternal(AZ::RHI::Query& query) override; AZ::RHI::ResultCode GetResultsInternal(uint32_t startIndex, uint32_t queryCount, uint64_t* results, uint32_t resultsCount, AZ::RHI::QueryResultFlagBits flags) override; }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Scope.cpp b/Gems/Atom/RHI/Code/Tests/Scope.cpp index 69a60dfd32..02072b432f 100644 --- a/Gems/Atom/RHI/Code/Tests/Scope.cpp +++ b/Gems/Atom/RHI/Code/Tests/Scope.cpp @@ -64,4 +64,4 @@ namespace UnitTest ASSERT_TRUE(found); } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/Scope.h b/Gems/Atom/RHI/Code/Tests/Scope.h index 3a6721037b..f2df1856b7 100644 --- a/Gems/Atom/RHI/Code/Tests/Scope.h +++ b/Gems/Atom/RHI/Code/Tests/Scope.h @@ -37,4 +37,4 @@ namespace UnitTest void ValidateBinding(const AZ::RHI::ScopeAttachment* scopeAttachment); ////////////////////////////////////////////////////////////////////////// }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.cpp b/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.cpp index 309808e582..f9afdb307c 100644 --- a/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.cpp +++ b/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.cpp @@ -37,4 +37,4 @@ namespace UnitTest { return RHI::ResultCode::Success; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.h b/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.h index 447321f228..bae2c64ddd 100644 --- a/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.h +++ b/Gems/Atom/RHI/Code/Tests/ShaderResourceGroup.h @@ -43,4 +43,4 @@ namespace UnitTest void ShutdownResourceInternal(AZ::RHI::Resource& resourceBase) override; }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/ThreadTester.h b/Gems/Atom/RHI/Code/Tests/ThreadTester.h index fa402b28a9..7625fd5f6f 100644 --- a/Gems/Atom/RHI/Code/Tests/ThreadTester.h +++ b/Gems/Atom/RHI/Code/Tests/ThreadTester.h @@ -23,4 +23,4 @@ namespace UnitTest static void Dispatch(size_t threadCountMax, ThreadFunction threadFunction); }; -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp b/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp index 3bc5d568f3..506edc0d1e 100644 --- a/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp +++ b/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp @@ -42,7 +42,9 @@ namespace UnitTest AZStd::string testFilePath = TestDataFolder + AZStd::string("HelloWorld.txt"); AZ::Outcome<AZStd::string, AZStd::string> outcome = AZ::RHI::LoadFileString(testFilePath.c_str()); EXPECT_TRUE(outcome.IsSuccess()); - EXPECT_EQ(AZStd::string("Hello World!"), outcome.GetValue()); + auto& str = outcome.GetValue(); + str.erase(AZStd::remove(str.begin(), str.end(), '\r')); + EXPECT_EQ(AZStd::string("Hello World!\n"), str); } TEST_F(UtilsTests, LoadFileBytes) @@ -50,8 +52,10 @@ namespace UnitTest AZStd::string testFilePath = TestDataFolder + AZStd::string("HelloWorld.txt"); AZ::Outcome<AZStd::vector<uint8_t>, AZStd::string> outcome = AZ::RHI::LoadFileBytes(testFilePath.c_str()); EXPECT_TRUE(outcome.IsSuccess()); - AZStd::string expectedText = "Hello World!"; - EXPECT_EQ(AZStd::vector<uint8_t>(expectedText.begin(), expectedText.end()), outcome.GetValue()); + AZStd::string expectedText = "Hello World!\n"; + auto& str = outcome.GetValue(); + str.erase(AZStd::remove(str.begin(), str.end(), '\r')); + EXPECT_EQ(AZStd::vector<uint8_t>(expectedText.begin(), expectedText.end()), str); } TEST_F(UtilsTests, LoadFileString_Error_DoesNotExist) diff --git a/Gems/Atom/RHI/Code/Tests/UtilsTestsData/HelloWorld.txt b/Gems/Atom/RHI/Code/Tests/UtilsTestsData/HelloWorld.txt index c57eff55eb..980a0d5f19 100644 --- a/Gems/Atom/RHI/Code/Tests/UtilsTestsData/HelloWorld.txt +++ b/Gems/Atom/RHI/Code/Tests/UtilsTestsData/HelloWorld.txt @@ -1 +1 @@ -Hello World! \ No newline at end of file +Hello World! diff --git a/Gems/Atom/RHI/Code/atom_rhi_public_files.cmake b/Gems/Atom/RHI/Code/atom_rhi_public_files.cmake index 79239e2c09..d39c3cb6df 100644 --- a/Gems/Atom/RHI/Code/atom_rhi_public_files.cmake +++ b/Gems/Atom/RHI/Code/atom_rhi_public_files.cmake @@ -36,6 +36,7 @@ set(FILES Include/Atom/RHI/CopyItem.h Include/Atom/RHI/ConstantsData.h Include/Atom/RHI/DispatchItem.h + Include/Atom/RHI/DrawFilterTagRegistry.h Include/Atom/RHI/DrawItem.h Include/Atom/RHI/DrawList.h Include/Atom/RHI/DrawListTagRegistry.h @@ -48,7 +49,6 @@ set(FILES Source/RHI/ConstantsData.cpp Source/RHI/DrawList.cpp Source/RHI/DrawListContext.cpp - Source/RHI/DrawListTagRegistry.cpp Source/RHI/DrawPacket.cpp Source/RHI/DrawPacketBuilder.cpp Include/Atom/RHI/Device.h @@ -201,4 +201,5 @@ set(FILES Include/Atom/RHI/CpuProfiler.h Include/Atom/RHI/CpuProfilerImpl.h Source/RHI/CpuProfilerImpl.cpp + Include/Atom/RHI/TagRegistry.h ) diff --git a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/ReflectSystemComponent.h b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/ReflectSystemComponent.h index b86147b675..e69a2fa993 100644 --- a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/ReflectSystemComponent.h +++ b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/ReflectSystemComponent.h @@ -34,4 +34,4 @@ namespace AZ void Deactivate() override {} }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp index fcfc9725df..d46a874188 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp @@ -10,4 +10,4 @@ * */ -// This is an intentionally empty file used to compile on platforms that cannot support artifacts without at least one source file \ No newline at end of file +// This is an intentionally empty file used to compile on platforms that cannot support artifacts without at least one source file diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/PAL_windows.cmake index f5a911828b..9bcc0e2ca8 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/PAL_windows.cmake @@ -52,4 +52,4 @@ endif() # Disable windows OS version check until infra can upgrade all our jenkins nodes # if(NOT CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL "10.0.17763") # message(FATAL_ERROR "Windows DX12 RHI implementation requires an OS version and SDK matching windows 10 build 1809 or greater") -# endif() \ No newline at end of file +# endif() diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake index 7d4bac7b2f..4b95efb31c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake @@ -13,4 +13,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE d3d12 dxgi -) \ No newline at end of file +) diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/AttachmentImagePool.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/AttachmentImagePool.cpp index c9ed01544b..15fe3133fa 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/AttachmentImagePool.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/AttachmentImagePool.cpp @@ -74,4 +74,4 @@ namespace AZ builder.SetMemoryUsageForHeap(RHI::PlatformHeapId{ RHI::PlatformHeapType::Local }, info); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Buffer.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/Buffer.cpp index 47d050b5b1..54bcdc9f3c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Buffer.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Buffer.cpp @@ -50,4 +50,4 @@ namespace AZ bufferStats->m_sizeInBytes = m_memoryView.GetSize(); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferPool.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferPool.h index 41f86b9ce6..163d370a1e 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferPool.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferPool.h @@ -58,4 +58,4 @@ namespace AZ BufferMemoryAllocator m_allocator; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferView.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferView.h index fac7538f5e..8578a838b1 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferView.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/BufferView.h @@ -59,4 +59,4 @@ namespace AZ ID3D12Resource* m_memory = nullptr; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/DX12.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/DX12.cpp index e877a2c692..67be4f43a0 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/DX12.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/DX12.cpp @@ -249,4 +249,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.cpp index 7fa782dd0b..5638129270 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.cpp @@ -89,4 +89,4 @@ namespace AZ return !IsNull(); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.h index 41f5e4550d..df6787cdc5 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Descriptor.h @@ -56,4 +56,4 @@ namespace AZ uint16_t m_size = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.cpp index 0d2659bf62..ff147e1d86 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.cpp @@ -127,4 +127,4 @@ namespace AZ return D3D12_GPU_DESCRIPTOR_HANDLE{ m_GpuStart.ptr + handle.m_index * m_Stride }; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.h index b970a63fb2..aaaa0d0f75 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/DescriptorPool.h @@ -55,4 +55,4 @@ namespace AZ AZStd::unique_ptr<RHI::Allocator> m_allocator; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroup.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroup.h index c8d3688eb5..046de863ee 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroup.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroup.h @@ -46,4 +46,4 @@ namespace AZ const Scope* m_scope = nullptr; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroupBase.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroupBase.h index 0eac383b3b..0467b1294c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroupBase.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/FrameGraphExecuteGroupBase.h @@ -41,4 +41,4 @@ namespace AZ ExecuteWorkRequest m_workRequest; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/ImagePool.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/ImagePool.h index b9b70f433f..1d1e719df1 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/ImagePool.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/ImagePool.h @@ -51,4 +51,4 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/ImageView.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/ImageView.h index 76bb001143..f5bffff949 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/ImageView.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/ImageView.h @@ -68,4 +68,4 @@ namespace AZ DescriptorHandle m_depthStencilReadDescriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h index 1d79d88100..950663ee8d 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h @@ -55,4 +55,4 @@ namespace AZ #endif }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.cpp index fc9c97d9e1..5741dc2908 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.cpp @@ -57,4 +57,4 @@ namespace AZ return EndInternal(commandList); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.h index 7995e787fe..4dc36e0c4c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Query.h @@ -46,4 +46,4 @@ namespace AZ uint64_t m_resultFenceValue = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/QueryPoolResolver.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/QueryPoolResolver.h index 7b171f30d2..828cef4c97 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/QueryPoolResolver.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/QueryPoolResolver.h @@ -71,4 +71,4 @@ namespace AZ RHI::Ptr<FenceImpl> m_resolveFence; ///< Fence used for checking if a request has finished. }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp index 77d8d38e42..1342db5690 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp @@ -89,8 +89,9 @@ namespace AZ mappedData[i].InstanceID = instance.m_instanceID; mappedData[i].InstanceContributionToHitGroupIndex = instance.m_hitGroupIndex; // convert transform to row-major 3x4 - AZ::Matrix3x4 matrix34 = AZ::Matrix3x4::CreateFromTransform(instance.m_transform); - matrix34.StoreToRowMajorFloat12(&mappedData[i].Transform[0][0]); + AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromTransform(instance.m_transform); + matrix3x4.MultiplyByScale(instance.m_nonUniformScale); + matrix3x4.StoreToRowMajorFloat12(&mappedData[i].Transform[0][0]); mappedData[i].AccelerationStructure = static_cast<DX12::Buffer*>(blas->GetBuffers().m_blasBuffer.get())->GetMemoryView().GetGpuAddress(); // [GFX TODO][ATOM-5270] Add ray tracing TLAS instance mask support mappedData[i].InstanceMask = 0x1; diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/ReleaseQueue.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/ReleaseQueue.h index 0e2d552a2e..038e8dcd82 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/ReleaseQueue.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/ReleaseQueue.h @@ -36,4 +36,4 @@ namespace AZ using ReleaseQueue = RHI::ObjectCollector<ReleaseQueueTraits>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Sampler.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/Sampler.h index 35c6e308ef..befb9533e7 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Sampler.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Sampler.h @@ -50,4 +50,4 @@ namespace AZ DescriptorHandle m_descriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroup.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroup.cpp index 3c36983309..26794595c9 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroup.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/ShaderResourceGroup.cpp @@ -26,4 +26,4 @@ namespace AZ return m_compiledData[m_compiledDataIndex]; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/StreamingImagePool.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/StreamingImagePool.h index f9cf350f82..725864dc93 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/StreamingImagePool.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/StreamingImagePool.h @@ -72,4 +72,4 @@ namespace AZ RHI::PoolAllocator m_tileAllocator; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h index eb61df4a6b..a6c88ac435 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h @@ -62,4 +62,4 @@ namespace AZ bool m_isTearingSupported = false; //!< Is tearing support available for full screen borderless windowed mode? }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/resource.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/resource.h index 105cd085a0..2f1aa57e9e 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/resource.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/resource.h @@ -8,4 +8,4 @@ * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - */ \ No newline at end of file + */ diff --git a/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/ReflectSystemComponent.h b/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/ReflectSystemComponent.h index 2f3ff88b41..6b926fac35 100644 --- a/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/ReflectSystemComponent.h +++ b/Gems/Atom/RHI/Metal/Code/Include/Atom/RHI.Reflect/Metal/ReflectSystemComponent.h @@ -34,4 +34,4 @@ namespace AZ void Deactivate() override {} }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.cpp b/Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.cpp index d36ac85969..42d5a87697 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Atom_RHI_Metal_precompiled.h" \ No newline at end of file +#include "Atom_RHI_Metal_precompiled.h" diff --git a/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/platform_private_mac_files.cmake b/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/platform_private_mac_files.cmake index 0eabaab7a8..1104224475 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/platform_private_mac_files.cmake +++ b/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/platform_private_mac_files.cmake @@ -25,4 +25,4 @@ ly_add_source_properties( SOURCES Source/Platform/Mac/RHI/MetalView_Mac.mm PROPERTY COMPILE_OPTIONS VALUES -xobjective-c++ -) \ No newline at end of file +) diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h index e118239051..0122f02e0b 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h @@ -43,4 +43,4 @@ namespace AZ AZStd::unique_ptr<ShaderPlatformInterface> m_shaderPlatformInterface; }; } // namespace Metal -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Null/Code/CMakeLists.txt b/Gems/Atom/RHI/Null/Code/CMakeLists.txt index cd9f54804b..1b88e72648 100644 --- a/Gems/Atom/RHI/Null/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Null/Code/CMakeLists.txt @@ -103,4 +103,4 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) Gem::Atom_RHI.Reflect Gem::Atom_RHI_Null.Builders.Static ) -endif() \ No newline at end of file +endif() diff --git a/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg b/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg index 4646c77af1..0a237c6ea9 100644 --- a/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg +++ b/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg @@ -54,4 +54,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows_files.cmake b/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake similarity index 89% rename from Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows_files.cmake rename to Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake index e110029d0d..82985b3188 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows_files.cmake +++ b/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake @@ -9,6 +9,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(FILES - AtomShim_Renderer_Windows.cpp +set(GLAD_VULKAN_COMPILE_DEFINITIONS + VK_USE_PLATFORM_XCB_KHR ) diff --git a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt index f433c24fd3..497568df52 100644 --- a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt @@ -188,11 +188,11 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) BUILD_DEPENDENCIES PRIVATE AZ::AzCore - Gem::Atom_RHI.Edit Gem::Atom_RHI.Reflect Gem::Atom_RHI.Public Gem::Atom_RHI_Vulkan.Reflect Gem::Atom_RHI_Vulkan.Builders.Static + Gem::Atom_RHI.Edit ) endif() diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ReflectSystemComponent.h b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ReflectSystemComponent.h index c9ce0ac7d2..a3073b6316 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ReflectSystemComponent.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ReflectSystemComponent.h @@ -34,4 +34,4 @@ namespace AZ void Deactivate() override {} }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h index a18adda7de..d6fa6cd24b 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h @@ -58,4 +58,4 @@ namespace AZ }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom/RHI.Loader/Glad/Vulkan_Platform.h b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom/RHI.Loader/Glad/Vulkan_Platform.h index 7d9a58a823..a987061daf 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom/RHI.Loader/Glad/Vulkan_Platform.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom/RHI.Loader/Glad/Vulkan_Platform.h @@ -10,3 +10,6 @@ * */ #pragma once + +#include <xcb/xcb.h> +#include <xcb/xcbext.h> diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/AtomShim_Renderer_Windows.cpp b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Linux.h similarity index 63% rename from Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/AtomShim_Renderer_Windows.cpp rename to Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Linux.h index ca5dbd8950..d41a8bb0c7 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/AtomShim_Renderer_Windows.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Linux.h @@ -1,6 +1,6 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, @@ -9,15 +9,13 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ +#pragma once -#include "CryRenderOther_precompiled.h" - -namespace Platform -{ - WIN_HWND GetNativeWindowHandle() - { - return GetDesktopWindow(); - } -} - +#include <AzCore/base.h> +#include <AzCore/PlatformIncl.h> +#include <AzCore/std/algorithm.h> +#include <vulkan/vulkan.h> +#include <limits.h> +#include <RHI/Vulkan.h> +#define AZ_VULKAN_SURFACE_EXTENSION_NAME VK_KHR_XCB_SURFACE_EXTENSION_NAME diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h index f42f05ee79..16ff9fdd88 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h @@ -11,4 +11,5 @@ */ #pragma once +#include <Atom_RHI_Vulkan_precompiled_Linux.h> diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.cpp index 926b13ad30..65e8f51730 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Atom_RHI_Vulkan_precompiled.h" \ No newline at end of file +#include "Atom_RHI_Vulkan_precompiled.h" diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/PAL_android.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/PAL_android.cmake index d6b3f6c001..9f03acf069 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/PAL_android.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/PAL_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED TRUE) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/RHI/WSISurface_Android.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/RHI/WSISurface_Android.cpp index 6650b15127..fae8ec7c99 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/RHI/WSISurface_Android.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/RHI/WSISurface_Android.cpp @@ -35,4 +35,4 @@ namespace AZ return ConvertResult(result); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/Vulkan_Traits_Android.h b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/Vulkan_Traits_Android.h index 2237054313..c9d7909b50 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/Vulkan_Traits_Android.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Android/Vulkan_Traits_Android.h @@ -16,4 +16,4 @@ #define AZ_TRAIT_ATOM_VULKAN_DLL "libvulkan.so" #define AZ_TRAIT_ATOM_VULKAN_DLL_1 "libvulkan.so.1" #define AZ_TRAIT_ATOM_VULKAN_LAYER_LUNARG_STD_VALIDATION_SUPPORT 0 -#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM (800 * 1024 * 1024LL) //800MB \ No newline at end of file +#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM (800 * 1024 * 1024LL) //800MB diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp index fcfc9725df..d46a874188 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp @@ -10,4 +10,4 @@ * */ -// This is an intentionally empty file used to compile on platforms that cannot support artifacts without at least one source file \ No newline at end of file +// This is an intentionally empty file used to compile on platforms that cannot support artifacts without at least one source file diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/PAL_linux.cmake index 57bf0561d9..9f03acf069 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED TRUE) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI.Builders/BuilderModule_Linux.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI.Builders/BuilderModule_Linux.cpp new file mode 100644 index 0000000000..84347cd5ea --- /dev/null +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI.Builders/BuilderModule_Linux.cpp @@ -0,0 +1,51 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <Atom/RHI.Reflect/Vulkan/ReflectSystemComponent.h> +#include <Atom/RHI.Reflect/ReflectSystemComponent.h> +#include <AzCore/Module/Module.h> +#include <RHI.Builders/ShaderPlatformInterfaceSystemComponent.h> + +namespace AZ +{ + namespace Vulkan + { + + //! Exposes Vulkan RHI Building components to the Asset Processor. + class BuilderModule final + : public AZ::Module + { + public: + AZ_RTTI(BuilderModule, "{C22CF1CB-59AA-4247-A983-BC371A7B0513}", AZ::Module); + + BuilderModule() + { + m_descriptors.insert(m_descriptors.end(), { + ShaderPlatformInterfaceSystemComponent::CreateDescriptor() + }); + } + + AZ::ComponentTypeList GetRequiredSystemComponents() const override + { + return + { + azrtti_typeid<ShaderPlatformInterfaceSystemComponent>(), + }; + } + }; + } // namespace Vulkan +} // namespace AZ + +// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM +// The first parameter should be GemName_GemIdLower +// The second should be the fully qualified name of the class above +AZ_DECLARE_MODULE_CLASS(Gem_Atom_RHI_Vulkan_Builders, AZ::Vulkan::BuilderModule); diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp new file mode 100644 index 0000000000..f6cbfa813b --- /dev/null +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp @@ -0,0 +1,36 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#include "Atom_RHI_Vulkan_precompiled.h" +#include <RHI/Conversion.h> +#include <RHI/Instance.h> +#include <RHI/WSISurface.h> + +namespace AZ +{ + namespace Vulkan + { + RHI::ResultCode WSISurface::BuildNativeSurface() + { + Instance& instance = Instance::GetInstance(); + + VkXcbSurfaceCreateInfoKHR createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; + createInfo.pNext = nullptr; + createInfo.flags = 0; + createInfo.window = static_cast<xcb_window_t>(m_descriptor.m_windowHandle.GetIndex()); + const VkResult result = vkCreateXcbSurfaceKHR(instance.GetNativeInstance(), &createInfo, nullptr, &m_nativeSurface); + AssertSuccess(result); + + return ConvertResult(result); + } + } +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/Vulkan_Traits_Linux.h b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/Vulkan_Traits_Linux.h index 375b9b2f66..3c2162ef45 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/Vulkan_Traits_Linux.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/Vulkan_Traits_Linux.h @@ -11,7 +11,7 @@ */ #pragma once -#define AZ_TRAIT_ATOM_SHADERBUILDER_DXC "Builders/DirectXShaderCompilerAz/dxc.exe" +#define AZ_TRAIT_ATOM_SHADERBUILDER_DXC "Builders/DirectXShaderCompilerAz/bin/dxc" #define AZ_TRAIT_ATOM_VULKAN_DISABLE_DUAL_SOURCE_BLENDING 0 #define AZ_TRAIT_ATOM_VULKAN_DLL "" #define AZ_TRAIT_ATOM_VULKAN_DLL_1 "" diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_builders_linux_files.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_builders_linux_files.cmake index 5714be5dfb..119f8ac1b3 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_builders_linux_files.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_builders_linux_files.cmake @@ -10,4 +10,5 @@ # set(FILES + RHI.Builders/BuilderModule_Linux.cpp ) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_glad_linux_files.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_glad_linux_files.cmake index bb71412c73..5714be5dfb 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_glad_linux_files.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_glad_linux_files.cmake @@ -10,5 +10,4 @@ # set(FILES - ../Common/Unimplemented/Empty_Unimplemented.cpp ) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_private_linux_files.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_private_linux_files.cmake index 04a399e16b..02902fd17d 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_private_linux_files.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_private_linux_files.cmake @@ -10,7 +10,7 @@ # set(FILES - ../Common/Unimplemented/ModuleStub_Unimplemented.cpp + RHI/WSISurface_Linux.cpp Vulkan_Traits_Linux.h Vulkan_Traits_Platform.h ) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_reflect_linux_files.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_reflect_linux_files.cmake index bb71412c73..5714be5dfb 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_reflect_linux_files.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/platform_reflect_linux_files.cmake @@ -10,5 +10,4 @@ # set(FILES - ../Common/Unimplemented/Empty_Unimplemented.cpp ) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/PAL_mac.cmake index 57bf0561d9..efec0afa3a 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/Vulkan_Traits_Mac.h b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/Vulkan_Traits_Mac.h index 109b7f1fa4..3c2162ef45 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/Vulkan_Traits_Mac.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/Vulkan_Traits_Mac.h @@ -16,4 +16,4 @@ #define AZ_TRAIT_ATOM_VULKAN_DLL "" #define AZ_TRAIT_ATOM_VULKAN_DLL_1 "" #define AZ_TRAIT_ATOM_VULKAN_LAYER_LUNARG_STD_VALIDATION_SUPPORT 0 -#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM 0 \ No newline at end of file +#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM 0 diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/platform_private_static_mac.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/platform_private_static_mac.cmake index 209e7f9107..0286e6465b 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/platform_private_static_mac.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Mac/platform_private_static_mac.cmake @@ -12,4 +12,4 @@ set(LY_COMPILE_OPTIONS PRIVATE -xobjective-c++ -) \ No newline at end of file +) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/PAL_windows.cmake index d6b3f6c001..9f03acf069 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED TRUE) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp index 17f45c6dd1..5c2d1df6b6 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp @@ -35,4 +35,4 @@ namespace AZ return ConvertResult(result); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/PAL_ios.cmake b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/PAL_ios.cmake index 57bf0561d9..efec0afa3a 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/PAL_ios.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/Vulkan_Traits_iOS.h b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/Vulkan_Traits_iOS.h index 5d54fbb700..f475098fd0 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/Vulkan_Traits_iOS.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/iOS/Vulkan_Traits_iOS.h @@ -16,4 +16,4 @@ #define AZ_TRAIT_ATOM_VULKAN_DLL "" #define AZ_TRAIT_ATOM_VULKAN_DLL_1 "" #define AZ_TRAIT_ATOM_VULKAN_LAYER_LUNARG_STD_VALIDATION_SUPPORT 0 -#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM 0 \ No newline at end of file +#define AZ_TRAIT_ATOM_VULKAN_MIN_GPU_MEM 0 diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h index 1c9088729f..cfaa1de180 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterfaceSystemComponent.h @@ -43,4 +43,4 @@ namespace AZ AZStd::unique_ptr<ShaderPlatformInterface> m_shaderPlatformInterface; }; } // namespace Vulkan -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp index 054935c7b6..40bcf7cbc0 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp @@ -60,4 +60,4 @@ namespace AZ return m_byteCodesByStage[static_cast<uint32_t>(shaderStage)]; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.cpp index fdce1e17ba..4dfb2e1306 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.cpp @@ -152,4 +152,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.h index c501e72d52..29b3747936 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandListAllocator.h @@ -120,4 +120,4 @@ namespace AZ bool m_isInitialized = false; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.cpp index 05c63b498c..6f7539a0e7 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.cpp @@ -129,4 +129,4 @@ namespace AZ AssertSuccess(vkResetCommandPool(device.GetNativeDevice(), m_nativeCommandPool, 0)); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.h index 497e836d75..cc04e5d141 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandPool.h @@ -70,4 +70,4 @@ namespace AZ AZStd::vector<RHI::Ptr<CommandList>> m_freeCommandLists; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ComputePipeline.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ComputePipeline.h index 6edaae1b57..1519b615c3 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ComputePipeline.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ComputePipeline.h @@ -48,4 +48,4 @@ namespace AZ }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorPool.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorPool.h index 17f96bd8d9..a084a30ff5 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorPool.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorPool.h @@ -95,4 +95,4 @@ namespace AZ AZStd::unordered_set<RHI::Ptr<ObjectType>> m_objects; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSetAllocator.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSetAllocator.h index afc46c2d0f..c5117416fb 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSetAllocator.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSetAllocator.h @@ -125,4 +125,4 @@ namespace AZ bool m_isInitialized = false; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp index 159f55e9d0..ff7eb7f4c0 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp @@ -163,21 +163,23 @@ namespace AZ uint32_t minorVersion = VK_VERSION_MINOR(physicalProperties.apiVersion); // unbounded array functionality - VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures = {}; + VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptorIndexingFeatures = {}; descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES; - descriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE; - descriptorIndexingFeatures.descriptorBindingPartiallyBound = VK_TRUE; - descriptorIndexingFeatures.descriptorBindingVariableDescriptorCount = VK_TRUE; - descriptorIndexingFeatures.runtimeDescriptorArray = VK_TRUE; + const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& physicalDeviceDescriptorIndexingFeatures = + physicalDevice.GetPhysicalDeviceDescriptorIndexingFeatures(); + descriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing = physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing; + descriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing = physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing; + descriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing = physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing; + descriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing; + descriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing = physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing; + descriptorIndexingFeatures.descriptorBindingPartiallyBound = physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing; + descriptorIndexingFeatures.descriptorBindingVariableDescriptorCount = physicalDeviceDescriptorIndexingFeatures.descriptorBindingVariableDescriptorCount; + descriptorIndexingFeatures.runtimeDescriptorArray = physicalDeviceDescriptorIndexingFeatures.runtimeDescriptorArray; VkPhysicalDeviceDepthClipEnableFeaturesEXT depthClipEnabled = {}; depthClipEnabled.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT; @@ -196,7 +198,7 @@ namespace AZ // If we are running Vulkan >= 1.2, then we must use VkPhysicalDeviceVulkan12Features instead // of VkPhysicalDeviceShaderFloat16Int8FeaturesKHR or VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR. if (majorVersion >= 1 && minorVersion >= 2) - { + { vulkan12Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES; vulkan12Features.drawIndirectCount = physicalDevice.GetPhysicalDeviceVulkan12Features().drawIndirectCount; vulkan12Features.shaderFloat16 = physicalDevice.GetPhysicalDeviceVulkan12Features().shaderFloat16; @@ -205,7 +207,7 @@ namespace AZ robustness2.pNext = &vulkan12Features; } else - { + { float16Int8.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR; float16Int8.shaderFloat16 = physicalDevice.GetPhysicalDeviceFloat16Int8Features().shaderFloat16; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Fence.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Fence.h index 4c63b8f642..df5d43a0ac 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Fence.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Fence.h @@ -62,4 +62,4 @@ namespace AZ AZ::Vulkan::SignalEvent m_signalEvent; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp index 81669ef73d..e3367b078a 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.cpp @@ -133,6 +133,11 @@ namespace AZ return m_float16Int8Features; } + const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& PhysicalDevice::GetPhysicalDeviceDescriptorIndexingFeatures() const + { + return m_descriptorIndexingFeatures; + } + const VkPhysicalDeviceVulkan12Features& PhysicalDevice::GetPhysicalDeviceVulkan12Features() const { return m_vulkan12Features; @@ -233,6 +238,7 @@ namespace AZ m_features.set(static_cast<size_t>(DeviceFeature::SeparateDepthStencil), (m_separateDepthStencilFeatures.separateDepthStencilLayouts && VK_DEVICE_EXTENSION_SUPPORTED(KHR_separate_depth_stencil_layouts)) || (m_vulkan12Features.separateDepthStencilLayouts)); + m_features.set(static_cast<size_t>(DeviceFeature::DescriptorIndexing), VK_DEVICE_EXTENSION_SUPPORTED(EXT_descriptor_indexing)); } void PhysicalDevice::CompileMemoryStatistics(RHI::MemoryStatisticsBuilder& builder) const @@ -266,9 +272,14 @@ namespace AZ if (VK_INSTANCE_EXTENSION_SUPPORTED(KHR_get_physical_device_properties2)) { // features + VkPhysicalDeviceDescriptorIndexingFeaturesEXT& descriptorIndexingFeatures = m_descriptorIndexingFeatures; + descriptorIndexingFeatures = {}; + descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT; + VkPhysicalDeviceDepthClipEnableFeaturesEXT& dephClipEnableFeatures = m_dephClipEnableFeatures; dephClipEnableFeatures = {}; dephClipEnableFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT; + descriptorIndexingFeatures.pNext = &dephClipEnableFeatures; VkPhysicalDeviceRobustness2FeaturesEXT& robustness2Feature = m_robutness2Features; robustness2Feature = {}; @@ -292,7 +303,7 @@ namespace AZ VkPhysicalDeviceFeatures2 deviceFeatures2 = {}; deviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; - deviceFeatures2.pNext = &dephClipEnableFeatures; + deviceFeatures2.pNext = &descriptorIndexingFeatures; vkGetPhysicalDeviceFeatures2KHR(vkPhysicalDevice, &deviceFeatures2); m_deviceFeatures = deviceFeatures2.features; @@ -302,7 +313,7 @@ namespace AZ m_conservativeRasterProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT; deviceProps2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; deviceProps2.pNext = &m_conservativeRasterProperties; - + m_rayTracingPipelineProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR; m_conservativeRasterProperties.pNext = &m_rayTracingPipelineProperties; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h index bd01a2e884..9667e03d3b 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PhysicalDevice.h @@ -34,6 +34,7 @@ namespace AZ DrawIndirectCount, NullDescriptor, SeparateDepthStencil, + DescriptorIndexing, Count // Must be last }; @@ -57,6 +58,7 @@ namespace AZ const VkPhysicalDeviceDepthClipEnableFeaturesEXT& GetPhysicalDeviceDepthClipEnableFeatures() const; const VkPhysicalDeviceRobustness2FeaturesEXT& GetPhysicalDeviceRobutness2Features() const; const VkPhysicalDeviceShaderFloat16Int8FeaturesKHR& GetPhysicalDeviceFloat16Int8Features() const; + const VkPhysicalDeviceDescriptorIndexingFeaturesEXT& GetPhysicalDeviceDescriptorIndexingFeatures() const; const VkPhysicalDeviceVulkan12Features& GetPhysicalDeviceVulkan12Features() const; const VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR& GetPhysicalDeviceSeparateDepthStencilFeatures() const; const VkPhysicalDeviceAccelerationStructurePropertiesKHR& GetPhysicalDeviceAccelerationStructureProperties() const; @@ -70,7 +72,6 @@ namespace AZ private: PhysicalDevice() = default; - void Init(VkPhysicalDevice vkPhysicalDevice); /////////////////////////////////////////////////////////////////// @@ -88,6 +89,7 @@ namespace AZ VkPhysicalDeviceDepthClipEnableFeaturesEXT m_dephClipEnableFeatures{}; VkPhysicalDeviceRobustness2FeaturesEXT m_robutness2Features{}; VkPhysicalDeviceShaderFloat16Int8FeaturesKHR m_float16Int8Features{}; + VkPhysicalDeviceDescriptorIndexingFeaturesEXT m_descriptorIndexingFeatures{}; VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR m_separateDepthStencilFeatures{}; VkPhysicalDeviceAccelerationStructurePropertiesKHR m_accelerationStructureProperties{}; VkPhysicalDeviceRayTracingPipelinePropertiesKHR m_rayTracingPipelineProperties{}; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLibrary.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLibrary.h index a3ab1ba90f..b0a317555f 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLibrary.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/PipelineLibrary.h @@ -53,4 +53,4 @@ namespace AZ VkPipelineCache m_nativePipelineCache = VK_NULL_HANDLE; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.cpp index 32490862a2..2b06ef31d2 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.cpp @@ -64,4 +64,4 @@ namespace AZ return RHI::ResultCode::Success; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.h index 3abc521213..e547e0dac3 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Query.h @@ -41,4 +41,4 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/RayTracingTlas.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/RayTracingTlas.cpp index 9720fecb6d..a1346612c9 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/RayTracingTlas.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/RayTracingTlas.cpp @@ -92,9 +92,9 @@ namespace AZ mappedData[i].instanceCustomIndex = instance.m_instanceID; mappedData[i].instanceShaderBindingTableRecordOffset = instance.m_hitGroupIndex; - // convert transform to row-major 3x4 - AZ::Matrix3x4 matrix34 = AZ::Matrix3x4::CreateFromTransform(instance.m_transform); - matrix34.StoreToRowMajorFloat12(&mappedData[i].transform.matrix[0][0]); + AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromTransform(instance.m_transform); + matrix3x4.MultiplyByScale(instance.m_nonUniformScale); + matrix3x4.StoreToRowMajorFloat12(&mappedData[i].transform.matrix[0][0]); RayTracingBlas* blas = static_cast<RayTracingBlas*>(instance.m_blas.get()); VkAccelerationStructureDeviceAddressInfoKHR addressInfo = {}; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ReleaseQueue.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ReleaseQueue.h index fc3b75beb5..50cbe59708 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ReleaseQueue.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ReleaseQueue.h @@ -35,4 +35,4 @@ namespace AZ }; using ReleaseQueue = RHI::ObjectCollector<ReleaseQueueTraits>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Sampler.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Sampler.h index 26689a29df..2c713a0886 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Sampler.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Sampler.h @@ -64,4 +64,4 @@ namespace AZ VkSampler m_nativeSampler = VK_NULL_HANDLE; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Semaphore.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Semaphore.cpp index d0647bc8ed..9b98ae98ef 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Semaphore.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Semaphore.cpp @@ -92,4 +92,4 @@ namespace AZ Base::Shutdown(); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.cpp index 9b4cb88a8b..84f65d93b6 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.cpp @@ -54,4 +54,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.h index 02940ecff5..f061ebd827 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SemaphoreAllocator.h @@ -60,4 +60,4 @@ namespace AZ // will not be recycled and they just be destroy during the collect phase. using SemaphoreAllocator = RHI::ObjectPool<Internal::SemaphoreAllocatorTraits>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.cpp index 2e643a19c9..adfbeac39e 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.cpp @@ -82,4 +82,4 @@ namespace AZ Base::Shutdown(); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h index 37ad7095c0..48719c0fb8 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h @@ -66,4 +66,4 @@ namespace AZ VkShaderModule m_nativeShaderModule = VK_NULL_HANDLE; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.cpp index cfc71902eb..abf2ab91c3 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.cpp @@ -35,4 +35,4 @@ namespace AZ m_eventSignal.wait(lock, [&]() { return m_ready; }); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.h index 573f23e84f..ccecfc7944 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SignalEvent.h @@ -35,4 +35,4 @@ namespace AZ bool m_ready = false; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.cpp index e755000981..ded7daf65b 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.cpp @@ -43,4 +43,4 @@ namespace AZ return m_nativeSurface; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.h index ead1500c8d..f7a2699f08 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/WSISurface.h @@ -49,4 +49,4 @@ namespace AZ VkSurfaceKHR m_nativeSurface = VK_NULL_HANDLE; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_stub_module.cmake b/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_stub_module.cmake index e0745d6040..f6efae5251 100644 --- a/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_stub_module.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_stub_module.cmake @@ -11,4 +11,4 @@ set(FILES Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp -) \ No newline at end of file +) diff --git a/Gems/Atom/RPI/Assets/Materials/DefaultMaterial.azsl b/Gems/Atom/RPI/Assets/Materials/DefaultMaterial.azsl index fd3558c276..2110119248 100644 --- a/Gems/Atom/RPI/Assets/Materials/DefaultMaterial.azsl +++ b/Gems/Atom/RPI/Assets/Materials/DefaultMaterial.azsl @@ -128,4 +128,4 @@ PixelOutput MainPS(VertexOutput input) output.m_color = float4(result.xyz, baseColor.a); return output; -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultConstantBufferPool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultConstantBufferPool.resourcepool index d5b14edcbd..f839849c1e 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultConstantBufferPool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultConstantBufferPool.resourcepool @@ -10,4 +10,4 @@ "BufferPoolhostMemoryAccess": "Write", "BufferPoolBindFlags": "Constant" } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultImagePool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultImagePool.resourcepool index 75724a8f95..636eba7f5f 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultImagePool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultImagePool.resourcepool @@ -8,4 +8,4 @@ "BudgetInBytes": 33554432, "ImagePoolBindFlags": "Color" } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultIndexBufferPool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultIndexBufferPool.resourcepool index c6c90eee9c..9759ca376e 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultIndexBufferPool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultIndexBufferPool.resourcepool @@ -13,4 +13,4 @@ "ShaderRead" ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultRWBufferPool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultRWBufferPool.resourcepool index 36f95c5ebf..e20fa12c9d 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultRWBufferPool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultRWBufferPool.resourcepool @@ -10,4 +10,4 @@ "BufferPoolhostMemoryAccess": "Write", "BufferPoolBindFlags": "ShaderReadWrite" } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultReadOnlyBufferPool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultReadOnlyBufferPool.resourcepool index aa911d70d0..2417bc81a8 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultReadOnlyBufferPool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultReadOnlyBufferPool.resourcepool @@ -10,4 +10,4 @@ "BufferPoolhostMemoryAccess": "Write", "BufferPoolBindFlags": "ShaderRead" } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultStreamingImage.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultStreamingImage.resourcepool index de8d7c32c0..56f207dd03 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultStreamingImage.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultStreamingImage.resourcepool @@ -7,4 +7,4 @@ "PoolType": "StreamingImagePool", "BudgetInBytes": 2147483648 } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/ResourcePools/DefaultVertexBufferPool.resourcepool b/Gems/Atom/RPI/Assets/ResourcePools/DefaultVertexBufferPool.resourcepool index b5d3138ee6..1134101d07 100644 --- a/Gems/Atom/RPI/Assets/ResourcePools/DefaultVertexBufferPool.resourcepool +++ b/Gems/Atom/RPI/Assets/ResourcePools/DefaultVertexBufferPool.resourcepool @@ -13,4 +13,4 @@ "ShaderRead" ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/Shader/DecomposeMsImage.shader b/Gems/Atom/RPI/Assets/Shader/DecomposeMsImage.shader index e635c7db36..424c5ad6e3 100644 --- a/Gems/Atom/RPI/Assets/Shader/DecomposeMsImage.shader +++ b/Gems/Atom/RPI/Assets/Shader/DecomposeMsImage.shader @@ -12,4 +12,4 @@ ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/Shader/ImagePreview.shadervariantlist b/Gems/Atom/RPI/Assets/Shader/ImagePreview.shadervariantlist index 856a926666..76e37a323d 100644 --- a/Gems/Atom/RPI/Assets/Shader/ImagePreview.shadervariantlist +++ b/Gems/Atom/RPI/Assets/Shader/ImagePreview.shadervariantlist @@ -14,4 +14,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Assets/generate_asset_cmake.bat b/Gems/Atom/RPI/Assets/generate_asset_cmake.bat index 5d5f72b9bb..769adffbfd 100644 --- a/Gems/Atom/RPI/Assets/generate_asset_cmake.bat +++ b/Gems/Atom/RPI/Assets/generate_asset_cmake.bat @@ -50,4 +50,4 @@ echo set(FILES>> %OUTPUT_FILE% ) ) >> %OUTPUT_FILE% -@echo ) >> %OUTPUT_FILE% \ No newline at end of file +@echo ) >> %OUTPUT_FILE% diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h index 3393f6af5c..789717cabe 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h @@ -214,6 +214,10 @@ namespace AZ Scene* m_scene = nullptr; RHI::DrawListTag m_drawListTag; + // All draw items use this filter when submit them to views + // It's set to RenderPipeline's draw filter mask if the DynamicDrawContext was created for a render pipeline. + RHI::DrawFilterMask m_drawFilter = RHI::DrawFilterMaskDefaultValue; + // Cached draw data AZStd::vector<RHI::StreamBufferView> m_cachedStreamBufferViews; AZStd::vector<RHI::IndexBufferView> m_cachedIndexBufferViews; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h index cd7f9d1bb6..50b13277af 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h @@ -56,9 +56,11 @@ namespace AZ //! Draw calls which are made to this DynamicDrawContext will only be submitted for this scene. //! The created DynamicDrawContext is managed by dynamic draw system. virtual RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(Scene* scene) = 0; - - //! Create a DynamicDrawContext for specified pass - virtual RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(Pass* pass = nullptr) = 0; + + //! Create a DynamicDrawContext for specified render pipeline + //! Draw calls submitted through the context created by this function are only submitted + //! to the supplied render pipeline (viewport) + virtual RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(RenderPipeline* pipeline) = 0; //! Get a DynamicBuffer from DynamicDrawSystem. //! The returned buffer will be invalidated every time the RPISystem's RenderTick is called diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h index 07cbed7e72..21c0078374 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h @@ -36,7 +36,7 @@ namespace AZ // DynamicDrawInterface overrides... RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(Scene* scene) override; - RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(Pass* pass) override; + RHI::Ptr<DynamicDrawContext> CreateDynamicDrawContext(RenderPipeline* pipeline) override; RHI::Ptr<DynamicBuffer> GetDynamicBuffer(uint32_t size, uint32_t alignment = 1) override; void DrawGeometry(Data::Instance<Material> material, const GeometryData& geometry, ScenePtr scene) override; void AddDrawPacket(Scene* scene, AZStd::unique_ptr<const RHI::DrawPacket> drawPacket) override; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/DefaultStreamingImageController.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/DefaultStreamingImageController.h index e0b233ee26..2dcaf5a2a6 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/DefaultStreamingImageController.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/DefaultStreamingImageController.h @@ -47,4 +47,4 @@ namespace AZ AZStd::vector<StreamingImageContextPtr> m_recentlyAttachedContexts; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/StreamingImageContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/StreamingImageContext.h index e7515fa539..de84ee918c 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/StreamingImageContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Image/StreamingImageContext.h @@ -76,4 +76,4 @@ namespace AZ using StreamingImageContextPtr = AZStd::intrusive_ptr<StreamingImageContext>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/MaterialSystem.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/MaterialSystem.h index bf7beebf2d..e61973c8a8 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/MaterialSystem.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/MaterialSystem.h @@ -31,4 +31,4 @@ namespace AZ }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/Model.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/Model.h index 48c33fb0d6..35af200759 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/Model.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/Model.h @@ -73,12 +73,14 @@ namespace AZ //! [GFX TODO][ATOM-4343 Bake mesh spatial during AP processing] //! //! @param modelTransform a transform that puts the model into the ray's coordinate space + //! @param nonUniformScale Non-uniform scale applied in the model's local frame. //! @param rayStart position where the ray starts //! @param dir direction where the ray ends (does not have to be unit length) //! @param distanceFactor if an intersection is detected, this will be set such that distanceFactor * dir.length == distance to intersection //! @param normal if an intersection is detected, this will be set to the normal at the point of intersection //! @return true if the ray intersects the mesh - bool RayIntersection(const AZ::Transform& modelTransform, const AZ::Vector3& rayStart, const AZ::Vector3& dir, float& distanceFactor, AZ::Vector3& normal) const; + bool RayIntersection(const AZ::Transform& modelTransform, const AZ::Vector3& nonUniformScale, const AZ::Vector3& rayStart, + const AZ::Vector3& dir, float& distanceFactor, AZ::Vector3& normal) const; //! Get available UV names from the model and its lods. const AZStd::unordered_set<AZ::Name>& GetUvNames() const; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/ModelSystem.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/ModelSystem.h index 4c46edac18..d5508d44d1 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/ModelSystem.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Model/ModelSystem.h @@ -30,4 +30,4 @@ namespace AZ void Shutdown(); }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassDefines.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassDefines.h index e4ebcd5100..d536104768 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassDefines.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassDefines.h @@ -20,4 +20,4 @@ // Enables debugging of the pass system // Set this to 1 locally on your machine to facilitate pass debugging and get extra information // about passes in the output window. DO NOT SUBMIT with value set to 1 -#define AZ_RPI_ENABLE_PASS_DEBUGGING 0 \ No newline at end of file +#define AZ_RPI_ENABLE_PASS_DEBUGGING 0 diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/DownsampleMipChainPass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/DownsampleMipChainPass.h index aa5ff3b2a7..71c1fe4c49 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/DownsampleMipChainPass.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Specific/DownsampleMipChainPass.h @@ -77,4 +77,4 @@ namespace AZ bool m_needToUpdateChildren = true; }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h index b81aa84c20..5595c1d2ac 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h @@ -184,6 +184,12 @@ namespace AZ //! Get current render mode RenderMode GetRenderMode() const; + //! Get draw filter tag + RHI::DrawFilterTag GetDrawFilterTag() const; + + //! Get draw filter mask + RHI::DrawFilterMask GetDrawFilterMask() const; + private: RenderPipeline() = default; @@ -211,6 +217,8 @@ namespace AZ // if the view already exists in map, its DrawListMask will be combined to the existing one's void CollectPersistentViews(AZStd::map<ViewPtr, RHI::DrawListMask>& outViewMasks) const; + void SetDrawFilterTag(RHI::DrawFilterTag); + // End of functions accessed by Scene class ////////////////////////////////////////////////// @@ -250,6 +258,13 @@ namespace AZ // Original settings from RenderPipelineDescriptor, used to revert active render settings to original settings from RenderPipelineDescriptor PipelineRenderSettings m_originalRenderSettings; + + // A tag to filter draw items submitted by passes of this render pipeline. + // This tag is allocated when it's added to a scene. It's set to invalid when it's removed to the scene. + RHI::DrawFilterTag m_drawFilterTag; + // A mask to filter draw items submitted by passes of this render pipeline. + // This mask is created from the value of m_drawFilterTag. + RHI::DrawFilterMask m_drawFilterMask = 0; }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h index aac6f4fb97..3238785d81 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h @@ -14,6 +14,7 @@ #include <Atom/RHI/DrawList.h> #include <Atom/RHI/PipelineStateDescriptor.h> +#include <Atom/RHI/DrawFilterTagRegistry.h> #include <Atom/RHI.Reflect/FrameSchedulerEnums.h> #include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h> #include <Atom/RPI.Reflect/System/SceneDescriptor.h> @@ -234,6 +235,9 @@ namespace AZ // reference of dynamic draw system (from RPISystem) DynamicDrawSystem* m_dynamicDrawSystem = nullptr; + + // Registry which allocates draw filter tag for RenderPipeline + RHI::Ptr<RHI::DrawFilterTagRegistry> m_drawFilterTagRegistry; }; // --- Template functions --- diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index ba652a2b94..d6146d3760 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -75,7 +75,7 @@ namespace AZ void AddDrawPacket(const RHI::DrawPacket* drawPacket, Vector3 worldPosition); //! Add a draw item to this view with its associated draw list tag - void AddDrawItem(RHI::DrawListTag drawListTag, const RHI::DrawItemKeyPair& drawItemKeyPair); + void AddDrawItem(RHI::DrawListTag drawListTag, const RHI::DrawItemProperties& drawItemProperties); //! Sets the worldToView matrix and recalculates the other matrices. void SetWorldToViewMatrix(const AZ::Matrix4x4& worldToView); @@ -118,6 +118,12 @@ namespace AZ //! Update View's SRG values and compile. This should only be called once per frame before execute command lists. void UpdateSrg(); + using MatrixChangedEvent = AZ::Event<const AZ::Matrix4x4&>; + //! Notifies consumers when the world to view matrix has changed. + void ConnectWorldToViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler); + //! Notifies consumers when the world to clip matrix has changed. + void ConnectWorldToClipMatrixChangedHandler(MatrixChangedEvent::Handler& handler); + private: View() = delete; View(const AZ::Name& name, UsageFlags usage); @@ -182,6 +188,9 @@ namespace AZ // view class doesn't contain subroutines called at the end of each frame bool m_worldToClipMatrixChanged = true; bool m_worldToClipPrevMatrixNeedsUpdate = false; + + MatrixChangedEvent m_onWorldToClipMatrixChange; + MatrixChangedEvent m_onWorldToViewMatrixChange; }; AZ_DEFINE_ENUM_BITWISE_OPERATORS(View::UsageFlags); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewProviderBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewProviderBus.h index 45ee734865..a04931b03f 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewProviderBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewProviderBus.h @@ -38,4 +38,4 @@ namespace AZ using ViewProviderBus = AZ::EBus<ViewProvider>; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h index 24922fbe98..4f24a20f35 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h @@ -77,6 +77,8 @@ namespace AZ void OnRenderPipelineAdded(RenderPipelinePtr pipeline) override; //! Ensures our default view remains set when our scene's render pipelines are modified. void OnRenderPipelineRemoved(RenderPipeline* pipeline) override; + //! OnBeginPrepareRender is forwarded to our RenderTick notification to allow subscribers to do rendering. + void OnBeginPrepareRender() override; //WindowNotificationBus interface //! Used to fire a notification when our window resizes @@ -123,7 +125,9 @@ namespace AZ AzFramework::WindowSize m_viewportSize; SizeChangedEvent m_sizeChangedEvent; MatrixChangedEvent m_viewMatrixChangedEvent; + MatrixChangedEvent::Handler m_onViewMatrixChangedHandler; MatrixChangedEvent m_projectionMatrixChangedEvent; + MatrixChangedEvent::Handler m_onProjectionMatrixChangedHandler; SceneChangedEvent m_sceneChangedEvent; ViewportContextManager* m_manager; RenderPipelinePtr m_currentPipeline; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Asset/AssetReference.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Asset/AssetReference.h index 190bce8464..90f4ce08a0 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Asset/AssetReference.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Asset/AssetReference.h @@ -41,4 +41,4 @@ namespace AZ }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetCreator.h index 81370b4e15..a79c691ed0 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetCreator.h @@ -61,8 +61,15 @@ namespace AZ //! Otherwise false is returned and result is left untouched. bool End(Data::Asset<BufferAsset>& result); - private: + //! Clone the given source buffer asset. + //! @param sourceAsset The source buffer asset to clone. + //! @param clonedResult The resulting, cloned buffer asset. + //! @param inOutLastCreatedAssetId The asset id from the model lod asset that owns the cloned buffer asset. The sub id will be increased and + //! used as the asset id for the cloned asset. + //! @result True in case the asset got cloned successfully, false in case an error happened and the clone process got cancelled. + static bool Clone(const Data::Asset<BufferAsset>& sourceAsset, Data::Asset<BufferAsset>& clonedResult, Data::AssetId& inOutLastCreatedAssetId); + private: bool ValidateBuffer(); }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetView.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetView.h index 84b1c7df1a..ebc4026c33 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetView.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Buffer/BufferAssetView.h @@ -41,4 +41,4 @@ namespace AZ Data::Asset<BufferAsset> m_bufferAsset; }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/FeatureProcessorDescriptor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/FeatureProcessorDescriptor.h index 9f486cf512..65b06b4afb 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/FeatureProcessorDescriptor.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/FeatureProcessorDescriptor.h @@ -29,4 +29,4 @@ namespace AZ uint32_t m_maxRenderGraphLatency = 1; }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/DefaultStreamingImageControllerAsset.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/DefaultStreamingImageControllerAsset.h index a10277aff8..e2109f5dbc 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/DefaultStreamingImageControllerAsset.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/DefaultStreamingImageControllerAsset.h @@ -32,4 +32,4 @@ namespace AZ DefaultStreamingImageControllerAsset(); }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageAsset.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageAsset.h index 172d6da84a..17bc3515ee 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageAsset.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageAsset.h @@ -55,4 +55,4 @@ namespace AZ RHI::ImageViewDescriptor m_imageViewDescriptor; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageMipChainAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageMipChainAssetCreator.h index 94fd927eb1..4a4898a6ca 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageMipChainAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/ImageMipChainAssetCreator.h @@ -62,4 +62,4 @@ namespace AZ uint16_t m_subImageOffset = 0; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/StreamingImageControllerAsset.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/StreamingImageControllerAsset.h index faba1a0e09..a2653f96b0 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/StreamingImageControllerAsset.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Image/StreamingImageControllerAsset.h @@ -40,4 +40,4 @@ namespace AZ virtual ~StreamingImageControllerAsset() = default; }; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyValue.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyValue.h index cafd31d8a5..758afb1c66 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyValue.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialPropertyValue.h @@ -65,6 +65,7 @@ namespace AZ MaterialPropertyValue(const Vector4& value) : m_value(value) {} MaterialPropertyValue(const Color& value) : m_value(value) {} MaterialPropertyValue(const Data::Asset<ImageAsset>& value) : m_value(value) {} + MaterialPropertyValue(const Data::Instance<Image>& value) : m_value(value) {} MaterialPropertyValue(const AZStd::string& value) : m_value(value) {} //! Copy constructor diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelAssetCreator.h index 73f74c1648..b3b2fd4774 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelAssetCreator.h @@ -41,6 +41,13 @@ namespace AZ //! Otherwise false is returned and result is left untouched. bool End(Data::Asset<ModelAsset>& result); + //! Clone the given source model asset. + //! @param sourceAsset The source model asset to clone. + //! @param clonedResult The resulting, cloned model lod asset. + //! @param cloneAssetId The asset id to assign to the cloned model asset + //! @result True in case the asset got cloned successfully, false in case an error happened and the clone process got cancelled. + static bool Clone(const Data::Asset<ModelAsset>& sourceAsset, Data::Asset<ModelAsset>& clonedResult, const Data::AssetId& cloneAssetId); + private: AZ::Aabb m_modelAabb; }; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodAssetCreator.h index 50e4f769f2..471607bb34 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodAssetCreator.h @@ -75,6 +75,14 @@ namespace AZ //! Finalizes the ModelLodAsset and assigns ownership of the asset to result if successful, otherwise returns false and result is left untouched. bool End(Data::Asset<ModelLodAsset>& result); + //! Clone the given source model lod asset. + //! @param sourceAsset The source model lod asset to clone. + //! @param clonedResult The resulting, cloned model lod asset. + //! @param inOutLastCreatedAssetId The asset id from the model asset that owns the cloned model lod asset. The sub id will be increased and + //! used as the asset id for the cloned asset. + //! @result True in case the asset got cloned successfully, false in case an error happened and the clone process got cancelled. + static bool Clone(const Data::Asset<ModelLodAsset>& sourceAsset, Data::Asset<ModelLodAsset>& clonedResult, Data::AssetId& inOutLastCreatedAssetId); + private: bool m_meshBegan = false; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodIndex.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodIndex.h index 96c9125a27..37aa1b4f38 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodIndex.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Model/ModelLodIndex.h @@ -18,4 +18,4 @@ namespace AZ { using ModelLodIndex = RHI::Handle<uint32_t>; } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAsset.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAsset.h index 2cd6df7216..33e2d25d07 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAsset.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAsset.h @@ -69,4 +69,4 @@ namespace AZ using ResourcePoolAssetHandler = AssetHandler<ResourcePoolAsset>; } //namespace RPI -} //namespace AZ \ No newline at end of file +} //namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAssetCreator.h index f065bc8e7a..d23bccc50a 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/ResourcePoolAssetCreator.h @@ -48,4 +48,4 @@ namespace AZ bool End(Data::Asset<ResourcePoolAsset>& result); }; } //namespace RPI -} //namespace AZ \ No newline at end of file +} //namespace AZ diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/System/SceneDescriptor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/System/SceneDescriptor.h index ccd69b9e6e..371c8afced 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/System/SceneDescriptor.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/System/SceneDescriptor.h @@ -32,4 +32,4 @@ namespace AZ AZStd::vector<AZStd::string> m_featureProcessorNames; }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/Atom/RPI/Code/Source/Platform/Linux/PAL_linux.cmake index 449efecbb0..e9a14ba928 100644 --- a/Gems/Atom/RPI/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/Atom/RPI/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED FALSE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED FALSE) diff --git a/Gems/Atom/RPI/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/Atom/RPI/Code/Source/Platform/Mac/PAL_mac.cmake index 8c1a08a63a..c060b8bbaa 100644 --- a/Gems/Atom/RPI/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/Atom/RPI/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED TRUE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED TRUE) diff --git a/Gems/Atom/RPI/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/RPI/Code/Source/Platform/Windows/PAL_windows.cmake index 8c1a08a63a..c060b8bbaa 100644 --- a/Gems/Atom/RPI/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/RPI/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED TRUE) \ No newline at end of file +set (PAL_TRAIT_BUILD_ATOM_RPI_ASSETS_SUPPORTED TRUE) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.h b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.h index 6a3c5b6d1a..c5379bf75c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.h +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.h @@ -45,4 +45,4 @@ namespace AZ }; } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp index f16d2c6fc9..ea2bdd0d83 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp @@ -205,7 +205,7 @@ namespace AZ const auto isNonOptimizedMesh = [](const SceneAPI::Containers::SceneGraph& graph, SceneAPI::Containers::SceneGraph::NodeIndex& index) { return SceneAPI::Utilities::SceneGraphSelector::IsMesh(graph, index) && - !AZStd::string_view{graph.GetNodeName(index).GetName(), graph.GetNodeName(index).GetNameLength()}.ends_with("_optimized"); + !AZStd::string_view{graph.GetNodeName(index).GetName(), graph.GetNodeName(index).GetNameLength()}.ends_with(SceneAPI::Utilities::OptimizedMeshSuffix); }; if (lodRule) @@ -310,7 +310,16 @@ namespace AZ // Gather mesh content SourceMeshContent sourceMesh; - sourceMesh.m_name = meshName; + + // Although the nodes used to gather mesh content are the optimized ones (when found), to make + // this process transparent for the end-asset generated, the name assigned to the source mesh + // content will not include the "_optimized" prefix. + AZStd::string_view sourceMeshName = meshName; + if (sourceMeshName.ends_with(SceneAPI::Utilities::OptimizedMeshSuffix)) + { + sourceMeshName.remove_suffix(SceneAPI::Utilities::OptimizedMeshSuffix.size()); + } + sourceMesh.m_name = sourceMeshName; const auto node = sceneGraph.Find(meshPath); sourceMesh.m_worldTransform = AZ::SceneAPI::Utilities::DetermineWorldTransform(scene, node, context.m_group.GetRuleContainerConst()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/ConvertibleSource.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/ConvertibleSource.cpp index d0106cbe00..9bf89651da 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/ConvertibleSource.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/ConvertibleSource.cpp @@ -32,4 +32,4 @@ namespace AZ return false; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Source/RPI.Private/Module.cpp b/Gems/Atom/RPI/Code/Source/RPI.Private/Module.cpp index 871b7af686..a945beedbf 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Private/Module.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Private/Module.cpp @@ -35,4 +35,4 @@ AZ::ComponentTypeList AZ::RPI::Module::GetRequiredSystemComponents() const // The first parameter should be GemName_GemIdLower // The second should be the fully qualified name of the class above AZ_DECLARE_MODULE_CLASS(Gem_Atom_RPI_Private, AZ::RPI::Module); -#endif // RPI_EDITOR \ No newline at end of file +#endif // RPI_EDITOR diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp index afcf4670f3..470b66c28e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Buffer/Buffer.cpp @@ -205,7 +205,8 @@ namespace AZ void Buffer::InitBufferView() { // Skip buffer view creation for input assembly buffers - if(RHI::CheckBitsAny(m_rhiBuffer->GetDescriptor().m_bindFlags, RHI::BufferBindFlags::InputAssembly | RHI::BufferBindFlags::DynamicInputAssembly)) + if (m_rhiBuffer->GetDescriptor().m_bindFlags == RHI::BufferBindFlags::InputAssembly || + m_rhiBuffer->GetDescriptor().m_bindFlags == RHI::BufferBindFlags::DynamicInputAssembly) { return; } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp index 5117c3d9dd..65b698f9ac 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawContext.cpp @@ -17,6 +17,7 @@ #include <Atom/RPI.Public/DynamicDraw/DynamicBuffer.h> #include <Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h> #include <Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h> +#include <Atom/RPI.Public/RenderPipeline.h> #include <Atom/RPI.Public/View.h> @@ -601,10 +602,11 @@ namespace AZ drawItemInfo.m_drawItem.m_streamBufferViews = &m_cachedStreamBufferViews[drawItemInfo.m_vertexBufferViewIndex]; } - RHI::DrawItemKeyPair drawItemKeyPair; - drawItemKeyPair.m_sortKey = sortKey; - drawItemKeyPair.m_item = &drawItemInfo.m_drawItem; - view->AddDrawItem(m_drawListTag, drawItemKeyPair); + RHI::DrawItemProperties drawItemProperties; + drawItemProperties.m_sortKey = sortKey; + drawItemProperties.m_item = &drawItemInfo.m_drawItem; + drawItemProperties.m_drawFilterMask = m_drawFilter; + view->AddDrawItem(m_drawListTag, drawItemProperties); sortKey++; } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp index d7c459cbde..35b5fb205c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp @@ -59,6 +59,11 @@ namespace AZ RHI::Ptr<DynamicDrawContext> DynamicDrawSystem::CreateDynamicDrawContext(Scene* scene) { + if (!scene) + { + AZ_Error("RPI", false, "Failed to create a DynamicDrawContext: the input scene is invalid"); + return nullptr; + } RHI::Ptr<DynamicDrawContext> drawContext = aznew DynamicDrawContext(); drawContext->m_scene = scene; @@ -67,11 +72,17 @@ namespace AZ return drawContext; } - // [GFX TODO][ATOM-13185] Add support for creating DynamicDrawContext for Pass - RHI::Ptr<DynamicDrawContext> DynamicDrawSystem::CreateDynamicDrawContext([[maybe_unused]] Pass* pass) + RHI::Ptr<DynamicDrawContext> DynamicDrawSystem::CreateDynamicDrawContext(RenderPipeline* pipeline) { - AZ_Error("RPI", false, "Unimplemented function"); - return nullptr; + if (!pipeline || !pipeline->GetScene()) + { + AZ_Error("RPI", false, "Failed to create a DynamicDrawContext: the input RenderPipeline is invalid or wasn't added to a Scene"); + return nullptr; + } + + auto context = CreateDynamicDrawContext(pipeline->GetScene()); + context->m_drawFilter = pipeline->GetDrawFilterMask(); + return context; } // [GFX TODO][ATOM-13184] Add support of draw geometry with material for DynamicDrawSystemInterface diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageContext.cpp index ffdb16ebf4..bdb2852819 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageContext.cpp @@ -31,4 +31,4 @@ namespace AZ return m_lastAccessTimestamp; } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Model/Model.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Model/Model.cpp index 8b49448fb1..15c8aaf528 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Model/Model.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Model/Model.cpp @@ -164,18 +164,22 @@ namespace AZ return false; } - bool Model::RayIntersection(const AZ::Transform& modelTransform, const AZ::Vector3& rayStart, const AZ::Vector3& dir, float& distanceFactor, AZ::Vector3& normal) const + bool Model::RayIntersection(const AZ::Transform& modelTransform, const AZ::Vector3& nonUniformScale, const AZ::Vector3& rayStart, const AZ::Vector3& dir, float& distanceFactor, AZ::Vector3& normal) const { AZ_PROFILE_FUNCTION(Debug::ProfileCategory::AzRender); + const AZ::Vector3 clampedScale = nonUniformScale.GetMax(AZ::Vector3(AZ::MinTransformScale)); + const AZ::Transform inverseTM = modelTransform.GetInverse(); - const AZ::Vector3 raySrcLocal = inverseTM.TransformPoint(rayStart); + const AZ::Vector3 raySrcLocal = inverseTM.TransformPoint(rayStart) / clampedScale; // Instead of just rotating 'dir' we need it to be scaled too, so that 'distanceFactor' will be in the target units rather than object local units. const AZ::Vector3 rayDest = rayStart + dir; - const AZ::Vector3 rayDestLocal = inverseTM.TransformPoint(rayDest); + const AZ::Vector3 rayDestLocal = inverseTM.TransformPoint(rayDest) / clampedScale; const AZ::Vector3 rayDirLocal = rayDestLocal - raySrcLocal; - return LocalRayIntersection(raySrcLocal, rayDirLocal, distanceFactor, normal); + bool result = LocalRayIntersection(raySrcLocal, rayDirLocal, distanceFactor, normal); + normal = (normal * clampedScale).GetNormalized(); + return result; } const AZStd::unordered_set<AZ::Name>& Model::GetUvNames() const diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp index 84d1499602..baf1d22da5 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp @@ -195,9 +195,12 @@ namespace AZ SetSrgsForDraw(commandList); } - for (const RHI::DrawItemKeyPair& drawItemKeyPair : drawListViewPartition) + for (const RHI::DrawItemProperties& drawItemProperties : drawListViewPartition) { - commandList->Submit(*drawItemKeyPair.m_item); + if (drawItemProperties.m_drawFilterMask & m_pipeline->GetDrawFilterMask()) + { + commandList->Submit(*drawItemProperties.m_item); + } } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp index 20b6674fb9..cc0cefd082 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp @@ -300,6 +300,9 @@ namespace AZ m_scene = nullptr; m_rootPass->SetEnabled(false); m_rootPass->QueueForRemoval(); + + m_drawFilterTag.Reset(); + m_drawFilterMask = 0; } void RenderPipeline::OnPassModified() @@ -506,5 +509,28 @@ namespace AZ { return m_renderMode != RenderMode::NoRender; } + + RHI::DrawFilterTag RenderPipeline::GetDrawFilterTag() const + { + return m_drawFilterTag; + } + + RHI::DrawFilterMask RenderPipeline::GetDrawFilterMask() const + { + return m_drawFilterMask; + } + + void RenderPipeline::SetDrawFilterTag(RHI::DrawFilterTag tag) + { + m_drawFilterTag = tag; + if (m_drawFilterTag.IsValid()) + { + m_drawFilterMask = 1 << tag.GetIndex(); + } + else + { + m_drawFilterMask = 0; + } + } } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp index 00054881a1..2c11ef9a41 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp @@ -87,6 +87,7 @@ namespace AZ m_id = Uuid::CreateRandom(); m_cullingScene = aznew CullingScene(); SceneRequestBus::Handler::BusConnect(m_id); + m_drawFilterTagRegistry = RHI::DrawFilterTagRegistry::Create(); } Scene::~Scene() @@ -269,6 +270,8 @@ namespace AZ return; } + pipeline->SetDrawFilterTag(m_drawFilterTagRegistry->AcquireTag(pipelineId)); + m_pipelines.push_back(pipeline); // Set this pipeline as default if the default pipeline was empty. This pipeline should be the first pipeline be added to the scene @@ -303,6 +306,8 @@ namespace AZ m_defaultPipeline = nullptr; } + m_drawFilterTagRegistry->ReleaseTag(pipelineToRemove->GetDrawFilterTag()); + pipelineToRemove->OnRemovedFromScene(this); m_pipelines.erase(it); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 4fe9843534..e3f41cbda9 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -90,9 +90,9 @@ namespace AZ AddDrawPacket(drawPacket, depth); } - void View::AddDrawItem(RHI::DrawListTag drawListTag, const RHI::DrawItemKeyPair& drawItemKeyPair) + void View::AddDrawItem(RHI::DrawListTag drawListTag, const RHI::DrawItemProperties& drawItemProperties) { - m_drawListContext.AddDrawItem(drawListTag, drawItemKeyPair); + m_drawListContext.AddDrawItem(drawListTag, drawItemProperties); } void View::SetWorldToViewMatrix(const AZ::Matrix4x4& worldToView) @@ -104,6 +104,9 @@ namespace AZ m_worldToClipMatrix = m_viewToClipMatrix * m_worldToViewMatrix; m_worldToClipMatrixChanged = true; + m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -132,6 +135,9 @@ namespace AZ m_clipToWorldMatrix = m_viewToWorldMatrix * m_clipToViewMatrix; m_worldToClipMatrixChanged = true; + m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -166,6 +172,8 @@ namespace AZ m_unprojectionConstants.SetZ(float(-tanHalfFovX)); m_unprojectionConstants.SetW(float(tanHalfFovY)); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -225,6 +233,16 @@ namespace AZ passWithDrawListTag->SortDrawList(drawList); } + void View::ConnectWorldToViewMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) + { + handler.Connect(m_onWorldToViewMatrixChange); + } + + void View::ConnectWorldToClipMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) + { + handler.Connect(m_onWorldToClipMatrixChange); + } + // [GFX TODO] This function needs unit tests and might need to be reworked RHI::DrawItemSortKey View::GetSortKeyForPosition(const Vector3& positionInWorld) const { diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp index b67ead9896..e1e87086e7 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp @@ -21,7 +21,7 @@ namespace AZ namespace RPI { ViewportContext::ViewportContext(ViewportContextManager* manager, AzFramework::ViewportId id, const AZ::Name& name, RHI::Device& device, AzFramework::NativeWindowHandle nativeWindow, ScenePtr renderScene) - : m_rootScene(renderScene) + : m_rootScene(nullptr) , m_id(id) , m_windowContext(AZStd::make_shared<WindowContext>()) , m_manager(manager) @@ -33,6 +33,17 @@ namespace AZ nativeWindow, &AzFramework::WindowRequestBus::Events::GetClientAreaSize); AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow); + + m_onProjectionMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix) + { + m_projectionMatrixChangedEvent.Signal(matrix); + }); + m_onViewMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix) + { + m_projectionMatrixChangedEvent.Signal(matrix); + }); + + SetRenderScene(renderScene); } ViewportContext::~ViewportContext() @@ -104,12 +115,16 @@ namespace AZ // add the current pipeline to next render tick if it's not already added. if (m_currentPipeline && m_currentPipeline->GetRenderMode() != RenderPipeline::RenderMode::RenderOnce) { - ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick); - ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick); m_currentPipeline->AddToRenderTickOnce(); } } + void ViewportContext::OnBeginPrepareRender() + { + ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick); + ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick); + } + AZ::Name ViewportContext::GetName() const { return m_name; @@ -169,7 +184,6 @@ namespace AZ void ViewportContext::SetCameraProjectionMatrix(const AZ::Matrix4x4& matrix) { GetDefaultView()->SetViewToClipMatrix(matrix); - m_projectionMatrixChangedEvent.Signal(matrix); } AZ::Transform ViewportContext::GetCameraTransform() const @@ -186,18 +200,23 @@ namespace AZ { const auto view = GetDefaultView(); view->SetCameraTransform(AZ::Matrix3x4::CreateFromTransform(transform.GetOrthogonalized())); - m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix()); } void ViewportContext::SetDefaultView(ViewPtr view) { if (m_defaultView != view) { + m_onProjectionMatrixChangedHandler.Disconnect(); + m_onViewMatrixChangedHandler.Disconnect(); + m_defaultView = view; UpdatePipelineView(); m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix()); m_projectionMatrixChangedEvent.Signal(view->GetViewToClipMatrix()); + + view->ConnectWorldToViewMatrixChangedHandler(m_onViewMatrixChangedHandler); + view->ConnectWorldToClipMatrixChangedHandler(m_onProjectionMatrixChangedHandler); } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp index 8d578352d8..2b525df4d4 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContextManager.cpp @@ -57,9 +57,14 @@ namespace AZ return; } viewportData.context = viewportContext; - auto onSizeChanged = [contextName, viewportId](AzFramework::WindowSize size) + auto onSizeChanged = [this, viewportId](AzFramework::WindowSize size) { - ViewportContextNotificationBus::Event(contextName, &ViewportContextNotificationBus::Events::OnViewportSizeChanged, size); + // Ensure we emit OnViewportSizeChanged with the correct name. + auto viewportContext = this->GetViewportContextById(viewportId); + if (viewportContext) + { + ViewportContextNotificationBus::Event(viewportContext->GetName(), &ViewportContextNotificationBus::Events::OnViewportSizeChanged, size); + } ViewportContextIdNotificationBus::Event(viewportId, &ViewportContextIdNotificationBus::Events::OnViewportSizeChanged, size); }; viewportContext->m_name = contextName; @@ -174,6 +179,8 @@ namespace AZ GetOrCreateViewStackForContext(newContextName); viewportContext->m_name = newContextName; UpdateViewForContext(newContextName); + // Ensure anyone listening on per-name viewport size updates gets notified. + ViewportContextNotificationBus::Event(newContextName, &ViewportContextNotificationBus::Events::OnViewportSizeChanged, viewportContext->GetViewportSize()); } void ViewportContextManager::EnumerateViewportContexts(AZStd::function<void(ViewportContextPtr)> visitorFunction) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Asset/AssetReference.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Asset/AssetReference.cpp index 9b6c28a935..590baa6775 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Asset/AssetReference.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Asset/AssetReference.cpp @@ -31,4 +31,4 @@ namespace AZ } } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetCreator.cpp index 78fc47891b..486be9860e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetCreator.cpp @@ -155,5 +155,21 @@ namespace AZ m_asset.SetHint(name); } + bool BufferAssetCreator::Clone(const Data::Asset<BufferAsset>& sourceAsset, Data::Asset<BufferAsset>& clonedResult, Data::AssetId& inOutLastCreatedAssetId) + { + BufferAssetCreator creator; + inOutLastCreatedAssetId.m_subId = inOutLastCreatedAssetId.m_subId + 1; + creator.Begin(inOutLastCreatedAssetId); + + creator.SetBufferName(sourceAsset.GetHint()); + creator.SetUseCommonPool(sourceAsset->GetCommonPoolType()); + creator.SetPoolAsset(sourceAsset->GetPoolAsset()); + creator.SetBufferViewDescriptor(sourceAsset->GetBufferViewDescriptor()); + + const AZStd::array_view<uint8_t> sourceBuffer = sourceAsset->GetBuffer(); + creator.SetBuffer(sourceBuffer.data(), sourceBuffer.size(), sourceAsset->GetBufferDescriptor()); + + return creator.End(clonedResult); + } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetView.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetView.cpp index 4d0f0fa6c6..41a2b8cad3 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetView.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Buffer/BufferAssetView.cpp @@ -45,4 +45,4 @@ namespace AZ return m_bufferViewDescriptor; } } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/ImageMipChainAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/ImageMipChainAssetCreator.cpp index 394c4b0b09..7700d64f8f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/ImageMipChainAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/ImageMipChainAssetCreator.cpp @@ -157,4 +157,4 @@ namespace AZ return EndCommon(result); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/StreamingImageControllerAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/StreamingImageControllerAsset.cpp index 1bc810fd94..5596d46b95 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/StreamingImageControllerAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Image/StreamingImageControllerAsset.cpp @@ -26,4 +26,4 @@ namespace AZ } } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp index b3f4fc30a4..65fb08b52b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp @@ -11,6 +11,7 @@ */ #include <Atom/RPI.Reflect/Model/ModelAssetCreator.h> +#include <Atom/RPI.Reflect/Model/ModelLodAssetCreator.h> #include <AzCore/Asset/AssetManager.h> @@ -64,5 +65,37 @@ namespace AZ m_asset->SetReady(); return EndCommon(result); } + + bool ModelAssetCreator::Clone(const Data::Asset<ModelAsset>& sourceAsset, Data::Asset<ModelAsset>& clonedResult, const Data::AssetId& cloneAssetId) + { + if (!sourceAsset.IsReady()) + { + return false; + } + + ModelAssetCreator creator; + creator.Begin(cloneAssetId); + creator.SetName(sourceAsset->GetName().GetStringView()); + + AZ::Data::AssetId lastUsedId = cloneAssetId; + const AZStd::array_view<Data::Asset<ModelLodAsset>> sourceLodAssets = sourceAsset->GetLodAssets(); + for (const Data::Asset<ModelLodAsset>& sourceLodAsset : sourceLodAssets) + { + Data::Asset<ModelLodAsset> lodAsset; + if (!ModelLodAssetCreator::Clone(sourceLodAsset, lodAsset, lastUsedId)) + { + AZ_Error("ModelAssetCreator", false, + "Cannot clone model lod asset for '%s'.", sourceLodAsset.GetHint().c_str()); + return false; + } + + if (lodAsset.IsReady()) + { + creator.AddLodAsset(AZStd::move(lodAsset)); + } + } + + return creator.End(clonedResult); + } } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelLodAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelLodAssetCreator.cpp index 8a0db38ee6..db2eebf84d 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelLodAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelLodAssetCreator.cpp @@ -10,6 +10,8 @@ * */ +#include <AzCore/std/containers/set.h> +#include <Atom/RPI.Reflect/Buffer/BufferAssetCreator.h> #include <Atom/RPI.Reflect/Model/ModelLodAssetCreator.h> #include <AzCore/Asset/AssetManager.h> @@ -240,5 +242,88 @@ namespace AZ return true; } + + bool ModelLodAssetCreator::Clone(const Data::Asset<ModelLodAsset>& sourceAsset, Data::Asset<ModelLodAsset>& clonedResult, Data::AssetId& inOutLastCreatedAssetId) + { + AZStd::array_view<ModelLodAsset::Mesh> sourceMeshes = sourceAsset->GetMeshes(); + if (sourceMeshes.empty()) + { + return true; + } + + ModelLodAssetCreator creator; + inOutLastCreatedAssetId.m_subId = inOutLastCreatedAssetId.m_subId + 1; + creator.Begin(inOutLastCreatedAssetId); + + // Add the index buffer + const Data::Asset<BufferAsset> sourceIndexBufferAsset = sourceMeshes[0].GetIndexBufferAssetView().GetBufferAsset(); + Data::Asset<BufferAsset> clonedIndexBufferAsset; + BufferAssetCreator::Clone(sourceIndexBufferAsset, clonedIndexBufferAsset, inOutLastCreatedAssetId); + creator.SetLodIndexBuffer(clonedIndexBufferAsset); + + // Add meshes + AZStd::unordered_map<AZ::Data::AssetId, Data::Asset<BufferAsset>> oldToNewBufferAssets; + for (const ModelLodAsset::Mesh& sourceMesh : sourceMeshes) + { + // Add stream buffers + for (const AZ::RPI::ModelLodAsset::Mesh::StreamBufferInfo& streamBufferInfo : sourceMesh.GetStreamBufferInfoList()) + { + const Data::Asset<BufferAsset>& sourceStreamBuffer = streamBufferInfo.m_bufferAssetView.GetBufferAsset(); + const AZ::Data::AssetId sourceBufferAssetId = sourceStreamBuffer.GetId(); + + // In case the buffer asset id is not part of our old to new asset id mapping, we did not convert and add it yet. + if (oldToNewBufferAssets.find(sourceBufferAssetId) == oldToNewBufferAssets.end()) + { + Data::Asset<BufferAsset> streamBufferAsset; + if (!BufferAssetCreator::Clone(sourceStreamBuffer, streamBufferAsset, inOutLastCreatedAssetId)) + { + AZ_Error("ModelLodAssetCreator", false, + "Cannot clone buffer asset for '%s'.", sourceBufferAssetId.ToString<AZStd::string>().c_str()); + return false; + } + + oldToNewBufferAssets[sourceBufferAssetId] = streamBufferAsset; + creator.AddLodStreamBuffer(streamBufferAsset); + } + } + + // Add mesh + creator.BeginMesh(); + creator.SetMeshName(sourceMesh.GetName()); + AZ::Aabb aabb = sourceMesh.GetAabb(); + creator.SetMeshAabb(AZStd::move(aabb)); + creator.SetMeshMaterialAsset(sourceMesh.GetMaterialAsset()); + + // Mesh index buffer view + const BufferAssetView& sourceIndexBufferView = sourceMesh.GetIndexBufferAssetView(); + BufferAssetView indexBufferAssetView(clonedIndexBufferAsset, sourceIndexBufferView.GetBufferViewDescriptor()); + creator.SetMeshIndexBuffer(indexBufferAssetView); + + // Mesh stream buffer views + for (const AZ::RPI::ModelLodAsset::Mesh::StreamBufferInfo& streamBufferInfo : sourceMesh.GetStreamBufferInfoList()) + { + // Get the corresponding new buffer asset id from the source buffer. + const AZ::Data::AssetId sourceBufferAssetId = streamBufferInfo.m_bufferAssetView.GetBufferAsset().GetId(); + const auto assetIdIterator = oldToNewBufferAssets.find(sourceBufferAssetId); + if (assetIdIterator != oldToNewBufferAssets.end()) + { + const Data::Asset<BufferAsset>& clonedBufferAsset = assetIdIterator->second; + BufferAssetView bufferAssetView(clonedBufferAsset, streamBufferInfo.m_bufferAssetView.GetBufferViewDescriptor()); + creator.AddMeshStreamBuffer(streamBufferInfo.m_semantic, streamBufferInfo.m_customName, bufferAssetView); + } + else + { + AZ_Error("ModelLodAssetCreator", false, + "Cannot find cloned buffer asset for source buffer asset '%s'.", + sourceBufferAssetId.ToString<AZStd::string>().c_str()); + return false; + } + } + + creator.EndMesh(); + } + + return creator.End(clonedResult); + } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/ResourcePoolAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/ResourcePoolAssetCreator.cpp index a26c71cb38..1bb079f5fe 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/ResourcePoolAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/ResourcePoolAssetCreator.cpp @@ -57,4 +57,4 @@ namespace AZ } } // namespace RPI -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/Atom/RPI/Code/Tests/ShaderResourceGroup/ShaderResourceGroupConstantBufferTests.cpp b/Gems/Atom/RPI/Code/Tests/ShaderResourceGroup/ShaderResourceGroupConstantBufferTests.cpp index 45edb13510..5712ce765c 100644 --- a/Gems/Atom/RPI/Code/Tests/ShaderResourceGroup/ShaderResourceGroupConstantBufferTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/ShaderResourceGroup/ShaderResourceGroupConstantBufferTests.cpp @@ -440,4 +440,4 @@ namespace UnitTest AZ_TEST_STOP_ASSERTTEST(1); } } -} \ No newline at end of file +} diff --git a/Gems/Atom/RPI/Code/Tests/System/FeatureProcessorFactoryTests.cpp b/Gems/Atom/RPI/Code/Tests/System/FeatureProcessorFactoryTests.cpp index 591c409429..a5637a1fc6 100644 --- a/Gems/Atom/RPI/Code/Tests/System/FeatureProcessorFactoryTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/System/FeatureProcessorFactoryTests.cpp @@ -131,4 +131,4 @@ namespace UnitTest } // Get typeid from interface -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset index 3f453d128b..90604dda4b 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/beach_parking.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset index e11c395c73..8ebb58e334 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/greenwich_park.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset index d0c9cabb4b..b53b739c31 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/misty_pines.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/LightingPresets/readme.txt b/Gems/Atom/TestData/TestData/LightingPresets/readme.txt index ca10d2b319..9c8d61ecb0 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/readme.txt +++ b/Gems/Atom/TestData/TestData/LightingPresets/readme.txt @@ -72,4 +72,4 @@ The input cubemap is pre-convolved and passed through untouched, including all m _cm -Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. \ No newline at end of file +Legacy support for the _cm file mask. It is equivalent to the _iblglobalcm file mask described above. diff --git a/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02.lightingpreset.azasset b/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02.lightingpreset.azasset index a676d5fba6..a629fb1416 100644 --- a/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/LightingPresets/urban_street_02.lightingpreset.azasset @@ -50,4 +50,4 @@ ], "shadowCatcherOpacity": 0.25 } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/AutoBrick/Brick.material b/Gems/Atom/TestData/TestData/Materials/AutoBrick/Brick.material index aa98aac1c0..aaa2dc455f 100644 --- a/Gems/Atom/TestData/TestData/Materials/AutoBrick/Brick.material +++ b/Gems/Atom/TestData/TestData/Materials/AutoBrick/Brick.material @@ -27,4 +27,4 @@ "lineDepth": 0.005454500205814838 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/AutoBrick/Tile.material b/Gems/Atom/TestData/TestData/Materials/AutoBrick/Tile.material index b1497f4272..37c17e5616 100644 --- a/Gems/Atom/TestData/TestData/Materials/AutoBrick/Tile.material +++ b/Gems/Atom/TestData/TestData/Materials/AutoBrick/Tile.material @@ -30,4 +30,4 @@ "lineWidth": 0.01030299998819828 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/ParallaxRock.material b/Gems/Atom/TestData/TestData/Materials/ParallaxRock.material index 4c91053515..4c3a925e52 100644 --- a/Gems/Atom/TestData/TestData/Materials/ParallaxRock.material +++ b/Gems/Atom/TestData/TestData/Materials/ParallaxRock.material @@ -4,9 +4,8 @@ "parentMaterial": "Materials/Presets/PBR/default_grid.material", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "TestData/Textures/cc0/Rock030_2K_AmbientOcclusion.jpg" + "occlusion": { + "diffuseTextureMap": "TestData/Textures/cc0/Rock030_2K_AmbientOcclusion.jpg" }, "baseColor": { "textureMap": "TestData/Textures/cc0/Rock030_2K_Color.jpg" @@ -32,4 +31,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material index d4f3321314..f43f6d0808 100644 --- a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material +++ b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/001_lucy_regression_test.material @@ -52,4 +52,4 @@ "useInfluenceMap": false } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material index 4c4e30cb09..c611b992b6 100644 --- a/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material +++ b/Gems/Atom/TestData/TestData/Materials/SkinTestCases/002_wrinkle_regression_test.material @@ -61,4 +61,4 @@ "normalMap2": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_normal.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material index c013eecae5..b2a3eac890 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/001_ManyFeatures.material @@ -4,11 +4,6 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "layer1_ambientOcclusion": { - "enable": true, - "factor": 1.6399999856948853, - "textureMap": "TestData/Textures/cc0/bark1disp2.jpg" - }, "layer1_baseColor": { "color": [ 0.3495536744594574, @@ -16,7 +11,7 @@ 0.12039368599653244, 1.0 ], - "textureMap": "TestData/Textures/cc0/bark1col.jpg" + "textureMap": "TestData/Textures/cc0/bark1_col.jpg" }, "layer1_emissive": { "color": [ @@ -30,16 +25,20 @@ "layer1_normal": { "factor": 0.4444443881511688, "flipY": true, - "textureMap": "TestData/Textures/cc0/bark1norm.jpg" + "textureMap": "TestData/Textures/cc0/bark1_norm.jpg" + }, + "layer1_occlusion": { + "diffuseFactor": 1.6399999856948853, + "diffuseTextureMap": "TestData/Textures/cc0/bark1_disp.jpg" }, "layer1_parallax": { "enable": true, "factor": 0.02500000037252903, - "textureMap": "TestData/Textures/cc0/bark1disp2.jpg" + "textureMap": "TestData/Textures/cc0/bark1_disp.jpg" }, "layer1_roughness": { "lowerBound": 0.010100999847054482, - "textureMap": "TestData/Textures/cc0/bark1roughness.jpg" + "textureMap": "TestData/Textures/cc0/bark1_roughness.jpg" }, "layer1_specularF0": { "factor": 0.5099999904632568, @@ -53,10 +52,6 @@ "offsetU": 0.5, "offsetV": 0.25 }, - "layer2_ambientOcclusion": { - "factor": 1.2200000286102296, - "textureMap": "TestData/Textures/cc0/bark1disp2.jpg" - }, "layer2_baseColor": { "textureMap": "TestData/Textures/cc0/Lava004_1K_Color.jpg" }, @@ -76,6 +71,10 @@ "flipY": true, "textureMap": "TestData/Textures/cc0/Lava004_1K_Normal.jpg" }, + "layer2_occlusion": { + "specularFactor": 2.0, + "specularTextureMap": "TestData/Textures/cc0/Tiles009_1K_Displacement.jpg" + }, "layer2_parallax": { "enable": true, "factor": 0.01600000075995922, @@ -88,11 +87,6 @@ "offsetU": 0.5, "offsetV": 0.25 }, - "layer3_ambientOcclusion": { - "enable": true, - "factor": 1.0399999618530274, - "textureMap": "TestData/Textures/cc0/PaintedMetal003_1K_Displacement.jpg" - }, "layer3_baseColor": { "color": [ 0.6315556764602661, @@ -115,6 +109,10 @@ "layer3_normal": { "textureMap": "TestData/Textures/cc0/PaintedMetal003_1K_Normal.jpg" }, + "layer3_occlusion": { + "diffuseFactor": 1.0399999618530274, + "diffuseTextureMap": "TestData/Textures/cc0/PaintedMetal003_1K_Displacement.jpg" + }, "layer3_parallax": { "enable": true, "factor": 0.004999999888241291, @@ -140,4 +138,4 @@ "rotateDegrees": 39.599998474121097 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material index 471b437bd2..e7903a8c91 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/002_ParallaxPdo.material @@ -5,18 +5,18 @@ "propertyLayoutVersion": 3, "properties": { "layer1_baseColor": { - "textureMap": "TestData/Textures/cc0/bark1col.jpg" + "textureMap": "TestData/Textures/cc0/bark1_col.jpg" }, "layer1_normal": { - "textureMap": "TestData/Textures/cc0/bark1norm.jpg" + "textureMap": "TestData/Textures/cc0/bark1_norm.jpg" }, "layer1_parallax": { "enable": true, "factor": 0.03999999910593033, - "textureMap": "TestData/Textures/cc0/bark1disp2.jpg" + "textureMap": "TestData/Textures/cc0/bark1_disp.jpg" }, "layer1_roughness": { - "textureMap": "TestData/Textures/cc0/bark1roughness.jpg" + "textureMap": "TestData/Textures/cc0/bark1_roughness.jpg" }, "layer2_baseColor": { "textureMap": "TestData/Textures/cc0/Rock030_2K_Color.jpg" @@ -49,4 +49,4 @@ "pdo": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material index 1f6094bbcd..94a1ec6a30 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_BlendMaskValues.material @@ -8,4 +8,4 @@ "debugDrawMode": "BlendMaskValues" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_DepthMaps.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_DepthMaps.material index 2603118742..d41e116067 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_DepthMaps.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/003_Debug_DepthMaps.material @@ -8,4 +8,4 @@ "debugDrawMode": "DepthMaps" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/004_UseVertexColors.material b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/004_UseVertexColors.material index b91a725c57..ea3ffab467 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/004_UseVertexColors.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardMultilayerPbrTestCases/004_UseVertexColors.material @@ -8,4 +8,4 @@ "blendSource": "VertexColors" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/001_DefaultWhite.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/001_DefaultWhite.material index a112cf6734..8fe732cb09 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/001_DefaultWhite.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/001_DefaultWhite.material @@ -3,4 +3,4 @@ "materialType": "Materials\\Types\\StandardPBR.materialtype", "parentMaterial": "", "propertyLayoutVersion": 3 -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLerp.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLerp.material index ed281781d0..8509e08d78 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLerp.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLerp.material @@ -16,4 +16,4 @@ "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_hp_bc.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLinearLight.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLinearLight.material index 532fa30241..bf31a4a111 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLinearLight.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorLinearLight.material @@ -16,4 +16,4 @@ "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_hp_bc.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorMultiply.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorMultiply.material index 47e9df4581..b3b67448ea 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorMultiply.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/002_BaseColorMultiply.material @@ -15,4 +15,4 @@ "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_hp_bc.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalMatte.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalMatte.material index 742e420ae9..12690076c3 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalMatte.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalMatte.material @@ -19,4 +19,4 @@ "factor": 0.33 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalPolished.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalPolished.material index d5a80dfb97..41496bd801 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalPolished.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/003_MetalPolished.material @@ -19,4 +19,4 @@ "factor": 0.1 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/004_MetalMap.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/004_MetalMap.material index bd81d3156b..ebc65557ec 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/004_MetalMap.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/004_MetalMap.material @@ -20,4 +20,4 @@ "factor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/005_RoughnessMap.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/005_RoughnessMap.material index 4a79cf94f9..e770537005 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/005_RoughnessMap.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/005_RoughnessMap.material @@ -22,4 +22,4 @@ "textureMap": "TestData/Textures/checker8x8_gray_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/006_SpecularF0Map.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/006_SpecularF0Map.material index 60c89d8c92..d0e0dccf1e 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/006_SpecularF0Map.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/006_SpecularF0Map.material @@ -19,4 +19,4 @@ "textureMap": "TestData/Textures/checker8x8_gray_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOff.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOff.material index 6e467c36e5..de9886ac46 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOff.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOff.material @@ -23,4 +23,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOn.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOn.material index 41b0236c66..411646effc 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOn.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/007_MultiscatteringCompensationOn.material @@ -23,4 +23,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap.material index c7bcef40dc..c5561823ed 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap.material @@ -18,4 +18,4 @@ "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_normal.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap_Bevels.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap_Bevels.material index 86d91d6b08..b26cb927d0 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap_Bevels.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/008_NormalMap_Bevels.material @@ -9,4 +9,4 @@ "textureMap": "TestData/Objects/cube/cube_norm.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Blended.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Blended.material index d71d2f9c88..98dd6baecd 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Blended.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Blended.material @@ -20,4 +20,4 @@ "textureMap": "TestData/Textures/checker8x8_gray_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_PackedAlpha_DoubleSided.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_PackedAlpha_DoubleSided.material index b736e77b81..5545e5a482 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_PackedAlpha_DoubleSided.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_PackedAlpha_DoubleSided.material @@ -13,4 +13,4 @@ "textureMap": "TestData/Textures/checker8x8_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_DoubleSided.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_DoubleSided.material index 6e7d533f0f..960a8b0700 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_DoubleSided.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_DoubleSided.material @@ -11,4 +11,4 @@ "textureMap": "TestData/Textures/checker8x8_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_SingleSided.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_SingleSided.material index 5a9034ba17..2adc42141c 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_SingleSided.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/009_Opacity_Cutout_SplitAlpha_SingleSided.material @@ -10,4 +10,4 @@ "textureMap": "TestData/Textures/checker8x8_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_AmbientOcclusion.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_AmbientOcclusion.material index 66843b3a2c..28f43a9a57 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_AmbientOcclusion.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_AmbientOcclusion.material @@ -1,15 +1,12 @@ { "description": "", - "materialType": "Materials\\Types\\StandardPBR.materialtype", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "010_OcclusionBase.material", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "factor": 1.25, - "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_ao.png" - }, - "baseColor": { - "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_bc.png" + "occlusion": { + "diffuseFactor": 2.0, + "diffuseTextureMap": "TestData/Textures/cc0/Tiles009_1K_AmbientOcclusion.jpg" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_BothOcclusion.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_BothOcclusion.material new file mode 100644 index 0000000000..cee64dd107 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_BothOcclusion.material @@ -0,0 +1,14 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "010_OcclusionBase.material", + "propertyLayoutVersion": 3, + "properties": { + "occlusion": { + "diffuseFactor": 2.0, + "diffuseTextureMap": "TestData/Textures/cc0/Tiles009_1K_AmbientOcclusion.jpg", + "specularFactor": 2.0, + "specularTextureMap": "TestData/Textures/cc0/Tiles009_1K_Displacement.jpg" + } + } +} \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_OcclusionBase.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_OcclusionBase.material new file mode 100644 index 0000000000..9a41a7d191 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_OcclusionBase.material @@ -0,0 +1,25 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "", + "propertyLayoutVersion": 3, + "properties": { + "baseColor": { + "color": [ + 0.06784161180257797, + 0.2073090672492981, + 0.29570457339286806, + 1.0 + ] + }, + "clearCoat": { + "enable": true + }, + "normal": { + "textureMap": "TestData/Textures/cc0/Tiles009_1K_Normal.jpg" + }, + "roughness": { + "factor": 0.0 + } + } +} \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_SpecularOcclusion.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_SpecularOcclusion.material new file mode 100644 index 0000000000..703088d6f8 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/010_SpecularOcclusion.material @@ -0,0 +1,12 @@ +{ + "description": "", + "materialType": "Materials/Types/StandardPBR.materialtype", + "parentMaterial": "010_OcclusionBase.material", + "propertyLayoutVersion": 3, + "properties": { + "occlusion": { + "specularFactor": 2.0, + "specularTextureMap": "TestData/Textures/cc0/Tiles009_1K_Displacement.jpg" + } + } +} \ No newline at end of file diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/011_Emissive.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/011_Emissive.material index 65e6d5fa64..97d657b82b 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/011_Emissive.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/011_Emissive.material @@ -18,4 +18,4 @@ "textureMap": "TestData/Textures/checker8x8_gray_512.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/012_Parallax_POM.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/012_Parallax_POM.material index 17114f8d09..a94d90d04d 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/012_Parallax_POM.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/012_Parallax_POM.material @@ -14,4 +14,4 @@ "textureMap": "TestData/Textures/TextureHaven/4k_castle_brick_02_red/4k_castle_brick_02_red_disp.png" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_Off.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_Off.material index e88f133bf5..666bf45d57 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_Off.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_Off.material @@ -14,4 +14,4 @@ "factor": 0.13131310045719148 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_On.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_On.material index b01e600899..0581280d67 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_On.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/013_SpecularAA_On.material @@ -17,4 +17,4 @@ "factor": 0.13131310045719148 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat.material index eca366e544..c23f71e7df 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat.material @@ -24,4 +24,4 @@ "factor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap.material index 18a0095a63..caa9f88818 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap.material @@ -28,4 +28,4 @@ "factor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material index 3b5bed1c13..04d2051e8e 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_NormalMap_2ndUv.material @@ -32,4 +32,4 @@ "factor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_RoughnessMap.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_RoughnessMap.material index c2b73efb3b..51915a7bb0 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_RoughnessMap.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/014_ClearCoat_RoughnessMap.material @@ -27,4 +27,4 @@ "factor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering.material index 4be87e1a25..37a9b1144e 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering.material @@ -1,6 +1,6 @@ { "description": "", - "materialType": "Materials/Types/StandardPBR.materialtype", + "materialType": "Materials/Types/EnhancedPBR.materialtype", "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { @@ -9,12 +9,12 @@ "influenceMap": "TestData/Textures/checker8x8_512.png", "scatterColor": [ 1.0, - 0.19937437772750855, - 0.07179369777441025, + 0.20000000298023225, + 0.07058823853731156, 1.0 ], "scatterDistance": 40.0, "subsurfaceScatterFactor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering_Transmission.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering_Transmission.material index 843df87038..dbaf6cb587 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering_Transmission.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/015_SubsurfaceScattering_Transmission.material @@ -1,15 +1,16 @@ { "description": "", - "materialType": "Materials/Types/StandardPBR.materialtype", + "materialType": "Materials/Types/EnhancedPBR.materialtype", "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { "subsurfaceScattering": { "enableSubsurfaceScattering": true, + "enableTransmission": true, "scatterDistance": 64.6464614868164, "subsurfaceScatterFactor": 1.0, "thicknessMap": "TestData/Textures/checker8x8_512.png", "transmissionMode": "ThickObject" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_AmbientOcclusion.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_AmbientOcclusion.material index 9eec81823d..e1260ab4f2 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_AmbientOcclusion.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_AmbientOcclusion.material @@ -4,9 +4,8 @@ "parentMaterial": "TestData\\Materials\\StandardPbrTestCases\\UvTilingBase.material", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "TestData/Objects/cube/cube_diff.tif" + "occlusion": { + "diffuseTextureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_BaseColor.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_BaseColor.material index 6af970333d..5dd3b88e1b 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_BaseColor.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_BaseColor.material @@ -8,4 +8,4 @@ "textureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Emissive.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Emissive.material index dea4d460b5..21f2733d94 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Emissive.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Emissive.material @@ -19,4 +19,4 @@ "useTexture": true } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Metallic.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Metallic.material index 5794de822f..6c5f72faa1 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Metallic.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Metallic.material @@ -12,4 +12,4 @@ "factor": 0.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal.material index 33d13f56b4..d53fbec47e 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal.material @@ -8,4 +8,4 @@ "textureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate20.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate20.material index 3a9186d2f0..d693224e78 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate20.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate20.material @@ -17,4 +17,4 @@ "rotateDegrees": 20.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate90.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate90.material index 095aef14ba..19e3fce5e6 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate90.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_Rotate90.material @@ -17,4 +17,4 @@ "rotateDegrees": 90.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyU.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyU.material index 26e991f700..44345f37c9 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyU.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyU.material @@ -17,4 +17,4 @@ "tileU": 2.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyV.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyV.material index 02d22a6251..2fadfa6e22 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyV.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleOnlyV.material @@ -17,4 +17,4 @@ "tileV": 2.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleUniform.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleUniform.material index fcdc17457b..476ba647be 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleUniform.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_ScaleUniform.material @@ -17,4 +17,4 @@ "scale": 3.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_TransformAll.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_TransformAll.material index 85917c141e..d3db77e1eb 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_TransformAll.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Normal_Dome_TransformAll.material @@ -22,4 +22,4 @@ "tileV": 1.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Opacity.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Opacity.material index 528c7e4cf9..5e8a0438dd 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Opacity.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Opacity.material @@ -11,4 +11,4 @@ "textureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_A.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_A.material index c2da774eb0..7bf12e5358 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_A.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_A.material @@ -34,4 +34,4 @@ "tileV": 1.5 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_B.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_B.material index 06405c0425..4b9f233a85 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_B.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Parallax_B.material @@ -34,4 +34,4 @@ "tileV": 1.7999999523162842 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Roughness.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Roughness.material index dee94d421a..4aa4b4a651 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Roughness.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_Roughness.material @@ -11,4 +11,4 @@ "textureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_SpecularF0.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_SpecularF0.material index 599c6d8377..bf53b57022 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_SpecularF0.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/100_UvTiling_SpecularF0.material @@ -20,4 +20,4 @@ "textureMap": "TestData/Objects/cube/cube_diff.tif" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material index 87eb47d51d..2c711a3bf3 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/101_DetailMaps_LucyBaseNoDetailMaps.material @@ -22,4 +22,4 @@ "textureMapUv": "Unwrapped" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material index 4a77d1c707..7a94386a18 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/102_DetailMaps_All.material @@ -35,4 +35,4 @@ "textureMapUv": "Unwrapped" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColor.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColor.material index 2d57e37099..5bddeaa7e5 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColor.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColor.material @@ -14,4 +14,4 @@ "scale": 20.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material index 14b72a47db..28c922a240 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/103_DetailMaps_BaseColorWithMask.material @@ -10,4 +10,4 @@ "blendDetailMaskUv": "Unwrapped" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_Normal.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_Normal.material index c2425ea818..4c64a696d2 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_Normal.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_Normal.material @@ -15,4 +15,4 @@ "scale": 40.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material index 807aac9664..1c11d653c0 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/104_DetailMaps_NormalWithMask.material @@ -9,4 +9,4 @@ "blendDetailMaskUv": "Unwrapped" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material index 54516f4320..ddeace43da 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/105_DetailMaps_BlendMaskUsingDetailUVs.material @@ -34,4 +34,4 @@ "textureMapUv": "Unwrapped" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/UvTilingBase.material b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/UvTilingBase.material index b36730bbb0..48c287552f 100644 --- a/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/UvTilingBase.material +++ b/Gems/Atom/TestData/TestData/Materials/StandardPbrTestCases/UvTilingBase.material @@ -17,4 +17,4 @@ "tileV": 2.0 } } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl index f484006fe1..793b71b3af 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl +++ b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl @@ -14,9 +14,12 @@ #include "AutoBrick_Common.azsli" #include <Atom/Features/PBR/AlphaUtils.azsli> #include <Atom/Features/PBR/DefaultObjectSrg.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> #include <Atom/Features/PBR/ForwardPassOutput.azsli> #include <Atom/Features/ColorManagement/TransformColor.azsli> #include <Atom/Features/ParallaxMapping.azsli> +#include <Atom/Features/PBR/Lighting/StandardLighting.azsli> +#include <Atom/Features/PBR/Decals.azsli> struct VSInput { @@ -38,7 +41,6 @@ struct VSOutput float2 m_uv : UV1; }; -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput AutoBrick_ForwardPassVS(VSInput IN) @@ -129,8 +131,6 @@ float GetDepth(float2 uv, float2 uv_ddx, float2 uv_ddy) ForwardPassOutput AutoBrick_ForwardPassPS(VSOutput IN) { - ForwardPassOutput OUT; - float3x3 identityUvMatrix = { 1,0,0, 0,1,0, @@ -164,22 +164,62 @@ ForwardPassOutput AutoBrick_ForwardPassPS(VSOutput IN) GetSurfaceShape(IN.m_uv, surfaceDepth, surfaceNormal); const float3 normal = TangentSpaceToWorld(surfaceNormal, normalize(IN.m_normal), normalize(IN.m_tangent), normalize(IN.m_bitangent)); - const float occlusion = 1.0f - surfaceDepth * AutoBrickSrg::m_aoFactor; - const float metallic = 0; - const float roughness = 1; - const float specularF0Factor = 0.5; - const float3 emissive = {0,0,0}; - const float clearCoatFactor = 0.0; - const float clearCoatRoughness = 0.0; - const float3 clearCoatNormal = {0,0,0}; - const float4 transmissionTintThickness = {0,0,0,0}; - const float4 transmissionParams = {0,0,0,0}; - const float2 anisotropy = 0.0; - const float alpha = 1.0; + // ------- Surface ------- - PbrLightingOutput lightingOutput = PbrLighting(IN, baseColor, metallic, roughness, specularF0Factor, - normal, IN.m_tangent, IN.m_bitangent, anisotropy, - emissive, occlusion, transmissionTintThickness, transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, OpacityMode::Opaque); + Surface surface; + + // Position, Normal, Roughness + surface.position = IN.m_worldPosition.xyz; + surface.normal = normalize(normal); + surface.roughnessLinear = 1.0f; + surface.CalculateRoughnessA(); + + // Albedo, SpecularF0 + const float metallic = 0.0f; + const float specularF0Factor = 0.5f; + surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); + + // Clear Coat, Transmission + surface.clearCoat.InitializeToZero(); + surface.transmission.InitializeToZero(); + + // ------- LightingData ------- + + LightingData lightingData; + + // Light iterator + lightingData.tileIterator.Init(IN.m_position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); + lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); + + // Shadow + lightingData.shadowCoords = IN.m_shadowCoords; + lightingData.diffuseAmbientOcclusion = 1.0f - surfaceDepth * AutoBrickSrg::m_aoFactor; + + // Diffuse and Specular response + lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); + lightingData.diffuseResponse = 1.0f - lightingData.specularResponse; + + const float alpha = 1.0f; + + // ------- Lighting Calculation ------- + + // Apply Decals + ApplyDecals(lightingData.tileIterator, surface); + + // Apply Direct Lighting + ApplyDirectLighting(surface, lightingData); + + // Apply Image Based Lighting (IBL) + ApplyIBL(surface, lightingData); + + // Finalize Lighting + lightingData.FinalizeLighting(surface.transmission.tint); + + PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); + + // ------- Output ------- + + ForwardPassOutput OUT; OUT.m_diffuseColor = lightingOutput.m_diffuseColor; OUT.m_diffuseColor.w = -1; // Subsurface scattering is disabled @@ -187,10 +227,8 @@ ForwardPassOutput AutoBrick_ForwardPassPS(VSOutput IN) OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = float3(0,0,0); return OUT; } - \ No newline at end of file + diff --git a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.shader b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.shader index 540837c886..4f1c45d235 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.shader +++ b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.shader @@ -43,4 +43,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl index 64903eb1db..96d5f05e6e 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl +++ b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl @@ -12,10 +12,13 @@ #include <viewsrg.srgi> #include <Atom/Features/PBR/DefaultObjectSrg.azsli> +#include <Atom/Features/PBR/ForwardPassSrg.azsli> #include <Atom/Features/PBR/ForwardPassOutput.azsli> #include <Atom/Features/PBR/AlphaUtils.azsli> #include <Atom/Features/SrgSemantics.azsli> #include <Atom/Features/ColorManagement/TransformColor.azsli> +#include <Atom/Features/PBR/Lighting/StandardLighting.azsli> +#include <Atom/Features/PBR/Decals.azsli> ShaderResourceGroup MinimalPBRSrg : SRG_PerMaterial { @@ -42,7 +45,6 @@ struct VSOutput float3 m_shadowCoords[ViewSrg::MaxCascadeCount] : UV3; }; -#include <Atom/Features/PBR/LightingModel.azsli> #include <Atom/Features/Vertex/VertexHelper.azsli> VSOutput MinimalPBR_MainPassVS(VSInput IN) @@ -58,26 +60,60 @@ VSOutput MinimalPBR_MainPassVS(VSInput IN) ForwardPassOutput MinimalPBR_MainPassPS(VSOutput IN) { - ForwardPassOutput OUT; - - const float3 baseColor = MinimalPBRSrg::m_baseColor; - const float metallic = MinimalPBRSrg::m_metallic; - const float roughness = MinimalPBRSrg::m_roughness; - const float specularF0Factor = 0.5; - const float3 normal = normalize(IN.m_normal); - const float3 emissive = {0,0,0}; - const float occlusion = 1; - const float clearCoatFactor = 0.0; - const float clearCoatRoughness = 0.0; - const float3 clearCoatNormal = {0,0,0}; - const float4 transmissionTintThickness = {0,0,0,0}; - const float4 transmissionParams = {0,0,0,0}; - const float2 anisotropy = 0.0; // Does not affect calculations unless 'o_enableAnisotropy' is enabled - const float alpha = 1.0; + // ------- Surface ------- - PbrLightingOutput lightingOutput = PbrLighting(IN, baseColor, metallic, roughness, specularF0Factor, - normal, IN.m_tangent, IN.m_bitangent, anisotropy, - emissive, occlusion, transmissionTintThickness, transmissionParams, clearCoatFactor, clearCoatRoughness, clearCoatNormal, alpha, OpacityMode::Opaque); + Surface surface; + + // Position, Normal, Roughness + surface.position = IN.m_worldPosition.xyz; + surface.normal = normalize(IN.m_normal); + surface.roughnessLinear = MinimalPBRSrg::m_roughness; + surface.CalculateRoughnessA(); + + // Albedo, SpecularF0 + const float specularF0Factor = 0.5f; + surface.SetAlbedoAndSpecularF0(MinimalPBRSrg::m_baseColor, specularF0Factor, MinimalPBRSrg::m_metallic); + + // Clear Coat, Transmission + surface.clearCoat.InitializeToZero(); + surface.transmission.InitializeToZero(); + + // ------- LightingData ------- + + LightingData lightingData; + + // Light iterator + lightingData.tileIterator.Init(IN.m_position, PassSrg::m_lightListRemapped, PassSrg::m_tileLightData); + lightingData.Init(surface.position, surface.normal, surface.roughnessLinear); + + // Shadow, Occlusion + lightingData.shadowCoords = IN.m_shadowCoords; + + // Diffuse and Specular response + lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); + lightingData.diffuseResponse = 1.0f - lightingData.specularResponse; + + const float alpha = 1.0f; + + // ------- Lighting Calculation ------- + + // Apply Decals + ApplyDecals(lightingData.tileIterator, surface); + + // Apply Direct Lighting + ApplyDirectLighting(surface, lightingData); + + // Apply Image Based Lighting (IBL) + ApplyIBL(surface, lightingData); + + // Finalize Lighting + lightingData.FinalizeLighting(surface.transmission.tint); + + PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); + + // ------- Output ------- + + ForwardPassOutput OUT; OUT.m_diffuseColor = lightingOutput.m_diffuseColor; OUT.m_diffuseColor.w = -1; // Subsurface scattering is disabled @@ -85,8 +121,6 @@ ForwardPassOutput MinimalPBR_MainPassPS(VSOutput IN) OUT.m_specularF0 = lightingOutput.m_specularF0; OUT.m_albedo = lightingOutput.m_albedo; OUT.m_normal = lightingOutput.m_normal; - OUT.m_clearCoatNormal = lightingOutput.m_clearCoatNormal; - OUT.m_scatterDistance = float3(0,0,0); return OUT; } diff --git a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.shader b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.shader index 2b9d97f2b5..13ba0ce547 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.shader +++ b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.shader @@ -43,4 +43,4 @@ }, "DrawList" : "forward" -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/TestData/Textures/TextureHaven/4k_castle_brick_02_red/texturehaven.com.txt b/Gems/Atom/TestData/TestData/Textures/TextureHaven/4k_castle_brick_02_red/texturehaven.com.txt index 5f9eb25d97..ac3acc0fd9 100644 --- a/Gems/Atom/TestData/TestData/Textures/TextureHaven/4k_castle_brick_02_red/texturehaven.com.txt +++ b/Gems/Atom/TestData/TestData/Textures/TextureHaven/4k_castle_brick_02_red/texturehaven.com.txt @@ -3,4 +3,4 @@ https://texturehaven.com/tex/?t=castle_brick_02_red All textures here are CC0 (public domain). No paywalls, accounts or email spam. Just download what you want, and use it however. -CC0: https://texturehaven.com/p/license.php \ No newline at end of file +CC0: https://texturehaven.com/p/license.php diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_AmbientOcclusion.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_AmbientOcclusion.jpg new file mode 100644 index 0000000000..3494ef8a6c --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_AmbientOcclusion.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de6b49c1c4965896a190ed5f40c7d91f9deb942d859fd96264828df768098a83 +size 45257 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Color.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Color.jpg new file mode 100644 index 0000000000..bf62c26631 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0172df6b91bb42bf6c41d18a6fdb7088397663d71f0c2d3ee504a4e91a7e5e98 +size 426462 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Displacement.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Displacement.jpg new file mode 100644 index 0000000000..49efd77e18 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Displacement.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9de0bb2f58936658e8bd3599e487cbd6af3394c772d3132cd77a73774cfb5994 +size 230692 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Normal.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Normal.jpg new file mode 100644 index 0000000000..c61e7f316b --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Normal.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48a8690b74141da4e7e06cd10b47f0eb787b5333a915cd1e048ab24bec485ad0 +size 759052 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Roughness.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Roughness.jpg new file mode 100644 index 0000000000..bef45f0995 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/Tiles009_1K_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddd79ef9962100cd5a9eec686bdcfb98db19ab410329e50df53d6781f9d8b441 +size 421004 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1_col.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_col.jpg new file mode 100644 index 0000000000..0a4c5f380c --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_col.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd44119610135ca5674de7144647df6580d7ac3e03576e9a8e87e741548e7364 +size 2105853 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1_disp.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_disp.jpg new file mode 100644 index 0000000000..57c74af488 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_disp.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dbb74aac2450d6457bb02d36bd3d74e671c2dc7e938e090331151ecc52d545b +size 845683 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1_norm.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_norm.jpg new file mode 100644 index 0000000000..41b1d6d30b --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_norm.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e69a3844c3a595245619a9dda4ed8981476a516ad3648a8b4dfb8151a68b0db5 +size 4439966 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1_roughness.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_roughness.jpg new file mode 100644 index 0000000000..2e7ccba4e0 --- /dev/null +++ b/Gems/Atom/TestData/TestData/Textures/cc0/bark1_roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8caa5961599624a6414d7277c389dd85b175b9587989b815ffd90aff8f62b6c +size 1747230 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1col.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1col.jpg deleted file mode 100644 index 944a968d5b..0000000000 --- a/Gems/Atom/TestData/TestData/Textures/cc0/bark1col.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24f5c234f11a1b29de9000b5a7ba74262f1bc5ebd2227ca1e85a12fa0e8b5237 -size 8273450 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp.jpg deleted file mode 100644 index c8a2a44e9b..0000000000 --- a/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0112ac235da74c60105b0e1a2da49c1e4ab7b89a60960a60cec54ad65db0b4b6 -size 4585685 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp2.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp2.jpg deleted file mode 100644 index f93d68141b..0000000000 --- a/Gems/Atom/TestData/TestData/Textures/cc0/bark1disp2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a202449e5d787e76d959b6bee7a4b60b3821441ac918944c21358742ed1c546 -size 878112 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1norm.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1norm.jpg deleted file mode 100644 index f68ed8b696..0000000000 --- a/Gems/Atom/TestData/TestData/Textures/cc0/bark1norm.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0100b3c356d76ae1cb4c42bd4cc9c58ff359155aab6b9e3c1b205fe25956738 -size 16848020 diff --git a/Gems/Atom/TestData/TestData/Textures/cc0/bark1roughness.jpg b/Gems/Atom/TestData/TestData/Textures/cc0/bark1roughness.jpg deleted file mode 100644 index f6e7acd7b6..0000000000 --- a/Gems/Atom/TestData/TestData/Textures/cc0/bark1roughness.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11badf07e6a7d0501c915f669ff1b14c8744d427d47d06e2fdca46b8f86839c9 -size 4441528 diff --git a/Gems/Atom/TestData/TestData/test.lightingpreset.azasset b/Gems/Atom/TestData/TestData/test.lightingpreset.azasset index 70e8379858..5a89b46487 100644 --- a/Gems/Atom/TestData/TestData/test.lightingpreset.azasset +++ b/Gems/Atom/TestData/TestData/test.lightingpreset.azasset @@ -48,4 +48,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/TestData/readme.txt b/Gems/Atom/TestData/readme.txt index b979527780..3b79be1049 100644 --- a/Gems/Atom/TestData/readme.txt +++ b/Gems/Atom/TestData/readme.txt @@ -5,4 +5,4 @@ watch=@ENGINEROOT@/Gems/Atom/TestData recursive=1 order=1000 -The reason we have a second "TestData" folder inside this one is to make it very clear that the corresponding assets in the cache are from the TestData folder. For example, the asset path at runtime will be like "testdata/objects/cube.azmodel" instead of "objects/cube.azmodel". \ No newline at end of file +The reason we have a second "TestData" folder inside this one is to make it very clear that the corresponding assets in the cache are from the TestData folder. For example, the asset path at runtime will be like "testdata/objects/cube.azmodel" instead of "objects/cube.azmodel". diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h new file mode 100644 index 0000000000..a4dba9229e --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h @@ -0,0 +1,46 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include <AzCore/Debug/TraceMessageBus.h> +#include <AzCore/std/containers/list.h> +#include <AzCore/std/string/string.h> + +namespace AtomToolsFramework +{ + // Records all TraceMessageBus activity to a string + class TraceRecorder : private AZ::Debug::TraceMessageBus::Handler + { + public: + AZ_TYPE_INFO(AtomToolsFramework::TraceRecorder, "{7B49AFD0-D0AB-4CB7-A4B5-6D88D30DCBFD}"); + + TraceRecorder(size_t maxMessageCount = std::numeric_limits<size_t>::max()); + ~TraceRecorder(); + + //! Get the combined output of all messages + AZStd::string GetDump() const; + + private: + ////////////////////////////////////////////////////////////////////////// + // AZ::Debug::TraceMessageBus::Handler overrides... + bool OnAssert(const char* /*message*/) override; + bool OnException(const char* /*message*/) override; + bool OnError(const char* /*window*/, const char* /*message*/) override; + bool OnWarning(const char* /*window*/, const char* /*message*/) override; + bool OnPrintf(const char* /*window*/, const char* /*message*/) override; + ////////////////////////////////////////////////////////////////////////// + + size_t m_maxMessageCount = std::numeric_limits<size_t>::max(); + AZStd::list<AZStd::string> m_messages; + }; +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h index f481bbc397..5fd2862c65 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h @@ -49,6 +49,7 @@ namespace AtomToolsFramework AZ::Name m_id; AZStd::string m_nameId; AZStd::string m_displayName; + AZStd::string m_groupName; AZStd::string m_description; AZStd::any m_defaultValue; AZStd::any m_parentValue; @@ -108,6 +109,8 @@ namespace AtomToolsFramework private: // Functions used to configure edit data attributes. AZStd::string GetDisplayName() const; + AZStd::string GetGroupName() const; + AZStd::string GetAssetPickerTitle() const; AZStd::string GetDescription() const; AZStd::vector<AZ::Edit::EnumConstant<uint32_t>> GetEnumValues() const; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 93f94475e4..dd71bbc431 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -43,9 +43,16 @@ namespace AtomToolsFramework //! Creates a RenderViewportWidget. //! Requires the Atom RPI to be initialized in order //! to internally construct an RPI::ViewportContext. - explicit RenderViewportWidget(AzFramework::ViewportId id = AzFramework::InvalidViewportId, QWidget* parent = nullptr); + //! If initializeViewportContext is set to false, nothing will be displayed on-screen until InitiliazeViewportContext is called. + explicit RenderViewportWidget(QWidget* parent = nullptr, bool shouldInitializeViewportContext = true); ~RenderViewportWidget(); + //! Initializes the underlying ViewportContext, if it hasn't already been. + //! If id is specified, the target ViewportContext will be overridden. + //! NOTE: ViewportContext IDs must be unique. + //! Returns true if the ViewportContext is available + //! (i.e. GetViewportContext will return a valid pointer). + bool InitializeViewportContext(AzFramework::ViewportId id = AzFramework::InvalidViewportId); //! Gets the name associated with this viewport's ViewportContext. //! This context name can be used to adjust the current Camera //! independently of the underlying viewport. diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp new file mode 100644 index 0000000000..e08dd3e48a --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp @@ -0,0 +1,81 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <AtomToolsFramework/Debug/TraceRecorder.h> +#include <AzCore/StringFunc/StringFunc.h> + +namespace AtomToolsFramework +{ + TraceRecorder::TraceRecorder(size_t maxMessageCount) + : m_maxMessageCount(maxMessageCount) + { + AZ::Debug::TraceMessageBus::Handler::BusConnect(); + } + + TraceRecorder::~TraceRecorder() + { + AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); + } + + AZStd::string TraceRecorder::GetDump() const + { + AZStd::string dump; + AZ::StringFunc::Join(dump, m_messages.begin(), m_messages.end(), "\n"); + return dump; + } + + bool TraceRecorder::OnAssert(const char* message) + { + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Assert: %s", message)); + } + return false; + } + + bool TraceRecorder::OnException(const char* message) + { + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Exception: %s", message)); + } + return false; + } + + bool TraceRecorder::OnError(const char* /*window*/, const char* message) + { + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Error: %s", message)); + } + return false; + } + + bool TraceRecorder::OnWarning(const char* /*window*/, const char* message) + { + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Warning: %s", message)); + } + return false; + } + + bool TraceRecorder::OnPrintf(const char* /*window*/, const char* message) + { + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("%s", message)); + } + return false; + } + +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/DynamicProperty/DynamicProperty.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/DynamicProperty/DynamicProperty.cpp index 1ff475b2ef..754c35f0c2 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/DynamicProperty/DynamicProperty.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/DynamicProperty/DynamicProperty.cpp @@ -135,6 +135,7 @@ namespace AtomToolsFramework m_editData.m_elementId = AZ::Edit::UIHandlers::Default; AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::NameLabelOverride, &DynamicProperty::GetDisplayName); + AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::AssetPickerTitle, &DynamicProperty::GetAssetPickerTitle); AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::DescriptionTextOverride, &DynamicProperty::GetDescription); AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::ReadOnly, &DynamicProperty::IsReadOnly); AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::EnumValues, &DynamicProperty::GetEnumValues); @@ -197,6 +198,16 @@ namespace AtomToolsFramework return !m_config.m_displayName.empty() ? m_config.m_displayName : m_config.m_nameId; } + AZStd::string DynamicProperty::GetGroupName() const + { + return m_config.m_groupName; + } + + AZStd::string DynamicProperty::GetAssetPickerTitle() const + { + return GetGroupName().empty() ? GetDisplayName() : GetGroupName() + " " + GetDisplayName(); + } + AZStd::string DynamicProperty::GetDescription() const { return AZStd::string::format("%s%s(Script Name = '%s')", diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index e08a5a045c..0f1e5718db 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -31,12 +31,35 @@ namespace AtomToolsFramework { - RenderViewportWidget::RenderViewportWidget(AzFramework::ViewportId id, QWidget* parent) + RenderViewportWidget::RenderViewportWidget(QWidget* parent, bool shouldInitializeViewportContext) : QWidget(parent) , AzFramework::InputChannelEventListener(AzFramework::InputChannelEventListener::GetPriorityDefault()) { + if (shouldInitializeViewportContext) + { + InitializeViewportContext(); + } + + setUpdatesEnabled(false); + setFocusPolicy(Qt::FocusPolicy::WheelFocus); + setMouseTracking(true); + } + + bool RenderViewportWidget::InitializeViewportContext(AzFramework::ViewportId id) + { + if (m_viewportContext != nullptr) + { + AZ_Assert(id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, "Attempted to reinitialize RenderViewportWidget with a different ID"); + return true; + } + auto viewportContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); - AZ_Assert(viewportContextManager, "Attempted to construct RenderViewportWidget without ViewportContextManager"); + AZ_Assert(viewportContextManager, "Attempted to initialize RenderViewportWidget without ViewportContextManager"); + + if (viewportContextManager == nullptr) + { + return false; + } // Before we do anything else, we must create a ViewportContext which will give us a ViewportId if we didn't manually specify one. AZ::RPI::ViewportContextRequestsInterface::CreationParameters params; @@ -46,6 +69,11 @@ namespace AtomToolsFramework AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params); + if (m_viewportContext == nullptr) + { + return false; + } + SetControllerList(AZStd::make_shared<AzFramework::ViewportControllerList>()); AZ::Name cameraName = AZ::Name(AZStd::string::format("Viewport %i Default Camera", m_viewportContext->GetId())); @@ -58,9 +86,7 @@ namespace AtomToolsFramework AZ::TickBus::Handler::BusConnect(); AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); - setUpdatesEnabled(false); - setFocusPolicy(Qt::FocusPolicy::WheelFocus); - setMouseTracking(true); + return true; } RenderViewportWidget::~RenderViewportWidget() @@ -164,6 +190,8 @@ namespace AtomToolsFramework bool RenderViewportWidget::OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) { + bool shouldConsumeEvent = true; + // Grab keyboard focus if we've been clicked on. // Qt normally handles this for us, but we're filtering native events before they get // synthesized into QMouseEvents. @@ -175,9 +203,18 @@ namespace AtomToolsFramework // Don't consume new input events if we don't currently have focus. // We do forward Ended events, as they may be relevant to our current state // (e.g. a key gets released after we lose focus, it shouldn't remain "stuck"). - if (!hasFocus() && inputChannel.GetState() != AzFramework::InputChannel::State::Ended) + if (!hasFocus()) { - return false; + if (inputChannel.GetState() == AzFramework::InputChannel::State::Ended) + { + // Forward the input ended event to our controllers, but don't prevent other viewports from receiving it. + shouldConsumeEvent = false; + } + else + { + // Not an event we should listen to, abort. + return false; + } } // If we receive a mouse button event from outside of our viewport, ignore it even if we have focus. @@ -196,7 +233,9 @@ namespace AtomToolsFramework } AzFramework::NativeWindowHandle windowId = reinterpret_cast<AzFramework::NativeWindowHandle>(winId()); - return m_controllerList->HandleInputChannelEvent({GetId(), windowId, inputChannel}); + const bool eventHandled = m_controllerList->HandleInputChannelEvent({GetId(), windowId, inputChannel}); + // If our controllers handled the event and it's one we can safely consume (i.e. it's not an Ended event that other viewports might need), consume it. + return eventHandled && shouldConsumeEvent; } void RenderViewportWidget::OnTick([[maybe_unused]]float deltaTime, AZ::ScriptTimePoint time) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index 8c0ca71b78..e8539711f7 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -10,6 +10,7 @@ # set(FILES + Include/AtomToolsFramework/Debug/TraceRecorder.h Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h Include/AtomToolsFramework/DynamicProperty/DynamicPropertyGroup.h Include/AtomToolsFramework/Inspector/InspectorWidget.h @@ -21,6 +22,7 @@ set(FILES Include/AtomToolsFramework/Util/MaterialPropertyUtil.h Include/AtomToolsFramework/Util/Util.h Include/AtomToolsFramework/Viewport/RenderViewportWidget.h + Source/Debug/TraceRecorder.cpp Source/DynamicProperty/DynamicProperty.cpp Source/DynamicProperty/DynamicPropertyGroup.cpp Source/Inspector/InspectorWidget.cpp diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/_TEMPLATE_.lightingconfig.json.template b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/_TEMPLATE_.lightingconfig.json.template index 6d87c5eb7b..923e4b8bf2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/_TEMPLATE_.lightingconfig.json.template +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/_TEMPLATE_.lightingconfig.json.template @@ -71,4 +71,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset index b1c162f315..0263996785 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/lythwood_room.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset index 972c9c3c2b..0d06dcb509 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/LightingPresets/neutral_urban.lightingpreset.azasset @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.modelpreset.azasset index 5493f21362..358dba23f0 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCone.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/beveledcone.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.modelpreset.azasset index 30848d5bba..75f0b04836 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCube.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/beveledcube.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.modelpreset.azasset index 97dcd87ff5..39828f74b9 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/BeveledCylinder.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/beveledcylinder.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.modelpreset.azasset index 3db216ab9a..e862801f7c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Caduceus.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/caduceus.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.modelpreset.azasset index f4ff7d1d89..afe8eb8daa 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cone.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/cone.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.modelpreset.azasset index c5da22098b..cbbe8733ec 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cube.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/cube.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.modelpreset.azasset index 7586bc2eca..5d99f47a94 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Cylinder.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/cylinder.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.modelpreset.azasset index 451e85136e..02a351f4bc 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Lucy.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/lucy.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.modelpreset.azasset index 352027df81..189429ea40 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_1x1.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/plane_1x1.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.modelpreset.azasset index 6829a9221d..9635a673bb 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Plane_3x3.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/plane_3x3.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.modelpreset.azasset index 7f267cae35..08f1673aa2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PlatonicSphere.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/platonicsphere.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.modelpreset.azasset index 7fff4ed2e9..f1c20f34c0 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/PolarSphere.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/polarsphere.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.modelpreset.azasset index dcd183f466..979243aad5 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/QuadSphere.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/quadsphere.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.modelpreset.azasset index 2de1bdb6f8..acc72fb54e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Shaderball.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/shaderball.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.modelpreset.azasset b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.modelpreset.azasset index 5ef71f336d..301f8d7dba 100644 --- a/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.modelpreset.azasset +++ b/Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Torus.modelpreset.azasset @@ -12,4 +12,4 @@ "assetHint": "materialeditor/viewportmodels/torus.azmodel" } } -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp index 2e59cb16f9..6bdee9a319 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp @@ -773,6 +773,7 @@ namespace MaterialEditor AtomToolsFramework::ConvertToPropertyConfig(propertyConfig, propertyDefinition); propertyConfig.m_originalValue = AtomToolsFramework::ConvertToEditableType(m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]); propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(parentPropertyValues[propertyIndex.GetIndex()]); + propertyConfig.m_groupName = m_materialTypeSourceData.FindGroup(groupNameId)->m_displayName; m_properties[propertyConfig.m_id] = AtomToolsFramework::DynamicProperty(propertyConfig); } return true; @@ -789,6 +790,7 @@ namespace MaterialEditor propertyConfig.m_id = "details.materialType"; propertyConfig.m_nameId = "materialType"; propertyConfig.m_displayName = "Material Type"; + propertyConfig.m_groupName = "Details"; propertyConfig.m_description = propertyConfig.m_displayName; propertyConfig.m_defaultValue = AZStd::any(materialTypeAsset); propertyConfig.m_originalValue = propertyConfig.m_defaultValue; @@ -802,6 +804,7 @@ namespace MaterialEditor propertyConfig.m_id = "details.parentMaterial"; propertyConfig.m_nameId = "parentMaterial"; propertyConfig.m_displayName = "Parent Material"; + propertyConfig.m_groupName = "Details"; propertyConfig.m_description = propertyConfig.m_displayName; propertyConfig.m_defaultValue = AZStd::any(parentMaterialAsset); propertyConfig.m_originalValue = propertyConfig.m_defaultValue; @@ -822,6 +825,7 @@ namespace MaterialEditor propertyConfig.m_id = MaterialPropertyId(UvGroupName, shaderInput).GetCStr(); propertyConfig.m_nameId = shaderInput; propertyConfig.m_displayName = shaderInput; + propertyConfig.m_groupName = "UV Names"; propertyConfig.m_description = shaderInput; propertyConfig.m_defaultValue = uvName; propertyConfig.m_originalValue = uvName; diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp index 234afc6e27..2fd1aac211 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp @@ -12,32 +12,29 @@ #include <Document/MaterialDocumentSystemComponent.h> -#include <AzCore/Serialization/SerializeContext.h> -#include <AzCore/Serialization/EditContext.h> -#include <AzCore/RTTI/BehaviorContext.h> - -#include <AzFramework/Asset/AssetSystemBus.h> - -#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h> -#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h> -#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> -#include <AzToolsFramework/API/ViewPaneOptions.h> -#include <AzToolsFramework/API/EditorAssetSystemAPI.h> -#include <AtomToolsFramework/Util/Util.h> - +#include <Atom/Document/MaterialDocumentNotificationBus.h> +#include <Atom/Document/MaterialDocumentRequestBus.h> +#include <Atom/Document/MaterialDocumentSystemRequestBus.h> #include <Atom/RPI.Edit/Material/MaterialSourceData.h> #include <Atom/RPI.Edit/Material/MaterialTypeSourceData.h> - -#include <Atom/Document/MaterialDocumentSystemRequestBus.h> -#include <Atom/Document/MaterialDocumentRequestBus.h> -#include <Atom/Document/MaterialDocumentNotificationBus.h> +#include <AtomToolsFramework/Debug/TraceRecorder.h> +#include <AtomToolsFramework/Util/Util.h> +#include <AzCore/RTTI/BehaviorContext.h> +#include <AzCore/Serialization/EditContext.h> +#include <AzCore/Serialization/SerializeContext.h> +#include <AzFramework/Asset/AssetSystemBus.h> +#include <AzToolsFramework/API/EditorAssetSystemAPI.h> +#include <AzToolsFramework/API/ViewPaneOptions.h> +#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> +#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h> +#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h> AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT #include <QApplication> +#include <QFileDialog> +#include <QMessageBox> #include <QString> #include <QStyle> -#include <QMessageBox> -#include <QFileDialog> AZ_POP_DISABLE_WARNING namespace MaterialEditor @@ -212,11 +209,15 @@ namespace MaterialEditor QString("Would you like to reopen the document:\n%1?").arg(documentPath.c_str()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, documentPath); if (!openResult) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be opened:\n%1").arg(documentPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be opened"), + QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId); } } @@ -232,11 +233,15 @@ namespace MaterialEditor QString("Would you like to update the document with these changes:\n%1?").arg(documentPath.c_str()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Rebuild); if (!openResult) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be opened:\n%1").arg(documentPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be opened"), + QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId); } } @@ -308,11 +313,15 @@ namespace MaterialEditor } } + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool closeResult = true; MaterialDocumentRequestBus::EventResult(closeResult, documentId, &MaterialDocumentRequestBus::Events::Close); if (!closeResult) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be closed:\n%1").arg(documentPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be closed"), + QString("Failed to close: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -370,11 +379,15 @@ namespace MaterialEditor return false; } + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::Save); if (!result) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be saved:\n%1").arg(saveMaterialPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be saved"), + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -396,11 +409,15 @@ namespace MaterialEditor return false; } + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsCopy, saveMaterialPath); if (!result) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be saved:\n%1").arg(saveMaterialPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be saved"), + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -422,11 +439,15 @@ namespace MaterialEditor return false; } + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsChild, saveMaterialPath); if (!result) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be saved:\n%1").arg(saveMaterialPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be saved"), + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -476,19 +497,27 @@ namespace MaterialEditor } } + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); + AZ::Uuid documentId = AZ::Uuid::CreateNull(); MaterialDocumentSystemRequestBus::BroadcastResult(documentId, &MaterialDocumentSystemRequestBus::Events::CreateDocument); if (documentId.IsNull()) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be created:\n%1").arg(requestedPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be created"), + QString("Failed to create: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str())); return AZ::Uuid::CreateNull(); } + traceRecorder.GetDump().clear(); + bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, requestedPath); if (!openResult) { - QMessageBox::critical(QApplication::activeWindow(), "Error", QString("Material document could not be opened:\n%1").arg(requestedPath.c_str())); + QMessageBox::critical( + QApplication::activeWindow(), QString("Material document could not be opened"), + QString("Failed to open: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::DestroyDocument, documentId); return AZ::Uuid::CreateNull(); } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h index 933a3351ba..b6c541421d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h @@ -98,5 +98,6 @@ namespace MaterialEditor AZStd::unordered_set<AZ::Uuid> m_documentIdsToRebuild; AZStd::unordered_set<AZ::Uuid> m_documentIdsToReopen; AZStd::unique_ptr<MaterialEditorSettings> m_settings; + const size_t m_maxMessageBoxLineCount = 15; }; } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Android/PAL_android.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Android/PAL_android.cmake index fe3ef075de..70d49fdb2c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Android/PAL_android.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Android/PAL_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/PAL_linux.cmake index fe3ef075de..70d49fdb2c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/tool_dependencies_linux.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/tool_dependencies_linux.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/tool_dependencies_linux.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Linux/tool_dependencies_linux.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/PAL_mac.cmake index 0023d3b7de..77d41d4561 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED TRUE) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/tool_dependencies_mac.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/tool_dependencies_mac.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/tool_dependencies_mac.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Mac/tool_dependencies_mac.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/PAL_windows.cmake index 0023d3b7de..77d41d4561 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED TRUE) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/tool_dependencies_windows.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/tool_dependencies_windows.cmake index 933dd7927b..4b6494259f 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/tool_dependencies_windows.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/Windows/tool_dependencies_windows.cmake @@ -11,4 +11,4 @@ set(GEM_DEPENDENCIES Gem::QtForPython.Editor -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/iOS/PAL_ios.cmake b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/iOS/PAL_ios.cmake index fe3ef075de..70d49fdb2c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/iOS/PAL_ios.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_MATERIAL_EDITOR_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp index 085d38b064..26279e531b 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp @@ -38,7 +38,7 @@ namespace MaterialEditor { MaterialViewportWidget::MaterialViewportWidget(QWidget* parent) - : AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent) + : AtomToolsFramework::RenderViewportWidget(parent) , m_ui(new Ui::MaterialViewportWidget) { m_ui->setupUi(this); 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 76aee99e52..6c30540392 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp @@ -26,8 +26,14 @@ namespace MaterialEditor { CreateMaterialDialog::CreateMaterialDialog(QWidget* parent) + : CreateMaterialDialog(QString(AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials", parent) + { + } + + CreateMaterialDialog::CreateMaterialDialog(const QString& path, QWidget* parent) : QDialog(parent) , m_ui(new Ui::CreateMaterialDialog) + , m_path(path) { m_ui->setupUi(this); @@ -77,8 +83,7 @@ namespace MaterialEditor { //Select a default location and unique name for the new material m_materialFileInfo = AtomToolsFramework::GetUniqueFileInfo( - QString(AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + + m_path + AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.h index 54d7c2175d..63d166e95c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.h @@ -27,6 +27,7 @@ namespace MaterialEditor Q_OBJECT public: CreateMaterialDialog(QWidget* parent = nullptr); + CreateMaterialDialog(const QString& path, QWidget* parent = nullptr); ~CreateMaterialDialog() = default; QFileInfo m_materialFileInfo; @@ -34,6 +35,8 @@ namespace MaterialEditor private: QScopedPointer<Ui::CreateMaterialDialog> m_ui; + QString m_path; + void InitMaterialTypeSelection(); void InitMaterialFileSelection(); void UpdateMaterialTypeSelection(); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/View.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/View.svg index fe569fa5fd..a764c48d6c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/View.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/View.svg @@ -5,4 +5,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M11.9842667,6 C14.2018891,6 17.5404669,8 22,12 C17.5404669,16 14.2018891,18 11.9842667,18 C9.76664426,18 6.43855537,16 2,12 C6.43855537,8 9.76664426,6 11.9842667,6 Z M12,7.5 C9.51471863,7.5 7.5,9.51471863 7.5,12 C7.5,14.4852814 9.51471863,16.5 12,16.5 C14.4852814,16.5 16.5,14.4852814 16.5,12 C16.5,9.51471863 14.4852814,7.5 12,7.5 Z M12,9 C13.6568542,9 15,10.3431458 15,12 C15,13.6568542 13.6568542,15 12,15 C10.3431458,15 9,13.6568542 9,12 C9,10.3431458 10.3431458,9 12,9 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/grid.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/grid.svg index 3bfa783d12..183eaacfed 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/grid.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/grid.svg @@ -6,4 +6,4 @@ <g id="Icons-/-Toolbar-/-Ground" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M2,19 L5,6 L19,6 L22,19 L2,19 Z M5,14.667 L4.462,17 L8.051,17 L8.255,15 L5,15 L5,14.667 Z M19,14.667 L19,15 L15.699,15 L15.9,17 L19.538,17 L19,14.667 Z M13.699,15 L10.255,15 L10.051,17 L13.9,17 L13.699,15 Z M5.269,13.5 L8.407,13.5 L8.611,11.5 L5.731,11.5 L5.269,13.5 Z M18.269,11.5 L15.348,11.5 L15.549,13.5 L18.731,13.5 L18.269,11.5 Z M13.348,11.5 L10.611,11.5 L10.407,13.5 L13.549,13.5 L13.348,11.5 Z M6.077,10 L8.763,10 L8.967,8 L6.538,8 L6.077,10 Z M17.462,8 L10.967,8 L10.763,10 L13.198,10 L13,8.02631406 L15,8.02631406 L15.198,10 L17.923,10 L17.462,8 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/material.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/material.svg index 1cba1fe9c7..49fb8b5b2c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/material.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/material.svg @@ -7,4 +7,4 @@ <rect id="Rectangle" fill="#EEEEEE" fill-rule="nonzero" x="16" y="15.9999948" width="6" height="6"></rect> <path d="M13.2003238,2.05728467 L13.3206336,2.08541409 C17.9843907,2.69389766 21.611637,6.4842271 21.9707625,11.2247926 C21.9900321,11.3980031 22,11.5711198 22,11.7433304 L21.997,11.815 L22,12 C22,12.6856005 21.9319119,13.3545263 21.802092,14.0004211 L14,14 L14.0004211,21.802092 C13.4430737,21.9141145 12.8685772,21.980171 12.2810157,21.9961774 L12,22 C6.45454545,22 2,17.5454545 2,12 C2,6.45454545 6.45454545,2 12,2 C12.1802332,2 12.359314,2.00470542 12.537127,2.01400079 C12.719362,1.98546889 12.9435559,2.00149401 13.2003238,2.05728467 Z M11.999,15.636 L9.54545455,15.6363636 C10.0721003,18.3573668 11.1072317,20.0613988 11.9144212,20.1756828 L11.999,20.181 L11.999,15.636 Z M7.72727273,15.6363636 L4.63636364,15.6363636 C5.54545455,17.4545455 7.09090909,18.8181818 8.90909091,19.6363636 C8.36363636,18.5454545 8,17.0909091 7.72727273,15.6363636 Z M11.999,10.181 L9.36363636,10.1818182 C9.27272727,10.7272727 9.27272727,11.3636364 9.27272727,12 C9.27272727,12.5090909 9.27272727,13.0181818 9.31927273,13.4807273 L9.36363636,13.8181818 L11.999,13.818 L11.999,10.181 Z M7.45454545,10.1818182 L4,10.1818182 C3.90909091,10.7272727 3.81818182,11.3636364 3.81818182,12 C3.81818182,12.5090909 3.87636364,13.0181818 3.94618182,13.4807273 L4,13.8181818 L7.54545455,13.8181818 C7.47272727,13.3090909 7.45818182,12.8581818 7.45527273,12.3723636 L7.45454545,12 L7.45454545,10.1818182 Z M11.9990157,3.81818265 C11.2091528,3.8195194 10.1655566,5.42953176 9.60376892,8.07613162 L9.54545455,8.36363636 L11.999,8.363 L11.9990157,3.81818265 Z M9,4.36363636 C7.1969697,5.13636364 5.71829405,6.3956229 4.79372428,8.0648304 L4.63636364,8.36363636 L7.72727273,8.36363636 C8,6.90909091 8.45454545,5.45454545 9,4.36363636 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/materialtype.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/materialtype.svg index ee0164a328..98950e17b6 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/materialtype.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/materialtype.svg @@ -9,4 +9,4 @@ </g> <path d="M22,20.8342395 C22,18.1069667 22,17.2661779 22,11.7433304 C22,6.22048287 22,5.379694 22,2.65242127 C22,-0.0748514543 12,6.28878491 12,11.7433304 C12,17.1978758 22,23.5615122 22,20.8342395 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero" transform="translate(17.000000, 11.743330) scale(-1, 1) translate(-17.000000, -11.743330) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/mesh.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/mesh.svg index 41cc8ec463..11906ade51 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/mesh.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/mesh.svg @@ -7,4 +7,4 @@ <path d="M10.25,0 C4.56590909,0 0,4.45454545 0,10 C0,15.5454545 4.56590909,20 10.25,20 C15.9340909,20 20.5,15.5454545 20.5,10 C20.5,4.45454545 15.9340909,0 10.25,0 Z M17.7977273,6.36363636 L14.6295455,6.36363636 C14.35,4.90909091 13.9772727,3.45454545 13.4181818,2.36363636 C15.2818182,3.18181818 16.8659091,4.54545455 17.7977273,6.36363636 Z M13.0454545,10 C13.0454545,10.6363636 13.0454545,11.2727273 12.9522727,11.8181818 L7.54772727,11.8181818 C7.45454545,11.2727273 7.45454545,10.6363636 7.45454545,10 C7.45454545,9.36363636 7.45454545,8.72727273 7.54772727,8.18181818 L12.9522727,8.18181818 C13.0454545,8.72727273 13.0454545,9.36363636 13.0454545,10 Z M10.25,18.1818182 C9.41136364,18.1818182 8.29318182,16.4545455 7.73409091,13.6363636 L12.6727273,13.6363636 C12.2068182,16.4545455 11.0886364,18.1818182 10.25,18.1818182 Z M7.73409091,6.36363636 C8.29318182,3.54545455 9.41136364,1.81818182 10.25,1.81818182 C11.0886364,1.81818182 12.2068182,3.54545455 12.7659091,6.36363636 L7.73409091,6.36363636 Z M7.175,2.36363636 C6.61590909,3.45454545 6.15,4.90909091 5.87045455,6.36363636 L2.70227273,6.36363636 C3.63409091,4.54545455 5.21818182,3.18181818 7.175,2.36363636 Z M2.05,8.18181818 L5.59090909,8.18181818 C5.59090909,8.81818182 5.59090909,9.36363636 5.59090909,10 C5.59090909,10.6363636 5.59090909,11.1818182 5.68409091,11.8181818 L2.05,11.8181818 C1.95681818,11.2727273 1.86363636,10.6363636 1.86363636,10 C1.86363636,9.36363636 1.95681818,8.72727273 2.05,8.18181818 Z M2.70227273,13.6363636 L5.87045455,13.6363636 C6.15,15.0909091 6.52272727,16.5454545 7.08181818,17.6363636 C5.21818182,16.8181818 3.63409091,15.4545455 2.70227273,13.6363636 Z M13.325,17.6363636 C13.8840909,16.5454545 14.35,15.1818182 14.5363636,13.6363636 L17.7045455,13.6363636 C16.8659091,15.4545455 15.2818182,16.8181818 13.325,17.6363636 Z M18.45,11.8181818 L14.9090909,11.8181818 C15.0022727,11.1818182 15.0022727,10.6363636 15.0022727,10 C15.0022727,9.36363636 15.0022727,8.81818182 14.9090909,8.18181818 L18.45,8.18181818 C18.5431818,8.72727273 18.6363636,9.36363636 18.6363636,10 C18.6363636,10.6363636 18.5431818,11.2727273 18.45,11.8181818 Z" id="Shape"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/shadow.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/shadow.svg index 1a3b138b2d..b076f33e95 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/shadow.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/shadow.svg @@ -6,4 +6,4 @@ <g id="Icons-/-Toolbar-/-Shadow" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M6.99979618,18.810136 L9.18779618,20.999136 L7,21 L6.99979618,18.810136 Z M17,3 L17,7.312 L20.9997962,11.310136 L20.9997962,13.189136 L17,9.19 L17,11.311 L20.9997962,15.310136 L20.9997962,17.689136 L17,13.69 L17,15.812 L20.9997962,19.811136 L21,21 L19.8097962,20.999136 L15.81,17 L13.689,17 L17.6887962,20.999136 L15.3097962,20.999136 L11.31,17 L9.188,17 L13.1877962,20.999136 L11.3097962,20.999136 L7.311,17 L3,17 L3,3 L17,3 Z M21,7 L20.9997962,9.18913601 L18.8087962,6.99913601 L21,7 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/texture.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/texture.svg index d7343cd6f3..366c0883a1 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/texture.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/texture.svg @@ -7,4 +7,4 @@ <path d="M14.550959,11.6 L12,8.6 L11,9.6 L8,6.6 L3.46109347,11.6 L3.46109347,14.5401062 L14.550959,14.5401062 L14.550959,11.6 Z M13.5,3 C14.3284271,3 15,3.67157288 15,4.5 C15,5.32842712 14.3284271,6 13.5,6 C12.6715729,6 12,5.32842712 12,4.5 C12,3.67157288 12.6715729,3 13.5,3 Z M0,1.77635684e-15 L0,18 L18,18 L18,1.77635684e-15 L0,1.77635684e-15 Z M16,16 L2,16 L2,2 L16,2 L16,16 Z" id="Shape"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/toneMapping.svg b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/toneMapping.svg index 17d2df0d66..2204558331 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/toneMapping.svg +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/Icons/toneMapping.svg @@ -11,4 +11,4 @@ <rect id="Rectangle" fill="#FFFFFF" x="5" y="3" width="16" height="2"></rect> <rect id="Rectangle" fill="#FFFFFF" x="19" y="3" width="2" height="16"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.cpp deleted file mode 100644 index b0412c001c..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include <QApplication> -#include <QClipboard> -#include <QMenu> -#include <QInputDialog> -#include <QMessageBox> -#include <QFileDialog> -#include <QDesktopServices> - -#include <AzQtComponents/Utilities/DesktopUtilities.h> - -#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h> -#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h> -#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> -#include <AzToolsFramework/Thumbnails/SourceControlThumbnail.h> -#include <AtomToolsFramework/Util/Util.h> - -#include <Atom/Document/MaterialDocumentSystemRequestBus.h> - -#include <Source/Window/MaterialBrowserInteractions.h> - -#include <Atom/RPI.Reflect/Material/MaterialAsset.h> -#include <Atom/RPI.Edit/Material/MaterialSourceData.h> -#include <Atom/RPI.Edit/Material/MaterialTypeSourceData.h> - -namespace MaterialEditor -{ - MaterialBrowserInteractions::MaterialBrowserInteractions() - { - using namespace AzToolsFramework::AssetBrowser; - - AssetBrowserInteractionNotificationBus::Handler::BusConnect(); - } - - MaterialBrowserInteractions::~MaterialBrowserInteractions() - { - AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); - } - - void MaterialBrowserInteractions::AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector<AzToolsFramework::AssetBrowser::AssetBrowserEntry*>& entries) - { - AssetBrowserEntry* entry = entries.empty() ? nullptr : entries.front(); - if (!entry) - { - return; - } - - m_caller = caller; - QObject::connect(m_caller, &QObject::destroyed, [this]() - { - m_caller = nullptr; - }); - - AddGenericContextMenuActions(caller, menu, entry); - - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) - { - const auto source = azalias_cast<const SourceAssetBrowserEntry*>(entry); - if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialExtension)) - { - AddContextMenuActionsForMaterialSource(caller, menu, source); - } - else if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialTypeExtension)) - { - AddContextMenuActionsForMaterialTypeSource(caller, menu, source); - } - else - { - AddContextMenuActionsForOtherSource(caller, menu, source); - } - } - else if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Folder) - { - const auto folder = azalias_cast<const FolderAssetBrowserEntry*>(entry); - AddContextMenuActionsForFolder(caller, menu, folder); - } - } - - void MaterialBrowserInteractions::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 MaterialBrowserInteractions::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::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + - AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); - - MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CreateDocumentFromFile, - entry->GetFullPath(), AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData()); - }); - - AddPerforceMenuActions(caller, menu, entry); - } - - void MaterialBrowserInteractions::AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) - { - menu->addAction("Open", [entry]() - { - QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str())); - }); - - menu->addAction("Duplicate...", [entry, caller]() - { - 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()); - }); - - AddPerforceMenuActions(caller, menu, entry); - } - - void MaterialBrowserInteractions::AddContextMenuActionsForMaterialSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) - { - menu->addAction("Open", [entry]() - { - MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath()); - }); - - menu->addAction("Duplicate...", [entry, caller]() - { - 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("Create Child Material...", [entry]() - { - const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( - QString(AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + - AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); - - MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::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 MaterialBrowserInteractions::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("MaterialBrowser", false, "Failed to make new folder"); - return; - } - } - } - }); - } - - void MaterialBrowserInteractions::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, this]() - { - 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 MaterialBrowserInteractions::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 MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp index 3c4134b7e0..0dec1c6d23 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserWidget.cpp @@ -110,19 +110,30 @@ namespace MaterialEditor { using namespace AzToolsFramework::AssetBrowser; + // Material Browser uses the following filters: + // 1. [All source files (no products) that contain products matching the assetType specified by searchWidget (default is materials and textures)] + // 2. [All folders (including empty folders)] + // 3. [All Sources and folders matching the search text typed in search widget] + // Final filter = ((1 OR 2) AND 3) + QSharedPointer<EntryTypeFilter> sourceFilter(new EntryTypeFilter); sourceFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Source); + QSharedPointer<CompositeFilter> assetTypeFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::AND)); + assetTypeFilter->AddFilter(sourceFilter); + assetTypeFilter->AddFilter(m_ui->m_searchWidget->GetTypesFilter()); + QSharedPointer<EntryTypeFilter> folderFilter(new EntryTypeFilter); folderFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Folder); QSharedPointer<CompositeFilter> sourceOrFolderFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::OR)); - sourceOrFolderFilter->AddFilter(sourceFilter); + sourceOrFolderFilter->AddFilter(assetTypeFilter); sourceOrFolderFilter->AddFilter(folderFilter); QSharedPointer<CompositeFilter> finalFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::AND)); finalFilter->AddFilter(sourceOrFolderFilter); - finalFilter->AddFilter(m_ui->m_searchWidget->GetFilter()); + finalFilter->AddFilter(m_ui->m_searchWidget->GetStringFilter()); + finalFilter->SetFilterPropagation(AssetBrowserEntryFilter::PropagateDirection::Down); return finalFilter; } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditor.qss b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditor.qss index c73bb76520..e518d80740 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditor.qss +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditor.qss @@ -15,4 +15,4 @@ AzToolsFramework--PropertyRowWidget[IsOverridden=true] QLabel { font-weight: bold; color: #F5A623; -} \ No newline at end of file +} diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp new file mode 100644 index 0000000000..92e02d5b42 --- /dev/null +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp @@ -0,0 +1,358 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <QApplication> +#include <QClipboard> +#include <QMenu> +#include <QInputDialog> +#include <QMessageBox> +#include <QFileDialog> +#include <QDesktopServices> + +#include <AzCore/std/string/wildcard.h> +#include <AzQtComponents/Utilities/DesktopUtilities.h> + +#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h> +#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h> +#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> +#include <AzToolsFramework/Thumbnails/SourceControlThumbnail.h> +#include <AtomToolsFramework/Util/Util.h> + +#include <Atom/RPI.Edit/Common/AssetUtils.h> +#include <Atom/Document/MaterialDocumentSystemRequestBus.h> + +#include <WIndow/MaterialEditorBrowserInteractions.h> + +#include <Atom/RPI.Reflect/Material/MaterialAsset.h> +#include <Atom/RPI.Edit/Material/MaterialSourceData.h> +#include <Atom/RPI.Edit/Material/MaterialTypeSourceData.h> + +namespace MaterialEditor +{ + MaterialEditorBrowserInteractions::MaterialEditorBrowserInteractions() + { + using namespace AzToolsFramework::AssetBrowser; + + AssetBrowserInteractionNotificationBus::Handler::BusConnect(); + } + + MaterialEditorBrowserInteractions::~MaterialEditorBrowserInteractions() + { + AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); + } + + void MaterialEditorBrowserInteractions::AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector<AzToolsFramework::AssetBrowser::AssetBrowserEntry*>& entries) + { + AssetBrowserEntry* entry = entries.empty() ? nullptr : entries.front(); + if (!entry) + { + return; + } + + m_caller = caller; + QObject::connect(m_caller, &QObject::destroyed, [this]() + { + m_caller = nullptr; + }); + + AddGenericContextMenuActions(caller, menu, entry); + + if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) + { + const auto source = azalias_cast<const SourceAssetBrowserEntry*>(entry); + if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialExtension)) + { + AddContextMenuActionsForMaterialSource(caller, menu, source); + } + else if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), MaterialTypeExtension)) + { + AddContextMenuActionsForMaterialTypeSource(caller, menu, source); + } + else + { + AddContextMenuActionsForOtherSource(caller, menu, source); + } + } + else if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Folder) + { + const auto folder = azalias_cast<const FolderAssetBrowserEntry*>(entry); + AddContextMenuActionsForFolder(caller, menu, folder); + } + } + + 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::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + + AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); + + MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CreateDocumentFromFile, + entry->GetFullPath(), AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData()); + }); + + AddPerforceMenuActions(caller, menu, entry); + } + + void MaterialEditorBrowserInteractions::AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) + { + menu->addAction("Open", [entry]() + { + QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str())); + }); + + menu->addAction("Duplicate...", [entry, caller]() + { + 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()); + }); + + AddPerforceMenuActions(caller, menu, entry); + } + + void MaterialEditorBrowserInteractions::AddContextMenuActionsForMaterialSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) + { + menu->addAction("Open", [entry]() + { + MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath()); + }); + + menu->addAction("Duplicate...", [entry, caller]() + { + 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("Create Child Material...", [entry]() + { + const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( + QString(AZ::IO::FileIOBase::GetInstance()->GetAlias("@devassets@")) + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "Materials" + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + + AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); + + MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::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) + { + 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("MaterialBrowser", false, "Failed to make new folder"); + return; + } + } + } + }); + } + + void MaterialEditorBrowserInteractions::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, this]() + { + 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 MaterialEditorBrowserInteractions::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 MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h similarity index 91% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.h rename to Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h index 2806cee6d4..7ee3ec833d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialBrowserInteractions.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h @@ -31,14 +31,14 @@ namespace AzToolsFramework namespace MaterialEditor { - class MaterialBrowserInteractions + class MaterialEditorBrowserInteractions : public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler { public: - AZ_CLASS_ALLOCATOR(MaterialBrowserInteractions, AZ::SystemAllocator, 0); + AZ_CLASS_ALLOCATOR(MaterialEditorBrowserInteractions, AZ::SystemAllocator, 0); - MaterialBrowserInteractions(); - ~MaterialBrowserInteractions(); + MaterialEditorBrowserInteractions(); + ~MaterialEditorBrowserInteractions(); private: //! AssetBrowserInteractionNotificationBus::Handler overrides... diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp index 6f03510301..a1ff8da635 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp @@ -98,7 +98,7 @@ namespace MaterialEditor void MaterialEditorWindowComponent::CreateMaterialEditorWindow() { - m_materialBrowserInteractions.reset(aznew MaterialBrowserInteractions); + m_materialEditorBrowserInteractions.reset(aznew MaterialEditorBrowserInteractions); m_window.reset(aznew MaterialEditorWindow); m_window->show(); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.h index f727fcc97c..1ea05d6530 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.h @@ -16,7 +16,7 @@ #include <AzToolsFramework/API/EditorWindowRequestBus.h> #include <Atom/Window/MaterialEditorWindowFactoryRequestBus.h> -#include <Source/Window/MaterialBrowserInteractions.h> +#include <Source/Window/MaterialEditorBrowserInteractions.h> #include <Source/Window/MaterialEditorWindow.h> namespace MaterialEditor @@ -57,6 +57,6 @@ namespace MaterialEditor //////////////////////////////////////////////////////////////////////// AZStd::unique_ptr<MaterialEditorWindow> m_window; - AZStd::unique_ptr<MaterialBrowserInteractions> m_materialBrowserInteractions; + AZStd::unique_ptr<MaterialEditorBrowserInteractions> m_materialEditorBrowserInteractions; }; } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/materialeditorwindow_files.cmake b/Gems/Atom/Tools/MaterialEditor/Code/materialeditorwindow_files.cmake index fef3aeefb7..1547dbf48f 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/materialeditorwindow_files.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/materialeditorwindow_files.cmake @@ -14,8 +14,8 @@ set(FILES Include/Atom/Window/MaterialEditorWindowNotificationBus.h Include/Atom/Window/MaterialEditorWindowRequestBus.h Include/Atom/Window/MaterialEditorWindowFactoryRequestBus.h - Source/Window/MaterialBrowserInteractions.h - Source/Window/MaterialBrowserInteractions.cpp + Source/Window/MaterialEditorBrowserInteractions.h + Source/Window/MaterialEditorBrowserInteractions.cpp Source/Window/MaterialEditorWindow.h Source/Window/MaterialEditorWindow.cpp Source/Window/MaterialEditorWindowModule.cpp diff --git a/Gems/Atom/Tools/MaterialEditor/preview.svg b/Gems/Atom/Tools/MaterialEditor/preview.svg index 2a71cbd97d..56c1ead3c1 100644 --- a/Gems/Atom/Tools/MaterialEditor/preview.svg +++ b/Gems/Atom/Tools/MaterialEditor/preview.svg @@ -6,4 +6,4 @@ <rect id="Rectangle" fill="#3D3D3D" x="0" y="0" width="140" height="80"></rect> <path d="M73.2408742,13.1546686 L73.5657106,13.2306181 C85.906012,14.8406656 95.5585578,24.701494 96.85234,37.1420953 L96.9210589,37.9069399 C96.9730868,38.3746085 97,38.8420235 97,39.306992 L96.9962868,39.5446661 L97,40 L97,40 C97,54.9727273 84.9727273,67 70,67 C55.0272727,67 43,54.9727273 43,40 C43,25.0272727 55.0272727,13 70,13 C70.4866296,13 70.9701478,13.0127046 71.4502429,13.0378021 C71.8438705,12.9761732 72.3100032,12.9915388 72.835667,13.0772753 L73.2408742,13.1546686 Z M70.4576271,50.5254237 L63.1355932,50.5263757 L63.30962,51.2793289 C64.9262977,57.9629917 67.8804497,62.1213112 70.2023411,62.4098089 L70.4576271,62.4237288 L70.4576271,50.5254237 Z M58.9293184,49.6101695 L50.3220339,49.6101695 L50.7601942,50.4306198 C53.3341147,55.0138675 57.4385142,58.4714946 62.220339,60.5932203 C61.0051929,58.1969183 60.1140858,55.1616025 59.4174021,51.9984838 L59.1650061,50.807322 L58.9293184,49.6101695 Z M70.4576271,34.9661017 L63.3777731,34.9681606 L63.2783387,35.6436273 C63.1956538,36.3347889 63.1602174,37.0702243 63.1450304,37.8246341 L63.1355932,38.5844316 L63.1355932,40.502373 C63.1394993,41.1392466 63.1512177,41.7687999 63.1863729,42.376392 L63.2586362,43.2694792 L63.3777731,44.1186441 L70.4576271,44.1181865 L70.4576271,34.9661017 Z M58.2914427,34.9661017 L48.1120298,34.9661017 L47.9534452,35.8154576 C47.7477139,36.979661 47.5762712,38.2610169 47.5762712,39.5423729 C47.5762712,40.5033898 47.6727077,41.4644068 47.8077189,42.376 L47.9534452,43.2692881 L48.1120298,44.1186441 L58.559322,44.1186441 L58.4285969,43.1814237 C58.3600198,42.5700339 58.3257313,41.9806102 58.308587,41.3838644 L58.2935858,40.4795932 L58.2914427,34.9661017 Z M70.4576271,17.5762712 C68.1852718,17.5762712 65.2077027,21.4954965 63.4946548,27.989603 L63.30962,28.7216983 L63.1355932,29.4745763 L70.4576271,29.4729105 L70.4576271,17.5762712 L70.4576271,17.5762712 Z M62.220339,19.4067797 C57.5932203,21.403698 53.7495292,24.5839753 51.2115505,28.7722993 L50.7511084,29.5693802 L50.3220339,30.3898305 L58.75,30.3898305 L58.9877182,29.192678 C59.7440042,25.6072111 60.8817797,22.1026194 62.220339,19.4067797 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/PAL_android.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/PAL_android.cmake index 8af622ce0d..c3e410eb4f 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/PAL_android.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/PAL_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/tool_dependencies_android.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/tool_dependencies_android.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/tool_dependencies_android.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Android/tool_dependencies_android.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/PAL_linux.cmake index 8af622ce0d..c3e410eb4f 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/tool_dependencies_linux.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/tool_dependencies_linux.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/tool_dependencies_linux.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Linux/tool_dependencies_linux.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/PAL_mac.cmake index 87bc8597e8..3de10e0083 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED TRUE) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/tool_dependencies_mac.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/tool_dependencies_mac.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/tool_dependencies_mac.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Mac/tool_dependencies_mac.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/PAL_windows.cmake index 87bc8597e8..3de10e0083 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED TRUE) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/tool_dependencies_windows.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/tool_dependencies_windows.cmake index 933dd7927b..4b6494259f 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/tool_dependencies_windows.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/Windows/tool_dependencies_windows.cmake @@ -11,4 +11,4 @@ set(GEM_DEPENDENCIES Gem::QtForPython.Editor -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/PAL_ios.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/PAL_ios.cmake index 8af622ce0d..c3e410eb4f 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/PAL_ios.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED FALSE) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/tool_dependencies_ios.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/tool_dependencies_ios.cmake index ffcaf7293a..436b409d76 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/tool_dependencies_ios.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Platform/iOS/tool_dependencies_ios.cmake @@ -10,4 +10,4 @@ # set(GEM_DEPENDENCIES -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/grid.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/grid.svg index 3bfa783d12..183eaacfed 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/grid.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/grid.svg @@ -6,4 +6,4 @@ <g id="Icons-/-Toolbar-/-Ground" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M2,19 L5,6 L19,6 L22,19 L2,19 Z M5,14.667 L4.462,17 L8.051,17 L8.255,15 L5,15 L5,14.667 Z M19,14.667 L19,15 L15.699,15 L15.9,17 L19.538,17 L19,14.667 Z M13.699,15 L10.255,15 L10.051,17 L13.9,17 L13.699,15 Z M5.269,13.5 L8.407,13.5 L8.611,11.5 L5.731,11.5 L5.269,13.5 Z M18.269,11.5 L15.348,11.5 L15.549,13.5 L18.731,13.5 L18.269,11.5 Z M13.348,11.5 L10.611,11.5 L10.407,13.5 L13.549,13.5 L13.348,11.5 Z M6.077,10 L8.763,10 L8.967,8 L6.538,8 L6.077,10 Z M17.462,8 L10.967,8 L10.763,10 L13.198,10 L13,8.02631406 L15,8.02631406 L15.198,10 L17.923,10 L17.462,8 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/material.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/material.svg index 1cba1fe9c7..49fb8b5b2c 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/material.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/material.svg @@ -7,4 +7,4 @@ <rect id="Rectangle" fill="#EEEEEE" fill-rule="nonzero" x="16" y="15.9999948" width="6" height="6"></rect> <path d="M13.2003238,2.05728467 L13.3206336,2.08541409 C17.9843907,2.69389766 21.611637,6.4842271 21.9707625,11.2247926 C21.9900321,11.3980031 22,11.5711198 22,11.7433304 L21.997,11.815 L22,12 C22,12.6856005 21.9319119,13.3545263 21.802092,14.0004211 L14,14 L14.0004211,21.802092 C13.4430737,21.9141145 12.8685772,21.980171 12.2810157,21.9961774 L12,22 C6.45454545,22 2,17.5454545 2,12 C2,6.45454545 6.45454545,2 12,2 C12.1802332,2 12.359314,2.00470542 12.537127,2.01400079 C12.719362,1.98546889 12.9435559,2.00149401 13.2003238,2.05728467 Z M11.999,15.636 L9.54545455,15.6363636 C10.0721003,18.3573668 11.1072317,20.0613988 11.9144212,20.1756828 L11.999,20.181 L11.999,15.636 Z M7.72727273,15.6363636 L4.63636364,15.6363636 C5.54545455,17.4545455 7.09090909,18.8181818 8.90909091,19.6363636 C8.36363636,18.5454545 8,17.0909091 7.72727273,15.6363636 Z M11.999,10.181 L9.36363636,10.1818182 C9.27272727,10.7272727 9.27272727,11.3636364 9.27272727,12 C9.27272727,12.5090909 9.27272727,13.0181818 9.31927273,13.4807273 L9.36363636,13.8181818 L11.999,13.818 L11.999,10.181 Z M7.45454545,10.1818182 L4,10.1818182 C3.90909091,10.7272727 3.81818182,11.3636364 3.81818182,12 C3.81818182,12.5090909 3.87636364,13.0181818 3.94618182,13.4807273 L4,13.8181818 L7.54545455,13.8181818 C7.47272727,13.3090909 7.45818182,12.8581818 7.45527273,12.3723636 L7.45454545,12 L7.45454545,10.1818182 Z M11.9990157,3.81818265 C11.2091528,3.8195194 10.1655566,5.42953176 9.60376892,8.07613162 L9.54545455,8.36363636 L11.999,8.363 L11.9990157,3.81818265 Z M9,4.36363636 C7.1969697,5.13636364 5.71829405,6.3956229 4.79372428,8.0648304 L4.63636364,8.36363636 L7.72727273,8.36363636 C8,6.90909091 8.45454545,5.45454545 9,4.36363636 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/materialtype.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/materialtype.svg index ee0164a328..98950e17b6 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/materialtype.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/materialtype.svg @@ -9,4 +9,4 @@ </g> <path d="M22,20.8342395 C22,18.1069667 22,17.2661779 22,11.7433304 C22,6.22048287 22,5.379694 22,2.65242127 C22,-0.0748514543 12,6.28878491 12,11.7433304 C12,17.1978758 22,23.5615122 22,20.8342395 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero" transform="translate(17.000000, 11.743330) scale(-1, 1) translate(-17.000000, -11.743330) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/mesh.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/mesh.svg index 41cc8ec463..11906ade51 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/mesh.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/mesh.svg @@ -7,4 +7,4 @@ <path d="M10.25,0 C4.56590909,0 0,4.45454545 0,10 C0,15.5454545 4.56590909,20 10.25,20 C15.9340909,20 20.5,15.5454545 20.5,10 C20.5,4.45454545 15.9340909,0 10.25,0 Z M17.7977273,6.36363636 L14.6295455,6.36363636 C14.35,4.90909091 13.9772727,3.45454545 13.4181818,2.36363636 C15.2818182,3.18181818 16.8659091,4.54545455 17.7977273,6.36363636 Z M13.0454545,10 C13.0454545,10.6363636 13.0454545,11.2727273 12.9522727,11.8181818 L7.54772727,11.8181818 C7.45454545,11.2727273 7.45454545,10.6363636 7.45454545,10 C7.45454545,9.36363636 7.45454545,8.72727273 7.54772727,8.18181818 L12.9522727,8.18181818 C13.0454545,8.72727273 13.0454545,9.36363636 13.0454545,10 Z M10.25,18.1818182 C9.41136364,18.1818182 8.29318182,16.4545455 7.73409091,13.6363636 L12.6727273,13.6363636 C12.2068182,16.4545455 11.0886364,18.1818182 10.25,18.1818182 Z M7.73409091,6.36363636 C8.29318182,3.54545455 9.41136364,1.81818182 10.25,1.81818182 C11.0886364,1.81818182 12.2068182,3.54545455 12.7659091,6.36363636 L7.73409091,6.36363636 Z M7.175,2.36363636 C6.61590909,3.45454545 6.15,4.90909091 5.87045455,6.36363636 L2.70227273,6.36363636 C3.63409091,4.54545455 5.21818182,3.18181818 7.175,2.36363636 Z M2.05,8.18181818 L5.59090909,8.18181818 C5.59090909,8.81818182 5.59090909,9.36363636 5.59090909,10 C5.59090909,10.6363636 5.59090909,11.1818182 5.68409091,11.8181818 L2.05,11.8181818 C1.95681818,11.2727273 1.86363636,10.6363636 1.86363636,10 C1.86363636,9.36363636 1.95681818,8.72727273 2.05,8.18181818 Z M2.70227273,13.6363636 L5.87045455,13.6363636 C6.15,15.0909091 6.52272727,16.5454545 7.08181818,17.6363636 C5.21818182,16.8181818 3.63409091,15.4545455 2.70227273,13.6363636 Z M13.325,17.6363636 C13.8840909,16.5454545 14.35,15.1818182 14.5363636,13.6363636 L17.7045455,13.6363636 C16.8659091,15.4545455 15.2818182,16.8181818 13.325,17.6363636 Z M18.45,11.8181818 L14.9090909,11.8181818 C15.0022727,11.1818182 15.0022727,10.6363636 15.0022727,10 C15.0022727,9.36363636 15.0022727,8.81818182 14.9090909,8.18181818 L18.45,8.18181818 C18.5431818,8.72727273 18.6363636,9.36363636 18.6363636,10 C18.6363636,10.6363636 18.5431818,11.2727273 18.45,11.8181818 Z" id="Shape"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/shadow.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/shadow.svg index 1a3b138b2d..b076f33e95 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/shadow.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/shadow.svg @@ -6,4 +6,4 @@ <g id="Icons-/-Toolbar-/-Shadow" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M6.99979618,18.810136 L9.18779618,20.999136 L7,21 L6.99979618,18.810136 Z M17,3 L17,7.312 L20.9997962,11.310136 L20.9997962,13.189136 L17,9.19 L17,11.311 L20.9997962,15.310136 L20.9997962,17.689136 L17,13.69 L17,15.812 L20.9997962,19.811136 L21,21 L19.8097962,20.999136 L15.81,17 L13.689,17 L17.6887962,20.999136 L15.3097962,20.999136 L11.31,17 L9.188,17 L13.1877962,20.999136 L11.3097962,20.999136 L7.311,17 L3,17 L3,3 L17,3 Z M21,7 L20.9997962,9.18913601 L18.8087962,6.99913601 L21,7 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/texture.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/texture.svg index d7343cd6f3..366c0883a1 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/texture.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/texture.svg @@ -7,4 +7,4 @@ <path d="M14.550959,11.6 L12,8.6 L11,9.6 L8,6.6 L3.46109347,11.6 L3.46109347,14.5401062 L14.550959,14.5401062 L14.550959,11.6 Z M13.5,3 C14.3284271,3 15,3.67157288 15,4.5 C15,5.32842712 14.3284271,6 13.5,6 C12.6715729,6 12,5.32842712 12,4.5 C12,3.67157288 12.6715729,3 13.5,3 Z M0,1.77635684e-15 L0,18 L18,18 L18,1.77635684e-15 L0,1.77635684e-15 Z M16,16 L2,16 L2,2 L16,2 L16,16 Z" id="Shape"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/toneMapping.svg b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/toneMapping.svg index 17d2df0d66..2204558331 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/toneMapping.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/Icons/toneMapping.svg @@ -11,4 +11,4 @@ <rect id="Rectangle" fill="#FFFFFF" x="5" y="3" width="16" height="2"></rect> <rect id="Rectangle" fill="#FFFFFF" x="19" y="3" width="2" height="16"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/tool_dependencies.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/tool_dependencies.cmake index 7463c08ac4..36fe22de7c 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/tool_dependencies.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/tool_dependencies.cmake @@ -21,4 +21,4 @@ set(GEM_DEPENDENCIES Gem::AtomLyIntegration_CommonFeatures.Editor Gem::EditorPythonBindings.Editor Gem::ImageProcessingAtom.Editor -) \ No newline at end of file +) diff --git a/Gems/Atom/Tools/ShaderManagementConsole/preview.svg b/Gems/Atom/Tools/ShaderManagementConsole/preview.svg index 1a4f69e9e0..6f9bdb97da 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/preview.svg +++ b/Gems/Atom/Tools/ShaderManagementConsole/preview.svg @@ -6,4 +6,4 @@ <rect id="Rectangle" fill="#3D3D3D" x="0" y="0" width="140" height="80"></rect> <path d="M73.2408742,13.1546686 L73.5657106,13.2306181 C85.906012,14.8406656 95.5585578,24.701494 96.85234,37.1420953 L96.9210589,37.9069399 C96.9730868,38.3746085 97,38.8420235 97,39.306992 L96.9962868,39.5446661 L97,40 L97,40 C97,54.9727273 84.9727273,67 70,67 C55.0272727,67 43,54.9727273 43,40 C43,25.0272727 55.0272727,13 70,13 C70.4866296,13 70.9701478,13.0127046 71.4502429,13.0378021 C71.8438705,12.9761732 72.3100032,12.9915388 72.835667,13.0772753 L73.2408742,13.1546686 Z M70.4576271,50.5254237 L63.1355932,50.5263757 L63.30962,51.2793289 C64.9262977,57.9629917 67.8804497,62.1213112 70.2023411,62.4098089 L70.4576271,62.4237288 L70.4576271,50.5254237 Z M58.9293184,49.6101695 L50.3220339,49.6101695 L50.7601942,50.4306198 C53.3341147,55.0138675 57.4385142,58.4714946 62.220339,60.5932203 C61.0051929,58.1969183 60.1140858,55.1616025 59.4174021,51.9984838 L59.1650061,50.807322 L58.9293184,49.6101695 Z M70.4576271,34.9661017 L63.3777731,34.9681606 L63.2783387,35.6436273 C63.1956538,36.3347889 63.1602174,37.0702243 63.1450304,37.8246341 L63.1355932,38.5844316 L63.1355932,40.502373 C63.1394993,41.1392466 63.1512177,41.7687999 63.1863729,42.376392 L63.2586362,43.2694792 L63.3777731,44.1186441 L70.4576271,44.1181865 L70.4576271,34.9661017 Z M58.2914427,34.9661017 L48.1120298,34.9661017 L47.9534452,35.8154576 C47.7477139,36.979661 47.5762712,38.2610169 47.5762712,39.5423729 C47.5762712,40.5033898 47.6727077,41.4644068 47.8077189,42.376 L47.9534452,43.2692881 L48.1120298,44.1186441 L58.559322,44.1186441 L58.4285969,43.1814237 C58.3600198,42.5700339 58.3257313,41.9806102 58.308587,41.3838644 L58.2935858,40.4795932 L58.2914427,34.9661017 Z M70.4576271,17.5762712 C68.1852718,17.5762712 65.2077027,21.4954965 63.4946548,27.989603 L63.30962,28.7216983 L63.1355932,29.4745763 L70.4576271,29.4729105 L70.4576271,17.5762712 L70.4576271,17.5762712 Z M62.220339,19.4067797 C57.5932203,21.403698 53.7495292,24.5839753 51.2115505,28.7722993 L50.7511084,29.5693802 L50.3220339,30.3898305 L58.75,30.3898305 L58.9877182,29.192678 C59.7440042,25.6072111 60.8817797,22.1026194 62.220339,19.4067797 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Atom/Utils/CMakeLists.txt b/Gems/Atom/Utils/CMakeLists.txt index d96d812af0..20a680bce9 100644 --- a/Gems/Atom/Utils/CMakeLists.txt +++ b/Gems/Atom/Utils/CMakeLists.txt @@ -9,6 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) - add_subdirectory(Code) diff --git a/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake b/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake index d0c82daa29..1fdc846add 100644 --- a/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake +++ b/Gems/Atom/Utils/Code/Platform/Windows/platform_windows.cmake @@ -12,4 +12,4 @@ set(LY_BUILD_DEPENDENCIES PRIVATE 3rdParty::OpenImageIO -) \ No newline at end of file +) diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Bricks038_8K/bricks038.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Bricks038_8K/bricks038.material index faf8e1f734..25e29b55e5 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Bricks038_8K/bricks038.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Bricks038_8K/bricks038.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Materials/Bricks038_8K/Bricks038_8K_AmbientOcclusion.png" + "occlusion": { + "diffuseTextureMap": "Materials/Bricks038_8K/Bricks038_8K_AmbientOcclusion.png" }, "baseColor": { "color": [ @@ -38,4 +37,4 @@ "textureMap": "Materials/Bricks038_8K/Bricks038_8K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Concrete016_8K/Concrete016.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Concrete016_8K/Concrete016.material index 556e12eb41..336d479b30 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Concrete016_8K/Concrete016.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Concrete016_8K/Concrete016.material @@ -37,4 +37,4 @@ "textureMap": "Materials/Concrete016_8K/Concrete016_8K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric001_8K/Fabric001.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric001_8K/Fabric001.material index b28e35a9ea..72610e8bb6 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric001_8K/Fabric001.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric001_8K/Fabric001.material @@ -29,4 +29,4 @@ "textureMap": "Materials/Fabric001_8K/Fabric001_8K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric030_4K/Fabric030.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric030_4K/Fabric030.material index 1b56d295ca..458ab811b6 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric030_4K/Fabric030.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/Fabric030_4K/Fabric030.material @@ -30,4 +30,4 @@ "textureMap": "Materials/Fabric030_4K/Fabric030_4K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/PaintedPlaster015_8K/PaintedPlaster015.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/PaintedPlaster015_8K/PaintedPlaster015.material index ed0230a3ca..57163f520d 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/PaintedPlaster015_8K/PaintedPlaster015.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/PaintedPlaster015_8K/PaintedPlaster015.material @@ -4,10 +4,9 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "factor": 0.30000001192092898, - "textureMap": "Materials/PaintedPlaster015_8K/PaintedPlaster015_8K_AmbientOcclusion.png" + "occlusion": { + "diffuseFactor": 0.30000001192092898, + "diffuseTextureMap": "Materials/PaintedPlaster015_8K/PaintedPlaster015_8K_AmbientOcclusion.png" }, "baseColor": { "textureMap": "Materials/PaintedPlaster015_8K/PaintedPlaster015_8K_BaseColor.png" @@ -30,4 +29,4 @@ "textureMap": "Materials/PaintedPlaster015_8K/PaintedPlaster015_8K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/baseboards.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/baseboards.material index 233b35ab46..625d872475 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/baseboards.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/baseboards.material @@ -4,9 +4,6 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "textureMap": "Materials/Bricks038_8K/Bricks038_8K_AmbientOcclusion.png" - }, "baseColor": { "color": [ 0.496940553188324, @@ -44,4 +41,4 @@ "useThicknessMap": false } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/crown.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/crown.material index a5c18d0d8b..e3c6d9eae6 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/crown.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Materials/crown.material @@ -4,9 +4,6 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "textureMap": "Materials/Bricks038_8K/Bricks038_8K_AmbientOcclusion.png" - }, "baseColor": { "color": [ 0.496940553188324, @@ -35,4 +32,4 @@ "textureMap": "Materials/Concrete016_8K/Concrete016_8K_Roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/Lighthead_lightfacingemissive.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/Lighthead_lightfacingemissive.material index 80b1b4fa7c..21cb12a82c 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/Lighthead_lightfacingemissive.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/Lighthead_lightfacingemissive.material @@ -29,4 +29,4 @@ "transmissionScale": 1.8181817531585694 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_inner.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_inner.material index 91f3f6d1be..4921ff3051 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_inner.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_inner.material @@ -22,4 +22,4 @@ "factor": 0.25 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_outer1.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_outer1.material index 1270baf8d7..4cca9e9538 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_outer1.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_base_outer1.material @@ -22,4 +22,4 @@ "factor": 0.25 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_cornell_white.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_cornell_white.material index 974a8c87ec..d01303f3de 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_cornell_white.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_cornell_white.material @@ -22,4 +22,4 @@ "factor": 0.25 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapot.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapot.material index dd936d3732..b46dd709b1 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapot.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapot.material @@ -45,4 +45,4 @@ "subsurfaceScatterFactor": 0.5 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapotfeet.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapotfeet.material index 2100e371be..dadb080e8b 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapotfeet.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/PlayfulTeapot_playfulteapotfeet.material @@ -38,4 +38,4 @@ "tileV": 2.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_ceiling.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_ceiling.material index bc4b6d34d4..e0b3453735 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_ceiling.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_ceiling.material @@ -16,4 +16,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_green.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_green.material index 526ef422c5..00b2da857b 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_green.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_green.material @@ -17,4 +17,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_red.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_red.material index 526ef422c5..00b2da857b 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_red.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_red.material @@ -17,4 +17,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_white.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_white.material index 1817ad241b..8a8044d19b 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_white.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_cornell_white.material @@ -17,4 +17,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_crown.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_crown.material index c3ca35c73b..57991d40fb 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_crown.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_crown.material @@ -16,4 +16,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_floor.material b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_floor.material index b231de124b..0720d45c14 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_floor.material +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Assets/Objects/cornell_room_floor.material @@ -16,4 +16,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Cmd.bat b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Cmd.bat index 7af7cbf98b..2056a5bf44 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Cmd.bat +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Cmd.bat @@ -46,4 +46,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Maya_2020.bat b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Maya_2020.bat index 149ccb1a7f..fab2bb21fd 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Maya_2020.bat +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_Maya_2020.bat @@ -67,4 +67,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_WingIDE-7-1.bat b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_WingIDE-7-1.bat index a485440215..9f143fd889 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_WingIDE-7-1.bat +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Launch_WingIDE-7-1.bat @@ -79,4 +79,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/LookDevelopmentStudioPixar/Project_Env.bat b/Gems/AtomContent/LookDevelopmentStudioPixar/Project_Env.bat index d1811a945c..74bc374ab8 100644 --- a/Gems/AtomContent/LookDevelopmentStudioPixar/Project_Env.bat +++ b/Gems/AtomContent/LookDevelopmentStudioPixar/Project_Env.bat @@ -71,4 +71,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/AnodizedMetal/anodized_metal.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/AnodizedMetal/anodized_metal.material index b05f7a2693..cb2c725678 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/AnodizedMetal/anodized_metal.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/AnodizedMetal/anodized_metal.material @@ -28,4 +28,4 @@ "factor": 0.24242420494556428 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Asphalt/asphalt.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Asphalt/asphalt.material index 565144e210..a004cefd18 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Asphalt/asphalt.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Asphalt/asphalt.material @@ -12,4 +12,4 @@ "textureMap": "Materials/Asphalt/asphalt_normal.jpg" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BasicFabric/basic_fabric.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BasicFabric/basic_fabric.material index cf273914bc..bf26749d3c 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BasicFabric/basic_fabric.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BasicFabric/basic_fabric.material @@ -22,4 +22,4 @@ "tileV": 1.5 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BrushedSteel/brushed_steel.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BrushedSteel/brushed_steel.material index 8479c4e2c7..0a98da1143 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BrushedSteel/brushed_steel.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/BrushedSteel/brushed_steel.material @@ -26,4 +26,4 @@ "tileV": 1.5 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/CarPaint/car_paint.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/CarPaint/car_paint.material index 0250dea58c..3cd0e542fa 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/CarPaint/car_paint.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/CarPaint/car_paint.material @@ -29,4 +29,4 @@ "factor": 0.3700000047683716 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Coal/coal.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Coal/coal.material index 1d5975fe73..78ceb399ee 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Coal/coal.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Coal/coal.material @@ -20,4 +20,4 @@ "textureMap": "Materials/Coal/coal_roughness.jpg" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/ConcreteStucco/concrete_stucco.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/ConcreteStucco/concrete_stucco.material index b2d224a1c0..ab9f366ff6 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/ConcreteStucco/concrete_stucco.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/ConcreteStucco/concrete_stucco.material @@ -29,4 +29,4 @@ "tileV": 0.4000000059604645 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Copper/copper.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Copper/copper.material index e1193b52de..4489e12c4d 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Copper/copper.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Copper/copper.material @@ -27,4 +27,4 @@ "subsurfaceScatterFactor": 0.9595959782600403 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Fabric/fabric.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Fabric/fabric.material index bdc23b2758..ff3a250b96 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Fabric/fabric.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Fabric/fabric.material @@ -14,4 +14,4 @@ "factor": 0.9595959782600403 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GalvanizedSteel/galvanized_steel.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GalvanizedSteel/galvanized_steel.material index a12612009f..aca0648374 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GalvanizedSteel/galvanized_steel.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GalvanizedSteel/galvanized_steel.material @@ -18,4 +18,4 @@ "tileV": 2.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GlazedClay/glazed_clay.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GlazedClay/glazed_clay.material index 5d066d0f90..66f4dd7d00 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GlazedClay/glazed_clay.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/GlazedClay/glazed_clay.material @@ -35,4 +35,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gloss/gloss.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gloss/gloss.material index 152d04591a..ceaca4a274 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gloss/gloss.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gloss/gloss.material @@ -19,4 +19,4 @@ "factor": 0.06060609966516495 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gold/gold.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gold/gold.material index 9fefd0af70..b9ee3e5a12 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gold/gold.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Gold/gold.material @@ -23,4 +23,4 @@ "factor": 0.06060609966516495 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Ground/ground.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Ground/ground.material index 88db4c66e6..86f84d4c84 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Ground/ground.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Ground/ground.material @@ -16,4 +16,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Iron/iron.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Iron/iron.material index ad14ce8c00..d859a4a4cf 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Iron/iron.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Iron/iron.material @@ -22,4 +22,4 @@ "factor": 0.28282830119132998 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Leather/dark_leather.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Leather/dark_leather.material index 2f1283dbf1..6c14a0c7fe 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Leather/dark_leather.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Leather/dark_leather.material @@ -18,4 +18,4 @@ "tileV": 0.75 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Light_Leather/light_leather.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Light_Leather/light_leather.material index 58b9ceca83..1ae26a8e0d 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Light_Leather/light_leather.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Light_Leather/light_leather.material @@ -20,4 +20,4 @@ "tileV": 4.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MicrofiberFabric/microfiber_fabric.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MicrofiberFabric/microfiber_fabric.material index 3cddf1b16d..d2f5964457 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MicrofiberFabric/microfiber_fabric.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MicrofiberFabric/microfiber_fabric.material @@ -20,4 +20,4 @@ "tileV": 0.25 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MixedStones/mixed_stones.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MixedStones/mixed_stones.material index 918c25bac7..b6dea22b24 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MixedStones/mixed_stones.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/MixedStones/mixed_stones.material @@ -19,4 +19,4 @@ "useTexture": false } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Nickle/nickle.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Nickle/nickle.material index ceb9052b4d..82ff63aa20 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Nickle/nickle.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Nickle/nickle.material @@ -22,4 +22,4 @@ "factor": 0.16161620616912843 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plaster/plaster.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plaster/plaster.material index 3bbe54d24f..3121fdac24 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plaster/plaster.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plaster/plaster.material @@ -41,4 +41,4 @@ "subsurfaceScatterFactor": 0.1414141058921814 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_01/plastic_01.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_01/plastic_01.material index a5c05ba43d..e953d04238 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_01/plastic_01.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_01/plastic_01.material @@ -38,4 +38,4 @@ "subsurfaceScatterFactor": 0.1414141058921814 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_02/plastic_02.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_02/plastic_02.material index e9c70e9afb..c30c3234c0 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_02/plastic_02.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_02/plastic_02.material @@ -19,4 +19,4 @@ "factor": 0.24242420494556428 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_03/plastic_03.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_03/plastic_03.material index 4eeead064e..433c56251d 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_03/plastic_03.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Plastic_03/plastic_03.material @@ -22,4 +22,4 @@ "factor": 0.5353534817695618 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Platinum/platinum.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Platinum/platinum.material index 0f90bc55f5..6613a21f2c 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Platinum/platinum.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Platinum/platinum.material @@ -26,4 +26,4 @@ "factor": 0.18181820213794709 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Porcelain/porcelain.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Porcelain/porcelain.material index 0a3b7c71aa..cef8ed194e 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Porcelain/porcelain.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Porcelain/porcelain.material @@ -16,4 +16,4 @@ "factor": 0.07070709764957428 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/RotaryBrushedSteel/rotary_brushed_steel.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/RotaryBrushedSteel/rotary_brushed_steel.material index bfe4ac5d4d..866c18d650 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/RotaryBrushedSteel/rotary_brushed_steel.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/RotaryBrushedSteel/rotary_brushed_steel.material @@ -23,4 +23,4 @@ "factor": 0.12121210247278214 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Rust/rust.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Rust/rust.material index 62a0a4b3b0..f6f2bdc52b 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Rust/rust.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Rust/rust.material @@ -14,4 +14,4 @@ "factor": 0.9191918969154358 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Suede/suede.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Suede/suede.material index f553334550..782ed7451c 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Suede/suede.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/Suede/suede.material @@ -15,4 +15,4 @@ "textureMap": "Materials/Suede/suede_roughness.jpg" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/TireRubber/tire_rubber.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/TireRubber/tire_rubber.material index 0a2c1f745b..2fc5cec7a4 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/TireRubber/tire_rubber.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/TireRubber/tire_rubber.material @@ -16,4 +16,4 @@ "factor": 0.5454545021057129 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WoodPlanks/wood_planks.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WoodPlanks/wood_planks.material index d651b1c1ac..91f89a0a1b 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WoodPlanks/wood_planks.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WoodPlanks/wood_planks.material @@ -15,4 +15,4 @@ "textureMap": "Materials/WoodPlanks/wood_planks_normal.jpg" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WornMetal/warn_metal.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WornMetal/warn_metal.material index a2ffa2b861..cfdba2d2ef 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WornMetal/warn_metal.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/WornMetal/warn_metal.material @@ -21,4 +21,4 @@ "tileV": 1.5 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/black.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/black.material index d36cec6599..56759107c9 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/black.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/black.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/blue.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/blue.material index a7cb8b02af..4691b674e0 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/blue.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/blue.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/green.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/green.material index ddd36fedba..6e118ddc7c 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/green.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/green.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/grey.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/grey.material index e9d67d6d3d..82e8b17127 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/grey.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/grey.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/red.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/red.material index f5626a3bd6..2527f82148 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/red.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/red.material @@ -13,4 +13,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/white.material b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/white.material index 2e4eee7f8e..bfb95933c4 100644 --- a/Gems/AtomContent/ReferenceMaterials/Assets/Materials/white.material +++ b/Gems/AtomContent/ReferenceMaterials/Assets/Materials/white.material @@ -3,4 +3,4 @@ "materialType": "Materials/Types/StandardPBR.materialtype", "parentMaterial": "", "propertyLayoutVersion": 3 -} \ No newline at end of file +} diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat b/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat index 7af7cbf98b..2056a5bf44 100644 --- a/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat +++ b/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat @@ -46,4 +46,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat b/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat index 149ccb1a7f..fab2bb21fd 100644 --- a/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat +++ b/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat @@ -67,4 +67,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat b/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat index a485440215..9f143fd889 100644 --- a/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat +++ b/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat @@ -79,4 +79,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/Project_Env.bat b/Gems/AtomContent/ReferenceMaterials/Project_Env.bat index e49685ffc1..ac61e4ac9a 100644 --- a/Gems/AtomContent/ReferenceMaterials/Project_Env.bat +++ b/Gems/AtomContent/ReferenceMaterials/Project_Env.bat @@ -70,4 +70,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material b/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material index dba44f7b49..c8e9f1f8f7 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material +++ b/Gems/AtomContent/Sponza/Assets/objects/lightBlocker_lambert1.material @@ -16,4 +16,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material index da72f8a430..1102fb150a 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_arch.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/arch_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/arch_1k_ao.png" }, "baseColor": { "color": [ @@ -48,4 +47,4 @@ "textureMap": "Textures/arch_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material index 5a195fd0b6..c1853250d7 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_background.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/background_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/background_1k_ao.png" }, "baseColor": { "color": [ @@ -54,4 +53,4 @@ "textureMap": "Textures/background_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material index d2089b5537..a269098b4d 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_bricks.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/bricks_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/bricks_1k_ao.png" }, "baseColor": { "color": [ @@ -53,4 +52,4 @@ "textureMap": "Textures/bricks_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material index 40e476305d..94225cd00e 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_ceiling.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/ceiling_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/ceiling_1k_ao.png" }, "baseColor": { "textureBlendMode": "Lerp", @@ -55,4 +54,4 @@ "textureMap": "Textures/ceiling_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material index 4e39112383..223bd0a24f 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_chain.material @@ -40,4 +40,4 @@ "factor": 0.4000000059604645 } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material index 6c89c94021..8f1cea8649 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columna.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/columnA_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/columnA_1k_ao.png" }, "baseColor": { "color": [ @@ -54,4 +53,4 @@ "textureMap": "Textures/columnA_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material index 0be26ba553..ac474d7e76 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnb.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/columnB_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/columnB_1k_ao.png" }, "baseColor": { "color": [ @@ -53,4 +52,4 @@ "textureMap": "Textures/columnB_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material index 2f1512fa4a..81fd03fc4a 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_columnc.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/columnC_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/columnC_1k_ao.png" }, "baseColor": { "color": [ @@ -54,4 +53,4 @@ "textureMap": "Textures/columnC_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material index e68bc7a41a..351091e48a 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainblue.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/curtain_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/curtain_ao.png" }, "baseColor": { "color": [ @@ -45,4 +44,4 @@ "enableMultiScatterCompensation": true } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material index 85a5ef9775..ab656cf3dc 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtaingreen.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/curtain_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/curtain_ao.png" }, "baseColor": { "color": [ @@ -42,4 +41,4 @@ "textureMap": "Textures/curtain_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material index 086f34727c..e9d00dbac0 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_curtainred.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/curtain_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/curtain_ao.png" }, "baseColor": { "color": [ @@ -47,4 +46,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material index 18bd2a307b..fde599fd4c 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_details.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/details_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/details_1k_ao.png" }, "baseColor": { "color": [ @@ -45,4 +44,4 @@ "textureMap": "Textures/details_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material index fb0490f9a9..0f7331c344 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricblue.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/fabric_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/fabric_ao.png" }, "baseColor": { "color": [ @@ -42,4 +41,4 @@ "textureMap": "Textures/fabric_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material index c6074bf894..9150a3caa5 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricgreen.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/fabric_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/fabric_ao.png" }, "baseColor": { "color": [ @@ -42,4 +41,4 @@ "textureMap": "Textures/fabric_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material index 4215d8dde5..b697e91b28 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_fabricred.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/fabric_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/fabric_ao.png" }, "baseColor": { "color": [ @@ -42,4 +41,4 @@ "textureMap": "Textures/fabric_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material index cbba302103..e50e8a0ed2 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_flagpole.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/flagpole_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/flagpole_1k_ao.png" }, "baseColor": { "color": [ @@ -51,4 +50,4 @@ "enableMultiScatterCompensation": true } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material index 2c2abe3931..064a2b24a6 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_floor.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/floor_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/floor_1k_ao.png" }, "baseColor": { "color": [ @@ -50,4 +49,4 @@ "textureMap": "Textures/floor_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material index 4508a68f3f..269e1e5684 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_leaf.material @@ -67,4 +67,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material index 55f44b2f63..8dc4852b03 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_lion.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/lion_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/lion_1k_ao.png" }, "baseColor": { "color": [ @@ -52,4 +51,4 @@ "enableMultiScatterCompensation": true } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material index a64486309d..0a7246703c 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_roof.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/roof_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/roof_1k_ao.png" }, "baseColor": { "color": [ @@ -42,4 +41,4 @@ "textureMap": "Textures/roof_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material index 867943642e..77adc798a0 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vase.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/vase_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/vase_1k_ao.png" }, "baseColor": { "color": [ @@ -51,4 +50,4 @@ "enableMultiScatterCompensation": true } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material index 9e96fb983d..22e78f03ae 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vasehanging.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/vaseHanging_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/vaseHanging_1k_ao.png" }, "baseColor": { "color": [ @@ -48,4 +47,4 @@ "textureMap": "Textures/vaseHanging_1k_roughness.png" } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material index c5bfe5c6b4..37d9e2c01c 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseplant.material @@ -48,4 +48,4 @@ ] } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material index ebb4e537f5..c773146b51 100644 --- a/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material +++ b/Gems/AtomContent/Sponza/Assets/objects/sponza_mat_vaseround.material @@ -4,9 +4,8 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Textures/vaseRound_1k_ao.png" + "occlusion": { + "diffuseTextureMap": "Textures/vaseRound_1k_ao.png" }, "baseColor": { "color": [ @@ -55,4 +54,4 @@ "enableMultiScatterCompensation": true } } -} \ No newline at end of file +} diff --git a/Gems/AtomContent/Sponza/Launch_Cmd.bat b/Gems/AtomContent/Sponza/Launch_Cmd.bat index 537380dafa..f69d4ef49c 100644 --- a/Gems/AtomContent/Sponza/Launch_Cmd.bat +++ b/Gems/AtomContent/Sponza/Launch_Cmd.bat @@ -44,4 +44,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/Sponza/Launch_Maya_2020.bat b/Gems/AtomContent/Sponza/Launch_Maya_2020.bat index c6368c7191..224d8c15d0 100644 --- a/Gems/AtomContent/Sponza/Launch_Maya_2020.bat +++ b/Gems/AtomContent/Sponza/Launch_Maya_2020.bat @@ -64,4 +64,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomContent/Sponza/Launch_WingIDE-7-1.bat b/Gems/AtomContent/Sponza/Launch_WingIDE-7-1.bat index 3e2d4bd9cb..f73fb640d5 100644 --- a/Gems/AtomContent/Sponza/Launch_WingIDE-7-1.bat +++ b/Gems/AtomContent/Sponza/Launch_WingIDE-7-1.bat @@ -79,4 +79,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomContent/Sponza/Project_Env.bat b/Gems/AtomContent/Sponza/Project_Env.bat index 46d4663c34..b06acfaa9a 100644 --- a/Gems/AtomContent/Sponza/Project_Env.bat +++ b/Gems/AtomContent/Sponza/Project_Env.bat @@ -68,4 +68,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl index 154927cf27..119b9ce517 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.azsl @@ -103,4 +103,4 @@ PSOutput MainPS(VSOutput IN) OUT.m_color.a = opacity; return OUT; -}; \ No newline at end of file +}; diff --git a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist index 04a55021b2..0f958e546b 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist +++ b/Gems/AtomLyIntegration/AtomBridge/Assets/Shaders/SimpleTextured.shadervariantlist @@ -23,4 +23,4 @@ } } ] -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Include/AtomBridge/AtomBridgeBus.h b/Gems/AtomLyIntegration/AtomBridge/Code/Include/AtomBridge/AtomBridgeBus.h index b3026b7352..ac27006b71 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Include/AtomBridge/AtomBridgeBus.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Include/AtomBridge/AtomBridgeBus.h @@ -30,4 +30,4 @@ namespace AZ }; using AtomBridgeRequestBus = AZ::EBus<AtomBridgeRequests>; } // namespace AtomBridge -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeModule.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeModule.cpp index 66b1a60417..6d805189bc 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeModule.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeModule.cpp @@ -46,4 +46,4 @@ namespace AZ // The first parameter should be GemName_GemIdLower // The second should be the fully qualified name of the class above AZ_DECLARE_MODULE_CLASS(Gem_Atom_AtomBridge, AZ::AtomBridge::Module) -#endif \ No newline at end of file +#endif diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/BuilderComponent.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/BuilderComponent.cpp index ef4c390fe0..b6ff2cb66d 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/BuilderComponent.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/BuilderComponent.cpp @@ -41,7 +41,6 @@ namespace AZ BuilderComponent::~BuilderComponent() { - AZ::Component::~Component(); AZ::Interface<AzFramework::AtomActiveInterface>::Unregister(this); } diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h index 96f5e09fc3..8e60cc2055 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h @@ -277,11 +277,11 @@ namespace AZ void ScaleCoord(const RHI::Viewport& viewport, float& x, float& y) const; - void InitDefaultWindowContext(); - void InitDefaultViewportContext(); - void OnBootstrapSceneReady(AZ::RPI::Scene* bootstrapScene) override; + RPI::WindowContextSharedPtr GetDefaultWindowContext() const; + RPI::ViewportContextPtr GetDefaultViewportContext() const; + private: static constexpr uint32_t NumBuffers = 2; static constexpr float WindowScaleWidth = 800.0f; @@ -294,9 +294,6 @@ namespace AZ size_t m_fontBufferSize = 0; unsigned char* m_fontBuffer = nullptr; - AZStd::shared_ptr<RPI::WindowContext> m_defaultWindowContext; - AZStd::shared_ptr<AZ::RPI::ViewportContext> m_defaultViewportContext; - AZ::Data::Instance<AZ::RPI::StreamingImage> m_fontStreamingImage; AZ::RHI::Ptr<AZ::RHI::Image> m_fontImage; uint32_t m_fontImageVersion = 0; @@ -304,7 +301,13 @@ namespace AZ AtomFont* m_atomFont = nullptr; bool m_fontTexDirty = false; - bool m_fontInitialized = false; + enum class InitializationState : AZ::u8 + { + Uninitialized, + Initializing, + Initialized + }; + AZStd::atomic<InitializationState> m_fontInitializationState = InitializationState::Uninitialized; FontEffects m_effects; @@ -345,26 +348,4 @@ namespace AZ } } -inline void AZ::FFont::InitDefaultWindowContext() -{ - if (!m_defaultWindowContext) - { - // font is created before window & viewport in the editor so need to do late init - // TODO need to deal with multiple windows, such as the editor - AZ::Render::Bootstrap::DefaultWindowBus::BroadcastResult(m_defaultWindowContext, &AZ::Render::Bootstrap::DefaultWindowInterface::GetDefaultWindowContext); - AZ_Assert(m_defaultWindowContext, "Unable to get the main window context"); - } -} - -inline void AZ::FFont::InitDefaultViewportContext() -{ - if (!m_defaultViewportContext) - { - // font is created before window & viewport in the editor so need to do late init - auto viewContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); - m_defaultViewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName()); - AZ_Assert(m_defaultViewportContext, "Unable to get the viewport context"); - } -} - #endif diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontCommon.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontCommon.h index 24e7564189..eb8581324e 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontCommon.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontCommon.h @@ -46,4 +46,4 @@ namespace AZ x2 = 1, x4 = 2, }; -}; \ No newline at end of file +}; diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp index d32302a07b..20879876e7 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp @@ -84,19 +84,35 @@ AZ::FFont::FFont(AtomFont* atomFont, const char* fontName) AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); } +AZ::RPI::ViewportContextPtr AZ::FFont::GetDefaultViewportContext() const +{ + auto viewContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); + return viewContextManager->GetDefaultViewportContext(); +} + +AZ::RPI::WindowContextSharedPtr AZ::FFont::GetDefaultWindowContext() const +{ + if (auto defaultViewportContext = GetDefaultViewportContext()) + { + return defaultViewportContext->GetWindowContext(); + } + return {}; +} bool AZ::FFont::InitFont() { - if (m_fontInitialized) + auto initializationState = InitializationState::Uninitialized; + // Do an atomic transition to Initializing if we're in the Uninitialized state. + // Otherwise, check the current state. + // If we're Initialized, there's no more work to be done, return true to indicate we're good to go. + // If we're Initializing (on another thread), return false to let the consumer know it's not safe for us to be used yet. + if (!m_fontInitializationState.compare_exchange_strong(initializationState, InitializationState::Initializing)) { - return true; + return initializationState == InitializationState::Initialized; } - InitDefaultWindowContext(); - InitDefaultViewportContext(); - // Create and initialize DynamicDrawContext for font draw - AZ::RPI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw = m_atomFont->GetOrCreateDynamicDrawForScene(m_defaultViewportContext->GetRenderScene().get()); + AZ::RPI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw = m_atomFont->GetOrCreateDynamicDrawForScene(GetDefaultViewportContext()->GetRenderScene().get()); // Save draw srg input indices for later use Data::Instance<RPI::ShaderResourceGroup> drawSrg = dynamicDraw->NewDrawSrg(); @@ -117,7 +133,7 @@ bool AZ::FFont::InitFont() m_vertexCount = 0; m_indexCount = 0; - m_fontInitialized = true; + m_fontInitializationState = InitializationState::Initialized; return true; } @@ -259,7 +275,7 @@ void AZ::FFont::DrawString(float x, float y, const char* str, const bool asciiMu return; } - DrawStringUInternal(m_defaultWindowContext->GetViewport(), m_defaultViewportContext.get(), x, y, 1.0f, str, asciiMultiLine, ctx); + DrawStringUInternal(GetDefaultWindowContext()->GetViewport(), GetDefaultViewportContext().get(), x, y, 1.0f, str, asciiMultiLine, ctx); } void AZ::FFont::DrawString(float x, float y, float z, const char* str, const bool asciiMultiLine, const TextDrawContext& ctx) @@ -269,7 +285,7 @@ void AZ::FFont::DrawString(float x, float y, float z, const char* str, const boo return; } - DrawStringUInternal(m_defaultWindowContext->GetViewport(), m_defaultViewportContext.get(), x, y, z, str, asciiMultiLine, ctx); + DrawStringUInternal(GetDefaultWindowContext()->GetViewport(), GetDefaultViewportContext().get(), x, y, z, str, asciiMultiLine, ctx); } void AZ::FFont::DrawStringUInternal( @@ -282,6 +298,12 @@ void AZ::FFont::DrawStringUInternal( const bool asciiMultiLine, const TextDrawContext& ctx) { + // Lazily ensure we're initialized before attempting to render. + if (!InitFont()) + { + return; + } + if (!str || !m_vertexBuffer // vertex buffer isn't created until BootstrapScene is ready, Editor tries to render text before that. || !m_fontTexture @@ -400,7 +422,7 @@ Vec2 AZ::FFont::GetTextSize(const char* str, const bool asciiMultiLine, const Te return Vec2(0.0f, 0.0f); } - return GetTextSizeUInternal(m_defaultWindowContext->GetViewport(), str, asciiMultiLine, ctx); + return GetTextSizeUInternal(GetDefaultWindowContext()->GetViewport(), str, asciiMultiLine, ctx); } Vec2 AZ::FFont::GetTextSizeUInternal( @@ -746,7 +768,7 @@ uint32_t AZ::FFont::WriteTextQuadsToBuffers(SVF_P2F_C4B_T2F_F4B* verts, uint16_t return true; }; - CreateQuadsForText(m_defaultWindowContext->GetViewport(), x, y, z, str, asciiMultiLine, ctx, AddQuad); + CreateQuadsForText(GetDefaultWindowContext()->GetViewport(), x, y, z, str, asciiMultiLine, ctx, AddQuad); return numQuadsWritten; } @@ -1438,7 +1460,7 @@ void AZ::FFont::AddCharsToFontTexture(const char* chars, int glyphSizeX, int gly Vec2 AZ::FFont::GetKerning(uint32_t leftGlyph, uint32_t rightGlyph, const TextDrawContext& ctx) const { - return GetKerningInternal(m_defaultWindowContext->GetViewport(), leftGlyph, rightGlyph, ctx); + return GetKerningInternal(GetDefaultWindowContext()->GetViewport(), leftGlyph, rightGlyph, ctx); } Vec2 AZ::FFont::GetKerningInternal(const RHI::Viewport& viewport, uint32_t leftGlyph, uint32_t rightGlyph, const TextDrawContext& ctx) const @@ -1454,7 +1476,7 @@ float AZ::FFont::GetAscender(const TextDrawContext& ctx) const float AZ::FFont::GetBaseline(const TextDrawContext& ctx) const { - return GetBaselineInternal(m_defaultWindowContext->GetViewport(), ctx); + return GetBaselineInternal(GetDefaultWindowContext()->GetViewport(), ctx); } float AZ::FFont::GetBaselineInternal(const RHI::Viewport& viewport, const TextDrawContext& ctx) const @@ -1496,7 +1518,7 @@ bool AZ::FFont::UpdateTexture() { using namespace AZ; - if (!m_fontInitialized || !m_fontImage) + if (m_fontInitializationState != InitializationState::Initialized || !m_fontImage) { return false; } @@ -1564,7 +1586,7 @@ void AZ::FFont::Prepare(const char* str, bool updateTexture, const AtomFont::Gly const bool rerenderGlyphs = m_sizeBehavior == SizeBehavior::Rerender; const AtomFont::GlyphSize usedGlyphSize = rerenderGlyphs ? glyphSize : AtomFont::defaultGlyphSize; bool texUpdateNeeded = m_fontTexture->PreCacheString(str, nullptr, m_sizeRatio, usedGlyphSize, m_fontHintParams) == 1 || m_fontTexDirty; - if (m_fontInitialized && updateTexture && texUpdateNeeded && m_fontImage) + if (m_fontInitializationState == InitializationState::Initialized && updateTexture && texUpdateNeeded && m_fontImage) { UpdateTexture(); m_fontTexDirty = false; diff --git a/Gems/AtomLyIntegration/CMakeLists.txt b/Gems/AtomLyIntegration/CMakeLists.txt index 66887ce307..57bb860a9e 100644 --- a/Gems/AtomLyIntegration/CMakeLists.txt +++ b/Gems/AtomLyIntegration/CMakeLists.txt @@ -15,5 +15,4 @@ add_subdirectory(AtomImGuiTools) add_subdirectory(EMotionFXAtom) add_subdirectory(AtomFont) add_subdirectory(TechnicalArt) -add_subdirectory(CryRenderAtomShim) add_subdirectory(AtomBridge) diff --git a/Gems/AtomLyIntegration/CommonFeatures/AssetProcessorGemConfig.setreg b/Gems/AtomLyIntegration/CommonFeatures/AssetProcessorGemConfig.setreg index e43b0dea2d..4ea30bd012 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/AssetProcessorGemConfig.setreg +++ b/Gems/AtomLyIntegration/CommonFeatures/AssetProcessorGemConfig.setreg @@ -10,4 +10,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyActorComponentConverter.py b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyActorComponentConverter.py index 4555dd6905..d9f096f797 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyActorComponentConverter.py +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyActorComponentConverter.py @@ -81,4 +81,4 @@ class Actor_Component_Converter(Component_Converter): def reset(self): self.oldMaterialRelativePath = "" - self.oldFbxRelativePathWithoutExtension = "" \ No newline at end of file + self.oldFbxRelativePathWithoutExtension = "" diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyMaterialComponentConverter.py b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyMaterialComponentConverter.py index 196534fc83..985c5eb7f4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyMaterialComponentConverter.py +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyMaterialComponentConverter.py @@ -264,4 +264,4 @@ class Material_Component_Converter(object): materialList.append(Material_Assignment_Info(slot, assignment)) - return materialList \ No newline at end of file + return materialList diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyPointLightComponentConverter.py b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyPointLightComponentConverter.py index 7262bd24f8..0ace34743a 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyPointLightComponentConverter.py +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Editor/Scripts/LegacyContentConversion/LegacyPointLightComponentConverter.py @@ -223,4 +223,4 @@ class Point_Light_Component_Converter(Component_Converter): def reset(self): self.color = "" self.diffuse_multiplier = "" - self.point_max_distance = "" \ No newline at end of file + self.point_max_distance = "" diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/EnvHDRi/photo_studio_01.lightingconfig.json b/Gems/AtomLyIntegration/CommonFeatures/Assets/EnvHDRi/photo_studio_01.lightingconfig.json index d3472a5f2f..7c36785a2b 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/EnvHDRi/photo_studio_01.lightingconfig.json +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/EnvHDRi/photo_studio_01.lightingconfig.json @@ -125,4 +125,4 @@ "shadowCatcherOpacity": 0.15000000596046449 } ] -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material index 61a9974e0b..58f195e78b 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_brass.material @@ -4,9 +4,8 @@ "parentMaterial": "Materials/Presets/PBR/metal_brass.material", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Objects/Lucy/Lucy_ao.tif" + "occlusion": { + "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif" }, "baseColor": { "color": [ @@ -31,4 +30,4 @@ "textureMap": "Objects/Lucy/Lucy_brass_roughness.tif" } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material index d48cb44721..1ed516a864 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/lucy_stone.material @@ -4,9 +4,8 @@ "parentMaterial": "Materials/Presets/PBR/metal_brass.material", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "enable": true, - "textureMap": "Objects/Lucy/Lucy_ao.tif" + "occlusion": { + "diffuseTextureMap": "Objects/Lucy/Lucy_ao.tif" }, "baseColor": { "color": [ @@ -31,4 +30,4 @@ "textureMap": "Objects/Lucy/Lucy_stone_roughness.tif" } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentBus.h index 8a807cc804..57710a7ede 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentBus.h @@ -51,4 +51,4 @@ namespace AZ using GridComponentNotificationBus = EBus<GridComponentNotifications>; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConfig.h index b0ae1ae927..725f52ea16 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConfig.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConfig.h @@ -39,4 +39,4 @@ namespace AZ AZ::Color m_secondaryColor = AZ::Color(0.5f, 0.5f, 0.5f, 1.0f); }; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConstants.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConstants.h index 091a695284..ae88ed8917 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConstants.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Grid/GridComponentConstants.h @@ -19,4 +19,4 @@ namespace AZ static constexpr const char* const GridComponentTypeId = "{27ACB2B3-C889-4DA5-BD27-E8C45CFBCFD6}"; static constexpr const char* const EditorGridComponentTypeId = "{DF2D071A-EC31-428A-9FD0-2B8A59945417}"; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ImageBasedLights/ImageBasedLightComponentConstants.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ImageBasedLights/ImageBasedLightComponentConstants.h index 6436302847..deef52b7b7 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ImageBasedLights/ImageBasedLightComponentConstants.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ImageBasedLights/ImageBasedLightComponentConstants.h @@ -19,4 +19,4 @@ namespace AZ static constexpr const char* const ImageBasedLightComponentTypeId = "{33A1302F-A769-4D06-820A-096A4836A7E9}"; static constexpr const char* const EditorImageBasedLightComponentTypeId = "{6202F16C-DDF9-4026-9479-F5BDC621D372}"; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentConstants.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentConstants.h index e29a8df0e2..10622090cc 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentConstants.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentConstants.h @@ -19,4 +19,4 @@ namespace AZ static constexpr const char* const MaterialComponentTypeId = "{E5A56D7F-C63E-4080-BF62-01326AC60982}"; static constexpr const char* const EditorMaterialComponentTypeId = "{02B60E9D-470B-447D-A6EE-7D635B154183}"; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h index f12db2ec9d..65233a4847 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h @@ -27,7 +27,7 @@ namespace AZ { public: virtual void SetModelAsset(Data::Asset<RPI::ModelAsset> modelAsset) = 0; - virtual const Data::Asset<RPI::ModelAsset>& GetModelAsset() const = 0; + virtual Data::Asset<const RPI::ModelAsset> GetModelAsset() const = 0; virtual void SetModelAssetId(Data::AssetId modelAssetId) = 0; virtual Data::AssetId GetModelAssetId() const = 0; @@ -35,7 +35,7 @@ namespace AZ virtual void SetModelAssetPath(const AZStd::string& path) = 0; virtual AZStd::string GetModelAssetPath() const = 0; - virtual const Data::Instance<RPI::Model> GetModel() const = 0; + virtual Data::Instance<RPI::Model> GetModel() const = 0; virtual void SetSortKey(RHI::DrawItemSortKey sortKey) = 0; virtual RHI::DrawItemSortKey GetSortKey() const = 0; @@ -78,12 +78,15 @@ namespace AZ { AZ::EBusConnectionPolicy<Bus>::Connect(busPtr, context, handler, connectLock, id); + Data::Asset<RPI::ModelAsset> modelAsset; + MeshComponentRequestBus::EventResult(modelAsset, id, &MeshComponentRequestBus::Events::GetModelAsset); Data::Instance<RPI::Model> model; MeshComponentRequestBus::EventResult(model, id, &MeshComponentRequestBus::Events::GetModel); + if (model && - model->GetModelAsset().GetStatus() == AZ::Data::AssetData::AssetStatus::Ready) + modelAsset.GetStatus() == AZ::Data::AssetData::AssetStatus::Ready) { - handler->OnModelReady(model->GetModelAsset(), model); + handler->OnModelReady(modelAsset, model); } } }; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentConstants.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentConstants.h index e8b75f6a58..26932becca 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentConstants.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Mesh/MeshComponentConstants.h @@ -19,4 +19,4 @@ namespace AZ static constexpr const char* const MeshComponentTypeId = "{C7801FA8-3E82-4D40-B039-4854F1892FDE}"; static constexpr const char* const EditorMeshComponentTypeId = "{DCE68F6E-2E16-4CB4-A834-B6C2F900A7E9}"; } // namespace Render -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ReflectionProbe/EditorReflectionProbeBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ReflectionProbe/EditorReflectionProbeBus.h index d0f5374394..4293190356 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ReflectionProbe/EditorReflectionProbeBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/ReflectionProbe/EditorReflectionProbeBus.h @@ -33,4 +33,4 @@ namespace AZ using EditorReflectionProbeBus = AZ::EBus<EditorReflectionProbeInterface>; } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Resources/Icons/materialtype.svg b/Gems/AtomLyIntegration/CommonFeatures/Code/Resources/Icons/materialtype.svg index ee0164a328..98950e17b6 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Resources/Icons/materialtype.svg +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Resources/Icons/materialtype.svg @@ -9,4 +9,4 @@ </g> <path d="M22,20.8342395 C22,18.1069667 22,17.2661779 22,11.7433304 C22,6.22048287 22,5.379694 22,2.65242127 C22,-0.0748514543 12,6.28878491 12,11.7433304 C12,17.1978758 22,23.5615122 22,20.8342395 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero" transform="translate(17.000000, 11.743330) scale(-1, 1) translate(-17.000000, -11.743330) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp index c7d459c596..310e6e6eca 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp @@ -19,6 +19,9 @@ #include <AzCore/Component/TransformBus.h> #include <AzCore/Serialization/SerializeContext.h> #include <AzCore/std/containers/vector.h> +#include <Atom/RPI.Public/ViewportContext.h> +#include <Atom/RPI.Public/ViewportContextBus.h> +#include <Atom/RPI.Public/ViewProviderBus.h> namespace AZ { @@ -586,9 +589,11 @@ namespace AZ } else { - Camera::ActiveCameraRequestBus::BroadcastResult( - cameraTransform, - &Camera::ActiveCameraRequestBus::Events::GetActiveCameraTransform); + if (const auto& viewportContext = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get()->GetDefaultViewportContext()) + { + cameraTransform = viewportContext->GetCameraTransform(); + } + } if (cameraTransform == m_lastCameraTransform) { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp index 2758da2b38..54babd3bc1 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp @@ -93,7 +93,7 @@ namespace AZ::Render else { debugDisplay.DrawWireDisk(Vector3::CreateZero(), Vector3::CreateAxisZ(), radius); - debugDisplay.DrawArc(Vector3::CreateZero(), radius, 90.0f, 180.0f, -3.0f, 0); + debugDisplay.DrawArc(Vector3::CreateZero(), radius, 270.0f, 180.0f, 3.0f, 0); debugDisplay.DrawArc(Vector3::CreateZero(), radius, 0.0f, 180.0f, 3.0f, 1); } debugDisplay.PopMatrix(); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp index 38e41a74b4..2885978e1e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp @@ -203,6 +203,7 @@ namespace AZ propertyConfig.m_id = AZ::RPI::MaterialPropertyId(groupNameId, shaderInputStr).GetCStr(); propertyConfig.m_nameId = shaderInputStr; propertyConfig.m_displayName = shaderInputStr; + propertyConfig.m_groupName = groupDisplayName; propertyConfig.m_description = shaderInputStr; propertyConfig.m_defaultValue = uvName; propertyConfig.m_originalValue = uvName; @@ -247,6 +248,7 @@ namespace AZ AtomToolsFramework::ConvertToPropertyConfig(propertyConfig, propertyDefinition); propertyConfig.m_id = AZ::RPI::MaterialPropertyId(groupNameId, propertyDefinition.m_nameId).GetFullName(); + propertyConfig.m_groupName = groupDisplayName; const auto& propertyIndex = m_editData.m_materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyConfig.m_id); propertyConfig.m_defaultValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp index 2f74991756..9d63f4a4a9 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp @@ -98,7 +98,7 @@ namespace AZ ->Attribute(AZ::Edit::Attributes::DefaultAsset, &EditorMaterialComponentSlot::GetDefaultAssetId) ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &EditorMaterialComponentSlot::GetLabel) ->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true) - ->Attribute("ThumbnailWithDropDown", &EditorMaterialComponentSlot::OpenPopupMenu) + ->Attribute("ThumbnailCallback", &EditorMaterialComponentSlot::OpenPopupMenu) ; } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp index 82f65b205d..94dfb39419 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp @@ -100,6 +100,7 @@ namespace AZ AzToolsFramework::EditorMenuNotificationBus::Handler::BusConnect(); SetupThumbnails(); + m_materialBrowserInteractions.reset(aznew MaterialBrowserInteractions); } void EditorMaterialSystemComponent::Deactivate() @@ -111,6 +112,7 @@ namespace AZ AzToolsFramework::EditorMenuNotificationBus::Handler::BusDisconnect(); TeardownThumbnails(); + m_materialBrowserInteractions.reset(); if (m_openMaterialEditorAction) { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h index de065f679e..09ad1c1b9c 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h @@ -22,6 +22,8 @@ #include <AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h> +#include <Material/MaterialBrowserInteractions.h> + namespace AZ { namespace Render @@ -76,6 +78,8 @@ namespace AZ AzFramework::TargetInfo m_materialEditorTarget; QAction* m_openMaterialEditorAction = nullptr; + + AZStd::unique_ptr<MaterialBrowserInteractions> m_materialBrowserInteractions; }; } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp new file mode 100644 index 0000000000..82fa47a810 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp @@ -0,0 +1,54 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <AzCore/std/string/wildcard.h> +#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> +#include <AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h> +#include <Material/MaterialBrowserInteractions.h> + +namespace AZ +{ + namespace Render + { + MaterialBrowserInteractions::MaterialBrowserInteractions() + { + AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect(); + } + + MaterialBrowserInteractions::~MaterialBrowserInteractions() + { + AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); + } + + void MaterialBrowserInteractions::AddSourceFileOpeners(const char* fullSourceFileName, [[maybe_unused]] const AZ::Uuid& sourceUUID, AzToolsFramework::AssetBrowser::SourceFileOpenerList& openers) + { + if (HandlesSource(fullSourceFileName)) + { + openers.push_back( + { + "Material_Editor", + "Open in Material Editor...", + QIcon(), + [&](const char* fullSourceFileNameInCallback, [[maybe_unused]] const AZ::Uuid& sourceUUID) + { + EditorMaterialSystemComponentRequestBus::Broadcast(&EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, fullSourceFileNameInCallback); + } + }); + } + } + + bool MaterialBrowserInteractions::HandlesSource(AZStd::string_view fileName) const + { + return AZStd::wildcard_match("*.material", fileName.data()); + } + } // namespace Render +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.h new file mode 100644 index 0000000000..bd9791d3a5 --- /dev/null +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.h @@ -0,0 +1,52 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h> +#include <AzToolsFramework/SourceControl/SourceControlAPI.h> + +class QWidget; +class QMenu; +class QAction; + +namespace AzToolsFramework +{ + namespace AssetBrowser + { + class AssetBrowserEntry; + class SourceAssetBrowserEntry; + class FolderAssetBrowserEntry; + } +} + +namespace AZ +{ + namespace Render + { + class MaterialBrowserInteractions + : public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler + { + public: + AZ_CLASS_ALLOCATOR(MaterialBrowserInteractions, AZ::SystemAllocator, 0); + + MaterialBrowserInteractions(); + ~MaterialBrowserInteractions(); + + private: + //! AssetBrowserInteractionNotificationBus::Handler overrides... + void AddSourceFileOpeners(const char* fullSourceFileName, const AZ::Uuid& sourceUUID, AzToolsFramework::AssetBrowser::SourceFileOpenerList& openers) override; + + bool HandlesSource(AZStd::string_view fileName) const; + }; + } // namespace Render +} // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp index b9b0759dda..c9aa3a6d5e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/EditorMeshComponent.cpp @@ -137,9 +137,12 @@ namespace AZ AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); + AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + AZ::Vector3 ignoreNormal; - return m_controller.GetModel()->RayIntersection(transform, src, dir, distance, ignoreNormal); + return m_controller.GetModel()->RayIntersection(transform, nonUniformScale, src, dir, distance, ignoreNormal); } bool EditorMeshComponent::SupportsEditorRayIntersect() diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp index 88b0e812d2..9d2196de2b 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp @@ -188,6 +188,11 @@ namespace AZ m_meshFeatureProcessor = RPI::Scene::GetFeatureProcessorForEntity<MeshFeatureProcessorInterface>(m_entityId); AZ_Error("MeshComponentController", m_meshFeatureProcessor, "Unable to find a MeshFeatureProcessorInterface on the entityId."); + m_cachedNonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(m_cachedNonUniformScale, m_entityId, &AZ::NonUniformScaleRequests::GetScale); + AZ::NonUniformScaleRequestBus::Event(m_entityId, &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, + m_nonUniformScaleChangedHandler); + MeshComponentRequestBus::Handler::BusConnect(m_entityId); TransformNotificationBus::Handler::BusConnect(m_entityId); MaterialReceiverRequestBus::Handler::BusConnect(m_entityId); @@ -209,6 +214,8 @@ namespace AZ MaterialReceiverRequestBus::Handler::BusDisconnect(); MaterialComponentNotificationBus::Handler::BusDisconnect(); + m_nonUniformScaleChangedHandler.Disconnect(); + m_meshFeatureProcessor = nullptr; m_transformInterface = nullptr; m_entityId = AZ::EntityId(AZ::EntityId::InvalidEntityId); @@ -229,7 +236,16 @@ namespace AZ { if (m_meshFeatureProcessor) { - m_meshFeatureProcessor->SetTransform(m_meshHandle, world); + m_meshFeatureProcessor->SetTransform(m_meshHandle, world, m_cachedNonUniformScale); + } + } + + void MeshComponentController::HandleNonUniformScaleChange(const AZ::Vector3& nonUniformScale) + { + m_cachedNonUniformScale = nonUniformScale; + if (m_meshFeatureProcessor) + { + m_meshFeatureProcessor->SetTransform(m_meshHandle, m_transformInterface->GetWorldTM(), m_cachedNonUniformScale); } } @@ -252,12 +268,32 @@ namespace AZ } } + bool MeshComponentController::RequiresCloning(const Data::Asset<RPI::ModelAsset>& modelAsset) + { + // Is the model asset containing a cloth buffer? If yes, we need to clone the model asset for instancing. + const AZStd::array_view<AZ::Data::Asset<AZ::RPI::ModelLodAsset>> lodAssets = modelAsset->GetLodAssets(); + for (const AZ::Data::Asset<AZ::RPI::ModelLodAsset>& lodAsset : lodAssets) + { + const AZStd::array_view<AZ::RPI::ModelLodAsset::Mesh> meshes = lodAsset->GetMeshes(); + for (const AZ::RPI::ModelLodAsset::Mesh& mesh : meshes) + { + if (mesh.GetSemanticBufferAssetView(AZ::Name("CLOTH_DATA")) != nullptr) + { + return true; + } + } + } + + return false; + } + void MeshComponentController::HandleModelChange(Data::Instance<RPI::Model> model) { - if (model) + Data::Asset<RPI::ModelAsset> modelAsset = m_meshFeatureProcessor->GetModelAsset(m_meshHandle); + if (model && modelAsset) { - m_configuration.m_modelAsset = model->GetModelAsset(); - MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelReady, model->GetModelAsset(), model); + m_configuration.m_modelAsset = modelAsset; + MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelReady, m_configuration.m_modelAsset, model); MaterialReceiverNotificationBus::Event(m_entityId, &MaterialReceiverNotificationBus::Events::OnMaterialAssignmentsChanged); AzFramework::EntityBoundsUnionRequestBus::Broadcast( &AzFramework::EntityBoundsUnionRequestBus::Events::RefreshEntityLocalBoundsUnion, m_entityId); @@ -272,11 +308,13 @@ namespace AZ MaterialComponentRequestBus::EventResult(materials, m_entityId, &MaterialComponentRequests::GetMaterialOverrides); m_meshFeatureProcessor->ReleaseMesh(m_meshHandle); - m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_configuration.m_modelAsset, materials); + m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_configuration.m_modelAsset, materials, + /*skinnedMeshWithMotion=*/false, /*rayTracingEnabled=*/true, RequiresCloning); m_meshFeatureProcessor->ConnectModelChangeEventHandler(m_meshHandle, m_changeEventHandler); - const AZ::Transform& transform = m_transformInterface ? m_transformInterface->GetWorldTM() : Transform::Identity(); - m_meshFeatureProcessor->SetTransform(m_meshHandle, transform); + const AZ::Transform& transform = m_transformInterface ? m_transformInterface->GetWorldTM() : AZ::Transform::CreateIdentity(); + + m_meshFeatureProcessor->SetTransform(m_meshHandle, transform, m_cachedNonUniformScale); m_meshFeatureProcessor->SetSortKey(m_meshHandle, m_configuration.m_sortKey); m_meshFeatureProcessor->SetLodOverride(m_meshHandle, m_configuration.m_lodOverride); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_meshHandle, m_configuration.m_excludeFromReflectionCubeMaps); @@ -328,9 +366,9 @@ namespace AZ } } - const Data::Asset<RPI::ModelAsset>& MeshComponentController::GetModelAsset() const + Data::Asset<const RPI::ModelAsset> MeshComponentController::GetModelAsset() const { - return GetModel() ? GetModel()->GetModelAsset() : m_configuration.m_modelAsset; + return m_configuration.m_modelAsset; } Data::AssetId MeshComponentController::GetModelAssetId() const @@ -352,7 +390,7 @@ namespace AZ return assetPathString; } - const Data::Instance<RPI::Model> MeshComponentController::GetModel() const + Data::Instance<RPI::Model> MeshComponentController::GetModel() const { return m_meshFeatureProcessor ? m_meshFeatureProcessor->GetModel(m_meshHandle) : Data::Instance<RPI::Model>(); } @@ -413,7 +451,16 @@ namespace AZ Aabb MeshComponentController::GetLocalBounds() { const Data::Instance<RPI::Model> model = GetModel(); - return model ? model->GetAabb() : Aabb::CreateNull(); + if (model) + { + Aabb aabb = model->GetAabb(); + aabb.MultiplyByScale(m_cachedNonUniformScale); + return aabb; + } + else + { + return Aabb::CreateNull(); + } } } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h index 357f1ded6c..0cda34ea42 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h @@ -14,6 +14,7 @@ #include <AzCore/Component/Component.h> #include <AzCore/Component/TransformBus.h> +#include <AzCore/Component/NonUniformScaleBus.h> #include <AtomCore/Instance/InstanceDatabase.h> @@ -82,17 +83,16 @@ namespace AZ const MeshComponentConfig& GetConfiguration() const; private: - AZ_DISABLE_COPY(MeshComponentController); // MeshComponentRequestBus::Handler overrides ... void SetModelAsset(Data::Asset<RPI::ModelAsset> modelAsset) override; - const Data::Asset<RPI::ModelAsset>& GetModelAsset() const override; + Data::Asset<const RPI::ModelAsset> GetModelAsset() const override; void SetModelAssetId(Data::AssetId modelAssetId) override; Data::AssetId GetModelAssetId() const override; void SetModelAssetPath(const AZStd::string& modelAssetPath) override; AZStd::string GetModelAssetPath() const override; - const AZ::Data::Instance<RPI::Model> GetModel() const override; + AZ::Data::Instance<RPI::Model> GetModel() const override; void SetSortKey(RHI::DrawItemSortKey sortKey) override; RHI::DrawItemSortKey GetSortKey() const override; @@ -117,22 +117,37 @@ namespace AZ // MaterialComponentNotificationBus::Handler overrides ... void OnMaterialsUpdated(const MaterialAssignmentMap& materials) override; + //! Check if the model asset requires to be cloned (e.g. cloth) for unique model instances. + //! @param modelAsset The model asset to check. + //! @result True in case the model asset needs to be cloned before creating the model. False if there is a 1:1 relationship between + //! the model asset and the model and it is static and shared. In the second case the m_originalModelAsset of the mesh handle is + //! equal to the model asset that the model is linked to. + static bool RequiresCloning(const Data::Asset<RPI::ModelAsset>& modelAsset); + void HandleModelChange(Data::Instance<RPI::Model> model); void RegisterModel(); void UnregisterModel(); void RefreshModelRegistration(); + void HandleNonUniformScaleChange(const AZ::Vector3& nonUniformScale); + Render::MeshFeatureProcessorInterface* m_meshFeatureProcessor = nullptr; Render::MeshFeatureProcessorInterface::MeshHandle m_meshHandle; TransformInterface* m_transformInterface = nullptr; AZ::EntityId m_entityId; bool m_isVisible = true; MeshComponentConfig m_configuration; + AZ::Vector3 m_cachedNonUniformScale = AZ::Vector3::CreateOne(); MeshFeatureProcessorInterface::ModelChangedEvent::Handler m_changeEventHandler { [&](Data::Instance<RPI::Model> model) { HandleModelChange(model); } }; + + AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler + { + [&](const AZ::Vector3& nonUniformScale) { HandleNonUniformScaleChange(nonUniformScale); } + }; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp index eac4213867..976b8f4267 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.cpp @@ -53,16 +53,20 @@ namespace AZ ->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::PrimaryAssetType, AZ::AzTypeInfo<RPI::ModelAsset>::Uuid()) - ->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap") + ->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap Bake") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &EditorReflectionProbeComponent::m_useBakedCubemap, "Use Baked Cubemap", "Selects between a cubemap that captures the environment at location in the scene or a preauthored cubemap") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::OnUseBakedCubemapChanged) ->UIElement(AZ::Edit::UIHandlers::Button, "Bake Reflection Probe", "Bake Reflection Probe") ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "") ->Attribute(AZ::Edit::Attributes::ButtonText, "Bake Reflection Probe") ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::BakeReflectionProbe) ->Attribute(AZ::Edit::Attributes::Visibility, &EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting) + ->ClassElement(AZ::Edit::ClassElements::Group, "Cubemap") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &EditorReflectionProbeComponent::m_useBakedCubemap, "Use Baked Cubemap", "Selects between a cubemap that captures the environment at location in the scene or a preauthored cubemap") + ->Attribute(AZ::Edit::Attributes::ChangeValidate, &EditorReflectionProbeComponent::OnUseBakedCubemapValidate) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorReflectionProbeComponent::OnUseBakedCubemapChanged) ->DataElement(AZ::Edit::UIHandlers::MultiLineEdit, &EditorReflectionProbeComponent::m_bakedCubeMapRelativePath, "Baked Cubemap Path", "Baked Cubemap Path") ->Attribute(AZ::Edit::Attributes::ReadOnly, true) ->Attribute(AZ::Edit::Attributes::Visibility, &EditorReflectionProbeComponent::GetBakedCubemapVisibilitySetting) @@ -188,6 +192,16 @@ namespace AZ return false; } + AZ::Outcome<void, AZStd::string> EditorReflectionProbeComponent::OnUseBakedCubemapValidate([[maybe_unused]] void* newValue, [[maybe_unused]] const AZ::Uuid& valueType) + { + if (!m_controller.m_featureProcessor) + { + return AZ::Failure(AZStd::string("This Reflection Probe entity is hidden, it must be visible in order to change the cubemap type.")); + } + + return AZ::Success(); + } + AZ::u32 EditorReflectionProbeComponent::OnUseBakedCubemapChanged() { // save setting to the configuration diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h index 5b992ae5aa..eba9575ec4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/ReflectionProbe/EditorReflectionProbeComponent.h @@ -47,6 +47,9 @@ namespace AZ void DisplayEntityViewport(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; private: + // validation + AZ::Outcome<void, AZStd::string> OnUseBakedCubemapValidate(void* newValue, const AZ::Uuid& valueType); + // change notifications AZ::u32 OnUseBakedCubemapChanged(); AZ::u32 OnAuthoredCubemapChanged(); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake b/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake index f77b175cd7..ff8f33e06e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/atomlyintegration_commonfeatures_editor_files.cmake @@ -41,6 +41,8 @@ set(FILES Source/Material/EditorMaterialModelUvNameMapInspector.h Source/Material/EditorMaterialSystemComponent.cpp Source/Material/EditorMaterialSystemComponent.h + Source/Material/MaterialBrowserInteractions.h + Source/Material/MaterialBrowserInteractions.cpp Source/Material/MaterialThumbnail.cpp Source/Material/MaterialThumbnail.h Source/Mesh/EditorMeshComponent.h @@ -110,4 +112,4 @@ set(FILES Source/SurfaceData/EditorSurfaceDataMeshComponent.cpp Source/SurfaceData/EditorSurfaceDataMeshComponent.h Resources/AtomLyIntegrationResources.qrc -) \ No newline at end of file +) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_CRELensOptics.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_CRELensOptics.cpp deleted file mode 100644 index 7b642b95e7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_CRELensOptics.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" -#include "../Common/RendElements/CRELensOptics.h" - - -CRELensOptics::CRELensOptics(void) -{ - mfSetType(eDATA_LensOptics); - mfUpdateFlags(FCEF_TRANSFORM); -} -CRELensOptics::~CRELensOptics(void) {} - -bool CRELensOptics::mfCompile([[maybe_unused]] CParserBin& Parser, [[maybe_unused]] SParserFrame& Frame){ return true; } - -void CRELensOptics::mfPrepare([[maybe_unused]] bool bCheckOverflow) {} - -bool CRELensOptics::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) { return true; } \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_DevBuffer.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_DevBuffer.cpp deleted file mode 100644 index 01e16e49d5..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_DevBuffer.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" - -////////////////////////////////////////////////////////////////////////////////////// -buffer_handle_t CDeviceBufferManager::Create_Locked(BUFFER_BIND_TYPE, BUFFER_USAGE, size_t) -{ - return buffer_handle_t(); -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::Destroy_Locked(buffer_handle_t) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -void* CDeviceBufferManager::BeginRead_Locked([[maybe_unused]] buffer_handle_t handle) -{ - return nullptr; -} - -////////////////////////////////////////////////////////////////////////////////////// -void* CDeviceBufferManager::BeginWrite_Locked([[maybe_unused]] buffer_handle_t handle) -{ - return nullptr; -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::EndReadWrite_Locked([[maybe_unused]] buffer_handle_t handle) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::UpdateBuffer_Locked([[maybe_unused]] buffer_handle_t handle, const void*, size_t) -{ - return false; -} - -////////////////////////////////////////////////////////////////////////////////////// -size_t CDeviceBufferManager::Size_Locked(buffer_handle_t) -{ - return 0; -} - -////////////////////////////////////////////////////////////////////////////////////// -CDeviceBufferManager::CDeviceBufferManager() -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -CDeviceBufferManager::~CDeviceBufferManager() -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::LockDevMan() -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::UnlockDevMan() -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::Init() -{ - return true; -} - -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::Shutdown() -{ - return true; -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::Sync([[maybe_unused]] uint32 framdid) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::Update(uint32, [[maybe_unused]] bool called_during_loading) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -buffer_handle_t CDeviceBufferManager::Create( - [[maybe_unused]] BUFFER_BIND_TYPE type - , [[maybe_unused]] BUFFER_USAGE usage - , [[maybe_unused]] size_t size) -{ - return ~0u; -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::Destroy([[maybe_unused]] buffer_handle_t handle) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -void* CDeviceBufferManager::BeginRead([[maybe_unused]] buffer_handle_t handle) -{ - return NULL; -} - -////////////////////////////////////////////////////////////////////////////////////// -void* CDeviceBufferManager::BeginWrite([[maybe_unused]] buffer_handle_t handle) -{ - return NULL; -} - -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::EndReadWrite([[maybe_unused]] buffer_handle_t handle) -{ -} - -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::UpdateBuffer([[maybe_unused]] buffer_handle_t handle, [[maybe_unused]] const void* src, [[maybe_unused]] size_t size) -{ - return true; -} - -///////////////////////////////////////////////////////////// -// Legacy interface -// -// Use with care, can be removed at any point! -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::ReleaseVBuffer(CVertexBuffer* pVB) -{ - SAFE_DELETE(pVB); -} -////////////////////////////////////////////////////////////////////////////////////// -void CDeviceBufferManager::ReleaseIBuffer(CIndexBuffer* pIB) -{ - SAFE_DELETE(pIB); -} -////////////////////////////////////////////////////////////////////////////////////// -CVertexBuffer* CDeviceBufferManager::CreateVBuffer([[maybe_unused]] size_t nVerts, const AZ::Vertex::Format& vertexFormat, [[maybe_unused]] const char* szName, [[maybe_unused]] BUFFER_USAGE usage) -{ - CVertexBuffer* pVB = new CVertexBuffer(NULL, vertexFormat); - return pVB; -} -////////////////////////////////////////////////////////////////////////////////////// -CIndexBuffer* CDeviceBufferManager::CreateIBuffer([[maybe_unused]] size_t nInds, [[maybe_unused]] const char* szNam, [[maybe_unused]] BUFFER_USAGE usage) -{ - CIndexBuffer* pIB = new CIndexBuffer(NULL); - return pIB; -} -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::UpdateVBuffer([[maybe_unused]] CVertexBuffer* pVB, [[maybe_unused]] void* pVerts, [[maybe_unused]] size_t nVerts) -{ - return true; -} -////////////////////////////////////////////////////////////////////////////////////// -bool CDeviceBufferManager::UpdateIBuffer([[maybe_unused]] CIndexBuffer* pIB, [[maybe_unused]] void* pInds, [[maybe_unused]] size_t nInds) -{ - return true; -} -////////////////////////////////////////////////////////////////////////////////////// -CVertexBuffer::~CVertexBuffer() -{ -} -////////////////////////////////////////////////////////////////////////////////////// -CIndexBuffer::~CIndexBuffer() -{ -} - -namespace AzRHI -{ - ConstantBuffer::~ConstantBuffer() - {} - - void ConstantBuffer::AddRef() - {} - - AZ::u32 ConstantBuffer::Release() - { - return 0; - } -} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_PostProcess.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_PostProcess.cpp deleted file mode 100644 index 2596662259..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_PostProcess.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -/* -Todo: -* Erradicate StretchRect usage -* Cleanup code -* When we have a proper static branching support use it instead of shader switches inside code -*/ -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "I3DEngine.h" -#include "../Common/PostProcess/PostEffects.h" - -///////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// - -AZStd::unique_ptr<CMotionBlur::ObjectMap> CMotionBlur::m_Objects[3]; -CThreadSafeRendererContainer<CMotionBlur::ObjectMap::value_type> CMotionBlur::m_FillData[RT_COMMAND_BUF_COUNT]; - -bool CPostAA::Preprocess() -{ - return true; -} - -void CPostAA::Render() -{ -} - -void CMotionBlur::InsertNewElements() -{ -} - -void CMotionBlur::FreeData() -{ -} - -bool CMotionBlur::Preprocess() -{ - return true; -} - -void CMotionBlur::Render() -{ -} - -void CMotionBlur::GetPrevObjToWorldMat([[maybe_unused]] CRenderObject* pObj, Matrix44A& res) -{ - res = Matrix44(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); -} - -void CMotionBlur::OnBeginFrame() -{ -} - - -bool CSunShafts::Preprocess() -{ - return true; -} - -void CSunShafts::Render() -{ -} - - -void CFilterSharpening::Render() -{ -} -void CFilterBlurring::Render() -{ -} - - -void CUnderwaterGodRays::Render() -{ -} - -void CVolumetricScattering::Render() -{ -} - -void CWaterDroplets::Render() -{ -} - -void CWaterFlow::Render() -{ -} - - -void CWaterRipples::AddHit([[maybe_unused]] const Vec3& vPos, [[maybe_unused]] const float scale, [[maybe_unused]] const float strength) -{ -} - -void CWaterRipples::DEBUG_DrawWaterHits() -{ -} - -bool CWaterRipples::Preprocess() -{ - return true; -} - -void CWaterRipples::Reset([[maybe_unused]] bool bOnSpecChange) -{ -} - -void CWaterRipples::Render() -{ -} - -void CScreenFrost::Render() -{ -} - -bool CRainDrops::Preprocess() -{ - return true; -} -void CRainDrops::Render() -{ -} - -bool CFlashBang::Preprocess() -{ - return true; -} - -void CFlashBang::Render() -{ -} - -void CAlienInterference::Render() -{ -} - -void CGhostVision::Render() -{ -} - -void CHudSilhouettes::Render() -{ -} - -void CColorGrading::Render() -{ -} - -void CWaterVolume::Render() -{ -} - -void CSceneRain::CreateBuffers([[maybe_unused]] uint16 nVerts, [[maybe_unused]] void*& pINpVB, [[maybe_unused]] SVF_P3F_C4B_T2F* pVtxList) -{ -} - -int CSceneRain::CreateResources() -{ - return 1; -} - -void CSceneRain::Release() -{ -} - -void CSceneRain::Render() -{ -} - -bool CSceneSnow::Preprocess() -{ - return true; -} -void CSceneSnow::Render() -{ -} - -int CSceneSnow::CreateResources() -{ - return 1; -} - -void CSceneSnow::Release() -{ -} - -void CImageGhosting::Render() -{ -} - -void CFilterKillCamera::Render() -{ -} - -void CUberGamePostProcess::Render() -{ -} - -void CSoftAlphaTest::Render() -{ -} - -void CScreenBlood::Render() { } - -void CPost3DRenderer::Render() -{ -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// - - -namespace WaterVolumeStaticData -{ - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer){} -} -///////////////////////////////////////////////////////////////////////////////////////////////////// - -bool CSceneRain::Preprocess() { return true; } -//void CSceneRain::Render() {} -void CSceneRain::Reset([[maybe_unused]] bool bOnSpecChange) {} -void CSceneRain::OnLostDevice() {} - -const char* CSceneRain::GetName() const {return 0; } -const char* CRainDrops::GetName() const {return 0; } - -///////////////////////////////////////////////////////////////////////////////////////////////////// - -void CSceneSnow::Reset([[maybe_unused]] bool bOnSpecChange) {} - - -const char* CSceneSnow::GetName() const {return 0; } - -///////////////////////////////////////////////////////////////////////////////////////////////////// - -bool CREPostProcess::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// - -void ScreenFader::Render() -{ - -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RERender.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RERender.cpp deleted file mode 100644 index ca5b0a9c4a..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RERender.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "I3DEngine.h" - -//======================================================================= - -bool CRESky::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -bool CREHDRSky::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -bool CREFogVolume::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -bool CREWaterVolume::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -void CREWaterOcean::FrameUpdate() -{ -} - -void CREWaterOcean::Create([[maybe_unused]] uint32 nVerticesCount, [[maybe_unused]] SVF_P3F_C4B_T2F* pVertices, [[maybe_unused]] uint32 nIndicesCount, [[maybe_unused]] const void* pIndices, [[maybe_unused]] uint32 nIndexSizeof) -{ -} - -void CREWaterOcean::ReleaseOcean() -{ -} - -bool CREWaterOcean::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -CREOcclusionQuery::~CREOcclusionQuery() -{ - mfReset(); -} - -void CREOcclusionQuery::mfReset() -{ - m_nOcclusionID = 0; -} - -uint32 CREOcclusionQuery::m_nQueriesPerFrameCounter = 0; -uint32 CREOcclusionQuery::m_nReadResultNowCounter = 0; -uint32 CREOcclusionQuery::m_nReadResultTryCounter = 0; - -bool CREOcclusionQuery::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} -bool CREOcclusionQuery::mfReadResult_Now(void) -{ - return true; -} -bool CREOcclusionQuery::mfReadResult_Try([[maybe_unused]] uint32 nDefaultNumSamples) -{ - return true; -} -bool CREOcclusionQuery::RT_ReadResult_Try([[maybe_unused]] uint32 nDefaultNumSamples) -{ - return true; -} - -bool CREMeshImpl::mfPreDraw([[maybe_unused]] SShaderPass* sl) -{ - return true; -} - -bool CREMeshImpl::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sl) -{ - return true; -} - -bool CREHDRProcess::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -bool CREDeferredShading::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -bool CREBeam::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sl) -{ - return true; -} - -bool CREImposter::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* pPass) -{ - return true; -} - -bool CRECloud::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* pPass) -{ - return true; -} - -bool CRECloud::UpdateImposter([[maybe_unused]] CRenderObject* pObj) -{ - return true; -} - -bool CRECloud::GenerateCloudImposter([[maybe_unused]] CShader* pShader, [[maybe_unused]] CShaderResources* pRes, [[maybe_unused]] CRenderObject* pObject) -{ - return true; -} - -bool CREImposter::UpdateImposter() -{ - return true; -} - -bool CREVolumeObject::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -#if !defined(EXCLUDE_DOCUMENTATION_PURPOSE) -bool CREPrismObject::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} -#endif // EXCLUDE_DOCUMENTATION_PURPOSE - -bool CREGameEffect::mfDraw([[maybe_unused]] CShader* ef, [[maybe_unused]] SShaderPass* sfm) -{ - return true; -} - -void CRELensOptics::ClearResources() -{ -} - -#if defined(USE_GEOM_CACHES) -bool CREGeomCache::mfDraw([[maybe_unused]] CShader* pShader, [[maybe_unused]] SShaderPass* pShaderPass) -{ - return true; -} -#endif diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RendPipeline.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RendPipeline.cpp deleted file mode 100644 index 1686c56400..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RendPipeline.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : NULL device specific implementation using shaders pipeline. - - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "Common/RenderView.h" -#include "RenderBus.h" - -//============================================================================================ -// Init Shaders rendering - -void CAtomShimRenderer::EF_Init() -{ - m_RP.m_MaxVerts = 600; - m_RP.m_MaxTris = 300; - - //================================================== - // Init RenderObjects - { - m_RP.m_nNumObjectsInPool = 384; // magic number set by Cry. The regular pipe uses a constant set to 1024 - - if (m_RP.m_ObjectsPool != nullptr) - { - for (int j = 0; j < (int)(m_RP.m_nNumObjectsInPool * RT_COMMAND_BUF_COUNT); j++) - { - CRenderObject* pRendObj = &m_RP.m_ObjectsPool[j]; - pRendObj->~CRenderObject(); - } - CryModuleMemalignFree(m_RP.m_ObjectsPool); - } - - // we use a plain allocation and placement new here to garantee the alignment, when using array new, the compiler can store it's size and break the alignment - m_RP.m_ObjectsPool = (CRenderObject*)CryModuleMemalign(sizeof(CRenderObject) * (m_RP.m_nNumObjectsInPool * RT_COMMAND_BUF_COUNT), 16); - for (int j = 0; j < (int)(m_RP.m_nNumObjectsInPool * RT_COMMAND_BUF_COUNT); j++) - { - new(&m_RP.m_ObjectsPool[j])CRenderObject(); - } - - - CRenderObject** arrPrefill = (CRenderObject**)(alloca(m_RP.m_nNumObjectsInPool * sizeof(CRenderObject*))); - for (int j = 0; j < RT_COMMAND_BUF_COUNT; j++) - { - for (int k = 0; k < m_RP.m_nNumObjectsInPool; ++k) - { - arrPrefill[k] = &m_RP.m_ObjectsPool[j * m_RP.m_nNumObjectsInPool + k]; - } - - m_RP.m_TempObjects[j].PrefillContainer(arrPrefill, m_RP.m_nNumObjectsInPool); - m_RP.m_TempObjects[j].resize(0); - } - } - // Init identity RenderObject - SAFE_DELETE(m_RP.m_pIdendityRenderObject); - m_RP.m_pIdendityRenderObject = aznew CRenderObject(); - m_RP.m_pIdendityRenderObject->Init(); - m_RP.m_pIdendityRenderObject->m_II.m_AmbColor = Col_White; - m_RP.m_pIdendityRenderObject->m_II.m_Matrix.SetIdentity(); - m_RP.m_pIdendityRenderObject->m_RState = 0; - m_RP.m_pIdendityRenderObject->m_ObjFlags |= FOB_RENDERER_IDENDITY_OBJECT; - -} - -void CAtomShimRenderer::FX_SetClipPlane ([[maybe_unused]] bool bEnable, [[maybe_unused]] float* pPlane, [[maybe_unused]] bool bRefract) -{ -} - -void CAtomShimRenderer::FX_PipelineShutdown([[maybe_unused]] bool bFastShutdown) -{ - uint32 i, j; - - for (int n = 0; n < 2; n++) - { - for (j = 0; j < 2; j++) - { - for (i = 0; i < CREClientPoly::m_PolysStorage[n][j].Num(); i++) - { - CREClientPoly::m_PolysStorage[n][j][i]->Release(false); - } - CREClientPoly::m_PolysStorage[n][j].Free(); - } - } -} - -void CAtomShimRenderer::EF_Release([[maybe_unused]] int nFlags) -{ -} - -//========================================================================== - -void CAtomShimRenderer::FX_SetState(int st, int AlphaRef, [[maybe_unused]] int RestoreState) -{ - m_RP.m_CurState = st; - m_RP.m_CurAlphaRef = AlphaRef; -} -void CRenderer::FX_SetStencilState([[maybe_unused]] int st, [[maybe_unused]] uint32 nStencRef, [[maybe_unused]] uint32 nStencMask, [[maybe_unused]] uint32 nStencWriteMask, [[maybe_unused]] bool bForceFullReadMask) -{ -} - -//================================================================================= - -// Initialize of the new shader pipeline (only 2d) -void CRenderer::FX_Start([[maybe_unused]] CShader* ef, [[maybe_unused]] int nTech, [[maybe_unused]] CShaderResources* Res, [[maybe_unused]] IRenderElement* re) -{ - m_RP.m_Frame++; -} - -void CRenderer::FX_CheckOverflow([[maybe_unused]] int nVerts, [[maybe_unused]] int nInds, [[maybe_unused]] IRenderElement* re, [[maybe_unused]] int* nNewVerts, [[maybe_unused]] int* nNewInds) -{ -} - -uint32 CRenderer::EF_GetDeferredLightsNum([[maybe_unused]] const eDeferredLightType eLightType) -{ - return 0; -} - -int CRenderer::EF_AddDeferredLight([[maybe_unused]] const CDLight& pLight, float, [[maybe_unused]] const SRenderingPassInfo& passInfo, [[maybe_unused]] const SRendItemSorter& rendItemSorter) -{ - return 0; -} - -void CRenderer::EF_ClearDeferredLightsList() -{ -} - -void CRenderer::EF_ReleaseDeferredData() -{ -} - -uint8 CRenderer::EF_AddDeferredClipVolume([[maybe_unused]] const IClipVolume* pClipVolume) -{ - return 0; -} - - -bool CRenderer::EF_SetDeferredClipVolumeBlendData([[maybe_unused]] const IClipVolume* pClipVolume, [[maybe_unused]] const SClipVolumeBlendInfo& blendInfo) -{ - return false; -} - -void CRenderer::EF_ClearDeferredClipVolumesList() -{ -} - -//======================================================================================== - -void CAtomShimRenderer::EF_EndEf3D([[maybe_unused]] const int nFlags, [[maybe_unused]] const int nPrecacheUpdateId, [[maybe_unused]] const int nNearPrecacheUpdateId, [[maybe_unused]] const SRenderingPassInfo& passInfo) -{ - //m_RP.m_TI[m_RP.m_nFillThreadID].m_RealTime = iTimer->GetCurrTime(); - EF_RemovePolysFromScene(); - - // Only render the UI Canvas and the Console on the main window - // If we're not in the editor, don't bother to check viewport. - if (!gEnv->IsEditor() || m_currContext == nullptr || m_currContext->m_isMainViewport) - { - EBUS_EVENT(AZ::RenderNotificationsBus, OnScene3DEnd); - } - - int nThreadID = m_pRT->GetThreadList(); - SRendItem::m_RecurseLevel[nThreadID]--; -} - -//double timeFtoI, timeFtoL, timeQRound; -//int sSome; -void CAtomShimRenderer::EF_EndEf2D([[maybe_unused]] const bool bSort) -{ -} - -void CRenderView::PrepareForRendering() {} - -void CRenderView::PrepareForWriting() {} - -void CRenderView::ClearRenderItems() {} - -void CRenderView::FreeRenderItems() {} - -CRenderView::CRenderView() {} - -CRenderView::~CRenderView() {} - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.cpp deleted file mode 100644 index 955b240514..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.cpp +++ /dev/null @@ -1,688 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "AtomShim_RenderAuxGeom.h" - -#include <Atom/RPI.Public/AuxGeom/AuxGeomFeatureProcessorInterface.h> -#include <Atom/RPI.Public/RPISystemInterface.h> -#include <MathConversion.h> - -CAtomShimRenderAuxGeom* CAtomShimRenderAuxGeom::s_pThis = NULL; - -namespace -{ - using DrawFunction = AZStd::function<void(const uint32* indices)>; - void Handle16BitIndices(const vtx_idx* ind, uint32_t numIndices, DrawFunction drawFunc) - { - constexpr bool copyIndicesToUint32 = sizeof(vtx_idx) != sizeof(uint32_t); // mobile platforms use 16 bit vtx_idx - if constexpr(copyIndicesToUint32) - { - uint32_t* indices = new uint32_t[numIndices]; - for (int i = 0; i < numIndices; ++i) - { - indices[i] = ind[i]; - } - drawFunc(indices); - delete[] indices; - } - else - { - // re-interpret because on mobile vtx_idx is a uint16 - // Additionally the else case should not be taken on mobile - // because sizeof(uint16) < sizeof(uint32). - const uint32_t* indices = reinterpret_cast<const uint32_t*>(ind); - drawFunc(indices); - } - } - - AZ::RPI::AuxGeomDraw::DrawStyle LyDrawStyleToAZDrawStyle(bool bSolid, EBoundingBoxDrawStyle bbDrawStyle) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - if (!bSolid) - { - drawStyle = AZ::RPI::AuxGeomDraw::DrawStyle::Line; - } - else if (bbDrawStyle == eBBD_Extremes_Color_Encoded) - { - drawStyle = AZ::RPI::AuxGeomDraw::DrawStyle::Shaded; // Not the same but shows a difference - } - return drawStyle; - } - - AZ::Aabb LyAABBToAZAabbWithFixup(const AABB& source) - { - AABB fixed; - fixed.min.x = AZStd::min(source.min.x, source.max.x); - fixed.min.y = AZStd::min(source.min.y, source.max.y); - fixed.min.z = AZStd::min(source.min.z, source.max.z); - fixed.max.x = AZStd::max(source.min.x, source.max.x); - fixed.max.y = AZStd::max(source.min.y, source.max.y); - fixed.max.z = AZStd::max(source.min.z, source.max.z); - return LyAABBToAZAabb(fixed); - } - -} - -CAtomShimRenderAuxGeom::CAtomShimRenderAuxGeom(CAtomShimRenderer& renderer) - : m_renderer(&renderer) -{ -} - -CAtomShimRenderAuxGeom::~CAtomShimRenderAuxGeom() -{ -} - -void CAtomShimRenderAuxGeom::BeginFrame() -{ -} - -void CAtomShimRenderAuxGeom::EndFrame() -{ -} - -void CAtomShimRenderAuxGeom::SetViewProjOverride(const AZ::Matrix4x4& viewProj) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - m_viewProjOverrideIndex = auxGeom->AddViewProjOverride(viewProj); - } -} - -void CAtomShimRenderAuxGeom::UnsetViewProjOverride() -{ - m_viewProjOverrideIndex = -1; -} - -void CAtomShimRenderAuxGeom::SetRenderFlags(const SAuxGeomRenderFlags& renderFlags) -{ - m_cryRenderFlags = renderFlags; - m_drawArgs.m_depthTest = renderFlags.GetDepthTestFlag() == EAuxGeomPublicRenderflags_DepthTest::e_DepthTestOff ? - AZ::RPI::AuxGeomDraw::DepthTest::Off : AZ::RPI::AuxGeomDraw::DepthTest::On; -} - -SAuxGeomRenderFlags CAtomShimRenderAuxGeom::GetRenderFlags() -{ - return m_cryRenderFlags; -} - -void CAtomShimRenderAuxGeom::DrawPoint(const Vec3& v, const ColorB& col, uint8 size /* = 1 */) -{ - DrawPoints(&v, 1, col, size); -} - -void CAtomShimRenderAuxGeom::DrawPoints(const Vec3* v, uint32 numPoints, const ColorB* col, uint8 size /* = 1 */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_size = size; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawPoints(drawArgs); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawPoints(const Vec3* v, uint32 numPoints, const ColorB& col, uint8 size /* = 1 */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - AZ::Color color = LYColorBToAZColor(col); - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_size = size; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawPoints(drawArgs); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawLine(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, float thickness /* = 1.0f */) -{ - const Vec3 verts[2] = {v0, v1}; - const ColorB colors[2] = {colV0, colV1}; - DrawLines(verts, 2, colors, thickness); -} - -void CAtomShimRenderAuxGeom::DrawLines(const Vec3* v, uint32 numPoints, const ColorB& col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - - AZ::Color color = LYColorBToAZColor(col); - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - auxGeom->DrawLines(drawArgs); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawLines(const Vec3* v, uint32 numPoints, const ColorB* col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawLines(drawArgs); - - delete[] points; - delete[] colors; - } -} - -void CAtomShimRenderAuxGeom::DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - - AZ::Color color = LYColorBToAZColor(col); - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_indexCount = numIndices; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - Handle16BitIndices( - ind, numIndices, - [&drawArgs, auxGeom](const uint32_t* indices) - { - drawArgs.m_indices = indices; - auxGeom->DrawLines(drawArgs); - } - ); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_indexCount = numIndices; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - Handle16BitIndices( - ind, numIndices, - [&drawArgs, auxGeom](const uint32_t* indices) - { - drawArgs.m_indices = indices; - auxGeom->DrawLines(drawArgs); - } - ); - - delete[] points; - delete[] colors; - } -} - -void CAtomShimRenderAuxGeom::DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB& col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - - AZ::Color color = LYColorBToAZColor(col); - AZ::RPI::AuxGeomDraw::PolylineEnd polylineClosed = closed ? AZ::RPI::AuxGeomDraw::PolylineEnd::Closed : AZ::RPI::AuxGeomDraw::PolylineEnd::Open; - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawPolylines(drawArgs, polylineClosed); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB* col, float thickness /* = 1.0f */) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - - AZ::RPI::AuxGeomDraw::PolylineEnd polylineClosed = closed ? AZ::RPI::AuxGeomDraw::PolylineEnd::Closed : AZ::RPI::AuxGeomDraw::PolylineEnd::Open; - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_size = thickness; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - auxGeom->DrawPolylines(drawArgs, polylineClosed); - - delete[] points; - delete[] colors; - } -} - -void CAtomShimRenderAuxGeom::DrawTriangle(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, const Vec3& v2, const ColorB& colV2) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3 points[3] = - { - LYVec3ToAZVec3(v0), - LYVec3ToAZVec3(v1), - LYVec3ToAZVec3(v2), - }; - - AZ::Color colors[3] = - { - LYColorBToAZColor(colV0), - LYColorBToAZColor(colV1), - LYColorBToAZColor(colV2), - }; - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = 3; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = 3; - drawArgs.m_opacityType = (colV0.a == 0xFF && colV1.a == 0xFF && colV2.a == 0xFF) ? AZ::RPI::AuxGeomDraw::OpacityType::Opaque : AZ::RPI::AuxGeomDraw::OpacityType::Translucent; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawTriangles(drawArgs); - } -} - -void CAtomShimRenderAuxGeom::DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB& col) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - AZ::Color color = LYColorBToAZColor(col); - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawTriangles(drawArgs); - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB* col) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicDrawArguments drawArgs; - drawArgs.m_verts = points; - drawArgs.m_vertCount = 3; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - auxGeom->DrawTriangles(drawArgs); - delete[] points; - delete[] colors; - } -} - -void CAtomShimRenderAuxGeom::DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - } - AZ::Color color = LYColorBToAZColor(col); - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_indexCount = numIndices; - drawArgs.m_colors = &color; - drawArgs.m_colorCount = 1; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - Handle16BitIndices( - ind, numIndices, - [&drawArgs, auxGeom](const uint32_t* indices) - { - drawArgs.m_indices = indices; - auxGeom->DrawTriangles(drawArgs); - } - ); - - delete[] points; - } -} - -void CAtomShimRenderAuxGeom::DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Vector3* points = new AZ::Vector3[numPoints]; - AZ::Color* colors = new AZ::Color[numPoints]; - for (int i = 0; i < numPoints; ++i) - { - points[i] = LYVec3ToAZVec3(v[i]); - colors[i] = LYColorBToAZColor(col[i]); - } - - AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments drawArgs(m_drawArgs); - drawArgs.m_verts = points; - drawArgs.m_vertCount = numPoints; - drawArgs.m_indexCount = numIndices; - drawArgs.m_colors = colors; - drawArgs.m_colorCount = numPoints; - drawArgs.m_viewProjectionOverrideIndex = m_viewProjOverrideIndex; - - Handle16BitIndices( - ind, numIndices, - [&drawArgs, auxGeom](const uint32_t* indices) - { - drawArgs.m_indices = indices; - auxGeom->DrawTriangles(drawArgs); - } - ); - - delete[] points; - delete[] colors; - } -} - -void CAtomShimRenderAuxGeom::DrawQuad(float width, float height, const Matrix34& matWorld, const ColorB& col, bool drawShaded) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - AZ::Matrix3x4 local2World = LYTransformToAZMatrix3x4(matWorld); - auxGeom->DrawQuad(width, height, local2World, LYColorBToAZColor(col), drawStyle, m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawAABB(const AABB& aabb, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - auxGeom->DrawAabb(LyAABBToAZAabbWithFixup(aabb), LYColorBToAZColor(col), LyDrawStyleToAZDrawStyle(bSolid, bbDrawStyle), m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawAABBs(const AABB* aabb, uint32 aabbCount, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - for (int i = 0; i < aabbCount; ++aabbCount) - { - auxGeom->DrawAabb( - LyAABBToAZAabbWithFixup(aabb[i]), - LYColorBToAZColor(col), - LyDrawStyleToAZDrawStyle(bSolid, bbDrawStyle), - m_drawArgs.m_depthTest, - AZ::RPI::AuxGeomDraw::DepthWrite::On, - AZ::RPI::AuxGeomDraw::FaceCullMode::Back, - m_viewProjOverrideIndex); - } - } -} - -void CAtomShimRenderAuxGeom::DrawAABB(const AABB& aabb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Matrix3x4 transform = LYTransformToAZMatrix3x4(matWorld); - auxGeom->DrawAabb( - LyAABBToAZAabbWithFixup(aabb), - transform, - LYColorBToAZColor(col), - LyDrawStyleToAZDrawStyle(bSolid, bbDrawStyle), - m_drawArgs.m_depthTest, - AZ::RPI::AuxGeomDraw::DepthWrite::On, - AZ::RPI::AuxGeomDraw::FaceCullMode::Back, - m_viewProjOverrideIndex); - } -} - -void CAtomShimRenderAuxGeom::DrawOBB(const OBB& obb, const Vec3& pos, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - auxGeom->DrawObb(LyOBBtoAZObb(obb), LYVec3ToAZVec3(pos), LYColorBToAZColor(col), LyDrawStyleToAZDrawStyle(bSolid, bbDrawStyle), m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawOBB(const OBB& obb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::Matrix3x4 transform = LYTransformToAZMatrix3x4(matWorld); - auxGeom->DrawObb(LyOBBtoAZObb(obb), transform, LYColorBToAZColor(col), LyDrawStyleToAZDrawStyle(bSolid, bbDrawStyle), m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawSphere(const Vec3& pos, float radius, const ColorB& col, bool drawShaded) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - auxGeom->DrawSphere(LYVec3ToAZVec3(pos), radius, LYColorBToAZColor(col), drawStyle, m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawDisk(const Vec3& pos, const Vec3& dir, float radius, const ColorB& col, bool drawShaded) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - auxGeom->DrawDisk(LYVec3ToAZVec3(pos), LYVec3ToAZVec3(dir), radius, LYColorBToAZColor(col), drawStyle, m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawCone(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - auxGeom->DrawCone(LYVec3ToAZVec3(pos), LYVec3ToAZVec3(dir), radius, height, LYColorBToAZColor(col), drawStyle, m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawCylinder(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded) -{ - auto defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - if (auto auxGeom = AZ::RPI::AuxGeomFeatureProcessorInterface::GetDrawQueueForScene(defaultScene)) - { - AZ::RPI::AuxGeomDraw::DrawStyle drawStyle = drawShaded ? AZ::RPI::AuxGeomDraw::DrawStyle::Shaded : AZ::RPI::AuxGeomDraw::DrawStyle::Solid; - auxGeom->DrawCylinder(LYVec3ToAZVec3(pos), LYVec3ToAZVec3(dir), radius, height, LYColorBToAZColor(col), drawStyle, m_drawArgs.m_depthTest); - } -} - -void CAtomShimRenderAuxGeom::DrawBone(const Vec3& p, const Vec3& c, ColorB col) -{ - Vec3 vBoneVec = c - p; - float fBoneLength = vBoneVec.GetLength(); - - if (fBoneLength < 1e-4) - { - return; - } - - Matrix33 m33 = Matrix33::CreateRotationV0V1(Vec3(1, 0, 0), vBoneVec / fBoneLength); - Matrix34 m34 = Matrix34(m33, p); - - f32 t = min(0.01f, fBoneLength * 0.05f); - - //bone points in x-direction - Vec3 s = Vec3(ZERO); - Vec3 m0 = Vec3(t, +t, +t); - Vec3 m1 = Vec3(t, -t, +t); - Vec3 m2 = Vec3(t, -t, -t); - Vec3 m3 = Vec3(t, +t, -t); - Vec3 e = Vec3(fBoneLength, 0, 0); - - Vec3 VBuffer[6]; - ColorB CBuffer[6]; - - VBuffer[0] = m34 * s; - CBuffer[0] = RGBA8(0xff, 0x1f, 0x1f, 0x00); //start of bone (joint) - - VBuffer[1] = m34 * m0; - CBuffer[1] = col; - VBuffer[2] = m34 * m1; - CBuffer[2] = col; - VBuffer[3] = m34 * m2; - CBuffer[3] = col; - VBuffer[4] = m34 * m3; - CBuffer[4] = col; - - VBuffer[5] = m34 * e; - CBuffer[5] = RGBA8(0x07, 0x0f, 0x1f, 0x00); //end of bone - - - DrawLine(VBuffer[0], CBuffer[0], VBuffer[1], CBuffer[1]); - DrawLine(VBuffer[0], CBuffer[0], VBuffer[2], CBuffer[2]); - DrawLine(VBuffer[0], CBuffer[0], VBuffer[3], CBuffer[3]); - DrawLine(VBuffer[0], CBuffer[0], VBuffer[4], CBuffer[4]); - - DrawLine(VBuffer[1], CBuffer[1], VBuffer[2], CBuffer[2]); - DrawLine(VBuffer[2], CBuffer[2], VBuffer[3], CBuffer[3]); - DrawLine(VBuffer[3], CBuffer[3], VBuffer[4], CBuffer[4]); - DrawLine(VBuffer[4], CBuffer[4], VBuffer[1], CBuffer[1]); - - DrawLine(VBuffer[5], CBuffer[5], VBuffer[1], CBuffer[1]); - DrawLine(VBuffer[5], CBuffer[5], VBuffer[2], CBuffer[2]); - DrawLine(VBuffer[5], CBuffer[5], VBuffer[3], CBuffer[3]); - DrawLine(VBuffer[5], CBuffer[5], VBuffer[4], CBuffer[4]); -} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.h b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.h deleted file mode 100644 index 50dc262e8d..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_RenderAuxGeom.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef CRYINCLUDE_CRYENGINE_RENDERDLL_XRENDERATOMSHIM_ATOMSHIMRENDERAUXGEOM_H -#define CRYINCLUDE_CRYENGINE_RENDERDLL_XRENDERATOMSHIM_ATOMSHIMRENDERAUXGEOM_H -#pragma once -#include "../Common/RenderAuxGeom.h" -#include <AzCore/Math/Matrix4x4.h> -#include <Atom/RPI.Public/AuxGeom/AuxGeomDraw.h> - -class CAtomShimRenderer; -class ICrySizer; - -class CAtomShimRenderAuxGeom - : public IRenderAuxGeom -{ -public: - // interface - virtual void SetRenderFlags(const SAuxGeomRenderFlags& renderFlags); - virtual SAuxGeomRenderFlags GetRenderFlags(); - - virtual void Flush() {} - virtual void Commit([[maybe_unused]] uint frames = 0) {} - virtual void Process() {} - - virtual void DrawPoint(const Vec3& v, const ColorB& col, uint8 size = 1); - virtual void DrawPoints(const Vec3* v, uint32 numPoints, const ColorB& col, uint8 size = 1); - virtual void DrawPoints(const Vec3* v, uint32 numPoints, const ColorB* col, uint8 size = 1); - - virtual void DrawLine(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, float thickness = 1.0f); - virtual void DrawLines(const Vec3* v, uint32 numPoints, const ColorB& col, float thickness = 1.0f); - virtual void DrawLines(const Vec3* v, uint32 numPoints, const ColorB* col, float thickness = 1.0f); - virtual void DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col, float thickness = 1.0f); - virtual void DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col, float thickness = 1.0f); - virtual void DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB& col, float thickness = 1.0f); - virtual void DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB* col, float thickness = 1.0f); - - virtual void DrawTriangle(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, const Vec3& v2, const ColorB& colV2); - virtual void DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB& col); - virtual void DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB* col); - virtual void DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col); - virtual void DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col); - - virtual void DrawQuad(float width, float height, const Matrix34& matWorld, const ColorB& col, bool drawShaded = true); - - virtual void DrawAABB(const AABB& aabb, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle); - virtual void DrawAABBs(const AABB* aabb, uint32 aabbCount, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle); - virtual void DrawAABB(const AABB& aabb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle); - - virtual void DrawOBB(const OBB& obb, const Vec3& pos, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle); - virtual void DrawOBB(const OBB& obb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle); - - virtual void DrawSphere(const Vec3& pos, float radius, const ColorB& col, bool drawShaded = true); - virtual void DrawDisk(const Vec3& pos, const Vec3& dir, float radius, const ColorB& col, bool drawShaded = true); - virtual void DrawCone(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded = true); - virtual void DrawCylinder(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded = true); - - virtual void DrawBone(const Vec3& rParent, const Vec3& rBone, ColorB col); - - virtual void RenderText([[maybe_unused]] Vec3 pos, [[maybe_unused]] SDrawTextInfo& ti, [[maybe_unused]] const char* forma, [[maybe_unused]] va_list args) {} - virtual void RenderText_NoArgs([[maybe_unused]] Vec3 pos, [[maybe_unused]] SDrawTextInfo& ti, [[maybe_unused]] const char* text) {} - -public: - static CAtomShimRenderAuxGeom* Create(CAtomShimRenderer& renderer) - { - if (s_pThis == NULL) - { - s_pThis = new CAtomShimRenderAuxGeom(renderer); - } - return s_pThis; - } - -public: - ~CAtomShimRenderAuxGeom(); - - void BeginFrame(); - void EndFrame(); - - void SetViewProjOverride(const AZ::Matrix4x4& viewProj); - void UnsetViewProjOverride(); - -private: - CAtomShimRenderAuxGeom(CAtomShimRenderer& renderer); - - int32_t m_viewProjOverrideIndex = -1; - AZ::RPI::AuxGeomDraw::AuxGeomDynamicIndexedDrawArguments m_drawArgs; - - CAtomShimRenderer* m_renderer; - - static CAtomShimRenderAuxGeom* s_pThis; - - SAuxGeomRenderFlags m_cryRenderFlags; -}; - -#endif // NULL_RENDER_AUX_GEOM_H diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp deleted file mode 100644 index 838dd9a20c..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.cpp +++ /dev/null @@ -1,1678 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Implementation of the NULL renderer API - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include <IColorGradingController.h> -#include "IStereoRenderer.h" -#include "../Common/Textures/TextureManager.h" - -#include <IEngineModule.h> -#include <CryExtension/Impl/ClassWeaver.h> -// init memory pool usage - -#include "GraphicsPipeline/FurBendData.h" - -#include <AzFramework/Render/RenderSystemBus.h> -#include <MathConversion.h> - -#include <AzCore/Math/MatrixUtils.h> - -#include <Atom/RHI/Factory.h> - -#include <Atom/RPI.Public/View.h> -#include <Atom/RPI.Public/ViewportContext.h> -#include <Atom/RPI.Public/ViewportContextBus.h> -#include <Atom/RPI.Public/RenderPipeline.h> -#include <Atom/RPI.Public/RPISystemInterface.h> -#include <Atom/RPI.Public/RPIUtils.h> -#include <Atom/RPI.Public/Scene.h> - -#include <Atom/RPI.Public/Image/StreamingImage.h> -#include <Atom/RPI.Reflect/Image/StreamingImageAsset.h> - -#include <AzFramework/Asset/AssetSystemBus.h> - -#include <random> //std::random_device - -CCryNameTSCRC CTexture::s_sClassName = CCryNameTSCRC("CTexture"); -CCryNameTSCRC CHWShader::s_sClassNameVS = CCryNameTSCRC("CHWShader_VS"); -CCryNameTSCRC CHWShader::s_sClassNamePS = CCryNameTSCRC("CHWShader_PS"); -CCryNameTSCRC CShader::s_sClassName = CCryNameTSCRC("CShader"); - -CAtomShimRenderer* gcpAtomShim = NULL; - - #ifdef _DEBUG -// static array used to check that calls to Set2DMode and Unset2DMode are matched. (static array initialized to zeros automatically). -int s_isIn2DMode[RT_COMMAND_BUF_COUNT]; -#endif - -////////////////////////////////////////////////////////////////////// - -class CNullColorGradingController - : public IColorGradingController -{ -public: - virtual int LoadColorChart([[maybe_unused]] const char* pChartFilePath) const { return 0; } - virtual int LoadDefaultColorChart() const { return 0; } - virtual void UnloadColorChart([[maybe_unused]] int texID) const {} - virtual void SetLayers([[maybe_unused]] const SColorChartLayer* pLayers, [[maybe_unused]] uint32 numLayers) {} -}; - -////////////////////////////////////////////////////////////////////// - -class CNullStereoRenderer - : public IStereoRenderer -{ -public: - virtual EStereoDevice GetDevice() { return STEREO_DEVICE_NONE; } - virtual EStereoDeviceState GetDeviceState() { return STEREO_DEVSTATE_UNSUPPORTED_DEVICE; } - virtual void GetInfo(EStereoDevice* device, EStereoMode* mode, EStereoOutput* output, EStereoDeviceState* state) const - { - if (device) - { - *device = STEREO_DEVICE_NONE; - } - if (mode) - { - *mode = STEREO_MODE_NO_STEREO; - } - if (output) - { - *output = STEREO_OUTPUT_STANDARD; - } - if (state) - { - *state = STEREO_DEVSTATE_OK; - } - } - virtual bool GetStereoEnabled() { return false; } - virtual float GetStereoStrength() { return 0; } - virtual float GetMaxSeparationScene([[maybe_unused]] bool half = true) { return 0; } - virtual float GetZeroParallaxPlaneDist() { return 0; } - virtual void GetNVControlValues([[maybe_unused]] bool& stereoEnabled, [[maybe_unused]] float& stereoStrength) {}; - virtual void OnHmdDeviceChanged() {} - virtual bool IsRenderingToHMD() override { return false; } - Status GetStatus() const override { return IStereoRenderer::Status::kIdle; } -}; - -////////////////////////////////////////////////////////////////////// -CAtomShimRenderer::CAtomShimRenderer() -{ - gcpAtomShim = this; - m_pAtomShimRenderAuxGeom = CAtomShimRenderAuxGeom::Create(*this); - m_pAtomShimColorGradingController = new CNullColorGradingController(); - m_pAtomShimStereoRenderer = new CNullStereoRenderer(); - m_pixelAspectRatio = 1.0f; - Camera::ActiveCameraRequestBus::Handler::BusConnect(); -} - -////////////////////////////////////////////////////////////////////////// -bool QueryIsFullscreen() -{ - return false; -} - - -#include <stdio.h> - -namespace Platform -{ - WIN_HWND GetNativeWindowHandle(); -} - -////////////////////////////////////////////////////////////////////// -CAtomShimRenderer::~CAtomShimRenderer() -{ - Camera::ActiveCameraRequestBus::Handler::BusDisconnect(); - ShutDown(); - delete m_pAtomShimRenderAuxGeom; - delete m_pAtomShimColorGradingController; - delete m_pAtomShimStereoRenderer; -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::EnableTMU([[maybe_unused]] bool enable) -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::CheckError([[maybe_unused]] const char* comment) -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::BeginFrame() -{ - if (!m_isFinalInitializationDone) - { - // This will cause the default textures (such as the White texture) to be loaded. In legacy renderer it is called in CRenderer::PostInit - // but that is disabled for AtomShim because NULL_RENDERER is defined. Anyway, it would not work if we called it there because the Asset Catalog - // is not yet loaded when CRenderer::PostInit is called and we use it to load Atom textures. - // [GFX TODO] Do we want NULL_RENDERER defined for AtomShim? It would affect a lot of code in AtomShim if we removed that define. - InitSystemResources(FRR_SYSTEM_RESOURCES); - - // In the legacy renderer this is done in CRenderer::PostInit but that is only done is NULL_RENDERER is not defined. - if (gEnv->pCryFont) - { - m_pDefaultFont = gEnv->pCryFont->GetFont("default"); - if (!m_pDefaultFont) - { - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, "Error getting default font"); - } - } - - AZ::Name apiName = AZ::RHI::Factory::Get().GetName(); - if (!apiName.IsEmpty()) - { - m_rendererDescription = AZStd::string::format("Atom using %s RHI", apiName.GetCStr()); - } - - // Initialize dynamic draw which is used for 2d drawing - const char* shaderFilepath = "Shaders/SimpleTextured.azshader"; - m_dynamicDraw = AZ::RPI::DynamicDrawInterface::Get()->CreateDynamicDrawContext( - AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get()); - AZ::Data::Instance<AZ::RPI::Shader> shader = AZ::RPI::LoadShader(shaderFilepath); - m_dynamicDraw->InitShader(shader); - m_dynamicDraw->InitVertexFormat( - {{"POSITION", AZ::RHI::Format::R32G32B32_FLOAT}, - {"COLOR", AZ::RHI::Format::R8G8B8A8_UNORM}, - {"TEXCOORD0", AZ::RHI::Format::R32G32_FLOAT}}); - // enable the ability to change cull mode, blend mode, the depth state - m_dynamicDraw->AddDrawStateOptions( AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode - | AZ::RPI::DynamicDrawContext::DrawStateOptions::PrimitiveType - | AZ::RPI::DynamicDrawContext::DrawStateOptions::DepthState - | AZ::RPI::DynamicDrawContext::DrawStateOptions::FaceCullMode); - m_dynamicDraw->EndInit(); - - // declare the two shader variants it will use - AZ::RPI::ShaderOptionList shaderOptionsClamp; - shaderOptionsClamp.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); - shaderOptionsClamp.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("true"))); - m_shaderVariantClamp = m_dynamicDraw->UseShaderVariant(shaderOptionsClamp); - AZ::RPI::ShaderOptionList shaderOptionsWrap; - shaderOptionsWrap.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); - shaderOptionsWrap.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("false"))); - m_shaderVariantWrap = m_dynamicDraw->UseShaderVariant(shaderOptionsWrap); - - m_dynamicDraw->NewDrawSrg(); - - m_isFinalInitializationDone = true; - } - - if (m_isInFrame) - { - // If there has not been an EndFrame since the latest BeginFrame then ignore this call to BeginFrame. - return; - } - - m_isInFrame = true; - - m_RP.m_TI[m_RP.m_nFillThreadID].m_nFrameID++; - m_RP.m_TI[m_RP.m_nFillThreadID].m_nFrameUpdateID++; - m_RP.m_TI[m_RP.m_nFillThreadID].m_RealTime = iTimer->GetCurrTime(); - - m_RP.m_TI[m_RP.m_nFillThreadID].m_matView.SetIdentity(); - m_RP.m_TI[m_RP.m_nFillThreadID].m_matProj.SetIdentity(); - - m_pAtomShimRenderAuxGeom->BeginFrame(); -} - -////////////////////////////////////////////////////////////////////// -bool CAtomShimRenderer::ChangeDisplay([[maybe_unused]] unsigned int width, [[maybe_unused]] unsigned int height, [[maybe_unused]] unsigned int bpp) -{ - return false; -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::ChangeViewport(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool bMainViewport, float scaleWidth, float scaleHeight) -{ - float fWidth = aznumeric_cast<float>(width); - float fHeight = aznumeric_cast<float>(height); - - width = aznumeric_cast<unsigned int>(fWidth * scaleWidth); - height = aznumeric_cast<unsigned int>(fHeight * scaleHeight); - - m_MainRTViewport.nX = x; - m_MainRTViewport.nY = y; - m_MainRTViewport.nWidth = width; - m_MainRTViewport.nHeight = height; - - m_width = m_nativeWidth = m_backbufferWidth = width; - m_height = m_nativeHeight = m_backbufferHeight = height; - - if (m_currContext) - { - m_currContext->m_width = width; - m_currContext->m_height = height; - m_currContext->m_isMainViewport = bMainViewport; - } -} - -void CAtomShimRenderer::RenderDebug([[maybe_unused]] bool bRenderStats) -{ -#if !defined(_RELEASE) - // debug render listeners - { - for (TListRenderDebugListeners::iterator itr = m_listRenderDebugListeners.begin(); - itr != m_listRenderDebugListeners.end(); - ++itr) - { - (*itr)->OnDebugDraw(); - } - } -#endif//_RELEASE -} - -void CAtomShimRenderer::EndFrame() -{ - if (!m_isInFrame) - { - // If there has not been a BeginFrame since the latest EndFrame then ignore this call to EndFrame. - // This can happen when EndFrame is called from UnloadLevel. - return; - } - - m_pAtomShimRenderAuxGeom->EndFrame(); - - EF_RenderTextMessages(); - - // Hack: Assume we're just rendering to the default ViewContext - // Proper multi viewport support will be handled after this shim is removed - if (!m_viewportContext) - { - auto viewContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); - auto viewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName()); - // If the viewportContext exists and is created with the default ID, we can safely assume control - if (viewportContext && viewportContext->GetId() == -10) - { - m_viewportContext = viewportContext; - } - } - - if (m_viewportContext) - { - m_viewportContext->SetRenderScene(AZ::RPI::RPISystemInterface::Get()->GetDefaultScene()); - m_viewportContext->RenderTick(); - } - - m_isInFrame = false; -} - -void CAtomShimRenderer::TryFlush() -{ -} - -void CAtomShimRenderer::GetMemoryUsage([[maybe_unused]] ICrySizer* Sizer) -{ -} - -WIN_HWND CAtomShimRenderer::GetHWND() -{ - return Platform::GetNativeWindowHandle(); -} - -bool CAtomShimRenderer::SetWindowIcon([[maybe_unused]] const char* path) -{ - return false; -} - -ERenderType CAtomShimRenderer::GetRenderType() const -{ - return eRT_Undefined; -} - -const char* CAtomShimRenderer::GetRenderDescription() const -{ - return m_rendererDescription.c_str(); -} - -void TexBlurAnisotropicVertical([[maybe_unused]] CTexture* pTex, [[maybe_unused]] int nAmount, [[maybe_unused]] float fScale, [[maybe_unused]] float fDistribution, [[maybe_unused]] bool bAlphaOnly) -{ -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -//IMAGES DRAWING -//////////////////////////////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::Draw2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] int texture_id, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] float r, [[maybe_unused]] float g, [[maybe_unused]] float b, [[maybe_unused]] float a, [[maybe_unused]] float z) -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::Push2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] int texture_id, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] float r, [[maybe_unused]] float g, [[maybe_unused]] float b, [[maybe_unused]] float a, [[maybe_unused]] float z, [[maybe_unused]] float stereoDepth) -{ -} - -void CAtomShimRenderer::Draw2dImageList() -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::DrawImage(float xpos, float ypos, float w, float h, int texture_id, float s0, float t0, float s1, float t1, float r, float g, float b, float a, bool filtered) -{ - float s[4], t[4]; - - s[0] = s0; - t[0] = 1.0f - t0; - s[1] = s1; - t[1] = 1.0f - t0; - s[2] = s1; - t[2] = 1.0f - t1; - s[3] = s0; - t[3] = 1.0f - t1; - - DrawImageWithUV(xpos, ypos, 0, w, h, texture_id, s, t, r, g, b, a, filtered); -} - -/////////////////////////////////////////// -void CAtomShimRenderer::DrawImageWithUV(float xpos, float ypos, float z, float w, float h, int texture_id, float s[4], float t[4], float r, float g, float b, float a, bool filtered) -{ - SetCullMode(R_CULL_DISABLE); - EF_SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); - EF_SetSrgbWrite(false); - - DWORD col = D3DRGBA(r, g, b, a); - - SVF_P3F_C4B_T2F vQuad[4]; - - vQuad[0].xyz.x = xpos; - vQuad[0].xyz.y = ypos; - vQuad[0].xyz.z = z; - vQuad[0].st = Vec2(s[0], t[0]); - vQuad[0].color.dcolor = col; - - vQuad[1].xyz.x = xpos + w; - vQuad[1].xyz.y = ypos; - vQuad[1].xyz.z = z; - vQuad[1].st = Vec2(s[1], t[1]); - vQuad[1].color.dcolor = col; - - vQuad[2].xyz.x = xpos; - vQuad[2].xyz.y = ypos + h; - vQuad[2].xyz.z = z; - vQuad[2].st = Vec2(s[3], t[3]); - vQuad[2].color.dcolor = col; - - vQuad[3].xyz.x = xpos + w; - vQuad[3].xyz.y = ypos + h; - vQuad[3].xyz.z = z; - vQuad[3].st = Vec2(s[2], t[2]); - vQuad[3].color.dcolor = col; - - STexState TS; - TS.SetFilterMode(filtered ? FILTER_BILINEAR : FILTER_POINT); - TS.SetClampMode(1, 1, 1); - SetTexture(texture_id); - - DrawDynVB(vQuad, nullptr, 4, 0, prtTriangleStrip); -} - -/////////////////////////////////////////// -void CAtomShimRenderer::DrawBuffer([[maybe_unused]] CVertexBuffer* pVBuf, [[maybe_unused]] CIndexBuffer* pIBuf, [[maybe_unused]] int nNumIndices, [[maybe_unused]] int nOffsIndex, [[maybe_unused]] const PublicRenderPrimitiveType nPrmode, [[maybe_unused]] int nVertStart, [[maybe_unused]] int nVertStop) -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::DrawPrimitivesInternal([[maybe_unused]] CVertexBuffer* src, [[maybe_unused]] int vert_num, [[maybe_unused]] const eRenderPrimitiveType prim_type) -{ -} - -/////////////////////////////////////////// -void CRenderMesh::DrawImmediately() -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::SetCullMode(int mode) -{ - AZ::RHI::CullMode cullMode = AZ::RHI::CullMode::None; - switch (mode) - { - case R_CULL_FRONT: - cullMode = AZ::RHI::CullMode::Front; - break; - case R_CULL_BACK: - cullMode = AZ::RHI::CullMode::Back; - break; - } - m_dynamicDraw->SetCullMode(cullMode); -} - -/////////////////////////////////////////// -bool CAtomShimRenderer::EnableFog([[maybe_unused]] bool enable) -{ - return false; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -//MISC EXTENSIONS -//////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////// -void CAtomShimRenderer::EnableVSync([[maybe_unused]] bool enable) -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::SelectTMU([[maybe_unused]] int tnum) -{ -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -//MATRIX FUNCTIONS -//////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////// -void CAtomShimRenderer::PushMatrix() -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::RotateMatrix([[maybe_unused]] float a, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z) -{ -} - -void CAtomShimRenderer::RotateMatrix([[maybe_unused]] const Vec3& angles) -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::TranslateMatrix([[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z) -{ -} - -void CAtomShimRenderer::MultMatrix([[maybe_unused]] const float* mat) -{ -} - -void CAtomShimRenderer::TranslateMatrix([[maybe_unused]] const Vec3& pos) -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::ScaleMatrix([[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z) -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::PopMatrix() -{ -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::LoadMatrix([[maybe_unused]] const Matrix34* src) -{ -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -//MISC -//////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////// -void CAtomShimRenderer::PushWireframeMode([[maybe_unused]] int mode){} -void CAtomShimRenderer::PopWireframeMode(){} -void CAtomShimRenderer::FX_PushWireframeMode([[maybe_unused]] int mode){} -void CAtomShimRenderer::FX_PopWireframeMode(){} -void CAtomShimRenderer::FX_SetWireframeMode([[maybe_unused]] int mode){} - -/////////////////////////////////////////// -void CAtomShimRenderer::SetCamera(const CCamera& cam) -{ - CacheCameraConfiguration(cam); - CacheCameraTransform(cam); - - int nThreadID = m_pRT->GetThreadList(); - - // Ortho-normalize camera matrix in double precision to minimize numerical errors and improve precision when inverting matrix - Matrix34_tpl<f64> mCam34 = cam.GetMatrix(); - mCam34.OrthonormalizeFast(); - - Matrix44_tpl<f64> mCam44T = mCam34.GetTransposed(); - Matrix44_tpl<f64> mView64; - mathMatrixLookAtInverse(&mView64, &mCam44T); - - Matrix44 mView = (Matrix44_tpl<f32>)mView64; - - // Rotate around x-axis by -PI/2 - Matrix44 mViewFinal = mView; - mViewFinal.m01 = mView.m02; - mViewFinal.m02 = -mView.m01; - mViewFinal.m11 = mView.m12; - mViewFinal.m12 = -mView.m11; - mViewFinal.m21 = mView.m22; - mViewFinal.m22 = -mView.m21; - mViewFinal.m31 = mView.m32; - mViewFinal.m32 = -mView.m31; - - m_RP.m_TI[nThreadID].m_matView = mViewFinal; - - mViewFinal.m30 = 0; - mViewFinal.m31 = 0; - mViewFinal.m32 = 0; - m_CameraZeroMatrix[nThreadID] = mViewFinal; - - if (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_MIRRORCAMERA) - { - Matrix44A tmp; - - tmp = Matrix44A(Matrix33::CreateScale(Vec3(1, -1, 1))).GetTransposed(); - m_RP.m_TI[nThreadID].m_matView = tmp * m_RP.m_TI[nThreadID].m_matView; - } - - m_RP.m_TI[nThreadID].m_cam = cam; - - CameraViewParameters viewParameters; - - // Asymmetric frustum - float Near = cam.GetNearPlane(), Far = cam.GetFarPlane(); - - float wT = tanf(cam.GetFov() * 0.5f) * Near, wB = -wT; - float wR = wT * cam.GetProjRatio(), wL = -wR; - - viewParameters.Frustum(wL + cam.GetAsymL(), wR + cam.GetAsymR(), wB + cam.GetAsymB(), wT + cam.GetAsymT(), Near, Far); - - Vec3 vEye = cam.GetPosition(); - Vec3 vAt = vEye + Vec3((f32)mCam34(0, 1), (f32)mCam34(1, 1), (f32)mCam34(2, 1)); - Vec3 vUp = Vec3((f32)mCam34(0, 2), (f32)mCam34(1, 2), (f32)mCam34(2, 2)); - viewParameters.LookAt(vEye, vAt, vUp); - ApplyViewParameters(viewParameters); - - // Set the Atom view for the context to match the given camera - { - AZ::RPI::ViewPtr viewForCurrentContext; - - // If we have a current context (which we have in Editor but not yet in launcher) then use the view from that. - // Otherwise use the default view from the default scene. - if (m_currContext && m_currContext->m_view) - { - viewForCurrentContext = m_currContext->m_view; - } - else - { - AZ::RPI::ScenePtr scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); - AZ::RPI::RenderPipelinePtr renderPipeline = scene->GetDefaultRenderPipeline(); - if (renderPipeline) - { - viewForCurrentContext = renderPipeline->GetDefaultView(); - } - } - - if (viewForCurrentContext) - { - // Set camera to world transform for view - AZ::Matrix3x4 cameraWorldTransform = LYTransformToAZMatrix3x4(cam.GetMatrix()); - viewForCurrentContext->SetCameraTransform(cameraWorldTransform); - - // Set projection transform for view - // [GFX TODO] [ATOM-1501] Currently we always assume reverse depth - float fov = cam.GetFov(); - float aspectRatio = cam.GetProjRatio(); - float nearPlane = cam.GetNearPlane(); - float farPlane = cam.GetFarPlane(); - AZ::Matrix4x4 viewToClipMatrix; - AZ::MakePerspectiveFovMatrixRH(viewToClipMatrix, fov, aspectRatio, nearPlane, farPlane, true); - viewForCurrentContext->SetViewToClipMatrix(viewToClipMatrix); - } - } -} - -void CAtomShimRenderer::GetViewport(int* x, int* y, int* width, int* height) const -{ - const SViewport& vp = m_MainRTViewport; - *x = vp.nX; - *y = vp.nY; - *width = vp.nWidth; - *height = vp.nHeight; -} - -void CAtomShimRenderer::SetViewport(int x, int y, int width, int height, [[maybe_unused]] int id) -{ - m_MainRTViewport.nX = x; - m_MainRTViewport.nY = y; - m_MainRTViewport.nWidth = width; - m_MainRTViewport.nHeight = height; - - m_width = width; - m_height = height; -} - -void CAtomShimRenderer::SetScissor(int x, int y, int width, int height) -{ - m_dynamicDraw->SetScissor(AZ::RHI::Scissor(x, y, x + width, y + height)); -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::GetModelViewMatrix(float* mat) -{ - int nThreadID = m_pRT->GetThreadList(); - *(Matrix44*)mat = m_RP.m_TI[nThreadID].m_matView; -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::GetProjectionMatrix(float* mat) -{ - int nThreadID = m_pRT->GetThreadList(); - *(Matrix44*)mat = m_RP.m_TI[nThreadID].m_matProj; -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::SetMatrices(float* pProjMat, float* pViewMat) -{ - int nThreadID = m_pRT->GetThreadList(); - m_RP.m_TI[nThreadID].m_matProj = *(Matrix44*)pProjMat; - m_RP.m_TI[nThreadID].m_matView = *(Matrix44*)pViewMat; -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::ApplyViewParameters(const CameraViewParameters& viewParameters) -{ - int nThreadID = m_pRT->GetThreadList(); - m_RP.m_TI[nThreadID].m_cam.m_viewParameters = viewParameters; - Matrix44A* m = &m_RP.m_TI[nThreadID].m_matView; - viewParameters.GetModelviewMatrix((float*)m); - if (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_MIRRORCAMERA) - { - Matrix44A tmp; - - tmp = Matrix44A(Matrix33::CreateScale(Vec3(1, -1, 1))).GetTransposed(); - m_RP.m_TI[nThreadID].m_matView = tmp * m_RP.m_TI[nThreadID].m_matView; - } - m = &m_RP.m_TI[nThreadID].m_matProj; - - const bool bReverseDepth = true; // [GFX TODO] [ATOM-1501] Currently we always assume reverse depth - const bool bWasReverseDepth = (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_REVERSE_DEPTH) != 0 ? 1 : 0; - - m_RP.m_TI[nThreadID].m_PersFlags &= ~RBPF_REVERSE_DEPTH; - if (bReverseDepth) - { - mathMatrixPerspectiveOffCenterReverseDepth((Matrix44A*)m, viewParameters.fWL, viewParameters.fWR, viewParameters.fWB, viewParameters.fWT, viewParameters.fNear, viewParameters.fFar); - m_RP.m_TI[nThreadID].m_PersFlags |= RBPF_REVERSE_DEPTH; - } - -} - -// Check if a file exists. This does not go through the AssetCatalog so that it can identify files that exist but aren't processed yet, -// and so that it will work before the AssetCatalog has loaded -bool CheckIfFileExists(const AZStd::string& sourceRelativePath, const AZStd::string& cacheRelativePath) -{ - // If the file exists, it has already been processed and does not need to be modified - bool fileExists = AZ::IO::FileIOBase::GetInstance()->Exists(cacheRelativePath.c_str()); - - if (!fileExists) - { - // If the texture doesn't exist check if it's queued or being compiled. - AzFramework::AssetSystem::AssetStatus status; - AzFramework::AssetSystemRequestBus::BroadcastResult(status, &AzFramework::AssetSystemRequestBus::Events::GetAssetStatus, sourceRelativePath); - - switch (status) - { - case AzFramework::AssetSystem::AssetStatus_Queued: - case AzFramework::AssetSystem::AssetStatus_Compiling: - case AzFramework::AssetSystem::AssetStatus_Compiled: - case AzFramework::AssetSystem::AssetStatus_Failed: - { - // The file is queued, in progress, or finished processing after the initial FileIO check - fileExists = true; - break; - } - case AzFramework::AssetSystem::AssetStatus_Unknown: - case AzFramework::AssetSystem::AssetStatus_Missing: - default: - { - // The file does not exist - fileExists = false; - break; - } - } - } - - return fileExists; -} - -////////////////////////////////////////////////////////////////////// -ITexture* CAtomShimRenderer::EF_LoadTexture(const char * nameTex, const uint32 flags) -{ - AtomShimTexture* atomTexture = nullptr; - - // have to see if it is already loaded - CBaseResource* pBR = CBaseResource::GetResource(CTexture::mfGetClassName(), nameTex, false); - if (pBR) - { - // if a texture with this ID exists but it is not an Atom texture then we return nullptr - CTexture* texture = static_cast<CTexture*>(pBR); - AtomShimTexture* atomTexture2 = CastITextureToAtomShimTexture(texture); - if (atomTexture2) - { - atomTexture2->AddRef(); - return atomTexture2; - } - else - { - return nullptr; - } - } - - AZ_Error("CAtomShimRenderer", AzFramework::StringFunc::Path::IsRelative(nameTex), "CAtomShimRenderer::EF_LoadTexture assumes that it will always be given a relative path, but got '%s'", nameTex); - - atomTexture = new AtomShimTexture(flags); - atomTexture->Register(CTexture::mfGetClassName(), nameTex); - atomTexture->SetSourceName( nameTex ); // needs to be normalized? - - AZStd::string sourceRelativePath(nameTex); - AZStd::string cacheRelativePath = sourceRelativePath + ".streamingimage"; - - bool textureExists = false; - textureExists = CheckIfFileExists(sourceRelativePath, cacheRelativePath); - - if(!textureExists) - { - // A lot of cry code uses the .dds extension even when the actual source file is .tif. - // For the .streamingimage file we need the correct source extension before .streamingimage - // So if the file doesn't exist and the extension was .dds then try replacing it with .tif - AZStd::string extension; - AzFramework::StringFunc::Path::GetExtension(nameTex, extension, false); - if (extension == "dds") - { - sourceRelativePath = nameTex; - - static const char* textureExtensions[] = { "png", "tif", "tiff", "tga", "jpg", "jpeg", "bmp", "gif" }; - - for (const char* extensionReplacement : textureExtensions) - { - AzFramework::StringFunc::Path::ReplaceExtension(sourceRelativePath, extensionReplacement); - cacheRelativePath = sourceRelativePath + ".streamingimage"; - - textureExists = CheckIfFileExists(sourceRelativePath, cacheRelativePath); - if (textureExists) - { - break; - } - } - } - } - - if(!textureExists) - { - AZ_Error("CAtomShimRenderer", false, "EF_LoadTexture attempted to load '%s', but it does not exist.", nameTex); - // Since neither the given extension nor the .dds version exist, we'll default to the given extension for hot-reloading in case the file is added to the source folder later - sourceRelativePath = nameTex; - cacheRelativePath = sourceRelativePath + ".streamingimage"; - } - - // now load the texture - // NOTE: CTexture::CreateTexture does the actual setting of texture data in Cry D3D case - // But it also calls CreateDeviceTexture - - { - using namespace AZ; - - // The file may not be in the AssetCatalog at this point if it is still processing or doesn't exist on disk. - // Use GenerateAssetIdTEMP instead of GetAssetIdByPath so that it will return a valid AssetId anyways - Data::AssetId streamingImageAssetId; - Data::AssetCatalogRequestBus::BroadcastResult( - streamingImageAssetId, &Data::AssetCatalogRequestBus::Events::GenerateAssetIdTEMP, - sourceRelativePath.c_str()); - streamingImageAssetId.m_subId = RPI::StreamingImageAsset::GetImageAssetSubId(); - - auto streamingImageAsset = Data::AssetManager::Instance().FindOrCreateAsset<RPI::StreamingImageAsset>(streamingImageAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - - if (!streamingImageAsset.IsReady()) - { - atomTexture->QueueForHotReload(streamingImageAssetId); - } - else - { - atomTexture->CreateFromStreamingImageAsset(streamingImageAsset); - } - } - - atomTexture->SetTexStates(); - - return atomTexture; -} - -////////////////////////////////////////////////////////////////////// -ITexture* CAtomShimRenderer::EF_LoadDefaultTexture(const char * nameTex) -{ - return CTextureManager::Instance()->GetDefaultTexture(nameTex); -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::DrawQuad([[maybe_unused]] const Vec3& right, [[maybe_unused]] const Vec3& up, [[maybe_unused]] const Vec3& origin, [[maybe_unused]] int nFlipmode /*=0*/) -{ -} - -////////////////////////////////////////////////////////////////////// -bool CAtomShimRenderer::ProjectToScreen(float ptx, float pty, float ptz, float* sx, float* sy, float* sz) -{ - int nThreadID = m_pRT->GetThreadList(); - SViewport& vp = m_MainRTViewport; - - Vec3 vOut, vIn; - vIn.x = ptx; - vIn.y = pty; - vIn.z = ptz; - - int32 v[4]; - v[0] = vp.nX; - v[1] = vp.nY; - v[2] = vp.nWidth; - v[3] = vp.nHeight; - - Matrix44A mIdent; - mIdent.SetIdentity(); - if (mathVec3Project( - &vOut, - &vIn, - v, - &m_RP.m_TI[nThreadID].m_matProj, - &m_RP.m_TI[nThreadID].m_matView, - &mIdent)) - { - *sx = vOut.x * 100 / vp.nWidth; - *sy = vOut.y * 100 / vp.nHeight; - *sz = (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_REVERSE_DEPTH) ? 1.0f - vOut.z : vOut.z; - - return true; - } - - return false; -} - -static bool InvertMatrixPrecise(Matrix44& out, const float* m) -{ - // Inverts matrix using Gaussian Elimination which is slower but numerically more stable than Cramer's Rule - - float expmat[4][8] = { - { m[0], m[4], m[8], m[12], 1.f, 0.f, 0.f, 0.f }, - { m[1], m[5], m[9], m[13], 0.f, 1.f, 0.f, 0.f }, - { m[2], m[6], m[10], m[14], 0.f, 0.f, 1.f, 0.f }, - { m[3], m[7], m[11], m[15], 0.f, 0.f, 0.f, 1.f } - }; - - float t0, t1, t2, t3, t; - float* r0 = expmat[0], * r1 = expmat[1], * r2 = expmat[2], * r3 = expmat[3]; - - // Choose pivots and eliminate variables - if (fabs(r3[0]) > fabs(r2[0])) - { - std::swap(r3, r2); - } - if (fabs(r2[0]) > fabs(r1[0])) - { - std::swap(r2, r1); - } - if (fabs(r1[0]) > fabs(r0[0])) - { - std::swap(r1, r0); - } - if (r0[0] == 0) - { - return false; - } - t1 = r1[0] / r0[0]; - t2 = r2[0] / r0[0]; - t3 = r3[0] / r0[0]; - t = r0[1]; - r1[1] -= t1 * t; - r2[1] -= t2 * t; - r3[1] -= t3 * t; - t = r0[2]; - r1[2] -= t1 * t; - r2[2] -= t2 * t; - r3[2] -= t3 * t; - t = r0[3]; - r1[3] -= t1 * t; - r2[3] -= t2 * t; - r3[3] -= t3 * t; - t = r0[4]; - if (t != 0.0) - { - r1[4] -= t1 * t; - r2[4] -= t2 * t; - r3[4] -= t3 * t; - } - t = r0[5]; - if (t != 0.0) - { - r1[5] -= t1 * t; - r2[5] -= t2 * t; - r3[5] -= t3 * t; - } - t = r0[6]; - if (t != 0.0) - { - r1[6] -= t1 * t; - r2[6] -= t2 * t; - r3[6] -= t3 * t; - } - t = r0[7]; - if (t != 0.0) - { - r1[7] -= t1 * t; - r2[7] -= t2 * t; - r3[7] -= t3 * t; - } - - if (fabs(r3[1]) > fabs(r2[1])) - { - std::swap(r3, r2); - } - if (fabs(r2[1]) > fabs(r1[1])) - { - std::swap(r2, r1); - } - if (r1[1] == 0) - { - return false; - } - t2 = r2[1] / r1[1]; - t3 = r3[1] / r1[1]; - r2[2] -= t2 * r1[2]; - r3[2] -= t3 * r1[2]; - r2[3] -= t2 * r1[3]; - r3[3] -= t3 * r1[3]; - t = r1[4]; - if (0.0 != t) - { - r2[4] -= t2 * t; - r3[4] -= t3 * t; - } - t = r1[5]; - if (0.0 != t) - { - r2[5] -= t2 * t; - r3[5] -= t3 * t; - } - t = r1[6]; - if (0.0 != t) - { - r2[6] -= t2 * t; - r3[6] -= t3 * t; - } - t = r1[7]; - if (0.0 != t) - { - r2[7] -= t2 * t; - r3[7] -= t3 * t; - } - - if (fabs(r3[2]) > fabs(r2[2])) - { - std::swap(r3, r2); - } - if (r2[2] == 0) - { - return false; - } - t3 = r3[2] / r2[2]; - r3[3] -= t3 * r2[3]; - r3[4] -= t3 * r2[4]; - r3[5] -= t3 * r2[5]; - r3[6] -= t3 * r2[6]; - r3[7] -= t3 * r2[7]; - - if (r3[3] == 0) - { - return false; - } - - // Substitute back - t = 1.0f / r3[3]; - r3[4] *= t; - r3[5] *= t; - r3[6] *= t; - r3[7] *= t; // Row 3 - - t2 = r2[3]; - t = 1.0f / r2[2]; // Row 2 - r2[4] = t * (r2[4] - r3[4] * t2); - r2[5] = t * (r2[5] - r3[5] * t2); - r2[6] = t * (r2[6] - r3[6] * t2); - r2[7] = t * (r2[7] - r3[7] * t2); - t1 = r1[3]; - r1[4] -= r3[4] * t1; - r1[5] -= r3[5] * t1; - r1[6] -= r3[6] * t1; - r1[7] -= r3[7] * t1; - t0 = r0[3]; - r0[4] -= r3[4] * t0; - r0[5] -= r3[5] * t0; - r0[6] -= r3[6] * t0; - r0[7] -= r3[7] * t0; - - t1 = r1[2]; - t = 1.0f / r1[1]; // Row 1 - r1[4] = t * (r1[4] - r2[4] * t1); - r1[5] = t * (r1[5] - r2[5] * t1); - r1[6] = t * (r1[6] - r2[6] * t1); - r1[7] = t * (r1[7] - r2[7] * t1); - t0 = r0[2]; - r0[4] -= r2[4] * t0; - r0[5] -= r2[5] * t0; - r0[6] -= r2[6] * t0, r0[7] -= r2[7] * t0; - - t0 = r0[1]; - t = 1.0f / r0[0]; // Row 0 - r0[4] = t * (r0[4] - r1[4] * t0); - r0[5] = t * (r0[5] - r1[5] * t0); - r0[6] = t * (r0[6] - r1[6] * t0); - r0[7] = t * (r0[7] - r1[7] * t0); - - out.m00 = r0[4]; - out.m01 = r0[5]; - out.m02 = r0[6]; - out.m03 = r0[7]; - out.m10 = r1[4]; - out.m11 = r1[5]; - out.m12 = r1[6]; - out.m13 = r1[7]; - out.m20 = r2[4]; - out.m21 = r2[5]; - out.m22 = r2[6]; - out.m23 = r2[7]; - out.m30 = r3[4]; - out.m31 = r3[5]; - out.m32 = r3[6]; - out.m33 = r3[7]; - - return true; -} - -static int sUnProject(float winx, float winy, float winz, const float model[16], const float proj[16], const int viewport[4], float* objx, float* objy, float* objz) -{ - Vec4 vIn; - vIn.x = (winx - viewport[0]) * 2 / viewport[2] - 1.0f; - vIn.y = (winy - viewport[1]) * 2 / viewport[3] - 1.0f; - vIn.z = winz;//2.0f * winz - 1.0f; - vIn.w = 1.0; - - float m1[16]; - for (int i = 0; i < 4; i++) - { - float ai0 = proj[i], ai1 = proj[4 + i], ai2 = proj[8 + i], ai3 = proj[12 + i]; - m1[i] = ai0 * model[0] + ai1 * model[1] + ai2 * model[2] + ai3 * model[3]; - m1[4 + i] = ai0 * model[4] + ai1 * model[5] + ai2 * model[6] + ai3 * model[7]; - m1[8 + i] = ai0 * model[8] + ai1 * model[9] + ai2 * model[10] + ai3 * model[11]; - m1[12 + i] = ai0 * model[12] + ai1 * model[13] + ai2 * model[14] + ai3 * model[15]; - } - - Matrix44 m; - InvertMatrixPrecise(m, m1); - - Vec4 vOut = m * vIn; - if (vOut.w == 0.0) - { - return false; - } - *objx = vOut.x / vOut.w; - *objy = vOut.y / vOut.w; - *objz = vOut.z / vOut.w; - return true; -} - -int CAtomShimRenderer::UnProject(float sx, float sy, float sz, - float* px, float* py, float* pz, - const float modelMatrix[16], - const float projMatrix[16], - const int viewport[4]) -{ - return sUnProject(sx, sy, sz, modelMatrix, projMatrix, viewport, px, py, pz); -} - -////////////////////////////////////////////////////////////////////// -int CAtomShimRenderer::UnProjectFromScreen(float sx, float sy, float sz, - float* px, float* py, float* pz) -{ - float modelMatrix[16]; - float projMatrix[16]; - int viewport[4]; - - const int nThreadID = m_pRT->GetThreadList(); - if (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_REVERSE_DEPTH) - { - sz = 1.0f - sz; - } - - GetModelViewMatrix(modelMatrix); - GetProjectionMatrix(projMatrix); - GetViewport(&viewport[0], &viewport[1], &viewport[2], &viewport[3]); - return sUnProject(sx, sy, sz, modelMatrix, projMatrix, viewport, px, py, pz); -} - -////////////////////////////////////////////////////////////////////// -bool CAtomShimRenderer::ScreenShot([[maybe_unused]] const char* filename, [[maybe_unused]] int width) -{ - return true; -} - -int CAtomShimRenderer::ScreenToTexture([[maybe_unused]] int nTexID) -{ - return 0; -} - -void CAtomShimRenderer::ResetToDefault() -{ -} - -/////////////////////////////////////////// -void CAtomShimRenderer::SetMaterialColor([[maybe_unused]] float r, [[maybe_unused]] float g, [[maybe_unused]] float b, [[maybe_unused]] float a) -{ -} - -////////////////////////////////////////////////////////////////////// -void CAtomShimRenderer::ClearTargetsImmediately([[maybe_unused]] uint32 nFlags) {} -void CAtomShimRenderer::ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors, [[maybe_unused]] float fDepth) {} -void CAtomShimRenderer::ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors) {} -void CAtomShimRenderer::ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] float fDepth) {} - -void CAtomShimRenderer::ClearTargetsLater([[maybe_unused]] uint32 nFlags) {} -void CAtomShimRenderer::ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors, [[maybe_unused]] float fDepth) {} -void CAtomShimRenderer::ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors) {} -void CAtomShimRenderer::ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] float fDepth) {} - -void CAtomShimRenderer::ReadFrameBuffer([[maybe_unused]] unsigned char* pRGB, [[maybe_unused]] int nImageX, [[maybe_unused]] int nSizeX, [[maybe_unused]] int nSizeY, [[maybe_unused]] ERB_Type eRBType, [[maybe_unused]] bool bRGBA, [[maybe_unused]] int nScaledX, [[maybe_unused]] int nScaledY) -{ -} - -void CAtomShimRenderer::ReadFrameBufferFast([[maybe_unused]] uint32* pDstARGBA8, [[maybe_unused]] int dstWidth, [[maybe_unused]] int dstHeight, [[maybe_unused]] bool BGRA) -{ -} - -bool CAtomShimRenderer::CaptureFrameBufferFast([[maybe_unused]] unsigned char* pDstRGBA8, [[maybe_unused]] int destinationWidth, [[maybe_unused]] int destinationHeight) -{ - return false; -} -bool CAtomShimRenderer::CopyFrameBufferFast([[maybe_unused]] unsigned char* pDstRGBA8, [[maybe_unused]] int destinationWidth, [[maybe_unused]] int destinationHeight) -{ - return false; -} - -bool CAtomShimRenderer::InitCaptureFrameBufferFast([[maybe_unused]] uint32 bufferWidth, [[maybe_unused]] uint32 bufferHeight) -{ - return(false); -} - -void CAtomShimRenderer::CloseCaptureFrameBufferFast(void) -{ -} - -bool CAtomShimRenderer::RegisterCaptureFrame([[maybe_unused]] ICaptureFrameListener* pCapture) -{ - return(false); -} -bool CAtomShimRenderer::UnRegisterCaptureFrame([[maybe_unused]] ICaptureFrameListener* pCapture) -{ - return(false); -} - -void CAtomShimRenderer::CaptureFrameBufferCallBack(void) -{ -} - - -void CAtomShimRenderer::SetFogColor([[maybe_unused]] const ColorF& color) -{ -} - -void CAtomShimRenderer::DrawQuad([[maybe_unused]] float dy, [[maybe_unused]] float dx, [[maybe_unused]] float dz, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z) -{ -} - -////////////////////////////////////////////////////////////////////// - -int CAtomShimRenderer::CreateRenderTarget([[maybe_unused]] const char* name, [[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] const ColorF& cClear, [[maybe_unused]] ETEX_Format eTF) -{ - return 0; -} - -bool CAtomShimRenderer::ResizeRenderTarget([[maybe_unused]] int nHandle, [[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight) -{ - return true; -} - -bool CAtomShimRenderer::DestroyRenderTarget([[maybe_unused]] int nHandle) -{ - return true; -} - -bool CAtomShimRenderer::SetRenderTarget([[maybe_unused]] int nHandle, [[maybe_unused]] SDepthTexture* pDepthSurf) -{ - return true; -} - -SDepthTexture* CAtomShimRenderer::CreateDepthSurface([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] bool shaderResourceView) -{ - return nullptr; -} - -void CAtomShimRenderer::DestroyDepthSurface([[maybe_unused]] SDepthTexture* pDepthSurf) -{ -} - -void CAtomShimRenderer::WaitForParticleBuffer([[maybe_unused]] threadID nThreadId) -{ -} - -int CAtomShimRenderer::GetOcclusionBuffer([[maybe_unused]] uint16* pOutOcclBuffer, [[maybe_unused]] Matrix44* pmCamBuffe) -{ - return 0; -} - -IColorGradingController* CAtomShimRenderer::GetIColorGradingController() -{ - return m_pAtomShimColorGradingController; -} - -IStereoRenderer* CAtomShimRenderer::GetIStereoRenderer() -{ - return m_pAtomShimStereoRenderer; -} - -ITexture* CAtomShimRenderer::Create2DTexture([[maybe_unused]] const char* name, [[maybe_unused]] int width, [[maybe_unused]] int height, [[maybe_unused]] int numMips, [[maybe_unused]] int flags, [[maybe_unused]] unsigned char* data, [[maybe_unused]] ETEX_Format format) -{ - return nullptr; -} - -//========================================================================================= - - -ILog* iLog; -IConsole* iConsole; -ITimer* iTimer; -ISystem* iSystem; - -StaticInstance<CAtomShimRenderer> g_nullRenderer; - -extern "C" DLL_EXPORT IRenderer * CreateCryRenderInterface(ISystem * pSystem) -{ - ModuleInitISystem(pSystem, "CryRenderer"); - - gbRgb = false; - - iConsole = gEnv->pConsole; - iLog = gEnv->pLog; - iTimer = gEnv->pTimer; - iSystem = gEnv->pSystem; - - CRenderer* rd = g_nullRenderer; - if (rd) - { - rd->InitRenderer(); - } - - std::random_device randDev; - srand(static_cast<int>(randDev())); - - return rd; -} - -class CEngineModule_CryRenderer - : public IEngineModule -{ - CRYINTERFACE_SIMPLE(IEngineModule) - CRYGENERATE_SINGLETONCLASS(CEngineModule_CryRenderer, "EngineModule_CryRenderer", 0x540c91a7338e41d3, 0xaceeac9d55614450) - - virtual const char* GetName() const { - return "CryRenderer"; - } - virtual const char* GetCategory() const {return "CryEngine"; } - - virtual bool Initialize(SSystemGlobalEnvironment& env, [[maybe_unused]] const SSystemInitParams& initParams) - { - ISystem* pSystem = env.pSystem; - env.pRenderer = CreateCryRenderInterface(pSystem); - return env.pRenderer != 0; - } -}; - -CRYREGISTER_SINGLETON_CLASS(CEngineModule_CryRenderer) - -CEngineModule_CryRenderer::CEngineModule_CryRenderer() -{ -}; - -CEngineModule_CryRenderer::~CEngineModule_CryRenderer() -{ -}; - -void COcclusionQuery::Create() -{ -} - -void COcclusionQuery::Release() -{ -} - -void COcclusionQuery::BeginQuery() -{ -} - -void COcclusionQuery::EndQuery() -{ -} - -uint32 COcclusionQuery::GetVisibleSamples([[maybe_unused]] bool bAsynchronous) -{ - return 0; -} - -/*static*/ FurBendData& FurBendData::Get() -{ - static FurBendData s_instance; - return s_instance; -} - -void FurBendData::InsertNewElements() -{ -} - -void FurBendData::FreeData() -{ -} - -void FurBendData::OnBeginFrame() -{ -} - -TArray<SRenderLight>* CRenderer::EF_GetDeferredLights([[maybe_unused]] const SRenderingPassInfo& passInfo, [[maybe_unused]] const eDeferredLightType eLightType) -{ - static TArray<SRenderLight> lights; - return &lights; -} - -SRenderLight* CRenderer::EF_GetDeferredLightByID([[maybe_unused]] const uint16 nLightID, [[maybe_unused]] const eDeferredLightType eLightType) -{ - return nullptr; -} - - -void CRenderer::BeginSpawningGeneratingRendItemJobs([[maybe_unused]] int nThreadID) -{ -} - -void CRenderer::BeginSpawningShadowGeneratingRendItemJobs([[maybe_unused]] int nThreadID) -{ -} - -void CRenderer::EndSpawningGeneratingRendItemJobs() -{ -} - -void CAtomShimRenderer::PrecacheResources() -{ -} - -bool CAtomShimRenderer::EF_PrecacheResource([[maybe_unused]] SShaderItem* pSI, [[maybe_unused]] float fMipFactorSI, [[maybe_unused]] float fTimeToReady, [[maybe_unused]] int Flags, [[maybe_unused]] int nUpdateId, [[maybe_unused]] int nCounter) -{ - return true; -} - -ITexture* CAtomShimRenderer::EF_CreateCompositeTexture([[maybe_unused]] int type, [[maybe_unused]] const char* szName, [[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] int nDepth, [[maybe_unused]] int nMips, [[maybe_unused]] int nFlags, [[maybe_unused]] ETEX_Format eTF, [[maybe_unused]] const STexComposition* pCompositions, [[maybe_unused]] size_t nCompositions, [[maybe_unused]] int8 nPriority) -{ - return CTextureManager::Instance()->GetNoTexture(); -} - -void CAtomShimRenderer::FX_ClearTarget([[maybe_unused]] ITexture* pTex) -{ -} - -void CAtomShimRenderer::FX_ClearTarget([[maybe_unused]] SDepthTexture* pTex) -{ -} - -bool CAtomShimRenderer::FX_SetRenderTarget([[maybe_unused]] int nTarget, [[maybe_unused]] void* pTargetSurf, [[maybe_unused]] SDepthTexture* pDepthTarget, [[maybe_unused]] uint32 nTileCount) -{ - return true; -} - -bool CAtomShimRenderer::FX_PushRenderTarget([[maybe_unused]] int nTarget, [[maybe_unused]] void* pTargetSurf, [[maybe_unused]] SDepthTexture* pDepthTarget, [[maybe_unused]] uint32 nTileCount) -{ - return true; -} - -bool CAtomShimRenderer::FX_SetRenderTarget([[maybe_unused]] int nTarget, [[maybe_unused]] CTexture* pTarget, [[maybe_unused]] SDepthTexture* pDepthTarget, [[maybe_unused]] bool bPush, [[maybe_unused]] int nCMSide, [[maybe_unused]] bool bScreenVP, [[maybe_unused]] uint32 nTileCount) -{ - return true; -} - -bool CAtomShimRenderer::FX_PushRenderTarget([[maybe_unused]] int nTarget, [[maybe_unused]] CTexture* pTarget, [[maybe_unused]] SDepthTexture* pDepthTarget, [[maybe_unused]] int nCMSide, [[maybe_unused]] bool bScreenVP, [[maybe_unused]] uint32 nTileCount) -{ - return true; -} -bool CAtomShimRenderer::FX_RestoreRenderTarget([[maybe_unused]] int nTarget) -{ - return true; -} -bool CAtomShimRenderer::FX_PopRenderTarget([[maybe_unused]] int nTarget) -{ - return true; -} - -IDynTexture* CAtomShimRenderer::CreateDynTexture2([[maybe_unused]] uint32 nWidth, [[maybe_unused]] uint32 nHeight, [[maybe_unused]] uint32 nTexFlags, [[maybe_unused]] const char* szSource, [[maybe_unused]] ETexPool eTexPool) -{ - return nullptr; -} - -void CAtomShimRenderer::InitSystemResources([[maybe_unused]] int nFlags) -{ - // This is an override of the implementation in CRenderer and is significantly cut down for the shim. - if (!m_bSystemResourcesInit || m_bDeviceLost == 2) - { - CTextureManager::Instance()->Init(); - m_bSystemResourcesInit = 1; - } -} - -void CAtomShimRenderer::SetTexture(int tnum) -{ - SetTexture(tnum, 0); -} - -void CAtomShimRenderer::SetTexture(int tnum, int nUnit) -{ - SetTextureForUnit(nUnit, tnum); -} - -void CAtomShimRenderer::SetState([[maybe_unused]] int State, [[maybe_unused]] int AlphaRef) -{ - // [GFX TODO] would need to implement this for LyShine mask support and blend mode support -} - -void CAtomShimRenderer::SetTextureForUnit(int unit, int textureId) -{ - AZ_Assert(unit >= 0 && unit < 32, "Invalid texture unit"); - AtomShimTexture* atomTexture = CastITextureToAtomShimTexture(EF_GetTextureByID(textureId)); - m_currentTextureForUnit[unit] = atomTexture; - m_clampFlagPerTextureUnit[unit] = (atomTexture->GetFlags() & FT_STATE_CLAMP) ? true : false; -} - -const AZ::Transform& CAtomShimRenderer::GetActiveCameraTransform() -{ - return m_cameraTransform; -} - -const Camera::Configuration& CAtomShimRenderer::GetActiveCameraConfiguration() -{ - return m_cameraConfiguration; -} - -void CAtomShimRenderer::CacheCameraTransform(const CCamera& camera) -{ - m_cameraTransform = LYTransformToAZTransform(camera.GetMatrix()); -} - -void CAtomShimRenderer::CacheCameraConfiguration(const CCamera& camera) -{ - Camera::Configuration& config = m_cameraConfiguration; - config.m_fovRadians = camera.GetFov(); - config.m_nearClipDistance = camera.GetNearPlane(); - config.m_farClipDistance = camera.GetFarPlane(); - config.m_frustumHeight = config.m_farClipDistance * tanf(config.m_fovRadians / 2) * 2; - config.m_frustumWidth = config.m_frustumHeight * camera.GetViewSurfaceX() / camera.GetViewSurfaceZ(); -} - -void CAtomShimRenderer::DrawStringU( - [[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, - [[maybe_unused]] const char* pStr, [[maybe_unused]] const bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const -{ - // RenderCallback disabled, ICryFont has been directly implemented on Atom by Gems/AtomLyIntegration/AtomFont. -} - -void CAtomShimRenderer::DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, const PublicRenderPrimitiveType nPrimType) -{ - using namespace AZ; - - // if nothing to draw then return - if (!pBuf || !nVerts || (pInds && !nInds) || (nInds && !pInds)) - { - return; - } - - // get view proj materix - Matrix44A matView, matProj; - GetModelViewMatrix(matView.GetData()); - GetProjectionMatrix(matProj.GetData()); - Matrix44A matViewProj = matView * matProj; - Matrix4x4 azMatViewProj = Matrix4x4::CreateFromColumnMajorFloat16(matViewProj.GetData()); - - bool isClamp = m_clampFlagPerTextureUnit[0]; - m_dynamicDraw->SetShaderVariant(isClamp? m_shaderVariantClamp : m_shaderVariantWrap); - - Data::Instance<RPI::ShaderResourceGroup> drawSrg = m_dynamicDraw->NewDrawSrg(); - drawSrg->SetConstant(m_viewProjInputIndex, azMatViewProj); - - AtomShimTexture* atomTexture = m_currentTextureForUnit[0]; - drawSrg->SetImageView(m_imageInputIndex, atomTexture->m_imageView.get()); - - drawSrg->Compile(); - - RHI::PrimitiveTopology primitiveType = RHI::PrimitiveTopology::TriangleList; - - switch (nPrimType) - { - case prtTriangleList: - primitiveType = RHI::PrimitiveTopology::TriangleList; - break; - case prtTriangleStrip: - primitiveType = RHI::PrimitiveTopology::TriangleStrip; - break; - case prtLineList: - primitiveType = RHI::PrimitiveTopology::LineList; - break; - case prtLineStrip: - primitiveType = RHI::PrimitiveTopology::LineStrip; - break; - } - - m_dynamicDraw->SetPrimitiveType(primitiveType); - - if (pInds) - { - m_dynamicDraw->DrawIndexed(pBuf, nVerts, pInds, nInds, RHI::IndexFormat::Uint16, drawSrg); - } - else - { - m_dynamicDraw->DrawLinear(pBuf, nVerts, drawSrg); - } -} - -void CAtomShimRenderer::DrawDynUiPrimitiveList( - [[maybe_unused]] DynUiPrimitiveList& primitives, [[maybe_unused]] int totalNumVertices, [[maybe_unused]] int totalNumIndices) -{ - // This function was only used by LyShine and LyShine is moving to Atom implementation. - return; -} - -void CAtomShimRenderer::Set2DMode(uint32 orthoWidth, uint32 orthoHeight, TransformationMatrices& backupMatrices, float znear, float zfar) -{ - Set2DModeNonZeroTopLeft(0.0f, 0.0f, static_cast<float>(orthoWidth), static_cast<float>(orthoHeight), backupMatrices, znear, zfar); -} - -void CAtomShimRenderer::Unset2DMode(const TransformationMatrices& restoringMatrices) -{ - int nThreadID = m_pRT->GetThreadList(); - -#ifdef _DEBUG - // Check that we are already in 2D mode on this thread and decrement the counter used for this check. - AZ_Assert(s_isIn2DMode[nThreadID]-- > 0, "Calls to Set2DMode and Unset2DMode appear mismatched"); -#endif - - m_RP.m_TI[nThreadID].m_matView = restoringMatrices.m_viewMatrix; - m_RP.m_TI[nThreadID].m_matProj = restoringMatrices.m_projectMatrix; - - // The legacy renderer supports nested Set2dMode/Unset2dMode so we use a counter to support that also. - m_isIn2dModeCounter--; - if (m_isIn2dModeCounter > 0) - { - // We're still in 2d mode, so set the viewProjOverride to the current matrix - // For 2d drawing, the view matrix is an identity matrix, so viewProj == proj - AZ::Matrix4x4 viewProj = AZ::Matrix4x4::CreateFromColumnMajorFloat16(m_RP.m_TI[nThreadID].m_matProj.GetData()); - m_pAtomShimRenderAuxGeom->SetViewProjOverride(viewProj); - } - else - { - m_pAtomShimRenderAuxGeom->UnsetViewProjOverride(); - } -} - -void CAtomShimRenderer::Set2DModeNonZeroTopLeft( - float orthoLeft, float orthoTop, float orthoWidth, float orthoHeight, TransformationMatrices& backupMatrices, float znear, float zfar) -{ - int nThreadID = m_pRT->GetThreadList(); - -#ifdef _DEBUG - // Increment the counter used to check that Set2DMode and Unset2DMode are balanced. - // It should never be negative before the increment. - AZ_Assert(s_isIn2DMode[nThreadID]++ >= 0, "Calls to Set2DMode and Unset2DMode appear mismatched"); -#endif - - backupMatrices.m_projectMatrix = m_RP.m_TI[nThreadID].m_matProj; - - // Move the zfar a bit away from the znear if they're the same. - if (AZ::IsClose(znear, zfar, .001f)) - { - zfar += .01f; - } - - float left = orthoLeft; - float right = left + orthoWidth; - float top = orthoTop; - float bottom = top + orthoHeight; - - mathMatrixOrthoOffCenterLH(&m_RP.m_TI[nThreadID].m_matProj, left, right, bottom, top, znear, zfar); - - if (m_RP.m_TI[nThreadID].m_PersFlags & RBPF_REVERSE_DEPTH) - { - // [GFX TODO] [ATOM-661] may need to reverse the depth here (though for 2D it may not be necessary) - } - - backupMatrices.m_viewMatrix = m_RP.m_TI[nThreadID].m_matView; - m_RP.m_TI[nThreadID].m_matView.SetIdentity(); - - m_isIn2dModeCounter++; - - // For 2d drawing, the view matrix is an identity matrix, so viewProj == proj - AZ::Matrix4x4 viewProj = AZ::Matrix4x4::CreateFromColumnMajorFloat16(m_RP.m_TI[nThreadID].m_matProj.GetData()); - m_pAtomShimRenderAuxGeom->SetViewProjOverride(viewProj); -} - -void CAtomShimRenderer::SetColorOp( - [[maybe_unused]] byte eCo, [[maybe_unused]] byte eAo, [[maybe_unused]] byte eCa, [[maybe_unused]] byte eAa) -{ - // this is only used by LY ImGui gem -} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h deleted file mode 100644 index a95dfb602c..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Renderer.h +++ /dev/null @@ -1,617 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#ifndef NULL_RENDERER_H -#define NULL_RENDERER_H - -#if _MSC_VER > 1000 -# pragma once -#endif - -/* -=========================================== -The NULLRenderer interface Class -=========================================== -*/ - -#define MAX_TEXTURE_STAGES 4 - -#include "CryArray.h" -#include "AtomShim_RenderAuxGeom.h" - -#include <AzCore/Module/Module.h> - -#include <AtomCore/Instance/Instance.h> - -#include <Atom/RHI.Reflect/Base.h> -#include <Atom/RHI/ImageView.h> -#include <Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h> -#include <Atom/RPI.Public/Image/StreamingImage.h> - -#include <AzFramework/Components/CameraBus.h> - -// Forward declaration. -namespace AZ -{ - namespace RHI - { - class Image; - } - - namespace RPI - { - class Scene; - class RenderPipeline; - class WindowContext; - class View; - class ViewportContext; - } -} - -//! A vector of these structs is used to keep track of the different viewports using Atom to render. -//! Each viewport currently has its own scene and pipeline. -struct AtomShimViewContext -{ - HWND m_hWnd; - bool m_isMainViewport; - - // width and height of the viewport. - // These are not fully used currently since each viewport window sends OnWindowResized messages to the WindowContext - // these could instead be sent via the AtomShim in future if desired. - int m_width; - int m_height; - - AZ::RPI::Scene* m_scene = nullptr; - AZStd::shared_ptr<AZ::RPI::RenderPipeline> m_renderPipeline; - AZStd::shared_ptr<AZ::RPI::View> m_view; -}; - -#define ATOM_SHIM_TEXTURE_TYPE eTT_MaxTexType - -struct AtomShimTexture - : public CTexture - , public AZ::Data::AssetBus::Handler -{ - AtomShimTexture(uint32 nFlags) : CTexture(nFlags) - { - } - - virtual ~AtomShimTexture(); - - void QueueForHotReload(const AZ::Data::AssetId& assetId); - - void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override; - - void CreateFromStreamingImageAsset(const AZ::Data::Asset<AZ::RPI::StreamingImageAsset>& streamingImageAsset); - void CreateFromImage(const AZ::Data::Instance<AZ::RPI::Image>& image); - - virtual void SetClamp(bool bEnable) - { - uint32 flags = GetFlags(); - if (bEnable) - { - flags |= FT_STATE_CLAMP; - } - else - { - flags &= ~FT_STATE_CLAMP; - } - SetFlags(flags); - } - - AZ::Data::Instance<AZ::RPI::Image> m_instance; // This is only set for textures loaded from an asset - AZ::RHI::Ptr<AZ::RHI::Image> m_image; // This is only set for textures created dynamically (e.g. font images) - AZ::RHI::Ptr<AZ::RHI::ImageView> m_imageView; -}; - -////////////////////////////////////////////////////////////////////// -class CAtomShimRenderer - : public CRenderer - , public AZ::Module // This is a base class so that StaticNames in the NameDictionary work in this DLL - , Camera::ActiveCameraRequestBus::Handler -{ -public: - - ////--------------------------------------------------------------------------------------------------------------------- - virtual SRenderPipeline* GetRenderPipeline() override { return nullptr; } - virtual SRenderThread* GetRenderThread() override { return nullptr; } - virtual void FX_SetState(int st, int AlphaRef = -1, int RestoreState = 0) override; - void SetCull([[maybe_unused]] ECull eCull, [[maybe_unused]] bool bSkipMirrorCull = false) override {} - virtual SDepthTexture* GetDepthBufferOrig() override { return nullptr; } - virtual uint32 GetBackBufferWidth() override { return 0; } - virtual uint32 GetBackBufferHeight() override { return 0; }; - virtual const SRenderTileInfo* GetRenderTileInfo() const override { return nullptr; } - - virtual void FX_CommitStates([[maybe_unused]] const SShaderTechnique* pTech, [[maybe_unused]] const SShaderPass* pPass, [[maybe_unused]] bool bUseMaterialState) override {} - virtual void FX_Commit([[maybe_unused]] bool bAllowDIP = false) override {} - virtual long FX_SetVertexDeclaration([[maybe_unused]] int StreamMask, [[maybe_unused]] const AZ::Vertex::Format& vertexFormat) override { return 0; } - virtual void FX_DrawIndexedPrimitive([[maybe_unused]] const eRenderPrimitiveType eType, [[maybe_unused]] const int nVBOffset, [[maybe_unused]] const int nMinVertexIndex, [[maybe_unused]] const int nVerticesCount, [[maybe_unused]] const int nStartIndex, [[maybe_unused]] const int nNumIndices, [[maybe_unused]] bool bInstanced = false) override {} - virtual SDepthTexture* FX_GetDepthSurface([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] bool bAA, [[maybe_unused]] bool shaderResourceView = false) override { return nullptr; } - virtual long FX_SetIStream([[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] RenderIndexType idxType) override { return -1; } - virtual long FX_SetVStream([[maybe_unused]] int nID, [[maybe_unused]] const void* pB, [[maybe_unused]] uint32 nOffs, [[maybe_unused]] uint32 nStride, [[maybe_unused]] uint32 nFreq = 1) override { return -1; } - virtual void FX_DrawPrimitive([[maybe_unused]] eRenderPrimitiveType eType, [[maybe_unused]] int nStartVertex, [[maybe_unused]] int nVerticesCount, [[maybe_unused]] int nInstanceVertices = 0) {} - virtual void DrawQuad3D([[maybe_unused]] const Vec3& v0, [[maybe_unused]] const Vec3& v1, [[maybe_unused]] const Vec3& v2, [[maybe_unused]] const Vec3& v3, [[maybe_unused]] const ColorF& color, [[maybe_unused]] float ftx0, [[maybe_unused]] float fty0, [[maybe_unused]] float ftx1, [[maybe_unused]] float fty1) override {} - virtual void DrawQuad([[maybe_unused]] float x0, [[maybe_unused]] float y0, [[maybe_unused]] float x1, [[maybe_unused]] float y1, [[maybe_unused]] const ColorF& color, [[maybe_unused]] float z = 1.0f, [[maybe_unused]] float s0 = 0.0f, [[maybe_unused]] float t0 = 0.0f, [[maybe_unused]] float s1 = 1.0f, [[maybe_unused]] float t1 = 1.0f) override {}; - virtual void FX_ClearTarget(ITexture* pTex) override; - virtual void FX_ClearTarget(SDepthTexture* pTex) override; - - virtual bool FX_SetRenderTarget(int nTarget, void* pTargetSurf, SDepthTexture* pDepthTarget, uint32 nTileCount = 1) override; - virtual bool FX_PushRenderTarget(int nTarget, void* pTargetSurf, SDepthTexture* pDepthTarget, uint32 nTileCount = 1) override; - virtual bool FX_SetRenderTarget(int nTarget, CTexture* pTarget, SDepthTexture* pDepthTarget, bool bPush = false, int nCMSide = -1, bool bScreenVP = false, uint32 nTileCount = 1) override; - virtual bool FX_PushRenderTarget(int nTarget, CTexture* pTarget, SDepthTexture* pDepthTarget, int nCMSide = -1, bool bScreenVP = false, uint32 nTileCount = 1) override; - virtual bool FX_RestoreRenderTarget(int nTarget) override; - virtual bool FX_PopRenderTarget(int nTarget) override; - virtual void FX_SetActiveRenderTargets([[maybe_unused]] bool bAllowDIP = false) override {} - virtual void EF_Scissor([[maybe_unused]] bool bEnable, [[maybe_unused]] int sX, [[maybe_unused]] int sY, [[maybe_unused]] int sWdt, [[maybe_unused]] int sHgt) override {}; - virtual void FX_ResetPipe() override {}; - - ////--------------------------------------------------------------------------------------------------------------------- - - CAtomShimRenderer(); - virtual ~CAtomShimRenderer(); - - virtual WIN_HWND Init(int x, int y, int width, int height, unsigned int cbpp, int zbpp, int sbits, bool fullscreen, bool isEditor, WIN_HINSTANCE hinst, WIN_HWND Glhwnd = 0, bool bReInit = false, const SCustomRenderInitArgs* pCustomArgs = 0, bool bShaderCacheGen = false); - virtual WIN_HWND GetHWND(); - virtual bool SetWindowIcon(const char* path); - - virtual ERenderType GetRenderType() const override; - - virtual const char* GetRenderDescription() const override; - - ///////////////////////////////////////////////////////////////////////////////// - // Render-context management - ///////////////////////////////////////////////////////////////////////////////// - virtual bool SetCurrentContext(WIN_HWND hWnd); - virtual bool CreateContext(WIN_HWND hWnd, bool bAllowMSAA, int SSX, int SSY); - virtual bool DeleteContext(WIN_HWND hWnd); - virtual void MakeMainContextActive(); - virtual WIN_HWND GetCurrentContextHWND() { return m_currContext ? m_currContext->m_hWnd : m_hWnd; } - virtual bool IsCurrentContextMainVP() { return m_currContext ? m_currContext->m_isMainViewport : true; } - - virtual int GetCurrentContextViewportWidth() const { return -1; } - virtual int GetCurrentContextViewportHeight() const { return -1; } - ///////////////////////////////////////////////////////////////////////////////// - - virtual int CreateRenderTarget(const char* name, int nWidth, int nHeight, const ColorF& cClear, ETEX_Format eTF = eTF_R8G8B8A8); - virtual bool ResizeRenderTarget(int nHandle, int nWidth, int nHeight); - virtual bool DestroyRenderTarget(int nHandle); - virtual bool SetRenderTarget(int nHandle, SDepthTexture* pDepthSurf = nullptr); - virtual SDepthTexture* CreateDepthSurface(int nWidth, int nHeight, bool shaderResourceView = false); - virtual void DestroyDepthSurface(SDepthTexture* pDepthSurf); - - virtual int GetOcclusionBuffer(uint16* pOutOcclBuffer, Matrix44* pmCamBuffe); - virtual void WaitForParticleBuffer(threadID nThreadId); - - virtual void GetVideoMemoryUsageStats([[maybe_unused]] size_t& vidMemUsedThisFrame, [[maybe_unused]] size_t& vidMemUsedRecently, [[maybe_unused]] bool bGetPoolsSizes = false) {} - - virtual void SetRenderTile([[maybe_unused]] f32 nTilesPosX, [[maybe_unused]] f32 nTilesPosY, [[maybe_unused]] f32 nTilesGridSizeX, [[maybe_unused]] f32 nTilesGridSizeY) {} - - virtual void EF_InvokeShadowMapRenderJobs([[maybe_unused]] int nFlags){} - //! Fills array of all supported video formats (except low resolution formats) - //! Returns number of formats, also when called with NULL - virtual int EnumDisplayFormats(SDispFormat* Formats); - - //! Return all supported by video card video AA formats - virtual int EnumAAFormats([[maybe_unused]] SAAFormat* Formats) { return 0; } - - //! Changes resolution of the window/device (doen't require to reload the level - virtual bool ChangeResolution(int nNewWidth, int nNewHeight, int nNewColDepth, int nNewRefreshHZ, bool bFullScreen, bool bForce); - - virtual Vec2 SetViewportDownscale([[maybe_unused]] float xscale, [[maybe_unused]] float yscale) { return Vec2(0, 0); } - virtual void SetCurDownscaleFactor([[maybe_unused]] Vec2 sf) {}; - - virtual EScreenAspectRatio GetScreenAspect([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight) { return eAspect_4_3; } - - virtual void SwitchToNativeResolutionBackbuffer() {} - - virtual void ShutDown(bool bReInit = false); - virtual void ShutDownFast(); - - virtual void BeginFrame(); - virtual void RenderDebug(bool bRernderStats = true); - virtual void EndFrame(); - virtual void LimitFramerate([[maybe_unused]] const int maxFPS, [[maybe_unused]] const bool bUseSleep) {} - - virtual void TryFlush(); - - virtual void Reset (void) {}; - virtual void RT_ReleaseCB(void*){} - - virtual void InitSystemResources(int nFlags); - virtual void ForceGC() {} - virtual void FlushPendingTextureTasks() {} - - virtual void SetTexture(int tnum); - virtual void SetTexture(int tnum, int nUnit); - virtual void SetState(int State, int AlphaRef); - - virtual void DrawStringU(IFFont_RenderProxy* pFont, float x, float y, float z, const char* pStr, bool asciiMultiLine, const STextDrawContext& ctx) const; - virtual void DrawDynVB(SVF_P3F_C4B_T2F* pBuf, uint16* pInds, int nVerts, int nInds, PublicRenderPrimitiveType nPrimType); - virtual void DrawDynUiPrimitiveList(DynUiPrimitiveList& primitives, int totalNumVertices, int totalNumIndices); - - virtual void DrawBuffer(CVertexBuffer* pVBuf, CIndexBuffer* pIBuf, int nNumIndices, int nOffsIndex, const PublicRenderPrimitiveType nPrmode, int nVertStart = 0, int nVertStop = 0); - - virtual void CheckError(const char* comment); - - virtual void DrawLine([[maybe_unused]] const Vec3& vPos1, [[maybe_unused]] const Vec3& vPos2) {}; - virtual void Graph([[maybe_unused]] byte* g, [[maybe_unused]] int x, [[maybe_unused]] int y, [[maybe_unused]] int wdt, [[maybe_unused]] int hgt, [[maybe_unused]] int nC, [[maybe_unused]] int type, [[maybe_unused]] const char* text, [[maybe_unused]] ColorF& color, [[maybe_unused]] float fScale) {}; - - virtual void SetCamera(const CCamera& cam); - virtual void SetViewport(int x, int y, int width, int height, int id = 0); - virtual void SetScissor(int x = 0, int y = 0, int width = 0, int height = 0); - virtual void GetViewport(int* x, int* y, int* width, int* height) const; - - virtual void SetCullMode (int mode = R_CULL_BACK); - virtual bool EnableFog (bool enable); - virtual void SetFogColor(const ColorF& color); - virtual void EnableVSync(bool enable); - - virtual void DrawPrimitivesInternal(CVertexBuffer* src, int vert_num, const eRenderPrimitiveType prim_type); - - virtual void PushMatrix(); - virtual void RotateMatrix(float a, float x, float y, float z); - virtual void RotateMatrix(const Vec3& angels); - virtual void TranslateMatrix(float x, float y, float z); - virtual void ScaleMatrix(float x, float y, float z); - virtual void TranslateMatrix(const Vec3& pos); - virtual void MultMatrix(const float* mat); - virtual void LoadMatrix(const Matrix34* src = 0); - virtual void PopMatrix(); - - virtual void EnableTMU(bool enable); - virtual void SelectTMU(int tnum); - - virtual bool ChangeDisplay(unsigned int width, unsigned int height, unsigned int cbpp); - virtual void ChangeViewport(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool bMainViewport = false, float scaleWidth = 1.0f, float scaleHeight = 1.0f); - - virtual bool SaveTga([[maybe_unused]] unsigned char* sourcedata, [[maybe_unused]] int sourceformat, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] const char* filename, [[maybe_unused]] bool flip) const { return false; } - - //download an image to video memory. 0 in case of failure - virtual void CreateResourceAsync([[maybe_unused]] SResourceAsync* Resource) {}; - virtual void ReleaseResourceAsync([[maybe_unused]] SResourceAsync* Resource) {}; - void ReleaseResourceAsync(AZStd::unique_ptr<SResourceAsync> Resource) override {}; - virtual unsigned int DownLoadToVideoMemory([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] int d, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] ETEX_Type eTT, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } - virtual unsigned int DownLoadToVideoMemory([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } - virtual unsigned int DownLoadToVideoMemoryCube([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } - virtual unsigned int DownLoadToVideoMemory3D([[maybe_unused]] const byte* data, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] int d, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int nummipmap, [[maybe_unused]] bool repeat = true, [[maybe_unused]] int filter = FILTER_BILINEAR, [[maybe_unused]] int Id = 0, [[maybe_unused]] const char* szCacheName = NULL, [[maybe_unused]] int flags = 0, [[maybe_unused]] EEndian eEndian = eLittleEndian, [[maybe_unused]] RectI* pRegion = NULL, [[maybe_unused]] bool bAsynDevTexCreation = false) { return 0; } - virtual void UpdateTextureInVideoMemory([[maybe_unused]] uint32 tnum, [[maybe_unused]] const byte* newdata, [[maybe_unused]] int posx, [[maybe_unused]] int posy, [[maybe_unused]] int w, [[maybe_unused]] int h, [[maybe_unused]] ETEX_Format eTFSrc = eTF_R8G8B8A8, [[maybe_unused]] int posz = 0, [[maybe_unused]] int sizez = 1){} - - virtual bool SetGammaDelta(float fGamma); - virtual void RestoreGamma(void) {}; - - virtual void RemoveTexture([[maybe_unused]] unsigned int TextureId) {} - virtual void DeleteFont([[maybe_unused]] IFFont* font) {} - - virtual void Draw2dImage(float xpos, float ypos, float w, float h, int texture_id, float s0 = 0, float t0 = 0, float s1 = 1, float t1 = 1, float angle = 0, float r = 1, float g = 1, float b = 1, float a = 1, float z = 1); - virtual void Push2dImage(float xpos, float ypos, float w, float h, int texture_id, float s0 = 0, float t0 = 0, float s1 = 1, float t1 = 1, float angle = 0, float r = 1, float g = 1, float b = 1, float a = 1, float z = 1, float stereoDepth = 0); - virtual void Draw2dImageList(); - virtual void Draw2dImageStretchMode([[maybe_unused]] bool stretch) {}; - virtual void DrawImage(float xpos, float ypos, float w, float h, int texture_id, float s0, float t0, float s1, float t1, float r, float g, float b, float a, bool filtered = true); - virtual void DrawImageWithUV(float xpos, float ypos, float z, float w, float h, int texture_id, float s[4], float t[4], float r, float g, float b, float a, bool filtered = true); - - virtual void PushWireframeMode(int mode); - virtual void PopWireframeMode(); - virtual void FX_PushWireframeMode(int mode); - virtual void FX_PopWireframeMode(); - virtual void FX_SetWireframeMode(int mode); - - virtual void FX_PreRender([[maybe_unused]] int Stage) override {} - virtual void FX_PostRender() override {} - - virtual void ResetToDefault(); - virtual void SetDefaultRenderStates() {} - - virtual int GenerateAlphaGlowTexture(float k); - - virtual void ApplyViewParameters(const CameraViewParameters&) override; - virtual void SetMaterialColor(float r, float g, float b, float a); - - virtual void GetMemoryUsage(ICrySizer* Sizer); - - // Project/UnProject. Returns true if successful. - virtual bool ProjectToScreen(float ptx, float pty, float ptz, - float* sx, float* sy, float* sz); - virtual int UnProject(float sx, float sy, float sz, - float* px, float* py, float* pz, - const float modelMatrix[16], - const float projMatrix[16], - const int viewport[4]); - virtual int UnProjectFromScreen(float sx, float sy, float sz, - float* px, float* py, float* pz); - - // Shadow Mapping - virtual bool PrepareDepthMap(ShadowMapFrustum* SMSource, int nFrustumLOD = 0, bool bClearPool = false); - virtual void DrawAllShadowsOnTheScreen(); - virtual void OnEntityDeleted([[maybe_unused]] IRenderNode* pRenderNode) {}; - - virtual void FX_SetClipPlane (bool bEnable, float* pPlane, bool bRefract); - - virtual void SetColorOp(byte eCo, byte eAo, byte eCa, byte eAa); - virtual void EF_SetColorOp([[maybe_unused]] byte eCo, [[maybe_unused]] byte eAo, [[maybe_unused]] byte eCa, [[maybe_unused]] byte eAa) {}; - - virtual void SetSrgbWrite([[maybe_unused]] bool srgbWrite) {}; - virtual void EF_SetSrgbWrite([[maybe_unused]] bool sRGBWrite) {}; - - //for editor - virtual void GetModelViewMatrix(float* mat); - virtual void GetProjectionMatrix(float* mat); - - //for texture - virtual ITexture* EF_LoadTexture(const char* nameTex, uint32 flags = 0); - virtual ITexture* EF_LoadDefaultTexture(const char* nameTex); - - virtual void DrawQuad(const Vec3& right, const Vec3& up, const Vec3& origin, int nFlipMode = 0); - virtual void DrawQuad(float dy, float dx, float dz, float x, float y, float z); - // NOTE: deprecated - virtual void ClearTargetsImmediately(uint32 nFlags); - virtual void ClearTargetsImmediately(uint32 nFlags, const ColorF& Colors, float fDepth); - virtual void ClearTargetsImmediately(uint32 nFlags, const ColorF& Colors); - virtual void ClearTargetsImmediately(uint32 nFlags, float fDepth); - - virtual void ClearTargetsLater(uint32 nFlags); - virtual void ClearTargetsLater(uint32 nFlags, const ColorF& Colors, float fDepth); - virtual void ClearTargetsLater(uint32 nFlags, const ColorF& Colors); - virtual void ClearTargetsLater(uint32 nFlags, float fDepth); - - virtual void ReadFrameBuffer(unsigned char* pRGB, int nImageX, int nSizeX, int nSizeY, ERB_Type eRBType, bool bRGBA, int nScaledX = -1, int nScaledY = -1); - virtual void ReadFrameBufferFast(uint32* pDstARGBA8, int dstWidth, int dstHeight, bool BGRA = true); - - virtual bool CaptureFrameBufferFast(unsigned char* pDstRGBA8, int destinationWidth, int destinationHeight); - virtual bool CopyFrameBufferFast(unsigned char* pDstRGBA8, int destinationWidth, int destinationHeight); - virtual bool RegisterCaptureFrame(ICaptureFrameListener* pCapture); - virtual bool UnRegisterCaptureFrame(ICaptureFrameListener* pCapture); - virtual bool InitCaptureFrameBufferFast(uint32 bufferWidth, uint32 bufferHeight); - virtual void CloseCaptureFrameBufferFast(void); - virtual void CaptureFrameBufferCallBack(void); - - - virtual void ReleaseHWShaders() {} - virtual void PrintResourcesLeaks() {} - - //misc - virtual bool ScreenShot(const char* filename = NULL, int width = 0); - - virtual void Set2DMode(uint32 orthoWidth, uint32 orthoHeight, TransformationMatrices& backupMatrices, float znear = -1e10f, float zfar = 1e10f); - virtual void Unset2DMode(const TransformationMatrices& restoringMatrices); - virtual void Set2DModeNonZeroTopLeft(float orthoLeft, float orthoTop, float orthoWidth, float orthoHeight, TransformationMatrices& backupMatrices, float znear = -1e10f, float zfar = 1e10f); - - virtual int ScreenToTexture(int nTexID); - - virtual void DrawPoints([[maybe_unused]] Vec3 v[], [[maybe_unused]] int nump, [[maybe_unused]] ColorF& col, [[maybe_unused]] int flags) {}; - virtual void DrawLines([[maybe_unused]] Vec3 v[], [[maybe_unused]] int nump, [[maybe_unused]] ColorF& col, [[maybe_unused]] int flags, [[maybe_unused]] float fGround) {}; - - virtual void RefreshSystemShaders() {} - - // Shaders/Shaders support - // RE - RenderElement - - virtual void EF_Release(int nFlags); - virtual void FX_PipelineShutdown(bool bFastShutdown = false); - - //========================================================== - // external interface for shaders - //========================================================== - - virtual bool EF_SetLightHole(Vec3 vPos, Vec3 vNormal, int idTex, float fScale = 1.0f, bool bAdditive = true); - - // Draw all shaded REs in the list - virtual void EF_EndEf3D (int nFlags, int nPrecacheUpdateId, int nNearPrecacheUpdateId, const SRenderingPassInfo& passInfo); - - // 2d interface for shaders - virtual void EF_EndEf2D(bool bSort); - virtual bool EF_PrecacheResource(SShaderItem* pSI, float fMipFactor, float fTimeToReady, int Flags, int nUpdateId, int nCounter); - virtual bool EF_PrecacheResource(ITexture* pTP, float fDist, float fTimeToReady, int Flags, int nUpdateId, int nCounter); - virtual void PrecacheResources(); - virtual void PostLevelLoading() {} - virtual void PostLevelUnload() {} - - virtual ITexture* EF_CreateCompositeTexture(int type, const char* szName, int nWidth, int nHeight, int nDepth, int nMips, int nFlags, ETEX_Format eTF, const STexComposition* pCompositions, size_t nCompositions, int8 nPriority = -1); - - void EF_Init(); - - virtual IDynTexture* MakeDynTextureFromShadowBuffer(int nSize, IDynTexture* pDynTexture); - virtual void MakeSprite(IDynTexture*& rTexturePtr, float _fSpriteDistance, int nTexSize, float angle, float angle2, IStatObj* pStatObj, const float fBrightnessMultiplier, SRendParams& rParms); - virtual uint32 RenderOccludersIntoBuffer([[maybe_unused]] const CCamera& viewCam, [[maybe_unused]] int nTexSize, [[maybe_unused]] PodArray<IRenderNode*>& lstOccluders, [[maybe_unused]] float* pBuffer) { return 0; } - - virtual IRenderAuxGeom* GetIRenderAuxGeom([[maybe_unused]] void* jobID = 0) - { - return m_pAtomShimRenderAuxGeom; - } - - virtual IColorGradingController* GetIColorGradingController(); - virtual IStereoRenderer* GetIStereoRenderer(); - - virtual ITexture* Create2DTexture(const char* name, int width, int height, int numMips, int flags, unsigned char* data, ETEX_Format format); - - ////////////////////////////////////////////////////////////////////// - // All font functions are not implemented since the font is rendered by AtomFont - int FontCreateTexture( - [[maybe_unused]] int Width, [[maybe_unused]] int Height, [[maybe_unused]] byte* pData, - [[maybe_unused]] ETEX_Format eTF = eTF_R8G8B8A8, [[maybe_unused]] bool genMips = false, - [[maybe_unused]] const char* textureName = nullptr) override - { - return -1; - } - bool FontUpdateTexture( - [[maybe_unused]] int nTexId, [[maybe_unused]] int X, [[maybe_unused]] int Y, [[maybe_unused]] int USize, [[maybe_unused]] int VSize, - [[maybe_unused]] byte* pData) override - { - return true; - } - void FontSetTexture([[maybe_unused]] int nTexId, [[maybe_unused]] int nFilterMode) override { } - void FontSetRenderingState([[maybe_unused]] bool overrideViewProjMatrices, [[maybe_unused]] TransformationMatrices& backupMatrices) override { } - void FontSetBlending([[maybe_unused]] int src, [[maybe_unused]] int dst, [[maybe_unused]] int baseState) override { } - void FontRestoreRenderingState([[maybe_unused]] bool overrideViewProjMatrices, [[maybe_unused]] const TransformationMatrices& restoringMatrices) override { } - - virtual void GetLogVBuffers(void) {} - - virtual void RT_PresentFast() {} - - virtual void RT_ForceSwapBuffers() {} - virtual void RT_SwitchToNativeResolutionBackbuffer([[maybe_unused]] bool resolveBackBuffer) {} - - virtual void RT_BeginFrame() {} - virtual void RT_EndFrame() {} - virtual void RT_Init() {} - virtual void RT_ShutDown([[maybe_unused]] uint32 nFlags) {} - virtual bool RT_CreateDevice() { return true; } - virtual void RT_Reset() {} - virtual void RT_SetCull([[maybe_unused]] int nMode) {} - virtual void RT_SetScissor([[maybe_unused]] bool bEnable, [[maybe_unused]] int x, [[maybe_unused]] int y, [[maybe_unused]] int width, [[maybe_unused]] int height){} - virtual void RT_RenderScene([[maybe_unused]] int nFlags, [[maybe_unused]] SThreadInfo& TI, [[maybe_unused]] RenderFunc pRenderFunc) {} - virtual void RT_PrepareStereo([[maybe_unused]] int mode, [[maybe_unused]] int output) {} - virtual void RT_CopyToStereoTex([[maybe_unused]] int channel) {} - virtual void RT_UpdateTrackingStates() {} - virtual void RT_DisplayStereo() {} - virtual void RT_SetCameraInfo() {} - virtual void RT_SetStereoCamera() {} - virtual void RT_ReadFrameBuffer([[maybe_unused]] unsigned char* pRGB, [[maybe_unused]] int nImageX, [[maybe_unused]] int nSizeX, [[maybe_unused]] int nSizeY, [[maybe_unused]] ERB_Type eRBType, [[maybe_unused]] bool bRGBA, [[maybe_unused]] int nScaledX, [[maybe_unused]] int nScaledY) {} - virtual void RT_RenderScene([[maybe_unused]] int nFlags, [[maybe_unused]] SThreadInfo& TI, [[maybe_unused]] int nR, [[maybe_unused]] RenderFunc pRenderFunc) {}; - virtual void RT_CreateResource([[maybe_unused]] SResourceAsync* Res) {}; - virtual void RT_ReleaseResource([[maybe_unused]] SResourceAsync* Res) {}; - virtual void RT_ReleaseRenderResources() {}; - virtual void RT_UnbindResources() {}; - virtual void RT_UnbindTMUs() {}; - virtual void RT_PrecacheDefaultShaders() {}; - virtual void RT_CreateRenderResources() {}; - virtual void RT_ClearTarget([[maybe_unused]] ITexture* pTex, [[maybe_unused]] const ColorF& color) {}; - virtual void RT_RenderDebug([[maybe_unused]] bool bRenderStats = true) {}; - - virtual HRESULT RT_CreateVertexBuffer([[maybe_unused]] UINT Length, [[maybe_unused]] DWORD Usage, [[maybe_unused]] DWORD FVF, [[maybe_unused]] UINT Pool, [[maybe_unused]] void** ppVertexBuffer, [[maybe_unused]] HANDLE* pSharedHandle) { return S_OK; } - virtual HRESULT RT_CreateIndexBuffer([[maybe_unused]] UINT Length, [[maybe_unused]] DWORD Usage, [[maybe_unused]] DWORD Format, [[maybe_unused]] UINT Pool, [[maybe_unused]] void** ppVertexBuffer, [[maybe_unused]] HANDLE* pSharedHandle) { return S_OK; }; - virtual HRESULT RT_CreateVertexShader([[maybe_unused]] DWORD* pBuf, [[maybe_unused]] void** pShader, [[maybe_unused]] void* pInst) { return S_OK; }; - virtual HRESULT RT_CreatePixelShader([[maybe_unused]] DWORD* pBuf, [[maybe_unused]] void** pShader) { return S_OK; }; - virtual void RT_ReleaseVBStream([[maybe_unused]] void* pVB, [[maybe_unused]] int nStream) {}; - virtual void RT_DrawDynVB([[maybe_unused]] int Pool, [[maybe_unused]] uint32 nVerts) {} - virtual void RT_DrawDynVB([[maybe_unused]] SVF_P3F_C4B_T2F* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} - virtual void RT_DrawDynVBUI([[maybe_unused]] SVF_P2F_C4B_T2F_F4B* pBuf, [[maybe_unused]] uint16* pInds, [[maybe_unused]] uint32 nVerts, [[maybe_unused]] uint32 nInds, [[maybe_unused]] const PublicRenderPrimitiveType nPrimType) {} - virtual void RT_DrawStringU([[maybe_unused]] IFFont_RenderProxy* pFont, [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] float z, [[maybe_unused]] const char* pStr, [[maybe_unused]] bool asciiMultiLine, [[maybe_unused]] const STextDrawContext& ctx) const {} - virtual void RT_DrawLines([[maybe_unused]] Vec3 v[], [[maybe_unused]] int nump, [[maybe_unused]] ColorF& col, [[maybe_unused]] int flags, [[maybe_unused]] float fGround) {} - virtual void RT_Draw2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z) {} - virtual void RT_Push2dImage([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] CTexture* pTexture, [[maybe_unused]] float s0, [[maybe_unused]] float t0, [[maybe_unused]] float s1, [[maybe_unused]] float t1, [[maybe_unused]] float angle, [[maybe_unused]] DWORD col, [[maybe_unused]] float z, [[maybe_unused]] float stereoDepth) {} - virtual void RT_Draw2dImageList() {} - virtual void RT_Draw2dImageStretchMode([[maybe_unused]] bool bStretch) {} - virtual void RT_DrawImageWithUV([[maybe_unused]] float xpos, [[maybe_unused]] float ypos, [[maybe_unused]] float z, [[maybe_unused]] float w, [[maybe_unused]] float h, [[maybe_unused]] int texture_id, [[maybe_unused]] float* s, [[maybe_unused]] float* t, [[maybe_unused]] DWORD col, [[maybe_unused]] bool filtered = true) {} - virtual void EF_ClearTargetsImmediately([[maybe_unused]] uint32 nFlags) {} - virtual void EF_ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors, [[maybe_unused]] float fDepth, [[maybe_unused]] uint8 nStencil) {} - virtual void EF_ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors) {} - virtual void EF_ClearTargetsImmediately([[maybe_unused]] uint32 nFlags, [[maybe_unused]] float fDepth, [[maybe_unused]] uint8 nStencil) {} - - virtual void EF_ClearTargetsLater([[maybe_unused]] uint32 nFlags) {} - virtual void EF_ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors, [[maybe_unused]] float fDepth, [[maybe_unused]] uint8 nStencil) {} - virtual void EF_ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] const ColorF& Colors) {} - virtual void EF_ClearTargetsLater([[maybe_unused]] uint32 nFlags, [[maybe_unused]] float fDepth, [[maybe_unused]] uint8 nStencil) {} - - virtual void RT_PushRenderTarget([[maybe_unused]] int nTarget, [[maybe_unused]] CTexture* pTex, [[maybe_unused]] SDepthTexture* pDS, [[maybe_unused]] int nS) {}; - virtual void RT_PopRenderTarget([[maybe_unused]] int nTarget) {}; - virtual void RT_SetViewport([[maybe_unused]] int x, [[maybe_unused]] int y, [[maybe_unused]] int width, [[maybe_unused]] int height, [[maybe_unused]] int id) {} - - virtual void RT_SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] const bool bSilentMode = false) {}; - virtual void SetRendererCVar([[maybe_unused]] ICVar* pCVar, [[maybe_unused]] const char* pArgText, [[maybe_unused]] bool bSilentMode = false) {}; - - virtual void SetMatrices(float* pProjMat, float* pViewMat); - - virtual void PushProfileMarker([[maybe_unused]] const char* label) {} - virtual void PopProfileMarker([[maybe_unused]] const char* label) {} - - virtual void RT_InsertGpuCallback([[maybe_unused]] uint32 context, [[maybe_unused]] GpuCallbackFunc callback) {} - virtual void EnablePipelineProfiler([[maybe_unused]] bool bEnable) {} - - virtual IOpticsElementBase* CreateOptics([[maybe_unused]] EFlareType type) const { return NULL; } - - virtual bool BakeMesh([[maybe_unused]] const SMeshBakingInputParams* pInputParams, [[maybe_unused]] SMeshBakingOutput* pReturnValues) { return false; } - virtual PerInstanceConstantBufferPool* GetPerInstanceConstantBufferPoolPointer() override { return nullptr; } - - IDynTexture* CreateDynTexture2(uint32 nWidth, uint32 nHeight, uint32 nTexFlags, const char* szSource, ETexPool eTexPool) override; - - virtual void BeginProfilerSection([[maybe_unused]] const char* name, [[maybe_unused]] uint32 eProfileLabelFlags = 0) override {} - virtual void EndProfilerSection([[maybe_unused]] const char* name) override {} - virtual void AddProfilerLabel([[maybe_unused]] const char* name) override {} - -#ifdef SUPPORT_HW_MOUSE_CURSOR - virtual IHWMouseCursor* GetIHWMouseCursor() { return NULL; } -#endif - - virtual void StartLoadtimePlayback([[maybe_unused]] ILoadtimeCallback* pCallback) {} - virtual void StopLoadtimePlayback() {} - - // used to track current textures - void SetTextureForUnit(int unit, int textureId); - - void RT_DrawVideoRenderer([[maybe_unused]] AZ::VideoRenderer::IVideoRenderer* pVideoRenderer, [[maybe_unused]] const AZ::VideoRenderer::DrawArguments& drawArguments) override {} - -private: - static constexpr char LogName[] = "CAtomShimRenderer"; - - //! Camera::ActiveCameraSystemRequestBus::Handler overrides... - const AZ::Transform& GetActiveCameraTransform() override; - const Camera::Configuration& GetActiveCameraConfiguration() override; - - void CacheCameraTransform(const CCamera& camera); - void CacheCameraConfiguration(const CCamera& camamera); - - HWND m_hWnd = nullptr; // The main app window - - AZStd::string m_rendererDescription; - - CAtomShimRenderAuxGeom* m_pAtomShimRenderAuxGeom; - IColorGradingController* m_pAtomShimColorGradingController; - IStereoRenderer* m_pAtomShimStereoRenderer; - - AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> m_dynamicDraw; - - AZ::RPI::ShaderVariantId m_shaderVariantWrap; - AZ::RPI::ShaderVariantId m_shaderVariantClamp; - - // cached input indices for dynamic draw's draw srg - AZ::RHI::ShaderInputNameIndex m_imageInputIndex = "m_texture"; - AZ::RHI::ShaderInputNameIndex m_viewProjInputIndex = "m_worldToProj"; - - AZStd::unordered_map<WIN_HWND, AtomShimViewContext*> m_viewContexts; - AtomShimViewContext* m_currContext = nullptr; - - int m_renderPipelineNameSuffix = 1; - - AtomShimTexture* m_currentTextureForUnit[32]; - bool m_clampFlagPerTextureUnit[32]; - - int m_currentFontTextureId = -1; - - bool m_isFinalInitializationDone = false; - bool m_isInFrame = false; // True when between calls to BeginFrame and EndFrame - - int m_isIn2dModeCounter = 0; - - AZ::Transform m_cameraTransform = AZ::Transform::CreateIdentity(); - Camera::Configuration m_cameraConfiguration; - AZStd::shared_ptr<AZ::RPI::ViewportContext> m_viewportContext; - - static AtomShimTexture* CastITextureToAtomShimTexture(ITexture* texture) - { - // If GetDevTexture returns a non-null value then this is not an AtomShim texture - if (!(texture && !texture->GetDevTexture())) - { - return nullptr; - } - - return static_cast<AtomShimTexture*>(texture); - } -}; - -//============================================================================= - -extern CAtomShimRenderer* gcpAtomShim; - - - -#endif //NULL_RENDERER diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shaders.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shaders.cpp deleted file mode 100644 index 9093c4b3d4..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shaders.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "I3DEngine.h" - -//============================================================================ - -bool CShader::FXSetTechnique([[maybe_unused]] const CCryNameTSCRC& szName) -{ - return true; -} - -bool CShader::FXSetPSFloat([[maybe_unused]] const CCryNameR& NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetPSFloat([[maybe_unused]] const char* NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetVSFloat([[maybe_unused]] const CCryNameR& NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetVSFloat([[maybe_unused]] const char* NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetGSFloat([[maybe_unused]] const CCryNameR& NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetGSFloat([[maybe_unused]] const char* NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetCSFloat([[maybe_unused]] const CCryNameR& NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} - -bool CShader::FXSetCSFloat([[maybe_unused]] const char* NameParam, [[maybe_unused]] const Vec4* fParams, [[maybe_unused]] int nParams) -{ - return true; -} -bool CShader::FXBegin([[maybe_unused]] uint32* uiPassCount, [[maybe_unused]] uint32 nFlags) -{ - return true; -} - -bool CShader::FXBeginPass([[maybe_unused]] uint32 uiPass) -{ - return true; -} - -bool CShader::FXEndPass() -{ - return true; -} - -bool CShader::FXEnd() -{ - return true; -} - -bool CShader::FXCommit([[maybe_unused]] const uint32 nFlags) -{ - return true; -} - -//=================================================================================== - -FXShaderCache CHWShader::m_ShaderCache; -FXShaderCacheNames CHWShader::m_ShaderCacheList; - -void CRenderer::RefreshSystemShaders() -{ -} - -SShaderCache::~SShaderCache() -{ - CHWShader::m_ShaderCache.erase(m_Name); - SAFE_DELETE(m_pRes[CACHE_USER]); - SAFE_DELETE(m_pRes[CACHE_READONLY]); -} - -SShaderCache* CHWShader::mfInitCache([[maybe_unused]] const char* name, [[maybe_unused]] CHWShader* pSH, [[maybe_unused]] bool bCheckValid, [[maybe_unused]] uint32 CRC32, [[maybe_unused]] bool bReadOnly, [[maybe_unused]] bool bAsync) -{ - return NULL; -} - -#if !defined(CONSOLE) -bool CHWShader::mfOptimiseCacheFile([[maybe_unused]] SShaderCache* pCache, [[maybe_unused]] bool bForce, [[maybe_unused]] SOptimiseStats* Stats) -{ - return true; -} -#endif - -bool CHWShader::PreactivateShaders() -{ - bool bRes = true; - return bRes; -} -void CHWShader::RT_PreactivateShaders() -{ -} - -const char* CHWShader::GetCurrentShaderCombinations([[maybe_unused]] bool bLevel) -{ - return ""; -} - -void CHWShader::mfFlushPendedShadersWait([[maybe_unused]] int nMaxAllowed) -{ -} - -void CShaderResources::Rebuild([[maybe_unused]] IShader* pSH, [[maybe_unused]] AzRHI::ConstantBufferUsage usage) -{ -} - -void CShaderResources::CloneConstants([[maybe_unused]] const IRenderShaderResources* pSrc) -{ -} - -void CShaderResources::ReleaseConstants() -{ -} - -void CShaderResources::UpdateConstants([[maybe_unused]] IShader* pSH) -{ -} - -void CShader::mfFlushPendedShaders() -{ -} - -void SShaderCache::Cleanup(void) -{ -} - -void CShaderResources::AdjustForSpec() -{ -} - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shadows.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shadows.cpp deleted file mode 100644 index ee6f80b51d..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Shadows.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : Implementation of the shadow maps using NULL device specific implementation -// shadow map calculations - - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "../Common/Shadow_Renderer.h" - -#include "I3DEngine.h" - -IDynTexture* CAtomShimRenderer::MakeDynTextureFromShadowBuffer([[maybe_unused]] int nSize, [[maybe_unused]] IDynTexture* pDynTexture) -{ - return NULL; -} - -bool CAtomShimRenderer::PrepareDepthMap([[maybe_unused]] ShadowMapFrustum* SMSource, [[maybe_unused]] int nFrustumLOD, [[maybe_unused]] bool bClearPool) -{ - return true; -} - -void CAtomShimRenderer::DrawAllShadowsOnTheScreen() -{ -} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_System.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_System.cpp deleted file mode 100644 index 3098ed3c3e..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_System.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : NULL device specific implementation and extensions handling. - - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" - -#include <AzCore/std/algorithm.h> -#include <AzCore/std/string/conversions.h> -#include <AzCore/Math/MatrixUtils.h> - -#include <AzFramework/Scene/Scene.h> -#include <AzFramework/Scene/SceneSystemBus.h> -#include <AzFramework/Windowing/WindowBus.h> - -#include <Atom/RPI.Public/RenderPipeline.h> -#include <Atom/RPI.Public/Scene.h> -#include <Atom/RHI/RHISystemInterface.h> -#include <Atom/RPI.Public/WindowContext.h> -#include <Atom/RPI.Public/Shader/ShaderResourceGroup.h> -#include <Atom/RPI.Public/View.h> -#include <Atom/RPI.Public/AuxGeom/AuxGeomFeatureProcessorInterface.h> -#include <Atom/RPI.Reflect/Asset/AssetUtils.h> - -bool CAtomShimRenderer::SetGammaDelta(const float fGamma) -{ - m_fDeltaGamma = fGamma; - return true; -} - -int CAtomShimRenderer::EnumDisplayFormats([[maybe_unused]] SDispFormat* Formats) -{ - return 0; -} - -bool CAtomShimRenderer::ChangeResolution([[maybe_unused]] int nNewWidth, [[maybe_unused]] int nNewHeight, [[maybe_unused]] int nNewColDepth, [[maybe_unused]] int nNewRefreshHZ, [[maybe_unused]] bool bFullScreen, [[maybe_unused]] bool bForce) -{ - return false; -} - -WIN_HWND CAtomShimRenderer::Init([[maybe_unused]] int x, [[maybe_unused]] int y, int width, int height, [[maybe_unused]] unsigned int cbpp, [[maybe_unused]] int zbpp, [[maybe_unused]] int sbits, [[maybe_unused]] bool fullscreen, [[maybe_unused]] bool isEditor, [[maybe_unused]] WIN_HINSTANCE hinst, WIN_HWND Glhwnd, [[maybe_unused]] bool bReInit, [[maybe_unused]] const SCustomRenderInitArgs* pCustomArgs, [[maybe_unused]] bool bShaderCacheGen) -{ - //======================================= - // Add init code here - //======================================= - - FX_SetWireframeMode(R_SOLID_MODE); - - m_width = width; - m_height = height; - m_backbufferWidth = width; - m_backbufferHeight = height; - m_nativeWidth = width; - m_nativeHeight = height; - m_Features |= RFT_HW_NVIDIA; - - m_hWnd = (HWND)Glhwnd; - - if (!g_shaderGeneralHeap) - { - g_shaderGeneralHeap = CryGetIMemoryManager()->CreateGeneralExpandingMemoryHeap(4 * 1024 * 1024, 0, "Shader General"); - } - - iLog->Log("Init Shaders\n"); - - gRenDev->m_cEF.mfInit(); - EF_Init(); - -#if NULL_SYSTEM_TRAIT_INIT_RETURNTHIS - return (WIN_HWND)this;//it just get checked against NULL anyway -#else - return (WIN_HWND)GetDesktopWindow(); -#endif -} - - -bool CAtomShimRenderer::SetCurrentContext(WIN_HWND hWnd) -{ - auto itr = m_viewContexts.find(hWnd); - if (itr == m_viewContexts.end()) - { - return false; - } - - m_currContext = itr->second; - return true; -} - -bool CAtomShimRenderer::CreateContext(WIN_HWND hWnd, bool /* bAllowMSAA */, int /* SSX */, int /* SSY */) -{ - if (m_viewContexts.find(hWnd) != m_viewContexts.end()) - { - return true; - } - - AZ::RPI::RenderPipelinePtr renderPipeline = AZ::RPI::RPISystemInterface::Get()->GetRenderPipelineForWindow(hWnd); - if (!renderPipeline) - { - return false; - } - - AtomShimViewContext* pContext = new AtomShimViewContext; - pContext->m_hWnd = (HWND)hWnd; - pContext->m_width = m_width; - pContext->m_height = m_height; - pContext->m_isMainViewport = !gEnv->IsEditor(); - - pContext->m_renderPipeline = renderPipeline; - pContext->m_view = renderPipeline->GetDefaultView(); - pContext->m_scene = renderPipeline->GetScene(); - - m_viewContexts[hWnd] = pContext; - m_currContext = pContext; - return true; -} - -bool CAtomShimRenderer::DeleteContext(WIN_HWND hWnd) -{ - // Attempt to find matching context with this window handle - auto contextToDeleteIter = m_viewContexts.find(hWnd); - - if (contextToDeleteIter == m_viewContexts.end()) - { - return false; - } - - AtomShimViewContext* contextToDelete = contextToDeleteIter->second; - - // remove this context from the map of contexts - m_viewContexts.erase(contextToDeleteIter); - - - // If we are deleting the current context then set current context to the first one still in list (if any are left) - if (m_currContext == contextToDelete) - { - if (m_viewContexts.empty()) - { - m_currContext = nullptr; - - m_width = 0; - m_height = 0; - } - else - { - m_currContext = m_viewContexts.begin()->second; - - m_width = m_currContext->m_width; - m_height = m_currContext->m_height; - } - } - - delete contextToDelete; - - return true; -} - -void CAtomShimRenderer::MakeMainContextActive() -{ - if (m_viewContexts.empty()) - { - return; - } - - m_currContext = m_viewContexts.begin()->second; -} - -void CAtomShimRenderer::ShutDown([[maybe_unused]] bool bReInit) -{ - iLog = nullptr; - FreeResources(FRR_ALL); - FX_PipelineShutdown(); -} - -void CAtomShimRenderer::ShutDownFast() -{ - FX_PipelineShutdown(); -} - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Textures.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Textures.cpp deleted file mode 100644 index 5bc6b6f872..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_Textures.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -// Description : NULL device specific texture manager implementation. - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include <Atom/RHI/Factory.h> -#include <Atom/RPI.Public/Image/ImageSystemInterface.h> - -//================================================================================= - -/////////////////////////////////////////////////////////////////////////////////// - - -void CAtomShimRenderer::MakeSprite(IDynTexture*& rTexturePtr, [[maybe_unused]] float _fSpriteDistance, [[maybe_unused]] int nTexSize, [[maybe_unused]] float angle, [[maybe_unused]] float angle2, [[maybe_unused]] IStatObj* pStatObj, [[maybe_unused]] const float fBrightnessMultiplier, [[maybe_unused]] SRendParams& rParms) -{ - rTexturePtr = NULL; -} - -int CAtomShimRenderer::GenerateAlphaGlowTexture([[maybe_unused]] float k) -{ - return 0; -} - -bool CAtomShimRenderer::EF_SetLightHole([[maybe_unused]] Vec3 vPos, [[maybe_unused]] Vec3 vNormal, [[maybe_unused]] int idTex, [[maybe_unused]] float fScale, [[maybe_unused]] bool bAdditive) -{ - return false; -} - -bool CAtomShimRenderer::EF_PrecacheResource([[maybe_unused]] ITexture* pTP, [[maybe_unused]] float fDist, [[maybe_unused]] float fTimeToReady, [[maybe_unused]] int Flags, [[maybe_unused]] int nUpdateId, [[maybe_unused]] int nCounter) -{ - return false; -} - -bool CTexture::RenderEnvironmentCMHDR([[maybe_unused]] int size, [[maybe_unused]] Vec3& Pos, [[maybe_unused]] TArray<unsigned short>& vecData) -{ - return true; -} - -void CTexture::Apply([[maybe_unused]] int nTUnit, [[maybe_unused]] int nState, [[maybe_unused]] int nTMatSlot, [[maybe_unused]] int nSUnit, [[maybe_unused]] SResourceView::KeyType nResViewKey, [[maybe_unused]] EHWShaderClass eSHClass) -{ -} - -#if defined(TEXTURE_GET_SYSTEM_COPY_SUPPORT) -byte* CTexture::Convert([[maybe_unused]] const byte* pSrc, [[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] int nMips, [[maybe_unused]] ETEX_Format eTFSrc, [[maybe_unused]] ETEX_Format eTFDst, [[maybe_unused]] int& nOutSize, [[maybe_unused]] bool bLinear) -{ - return NULL; -} -#endif - -void CTexture::ReleaseDeviceTexture([[maybe_unused]] bool bKeepLastMips, [[maybe_unused]] bool bFromUnload) -{ -} - -bool CTexture::Clear([[maybe_unused]] const ColorF& color) -{ - return true; -} - -void CTexture::SetTexStates() -{ - STexState s; - - const bool noMipFiltering = m_nMips <= 1 && !(m_nFlags & FT_FORCE_MIPS); - s.m_nMinFilter = FILTER_LINEAR; - s.m_nMagFilter = FILTER_LINEAR; - s.m_nMipFilter = noMipFiltering ? FILTER_NONE : FILTER_LINEAR; - - const int addrMode = (m_nFlags & FT_STATE_CLAMP || m_eTT == eTT_Cube) ? TADDR_CLAMP : TADDR_WRAP; - s.SetClampMode(addrMode, addrMode, addrMode); - - m_nDefState = (uint16)CTexture::GetTexState(s); -} - -bool CTexture::CreateDeviceTexture([[maybe_unused]] const byte* pData[6]) -{ - return true; -} - -void* CTexture::CreateDeviceResourceView([[maybe_unused]] const SResourceView& rv) -{ - return NULL; -} - -ETEX_Format CTexture::ClosestFormatSupported(ETEX_Format eTFDst) -{ - return eTFDst; -} - -bool CTexture::SetFilterMode(int nFilter) -{ - return s_sDefState.SetFilterMode(nFilter); -} - -bool CTexture::CreateRenderTarget([[maybe_unused]] ETEX_Format eTF, [[maybe_unused]] const ColorF& cClear) -{ - return true; -} - -bool CTexture::SetClampingMode(int nAddressU, int nAddressV, int nAddressW) -{ - return s_sDefState.SetClampMode(nAddressU, nAddressV, nAddressW); -} - -void CTexture::UpdateTexStates() -{ -} - -void CTexture::GenerateCachedShadowMaps() -{ -} - -void CTexture::Readback([[maybe_unused]] AZ::u32 subresourceIndex, StagingHook callback) -{ -} - -//====================================================================================== - -void SEnvTexture::Release() -{ -} - -void SEnvTexture::RT_SetMatrix(void) -{ -} - -bool SDynTexture::RestoreRT([[maybe_unused]] int nRT, [[maybe_unused]] bool bPop) -{ - return true; -} - -bool SDynTexture::ClearRT() -{ - return true; -} - -bool SDynTexture2::ClearRT() -{ - return true; -} - -bool SDynTexture::SetRT([[maybe_unused]] int nRT, [[maybe_unused]] bool bPush, [[maybe_unused]] SDepthTexture* pDepthSurf, [[maybe_unused]] bool bScreenVP) -{ - return true; -} - -bool SDynTexture2::SetRT([[maybe_unused]] int nRT, [[maybe_unused]] bool bPush, [[maybe_unused]] SDepthTexture* pDepthSurf, [[maybe_unused]] bool bScreenVP) -{ - return true; -} - -bool SDynTexture2::RestoreRT([[maybe_unused]] int nRT, [[maybe_unused]] bool bPop) -{ - return true; -} - -bool SDynTexture2::SetRectStates() -{ - return true; -} - -//=============================================================================== - -void STexState::PostCreate() -{ -} - -void STexState::Destroy() -{ -} - -void STexState::Init(const STexState& src) -{ - memcpy(this, &src, sizeof(src)); -} - -void STexState::SetComparisonFilter([[maybe_unused]] bool bEnable) -{ -} - -bool STexState::SetClampMode(int nAddressU, int nAddressV, int nAddressW) -{ - m_nAddressU = nAddressU; - m_nAddressV = nAddressV; - m_nAddressW = nAddressW; - return true; -} - -bool STexState::SetFilterMode([[maybe_unused]] int nFilter) -{ - m_nMinFilter = 0; - m_nMagFilter = 0; - m_nMipFilter = 0; - return true; -} - -void STexState::SetBorderColor(DWORD dwColor) -{ - m_dwBorderColor = dwColor; -} - - -SDepthTexture::~SDepthTexture() -{ -} - -void SDepthTexture::Release([[maybe_unused]] bool bReleaseTex) -{ -} - -ETEX_Format CTexture::TexFormatFromDeviceFormat([[maybe_unused]] D3DFormat nFormat) -{ - return eTF_Unknown; -} - -bool CTexture::RT_CreateDeviceTexture([[maybe_unused]] const byte* pData[6]) -{ - return true; -} - -void CTexture::UpdateTextureRegion([[maybe_unused]] const uint8_t* data, [[maybe_unused]] int X, [[maybe_unused]] int Y, [[maybe_unused]] int Z, [[maybe_unused]] int USize, [[maybe_unused]] int VSize, [[maybe_unused]] int ZSize, [[maybe_unused]] ETEX_Format eTFSrc) -{ -} -void CTexture::RT_UpdateTextureRegion([[maybe_unused]] const uint8_t* data, [[maybe_unused]] int X, [[maybe_unused]] int Y, [[maybe_unused]] int Z, [[maybe_unused]] int USize, [[maybe_unused]] int VSize, [[maybe_unused]] int ZSize, [[maybe_unused]] ETEX_Format eTFSrc) -{ -} - -void CTexture::Unbind() -{ -} - -bool SDynTexture::RT_SetRT([[maybe_unused]] int nRT, [[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] bool bPush, [[maybe_unused]] bool bScreenVP) -{ - return true; -} - -bool SDynTexture::RT_Update([[maybe_unused]] int nNewWidth, [[maybe_unused]] int nNewHeight) -{ - return true; -} - -void CTexture::ReleaseSystemTargets(void) {} -void CTexture::ReleaseMiscTargets(void) {} -void CTexture::CreateSystemTargets(void) {} - -//=============================================================================== - -namespace TextureHelpers -{ - bool VerifyTexSuffix([[maybe_unused]] EEfResTextures texSlot, [[maybe_unused]] const char* texPath) - { - return false; - } - - bool VerifyTexSuffix([[maybe_unused]] EEfResTextures texSlot, [[maybe_unused]] const string& texPath) - { - return false; - } - - const char* LookupTexSuffix([[maybe_unused]] EEfResTextures texSlot) - { - return nullptr; - } - - int8 LookupTexPriority([[maybe_unused]] EEfResTextures texSlot) - { - return 0; - } - - CTexture* LookupTexDefault([[maybe_unused]] EEfResTextures texSlot) - { - return nullptr; - } - - CTexture* LookupTexBlank([[maybe_unused]] EEfResTextures texSlot) - { - return nullptr; - } -} - -bool CTexture::Clear() { return true; } - -uint32 CDeviceTexture::TextureDataSize([[maybe_unused]] uint32 nWidth, [[maybe_unused]] uint32 nHeight, [[maybe_unused]] uint32 nDepth, [[maybe_unused]] uint32 nMips, [[maybe_unused]] uint32 nSlices, [[maybe_unused]] const ETEX_Format eTF) -{ - return 0; -} - -AtomShimTexture::~AtomShimTexture() -{ - if(AZ::Data::AssetBus::Handler::BusIsConnected()) - { - AZ::Data::AssetBus::Handler::BusDisconnect(); - } -} - -// Hot-reloading support for the AtomShimTexture. -// This only supports OnAssetReady, not OnAssetReloaded, because it is only intended to handle the case where a texture has not been processed or does not exist. -// The RPI::StreamingImage will handle re-loading if the file changes after it has been loaded initially -void AtomShimTexture::QueueForHotReload(const AZ::Data::AssetId& assetId) -{ - AZ::Data::AssetBus::Handler::BusConnect(assetId); - - // Lyshine may try to load a texture before the ImageSystem wasn't ready - if (AZ::RPI::ImageSystemInterface::Get()) - { - CreateFromImage(AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::Magenta)); - } -} - -void AtomShimTexture::OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) -{ - AZ::Data::AssetBus::Handler::BusDisconnect(asset.GetId()); - - AZ::Data::Asset<AZ::RPI::StreamingImageAsset> imageAsset = asset; - AZ_Assert(imageAsset, "This should be a streaming image asset"); - - CreateFromStreamingImageAsset(imageAsset); -} - -void AtomShimTexture::CreateFromStreamingImageAsset(const AZ::Data::Asset<AZ::RPI::StreamingImageAsset>& imageAsset) -{ - AZ::Data::Instance<AZ::RPI::Image> image = AZ::RPI::StreamingImage::FindOrCreate(imageAsset); - if (!image) - { - AZ_Error("CAtomShimRenderer", false, "Failed to find or create an image instance from image asset '%s'", imageAsset.GetHint().c_str()); - return; - } - - CreateFromImage(image); -} - -void AtomShimTexture::CreateFromImage(const AZ::Data::Instance<AZ::RPI::Image>& image) -{ - AZ::RHI::Format rhiViewFormat = AZ::RHI::Format::Unknown; - AZ::RHI::ImageViewDescriptor viewDesc = AZ::RHI::ImageViewDescriptor(rhiViewFormat); - AZ::RHI::Image* rhiImage = image->GetRHIImage(); - - AZ::RHI::Ptr<AZ::RHI::ImageView> imageView = rhiImage->GetImageView(viewDesc); - if(!imageView.get()) - { - AZ_Assert(false, "Failed to acquire an image view"); - return; - } - - m_instance = image; - m_image = rhiImage; - m_imageView = imageView; - - SetWidth(rhiImage->GetDescriptor().m_size.m_width); - SetHeight(rhiImage->GetDescriptor().m_size.m_height); -} - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_TexturesStreaming.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_TexturesStreaming.cpp deleted file mode 100644 index 14ecb6ed57..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/AtomShim_TexturesStreaming.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#include "CryRenderOther_precompiled.h" -#include "AtomShim_Renderer.h" -#include "../Common/Textures/TextureStreamPool.h" - -//=============================================================================== - -bool STexPoolItem::IsStillUsedByGPU([[maybe_unused]] uint32 nCurTick) -{ - return false; -} - -STexPoolItem::~STexPoolItem() -{ -} - -void CTexture::InitStreamingDev() -{ -} - -void CTexture::StreamExpandMip([[maybe_unused]] const void* pRawData, [[maybe_unused]] int nMip, [[maybe_unused]] int nBaseMipOffset, [[maybe_unused]] int nSideDelta) -{ -} - -void CTexture::StreamCopyMipsTexToTex([[maybe_unused]] STexPoolItem* pSrcItem, [[maybe_unused]] int nMipSrc, [[maybe_unused]] STexPoolItem* pDestItem, [[maybe_unused]] int nMipDest, [[maybe_unused]] int nNumMips) -{ -} - -bool CTexture::StreamPrepare_Platform() -{ - return true; -} - -int CTexture::StreamTrim([[maybe_unused]] int nToMip) -{ - return 0; -} - -// Just remove item from the texture object and keep Item in Pool list for future use -// This function doesn't release API texture -void CTexture::StreamRemoveFromPool() -{ -} - -void CTexture::StreamCopyMipsTexToMem([[maybe_unused]] int nStartMip, [[maybe_unused]] int nEndMip, [[maybe_unused]] bool bToDevice, [[maybe_unused]] STexPoolItem* pNewPoolItem) -{ -} - -STexPoolItem* CTexture::StreamGetPoolItem([[maybe_unused]] int nStartMip, [[maybe_unused]] int nMips, [[maybe_unused]] bool bShouldBeCreated, [[maybe_unused]] bool bCreateFromMipData, [[maybe_unused]] bool bCanCreate, [[maybe_unused]] bool bForStreamOut) -{ - return NULL; -} - -void CTexture::StreamAssignPoolItem([[maybe_unused]] STexPoolItem* pItem, [[maybe_unused]] int nMinMip) -{ -} - - -CTextureStreamPoolMgr::CTextureStreamPoolMgr() -{ -} - -CTextureStreamPoolMgr::~CTextureStreamPoolMgr() -{ -} - -void CTextureStreamPoolMgr::Flush() -{ -} - -STexPoolItem* CTextureStreamPoolMgr::GetPoolItem([[maybe_unused]] int nWidth, [[maybe_unused]] int nHeight, [[maybe_unused]] int nArraySize, [[maybe_unused]] int nMips, [[maybe_unused]] ETEX_Format eTF, [[maybe_unused]] bool bIsSRGB, [[maybe_unused]] ETEX_Type eTT, [[maybe_unused]] bool bShouldBeCreated, [[maybe_unused]] const char* sName, [[maybe_unused]] STextureInfo* pTI, [[maybe_unused]] bool bCanCreate, [[maybe_unused]] bool bWaitForIdle) -{ - return NULL; -} - -void CTextureStreamPoolMgr::ReleaseItem([[maybe_unused]] STexPoolItem* pItem) -{ -} - -void CTextureStreamPoolMgr::GarbageCollect([[maybe_unused]] size_t* nCurTexPoolSize, [[maybe_unused]] size_t nLowerPoolLimit, [[maybe_unused]] int nMaxItemsToFree) -{ -} - -void CTextureStreamPoolMgr::GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) -{ -} diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/CMakeLists.txt b/Gems/AtomLyIntegration/CryRenderAtomShim/CMakeLists.txt deleted file mode 100644 index 9ad9958449..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) - -include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) # For PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED - -if(NOT PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED) - return() -endif() - -ly_add_target( - NAME CryRenderOther ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} - NAMESPACE Legacy - FILES_CMAKE - atom_shim_renderer_files.cmake - ${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake - PLATFORM_INCLUDE_FILES - ${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake - INCLUDE_DIRECTORIES - PRIVATE - . - PCH - BUILD_DEPENDENCIES - PUBLIC - AZ::AzCore - Legacy::CryCommon - Legacy::CryRender.Headers - Legacy::CryRenderNULL.Static - AZ::AtomCore - Gem::Atom_RHI.Reflect - Gem::Atom_RPI.Public -) - -# Atom_AtomBridge.Static is the one that drives loading CryRenderOther, however, CryRenderOther -# is not enabled in every platform, so we define the dependency here -ly_add_dependencies(Atom_AtomBridge.Static CryRenderOther) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/CryRenderAtomShim.rc b/Gems/AtomLyIntegration/CryRenderAtomShim/CryRenderAtomShim.rc deleted file mode 100644 index 5730d0a537..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/CryRenderAtomShim.rc +++ /dev/null @@ -1,111 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Russian resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) -#ifdef _WIN32 -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -#pragma code_page(1251) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // Russian resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -#ifdef _WIN32 -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000904b0" - BEGIN - VALUE "CompanyName", "Amazon.com, Inc." - VALUE "FileVersion", "1, 0, 0, 1" - VALUE "LegalCopyright", "Portions of this file Copyright (c) Amazon.com, Inc. or its affiliates. All Rights Reserved. Original file Copyright (c) Crytek GMBH. Used under license by Amazon.com, Inc. and its affiliates." - VALUE "ProductName", "Lumberyard" - VALUE "ProductVersion", "1, 0, 0, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x9, 1200 - END -END - -#endif // German (Germany) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/PCH/CryRenderOther_precompiled.h b/Gems/AtomLyIntegration/CryRenderAtomShim/PCH/CryRenderOther_precompiled.h deleted file mode 100644 index 70450d0c5e..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/PCH/CryRenderOther_precompiled.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#pragma once - -#include <Common/RendererDefs.h> - -#include <Cry_Math.h> -#include <Cry_Geo.h> -#include <StlUtils.h> -#include "Common/DevBuffer.h" - -#include "XRenderD3D9/DeviceManager/DeviceManager.h" - -#include <VertexFormats.h> - -#include "Common/CommonRender.h" -#include <IRenderAuxGeom.h> -#include "Common/Shaders/ShaderComponents.h" -#include "Common/Shaders/Shader.h" -#include "Common/Shaders/CShader.h" -#include "Common/RenderMesh.h" -#include "Common/RenderPipeline.h" -#include "Common/RenderThread.h" - -#include "Common/Renderer.h" -#include "Common/Textures/Texture.h" - -#include "Common/OcclQuery.h" - -#include "Common/PostProcess/PostProcess.h" - -// All handled render elements (except common ones included in "RendElement.h") -#include "Common/RendElements/CREBeam.h" -#include "Common/RendElements/CREClientPoly.h" -#include "Common/RendElements/CRELensOptics.h" -#include "Common/RendElements/CREHDRProcess.h" -#include "Common/RendElements/CRECloud.h" -#include "Common/RendElements/CREDeferredShading.h" -#include "Common/RendElements/CREMeshImpl.h" diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/PAL_android.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/PAL_android.cmake deleted file mode 100644 index 64ee12d5a7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/PAL_android.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED TRUE) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android.cmake deleted file mode 100644 index f5b9ea77a2..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android_files.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android_files.cmake deleted file mode 100644 index 52ed52bc87..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Android/platform_android_files.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - ../Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp -) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/PAL_linux.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/PAL_linux.cmake deleted file mode 100644 index 64ee12d5a7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/PAL_linux.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED TRUE) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux.cmake deleted file mode 100644 index f5b9ea77a2..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/AtomShim_Renderer_Mac.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/AtomShim_Renderer_Mac.cpp deleted file mode 100644 index 63531162bf..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/AtomShim_Renderer_Mac.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "CryRenderOther_precompiled.h" -#import <AppKit/AppKit.h> - -bool UIDeviceIsTablet() -{ - return false; -} - -bool UIKitGetPrimaryPhysicalDisplayDimensions(int& o_widthPixels, int& o_heightPixels) -{ - NSScreen* nativeScreen = [NSScreen mainScreen]; - CGRect screenBounds = [nativeScreen frame]; - CGFloat screenScale = [nativeScreen backingScaleFactor]; - o_widthPixels = static_cast<int>(screenBounds.size.width * screenScale); - o_heightPixels = static_cast<int>(screenBounds.size.height * screenScale); - return true; -} - - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/PAL_mac.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/PAL_mac.cmake deleted file mode 100644 index 64ee12d5a7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/PAL_mac.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED TRUE) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac.cmake deleted file mode 100644 index 209e7f9107..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_COMPILE_OPTIONS - PRIVATE - -xobjective-c++ -) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/PAL_windows.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/PAL_windows.cmake deleted file mode 100644 index 64ee12d5a7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/PAL_windows.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED TRUE) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows.cmake deleted file mode 100644 index ad8a620993..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Windows/platform_windows.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_BUILD_DEPENDENCIES - PRIVATE -) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/AtomShim_Renderer_iOS.cpp b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/AtomShim_Renderer_iOS.cpp deleted file mode 100644 index 90132cdd75..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/AtomShim_Renderer_iOS.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates, or -* a third party where indicated. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ - -#include "CryRenderOther_precompiled.h" -#import <UIKit/UIKit.h> - -using NativeScreenType = UIScreen; -using NativeWindowType = UIWindow; - -bool UIDeviceIsTablet() -{ - if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) - { - return true; - } - return false; -} - -bool UIKitGetPrimaryPhysicalDisplayDimensions(int& o_widthPixels, int& o_heightPixels) -{ - UIScreen* nativeScreen = [UIScreen mainScreen]; - - CGRect screenBounds = [nativeScreen bounds]; - CGFloat screenScale = [nativeScreen scale]; - - o_widthPixels = static_cast<int>(screenBounds.size.width * screenScale); - o_heightPixels = static_cast<int>(screenBounds.size.height * screenScale); - - const bool isScreenLandscape = o_widthPixels > o_heightPixels; - UIInterfaceOrientation uiOrientation = UIInterfaceOrientationUnknown; -#if defined(__IPHONE_13_0) || defined(__TVOS_13_0) - if(@available(iOS 13.0, tvOS 13.0, *)) - { - UIWindow* foundWindow = nil; - - //Find the key window - NSArray* windows = [[UIApplication sharedApplication] windows]; - for (UIWindow* window in windows) - { - if (window.isKeyWindow) - { - foundWindow = window; - break; - } - } - - //Check if the key window is found - if(foundWindow) - { - uiOrientation = foundWindow.windowScene.interfaceOrientation; - } - else - { - //If no key window is found create a temporary window in order to extract the orientation - //This can happen as this function gets called before the renderer is initialized - CGRect screenBounds = [[UIScreen mainScreen] bounds]; - UIWindow* tempWindow = [[UIWindow alloc] initWithFrame: screenBounds]; - uiOrientation = tempWindow.windowScene.interfaceOrientation; - [tempWindow release]; - } - } -#else - uiOrientation = UIApplication.sharedApplication.statusBarOrientation; -#endif - - const bool isInterfaceLandscape = UIInterfaceOrientationIsLandscape(uiOrientation); - if (isScreenLandscape != isInterfaceLandscape) - { - const int width = o_widthPixels; - o_widthPixels = o_heightPixels; - o_heightPixels = width; - } - - return true; -} - diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/PAL_ios.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/PAL_ios.cmake deleted file mode 100644 index 64ee12d5a7..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/PAL_ios.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(PAL_TRAIT_ATOM_CRYRENDEROTHER_SUPPORTED TRUE) \ No newline at end of file diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios.cmake deleted file mode 100644 index 0286e6465b..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LY_COMPILE_OPTIONS - PRIVATE - -xobjective-c++ -) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios_files.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios_files.cmake deleted file mode 100644 index a5a3d98144..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/iOS/platform_ios_files.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - ../Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp - AtomShim_Renderer_iOS.cpp -) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/atom_shim_renderer_files.cmake b/Gems/AtomLyIntegration/CryRenderAtomShim/atom_shim_renderer_files.cmake deleted file mode 100644 index 0259c65b26..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/atom_shim_renderer_files.cmake +++ /dev/null @@ -1,29 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(FILES - AtomShim_DevBuffer.cpp - AtomShim_PostProcess.cpp - AtomShim_Renderer.cpp - AtomShim_RendPipeline.cpp - AtomShim_RERender.cpp - AtomShim_Shaders.cpp - AtomShim_Shadows.cpp - AtomShim_System.cpp - AtomShim_Textures.cpp - AtomShim_TexturesStreaming.cpp - AtomShim_RenderAuxGeom.cpp - AtomShim_Renderer.h - AtomShim_RenderAuxGeom.h - resource.h - AtomShim_CRELensOptics.cpp - PCH/CryRenderOther_precompiled.h -) diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/resource.h b/Gems/AtomLyIntegration/CryRenderAtomShim/resource.h deleted file mode 100644 index ed88839421..0000000000 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/resource.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -// Original file Copyright Crytek GMBH or its affiliates, used under license. - -#define VS_VERSION_INFO 1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp index 14a685a065..8452a6c690 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/ActorAsset.cpp @@ -253,24 +253,10 @@ namespace AZ } } - // If there is cloth data, set all the blend weights to zero to indicate - // the vertices will be updated by cpu. - // - // [TODO ATOM-14478] - // At the moment blend weights is a shared buffer and therefore all - // instances of the actor asset will be affected by it. In the future - // this buffer will be unique per instance and modified by cloth component - // when necessary. - // - // [TODO LYN-1890] - // At the moment, if there is cloth data it is assumed that every vertex in the - // submesh will be simulated by cloth in cpu, so all the weights are set to zero. - // But once the blend weights buffer can be modified per instance, it will be set by - // the cloth component, which decides whether to control the whole submesh or - // to apply an additional simplification pass to remove static triangles from simulation. - // Static triangles are the ones that all its vertices won't move during simulation and - // therefore its weights won't be altered so they are controlled by GPU. - // This additional simplification has been disabled in ClothComponentMesh.cpp for now. + // [TODO ATOM-15288] + // Temporary workaround. If there is cloth data, set all the blend weights to zero to indicate + // the vertices will be updated by cpu. When meshes with cloth data are not dispatched for skinning + // this can be hasClothData can be removed. // If there is no skinning info, default to 0 weights and display an error if (hasClothData || !sourceSkinningInfo) @@ -370,14 +356,6 @@ namespace AZ AZ_Assert(modelLodAsset->GetMeshes().size() > 0, "ModelLod '%d' for model '%s' has 0 meshes", lodIndex, fullFileName.c_str()); const RPI::ModelLodAsset::Mesh& mesh0 = modelLodAsset->GetMeshes()[0]; - // Get the amount of vertices and indices - // Get the meshes to process - bool hasUVs = false; - bool hasUVs2 = false; - bool hasTangents = false; - bool hasBitangents = false; - bool hasClothData = false; - // Do a pass over the lod to find the number of sub-meshes, the offset and size of each sub-mesh, and total number of vertices in the lod. // These will be combined into one input buffer for the source actor, but these offsets and sizes will be used to create multiple sub-meshes for the target skinned actor uint32_t lodVertexCount = 0; @@ -416,18 +394,18 @@ namespace AZ const AZ::Vector4* sourceTangents = static_cast<const AZ::Vector4*>(mesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_TANGENTS)); const AZ::Vector3* sourceBitangents = static_cast<const AZ::Vector3*>(mesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_BITANGENTS)); const AZ::Vector2* sourceUVs = static_cast<const AZ::Vector2*>(mesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_UVCOORDS, 0)); - const AZ::Vector2* sourceUVs2 = static_cast<const AZ::Vector2*>(mesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_UVCOORDS, 1)); - const uint32_t* sourceClothData = static_cast<uint32_t*>(mesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_CLOTH_DATA)); - hasUVs = (sourceUVs != nullptr); - hasUVs2 = (sourceUVs2 != nullptr); - hasTangents = (sourceTangents != nullptr); - hasBitangents = (sourceBitangents != nullptr); - hasClothData = (sourceClothData != nullptr); + const bool hasUVs = (sourceUVs != nullptr); + const bool hasTangents = (sourceTangents != nullptr); + const bool hasBitangents = (sourceBitangents != nullptr); // For each sub-mesh within each mesh, we want to create a separate sub-piece. const size_t numSubMeshes = mesh->GetNumSubMeshes(); + AZ_Assert(numSubMeshes == modelLodAsset->GetMeshes().size(), + "Number of submeshes (%d) in EMotionFX mesh (lod %d and joint index %d) doesn't match the number of meshes (%d) in model lod asset", + numSubMeshes, lodIndex, jointIndex, modelLodAsset->GetMeshes().size()); + for (size_t subMeshIndex = 0; subMeshIndex < numSubMeshes; ++subMeshIndex) { const EMotionFX::SubMesh* subMesh = mesh->GetSubMesh(subMeshIndex); @@ -466,6 +444,9 @@ namespace AZ } } + // Check if the model mesh asset has cloth data. One ModelLodAsset::Mesh corresponds to one EMotionFX::SubMesh. + const bool hasClothData = modelLodAsset->GetMeshes()[subMeshIndex].GetSemanticBufferAssetView(AZ::Name("CLOTH_DATA")) != nullptr; + ProcessSkinInfluences(mesh, subMesh, vertexBufferOffset, blendIndexBufferData, blendWeightBufferData, hasClothData); // Increment offsets so that the next sub-mesh can start at the right place diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp index cd5f3bb6c5..f8b638efaf 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp @@ -219,7 +219,7 @@ namespace AZ AZ_Assert(false, "AtomActorInstance::SetModelAsset not supported"); } - const Data::Asset<RPI::ModelAsset>& AtomActorInstance::GetModelAsset() const + Data::Asset<const RPI::ModelAsset> AtomActorInstance::GetModelAsset() const { AZ_Assert(GetActor(), "Expecting a Atom Actor Instance having a valid Actor."); return GetActor()->GetMeshAsset(); @@ -253,7 +253,7 @@ namespace AZ return GetModelAsset().GetHint(); } - const AZ::Data::Instance<RPI::Model> AtomActorInstance::GetModel() const + AZ::Data::Instance<RPI::Model> AtomActorInstance::GetModel() const { return m_skinnedMeshInstance->m_model; } @@ -459,7 +459,7 @@ namespace AZ MeshComponentRequestBus::Handler::BusConnect(m_entityId); const Data::Instance<RPI::Model> model = m_meshFeatureProcessor->GetModel(*m_meshHandle); - MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelReady, model->GetModelAsset(), model); + MeshComponentNotificationBus::Event(m_entityId, &MeshComponentNotificationBus::Events::OnModelReady, GetModelAsset(), model); } void AtomActorInstance::UnregisterActor() @@ -485,7 +485,7 @@ namespace AZ { // Last boolean parameter indicates if motion vector is enabled m_meshHandle = AZStd::make_shared<MeshFeatureProcessorInterface::MeshHandle>( - m_meshFeatureProcessor->AcquireMesh(m_skinnedMeshInstance->m_model->GetModelAsset(), materials, true)); + m_meshFeatureProcessor->AcquireMesh(m_skinnedMeshInstance->m_model->GetModelAsset(), materials, /*skinnedMeshWithMotion=*/true)); } // If render proxies already exist, they will be auto-freed @@ -512,10 +512,9 @@ namespace AZ MaterialReceiverNotificationBus::Event(m_entityId, &MaterialReceiverNotificationBus::Events::OnMaterialAssignmentsChanged); RegisterActor(); - // [TODO ATOM-14478, LYN-1890] + // [TODO ATOM-15288] // Temporary workaround for cloth to make sure the output skinned buffers are filled at least once. - // When the blend weights buffer can be unique per instance and updated by cloth component, - // FillSkinnedMeshInstanceBuffers can be removed. + // When meshes with cloth data are not dispatched for skinning FillSkinnedMeshInstanceBuffers can be removed. FillSkinnedMeshInstanceBuffers(); } else diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h index a2cf042efa..b31091681e 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h @@ -128,12 +128,12 @@ namespace AZ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MeshComponentRequestBus::Handler overrides... void SetModelAsset(Data::Asset<RPI::ModelAsset> modelAsset) override; - const Data::Asset<RPI::ModelAsset>& GetModelAsset() const override; + Data::Asset<const RPI::ModelAsset> GetModelAsset() const override; void SetModelAssetId(Data::AssetId modelAssetId) override; Data::AssetId GetModelAssetId() const override; void SetModelAssetPath(const AZStd::string& modelAssetPath) override; AZStd::string GetModelAssetPath() const override; - const AZ::Data::Instance<RPI::Model> GetModel() const override; + AZ::Data::Instance<RPI::Model> GetModel() const override; void SetSortKey(RHI::DrawItemSortKey sortKey) override; RHI::DrawItemSortKey GetSortKey() const override; void SetLodOverride(RPI::Cullable::LodOverride lodOverride) override; diff --git a/Gems/AtomLyIntegration/ImguiAtom/Assets/Shaders/ImGuiAtom/ImGuiAtom.azsl b/Gems/AtomLyIntegration/ImguiAtom/Assets/Shaders/ImGuiAtom/ImGuiAtom.azsl index daed5c1946..3227205d0e 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Assets/Shaders/ImGuiAtom/ImGuiAtom.azsl +++ b/Gems/AtomLyIntegration/ImguiAtom/Assets/Shaders/ImGuiAtom/ImGuiAtom.azsl @@ -75,4 +75,4 @@ PixelOutput MainPS(in VertexOutput input) float4 color = ObjectSrg::FontImage.Sample(ObjectSrg::LinearSampler, input.UV) * input.Color; output.m_color = float4(color.rgb * color.a, color.a); return output; -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp index 3f25228406..34e7af688c 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp @@ -58,6 +58,9 @@ namespace AZ auto atomViewportRequests = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); const AZ::Name contextName = atomViewportRequests->GetDefaultViewportContextName(); AZ::RPI::ViewportContextNotificationBus::Handler::BusConnect(contextName); + + m_initialized = false; + InitializeViewportSizeIfNeeded(); } void ImguiAtomSystemComponent::Deactivate() @@ -66,6 +69,23 @@ namespace AZ AZ::RPI::ViewportContextNotificationBus::Handler::BusDisconnect(); } + void ImguiAtomSystemComponent::InitializeViewportSizeIfNeeded() + { +#if defined(IMGUI_ENABLED) + if (m_initialized) + { + return; + } + auto atomViewportRequests = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); + auto defaultViewportContext = atomViewportRequests->GetDefaultViewportContext(); + if (defaultViewportContext) + { + // If this succeeds, m_initialized will be set to true. + OnViewportSizeChanged(defaultViewportContext->GetViewportSize()); + } +#endif + } + void ImguiAtomSystemComponent::RenderImGuiBuffers(const ImDrawData& drawData) { Render::ImGuiSystemRequestBus::Broadcast(&Render::ImGuiSystemRequests::RenderImGuiBuffersToCurrentViewport, drawData); @@ -74,7 +94,25 @@ namespace AZ void ImguiAtomSystemComponent::OnRenderTick() { #if defined(IMGUI_ENABLED) - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::Render); + InitializeViewportSizeIfNeeded(); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::Render); +#endif + } + + void ImguiAtomSystemComponent::OnViewportSizeChanged(AzFramework::WindowSize size) + { +#if defined(IMGUI_ENABLED) + ImGui::ImGuiManagerBus::Broadcast([this, size](ImGui::ImGuiManagerBus::Events* imgui) + { + imgui->OverrideRenderWindowSize(size.m_width, size.m_height); + // ImGuiManagerListenerBus may not have been connected when this system component is activated + // as ImGuiManager is not part of a system component we can require and instead just listens for ESYSTEM_EVENT_GAME_POST_INIT. + // Let our ImguiAtomSystemComponent know once we successfully connect and update the viewport size. + if (!m_initialized) + { + m_initialized = true; + } + }); #endif } } diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h index a554ab0339..d8e7409788 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h @@ -48,14 +48,16 @@ namespace AZ void Deactivate() override; private: + void InitializeViewportSizeIfNeeded(); // OtherActiveImGuiRequestBus overrides ... void RenderImGuiBuffers(const ImDrawData& drawData) override; // ViewportContextNotificationBus overrides... void OnRenderTick() override; + void OnViewportSizeChanged(AzFramework::WindowSize size) override; - DebugConsole m_debugConsole; + bool m_initialized = false; }; } // namespace LYIntegration } // namespace AZ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env index 78ac0099ba..2174726150 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.env @@ -52,4 +52,4 @@ export DYNACONF_DDCCSI_PY_BASE=${DCCSI_PYTHON_INSTALL}\python.cmd # for utils/tools/apps that need them ( see config.init_ly_pyside() ) #export DYNACONF_QTFORPYTHON_PATH=${LY_DEV}\Gems\QtForPython\3rdParty\pyside2\windows\release #export DYNACONF_QT_PLUGIN_PATH=${LY_BUILD_PATH}\bin\profile\EditorPlugins -#export DYNACONF_QT_QPA_PLATFORM_PLUGIN_PATH=${LY_BUILD_PATH}\bin\profile\EditorPlugins\platforms \ No newline at end of file +#export DYNACONF_QT_QPA_PLATFORM_PLUGIN_PATH=${LY_BUILD_PATH}\bin\profile\EditorPlugins\platforms diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.p4ignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.p4ignore index 989d576750..dedde06bc4 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.p4ignore +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/.p4ignore @@ -18,4 +18,4 @@ __WIP__/* !.p4ignore !.gitignore .secrets.* -settings.local.json \ No newline at end of file +settings.local.json diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt index 041414ebc1..028bff685d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/CMakeLists.txt @@ -10,4 +10,4 @@ # add_subdirectory(Code) -update_pip_requirements(${CMAKE_CURRENT_LIST_DIR}/requirements.txt DccScriptingInterface) \ No newline at end of file +update_pip_requirements(${CMAKE_CURRENT_LIST_DIR}/requirements.txt DccScriptingInterface) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Editor/Scripts/bootstrap.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Editor/Scripts/bootstrap.py index ec490ff9bb..d1c1921ee5 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Editor/Scripts/bootstrap.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Editor/Scripts/bootstrap.py @@ -127,4 +127,4 @@ if __name__ == '__main__': _LOGGER.info(f'QT_QPA_PLATFORM_PLUGIN_PATH: {_settings.QT_QPA_PLATFORM_PLUGIN_PATH}') _config.test_pyside2() -# --- END ----------------------------------------------------------------- \ No newline at end of file +# --- END ----------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat index ed49075109..4a64c43029 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Core.bat @@ -128,4 +128,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat index cad2d2d4f3..319219352d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat @@ -149,4 +149,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat index a9eb47788e..73068131fb 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat @@ -64,4 +64,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat index b1d202c55a..0c8dda612d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat @@ -92,4 +92,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat index 140c5d3092..650ea0ee1b 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Qt.bat @@ -64,4 +64,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat index 9422bc6696..ce7ca56ecd 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Substance.bat @@ -54,4 +54,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat index 0da2c3e48d..67ecaa7949 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_VScode.bat @@ -52,4 +52,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat index cb5badbde7..807225be78 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat @@ -67,4 +67,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat index 23af8bb8ed..8bd0436691 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Env_Cmd.bat @@ -53,4 +53,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat index ba8aae4974..81f5eff123 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Maya_2020.bat @@ -73,4 +73,4 @@ IF EXIST "%MAYA_BIN_PATH%\maya.exe" ( :: Restore previous directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat index 4989086ec6..fd275ff8c8 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_PyMin_Cmd.bat @@ -51,4 +51,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat index 094514b0ae..0c19d858d4 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_Qt_PyMin_Cmd.bat @@ -52,4 +52,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat index 03d8d2955b..5f08fb6ba8 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat @@ -104,4 +104,4 @@ IF EXIST "%ProgramFiles%\Microsoft VS Code\Code.exe" ( :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat index 404c013e0c..efe5c9cecd 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat @@ -99,4 +99,4 @@ IF EXIST "%WINGHOME%\bin\wing.exe" ( :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat index 01ec2b5687..70eea94701 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayaPy_2020.bat @@ -73,4 +73,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat index 8de4c55651..233dacd140 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE.bat @@ -43,4 +43,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat index 17aea4ee26..819d1c1d24 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_pyBASE_Cmd.bat @@ -46,4 +46,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat index b11dd013e2..ebddf054ac 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat @@ -25,4 +25,4 @@ set PY_SITE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python\Lib set PACKAGE_LOC=C:\Depot\3rdParty\packages\openimageio-2.1.16.0-rev1-windows\OpenImageIO\2.1.16.0\win_x64\bin -copy %PACKAGE_LOC%\OpenImageIO.pyd %PY_SITE%\OpenImageIO.pyd \ No newline at end of file +copy %PACKAGE_LOC%\OpenImageIO.pyd %PY_SITE%\OpenImageIO.pyd diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material index 4bf22b8762..94fc5a16bd 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Atom/Scripts/Python/DCC_Materials/pbr.material @@ -4,10 +4,9 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "factor": 1.0, - "useTexture": true, - "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseTextureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" }, "baseColor": { "color": [ 1.0, 1.0, 1.0 ], diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py index 4745b9ab2b..b09a28bad2 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/__init__.py @@ -32,4 +32,4 @@ __all__ = ['blender_materials', 'materials_export', 'max_materials', 'maya_materials', - 'model'] \ No newline at end of file + 'model'] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py index d6860dc2dc..1df665149c 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/blender_materials.py @@ -157,4 +157,4 @@ if __name__ == '__main__': # print(value) # scene_information.append(value) # initialize_scene(scene_information) -# instance = BlenderMaterials(file_list, total_material_count) \ No newline at end of file +# instance = BlenderMaterials(file_list, total_material_count) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material index 4bf22b8762..94fc5a16bd 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/dcc_materials/pbr.material @@ -4,10 +4,9 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "factor": 1.0, - "useTexture": true, - "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseTextureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" }, "baseColor": { "color": [ 1.0, 1.0, 1.0 ], diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat index 47704c22d7..87fa0373cd 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/launcher.bat @@ -85,4 +85,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py index 094f2a5edf..67b65edf9c 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/main.py @@ -1073,4 +1073,4 @@ def launch_kitbash_converter(): if __name__ == '__main__': - launch_kitbash_converter() \ No newline at end of file + launch_kitbash_converter() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py index 1a6eb0a94d..fc5fab753a 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/process_fbx_file.py @@ -369,4 +369,4 @@ base_directory = sys.argv[-2] _LOGGER.info('Base Directory: {}'.format(base_directory)) relative_destination_path = sys.argv[-1].replace('/', '\\') _LOGGER.info('Relative Destination Path: {}'.format(relative_destination_path)) -ProcessFbxFile(fbx_file, base_directory, relative_destination_path) \ No newline at end of file +ProcessFbxFile(fbx_file, base_directory, relative_destination_path) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py index e768611c3d..8b749ff573 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standalone.py @@ -37,4 +37,4 @@ settings = _config.get_config_settings(setup_ly_pyside=True) from main import launch_kitbash_converter -launch_kitbash_converter() \ No newline at end of file +launch_kitbash_converter() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material index 5632c6fc0d..cc2c548174 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/kitbash_converter/standardPBR.template.material @@ -7,10 +7,13 @@ "general": { "texcoord": 0 }, - "ambientOcclusion": { - "factor": 1.0, - "useTexture": false, - "textureMap": "" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseUseTexture": false, + "diffuseTextureMap": "", + "specularFactor": 1.0, + "specularUseTexture": false, + "specularTextureMap": "" }, "baseColor": { "color": [ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat index 35475366cc..66e3c94990 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Cmd.bat @@ -45,4 +45,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat index 9705898e10..2c32b82025 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_Maya_2020.bat @@ -68,4 +68,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat index a02afd58fe..b777b6394f 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Launch_WingIDE-7-1.bat @@ -81,4 +81,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat index 8e7447203c..5492a88daa 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/Project_Env.bat @@ -72,4 +72,4 @@ GOTO END_OF_FILE :: Return to starting directory POPD -:END_OF_FILE \ No newline at end of file +:END_OF_FILE diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py index 254becf913..5463837c76 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/constants.py @@ -74,4 +74,4 @@ FBX_ASSIGNED_GEO = 'assigned' # Threshold values for baked vertex color # id mask images when no UVs present EMPTY_IMAGE_LOW = 260000 -EMPTY_IMAGE_LOW = 270000 \ No newline at end of file +EMPTY_IMAGE_LOW = 270000 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material index 1ac6fb2fcb..78891d6c46 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/standardPBR.template.material @@ -7,10 +7,13 @@ "general": { "texcoord": 0 }, - "ambientOcclusion": { - "factor": 1.0, - "useTexture": false, - "textureMap": "" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseUseTexture": false, + "diffuseTextureMap": "", + "specularFactor": 1.0, + "specularUseTexture": false, + "specularTextureMap": "" }, "baseColor": { "color": [ diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py index 77bd1f8b32..0d47a4dcec 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/legacy_asset_converter/test_command_port.py @@ -163,4 +163,4 @@ if __name__ == '__main__': if __name__ == "__main__": - maya_client = MayaClient() \ No newline at end of file + maya_client = MayaClient() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material index 4bf22b8762..30d895f9ac 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/maya_dcc_materials/standardpbr.template.material @@ -4,10 +4,13 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "factor": 1.0, - "useTexture": true, - "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseUseTexture": true, + "diffuseTextureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif", + "specularFactor": 1.0, + "specularUseTexture": true, + "specularTextureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" }, "baseColor": { "color": [ 1.0, 1.0, 1.0 ], diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/StandardPBR_AllProperties.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/StandardPBR_AllProperties.material index 4bf22b8762..00ff63829f 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/StandardPBR_AllProperties.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/StandardPBR_AllProperties.material @@ -4,10 +4,13 @@ "parentMaterial": "", "propertyLayoutVersion": 3, "properties": { - "ambientOcclusion": { - "factor": 1.0, - "useTexture": true, - "textureMap": "EngineAssets/TextureMsg/DefaultNoUVs.tif" + "occlusion": { + "diffuseFactor": 1.0, + "diffuseUseTexture": false, + "diffuseTextureMap": "", + "specularFactor": 1.0, + "specularUseTexture": false, + "specularTextureMap": "" }, "baseColor": { "color": [ 1.0, 1.0, 1.0 ], diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/__init__.py index 53699adc75..d02eb5b446 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/__init__.py @@ -11,4 +11,4 @@ __all__ = ['atom_mat', 'fbx_to_atom', 'stingraypbs_converter', - 'stingraypbs_converter_maya'] \ No newline at end of file + 'stingraypbs_converter_maya'] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/atom_mat.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/atom_mat.py index d05b73c5d3..aafe90be12 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/atom_mat.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/atom_mat.py @@ -63,4 +63,4 @@ class AtomMaterial: output_data = open(material_out, "w+") output_data.write(json.dumps(self.mat_box, indent=4)) output_data.close() -# ------------------------------------------------------------------------- \ No newline at end of file +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/fbx_to_atom.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/fbx_to_atom.py index a9f8542f2e..f03a666ddf 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/fbx_to_atom.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/Python/stingraypbs_converter/fbx_to_atom.py @@ -64,4 +64,4 @@ class FBX: if __name__ == "__main__": fbx01 = FBX(fbx_root + 'peccy_01.fbx') - fbx01.create_atom_material() \ No newline at end of file + fbx01.create_atom_material() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/constants.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/constants.py index a7ec622228..00939c0a0d 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/constants.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/constants.py @@ -32,4 +32,4 @@ So we can make an update here once that is used elsewhere # none # ------------------------------------------------------------------------- OBJ_DCCSI_MAINMENU = 'LyDCCsiMainMenu' -TAG_DCCSI_MAINMENU = 'DCCsi (LY:Atom)' \ No newline at end of file +TAG_DCCSI_MAINMENU = 'DCCsi (LY:Atom)' diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_defaults.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_defaults.py index 8dd4884c7c..eaa6fcd986 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_defaults.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_defaults.py @@ -93,4 +93,4 @@ def set_defaults(units='meter'): _LOGGER.info('~ Setting up fixPaths in default scene') return 0 -# ------------------------------------------------------------------------- \ No newline at end of file +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_menu.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_menu.py index 15b4b04a64..750d7da0f9 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_menu.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/Scripts/set_menu.py @@ -88,4 +88,4 @@ def set_main_menu(obj_name=OBJ_DCCSI_MAINMENU, label=TAG_DCCSI_MAINMENU): #========================================================================== if __name__ == '__main__': - _custom_menu = set_main_menu() \ No newline at end of file + _custom_menu = set_main_menu() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt index 576022a495..5936b24632 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/readme.txt @@ -77,4 +77,4 @@ We have a requirements.txt file with the extension packages we use in the DCCsi. You'll need the repo/branch path of your Lumberyard(O3DE) install. And you'll need to know where the DCCsi, we will install package dependancies there. -C:\Program Files\Autodesk\Maya2020\bin>mayapy -m pip install -r C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\SDK\Maya\requirements.txt -t C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\3rdParty\Python\Lib\2.x\2.7.x\site-packages \ No newline at end of file +C:\Program Files\Autodesk\Maya2020\bin>mayapy -m pip install -r C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\SDK\Maya\requirements.txt -t C:\Depot\Lumberyard\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\3rdParty\Python\Lib\2.x\2.7.x\site-packages diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt index b3c5068124..2d087be121 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Maya/requirements.txt @@ -30,4 +30,4 @@ python-box==3.4.6 \ unipath==1.1 \ --hash=sha256:09839adcc72e8a24d4f76d63656f30b5a1f721fc40c9bcd79d8c67bdd8b47dae \ --hash=sha256:e6257e508d8abbfb6ddd8ec357e33589f1f48b1599127f23b017124d90b0fff7 - # via -r requirements.txt \ No newline at end of file + # via -r requirements.txt diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat index b587dbb153..e2199bf00e 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/launcher.bat @@ -85,4 +85,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py index 10e3dda97c..8b1f5dcf07 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/max_materials.py @@ -18,4 +18,4 @@ def get_material_information(): print('Object---> {}'.format(mesh_object)) -get_material_information() \ No newline at end of file +get_material_information() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py index 4034a29ab2..f2ca6d8979 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/DCC_Material_Converter/standalone.py @@ -37,4 +37,4 @@ settings = _config.get_config_settings(setup_ly_pyside=True) from main import launch_material_converter -launch_material_converter() \ No newline at end of file +launch_material_converter() diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py index 2d94768382..7bde4042db 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/PythonTools/Launcher/main.py @@ -74,4 +74,4 @@ layout.addWidget(QLabel('Hello World!')) # Add a label layout.addWidget(button) # Add the button man window.setLayout(layout) # Pass the layout to the window window.show() # Show window -app.exec_() # Execute the App \ No newline at end of file +app.exec_() # Execute the App diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/bootstrap.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/bootstrap.py index da1300d78f..ebb51809f2 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/bootstrap.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/bootstrap.py @@ -132,4 +132,4 @@ if __name__ == "__main__": # remove the logger del _LOGGER -# ---- END --------------------------------------------------------------- \ No newline at end of file +# ---- END --------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py index 38a7a00dd9..36190d0f54 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/substance_tools.py @@ -146,4 +146,4 @@ if __name__ == '__main__': # remove the logger del _LOGGER -# ---- END --------------------------------------------------------------- \ No newline at end of file +# ---- END --------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py index d101248433..1d7a040597 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PyQt5_qtextedit_stdout.py @@ -90,4 +90,4 @@ reader.start('python', ['-u', 'C:\\dccapi\\dev\\Gems\\DccScriptingInterface\\LyP '\\__init__.py', 'C:\\Users\\chunghao\\Documents\\Allegorithmic\\Substance Designer' '\\sbsar']) # start the process console.show() # make the console visible -app.exec_() # run the PyQt main loop \ No newline at end of file +app.exec_() # run the PyQt main loop diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py index 11559b4ff5..3b213c0fe3 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/PySide2_qtextedit_stdout.py @@ -96,4 +96,4 @@ timer = QTimer() timer.timeout.connect(lambda: None) timer.start(100) -sys.exit(app.exec_()) \ No newline at end of file +sys.exit(app.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py index ab44d0e41e..ddba7ed87d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/main.py @@ -76,4 +76,4 @@ if __name__ == "__main__": mainWindow = MainWindow(_UI_FILEPATH) mainWindow.setWindowTitle(_PROGRAM_NAME_VERSION) mainWindow.show() - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py index 8faea4620e..a7700efb4f 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/selection_dialog.py @@ -338,4 +338,4 @@ if __name__ == '__main__': timer.timeout.connect(lambda: None) timer.start(10) # sys.exit(reader.kill()) - sys.exit(app.exec_()) \ No newline at end of file + sys.exit(app.exec_()) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss index f9601c1668..044b5831ca 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/BreadCrumbs.qss @@ -19,4 +19,4 @@ BreadCrumbs are QWidgets with a QHBoxLayout with 0 content margins and one QLabe AzQtComponents--BreadCrumbs { -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss index e7fb61edae..27953f44ae 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/Menu.qss @@ -50,4 +50,4 @@ QMenu::separator { height: 1px; background: #444444; -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss index af6807a734..700a02d3ee 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/builder/ui/stylesheets/ToolTip.qss @@ -20,4 +20,4 @@ QToolTip font-size: 12px; margin-top: 0px; margin-bottom: 0px; -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material index 9c7c82f0a5..26f4dd7508 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom.material @@ -12,4 +12,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material index 6e35b2e4fb..db7be6c2ac 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_PBR_BASE.material @@ -262,4 +262,4 @@ } ] } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material index 45c7c039cc..daca840ed3 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_pbr.material @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material index 09ebcd7f88..26d30908b8 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/atom_variant00.material @@ -47,4 +47,4 @@ "textureMap": "" } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material index 45c7c039cc..daca840ed3 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/SDK/Substance/resources/atom/awesome.material @@ -76,4 +76,4 @@ } } } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt index 1886429d07..599278c196 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.dev/readme.txt @@ -39,4 +39,4 @@ Note: if you want to use them as a python package this: pyside2-tools/pyside2uic/__init__.py.in becomes: pyside2-tools/pyside2uic/__init__.py -Some examples are in: DccScriptingInterface\azpy\shared\ui\templates.py \ No newline at end of file +Some examples are in: DccScriptingInterface\azpy\shared\ui\templates.py diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore index 835472432f..a7c382ed39 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/.p4ignore @@ -1 +1 @@ -workspace.xml \ No newline at end of file +workspace.xml diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml index 86800f7ab3..764d6090c1 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/DccScriptingInterface.iml @@ -23,4 +23,4 @@ </list> </option> </component> -</module> \ No newline at end of file +</module> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml index 15a15b218a..bde1df6961 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/encodings.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="Encoding" addBOMForNewFiles="with NO BOM" /> -</project> \ No newline at end of file +</project> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml index 227fa01c70..1069eb4889 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/misc.xml @@ -7,4 +7,4 @@ <component name="PyPackaging"> <option name="earlyReleasesAsUpgrades" value="true" /> </component> -</project> \ No newline at end of file +</project> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml index 3f41c1f178..990412b98b 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/modules.xml @@ -5,4 +5,4 @@ <module fileurl="file://$PROJECT_DIR$/.idea/DccScriptingInterface.iml" filepath="$PROJECT_DIR$/.idea/DccScriptingInterface.iml" /> </modules> </component> -</project> \ No newline at end of file +</project> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml index bc59970703..ed52866afa 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/vcs.xml @@ -3,4 +3,4 @@ <component name="VcsDirectoryMappings"> <mapping directory="$PROJECT_DIR$/../../../../.." vcs="Git" /> </component> -</project> \ No newline at end of file +</project> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml index 1922420c78..3e72a53d00 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.idea/webResources.xml @@ -11,4 +11,4 @@ </entry> </contentEntries> </component> -</project> \ No newline at end of file +</project> diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace index b9bcffd345..a3c6713ccf 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/dccsi.code-workspace @@ -8,4 +8,4 @@ "python.envFile": "${workspaceFolder}/../../.env", "python.pythonPath": "${env:DCCSI_PY_DEFAULT}" } -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json index 34a6705c82..d1f58d72d3 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/launch.json @@ -13,4 +13,4 @@ "python": "${workspaceFolder}\\..\\..\\..\\..\\..\\..\\Tools\\Python\\3.7.5\\windows\\python.exe" } ] -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json index 824f2fa77a..6e7f908d04 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/.vscode/settings.json @@ -2,4 +2,4 @@ "python.envFile": "${workspaceFolder}/../../.env", "python.pythonPath": "${workspaceFolder}\\..\\..\\..\\..\\..\\..\\Tools\\Python\\3.7.5\\windows\\python.exe", "editor.wordWrap": "wordWrapColumn" -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt index 024392c339..ad75f4db05 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Solutions/readme.txt @@ -13,4 +13,4 @@ DccScriptingInterface\Solutions\.dev The user can create this folder locally. We use it to store .pyi files to add to IDE configurations -for api inspection and auto-complete functionality \ No newline at end of file +for api inspection and auto-complete functionality diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py index 44c35c9cd8..6592e58abe 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/3dsmax/__init__.py @@ -66,4 +66,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py index 364ac699de..fa8750766f 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/blender/__init__.py @@ -66,4 +66,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py index 0b75ea4330..dbc75212d4 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py @@ -200,4 +200,4 @@ if __name__ == '__main__': _LOGGER.info('DCCSI_PYTHON_LIB_PATH: {}'.format(bootstrap_dccsi_py_libs(return_stub_dir('dccsi_stub')))) # custom prompt - sys.ps1 = "[azpy]>>" \ No newline at end of file + sys.ps1 = "[azpy]>>" diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/__init__.py index 86224098ad..cfd14411f8 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/__init__.py @@ -13,4 +13,4 @@ # -- This line is 75 characters ------------------------------------------- # define api package for each IDE supported -__all__ = ['ide', 'utils'] \ No newline at end of file +__all__ = ['ide', 'utils'] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py index bb95d93e1d..62a35f1997 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/__init__.py @@ -91,4 +91,4 @@ def import_all(_all=__all__): if _DCCSI_DEV_MODE: # If in dev mode this will test imports of __all__ import_all(__all__) -# ------------------------------------------------------------------------- \ No newline at end of file +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore index 38389e3936..34fcef1ac1 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/.p4ignore @@ -1,2 +1,2 @@ *.pyo -*.pyc \ No newline at end of file +*.pyc diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt index db6f13568a..80c950d10b 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/readme.txt @@ -63,4 +63,4 @@ You might need to reboot wing. Then you should have auto-complete for the lumbe Note: the entirety of azlmbr api does not generate .pyi files currently, all of the "Behaviour Context" based classes do non-BC modules such as azlmbr.paths currently do not -https://jira.agscollab.com/browse/SPEC-3316 \ No newline at end of file +https://jira.agscollab.com/browse/SPEC-3316 diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py index f66919b502..ac89dfadb9 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/ide/wing/test.py @@ -80,4 +80,4 @@ if __name__ == '__main__': _DCCSI_DEV_MODE = True _LOGGER.setLevel(_logging.DEBUG) # force debugging - foo = dccsi_test_script("This is a test") \ No newline at end of file + foo = dccsi_test_script("This is a test") diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py index a4141ade7c..ba52da7b86 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/__init__.py @@ -13,4 +13,4 @@ # -- This line is 75 characters ------------------------------------------- # define api package for each IDE supported -__all__ = ['check'] \ No newline at end of file +__all__ = ['check'] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py index 4755741a1d..7bb25e43d0 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/__init__.py @@ -15,4 +15,4 @@ # define api package for each IDE supported __all__ = ['running_state', 'maya_app'] -# maya_app, named such to avoid namespace collisions with maya dcc app api \ No newline at end of file +# maya_app, named such to avoid namespace collisions with maya dcc app api diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py index 7e08f3375e..a257a0c1c6 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/dev/utils/check/maya_app.py @@ -154,4 +154,4 @@ if __name__ == '__main__': _LOGGER.info(STR_CROSSBAR) _DCCSI_DCC_APP = validate_state() - _LOGGER.info('Is Maya Running? _DCCSI_DCC_APP = {}'.format(_DCCSI_DCC_APP)) \ No newline at end of file + _LOGGER.info('Is Maya Running? _DCCSI_DCC_APP = {}'.format(_DCCSI_DCC_APP)) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_bool.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_bool.py index e485c2eed0..5fbc2c6ab5 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_bool.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/env_bool.py @@ -27,4 +27,4 @@ def env_bool(envar, default=False): return False else: return envar_test -# ------------------------------------------------------------------------- \ No newline at end of file +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/houdini/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/houdini/__init__.py index 6c68784340..0ca3c81d96 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/houdini/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/houdini/__init__.py @@ -66,4 +66,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py index e77ff25a3b..a50dc68c89 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/lumberyard/__init__.py @@ -67,4 +67,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py index 183946fe20..d5127cbf86 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/marmoset/__init__.py @@ -66,4 +66,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py index 280deb80ba..f2d2ca668d 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/__init__.py @@ -76,4 +76,4 @@ if _DCCSI_DEV_MODE: _logger=_LOGGER) # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py index 8a30499739..c8e4314c41 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/__init__.py @@ -13,4 +13,4 @@ # -- This line is 75 characters ------------------------------------------- # define api package for each IDE supported -__all__ = ['simple_command_port', 'execute_wing_code', 'wing_to_maya'] \ No newline at end of file +__all__ = ['simple_command_port', 'execute_wing_code', 'wing_to_maya'] diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py index 010d7c549e..0cd6080237 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/simple_command_port.py @@ -239,4 +239,4 @@ if __name__ == '__main__': # should attemp to open the port, which should warn because only works in Maya foo_port.open() - _LOGGER.info('Port Name: {}'.format(foo_port.port_name)) \ No newline at end of file + _LOGGER.info('Port Name: {}'.format(foo_port.port_name)) diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py index 2c0f921fec..9798f3f268 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/maya/utils/wing_to_maya.py @@ -151,4 +151,4 @@ def start_wing_to_maya_menu(): port = start_wing_to_maya(local_host=_LOCAL_HOST, comman_port=6000) return -# ------------------------------------------------------------------------- \ No newline at end of file +# ------------------------------------------------------------------------- diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py index e6c0c12501..81a4754533 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/render/__init__.py @@ -68,4 +68,4 @@ def init(): pass # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py index b181efc6e7..ff303de698 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/__init__.py @@ -49,4 +49,4 @@ if _DCCSI_DEV_MODE: _logger=_LOGGER) # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json index 322fe53f26..52c556733c 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/boxDumpTest.json @@ -14,4 +14,4 @@ "DCCSI_WING_VERSION_MINOR": "1", "WINGHOME": "C:\\Program Files (x86)\\Wing Pro 7.1", "DCCSI_PY_DEFAULT": "G:\\depot\\JG_PC1_spectrAtom\\dev\\Tools\\Python\\3.7.5\\windows\\python.exe" -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py index 2d0c0804c8..4148b56f13 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/common/__init__.py @@ -50,4 +50,4 @@ if _DCCSI_DEV_MODE: _logger=_LOGGER) # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py index 5626c2b5ba..3938050dce 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/__init__.py @@ -49,4 +49,4 @@ if _DCCSI_DEV_MODE: _logger=_LOGGER) # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/qdarkstyle/readme.txt b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/qdarkstyle/readme.txt index c701565e69..e100551564 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/qdarkstyle/readme.txt +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/qdarkstyle/readme.txt @@ -2,4 +2,4 @@ LICENSE https://github.com/ColinDuquesnoy/QDarkStyleSheet/blob/master/LICENSE.rst DEPOT -https://github.com/ColinDuquesnoy/QDarkStyleSheet \ No newline at end of file +https://github.com/ColinDuquesnoy/QDarkStyleSheet diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/BreadCrumbs.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/BreadCrumbs.qss index f9601c1668..044b5831ca 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/BreadCrumbs.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/BreadCrumbs.qss @@ -19,4 +19,4 @@ BreadCrumbs are QWidgets with a QHBoxLayout with 0 content margins and one QLabe AzQtComponents--BreadCrumbs { -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/Menu.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/Menu.qss index e7fb61edae..27953f44ae 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/Menu.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/Menu.qss @@ -50,4 +50,4 @@ QMenu::separator { height: 1px; background: #444444; -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/ToolTip.qss b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/ToolTip.qss index af6807a734..700a02d3ee 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/ToolTip.qss +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/shared/ui/resources/stylesheets/ToolTip.qss @@ -20,4 +20,4 @@ QToolTip font-size: 12px; margin-top: 0px; margin-bottom: 0px; -} \ No newline at end of file +} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py index 2c4b883c51..b5d1721354 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/substance/__init__.py @@ -67,4 +67,4 @@ def init(): # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py index 1911a0ad38..d82901cda7 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/test/__init__.py @@ -67,4 +67,4 @@ def init(): # ------------------------------------------------------------------------- -del _LOGGER \ No newline at end of file +del _LOGGER diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/settings.json b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/settings.json index 9e26dfeeb6..0967ef424b 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/settings.json +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/settings.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py index 9e3c21ca94..7b91778a9d 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/setup.py @@ -16,4 +16,4 @@ setup( name='DccScriptingInterface', version='0.1', packages=find_packages(), -) \ No newline at end of file +) diff --git a/Gems/AudioEngineWwise/Code/CMakeLists.txt b/Gems/AudioEngineWwise/Code/CMakeLists.txt index f8eaf1ef21..dfd9ae6e24 100644 --- a/Gems/AudioEngineWwise/Code/CMakeLists.txt +++ b/Gems/AudioEngineWwise/Code/CMakeLists.txt @@ -241,4 +241,4 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) NAME Gem::AudioEngineWwise.Editor.Tests ) endif() -endif() \ No newline at end of file +endif() diff --git a/Gems/AudioEngineWwise/Code/Platform/Android/AkPlatformFuncs_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Android/AkPlatformFuncs_Platform.h index fc2da374a0..be4b6b2fef 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Android/AkPlatformFuncs_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Android/AkPlatformFuncs_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <../Common/Default/AkPlatformFuncs_Default.h> \ No newline at end of file +#include <../Common/Default/AkPlatformFuncs_Default.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Android/AudioEngineWwise_Traits_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Android/AudioEngineWwise_Traits_Platform.h index b8caf25ed7..f2209db830 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Android/AudioEngineWwise_Traits_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Android/AudioEngineWwise_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioEngineWwise_Traits_Android.h> \ No newline at end of file +#include <AudioEngineWwise_Traits_Android.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Common/Default/AkPlatformFuncs_Default.h b/Gems/AudioEngineWwise/Code/Platform/Common/Default/AkPlatformFuncs_Default.h index 53c21b3338..4222a6e004 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Common/Default/AkPlatformFuncs_Default.h +++ b/Gems/AudioEngineWwise/Code/Platform/Common/Default/AkPlatformFuncs_Default.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AK/Tools/Common/AkPlatformFuncs.h> \ No newline at end of file +#include <AK/Tools/Common/AkPlatformFuncs.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Linux/AkPlatformFuncs_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Linux/AkPlatformFuncs_Platform.h index fc2da374a0..be4b6b2fef 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Linux/AkPlatformFuncs_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Linux/AkPlatformFuncs_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <../Common/Default/AkPlatformFuncs_Default.h> \ No newline at end of file +#include <../Common/Default/AkPlatformFuncs_Default.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Linux/AudioEngineWwise_Traits_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Linux/AudioEngineWwise_Traits_Platform.h index 8642633ace..40ea4b2870 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Linux/AudioEngineWwise_Traits_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Linux/AudioEngineWwise_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioEngineWwise_Traits_Linux.h> \ No newline at end of file +#include <AudioEngineWwise_Traits_Linux.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Linux/PAL_linux.cmake b/Gems/AudioEngineWwise/Code/Platform/Linux/PAL_linux.cmake index 724c11e2cf..69420d8aca 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Linux/PAL_linux.cmake +++ b/Gems/AudioEngineWwise/Code/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) \ No newline at end of file +set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) diff --git a/Gems/AudioEngineWwise/Code/Platform/Mac/AkPlatformFuncs_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Mac/AkPlatformFuncs_Platform.h index fc2da374a0..be4b6b2fef 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Mac/AkPlatformFuncs_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Mac/AkPlatformFuncs_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <../Common/Default/AkPlatformFuncs_Default.h> \ No newline at end of file +#include <../Common/Default/AkPlatformFuncs_Default.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Mac/AudioEngineWwise_Traits_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Mac/AudioEngineWwise_Traits_Platform.h index 16afc8b4bc..ba65fad570 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Mac/AudioEngineWwise_Traits_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Mac/AudioEngineWwise_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioEngineWwise_Traits_Mac.h> \ No newline at end of file +#include <AudioEngineWwise_Traits_Mac.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Mac/PAL_mac.cmake b/Gems/AudioEngineWwise/Code/Platform/Mac/PAL_mac.cmake index 724c11e2cf..69420d8aca 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Mac/PAL_mac.cmake +++ b/Gems/AudioEngineWwise/Code/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) \ No newline at end of file +set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) diff --git a/Gems/AudioEngineWwise/Code/Platform/Windows/AkPlatformFuncs_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Windows/AkPlatformFuncs_Platform.h index 58eeff820c..d4322a0819 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Windows/AkPlatformFuncs_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Windows/AkPlatformFuncs_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <../Common/MSVC/AkPlatformFuncs_Default.h> \ No newline at end of file +#include <../Common/MSVC/AkPlatformFuncs_Default.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Windows/AudioEngineWwise_Traits_Platform.h b/Gems/AudioEngineWwise/Code/Platform/Windows/AudioEngineWwise_Traits_Platform.h index 505314394a..40403d942f 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Windows/AudioEngineWwise_Traits_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/Windows/AudioEngineWwise_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioEngineWwise_Traits_Windows.h> \ No newline at end of file +#include <AudioEngineWwise_Traits_Windows.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/Windows/PAL_windows.cmake b/Gems/AudioEngineWwise/Code/Platform/Windows/PAL_windows.cmake index 724c11e2cf..69420d8aca 100644 --- a/Gems/AudioEngineWwise/Code/Platform/Windows/PAL_windows.cmake +++ b/Gems/AudioEngineWwise/Code/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) \ No newline at end of file +set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) diff --git a/Gems/AudioEngineWwise/Code/Platform/iOS/AkPlatformFuncs_Platform.h b/Gems/AudioEngineWwise/Code/Platform/iOS/AkPlatformFuncs_Platform.h index fc2da374a0..be4b6b2fef 100644 --- a/Gems/AudioEngineWwise/Code/Platform/iOS/AkPlatformFuncs_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/iOS/AkPlatformFuncs_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <../Common/Default/AkPlatformFuncs_Default.h> \ No newline at end of file +#include <../Common/Default/AkPlatformFuncs_Default.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/iOS/AudioEngineWwise_Traits_Platform.h b/Gems/AudioEngineWwise/Code/Platform/iOS/AudioEngineWwise_Traits_Platform.h index d72640efa3..e04c14043a 100644 --- a/Gems/AudioEngineWwise/Code/Platform/iOS/AudioEngineWwise_Traits_Platform.h +++ b/Gems/AudioEngineWwise/Code/Platform/iOS/AudioEngineWwise_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioEngineWwise_Traits_iOS.h> \ No newline at end of file +#include <AudioEngineWwise_Traits_iOS.h> diff --git a/Gems/AudioEngineWwise/Code/Platform/iOS/PAL_ios.cmake b/Gems/AudioEngineWwise/Code/Platform/iOS/PAL_ios.cmake index 724c11e2cf..69420d8aca 100644 --- a/Gems/AudioEngineWwise/Code/Platform/iOS/PAL_ios.cmake +++ b/Gems/AudioEngineWwise/Code/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) \ No newline at end of file +set(PAL_TRAIT_AUDIO_ENGINE_WWISE_USE_STUB TRUE) diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor.svg index 9f3fb87640..c71a17771a 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor.svg @@ -23,4 +23,4 @@ <rect id="Rectangle-Copy-67" x="7.85015167" y="8.84967619" width="3" height="1.30076785"></rect> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor_hover.svg index 772518b4d2..900c31c103 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/auxbus_nor_hover.svg @@ -23,4 +23,4 @@ <rect id="Rectangle-Copy-67" x="7.85015167" y="8.84967619" width="3" height="1.30076785"></rect> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor.svg index 3e5c678351..54fe2cd8b3 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor.svg @@ -18,4 +18,4 @@ <rect id="Rectangle-Copy-67" x="9.93618454" y="5.44723173" width="2.19056317" height="1.09528159"></rect> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor_hover.svg index 5a4c4fa765..8c885dc3a3 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/event_nor_hover.svg @@ -18,4 +18,4 @@ <rect id="Rectangle-Copy-67" x="9.93618454" y="5.44723173" width="2.19056317" height="1.09528159"></rect> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor.svg index 6c497a4b31..42239a6aea 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor.svg @@ -9,4 +9,4 @@ </g> <path d="M9.49786987,3.50689788 L9.497,4.38189788 L14.4704694,4.38189788 L14.4704694,5.63189788 L9.497,5.63189788 L9.49786987,6.50689788 L8.625,6.50689788 L8.625,9.46089788 L9.5,9.46186067 L9.5,12.4618607 L6.5,12.4618607 L6.5,11.5858979 L1.375,11.5868607 L1.375,10.3368607 L6.5,10.3358979 L6.5,9.46186067 L7.375,9.46089788 L7.375,6.50689788 L6.49786987,6.50689788 L6.49786987,3.50689788 L9.49786987,3.50689788 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor_hover.svg index c94341d324..408e273638 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/gameparameter_nor_hover.svg @@ -9,4 +9,4 @@ </g> <path d="M9.49786987,3.50689788 L9.497,4.38189788 L14.4704694,4.38189788 L14.4704694,5.63189788 L9.497,5.63189788 L9.49786987,6.50689788 L8.625,6.50689788 L8.625,9.46089788 L9.5,9.46186067 L9.5,12.4618607 L6.5,12.4618607 L6.5,11.5858979 L1.375,11.5868607 L1.375,10.3368607 L6.5,10.3358979 L6.5,9.46186067 L7.375,9.46089788 L7.375,6.50689788 L6.49786987,6.50689788 L6.49786987,3.50689788 L9.49786987,3.50689788 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor.svg index c2174e1d24..17a7247c7b 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor.svg @@ -23,4 +23,4 @@ <rect id="Rectangle-Copy-71" fill-opacity="0.5" fill="#FFFFFF" x="10.9422097" y="9.38930289" width="1.31097362" height="1.30076785"></rect> <rect id="Rectangle-Copy-67" fill="#FFFFFF" x="12.2531833" y="9.38930289" width="2.60153569" height="1.30076785"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor_hover.svg index b198946da2..0a728169f4 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/soundbank_nor_hover.svg @@ -23,4 +23,4 @@ <rect id="Rectangle-Copy-71" fill-opacity="0.5" fill="#FFFFFF" x="10.9422097" y="9.38930289" width="1.31097362" height="1.30076785"></rect> <rect id="Rectangle-Copy-67" fill="#FFFFFF" x="12.2531833" y="9.38930289" width="2.60153569" height="1.30076785"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor.svg index 003dca57ae..11da453eea 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor.svg @@ -15,4 +15,4 @@ </mask> <use id="Shape" fill="#FFFFFF" fill-rule="nonzero" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor_hover.svg index edf42431aa..ba17f8a9d7 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/state_nor_hover.svg @@ -15,4 +15,4 @@ </mask> <use id="Shape" fill="#FFFFFF" fill-rule="nonzero" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor.svg index 39c4fba1eb..6b9cd4f786 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor.svg @@ -13,4 +13,4 @@ <path d="M3.0005867,7 C2.99857962,7.19027999 3.00172214,7.69236895 3.01001424,9.01722359 C3.00217987,10.2689451 3.00353901,10.7862286 3.00330322,11 C4.10666199,10.9964253 5,10.1023661 5,9 C5,7.89673637 4.10519532,7.00211459 3.0005867,7 L3.0005867,7 Z M3,12 C1.34314575,12 0,10.6568542 0,9 C0,7.34314575 1.34314575,6 3,6 C4.65685425,6 6,7.34314575 6,9 C6,10.6568542 4.65685425,12 3,12 Z" id="Shape-Copy-3"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor_hover.svg index cfa42d3ff3..f96f508686 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/stategroup_nor_hover.svg @@ -13,4 +13,4 @@ <path d="M3.0005867,7 C2.99857962,7.19027999 3.00172214,7.69236895 3.01001424,9.01722359 C3.00217987,10.2689451 3.00353901,10.7862286 3.00330322,11 C4.10666199,10.9964253 5,10.1023661 5,9 C5,7.89673637 4.10519532,7.00211459 3.0005867,7 L3.0005867,7 Z M3,12 C1.34314575,12 0,10.6568542 0,9 C0,7.34314575 1.34314575,6 3,6 C4.65685425,6 6,7.34314575 6,9 C6,10.6568542 4.65685425,12 3,12 Z" id="Shape-Copy-3"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor.svg index f1973a9f79..0995a542ad 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor.svg @@ -9,4 +9,4 @@ </g> <path d="M12.5,3.5 L12.5,12.5 L3.5,12.5 L3.5,3.5 L12.5,3.5 Z M10.5,5.5 L5.5,5.5 L5.5,10.5 L10.5,10.5 L10.5,5.5 Z" id="Combined-Shape-Copy-2" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor_hover.svg index 3740f88e2d..bd8da5992b 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switch_nor_hover.svg @@ -9,4 +9,4 @@ </g> <path d="M12.5,3.5 L12.5,12.5 L3.5,12.5 L3.5,3.5 L12.5,3.5 Z M10.5,5.5 L5.5,5.5 L5.5,10.5 L10.5,10.5 L10.5,5.5 Z" id="Combined-Shape-Copy-2" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor.svg index fd3455d9ef..73a46e7a3d 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor.svg @@ -9,4 +9,4 @@ </g> <path d="M10.5,10.5 L10.5,13.5 L7.5,13.5 L7.5,10.5 L10.5,10.5 Z M6.5,2.5 L6.5,13.5 L5.25,13.5 L5.25,2.5 L6.5,2.5 Z M9.5,11.5 L8.5,11.5 L8.5,12.5 L9.5,12.5 L9.5,11.5 Z M10.5,6.5 L10.5,9.5 L7.5,9.5 L7.5,6.5 L10.5,6.5 Z M9.5,7.5 L8.5,7.5 L8.5,8.5 L9.5,8.5 L9.5,7.5 Z M10.5,2.5 L10.5,5.5 L7.5,5.5 L7.5,2.5 L10.5,2.5 Z M9.5,3.5 L8.5,3.5 L8.5,4.5 L9.5,4.5 L9.5,3.5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor_hover.svg b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor_hover.svg index 26098c3be8..ee7cebf046 100644 --- a/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor_hover.svg +++ b/Gems/AudioEngineWwise/Code/Source/Editor/WwiseIcons/switchgroup_nor_hover.svg @@ -9,4 +9,4 @@ </g> <path d="M10.5,10.5 L10.5,13.5 L7.5,13.5 L7.5,10.5 L10.5,10.5 Z M6.5,2.5 L6.5,13.5 L5.25,13.5 L5.25,2.5 L6.5,2.5 Z M9.5,11.5 L8.5,11.5 L8.5,12.5 L9.5,12.5 L9.5,11.5 Z M10.5,6.5 L10.5,9.5 L7.5,9.5 L7.5,6.5 L10.5,6.5 Z M9.5,7.5 L8.5,7.5 L8.5,8.5 L9.5,8.5 L9.5,7.5 Z M10.5,2.5 L10.5,5.5 L7.5,5.5 L7.5,2.5 L10.5,2.5 Z M9.5,3.5 L8.5,3.5 L8.5,4.5 L9.5,4.5 L9.5,3.5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioEngineWwise/Code/Tests/AudioControls/Legacy/NoConfigGroups.xml b/Gems/AudioEngineWwise/Code/Tests/AudioControls/Legacy/NoConfigGroups.xml index 3c823cbec1..cf0c8fcad4 100644 --- a/Gems/AudioEngineWwise/Code/Tests/AudioControls/Legacy/NoConfigGroups.xml +++ b/Gems/AudioEngineWwise/Code/Tests/AudioControls/Legacy/NoConfigGroups.xml @@ -13,4 +13,4 @@ </ATLPlatforms> </ATLPreloadRequest> </AudioPreloads> -</ATLConfig> \ No newline at end of file +</ATLConfig> diff --git a/Gems/AudioEngineWwise/Code/Tests/AudioControls/MissingPreloads.xml b/Gems/AudioEngineWwise/Code/Tests/AudioControls/MissingPreloads.xml index 5882feac63..9b9aabcd19 100644 --- a/Gems/AudioEngineWwise/Code/Tests/AudioControls/MissingPreloads.xml +++ b/Gems/AudioEngineWwise/Code/Tests/AudioControls/MissingPreloads.xml @@ -2,4 +2,4 @@ <AudioTriggers> <ATLTrigger atl_name="test_trigger"/> </AudioTriggers> -</ATLConfig> \ No newline at end of file +</ATLConfig> diff --git a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Android/wwise_config_android.json b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Android/wwise_config_android.json index 95c1c999ed..22cc632cbd 100644 --- a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Android/wwise_config_android.json +++ b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Android/wwise_config_android.json @@ -4,4 +4,4 @@ "enginePlatform": "Android", "wwisePlatform": "Android", "bankSubPath": "android" -} \ No newline at end of file +} diff --git a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Linux/wwise_config_linux.json b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Linux/wwise_config_linux.json index cec7bcf5d3..0cd66e130f 100644 --- a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Linux/wwise_config_linux.json +++ b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Linux/wwise_config_linux.json @@ -4,4 +4,4 @@ "enginePlatform": "Linux", "wwisePlatform": "Linux", "bankSubPath": "linux" -} \ No newline at end of file +} diff --git a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Mac/wwise_config_mac.json b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Mac/wwise_config_mac.json index f23bc35dac..4069d8add7 100644 --- a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Mac/wwise_config_mac.json +++ b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Mac/wwise_config_mac.json @@ -4,4 +4,4 @@ "enginePlatform": "Mac", "wwisePlatform": "Mac", "bankSubPath": "mac" -} \ No newline at end of file +} diff --git a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Windows/wwise_config_windows.json b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Windows/wwise_config_windows.json index 7ba1c201df..a2481c939f 100644 --- a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Windows/wwise_config_windows.json +++ b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/Windows/wwise_config_windows.json @@ -4,4 +4,4 @@ "enginePlatform": "Windows", "wwisePlatform": "Windows", "bankSubPath": "windows" -} \ No newline at end of file +} diff --git a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/iOS/wwise_config_ios.json b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/iOS/wwise_config_ios.json index 2ec78b0a98..ba02fc5651 100644 --- a/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/iOS/wwise_config_ios.json +++ b/Gems/AudioEngineWwise/Tools/WwiseConfig/Platform/iOS/wwise_config_ios.json @@ -4,4 +4,4 @@ "enginePlatform": "iOS", "wwisePlatform": "iOS", "bankSubPath": "ios" -} \ No newline at end of file +} diff --git a/Gems/AudioSystem/Code/CMakeLists.txt b/Gems/AudioSystem/Code/CMakeLists.txt index e38df4342c..8a6f2c417e 100644 --- a/Gems/AudioSystem/Code/CMakeLists.txt +++ b/Gems/AudioSystem/Code/CMakeLists.txt @@ -252,4 +252,4 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) NAME Gem::AudioSystem.Editor.Tests ) endif() -endif () \ No newline at end of file +endif () diff --git a/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Android.h b/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Android.h index 75b8245977..eaecb67e94 100644 --- a/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Android.h +++ b/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Android.h @@ -20,4 +20,4 @@ #define AZ_TRAIT_AUDIOSYSTEM_AUDIO_THREAD_AFFINITY AFFINITY_MASK_ALL #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_ALLOCATION_POLICY IMemoryManager::eapCustomAlignment #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE 72 << 10 /* 72 MiB (re-evaluate this size!) */ -#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "2048 (2 MiB)" \ No newline at end of file +#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "2048 (2 MiB)" diff --git a/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Platform.h b/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Platform.h index 9e7d8dfbbe..e338cffb84 100644 --- a/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Platform.h +++ b/Gems/AudioSystem/Code/Platform/Android/AudioSystem_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioSystem_Traits_Android.h> \ No newline at end of file +#include <AudioSystem_Traits_Android.h> diff --git a/Gems/AudioSystem/Code/Platform/Android/platform_android.cmake b/Gems/AudioSystem/Code/Platform/Android/platform_android.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/AudioSystem/Code/Platform/Android/platform_android.cmake +++ b/Gems/AudioSystem/Code/Platform/Android/platform_android.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Linux.h b/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Linux.h index 72a45668a3..951eec5d54 100644 --- a/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Linux.h +++ b/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Linux.h @@ -20,4 +20,4 @@ #define AZ_TRAIT_AUDIOSYSTEM_AUDIO_THREAD_AFFINITY AFFINITY_MASK_ALL #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_ALLOCATION_POLICY IMemoryManager::eapCustomAlignment #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE 384 << 10 /* 384 MiB */ -#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" \ No newline at end of file +#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" diff --git a/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Platform.h b/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Platform.h index 1f6d907773..914d74271a 100644 --- a/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Platform.h +++ b/Gems/AudioSystem/Code/Platform/Linux/AudioSystem_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioSystem_Traits_Linux.h> \ No newline at end of file +#include <AudioSystem_Traits_Linux.h> diff --git a/Gems/AudioSystem/Code/Platform/Linux/platform_linux.cmake b/Gems/AudioSystem/Code/Platform/Linux/platform_linux.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/AudioSystem/Code/Platform/Linux/platform_linux.cmake +++ b/Gems/AudioSystem/Code/Platform/Linux/platform_linux.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Mac.h b/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Mac.h index 72a45668a3..951eec5d54 100644 --- a/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Mac.h +++ b/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Mac.h @@ -20,4 +20,4 @@ #define AZ_TRAIT_AUDIOSYSTEM_AUDIO_THREAD_AFFINITY AFFINITY_MASK_ALL #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_ALLOCATION_POLICY IMemoryManager::eapCustomAlignment #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE 384 << 10 /* 384 MiB */ -#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" \ No newline at end of file +#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" diff --git a/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Platform.h b/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Platform.h index b0a6df92dd..c0bf0dd159 100644 --- a/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Platform.h +++ b/Gems/AudioSystem/Code/Platform/Mac/AudioSystem_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioSystem_Traits_Mac.h> \ No newline at end of file +#include <AudioSystem_Traits_Mac.h> diff --git a/Gems/AudioSystem/Code/Platform/Mac/platform_mac.cmake b/Gems/AudioSystem/Code/Platform/Mac/platform_mac.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/AudioSystem/Code/Platform/Mac/platform_mac.cmake +++ b/Gems/AudioSystem/Code/Platform/Mac/platform_mac.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Platform.h b/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Platform.h index 76bf781ebb..8b9714bf13 100644 --- a/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Platform.h +++ b/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioSystem_Traits_Windows.h> \ No newline at end of file +#include <AudioSystem_Traits_Windows.h> diff --git a/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Windows.h b/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Windows.h index 8a079c2b49..11fb0ee66d 100644 --- a/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Windows.h +++ b/Gems/AudioSystem/Code/Platform/Windows/AudioSystem_Traits_Windows.h @@ -20,4 +20,4 @@ #define AZ_TRAIT_AUDIOSYSTEM_AUDIO_THREAD_AFFINITY AFFINITY_MASK_ALL #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_ALLOCATION_POLICY IMemoryManager::eapCustomAlignment #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE 384 << 10 /* 384 MiB */ -#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" \ No newline at end of file +#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "393216 (384 MiB)" diff --git a/Gems/AudioSystem/Code/Platform/Windows/platform_windows.cmake b/Gems/AudioSystem/Code/Platform/Windows/platform_windows.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/AudioSystem/Code/Platform/Windows/platform_windows.cmake +++ b/Gems/AudioSystem/Code/Platform/Windows/platform_windows.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_Platform.h b/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_Platform.h index 20c850cb75..8efdc2ce7d 100644 --- a/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_Platform.h +++ b/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <AudioSystem_Traits_iOS.h> \ No newline at end of file +#include <AudioSystem_Traits_iOS.h> diff --git a/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_iOS.h b/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_iOS.h index fc8d6519e0..3ffcf4a345 100644 --- a/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_iOS.h +++ b/Gems/AudioSystem/Code/Platform/iOS/AudioSystem_Traits_iOS.h @@ -20,4 +20,4 @@ #define AZ_TRAIT_AUDIOSYSTEM_AUDIO_THREAD_AFFINITY AFFINITY_MASK_ALL #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_ALLOCATION_POLICY IMemoryManager::eapCustomAlignment #define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE 2 << 10 /* 2 MiB (re-evaluate this size!) */ -#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "2048 (2 MiB)" \ No newline at end of file +#define AZ_TRAIT_AUDIOSYSTEM_FILE_CACHE_MANAGER_SIZE_DEFAULT_TEXT "2048 (2 MiB)" diff --git a/Gems/AudioSystem/Code/Platform/iOS/platform_ios.cmake b/Gems/AudioSystem/Code/Platform/iOS/platform_ios.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/AudioSystem/Code/Platform/iOS/platform_ios.cmake +++ b/Gems/AudioSystem/Code/Platform/iOS/platform_ios.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/AudioSystem/Code/Source/Editor/AudioControlFilters.cpp b/Gems/AudioSystem/Code/Source/Editor/AudioControlFilters.cpp index b68e8c4395..f72edf627b 100644 --- a/Gems/AudioSystem/Code/Source/Editor/AudioControlFilters.cpp +++ b/Gems/AudioSystem/Code/Source/Editor/AudioControlFilters.cpp @@ -79,4 +79,4 @@ bool SHideConnectedFilter::IsItemValid(QTreeWidgetItem* pItem) return !m_bHideConnected || !pItem->data(0, eMDR_CONNECTED).toBool(); } return false; -} \ No newline at end of file +} diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Environment_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Environment_Icon.svg index f63527506f..285e9894c7 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Environment_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Environment_Icon.svg @@ -4,4 +4,4 @@ <g id="Icons-/-audio-/-Environments" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <polygon id="Path-12" fill="#00A6D1" points="5.6532191 5.17565264 7.09502284 6.95273157 9.07498245 3 15.3898294 12.9527316 1 12.9527316"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon.svg index ef12b807e2..6e2e8903f0 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon.svg @@ -5,4 +5,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M2,5 C2,4.44771525 2.44771525,4 3,4 L9.45124546,4 C9.78429996,4 10.0954962,4.16581403 10.2812564,4.44225291 L10.9920366,5.5 C11.0957122,5.65428466 11.1488102,5.8277351 11.1551724,6.00077049 L21,6 C21.5522847,6 22,6.44771525 22,7 L22,19 C22,19.5522847 21.5522847,20 21,20 L3,20 C2.44771525,20 2,19.5522847 2,19 L2,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon_Selected.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon_Selected.svg index e4b3f05ad6..2de9937f45 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon_Selected.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Folder_Icon_Selected.svg @@ -5,4 +5,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M21.0000145,10.0000002 C21.5522992,10.0000002 22.0000145,10.4477155 22.0000145,11.0000002 C22.0000145,11.1018541 21.9844537,11.2031102 21.9538706,11.3002642 L19.4355536,19.3002642 C19.3044537,19.7167326 18.9183129,20.0000002 18.4816975,20.0000002 L5.4833766,20.0000002 C4.93109185,20.0000002 4.4833766,19.552285 4.4833766,19.0000002 C4.4833766,18.8900639 4.50150476,18.7808799 4.53703156,18.6768423 L7.26887194,10.6768423 C7.4070995,10.2720527 7.78747708,10.0000002 8.21521699,10.0000002 L21.0000145,10.0000002 Z M9.44780281,4 C9.78275436,4 10.0954619,4.16769579 10.2807886,4.4467057 L10.9920366,5.51749116 C11.0912175,5.66680824 11.1439449,5.83344448 11.1536569,6.00035825 L18,6.0000002 C18.5522847,6.0000002 19,6.44771545 19,7.0000002 L19,8 L6.73087596,8 C6.33984472,8 5.98863886,8.22732025 5.82557418,8.57515139 L5.78244733,8.68300925 L2.44017427,18.6830093 C2.40601789,18.7852043 2.3886029,18.892248 2.3886029,19 C2.3886029,19.5128358 2.77464309,19.9355072 3.27198177,19.9932723 L3.339,19.997 L3,19.9988779 C2.44771525,19.9988779 2,19.5511626 2,18.9988779 L2,5 C2,4.44771525 2.44771525,4 3,4 L9.44780281,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Preload_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Preload_Icon.svg index f661fde6dd..360fcd4195 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Preload_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Preload_Icon.svg @@ -4,4 +4,4 @@ <g id="Icons-/-audio-/-Preloads" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <polygon id="Path-11" fill="#70CDF0" points="7.77655981 1.87490942 11.5676984 5.93936491 5.87224422 5.93936491 8.55586607 4.28952347 7.31426331 3.25 3 5.93936491 3 14.0624857 13.733201 14.0624857 13.733201 5.93936491 8.81781972 1"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/RTPC_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/RTPC_Icon.svg index 7a216b4e30..e3e4fbc77c 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/RTPC_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/RTPC_Icon.svg @@ -4,4 +4,4 @@ <g id="Icons-/-audio-/-RTPCs" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M12.2515909,1.27692394 L12.2515909,6.77961839 L13.7655393,6.77961839 L13.7655393,12.4124579 L12.2515909,12.4124579 L12.2515909,15.0667476 L10.1665255,15.0667476 L10.1665255,12.4124579 L8.66382537,12.4124579 L8.66382537,6.77961839 L10.1665255,6.77961839 L10.1665255,1.27692394 L12.2515909,1.27692394 Z M6.58281985,1 L6.58281985,3.6542897 L8.10171394,3.6542897 L8.10171394,9.28712923 L6.58281985,9.28712923 L6.58281985,14.7898237 L4.49775446,14.7898237 L4.49775446,9.28712923 L3,9.28712923 L3,3.6542897 L4.49775446,3.6542897 L4.49775446,1 L6.58281985,1 Z" id="Combined-Shape" fill="#7994E4"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Switch_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Switch_Icon.svg index b99aca8c6a..e5b279296b 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Switch_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Switch_Icon.svg @@ -4,4 +4,4 @@ <g id="Icons-/-audio-/-Switches" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M12.5,1 L12.5,14.5 L4,14.5 L4,1 L12.5,1 Z M11.5,2.25 L5,2.25 L5,13.25 L11.5,13.25 L11.5,2.25 Z M11,7.75 L11,12.75 L5.5,12.75 L5.5,7.75 L11,7.75 Z" id="Shape" fill="#A95C8E"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Trigger_Icon.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Trigger_Icon.svg index 683fc3f950..ada09de97a 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Trigger_Icon.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Trigger_Icon.svg @@ -4,4 +4,4 @@ <g id="Icons-/-audio-/-trigger" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M15,10.6669366 L15,13.6669366 L2,13.6669366 L2,10.6669366 L15,10.6669366 Z M8.5,3 C10.2949254,3 11.75,4.45507456 11.75,6.25 C11.75,8.04492544 10.2949254,9.5 8.5,9.5 C6.70507456,9.5 5.25,8.04492544 5.25,6.25 C5.25,4.45507456 6.70507456,3 8.5,3 Z" id="Combined-Shape" fill="#74B23F"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/Icons/Unassigned.svg b/Gems/AudioSystem/Code/Source/Editor/Icons/Unassigned.svg index e3fc29d979..1e7d5259e4 100644 --- a/Gems/AudioSystem/Code/Source/Editor/Icons/Unassigned.svg +++ b/Gems/AudioSystem/Code/Source/Editor/Icons/Unassigned.svg @@ -10,4 +10,4 @@ <path d="M9.03094493,8.89212062 L15.0309449,8.89212062 L15.0309449,8.89212062 L15.0309449,14.8921206 L9.03094493,14.8921206 C8.47866018,14.8921206 8.03094493,14.4444054 8.03094493,13.8921206 L8.03094493,9.89212062 C8.03094493,9.33983587 8.47866018,8.89212062 9.03094493,8.89212062 Z" id="Rectangle-Copy" fill-rule="nonzero" transform="translate(11.530945, 11.892121) scale(-1, 1) translate(-11.530945, -11.892121) "></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/AudioSystem/Code/Source/Editor/QTreeWidgetFilter.cpp b/Gems/AudioSystem/Code/Source/Editor/QTreeWidgetFilter.cpp index ed2ed6cbda..ffcc2bd829 100644 --- a/Gems/AudioSystem/Code/Source/Editor/QTreeWidgetFilter.cpp +++ b/Gems/AudioSystem/Code/Source/Editor/QTreeWidgetFilter.cpp @@ -73,4 +73,4 @@ bool QTreeWidgetFilter::IsItemValid(QTreeWidgetItem* pItem) } } return true; -} \ No newline at end of file +} diff --git a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp index deb6362ee3..74bba48d3c 100644 --- a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp +++ b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp @@ -74,10 +74,7 @@ namespace Blast { if (m_chunkActors[chunkId]) { - auto transform = m_chunkActors[chunkId]->GetWorldBody()->GetTransform(); - // Multiply by scale because the transform on the world body does not store scale - transform.MultiplyByScale(m_scale); - m_meshFeatureProcessor->SetTransform(m_chunkMeshHandles[chunkId], transform); + m_meshFeatureProcessor->SetTransform(m_chunkMeshHandles[chunkId], m_chunkActors[chunkId]->GetWorldBody()->GetTransform(), m_scale); } } } diff --git a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp index 4036023397..6db4adbab3 100644 --- a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp +++ b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp @@ -98,7 +98,7 @@ namespace Blast // ActorRenderManager::OnActorCreated { EXPECT_CALL( - *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A<const AZ::Render::MaterialAssignmentMap&>(), _, _)) + *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A<const AZ::Render::MaterialAssignmentMap&>(), _, _, _)) .Times(aznumeric_cast<int>(m_actorFactory->m_mockActors[0]->GetChunkIndices().size())) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))); @@ -114,7 +114,7 @@ namespace Blast // ActorRenderManager::SyncMeshes { - EXPECT_CALL(*m_mockMeshFeatureProcessor, SetTransform(_, _)) + EXPECT_CALL(*m_mockMeshFeatureProcessor, SetTransform(_, _, _)) .Times(aznumeric_cast<int>(m_actorFactory->m_mockActors[0]->GetChunkIndices().size())); actorRenderManager->SyncMeshes(); } diff --git a/Gems/Blast/Editor/Scripts/bootstrap.py b/Gems/Blast/Editor/Scripts/bootstrap.py index 8614cb7d1d..3837383a89 100755 --- a/Gems/Blast/Editor/Scripts/bootstrap.py +++ b/Gems/Blast/Editor/Scripts/bootstrap.py @@ -9,5 +9,5 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ -# LYN-652 to re-enable the next line +# LYN-652 to re-enable once the Blast gem tests are stable # import asset_builder_blast diff --git a/Gems/Camera/Assets/Editor/Icons/Components/Camera.svg b/Gems/Camera/Assets/Editor/Icons/Components/Camera.svg index 84c70a5b2e..cfd94b793e 100644 --- a/Gems/Camera/Assets/Editor/Icons/Components/Camera.svg +++ b/Gems/Camera/Assets/Editor/Icons/Components/Camera.svg @@ -6,4 +6,4 @@ <g id="icon-/-Gameplay-/-Camera-/-Camera-" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M15.6176679,16.8558918 C15.6176679,17.1754334 15.3209507,17.7460435 14.6818674,17.7460435 C14.0427841,17.7460435 4.02287111,17.7802801 3.72615387,17.7802801 C3.23542921,17.7802801 2.72188014,17.3580286 2.72188014,16.6048233 C2.72188014,16.1939841 2.73712684,11.6215257 2.73712684,11.2563353 C2.73712684,10.6629008 2.74470454,10.3509369 3.31531462,10.3509369 C3.88592469,10.3509369 14.6932796,10.3281125 14.6932796,10.3281125 C15.4236605,10.3281125 15.6290801,10.8416615 15.6290801,11.2753252 C15.6290801,11.7089889 15.6176679,16.5363501 15.6176679,16.8558918 L15.6176679,16.8558918 Z M4.37664936,6.72185678 C4.37664936,6.52784935 4.37664936,6.33384193 4.53642018,6.33384193 L13.4265252,6.33384193 C13.643357,6.33384193 13.8944255,6.37949073 13.8944255,6.61914697 C13.8944255,6.8588032 13.8830133,8.59345784 13.8830133,8.59345784 L4.37281486,8.56305573 L4.37664936,6.72185678 Z M22.3965156,10.2139905 L21.6661347,10.2254027 L19.5434652,12.0855915 L18.9956796,12.0855915 C18.9956796,12.0855915 17.5805666,9.64338038 17.4207957,9.32383874 C17.2610249,9.00429709 16.7360636,8.63910664 16.4849952,8.63910664 L15.0698822,8.63910664 C15.0698822,8.63910664 15.0470578,6.28819312 15.0470578,5.87735387 C15.0470578,5.46651461 14.659043,5.14697297 14.1569061,5.14697297 L3.84027589,5.14697297 C3.37995333,5.14697297 3.13271939,5.4094536 3.13271939,5.72516075 L3.13271939,8.54780903 C2.71357205,8.55602581 2.62400909,8.55538673 2.37951409,8.55538673 C1.82415071,8.55538673 1.58065998,8.76080636 1.58065998,9.57490717 L1.58065998,17.5406239 C1.58065998,18.4650122 2.04856024,18.853027 2.75611674,18.853027 C3.2126048,18.853027 15.6404923,18.8416148 16.2795756,18.8416148 C16.9186589,18.8416148 17.1925517,18.2938292 17.4207957,17.9971119 C17.6490398,17.7003947 19.0641528,15.3723056 19.0641528,15.3723056 L19.703236,15.3494812 L21.7688445,17.2439066 L22.41934,17.2439066 L22.3965156,10.2139905 Z" id="Icon" fill="#65C98C"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Camera/Code/Source/Camera_precompiled.cpp b/Gems/Camera/Code/Source/Camera_precompiled.cpp index e167f193fd..a305cdc9df 100644 --- a/Gems/Camera/Code/Source/Camera_precompiled.cpp +++ b/Gems/Camera/Code/Source/Camera_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Camera_precompiled.h" \ No newline at end of file +#include "Camera_precompiled.h" diff --git a/Gems/Camera/Code/Source/Camera_precompiled.h b/Gems/Camera/Code/Source/Camera_precompiled.h index 028ff586c6..2016c4b411 100644 --- a/Gems/Camera/Code/Source/Camera_precompiled.h +++ b/Gems/Camera/Code/Source/Camera_precompiled.h @@ -26,7 +26,6 @@ // Editor ///////////////////////////////////////////////////////////////////////////// #include <EditorDefs.h> -#include <EditTool.h> #include <Resource.h> ///////////////////////////////////////////////////////////////////////////// diff --git a/Gems/CameraFramework/Assets/Editor/Icons/Components/CameraRig.svg b/Gems/CameraFramework/Assets/Editor/Icons/Components/CameraRig.svg index d300e90e39..ae51f32734 100644 --- a/Gems/CameraFramework/Assets/Editor/Icons/Components/CameraRig.svg +++ b/Gems/CameraFramework/Assets/Editor/Icons/Components/CameraRig.svg @@ -6,4 +6,4 @@ <g id="icon-/-Gameplay-/-Camera-/-Audio-Camera-Rig" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M9.64346007,12.6416559 L9.02013062,12.6416559 C8.63959991,12.6416559 8.34493635,12.2991287 8.34493635,12.0008481 L8.34493635,7.7553046 C8.34493635,7.34217112 8.67240087,7.03807528 8.94466861,7.03807528 L14.9844541,7.03807528 C15.2147049,7.03807528 15.7129623,7.22107515 15.7129623,7.64743802 L15.7129623,12.0008481 C15.7129623,12.3054213 15.4783017,12.6416559 15.1448418,12.6416559 L14.6122498,12.6416559 C14.6808654,12.7917221 14.7027183,12.9679695 14.7027183,13.0407078 L14.7027183,13.7014975 C14.7027183,13.8172722 14.5013413,14.2254873 14.1777273,14.2254873 L13.9784437,14.2254873 L13.9784437,14.6295771 L18.0064392,14.6295771 L18.0064392,16.0154946 L15.0102147,16.0154946 C14.6269992,16.5060809 14.3209847,17.0800732 14.1906471,17.1631422 C14.0603096,17.2462111 13.322787,17.1631422 13.0124385,17.1631422 L13.0124385,16.0154946 L11.0004914,16.0154946 L11.0004914,17.1631422 C10.7666947,17.1631422 9.836697,17.2462111 9.70635942,17.1631422 C9.57602185,17.0800732 9.36848323,16.5060809 8.9852677,16.0154946 L6.05145944,16.0154946 L6.0532798,14.6295771 L10.2772662,14.6295771 L10.2772662,14.2254873 L10.0779826,14.2254873 C9.75436861,14.2254873 9.5529916,13.8172722 9.5529916,13.7014975 L9.5529916,13.0407078 C9.5529916,12.9679695 9.57484447,12.7917221 9.64345343,12.6416559 L9.64346007,12.6416559 Z M11.2291196,12.6416559 C11.3432303,12.7703102 11.4450072,12.9492157 11.5344504,13.1783724 L12.7212595,13.1783724 C12.8107027,12.9492157 12.9124796,12.7703102 13.0265903,12.6416559 L11.2291196,12.6416559 L11.2291196,12.6416559 Z M10.9623121,14.6295771 L13.2933978,14.6295771 L13.2933978,14.2254873 L10.9623121,14.2254873 L10.9623121,14.6295771 Z M13.9223926,13.9233894 C14.1304257,13.9233894 14.2990697,13.7547453 14.2990697,13.5467123 C14.2990697,13.3386793 14.1304257,13.1700352 13.9223926,13.1700352 C13.7143596,13.1700352 13.5457156,13.3386793 13.5457156,13.5467123 C13.5457156,13.7547453 13.7143596,13.9233894 13.9223926,13.9233894 Z M10.3333173,13.9233894 C10.5413503,13.9233894 10.7099943,13.7547453 10.7099943,13.5467123 C10.7099943,13.3386793 10.5413503,13.1700352 10.3333173,13.1700352 C10.1252842,13.1700352 9.95664017,13.3386793 9.95664017,13.5467123 C9.95664017,13.7547453 10.1252842,13.9233894 10.3333173,13.9233894 Z M14.2250479,6.08787333 L14.2250479,6.30807976 L14.4133924,6.30807976 L14.4133924,6.81029398 L13.5196507,6.81029398 L13.5196507,6.30807976 L13.7143599,6.30807976 L13.7143599,6.08787333 L10.6541109,6.08787333 L10.6541109,6.30807976 L10.8532265,6.30807976 L10.8532265,6.81029398 L9.96648982,6.81029398 L9.96648982,6.30807976 L10.1405027,6.30807976 L10.1405027,6.08787333 L8.60270529,6.08787333 C7.83604021,4.15981799 7.36310884,2.99894999 7.1839112,2.60526933 C6.91511473,2.01474835 7.45270767,1.56574931 8.15756681,1.56574931 L16.6474298,1.56574931 C17.457721,1.56574931 17.322941,2.57456428 17.0521937,3.19579032 C16.8716955,3.60994101 16.4229662,4.57396868 15.706006,6.08787333 L14.2250479,6.08787333 Z M16.8771749,6.784686 C18.4157815,6.16660293 19.4703248,5.76792194 20.0408047,5.58864304 C20.8965245,5.31972468 21.2482745,6.07487804 21.2482745,6.50785676 L21.2482745,12.4351255 C21.2482745,12.7518194 20.9156037,13.0038302 20.5107526,13.0038302 C20.2408518,13.0038302 19.0296593,12.9049183 16.8771749,12.7070945 L16.8771749,11.8768653 L16.6449155,11.8768653 L16.6449155,12.1184316 L16.1590424,12.1184316 L16.1590424,11.1681431 L16.6449155,11.1681431 L16.6449155,11.3804444 L16.8771749,11.3804444 L16.8771749,8.95500863 L16.6449155,8.95500863 L16.6449155,9.17118776 L16.1590424,9.17118776 L16.1590424,8.12607206 L16.6449155,8.12607206 L16.6449155,8.33914888 L16.8771749,8.33914888 L16.8771749,6.784686 Z M7.18072373,6.784686 L7.18072373,8.33914888 L7.41298315,8.33914888 L7.41298315,8.12607206 L7.89885622,8.12607206 L7.89885622,9.17118776 L7.41298315,9.17118776 L7.41298315,8.95500863 L7.18072373,8.95500863 L7.18072373,11.3804444 L7.41298315,11.3804444 L7.41298315,11.1681431 L7.89885622,11.1681431 L7.89885622,12.1184316 L7.41298315,12.1184316 L7.41298315,11.8768653 L7.18072373,11.8768653 L7.18072373,12.7070945 C5.02823937,12.9049183 3.81704681,13.0038302 3.54714605,13.0038302 C3.14229492,13.0038302 2.80962415,12.7518194 2.80962415,12.4351255 L2.80962415,6.50785676 C2.80962415,6.07487804 3.16137411,5.31972468 4.01709394,5.58864304 C4.58757382,5.76792194 5.64211708,6.16660293 7.18072373,6.784686 Z M12.0289493,12.161295 C13.3110394,12.161295 14.3503787,11.1219556 14.3503787,9.83986558 C14.3503787,8.55777553 13.3110394,7.51843619 12.0289493,7.51843619 C10.7468593,7.51843619 9.70751992,8.55777553 9.70751992,9.83986558 C9.70751992,11.1219556 10.7468593,12.161295 12.0289493,12.161295 Z M5.60383389,16.8635886 L6.05145944,16.8635886 L6.05145944,21.9366067 L4.60121537,22.3580495 L3.12920428,21.9366067 L3.12920428,16.8635886 L3.65515253,16.8635886 L3.65333217,13.9872888 L5.60383389,13.9872888 L5.60383389,16.8635886 Z M20.4810688,16.8635886 L20.9286944,16.8635886 L20.9286944,21.9366067 L19.4784503,22.3580495 L18.0064392,21.9366067 L18.0064392,16.8635886 L18.5323874,16.8635886 L18.5305671,13.9872888 L20.4810688,13.9872888 L20.4810688,16.8635886 Z" id="Shape" fill="#65C98C"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraLookAtBehavior.h b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraLookAtBehavior.h index 4b8f99d1bc..91fa3cd4bd 100644 --- a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraLookAtBehavior.h +++ b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraLookAtBehavior.h @@ -30,4 +30,4 @@ namespace Camera /// Adjust the outLookAtTargetTransform based on the target's initial transform and the time that's passed since the last call virtual void AdjustLookAtTarget(float deltaTime, const AZ::Transform& targetTransform, AZ::Transform& outLookAtTargetTransform) = 0; }; -} //namespace LYGame \ No newline at end of file +} //namespace LYGame diff --git a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraSubComponent.h b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraSubComponent.h index 9c29596d0f..fbf46888c2 100644 --- a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraSubComponent.h +++ b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraSubComponent.h @@ -30,4 +30,4 @@ namespace Camera virtual void Activate(AZ::EntityId) = 0; virtual void Deactivate() = 0; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTargetAcquirer.h b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTargetAcquirer.h index 95e0e7c0b6..d18b31da82 100644 --- a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTargetAcquirer.h +++ b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTargetAcquirer.h @@ -31,4 +31,4 @@ namespace Camera /// Assign the transform of the desired target to outTransformInformation virtual bool AcquireTarget(AZ::Transform& outTransformInformation) = 0; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTransformBehavior.h b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTransformBehavior.h index 7e772f9d68..1ad85b1300 100644 --- a/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTransformBehavior.h +++ b/Gems/CameraFramework/Code/Include/CameraFramework/ICameraTransformBehavior.h @@ -32,4 +32,4 @@ namespace Camera /// Adjust the camera's final transform in outCameraTransform using the target's transform, the camera's initial transform and the time that's passed since the last call virtual void AdjustCameraTransform(float deltaTime, const AZ::Transform& initialCameraTransform, const AZ::Transform& targetTransform, AZ::Transform& outCameraTransform) = 0; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/CameraFramework/Code/Source/CameraFramework_precompiled.cpp b/Gems/CameraFramework/Code/Source/CameraFramework_precompiled.cpp index f9d8dbdda1..e5c5926821 100644 --- a/Gems/CameraFramework/Code/Source/CameraFramework_precompiled.cpp +++ b/Gems/CameraFramework/Code/Source/CameraFramework_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "CameraFramework_precompiled.h" \ No newline at end of file +#include "CameraFramework_precompiled.h" diff --git a/Gems/CameraFramework/Code/Source/CameraRigComponent.cpp b/Gems/CameraFramework/Code/Source/CameraRigComponent.cpp index 704c428c58..6a17d9aca8 100644 --- a/Gems/CameraFramework/Code/Source/CameraRigComponent.cpp +++ b/Gems/CameraFramework/Code/Source/CameraRigComponent.cpp @@ -190,4 +190,4 @@ namespace Camera // Step 4 Alert the camera component of the new desired transform EBUS_EVENT_ID(GetEntityId(), AZ::TransformBus, SetWorldTM, finalTransform); } -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/CameraFramework/Code/Source/CameraRigComponent.h b/Gems/CameraFramework/Code/Source/CameraRigComponent.h index 431c8a051b..1c06de1500 100644 --- a/Gems/CameraFramework/Code/Source/CameraRigComponent.h +++ b/Gems/CameraFramework/Code/Source/CameraRigComponent.h @@ -57,4 +57,4 @@ namespace Camera AZStd::vector<ICameraTransformBehavior*> m_transformBehaviors; AZ::Transform m_initialTransform; }; -} // Camera \ No newline at end of file +} // Camera diff --git a/Gems/CertificateManager/Assets/CertificateManager_Dependencies.xml b/Gems/CertificateManager/Assets/CertificateManager_Dependencies.xml index 3aaf9378eb..6e813226ea 100644 --- a/Gems/CertificateManager/Assets/CertificateManager_Dependencies.xml +++ b/Gems/CertificateManager/Assets/CertificateManager_Dependencies.xml @@ -1,3 +1,3 @@ <EngineDependencies versionnumber="1.0.0"> <Dependency path="certificates/*" optional="false" /> -</EngineDependencies> \ No newline at end of file +</EngineDependencies> diff --git a/Gems/CertificateManager/Code/Include/CertificateManager/DataSource/FileDataSourceBus.h b/Gems/CertificateManager/Code/Include/CertificateManager/DataSource/FileDataSourceBus.h index 323196123e..b5a3087941 100644 --- a/Gems/CertificateManager/Code/Include/CertificateManager/DataSource/FileDataSourceBus.h +++ b/Gems/CertificateManager/Code/Include/CertificateManager/DataSource/FileDataSourceBus.h @@ -52,4 +52,4 @@ namespace CertificateManager using FileDataSourceConfigurationBus = AZ::EBus<FileDataSourceConfigurationRequest>; } -#endif \ No newline at end of file +#endif diff --git a/Gems/CertificateManager/Code/Source/DataSource/FileDataSource.h b/Gems/CertificateManager/Code/Source/DataSource/FileDataSource.h index c9b2966d9e..023af16149 100644 --- a/Gems/CertificateManager/Code/Source/DataSource/FileDataSource.h +++ b/Gems/CertificateManager/Code/Source/DataSource/FileDataSource.h @@ -56,4 +56,4 @@ namespace CertificateManager }; } //namespace CertificateManager -#endif \ No newline at end of file +#endif diff --git a/Gems/CrashReporting/Code/CMakeLists.txt b/Gems/CrashReporting/Code/CMakeLists.txt index dbb78849fb..d52600ea9b 100644 --- a/Gems/CrashReporting/Code/CMakeLists.txt +++ b/Gems/CrashReporting/Code/CMakeLists.txt @@ -30,9 +30,7 @@ ly_add_target( Include BUILD_DEPENDENCIES PRIVATE - AZ::AzCore AZ::CrashHandler - AZ::CrashSupport ) ly_add_target( @@ -46,10 +44,5 @@ ly_add_target( Include BUILD_DEPENDENCIES PRIVATE - #3rdParty::Crashpad - #3rdParty::Crashpad::Handler - AZ::AzCore AZ::CrashUploaderSupport - #AZ::CrashHandler - AZ::CrashSupport ) diff --git a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h index 7ea3ce3b2f..8a1d4b3088 100644 --- a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h +++ b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h @@ -36,4 +36,4 @@ namespace CrashHandler }; -} \ No newline at end of file +} diff --git a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h index aeeb9b3f6f..3625350274 100644 --- a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h +++ b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h @@ -25,4 +25,4 @@ namespace O3de static std::string GetRootFolder(); }; -} \ No newline at end of file +} diff --git a/Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp b/Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp index 5876e67c30..3047eb64e4 100644 --- a/Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp +++ b/Gems/CrashReporting/Code/Platform/Common/UnixLike/GameCrashUploader_UnixLike.cpp @@ -21,4 +21,4 @@ namespace Lumberyard { return true; } -} \ No newline at end of file +} diff --git a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp index 0a1dd366e6..545dc7d2f9 100644 --- a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp +++ b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp @@ -443,9 +443,12 @@ namespace DebugDraw AZ::TransformBus::EventResult(sphereElement.m_worldLocation, sphereElement.m_targetEntityId, &AZ::TransformBus::Events::GetWorldTranslation); } - ColorB lyColor(sphereElement.m_color.ToU32()); - Vec3 worldLocation(AZVec3ToLYVec3(sphereElement.m_worldLocation)); - gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(worldLocation, sphereElement.m_radius, lyColor, true); + if (gEnv->pRenderer) + { + ColorB lyColor(sphereElement.m_color.ToU32()); + Vec3 worldLocation(AZVec3ToLYVec3(sphereElement.m_worldLocation)); + gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(worldLocation, sphereElement.m_radius, lyColor, true); + } } removeExpiredDebugElementsFromVector(m_activeSpheres); diff --git a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h index 8fd97eef8d..32efa4cfc2 100644 --- a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h +++ b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h @@ -157,4 +157,4 @@ namespace DebugDraw AZStd::vector<Vec3> m_batchPoints; AZStd::vector<ColorB> m_batchColors; }; -} \ No newline at end of file +} diff --git a/Gems/DebugDraw/Code/Source/DebugDrawTextComponent.h b/Gems/DebugDraw/Code/Source/DebugDrawTextComponent.h index 053ab65101..60ca719ad9 100644 --- a/Gems/DebugDraw/Code/Source/DebugDrawTextComponent.h +++ b/Gems/DebugDraw/Code/Source/DebugDrawTextComponent.h @@ -73,4 +73,4 @@ namespace DebugDraw protected: DebugDrawTextElement m_element; }; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Actor_16.svg b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Actor_16.svg index 556a532181..710c9a7818 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Actor_16.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Actor_16.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M15,9 L15,22 L13,22 L13,16 L11,16 L11,22 L9,22 L9,9 L4,9 L4,7 L20,7 L20,9 L15,9 Z M12,6 C10.8954305,6 10,5.1045695 10,4 C10,2.8954305 10.8954305,2 12,2 C13.1045695,2 14,2.8954305 14,4 C14,5.1045695 13.1045695,6 12,6 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Animgraph_16.svg b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Animgraph_16.svg index da2b582b38..9158559122 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Animgraph_16.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Animgraph_16.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M3,21 L3,19 L6,19 L6,17 L3,17 L3,7 L6,7 L6,5 L3,5 L3,3 L21,3 L21,5 L18,5 L18,7 L21,7 L21,17 L18,17 L18,19 L21,19 L21,21 L3,21 Z M11,17 L8,17 L8,19 L11,19 L11,17 Z M16,17 L13,17 L13,19 L16,19 L16,17 Z M9,9 L9,15 L15,12 L9,9 Z M11,5 L8,5 L8,7 L11,7 L11,5 Z M16,5 L13,5 L13,7 L16,7 L16,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/MotionSet_16.svg b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/MotionSet_16.svg index d95c5355bf..46e7f330fa 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/MotionSet_16.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/MotionSet_16.svg @@ -8,4 +8,4 @@ <rect id="Rectangle-23" fill="#FFFFFF" fill-rule="nonzero" x="4" y="7" width="16" height="2"></rect> <rect id="Rectangle-23" fill="#FFFFFF" fill-rule="nonzero" x="5" y="3" width="14" height="2"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Motion_16.svg b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Motion_16.svg index bd003bc952..6529e59fe8 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Motion_16.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/AssetBrowser/Motion_16.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M14.305803,6.47369367 C14.6993916,6.6892261 15.0165548,7.03456112 15.1933492,7.4597408 L17.5370596,10.7388937 L19.7921887,13.1099302 L18.4539274,14.5962199 L15.9723802,11.9890965 L15.954824,12 L15.8519674,11.8625904 L15.6374341,11.6372009 L15.6640685,11.6115701 L14.6333027,10.2345359 L13.1304978,13.609891 L15.8553007,16 L15.8655889,16 L15.8655889,22 L13.8655889,22 L13.8655889,16.9335637 L10.9173755,14.4145916 L10.6541721,14.2974059 L9.2787337,17.3866912 L8.50557994,19.1359308 L2.86558888,15.6954658 L3.92542741,13.9993696 L7.607861,16.2223461 L8.82708121,13.4839327 L8.81118422,13.4768549 L10.9142284,8.75334034 L9.33753914,9.12452852 L7.74923941,12.0950967 L6,11.1254774 L8.00970689,7.42096143 L8,7.3871095 L13.0613105,6.24191249 L13.0627046,6.24907236 L13.1028472,6.24373869 L13.1028472,6.24373869 C13.5346882,6.19071527 13.9512538,6.27953958 14.305803,6.47369367 Z M15,2 C16.1045695,2 17,2.8954305 17,4 C17,5.1045695 16.1045695,6 15,6 C13.8954305,6 13,5.1045695 13,4 C13,2.8954305 13.8954305,2 15,2 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/ActorComponent.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/ActorComponent.svg index 9a861ec26c..2164eaebcf 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/ActorComponent.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/ActorComponent.svg @@ -12,4 +12,4 @@ </mask> <use id="Combined-Shape" fill="#5AA9D2" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignBottom.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignBottom.svg index 82511b6df0..da7105b335 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignBottom.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignBottom.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M21,19 L21,21 L3,21 L3,19 L21,19 Z M18,7 L18,17 L14,17 L14,7 L18,7 Z M10,3 L10,17 L6,17 L6,3 L10,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignLeft.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignLeft.svg index 1c76cd07c3..c4c6db47e8 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignLeft.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignLeft.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M5,3 L5,21 L3,21 L3,3 L5,3 Z M21,14 L21,18 L7,18 L7,14 L21,14 Z M17,6 L17,10 L7,10 L7,6 L17,6 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignRight.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignRight.svg index 7f17da82b9..6a3f7cb8c7 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignRight.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignRight.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M21,3 L21,21 L19,21 L19,3 L21,3 Z M17,14 L17,18 L3,18 L3,14 L17,14 Z M17,6 L17,10 L7,10 L7,6 L17,6 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignTop.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignTop.svg index 69da3eb625..216ccf0005 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignTop.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/AlignTop.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M10,7 L10,21 L6,21 L6,7 L10,7 Z M18,7 L18,17 L14,17 L14,7 L18,7 Z M21,3 L21,5 L3,5 L3,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/AnimGraphComponent.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/AnimGraphComponent.svg index 719f95b282..15e3aa2d11 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/AnimGraphComponent.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/AnimGraphComponent.svg @@ -12,4 +12,4 @@ </mask> <use id="Shape" fill="#5AA9D2" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Backward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Backward.svg index c51073d566..9ba17eca65 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Backward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Backward.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" points="7.02553943 13 12 18.0361734 12 21 3 12 12 3 12 5.98884985 7 11 21 11 21 13"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Bone.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Bone.svg index 53d68e79a5..d02d121958 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Bone.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Bone.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M17,3 C18.1045695,3 19,3.8954305 19,5 C20.1045695,5 21,5.8954305 21,7 C21,8.1045695 20.1045695,9 19,9 C18.4772492,9 18.0013407,8.79944421 17.6450213,8.47107937 L8.47107937,17.6450213 C8.79944421,18.0013407 9,18.4772492 9,19 C9,20.1045695 8.1045695,21 7,21 C5.8954305,21 5,20.1045695 5,19 L5,19 L4.85073766,18.9945143 C3.81587779,18.9181651 3,18.0543618 3,17 C3,15.8954305 3.8954305,15 5,15 C5.51979741,15 5.9932803,15.198296 6.34892797,15.5233674 L15.5233674,6.34892797 C15.198296,5.9932803 15,5.51979741 15,5 C15,3.8954305 15.8954305,3 17,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Character.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Character.svg index 556a532181..710c9a7818 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Character.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Character.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M15,9 L15,22 L13,22 L13,16 L11,16 L11,22 L9,22 L9,9 L4,9 L4,7 L20,7 L20,9 L15,9 Z M12,6 C10.8954305,6 10,5.1045695 10,4 C10,2.8954305 10.8954305,2 12,2 C13.1045695,2 14,2.8954305 14,4 C14,5.1045695 13.1045695,6 12,6 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Clear.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Clear.svg index 592cc64a13..cfdc13f9e6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Clear.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Clear.svg @@ -8,4 +8,4 @@ <path d="M19,9 L19,22 L5,22 L5,9 L19,9 Z M10,11 L8,11 L8,20 L10,20 L10,11 Z M16,11 L14,11 L14,20 L16,20 L16,11 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M8,3 L16,3 L16,5 L21,5 L21,7 L3,7 L3,5 L8,5 L8,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Cloth.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Cloth.svg index 04e9d594f6..d19fad50ae 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Cloth.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Cloth.svg @@ -6,4 +6,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M16.9852149,4 L16.9900183,3.9950022 L16.9951083,4 L22,8.91421356 L19.4142136,11.5 L17,9.08578644 L17,20 L7,20 L7,9.08578644 L4.58578644,11.5 L2,8.91421356 L6.99472957,3.99407993 L7.0004522,4 L9.55000906,4 C9.51721513,4.16155497 9.5,4.32876708 9.5,4.5 C9.5,5.88071187 10.6192881,7 12,7 C13.3807119,7 14.5,5.88071187 14.5,4.5 C14.5,4.32876708 14.4827849,4.16155497 14.4499909,4 L16.9852149,4 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Collider.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Collider.svg index 2095ed8909..7bea85afcc 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Collider.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Collider.svg @@ -9,4 +9,4 @@ <path d="M13.1607746,19.9125407 L13.4277364,21.8988496 C12.9614267,21.9655098 12.4847411,22 12,22 C11.5152589,22 11.0385733,21.9655098 10.5722636,21.8988496 L10.8383137,19.9195317 C11.2097656,19.9725628 11.5894692,20 11.975581,20 C12.3783147,20 12.7740765,19.9701497 13.1607746,19.9125407 Z M9.33309696,19.5518252 L8.64013164,21.4215598 C7.73067722,21.097208 6.88197211,20.6449104 6.11568712,20.0863379 L7.27641932,18.4693068 C7.89959618,18.9244609 8.59127639,19.2914214 9.33309696,19.5518252 Z M16.7070306,18.4456003 L17.8843129,20.0863379 C17.1180279,20.6449104 16.2693228,21.097208 15.3598684,21.4215598 L14.6611298,19.5365683 C15.3994668,19.2725903 16.0875167,18.9028513 16.7070306,18.4456003 Z M19.136413,15.5402284 L20.9449276,16.4757101 C20.5259597,17.3114074 19.9933241,18.0802486 19.3672992,18.7619554 L17.8539722,17.4147018 C18.3655692,16.8570767 18.7988579,16.2264438 19.136413,15.5402284 Z M6.11955954,17.4389836 L4.63270084,18.7619554 C4.00667589,18.0802486 3.47404026,17.3114074 3.05507245,16.4757101 L4.82468892,15.5603633 C5.16573028,16.2487461 5.6032455,16.8808446 6.11955954,17.4389836 Z M2.00233104,11.7819136 L4.00296119,11.8049537 C4.00099128,11.8778688 4,11.9510281 4,12.024419 C4,12.746747 4.09602458,13.4466473 4.27600481,14.1120509 L2.3458237,14.6166472 C2.12031334,13.7826097 2,12.9053552 2,12 C2,11.9271198 2.00077964,11.8544217 2.00233104,11.7819136 Z M21.997,11.781838 L22,12 C22,12.9053552 21.8796867,13.7826097 21.6541763,14.6166472 L19.6783894,14.100064 C19.8562869,13.4382435 19.951162,12.7424109 19.951162,12.024419 L19.947,11.804838 L21.997,11.781838 Z M20.7406155,7.13811746 C21.2004923,7.96310941 21.546956,8.85996419 21.7589222,9.80759734 L19.7600141,10.2808906 C19.5892411,9.51507674 19.308349,8.79078455 18.9348194,8.12549542 Z M3.25938449,7.13811746 L5.0277097,8.10531853 C4.65031089,8.77294321 4.36635876,9.50037891 4.19361509,10.2698638 L2.24107782,9.80759734 C2.45304402,8.85996419 2.79950773,7.96310941 3.25938449,7.13811746 Z M17.5253214,3.66378461 C18.3013824,4.17919666 19.001332,4.80008536 19.604712,5.50599263 L18.0588119,6.86624006 C17.5687769,6.28889611 16.99802,5.78221727 16.3639789,5.36364109 Z M6.47467856,3.66378461 L7.62034128,5.34186903 C6.98217704,5.75863132 6.40737549,6.26433572 5.91353299,6.84138587 L4.39528799,5.50599263 C4.99866805,4.80008536 5.6986176,4.17919666 6.47467856,3.66378461 Z M12.9961055,2.04898934 C13.9670562,2.14500901 14.8971877,2.37990421 15.766361,2.73353598 L15.0080096,4.64555081 C14.3061207,4.35679187 13.5539699,4.16526555 12.7683267,4.08774124 Z M11.0048934,2.0488906 L11.2311007,4.08312606 C10.4436255,4.15602168 9.68933925,4.34339855 8.98504117,4.62845734 L8.23363905,2.73353598 C9.10311041,2.37978294 10.0335818,2.14484792 11.0048934,2.0488906 Z" id="Combined-Shape" fill="#FFFFFF"></path> <polygon id="Polygon" fill="#FFFFFF" points="12 6 17.1961524 9 17.1961524 15 12 18 6.80384758 15 6.80384758 9"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Confirm.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Confirm.svg index b21d8456dc..7f805aaca4 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Confirm.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Confirm.svg @@ -7,4 +7,4 @@ <circle id="Oval" cx="11.9999995" cy="12" r="10"></circle> <path d="M12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 Z M18.1421356,6 L8.94974747,15.1923882 L5.41421356,11.6568542 L4,13.0710678 L8.94974747,18.0208153 L19.5563492,7.41421356 L18.1421356,6 Z" id="Combined-Shape" fill="#58BC61"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Copy.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Copy.svg index ef9c3573bf..99a84b7102 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Copy.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Copy.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M18,6 L18,21 L3,21 L3,6 L18,6 Z M11.5,8 L9.5,8 L9.5,12.5 L5,12.5 L5,14.5 L9.5,14.5 L9.5,19 L11.5,19 L11.5,14.5 L16,14.5 L16,12.5 L11.5,12.5 L11.5,8 Z M21,3 L21,18 L19.5,18 L19.5,4.5 L6,4.5 L6,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Cut.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Cut.svg index c01e8700b5..39e776404d 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Cut.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Cut.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M7,3 C9.209139,3 11,4.790861 11,7 C11,7.5541228 10.8873249,8.08192892 10.6836362,8.56175692 L11.999,9.878 L16.863961,5.01471863 C17.988671,3.89000867 19.7842339,3.84502027 20.9626121,4.87975343 L21.1066017,5.01471863 L10.6836362,15.4382431 C10.8873249,15.9180711 11,16.4458772 11,17 C11,19.209139 9.209139,21 7,21 C4.790861,21 3,19.209139 3,17 C3,14.790861 4.790861,13 7,13 C7.5541228,13 8.08192892,13.1126751 8.56175692,13.3163638 L9.878,11.999 L8.56175692,10.6836362 C8.08192892,10.8873249 7.5541228,11 7,11 C4.790861,11 3,9.209139 3,7 C3,4.790861 4.790861,3 7,3 Z M15.2071068,13.0857864 L21.5710678,19.4497475 C20.4463579,20.5744574 18.6507949,20.6194458 17.4724167,19.5847127 L17.3284271,19.4497475 L13.0857864,15.2071068 L15.2071068,13.0857864 Z M7,15 C5.8954305,15 5,15.8954305 5,17 C5,18.1045695 5.8954305,19 7,19 C8.1045695,19 9,18.1045695 9,17 C9,15.8954305 8.1045695,15 7,15 Z M7,5 C5.8954305,5 5,5.8954305 5,7 C5,8.1045695 5.8954305,9 7,9 C8.1045695,9 9,8.1045695 9,7 C9,5.8954305 8.1045695,5 7,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/DownArrow.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/DownArrow.svg index 349bf08c3f..1cfd06274f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/DownArrow.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/DownArrow.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" transform="translate(12.000000, 12.000000) rotate(90.000000) translate(-12.000000, -12.000000) " points="17 11 12 6 12 3 21 12 12 21 12 18 17 13 3 13 3 11"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Edit.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Edit.svg index 0fdb44ee6a..27ef1ad3e2 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Edit.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Edit.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M13.6551662,3 L14.1498069,5.3363112 C14.4715685,5.44003769 14.7831566,5.56642171 15.0826914,5.71358345 L17.4093168,4.1808897 L19.7665733,6.53814621 L18.2567266,8.85760039 C18.4152378,9.17258904 18.5506624,9.50119168 18.6607786,9.84118656 L21,10.3215021 L21,13.6551662 L18.6636888,14.1498069 C18.5562839,14.4829789 18.4245861,14.805243 18.2706822,15.1145124 L19.7830713,17.4093168 L17.4258148,19.7665733 L15.1224534,18.2667241 C14.8107607,18.4223291 14.4858315,18.5553643 14.1498069,18.6636888 L13.6551662,21 L10.3215021,21 L9.84118656,18.6607786 C9.49319486,18.5480724 9.1571376,18.4088534 8.83539702,18.2455035 L6.65464421,19.6830713 L4.29738769,17.3258148 L5.73278058,15.121461 C5.57738859,14.810071 5.44452072,14.4854749 5.3363112,14.1498069 L3,13.6551662 L3,10.3215021 L5.33922143,9.84118656 C5.44482243,9.51513266 5.57369895,9.19955591 5.72389149,8.89641581 L4.1808897,6.55464421 L6.53814621,4.19738769 L8.88846697,5.72783609 C9.19403809,5.57595444 9.51228174,5.44574577 9.84118656,5.33922143 L10.3215021,3 L13.6551662,3 Z M12,8 C9.790861,8 8,9.790861 8,12 C8,14.209139 9.790861,16 12,16 C14.209139,16 16,14.209139 16,12 C16,9.790861 14.209139,8 12,8 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/ExclamationMark.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/ExclamationMark.svg index d73a098801..d09fca37cd 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/ExclamationMark.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/ExclamationMark.svg @@ -8,4 +8,4 @@ <polygon id="Triangle" points="12 2 22 22 2 22"></polygon> <path d="M12,2 L22,22 L2,22 L12,2 Z M13,18 L11,18 L11,20 L13,20 L13,18 Z M13,7 L11,7 L11,16.0862485 L13,16.0862485 L13,7 Z" id="Combined-Shape" fill="#F0C32D"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Forward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Forward.svg index cbbb6c63f6..1dcb81e510 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Forward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Forward.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" points="17 11 12 6 12 3 21 12 12 21 12 18 17 13 3 13 3 11"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Gamepad.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Gamepad.svg index a7304115a6..2139627ac4 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Gamepad.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Gamepad.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M17,7 C19.7614237,7 22,9.46243388 22,12.5 C22,15.5375661 19.7614237,18 17,18 C15.0572444,18 13.3732775,16.7811934 12.5455525,15.0007788 L11.4544475,15.0007788 C10.6267225,16.7811934 8.94275558,18 7,18 C4.23857625,18 2,15.5375661 2,12.5 C2,9.53837303 4.12804655,7.12348115 6.79390037,7.00458757 L7,7 L17,7 Z M16.5,13 C15.6715729,13 15,13.6715729 15,14.5 C15,15.3284271 15.6715729,16 16.5,16 C17.3284271,16 18,15.3284271 18,14.5 C18,13.6715729 17.3284271,13 16.5,13 Z M7.5,9.5 L6,9.5 L6,11.75 L3.75,11.75 L3.75,13.25 L6,13.25 L6,15.5 L7.5,15.5 L7.5,13.25 L9.75,13.25 L9.75,11.75 L7.5,11.75 L7.5,9.5 Z M18.5,9.5 C17.6715729,9.5 17,10.1715729 17,11 C17,11.8284271 17.6715729,12.5 18.5,12.5 C19.3284271,12.5 20,11.8284271 20,11 C20,10.1715729 19.3284271,9.5 18.5,9.5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/HitDetection.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/HitDetection.svg index 7e43050d39..58056c2819 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/HitDetection.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/HitDetection.svg @@ -9,4 +9,4 @@ <polygon id="Rectangle-29" fill="#FFFFFF" transform="translate(17.045050, 7.995390) rotate(45.000000) translate(-17.045050, -7.995390) " points="16.1938033 4.4949714 17.8081016 4.51420795 17.8962973 11.4958096 16.1938033 11.450495"></polygon> <polygon id="Rectangle-29" fill="#FFFFFF" transform="translate(7.108926, 7.934776) scale(-1, 1) rotate(45.000000) translate(-7.108926, -7.934776) " points="6.23206854 4.36834016 7.96339486 4.36903818 7.9857837 11.4273238 6.23206854 11.5012127"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/InPlace.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/InPlace.svg index 75407aba74..c142f3f39e 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/InPlace.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/InPlace.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M12,2 C14.7614237,2 17,4.23857625 17,7 L17,11 L20,11 L20,22 L4,22 L4,11 L7,11 L7,7 C7,4.23857625 9.23857625,2 12,2 Z M13,15 L11,15 L11,18 L13,18 L13,15 Z M12,4 C10.3431458,4 9,5.34314575 9,7 L9,7 L9,11 L15,11 L15,7 C15,5.34314575 13.6568542,4 12,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Joint.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Joint.svg index 53d68e79a5..d02d121958 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Joint.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Joint.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M17,3 C18.1045695,3 19,3.8954305 19,5 C20.1045695,5 21,5.8954305 21,7 C21,8.1045695 20.1045695,9 19,9 C18.4772492,9 18.0013407,8.79944421 17.6450213,8.47107937 L8.47107937,17.6450213 C8.79944421,18.0013407 9,18.4772492 9,19 C9,20.1045695 8.1045695,21 7,21 C5.8954305,21 5,20.1045695 5,19 L5,19 L4.85073766,18.9945143 C3.81587779,18.9181651 3,18.0543618 3,17 C3,15.8954305 3.8954305,15 5,15 C5.51979741,15 5.9932803,15.198296 6.34892797,15.5233674 L15.5233674,6.34892797 C15.198296,5.9932803 15,5.51979741 15,5 C15,3.8954305 15.8954305,3 17,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/List.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/List.svg index 114e7caf71..580c651bfe 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/List.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/List.svg @@ -12,4 +12,4 @@ <rect id="Rectangle-11" fill="#FFFFFF" x="9" y="18" width="12" height="3"></rect> <rect id="Rectangle-11" fill="#FFFFFF" x="3" y="18" width="4" height="3"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/LockDisabled.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/LockDisabled.svg index f1717274ce..c47e8e9646 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/LockDisabled.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/LockDisabled.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M12,2 C14.7614237,2 17,4.23857625 17,7 L16.999,11 L20,11 L20,22 L4,22 L4,11 L14.999,11 L15,7 C15,5.34314575 13.6568542,4 12,4 C11.3744378,4 10.4706871,4.17592409 9.72670164,4.86313025 C9.52882667,5.04590385 9.32735259,5.43064531 9.1222794,6.01735463 L7.02553943,6.01735463 C7.10063842,5.67498213 7.16481201,5.43351589 7.21806022,5.2929559 C7.34121748,4.96785608 7.66430989,4.390511 7.76702757,4.24874942 C9.16936152,2.31337571 10.6259637,2 12,2 Z M18,13 L6,13 L6,20 L18,20 L18,13 Z M13,15 L13,18 L11,18 L11,15 L13,15 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/LockEnabled.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/LockEnabled.svg index 75407aba74..c142f3f39e 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/LockEnabled.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/LockEnabled.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M12,2 C14.7614237,2 17,4.23857625 17,7 L17,11 L20,11 L20,22 L4,22 L4,11 L7,11 L7,7 C7,4.23857625 9.23857625,2 12,2 Z M13,15 L11,15 L11,18 L13,18 L13,15 Z M12,4 C10.3431458,4 9,5.34314575 9,7 L9,7 L9,11 L15,11 L15,7 C15,5.34314575 13.6568542,4 12,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Loop.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Loop.svg index 61f953714e..37e6963a82 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Loop.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Loop.svg @@ -7,4 +7,4 @@ <rect id="Path" fill-opacity="0" fill="#E9E9E9" x="0" y="0" width="24" height="24"></rect> <path d="M20,8.5 L20,19.5 L9,19.5 L9,22 L5,18.5 L9,15 L9,17.313 L17.5549246,17.313982 L17.5549246,10.5709643 L20,8.5 Z M15,2 L19,5.5 L15,9 L15,7.014 L6.51965221,7.01409023 L6.51965221,13.2866309 L4,15.5 L4,4.5 L15,4.5 L15,2 Z" id="Combined-Shape" fill="#FFFFFF" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Mesh.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Mesh.svg index 6aeba501a5..b990e9f32d 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Mesh.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Mesh.svg @@ -11,4 +11,4 @@ <path d="M10.25,0 C4.56590909,0 0,4.45454545 0,10 C0,15.5454545 4.56590909,20 10.25,20 C15.9340909,20 20.5,15.5454545 20.5,10 C20.5,4.45454545 15.9340909,0 10.25,0 Z M17.7977273,6.36363636 L14.6295455,6.36363636 C14.35,4.90909091 13.9772727,3.45454545 13.4181818,2.36363636 C15.2818182,3.18181818 16.8659091,4.54545455 17.7977273,6.36363636 Z M13.0454545,10 C13.0454545,10.6363636 13.0454545,11.2727273 12.9522727,11.8181818 L7.54772727,11.8181818 C7.45454545,11.2727273 7.45454545,10.6363636 7.45454545,10 C7.45454545,9.36363636 7.45454545,8.72727273 7.54772727,8.18181818 L12.9522727,8.18181818 C13.0454545,8.72727273 13.0454545,9.36363636 13.0454545,10 Z M10.25,18.1818182 C9.41136364,18.1818182 8.29318182,16.4545455 7.73409091,13.6363636 L12.6727273,13.6363636 C12.2068182,16.4545455 11.0886364,18.1818182 10.25,18.1818182 Z M7.73409091,6.36363636 C8.29318182,3.54545455 9.41136364,1.81818182 10.25,1.81818182 C11.0886364,1.81818182 12.2068182,3.54545455 12.7659091,6.36363636 L7.73409091,6.36363636 Z M7.175,2.36363636 C6.61590909,3.45454545 6.15,4.90909091 5.87045455,6.36363636 L2.70227273,6.36363636 C3.63409091,4.54545455 5.21818182,3.18181818 7.175,2.36363636 Z M2.05,8.18181818 L5.59090909,8.18181818 C5.59090909,8.81818182 5.59090909,9.36363636 5.59090909,10 C5.59090909,10.6363636 5.59090909,11.1818182 5.68409091,11.8181818 L2.05,11.8181818 C1.95681818,11.2727273 1.86363636,10.6363636 1.86363636,10 C1.86363636,9.36363636 1.95681818,8.72727273 2.05,8.18181818 Z M2.70227273,13.6363636 L5.87045455,13.6363636 C6.15,15.0909091 6.52272727,16.5454545 7.08181818,17.6363636 C5.21818182,16.8181818 3.63409091,15.4545455 2.70227273,13.6363636 Z M13.325,17.6363636 C13.8840909,16.5454545 14.35,15.1818182 14.5363636,13.6363636 L17.7045455,13.6363636 C16.8659091,15.4545455 15.2818182,16.8181818 13.325,17.6363636 Z M18.45,11.8181818 L14.9090909,11.8181818 C15.0022727,11.1818182 15.0022727,10.6363636 15.0022727,10 C15.0022727,9.36363636 15.0022727,8.81818182 14.9090909,8.18181818 L18.45,8.18181818 C18.5431818,8.72727273 18.6363636,9.36363636 18.6363636,10 C18.6363636,10.6363636 18.5431818,11.2727273 18.45,11.8181818 Z" id="Shape"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Minus.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Minus.svg index 592cc64a13..cfdc13f9e6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Minus.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Minus.svg @@ -8,4 +8,4 @@ <path d="M19,9 L19,22 L5,22 L5,9 L19,9 Z M10,11 L8,11 L8,20 L10,20 L10,11 Z M16,11 L14,11 L14,20 L16,20 L16,11 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M8,3 L16,3 L16,5 L21,5 L21,7 L3,7 L3,5 L8,5 L8,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Mirror.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Mirror.svg index 0053959169..54fd3781a4 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Mirror.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Mirror.svg @@ -9,4 +9,4 @@ <polygon id="Triangle" fill="#FFFFFF" transform="translate(6.000000, 12.000000) rotate(90.000000) translate(-6.000000, -12.000000) " points="6 8 12 16 0 16"></polygon> <polygon id="Triangle" fill="#FFFFFF" transform="translate(18.000000, 12.000000) scale(-1, 1) rotate(90.000000) translate(-18.000000, -12.000000) " points="18 8 24 16 12 16"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/MotionSet.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/MotionSet.svg index d95c5355bf..46e7f330fa 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/MotionSet.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/MotionSet.svg @@ -8,4 +8,4 @@ <rect id="Rectangle-23" fill="#FFFFFF" fill-rule="nonzero" x="4" y="7" width="16" height="2"></rect> <rect id="Rectangle-23" fill="#FFFFFF" fill-rule="nonzero" x="5" y="3" width="14" height="2"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveBackward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveBackward.svg index 4aa8e9863d..0dc3b3e07a 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveBackward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveBackward.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M11.222,17 L4,17 L4,13 L11.222,13 L11.2222222,5.77777778 L7.33333333,10.5 L5,10.5 L12,2 L19,10.5 L16.6666667,10.5 L12.7777778,5.77777778 L12.777,13 L20,13 L20,17 L12.777,17 L12.7777778,19 L20,19 L20,22 L4,22 L4,19 L11.2222222,19 L11.222,17 Z M11.222,14 L5,14 L5,16 L11.222,16 L11.222,14 Z M19,14 L12.777,14 L12.777,16 L19,16 L19,14 Z" id="Combined-Shape" fill="#FFFFFF" transform="translate(12.000000, 12.000000) scale(1, -1) translate(-12.000000, -12.000000) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveForward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveForward.svg index 93ef455b28..62b7c03210 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveForward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/MoveForward.svg @@ -9,4 +9,4 @@ <path d="M20,13 L20,17 L4,17 L4,13 L20,13 Z M19,14 L5,14 L5,16 L19,16 L19,14 Z" id="Combined-Shape" fill="#FFFFFF"></path> <rect id="Rectangle" fill="#FFFFFF" x="4" y="19" width="16" height="3"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Node.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Node.svg index 53d68e79a5..d02d121958 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Node.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Node.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M17,3 C18.1045695,3 19,3.8954305 19,5 C20.1045695,5 21,5.8954305 21,7 C21,8.1045695 20.1045695,9 19,9 C18.4772492,9 18.0013407,8.79944421 17.6450213,8.47107937 L8.47107937,17.6450213 C8.79944421,18.0013407 9,18.4772492 9,19 C9,20.1045695 8.1045695,21 7,21 C5.8954305,21 5,20.1045695 5,19 L5,19 L4.85073766,18.9945143 C3.81587779,18.9181651 3,18.0543618 3,17 C3,15.8954305 3.8954305,15 5,15 C5.51979741,15 5.9932803,15.198296 6.34892797,15.5233674 L15.5233674,6.34892797 C15.198296,5.9932803 15,5.51979741 15,5 C15,3.8954305 15.8954305,3 17,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Notification.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Notification.svg index 3956c26a4f..ea6aac3498 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Notification.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Notification.svg @@ -8,4 +8,4 @@ <path d="M12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 Z M12.4,9.7 L11.6,9.7 C11.0477153,9.7 10.6,10.1477153 10.6,10.7 L10.6,10.7 L10.6,17.8 C10.6,18.3522847 11.0477153,18.8 11.6,18.8 L11.6,18.8 L12.4,18.8 C12.9522847,18.8 13.4,18.3522847 13.4,17.8 L13.4,17.8 L13.4,10.7 C13.4,10.1477153 12.9522847,9.7 12.4,9.7 L12.4,9.7 Z M12,4.8 C11.0335017,4.8 10.25,5.58350169 10.25,6.55 C10.25,7.51649831 11.0335017,8.3 12,8.3 C12.9664983,8.3 13.75,7.51649831 13.75,6.55 C13.75,5.58350169 12.9664983,4.8 12,4.8 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Open.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Open.svg index 73758d728d..6d0d733d2f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Open.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Open.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M22.0765556,10 L19,19.743 L19,19.8144687 L18.978,19.814 L18.9729679,19.8329365 L3.68762864,19.8329365 L7.05436364,10 L22.0765556,10 Z M9.98407326,4 L11.327,5.999 L19,6 L19,7.991 L6.02059108,7.99123221 L2.075,19.814 L2,19.8144687 L2,4 L9.98407326,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Paste.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Paste.svg index ef9c3573bf..99a84b7102 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Paste.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Paste.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M18,6 L18,21 L3,21 L3,6 L18,6 Z M11.5,8 L9.5,8 L9.5,12.5 L5,12.5 L5,14.5 L9.5,14.5 L9.5,19 L11.5,19 L11.5,14.5 L16,14.5 L16,12.5 L11.5,12.5 L11.5,8 Z M21,3 L21,18 L19.5,18 L19.5,4.5 L6,4.5 L6,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Pause.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Pause.svg index d0ce221dce..1e468b2657 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Pause.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Pause.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M5,3 L10,3 L10,21 L5,21 L5,3 Z M14,3 L19,3 L19,21 L14,21 L14,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayBackward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayBackward.svg index 7e4dea9deb..0204375ed0 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayBackward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayBackward.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) " points="5 21 3 21 3 3 5 3 21 12"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayForward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayForward.svg index a502d7c3a7..ef9412379f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayForward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/PlayForward.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" points="5 21 3 21 3 3 5 3 21 12"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Plus.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Plus.svg index dc78b3900c..7568efd1ba 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Plus.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Plus.svg @@ -6,4 +6,4 @@ <g id="Icons-/-System-/-Add" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M13,3 L13,11 L21,11 L21,13 L13,13 L13,21 L11,21 L11,13 L3,13 L3,11 L11,11 L11,3 L13,3 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollCollider.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollCollider.svg index 218c472314..e1468f3f9d 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollCollider.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollCollider.svg @@ -6,4 +6,4 @@ <path d="M13.1607746,19.9125407 L13.4277364,21.8988496 C12.9614267,21.9655098 12.4847411,22 12,22 C11.5152589,22 11.0385733,21.9655098 10.5722636,21.8988496 L10.8383137,19.9195317 C11.2097656,19.9725628 11.5894692,20 11.975581,20 C12.3783147,20 12.7740765,19.9701497 13.1607746,19.9125407 Z M9.33309696,19.5518252 L8.64013164,21.4215598 C7.73067722,21.097208 6.88197211,20.6449104 6.11568712,20.0863379 L7.27641932,18.4693068 C7.89959618,18.9244609 8.59127639,19.2914214 9.33309696,19.5518252 Z M16.7070306,18.4456003 L17.8843129,20.0863379 C17.1180279,20.6449104 16.2693228,21.097208 15.3598684,21.4215598 L14.6611298,19.5365683 C15.3994668,19.2725903 16.0875167,18.9028513 16.7070306,18.4456003 Z M19.136413,15.5402284 L20.9449276,16.4757101 C20.5259597,17.3114074 19.9933241,18.0802486 19.3672992,18.7619554 L17.8539722,17.4147018 C18.3655692,16.8570767 18.7988579,16.2264438 19.136413,15.5402284 Z M6.11955954,17.4389836 L4.63270084,18.7619554 C4.00667589,18.0802486 3.47404026,17.3114074 3.05507245,16.4757101 L4.82468892,15.5603633 C5.16573028,16.2487461 5.6032455,16.8808446 6.11955954,17.4389836 Z M2.00233104,11.7819136 L4.00296119,11.8049537 C4.00099128,11.8778688 4,11.9510281 4,12.024419 C4,12.746747 4.09602458,13.4466473 4.27600481,14.1120509 L2.3458237,14.6166472 C2.12031334,13.7826097 2,12.9053552 2,12 C2,11.9271198 2.00077964,11.8544217 2.00233104,11.7819136 Z M21.997,11.781838 L22,12 C22,12.9053552 21.8796867,13.7826097 21.6541763,14.6166472 L19.6783894,14.100064 C19.8562869,13.4382435 19.951162,12.7424109 19.951162,12.024419 L19.947,11.804838 L21.997,11.781838 Z M20.7406155,7.13811746 C21.2004923,7.96310941 21.546956,8.85996419 21.7589222,9.80759734 L19.7600141,10.2808906 C19.5892411,9.51507674 19.308349,8.79078455 18.9348194,8.12549542 Z M3.25938449,7.13811746 L5.0277097,8.10531853 C4.65031089,8.77294321 4.36635876,9.50037891 4.19361509,10.2698638 L2.24107782,9.80759734 C2.45304402,8.85996419 2.79950773,7.96310941 3.25938449,7.13811746 Z M17.5253214,3.66378461 C18.3013824,4.17919666 19.001332,4.80008536 19.604712,5.50599263 L18.0588119,6.86624006 C17.5687769,6.28889611 16.99802,5.78221727 16.3639789,5.36364109 Z M6.47467856,3.66378461 L7.62034128,5.34186903 C6.98217704,5.75863132 6.40737549,6.26433572 5.91353299,6.84138587 L4.39528799,5.50599263 C4.99866805,4.80008536 5.6986176,4.17919666 6.47467856,3.66378461 Z M12.9961055,2.04898934 C13.9670562,2.14500901 14.8971877,2.37990421 15.766361,2.73353598 L15.0080096,4.64555081 C14.3061207,4.35679187 13.5539699,4.16526555 12.7683267,4.08774124 Z M11.0048934,2.0488906 L11.2311007,4.08312606 C10.4436255,4.15602168 9.68933925,4.34339855 8.98504117,4.62845734 L8.23363905,2.73353598 C9.10311041,2.37978294 10.0335818,2.14484792 11.0048934,2.0488906 Z" id="Combined-Shape" fill="#FFFFFF"></path> <polygon id="Polygon" fill="#FFFFFF" points="12 6 17.1961524 9 17.1961524 15 12 18 6.80384758 15 6.80384758 9"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollJointLimit.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollJointLimit.svg index 5c256a46a1..1a28021533 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollJointLimit.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/RagdollJointLimit.svg @@ -5,4 +5,4 @@ <rect id="Icon-Background" fill="#F5A623" x="0" y="0" width="24" height="24"></rect> <path d="M12,2 L19.7901934,17.0785082 C19.9261905,17.3743655 20,17.682873 20,18 C20,20.209139 16.418278,22 12,22 C7.581722,22 4,20.209139 4,18 C4,17.682873 4.0738095,17.3743655 4.21330769,17.0785381 L4.20985619,17.0785082 L12,2 Z M12,4.89163653 L12,20.1494944 C15.8659932,20.1494944 18.1892209,19.2050986 18.1892209,17.3273304 L18.1892209,17.3273304 L12,4.89163653 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/RecordButton.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/RecordButton.svg index a53b744642..9bc2d29c81 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/RecordButton.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/RecordButton.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <circle id="Oval-2" fill="#E25243" cx="12" cy="12" r="10"></circle> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Remove.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Remove.svg index 592cc64a13..cfdc13f9e6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Remove.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Remove.svg @@ -8,4 +8,4 @@ <path d="M19,9 L19,22 L5,22 L5,9 L19,9 Z M10,11 L8,11 L8,20 L10,20 L10,11 Z M16,11 L14,11 L14,20 L16,20 L16,11 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M8,3 L16,3 L16,5 L21,5 L21,7 L3,7 L3,5 L8,5 L8,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Reset.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Reset.svg index 8eb73abaa7..5748070b33 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Reset.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Reset.svg @@ -9,4 +9,4 @@ <path d="M12,4 C12.7802003,4 13.9671798,4.06538456 15.0498484,4.51218321 C15.7716274,4.81004899 16.4416987,5.24040551 17.0600622,5.80325277 L15.7131139,7.27359539 C15.0274394,6.82544032 14.5159069,6.53408503 14.1785164,6.39952951 C13.6724307,6.19769624 12.5830744,6 12,6 C8.6862915,6 6,8.6862915 6,12 C6,15.3137085 8.6862915,18 12,18 C15.3133738,18 17.9994573,15.3142512 17.9999999,12.0010041 L20,12 L19.9961932,12.2491793 C19.8645429,16.5521622 16.3349143,20 12,20 C7.581722,20 4,16.418278 4,12 C4,7.581722 7.581722,4 12,4 Z M19,9 L22,12 L16,12 L19,9 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Restore.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Restore.svg index 8eb73abaa7..5748070b33 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Restore.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Restore.svg @@ -9,4 +9,4 @@ <path d="M12,4 C12.7802003,4 13.9671798,4.06538456 15.0498484,4.51218321 C15.7716274,4.81004899 16.4416987,5.24040551 17.0600622,5.80325277 L15.7131139,7.27359539 C15.0274394,6.82544032 14.5159069,6.53408503 14.1785164,6.39952951 C13.6724307,6.19769624 12.5830744,6 12,6 C8.6862915,6 6,8.6862915 6,12 C6,15.3137085 8.6862915,18 12,18 C15.3133738,18 17.9994573,15.3142512 17.9999999,12.0010041 L20,12 L19.9961932,12.2491793 C19.8645429,16.5521622 16.3349143,20 12,20 C7.581722,20 4,16.418278 4,12 C4,7.581722 7.581722,4 12,4 Z M19,9 L22,12 L16,12 L19,9 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Retarget.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Retarget.svg index 53d68e79a5..d02d121958 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Retarget.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Retarget.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M17,3 C18.1045695,3 19,3.8954305 19,5 C20.1045695,5 21,5.8954305 21,7 C21,8.1045695 20.1045695,9 19,9 C18.4772492,9 18.0013407,8.79944421 17.6450213,8.47107937 L8.47107937,17.6450213 C8.79944421,18.0013407 9,18.4772492 9,19 C9,20.1045695 8.1045695,21 7,21 C5.8954305,21 5,20.1045695 5,19 L5,19 L4.85073766,18.9945143 C3.81587779,18.9181651 3,18.0543618 3,17 C3,15.8954305 3.8954305,15 5,15 C5.51979741,15 5.9932803,15.198296 6.34892797,15.5233674 L15.5233674,6.34892797 C15.198296,5.9932803 15,5.51979741 15,5 C15,3.8954305 15.8954305,3 17,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Save.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Save.svg index 39bf0a9b30..475c9b4b52 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Save.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Save.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M17.0159337,3 L21,7.03036418 L21,21 L3,21 L3,3 L17.0159337,3 Z M12,11 C9.790861,11 8,12.790861 8,15 C8,17.209139 9.790861,19 12,19 C14.209139,19 16,17.209139 16,15 C16,12.790861 14.209139,11 12,11 Z M17,5 L5,5 L5,9 L17,9 L17,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekBackward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekBackward.svg index 0d189d9d5d..3b6d17635e 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekBackward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekBackward.svg @@ -8,4 +8,4 @@ <path d="M2,20 L2,4 L4,4 L11,12 L4,20 L2,20 Z" id="Combined-Shape" fill="#FFFFFF" transform="translate(6.500000, 12.000000) scale(-1, 1) translate(-6.500000, -12.000000) "></path> <path d="M13,20 L13,4 L15,4 L22,12 L15,20 L13,20 Z" id="Combined-Shape" fill="#FFFFFF" transform="translate(17.500000, 12.000000) scale(-1, 1) translate(-17.500000, -12.000000) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekForward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekForward.svg index f837d2931d..0862e5d00b 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekForward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SeekForward.svg @@ -8,4 +8,4 @@ <path d="M2,20 L2,4 L4,4 L11,12 L4,20 L2,20 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M13,20 L13,4 L15,4 L22,12 L15,20 L13,20 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Settings.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Settings.svg index 35087c8b53..17b49e791a 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Settings.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Settings.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M13.6551662,3 L14.1498069,5.3363112 C14.4715685,5.44003769 14.7831566,5.56642171 15.0826914,5.71358345 L17.4093168,4.1808897 L19.7665733,6.53814621 L18.2567266,8.85760039 C18.4152378,9.17258904 18.5506624,9.50119168 18.6607786,9.84118656 L21,10.3215021 L21,13.6551662 L18.6636888,14.1498069 C18.5562839,14.4829789 18.4245861,14.805243 18.2706822,15.1145124 L19.7830713,17.4093168 L17.4258148,19.7665733 L15.1224534,18.2667241 C14.8107607,18.4223291 14.4858315,18.5553643 14.1498069,18.6636888 L13.6551662,21 L10.3215021,21 L9.84118656,18.6607786 C9.49319486,18.5480724 9.1571376,18.4088534 8.83539702,18.2455035 L6.65464421,19.6830713 L4.29738769,17.3258148 L5.73278058,15.121461 C5.57738859,14.810071 5.44452072,14.4854749 5.3363112,14.1498069 L3,13.6551662 L3,10.3215021 L5.33922143,9.84118656 C5.44482243,9.51513266 5.57369895,9.19955591 5.72389149,8.89641581 L4.1808897,6.55464421 L6.53814621,4.19738769 L8.88846697,5.72783609 C9.19403809,5.57595444 9.51228174,5.44574577 9.84118656,5.33922143 L10.3215021,3 L13.6551662,3 Z M12,8 C9.790861,8 8,9.790861 8,12 C8,14.209139 9.790861,16 12,16 C14.209139,16 16,14.209139 16,12 C16,9.790861 14.209139,8 12,8 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObject.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObject.svg index 595ab50e81..b574e86209 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObject.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObject.svg @@ -10,4 +10,4 @@ <rect id="Rectangle-27" fill="#FFFFFF" fill-rule="nonzero" transform="translate(11.712975, 17.602986) rotate(45.000000) translate(-11.712975, -17.602986) " x="11.2129751" y="13.3879856" width="1" height="8.43"></rect> <polygon id="Rectangle-27" fill="#FFFFFF" fill-rule="nonzero" transform="translate(13.616117, 18.603643) rotate(45.000000) translate(-13.616117, -18.603643) " points="13.1161165 16.1286427 14.1161165 16.1286427 14.1161165 21.0786427 13.1161165 21.0786427"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectCollider.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectCollider.svg index d86c6cf676..cd59987d4a 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectCollider.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectCollider.svg @@ -6,4 +6,4 @@ <path d="M13.1607746,19.9125407 L13.4277364,21.8988496 C12.9614267,21.9655098 12.4847411,22 12,22 C11.5152589,22 11.0385733,21.9655098 10.5722636,21.8988496 L10.8383137,19.9195317 C11.2097656,19.9725628 11.5894692,20 11.975581,20 C12.3783147,20 12.7740765,19.9701497 13.1607746,19.9125407 Z M9.33309696,19.5518252 L8.64013164,21.4215598 C7.73067722,21.097208 6.88197211,20.6449104 6.11568712,20.0863379 L7.27641932,18.4693068 C7.89959618,18.9244609 8.59127639,19.2914214 9.33309696,19.5518252 Z M16.7070306,18.4456003 L17.8843129,20.0863379 C17.1180279,20.6449104 16.2693228,21.097208 15.3598684,21.4215598 L14.6611298,19.5365683 C15.3994668,19.2725903 16.0875167,18.9028513 16.7070306,18.4456003 Z M19.136413,15.5402284 L20.9449276,16.4757101 C20.5259597,17.3114074 19.9933241,18.0802486 19.3672992,18.7619554 L17.8539722,17.4147018 C18.3655692,16.8570767 18.7988579,16.2264438 19.136413,15.5402284 Z M6.11955954,17.4389836 L4.63270084,18.7619554 C4.00667589,18.0802486 3.47404026,17.3114074 3.05507245,16.4757101 L4.82468892,15.5603633 C5.16573028,16.2487461 5.6032455,16.8808446 6.11955954,17.4389836 Z M2.00233104,11.7819136 L4.00296119,11.8049537 C4.00099128,11.8778688 4,11.9510281 4,12.024419 C4,12.746747 4.09602458,13.4466473 4.27600481,14.1120509 L2.3458237,14.6166472 C2.12031334,13.7826097 2,12.9053552 2,12 C2,11.9271198 2.00077964,11.8544217 2.00233104,11.7819136 Z M21.997,11.781838 L22,12 C22,12.9053552 21.8796867,13.7826097 21.6541763,14.6166472 L19.6783894,14.100064 C19.8562869,13.4382435 19.951162,12.7424109 19.951162,12.024419 L19.947,11.804838 L21.997,11.781838 Z M20.7406155,7.13811746 C21.2004923,7.96310941 21.546956,8.85996419 21.7589222,9.80759734 L19.7600141,10.2808906 C19.5892411,9.51507674 19.308349,8.79078455 18.9348194,8.12549542 Z M3.25938449,7.13811746 L5.0277097,8.10531853 C4.65031089,8.77294321 4.36635876,9.50037891 4.19361509,10.2698638 L2.24107782,9.80759734 C2.45304402,8.85996419 2.79950773,7.96310941 3.25938449,7.13811746 Z M17.5253214,3.66378461 C18.3013824,4.17919666 19.001332,4.80008536 19.604712,5.50599263 L18.0588119,6.86624006 C17.5687769,6.28889611 16.99802,5.78221727 16.3639789,5.36364109 Z M6.47467856,3.66378461 L7.62034128,5.34186903 C6.98217704,5.75863132 6.40737549,6.26433572 5.91353299,6.84138587 L4.39528799,5.50599263 C4.99866805,4.80008536 5.6986176,4.17919666 6.47467856,3.66378461 Z M12.9961055,2.04898934 C13.9670562,2.14500901 14.8971877,2.37990421 15.766361,2.73353598 L15.0080096,4.64555081 C14.3061207,4.35679187 13.5539699,4.16526555 12.7683267,4.08774124 Z M11.0048934,2.0488906 L11.2311007,4.08312606 C10.4436255,4.15602168 9.68933925,4.34339855 8.98504117,4.62845734 L8.23363905,2.73353598 C9.10311041,2.37978294 10.0335818,2.14484792 11.0048934,2.0488906 Z" id="Combined-Shape" fill="#FFFFFF"></path> <polygon id="Polygon" fill="#FFFFFF" points="12 6 17.1961524 9 17.1961524 15 12 18 6.80384758 15 6.80384758 9"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectColored.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectColored.svg index 66fe2e78d7..4b350b6a8a 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectColored.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SimulatedObjectColored.svg @@ -11,4 +11,4 @@ <rect id="Rectangle-27" fill="#FFFFFF" fill-rule="nonzero" transform="translate(11.712975, 17.602986) rotate(45.000000) translate(-11.712975, -17.602986) " x="11.2129751" y="13.3879856" width="1" height="8.43"></rect> <polygon id="Rectangle-27" fill="#FFFFFF" fill-rule="nonzero" transform="translate(13.616117, 18.603643) rotate(45.000000) translate(-13.616117, -18.603643) " points="13.1161165 16.1286427 14.1161165 16.1286427 14.1161165 21.0786427 13.1161165 21.0786427"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipBackward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipBackward.svg index 493e003b69..fc9f548bb7 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipBackward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipBackward.svg @@ -9,4 +9,4 @@ <rect id="Rectangle-2" fill="#FFFFFF" x="2" y="4" width="2" height="16"></rect> <path d="M14,20 L14,4 L16,4 L22,12 L16,20 L14,20 Z" id="Combined-Shape" fill="#FFFFFF" transform="translate(18.000000, 12.000000) scale(-1, 1) translate(-18.000000, -12.000000) "></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipForward.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipForward.svg index 2511553e90..17ca285d93 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipForward.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/SkipForward.svg @@ -9,4 +9,4 @@ <rect id="Rectangle-2" fill="#FFFFFF" x="20" y="4" width="2" height="16"></rect> <path d="M11,20 L11,4 L13,4 L19,12 L13,20 L11,20 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Stop.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Stop.svg index fef848d1eb..b3faec6aba 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Stop.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Stop.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <rect id="Rectangle-4" fill="#FFFFFF" x="4" y="4" width="16" height="16"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/StopAll.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/StopAll.svg index fef848d1eb..b3faec6aba 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/StopAll.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/StopAll.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <rect id="Rectangle-4" fill="#FFFFFF" x="4" y="4" width="16" height="16"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/StopRecorder.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/StopRecorder.svg index 43407d008c..6bf1e46e52 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/StopRecorder.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/StopRecorder.svg @@ -6,4 +6,4 @@ <g id="Icons-/-Video-Control-/-Record_stop" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <rect id="Rectangle-4" fill="#E25243" x="3" y="3" width="18" height="18"></rect> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Trash.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Trash.svg index 592cc64a13..cfdc13f9e6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Trash.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Trash.svg @@ -8,4 +8,4 @@ <path d="M19,9 L19,22 L5,22 L5,9 L19,9 Z M10,11 L8,11 L8,20 L10,20 L10,11 Z M16,11 L14,11 L14,20 L16,20 L16,11 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M8,3 L16,3 L16,5 L21,5 L21,7 L3,7 L3,5 L8,5 L8,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Tree.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Tree.svg index 73758d728d..6d0d733d2f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Tree.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Tree.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M22.0765556,10 L19,19.743 L19,19.8144687 L18.978,19.814 L18.9729679,19.8329365 L3.68762864,19.8329365 L7.05436364,10 L22.0765556,10 Z M9.98407326,4 L11.327,5.999 L19,6 L19,7.991 L6.02059108,7.99123221 L2.075,19.814 L2,19.8144687 L2,4 L9.98407326,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/UpArrow.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/UpArrow.svg index 4fe8861c4e..09e89c66df 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/UpArrow.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/UpArrow.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" transform="translate(12.000000, 12.000000) rotate(90.000000) translate(-12.000000, -12.000000) " points="7.02553943 13 12 18.0361734 12 21 3 12 12 3 12 5.98884985 7 11 21 11 21 13"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Vector3Gizmo.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Vector3Gizmo.svg index 4e926a0e2c..a46032831f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Vector3Gizmo.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Vector3Gizmo.svg @@ -12,4 +12,4 @@ <polygon id="Rectangle" fill="#FFFFFF" points="22.2426407 12 18 16.2426407 18 7.75735931"></polygon> <polygon id="Rectangle" fill="#FFFFFF" transform="translate(6.000000, 12.000000) scale(-1, 1) rotate(135.000000) translate(-6.000000, -12.000000) " points="3 9 9 9 3 15"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Visualization.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Visualization.svg index 24c479bdaa..3d1b40d1b6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Visualization.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Visualization.svg @@ -6,4 +6,4 @@ <g id="Icons-/-System-/-View" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M11.9842667,6 C14.2018891,6 17.5404669,8 22,12 C17.5404669,16 14.2018891,18 11.9842667,18 C9.76664426,18 6.43855537,16 2,12 C6.43855537,8 9.76664426,6 11.9842667,6 Z M12,7.5 C9.51471863,7.5 7.5,9.51471863 7.5,12 C7.5,14.4852814 9.51471863,16.5 12,16.5 C14.4852814,16.5 16.5,14.4852814 16.5,12 C16.5,9.51471863 14.4852814,7.5 12,7.5 Z M12,9 C13.6568542,9 15,10.3431458 15,12 C15,13.6568542 13.6568542,15 12,15 C10.3431458,15 9,13.6568542 9,12 C9,10.3431458 10.3431458,9 12,9 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/Warning.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/Warning.svg index d73a098801..d09fca37cd 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/Warning.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/Warning.svg @@ -8,4 +8,4 @@ <polygon id="Triangle" points="12 2 22 22 2 22"></polygon> <path d="M12,2 L22,22 L2,22 L12,2 Z M13,18 L11,18 L11,20 L13,20 L13,18 Z M13,7 L11,7 L11,16.0862485 L13,16.0862485 L13,7 Z" id="Combined-Shape" fill="#F0C32D"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Icons/ZoomSelected.svg b/Gems/EMotionFX/Assets/Editor/Images/Icons/ZoomSelected.svg index f59b935866..5192c07c5e 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Icons/ZoomSelected.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Icons/ZoomSelected.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M21,14 L21,21 L14,21 L14,19 L19,19 L19,14 L21,14 Z M5,14 L5,19 L10,19 L10,21 L3,21 L3,14 L5,14 Z M12,8 C14.209139,8 16,9.790861 16,12 C16,14.209139 14.209139,16 12,16 C9.790861,16 8,14.209139 8,12 C8,9.790861 9.790861,8 12,8 Z M10,3 L10,5 L5,5 L5,10 L3,10 L3,3 L10,3 Z M21,3 L21,10 L19,10 L19,5 L14,5 L14,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Menu/FileOpen.svg b/Gems/EMotionFX/Assets/Editor/Images/Menu/FileOpen.svg index 73758d728d..6d0d733d2f 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Menu/FileOpen.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Menu/FileOpen.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M22.0765556,10 L19,19.743 L19,19.8144687 L18.978,19.814 L18.9729679,19.8329365 L3.68762864,19.8329365 L7.05436364,10 L22.0765556,10 Z M9.98407326,4 L11.327,5.999 L19,6 L19,7.991 L6.02059108,7.99123221 L2.075,19.814 L2,19.8144687 L2,4 L9.98407326,4 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Menu/FileSave.svg b/Gems/EMotionFX/Assets/Editor/Images/Menu/FileSave.svg index 39bf0a9b30..475c9b4b52 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Menu/FileSave.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Menu/FileSave.svg @@ -7,4 +7,4 @@ <rect id="Rectangle-18" fill-opacity="0" fill="#D8D8D8" x="0" y="0" width="24" height="24"></rect> <path d="M17.0159337,3 L21,7.03036418 L21,21 L3,21 L3,3 L17.0159337,3 Z M12,11 C9.790861,11 8,12.790861 8,15 C8,17.209139 9.790861,19 12,19 C14.209139,19 16,17.209139 16,15 C16,12.790861 14.209139,11 12,11 Z M17,5 L5,5 L5,9 L17,9 L17,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Menu/Remove.svg b/Gems/EMotionFX/Assets/Editor/Images/Menu/Remove.svg index 592cc64a13..cfdc13f9e6 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Menu/Remove.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Menu/Remove.svg @@ -8,4 +8,4 @@ <path d="M19,9 L19,22 L5,22 L5,9 L19,9 Z M10,11 L8,11 L8,20 L10,20 L10,11 Z M16,11 L14,11 L14,20 L16,20 L16,11 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M8,3 L16,3 L16,5 L21,5 L21,7 L3,7 L3,5 L8,5 L8,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Camera_category.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Camera_category.svg index 64d569af5a..4c7ca1871b 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Camera_category.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Camera_category.svg @@ -7,4 +7,4 @@ <rect id="Path" fill-opacity="0" fill="#E9E9E9" x="0" y="0" width="24" height="24"></rect> <polygon id="Combined-Shape" fill="#FFFFFF" points="20 19 15 14 15 20 2 20 2 4 15 4 15 10 20 5 22 5 22 19"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Layout_category.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Layout_category.svg index ef5d6ca53b..0a96b4b707 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Layout_category.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Layout_category.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M21,13 L21,21 L13,21 L13,13 L21,13 Z M11,13 L11,21 L3,21 L3,13 L11,13 Z M11,3 L11,11 L3,11 L3,3 L11,3 Z M21,3 L21,11 L13,11 L13,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Rotate.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Rotate.svg index 86babc31aa..97da939a86 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Rotate.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Rotate.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M12,5 C17.5228475,5 22,7.3608081 22,12 C22,15.4442471 19.5322235,17.6326643 16.0008886,18.5315221 L16,21.2426407 L11.7573593,17 L16,12.7573593 L16.0016674,15.9550948 C18.184759,15.2133604 19.5351812,13.8176329 19.5351812,12 C19.5351812,9.23857625 16.418278,7.49466813 12,7.49466813 C7.581722,7.49466813 4.51608017,9.23857625 4.51608017,12 C4.51608017,13.8140495 5.83906099,15.2078553 7.99939095,15.9507002 L8.00012145,18.5317791 C4.46824702,17.6330816 2,15.4445755 2,12 C2,7.3608081 6.4771525,5 12,5 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Scale.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Scale.svg index a1257d6042..6375650a52 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Scale.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Scale.svg @@ -8,4 +8,4 @@ <path d="M21,3 L21,9 L18.7,6.7 L14.4000589,11 L13,9.59994107 L17.3,5.3 L15,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> <path d="M3,21 L3,15 L5.356,17.356 L9.71109794,13 L11,14.2889021 L6.644,18.644 L9,21 L3,21 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Select.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Select.svg index ccc9bfa833..2ca83de856 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Select.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Select.svg @@ -7,4 +7,4 @@ <rect id="Icon-Background" x="0" y="0" width="24" height="24"></rect> <path d="M3,3 L17,7 L11.457,9.406 L21.363961,19.3137085 L19.2426407,21.4350288 L9.375,11.568 L7,17 L3,3 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Translate.svg b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Translate.svg index 4ee7acb105..51d107de98 100644 --- a/Gems/EMotionFX/Assets/Editor/Images/Rendering/Translate.svg +++ b/Gems/EMotionFX/Assets/Editor/Images/Rendering/Translate.svg @@ -12,4 +12,4 @@ <polygon id="Rectangle" fill="#FFFFFF" points="22.2426407 12 18 16.2426407 18 7.75735931"></polygon> <polygon id="Rectangle" fill="#FFFFFF" transform="translate(6.000000, 12.000000) scale(-1, 1) rotate(135.000000) translate(-6.000000, -12.000000) " points="3 9 9 9 3 15"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_PS.glsl b/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_PS.glsl index 3a2f9ad5b5..c0b4833a64 100644 --- a/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_PS.glsl +++ b/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_PS.glsl @@ -29,4 +29,4 @@ void main() vec4 finalSpecular = vec4(hdn * specularColor, 1.0); gl_FragColor = diffuseDot * diffuseColor + finalSpecular + ambient; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_VS.glsl b/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_VS.glsl index 1fda2914b3..15214714da 100644 --- a/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_VS.glsl +++ b/Gems/EMotionFX/Assets/Editor/Shaders/RenderUtil_VS.glsl @@ -25,4 +25,4 @@ void main() gl_Position = position * worldViewProjectionMatrix; } - \ No newline at end of file + diff --git a/Gems/EMotionFX/CMakeLists.txt b/Gems/EMotionFX/CMakeLists.txt index d96d812af0..20a680bce9 100644 --- a/Gems/EMotionFX/CMakeLists.txt +++ b/Gems/EMotionFX/CMakeLists.txt @@ -9,6 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) - add_subdirectory(Code) diff --git a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/ActorCommands.h b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/ActorCommands.h index 14850cf6e9..9ee472ac18 100644 --- a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/ActorCommands.h +++ b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/ActorCommands.h @@ -77,4 +77,4 @@ public: void COMMANDSYSTEM_API ClearScene(bool deleteActors = true, bool deleteActorInstances = true, MCore::CommandGroup* commandGroup = nullptr); void COMMANDSYSTEM_API PrepareCollisionMeshesNodesString(EMotionFX::Actor* actor, uint32 lod, AZStd::string* outNodeNames); void COMMANDSYSTEM_API PrepareExcludedNodesString(EMotionFX::Actor* actor, AZStd::string* outNodeNames); -} // namespace CommandSystem \ No newline at end of file +} // namespace CommandSystem diff --git a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MiscCommands.h b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MiscCommands.h index 046daa11a4..f83edfe571 100644 --- a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MiscCommands.h +++ b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MiscCommands.h @@ -27,4 +27,4 @@ public: bool m_wasRecording; bool m_wasInPlayMode; MCORE_DEFINECOMMAND_END -} // namespace CommandSystem \ No newline at end of file +} // namespace CommandSystem diff --git a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp index ea64cec116..54780b2ad0 100644 --- a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp @@ -177,7 +177,7 @@ namespace CommandSystem } // Update unique datas for all anim graph instances using the given motion set. - EMotionFX::GetAnimGraphManager().UpdateInstancesUniqueDataUsingMotionSet(motionSet); + EMotionFX::GetAnimGraphManager().InvalidateInstanceUniqueDataUsingMotionSet(motionSet); // Mark the workspace as dirty mOldWorkspaceDirtyFlag = GetCommandManager()->GetWorkspaceDirtyFlag(); @@ -260,7 +260,12 @@ namespace CommandSystem const AZStd::string commandString = AZStd::string::format("AdjustMotionSet -motionSetID %i -dirtyFlag true", mOldParentSetID); GetCommandManager()->ExecuteCommandInsideCommand(commandString, outResult); } - + + // Update unique datas for all anim graph instances using the given motion set. + // After removing a motion set, the used motion set from an anim graph instance will be reset. If we call this function after + // RemoveMotionSet, the anim graph instance would hold a nullptr for motion set, and wouldn't be invalidated. + EMotionFX::GetAnimGraphManager().InvalidateInstanceUniqueDataUsingMotionSet(motionSet); + // Destroy the motion set. EMotionFX::GetMotionManager().RemoveMotionSet(motionSet, true); @@ -278,9 +283,6 @@ namespace CommandSystem animGraph->RecursiveReinit(); } - // Update unique datas for all anim graph instances using the given motion set. - EMotionFX::GetAnimGraphManager().UpdateInstancesUniqueDataUsingMotionSet(motionSet); - // Mark the workspace as dirty. mOldWorkspaceDirtyFlag = GetCommandManager()->GetWorkspaceDirtyFlag(); GetCommandManager()->SetWorkspaceDirtyFlag(true); @@ -487,7 +489,7 @@ namespace CommandSystem } // Update unique datas for all anim graph instances using the given motion set. - EMotionFX::GetAnimGraphManager().UpdateInstancesUniqueDataUsingMotionSet(motionSet); + EMotionFX::GetAnimGraphManager().InvalidateInstanceUniqueDataUsingMotionSet(motionSet); // Return the id of the newly created motion set. AZStd::to_string(outResult, motionSet->GetID()); @@ -610,7 +612,7 @@ namespace CommandSystem } // Update unique datas for all anim graph instances using the given motion set. - EMotionFX::GetAnimGraphManager().UpdateInstancesUniqueDataUsingMotionSet(motionSet); + EMotionFX::GetAnimGraphManager().InvalidateInstanceUniqueDataUsingMotionSet(motionSet); // Check if we were able to remove all requested motion entries. if (!failedToRemoveMotionIdsString.empty()) @@ -806,7 +808,7 @@ namespace CommandSystem } // Update unique datas for all anim graph instances using the given motion set. - EMotionFX::GetAnimGraphManager().UpdateInstancesUniqueDataUsingMotionSet(motionSet); + EMotionFX::GetAnimGraphManager().InvalidateInstanceUniqueDataUsingMotionSet(motionSet); // Set the dirty flag. const AZStd::string command = AZStd::string::format("AdjustMotionSet -motionSetID %i -dirtyFlag true", motionSetID); diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.cpp index 199e8bbb4f..eccc5fc362 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.cpp @@ -76,4 +76,4 @@ namespace EMotionFX } } } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.h index 5c43d344fa..a1afb286ae 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/EMotionFXBuilderComponent.h @@ -64,4 +64,4 @@ namespace EMotionFX AnimGraphBuilderWorker m_animGraphBuilderWorker; }; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/MotionSetBuilderWorker.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/MotionSetBuilderWorker.h index 603535ac4a..933ef4030c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/MotionSetBuilderWorker.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/EMotionFXBuilder/MotionSetBuilderWorker.h @@ -39,4 +39,4 @@ namespace EMotionFX bool m_isShuttingDown = false; }; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.h index 7e9e437784..978804bbf6 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.h @@ -35,4 +35,4 @@ namespace EMotionFX AZ::SceneAPI::Events::ProcessingResult BuildMotionData(MotionDataBuilderContext& context); }; } // namespace Pipeline -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionExporter.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionExporter.h index 24a9f63532..c815052b50 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionExporter.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionExporter.h @@ -43,4 +43,4 @@ namespace EMotionFX AZ::SceneAPI::Events::ProcessingResult ProcessContext(AZ::SceneAPI::Events::ExportEventContext& context) const; }; } // namespace Pipeline -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionGroupExporter.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionGroupExporter.h index 4178383cdb..74ccd71a12 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionGroupExporter.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionGroupExporter.h @@ -37,4 +37,4 @@ namespace EMotionFX static const AZStd::string s_fileExtension; }; } // namespace Pipeline -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/ActorGroupBehavior.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/ActorGroupBehavior.h index ef51140054..755421421e 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/ActorGroupBehavior.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/ActorGroupBehavior.h @@ -57,4 +57,4 @@ namespace EMotionFX }; } // Behavior } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionGroupBehavior.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionGroupBehavior.h index 478e862043..d7fe8970af 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionGroupBehavior.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionGroupBehavior.h @@ -56,4 +56,4 @@ namespace EMotionFX }; } // Behavior } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.cpp index 8dc65441d6..ca961d512a 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.cpp @@ -112,4 +112,4 @@ namespace EMotionFX } } // Behavior } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.h index 89510532fc..de19391eb8 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Behaviors/MotionRangeRuleBehavior.h @@ -47,4 +47,4 @@ namespace EMotionFX }; } // Behavior } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/IMotionGroup.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/IMotionGroup.h index 8cf979cc1b..b89bfed901 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/IMotionGroup.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/IMotionGroup.h @@ -38,4 +38,4 @@ namespace EMotionFX }; } } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.h index 7d820a6a8e..9939109ddf 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.h @@ -65,4 +65,4 @@ namespace EMotionFX }; } } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ActorScaleRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ActorScaleRule.h index 5fb89e05b3..99cd04492d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ActorScaleRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ActorScaleRule.h @@ -48,4 +48,4 @@ namespace EMotionFX }; } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.h index b45abafc5c..eccef837e0 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.h @@ -68,4 +68,4 @@ namespace EMotionFX } // Rule } // Pipeline } // EMotionFX -#include <SceneAPIExt/Rules/ExternalToolRule.inl> \ No newline at end of file +#include <SceneAPIExt/Rules/ExternalToolRule.inl> diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.inl b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.inl index 5c39f1c7b9..4e18b97245 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.inl +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/ExternalToolRule.inl @@ -84,4 +84,4 @@ namespace EMotionFX } } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.cpp index 63ec7c7570..05f9e61e89 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.cpp @@ -62,4 +62,4 @@ namespace EMotionFX } } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.h index c9abeb5ada..40839cc5b8 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionAdditiveRule.h @@ -46,4 +46,4 @@ namespace EMotionFX }; } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.cpp index 24555da528..d7d59a7a53 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.cpp @@ -85,4 +85,4 @@ namespace EMotionFX } } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.h index 44dc59b681..93aafc4508 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionRangeRule.h @@ -52,4 +52,4 @@ namespace EMotionFX }; } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionScaleRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionScaleRule.h index 00f50e3865..c386fcd00f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionScaleRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionScaleRule.h @@ -48,4 +48,4 @@ namespace EMotionFX }; } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.cpp index 77619cea07..af78441859 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.cpp @@ -49,4 +49,4 @@ namespace EMotionFX } } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.h index a57dce9113..8d39dafaf4 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.h @@ -62,4 +62,4 @@ namespace EMotionFX }; } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SkeletonOptimizationRule.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SkeletonOptimizationRule.cpp index 739a7555cd..d6b9493d80 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SkeletonOptimizationRule.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/SkeletonOptimizationRule.cpp @@ -81,4 +81,4 @@ namespace EMotionFX } } // Rule } // Pipeline -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/Camera.inl b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/Camera.inl index 23668602e7..3bd77c1889 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/Camera.inl +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/Common/Camera.inl @@ -151,4 +151,4 @@ MCORE_INLINE uint32 Camera::GetScreenWidth() MCORE_INLINE uint32 Camera::GetScreenHeight() { return mScreenHeight; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_PS.glsl b/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_PS.glsl index 3a2f9ad5b5..c0b4833a64 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_PS.glsl +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_PS.glsl @@ -29,4 +29,4 @@ void main() vec4 finalSpecular = vec4(hdn * specularColor, 1.0); gl_FragColor = diffuseDot * diffuseColor + finalSpecular + ambient; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_VS.glsl b/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_VS.glsl index 1fda2914b3..15214714da 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_VS.glsl +++ b/Gems/EMotionFX/Code/EMotionFX/Rendering/OpenGL2/Shaders/RenderUtil_VS.glsl @@ -25,4 +25,4 @@ void main() gl_Position = position * worldViewProjectionMatrix; } - \ No newline at end of file + diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp index 2b99f823ff..403e7ec05a 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp @@ -156,6 +156,7 @@ namespace EMotionFX result->mRetargetRootNode = mRetargetRootNode; result->mInvBindPoseTransforms = mInvBindPoseTransforms; result->m_optimizeSkeleton = m_optimizeSkeleton; + result->m_skinToSkeletonIndexMap = m_skinToSkeletonIndexMap; result->RecursiveAddDependencies(this); @@ -1490,18 +1491,19 @@ namespace EMotionFX const bool skinMetaAssetExists = DoesSkinMetaAssetExist(meshAssetId); const bool morphTargetMetaAssetExists = DoesMorphTargetMetaAssetExist(m_meshAsset.GetId()); + m_skinToSkeletonIndexMap.clear(); + // Skin and morph target meta assets are ready, fill the runtime mesh data. if ((!skinMetaAssetExists || m_skinMetaAsset.IsReady()) && (!morphTargetMetaAssetExists || m_morphTargetMetaAsset.IsReady())) { // Optional, not all actors have a skinned meshes. - AZStd::unordered_map<AZ::u16, AZ::u16> skinToSkeletonIndexMap; if (skinMetaAssetExists) { - skinToSkeletonIndexMap = ConstructSkinToSkeletonIndexMap(m_skinMetaAsset); + m_skinToSkeletonIndexMap = ConstructSkinToSkeletonIndexMap(m_skinMetaAsset); } - ConstructMeshes(skinToSkeletonIndexMap); + ConstructMeshes(m_skinToSkeletonIndexMap); // Optional, not all actors have morph targets. if (morphTargetMetaAssetExists) @@ -3012,17 +3014,22 @@ namespace EMotionFX jointInfo.mStack->InsertDeformer(/*deformerPosition=*/0, morphTargetDeformer); } - // The lod has shared buffers that combine the data from each submesh. These buffers can be accessed through the first submesh in their entirety - const AZ::RPI::ModelLodAsset::Mesh& sourceMesh = sourceMeshes[0]; + // The lod has shared buffers that combine the data from each submesh. In case any of the submeshes has a + // morph target buffer view we can access the entire morph target buffer via the buffer asset. AZStd::array_view<uint8_t> morphTargetDeltaView; - if (const auto* bufferAssetView = sourceMesh.GetSemanticBufferAssetView(AZ::Name("MORPHTARGET_VERTEXDELTAS"))) + for (const AZ::RPI::ModelLodAsset::Mesh& sourceMesh : sourceMeshes) { - if (const auto* bufferAsset = bufferAssetView->GetBufferAsset().Get()) + if (const auto* bufferAssetView = sourceMesh.GetSemanticBufferAssetView(AZ::Name("MORPHTARGET_VERTEXDELTAS"))) { - // The buffer of the view is the buffer of the whole LOD, not just the source mesh. - morphTargetDeltaView = bufferAsset->GetBuffer(); + if (const auto* bufferAsset = bufferAssetView->GetBufferAsset().Get()) + { + // The buffer of the view is the buffer of the whole LOD, not just the source mesh. + morphTargetDeltaView = bufferAsset->GetBuffer(); + break; + } } } + AZ_Assert(morphTargetDeltaView.data(), "Unable to find MORPHTARGET_VERTEXDELTAS buffer"); const AZ::RPI::PackedCompressedMorphTargetDelta* vertexDeltas = reinterpret_cast<const AZ::RPI::PackedCompressedMorphTargetDelta*>(morphTargetDeltaView.data()); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.h b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.h index a40e95c887..9bf0daf046 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.h @@ -893,6 +893,8 @@ namespace EMotionFX const AZ::Data::Asset<AZ::RPI::SkinMetaAsset>& GetSkinMetaAsset() const { return m_skinMetaAsset; } const AZ::Data::Asset<AZ::RPI::MorphTargetMetaAsset>& GetMorphTargetMetaAsset() const { return m_morphTargetMetaAsset; } + const AZStd::unordered_map<AZ::u16, AZ::u16>& GetSkinToSkeletonIndexMap() const { return m_skinToSkeletonIndexMap; } + void SetMeshAsset(AZ::Data::Asset<AZ::RPI::ModelAsset> asset) { m_meshAsset = asset; } void SetSkinMetaAsset(AZ::Data::Asset<AZ::RPI::SkinMetaAsset> asset) { m_skinMetaAsset = asset; } void SetMorphTargetMetaAsset(AZ::Data::Asset<AZ::RPI::MorphTargetMetaAsset> asset) { m_morphTargetMetaAsset = asset; } @@ -954,6 +956,7 @@ namespace EMotionFX AZ::Data::Asset<AZ::RPI::SkinMetaAsset> m_skinMetaAsset; AZ::Data::Asset<AZ::RPI::MorphTargetMetaAsset> m_morphTargetMetaAsset; AZStd::recursive_mutex m_mutex; + AZStd::unordered_map<AZ::u16, AZ::u16> m_skinToSkeletonIndexMap; //!< Mapping joint indices in skin metadata to skeleton indices. static AZ::Data::AssetId ConstructSkinMetaAssetId(const AZ::Data::AssetId& meshAssetId); static bool DoesSkinMetaAssetExist(const AZ::Data::AssetId& meshAssetId); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Allocators.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Allocators.cpp index 5fc163241d..5ad4954cb5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Allocators.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Allocators.cpp @@ -55,4 +55,4 @@ namespace EMotionFX AZ::AllocatorInstance<AZ::PoolAllocator>::Get().GarbageCollect(); } -} // EMotionFX namespace \ No newline at end of file +} // EMotionFX namespace diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.cpp index 3b3dff6bd8..88d023ad2f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.cpp @@ -74,4 +74,4 @@ namespace EMotionFX } } } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.h index b1b8f9e48d..88d93e0664 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphAttributeTypes.h @@ -145,4 +145,4 @@ namespace EMotionFX static void ReinitJointIndices(const Actor* actor, const AZStd::vector<AZStd::string>& jointNames, AZStd::vector<AZ::u32>& outJointIndices); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphBindPoseNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphBindPoseNode.cpp index 0db4b02536..409a3ce3d0 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphBindPoseNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphBindPoseNode.cpp @@ -105,4 +105,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphEntryNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphEntryNode.h index 5a98f283f2..d2a97bb9a6 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphEntryNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphEntryNode.h @@ -61,4 +61,4 @@ namespace EMotionFX void TopDownUpdate(AnimGraphInstance* animGraphInstance, float timePassedInSeconds) override; void PostUpdate(AnimGraphInstance* animGraphInstance, float timePassedInSeconds) override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphGameControllerSettings.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphGameControllerSettings.cpp index 866f506fa4..1dc01729e8 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphGameControllerSettings.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphGameControllerSettings.cpp @@ -407,4 +407,4 @@ namespace EMotionFX ->Field("presets", &AnimGraphGameControllerSettings::m_presets) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.cpp index be091c471f..982c5c7a08 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.cpp @@ -327,7 +327,7 @@ namespace EMotionFX } } - void AnimGraphManager::UpdateInstancesUniqueDataUsingMotionSet(EMotionFX::MotionSet* motionSet) + void AnimGraphManager::InvalidateInstanceUniqueDataUsingMotionSet(EMotionFX::MotionSet* motionSet) { // Update unique datas for all anim graph instances that use the given motion set. for (EMotionFX::AnimGraphInstance* animGraphInstance : mAnimGraphInstances) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.h index 3650336c70..1140fdc6b8 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphManager.h @@ -66,7 +66,7 @@ namespace EMotionFX bool RemoveAnimGraphInstance(AnimGraphInstance* animGraphInstance, bool delFromMemory = true); void RemoveAnimGraphInstances(AnimGraph* animGraph, bool delFromMemory = true); void RemoveAllAnimGraphInstances(bool delFromMemory = true); - void UpdateInstancesUniqueDataUsingMotionSet(EMotionFX::MotionSet* motionSet); + void InvalidateInstanceUniqueDataUsingMotionSet(EMotionFX::MotionSet* motionSet); size_t GetNumAnimGraphInstances() const { MCore::LockGuardRecursive lock(mAnimGraphInstanceLock); return mAnimGraphInstances.size(); } AnimGraphInstance* GetAnimGraphInstance(size_t index) const { MCore::LockGuardRecursive lock(mAnimGraphInstanceLock); return mAnimGraphInstances[index]; } @@ -88,4 +88,4 @@ namespace EMotionFX AnimGraphManager(); ~AnimGraphManager(); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNetworkSerializer.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNetworkSerializer.h index 32d304ccb6..48aeee127c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNetworkSerializer.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNetworkSerializer.h @@ -63,4 +63,4 @@ namespace EMotionFX void Serialize(MCore::Attribute& attribute, const char* context); }; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.cpp index 63baa03ea3..7ca7925a51 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.cpp @@ -196,4 +196,4 @@ namespace EMotionFX ->Field("color", &AnimGraphNodeGroup::mColor) ->Field("isVisible", &AnimGraphNodeGroup::mIsVisible); } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.h index 30829034e5..11f6942778 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphNodeGroup.h @@ -174,4 +174,4 @@ namespace EMotionFX AZ::u32 mColor; /**< The color the nodes of the group will be filled with. */ bool mIsVisible; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphObjectIds.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphObjectIds.h index f9e974f721..e19a303091 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphObjectIds.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphObjectIds.h @@ -19,4 +19,4 @@ namespace EMotionFX { typedef ObjectId AnimGraphNodeId; typedef ObjectId AnimGraphConnectionId; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.cpp index b6e780266c..70ce98907d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.cpp @@ -93,4 +93,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.h index 5a2191f6d8..7826f0d27a 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphTriggerAction.h @@ -67,4 +67,4 @@ namespace EMotionFX namespace AZ { AZ_TYPE_INFO_SPECIALIZE(EMotionFX::AnimGraphTriggerAction::EMode, "{C3688688-C4BD-482F-A269-FB60AA5E6BEE}"); -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp index 91b15fd170..3be06772ed 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace1DNode.cpp @@ -75,6 +75,11 @@ namespace EMotionFX void BlendSpace1DNode::UniqueData::Reset() { + BlendSpaceNode::ClearMotionInfos(m_motionInfos); + m_currentSegment.m_segmentIndex = MCORE_INVALIDINDEX32; + m_motionCoordinates.clear(); + m_sortedMotions.clear(); + Invalidate(); } diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp index e2e839b2f5..db12bbfc22 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpace2DNode.cpp @@ -152,6 +152,13 @@ namespace EMotionFX void BlendSpace2DNode::UniqueData::Reset() { + BlendSpaceNode::ClearMotionInfos(m_motionInfos); + m_currentTriangle.m_triangleIndex = MCORE_INVALIDINDEX32; + m_currentEdge.m_edgeIndex = MCORE_INVALIDINDEX32; + m_motionCoordinates.clear(); + m_normMotionPositions.clear(); + m_blendInfos.clear(); + Invalidate(); } diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.cpp index 0a6e640e23..06581f63f7 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.cpp @@ -88,4 +88,4 @@ namespace EMotionFX return nullptr; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.h index 22a08f74b9..41c7daba94 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendSpaceManager.h @@ -39,4 +39,4 @@ namespace EMotionFX private: AZStd::vector<BlendSpaceParamEvaluator*> m_evaluators; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp index 02d286a1d0..3eb4aad119 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTree.cpp @@ -303,7 +303,8 @@ namespace EMotionFX if (GetFinalNode() == nodeToRemove) { - SetFinalNodeId(AnimGraphNodeId::InvalidId); + m_finalNodeId = AnimGraphNodeId::InvalidId; + m_finalNode = nullptr; } // call it for all children diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2AdditiveNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2AdditiveNode.h index 9e01407fe0..5b9e6272ff 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2AdditiveNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2AdditiveNode.h @@ -46,4 +46,4 @@ namespace EMotionFX void OutputFeathering(AnimGraphInstance* animGraphInstance, UniqueData* uniqueData); void UpdateMotionExtraction(AnimGraphInstance* animGraphInstance, AnimGraphNode* nodeA, AnimGraphNode* nodeB, float weight, UniqueData* uniqueData); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2LegacyNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2LegacyNode.h index ea88739d0e..677951692d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2LegacyNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2LegacyNode.h @@ -50,4 +50,4 @@ namespace EMotionFX bool m_additiveBlending; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2Node.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2Node.h index 262fd6208e..2eff4f3db7 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2Node.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBlend2Node.h @@ -44,4 +44,4 @@ namespace EMotionFX void OutputFeathering(AnimGraphInstance* animGraphInstance, UniqueData* uniqueData); void UpdateMotionExtraction(AnimGraphInstance* animGraphInstance, AnimGraphNode* nodeA, AnimGraphNode* nodeB, float weight, UniqueData* uniqueData); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBoolLogicNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBoolLogicNode.h index 73f8ea3561..1875eb37dd 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBoolLogicNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeBoolLogicNode.h @@ -97,4 +97,4 @@ namespace EMotionFX static bool MCORE_CDECL BoolLogicNOTX(bool x, bool y); static bool MCORE_CDECL BoolLogicNOTY(bool x, bool y); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.cpp index 647b581d2b..e135ebbaeb 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.cpp @@ -108,4 +108,4 @@ namespace EMotionFX ->Field("sourcePortNr", &BlendTreeConnection::mSourcePort) ->Field("targetPortNr", &BlendTreeConnection::mTargetPort); } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.h index 5a7dd9c8a6..9937a657ef 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeConnection.h @@ -70,4 +70,4 @@ namespace EMotionFX AZ::u16 mTargetPort; /**< The target port number, which is the input port number of the target node. */ bool mVisited; /**< True when during updates this connection was used. */ }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatConditionNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatConditionNode.h index 16ae0fd3bd..990d1fc86d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatConditionNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatConditionNode.h @@ -105,4 +105,4 @@ namespace EMotionFX static bool MCORE_CDECL FloatConditionGreaterOrEqual(float x, float y); static bool MCORE_CDECL FloatConditionLessOrEqual(float x, float y); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatSwitchNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatSwitchNode.h index e9bfba9711..8ddc4935c4 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatSwitchNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeFloatSwitchNode.h @@ -79,4 +79,4 @@ namespace EMotionFX float m_value3; float m_value4; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreePoseSubtractNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreePoseSubtractNode.h index 7f13776d4c..6ca40aa28d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreePoseSubtractNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreePoseSubtractNode.h @@ -77,4 +77,4 @@ namespace EMotionFX ESyncMode m_syncMode; EEventMode m_eventMode; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRangeRemapperNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRangeRemapperNode.h index 46a2d68676..5d3ef57b94 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRangeRemapperNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeRangeRemapperNode.h @@ -69,4 +69,4 @@ namespace EMotionFX float m_outputMin; float m_outputMax; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2ComposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2ComposeNode.cpp index d30dc760a4..82b2a1719b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2ComposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2ComposeNode.cpp @@ -102,4 +102,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2DecomposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2DecomposeNode.cpp index 496241917b..bc6d00e9b1 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2DecomposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector2DecomposeNode.cpp @@ -107,4 +107,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3ComposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3ComposeNode.cpp index ecb2d797d9..21661fe5d9 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3ComposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3ComposeNode.cpp @@ -104,4 +104,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3DecomposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3DecomposeNode.cpp index 94acddff30..124100330f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3DecomposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector3DecomposeNode.cpp @@ -109,4 +109,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4ComposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4ComposeNode.cpp index 4174520609..653cbc4388 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4ComposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4ComposeNode.cpp @@ -106,4 +106,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4DecomposeNode.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4DecomposeNode.cpp index c3afeea6b0..694757c49f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4DecomposeNode.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/BlendTreeVector4DecomposeNode.cpp @@ -113,4 +113,4 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/EMotionFXAllocatorInitializer.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/EMotionFXAllocatorInitializer.cpp index c9bc61b580..3c55b8d237 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/EMotionFXAllocatorInitializer.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/EMotionFXAllocatorInitializer.cpp @@ -29,4 +29,4 @@ namespace EMotionFX // Destroy EMotionFX allocator. AZ::AllocatorInstance<EMotionFX::Integration::EMotionFXAllocator>::Destroy(); } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/KeyFrame.h b/Gems/EMotionFX/Code/EMotionFX/Source/KeyFrame.h index f5b892bc1d..013c15e5db 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/KeyFrame.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/KeyFrame.h @@ -113,4 +113,4 @@ namespace EMotionFX // include inline code #include "KeyFrame.inl" -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.h b/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.h index 39c4c0097c..fc74afeeb1 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Mesh.h @@ -76,7 +76,6 @@ namespace EMotionFX ATTRIB_ORGVTXNUMBERS = 5, /**< Original vertex numbers. Typecast to uint32. Original vertex numbers always exist. */ ATTRIB_COLORS128 = 6, /**< Vertex colors in 128-bits. */ ATTRIB_BITANGENTS = 7, /**< Vertex bitangents (aka binormal). Typecast to AZ::Vector3. When tangents exists bitangents may still not exist! */ - ATTRIB_CLOTH_DATA = 8 /**< Vertex cloth data stored as AZ::u32, packed using four 8 bit values, similar to a 32 bit vertex color. */ }; /** diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp index fbe8a78cba..8a58300b88 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp @@ -258,8 +258,16 @@ namespace EMotionFX } else if (!timeValues.empty()) { - if (!AZ::IsClose(timeValues.front(), startTime, AZ::Constants::FloatEpsilon) || !AZ::IsClose(timeValues.back(), endTime, AZ::Constants::FloatEpsilon)) + if (!AZ::IsClose(timeValues.front(), startTime, AZ::Constants::FloatEpsilon)) { + AZ_Error("EMotionFX", false, "No keyframe present at the start of the animation (%f). The first keyframe is at %f.", + startTime, timeValues.front()); + return false; + } + if (!AZ::IsClose(timeValues.back(), endTime, AZ::Constants::FloatEpsilon)) + { + AZ_Error("EMotionFX", false, "No keyframe present at the end of the animation (%f). The last keyframe is at %f.", + endTime, timeValues.back()); return false; } } @@ -271,14 +279,25 @@ namespace EMotionFX { for (const JointData& jointData : m_jointData) { - if ((jointData.m_positionTrack.m_times.size() != jointData.m_positionTrack.m_values.size()) || (jointData.m_rotationTrack.m_times.size() != jointData.m_rotationTrack.m_values.size())) + if (jointData.m_positionTrack.m_times.size() != jointData.m_positionTrack.m_values.size()) { + AZ_Error("EMotionFX", false, "Number of position keyframe times (%d) does not match the number of keyframe values (%d).", + jointData.m_positionTrack.m_times.size(), jointData.m_positionTrack.m_values.size()); + return false; + } + + if (jointData.m_rotationTrack.m_times.size() != jointData.m_rotationTrack.m_values.size()) + { + AZ_Error("EMotionFX", false, "Number of rotation keyframe times (%d) does not match the number of keyframe values (%d).", + jointData.m_rotationTrack.m_times.size(), jointData.m_rotationTrack.m_values.size()); return false; } #ifndef EMFX_SCALE_DISABLED if (jointData.m_scaleTrack.m_times.size() != jointData.m_scaleTrack.m_values.size()) { + AZ_Error("EMotionFX", false, "Number of scale keyframe times (%d) does not match the number of keyframe values (%d).", + jointData.m_scaleTrack.m_times.size(), jointData.m_scaleTrack.m_values.size()); return false; } @@ -288,7 +307,8 @@ namespace EMotionFX } #endif - if (!VerifyKeyTrackTimeIntegrity(jointData.m_positionTrack.m_times) || !VerifyKeyTrackTimeIntegrity(jointData.m_rotationTrack.m_times)) + if (!VerifyKeyTrackTimeIntegrity(jointData.m_positionTrack.m_times) || + !VerifyKeyTrackTimeIntegrity(jointData.m_rotationTrack.m_times)) { return false; } @@ -300,7 +320,8 @@ namespace EMotionFX bool firstCheck = true; for (const JointData& jointData : m_jointData) { - if (!VerifyStartEndTimeIntegrity(jointData.m_positionTrack.m_times, firstCheck, startTime, endTime) || !VerifyStartEndTimeIntegrity(jointData.m_rotationTrack.m_times, firstCheck, startTime, endTime)) + if (!VerifyStartEndTimeIntegrity(jointData.m_positionTrack.m_times, firstCheck, startTime, endTime) || + !VerifyStartEndTimeIntegrity(jointData.m_rotationTrack.m_times, firstCheck, startTime, endTime)) { return false; } @@ -317,6 +338,8 @@ namespace EMotionFX { if (morphData.m_track.m_times.size() != morphData.m_track.m_values.size()) { + AZ_Error("EMotionFX", false, "Number of morph keyframe times (%d) does not match the number of keyframe values (%d).", + morphData.m_track.m_times.size(), morphData.m_track.m_values.size()); return false; } @@ -333,7 +356,17 @@ namespace EMotionFX for (const FloatData& floatData : m_floatData) { - if (floatData.m_track.m_times.size() != floatData.m_track.m_values.size() || !VerifyStartEndTimeIntegrity(floatData.m_track.m_times, firstCheck, startTime, endTime) || !VerifyKeyTrackTimeIntegrity(floatData.m_track.m_times)) + if (floatData.m_track.m_times.size() != floatData.m_track.m_values.size()) + { + AZ_Error("EMotionFX", false, "Number of float keyframe times (%d) does not match the number of keyframe values (%d).", + floatData.m_track.m_times.size(), floatData.m_track.m_values.size()); + return false; + } + if (!VerifyStartEndTimeIntegrity(floatData.m_track.m_times, firstCheck, startTime, endTime)) + { + return false; + } + if (!VerifyKeyTrackTimeIntegrity(floatData.m_track.m_times)) { return false; } @@ -657,6 +690,8 @@ namespace EMotionFX { if (curTime < prevKeyTime) { + AZ_Error("EMotionFX", false, "Keyframe times need to be ascending. Current keyframe time (%f) is smaller than the previous (%f).", + curTime, prevKeyTime); return false; } prevKeyTime = curTime; diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.cpp index 1a1c46c42e..80a03d691d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.cpp @@ -79,4 +79,4 @@ namespace EMotionFX { return m_id != rhs.m_id; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.h b/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.h index 072e795dba..712a564bf5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/ObjectId.h @@ -90,4 +90,4 @@ namespace EMotionFX protected: AZ::u64 m_id; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Parameter/ParameterFactory.h b/Gems/EMotionFX/Code/EMotionFX/Source/Parameter/ParameterFactory.h index 1b0369c761..d63b8516c3 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Parameter/ParameterFactory.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Parameter/ParameterFactory.h @@ -35,4 +35,4 @@ namespace EMotionFX static Parameter* Create(const AZ::TypeId& type); }; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/PoseData.h b/Gems/EMotionFX/Code/EMotionFX/Source/PoseData.h index dd9b618cd0..a724c72b02 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/PoseData.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/PoseData.h @@ -53,4 +53,4 @@ namespace EMotionFX Pose* m_pose; bool m_isUsed; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.cpp index 7ead3391d9..580a8c7ced 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.cpp @@ -47,4 +47,4 @@ namespace EMotionFX return typeIds; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.h b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.h index 6fee279a62..574001309f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataFactory.h @@ -32,4 +32,4 @@ namespace EMotionFX static PoseData* Create(Pose* pose, const AZ::TypeId& type); static const AZStd::unordered_set<AZ::TypeId>& GetTypeIds(); }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataRagdoll.h b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataRagdoll.h index 00ee8f9118..caef09f775 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataRagdoll.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/PoseDataRagdoll.h @@ -50,4 +50,4 @@ namespace EMotionFX private: AZStd::vector<Physics::RagdollNodeState> m_nodeStates; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollVelocityEvaluators.h b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollVelocityEvaluators.h index 391a47de4c..58cf7ad215 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/RagdollVelocityEvaluators.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/RagdollVelocityEvaluators.h @@ -87,4 +87,4 @@ namespace EMotionFX Physics::RagdollState m_running; Physics::RagdollState m_last; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/TransformSpace.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/TransformSpace.cpp index cc59bf378f..afc3b7654f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/TransformSpace.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/TransformSpace.cpp @@ -38,4 +38,4 @@ namespace EMotionFX ; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/TriggerActionSetup.h b/Gems/EMotionFX/Code/EMotionFX/Source/TriggerActionSetup.h index b3e1a1f96d..7f68f02a9c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/TriggerActionSetup.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/TriggerActionSetup.h @@ -53,4 +53,4 @@ namespace EMotionFX private: AZStd::vector<AnimGraphTriggerAction*> m_actions; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Allocators.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Allocators.cpp index 63a07a9722..f2179019f5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Allocators.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Allocators.cpp @@ -18,4 +18,4 @@ namespace EMStudio : UIAllocator::Base("UIAllocator", "EMotion FX UI memory allocator") { } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/DockWidgetPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/DockWidgetPlugin.cpp index 6b8b22f78c..c10e3b06e2 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/DockWidgetPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/DockWidgetPlugin.cpp @@ -119,9 +119,7 @@ namespace EMStudio mDock->setFeatures(features); - // mDock->setFloating( true ); mainWindow->addDockWidget(Qt::RightDockWidgetArea, mDock); - mainWindow->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North); // put tabs on top? return mDock; } @@ -139,4 +137,4 @@ namespace EMStudio return widget; } -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioPlugin.cpp index c15c776609..c69dfc044f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioPlugin.cpp @@ -17,4 +17,4 @@ namespace EMStudio { } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_EMStudioPlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_EMStudioPlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/GUIOptions.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/GUIOptions.h index 8b7fb22fe5..4f356bc8a0 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/GUIOptions.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/GUIOptions.h @@ -100,4 +100,4 @@ namespace EMStudio bool m_autoLoadLastWorkspace; AZStd::string m_applicationMode; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/InvisiblePlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/InvisiblePlugin.cpp index 4825bfba96..1ffe004ee9 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/InvisiblePlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/InvisiblePlugin.cpp @@ -28,4 +28,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_InvisiblePlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_InvisiblePlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/KeyboardShortcutsWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/KeyboardShortcutsWindow.cpp index 354e5bb92a..b8093d2115 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/KeyboardShortcutsWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/KeyboardShortcutsWindow.cpp @@ -533,4 +533,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_KeyboardShortcutsWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_KeyboardShortcutsWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/LoadActorSettingsWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/LoadActorSettingsWindow.cpp index a7cab42a63..881f7c65c5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/LoadActorSettingsWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/LoadActorSettingsWindow.cpp @@ -281,4 +281,4 @@ namespace EMStudio } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_LoadActorSettingsWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_LoadActorSettingsWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.cpp index 5adec5e0a4..496b6b8e94 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.cpp @@ -1866,6 +1866,12 @@ namespace EMStudio // add each layout in the remove menu for (uint32 i = 0; i < numLayoutNames; ++i) { + // User cannot remove the default layout. This layout is referenced in the qrc file, removing it will + // cause compiling issue too. + if (mLayoutNames[i] == "AnimGraph") + { + continue; + } QAction* action = removeMenu->addAction(mLayoutNames[i].c_str()); connect(action, &QAction::triggered, this, &MainWindow::OnRemoveLayout); } diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.cpp index 79837a6e10..f434793770 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.cpp @@ -117,4 +117,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_MorphTargetSelectionWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_MorphTargetSelectionWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.h index a1964002d3..9d86fd6138 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MorphTargetSelectionWindow.h @@ -47,4 +47,4 @@ namespace EMStudio QPushButton* mOKButton; QPushButton* mCancelButton; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.cpp index 58091015b2..3c2a3f8296 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.cpp @@ -96,4 +96,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_MotionSetSelectionWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_MotionSetSelectionWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.h index 0189454247..b536a9f95d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MotionSetSelectionWindow.h @@ -49,4 +49,4 @@ namespace EMStudio QPushButton* mCancelButton; bool mUseSingleSelection; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp index 5b385c6d6b..d1cbc8d54b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp @@ -201,4 +201,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_NotificationWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_NotificationWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RecoverFilesWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RecoverFilesWindow.cpp index 3c42afc96b..c03be64a30 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RecoverFilesWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RecoverFilesWindow.cpp @@ -389,4 +389,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_RecoverFilesWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_RecoverFilesWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RemovePluginOnCloseDockWidget.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RemovePluginOnCloseDockWidget.cpp index dfc0ebab53..d607928b34 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RemovePluginOnCloseDockWidget.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RemovePluginOnCloseDockWidget.cpp @@ -30,4 +30,4 @@ namespace EMStudio } } -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_RemovePluginOnCloseDockWidget.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_RemovePluginOnCloseDockWidget.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/ToolBarPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/ToolBarPlugin.cpp index 02dea72371..30b74915f7 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/ToolBarPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/ToolBarPlugin.cpp @@ -103,4 +103,4 @@ namespace EMStudio } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_ToolBarPlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_ToolBarPlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/UnitScaleWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/UnitScaleWindow.cpp index 3cf17b5211..3bbb2747be 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/UnitScaleWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/UnitScaleWindow.cpp @@ -96,4 +96,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_UnitScaleWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/moc_UnitScaleWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Workspace.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Workspace.h index b0295c2120..4a37bf129c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Workspace.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/Workspace.h @@ -64,4 +64,4 @@ namespace EMStudio AZStd::string mFilename; bool mDirtyFlag; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.cpp index 91b506e10c..14f3603b16 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.cpp @@ -140,4 +140,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/moc_ActionHistoryPlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/moc_ActionHistoryPlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.h index 6d41f084d1..d17936fb0f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/ActionHistory/ActionHistoryPlugin.h @@ -58,4 +58,4 @@ namespace EMStudio QListWidget* mList; ActionHistoryCallback* mCallback; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.cpp index 750a733189..83b37b41ce 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.cpp @@ -87,4 +87,4 @@ namespace EMStudio } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_AnimGraphItemDelegate.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_AnimGraphItemDelegate.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphNodeWidget.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphNodeWidget.cpp index eae597e634..5e22e117e5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphNodeWidget.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphNodeWidget.cpp @@ -12,4 +12,4 @@ #include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphNodeWidget.h> -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_AnimGraphNodeWidget.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_AnimGraphNodeWidget.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphSelectionProxyModel.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphSelectionProxyModel.cpp index 502ad0dc35..d91a69d56f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphSelectionProxyModel.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphSelectionProxyModel.cpp @@ -149,4 +149,4 @@ namespace EMStudio } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_SelectionProxyModel.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/moc_SelectionProxyModel.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendSpaceNodeWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendSpaceNodeWidget.h index 60c15dcee6..312f42410f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendSpaceNodeWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendSpaceNodeWidget.h @@ -45,4 +45,4 @@ namespace EMStudio private: void RenderCircle(QPainter& painter, const QPointF& point, const QColor& color, float size); }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NavigateWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NavigateWidget.h index 592375fe32..e8b6e0b9c5 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NavigateWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NavigateWidget.h @@ -59,4 +59,4 @@ namespace EMStudio SelectionProxyModel* m_selectionProxyModel; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGroupWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGroupWindow.h index 001ada3d9f..d2101685b4 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGroupWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGroupWindow.h @@ -127,4 +127,4 @@ namespace EMStudio AZStd::string m_searchWidgetText; MCore::Array<WidgetLookup> mWidgetTable; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/FloatSliderParameterEditor.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/FloatSliderParameterEditor.cpp index fff71ce4fc..a4af9631f6 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/FloatSliderParameterEditor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/FloatSliderParameterEditor.cpp @@ -95,4 +95,4 @@ namespace EMStudio typedAttribute->SetValue(m_currentValue); } } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/ValueParameterEditor.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/ValueParameterEditor.cpp index 9777bb1fcf..b6821fb91e 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/ValueParameterEditor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/ValueParameterEditor.cpp @@ -62,4 +62,4 @@ namespace EMStudio AZ_Assert(m_valueParameter, "Expected non-null value parameter"); return m_valueParameter->GetDescription(); } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterSelectionWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterSelectionWindow.h index b17c93c311..39833f0f99 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterSelectionWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterSelectionWindow.h @@ -58,4 +58,4 @@ namespace EMStudio bool mUseSingleSelection; bool mAccepted; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsHierarchyWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsHierarchyWindow.cpp index fe75b35403..b77d598dd7 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsHierarchyWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsHierarchyWindow.cpp @@ -140,4 +140,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/moc_AttachmentsHierarchyWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/moc_AttachmentsHierarchyWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsPlugin.cpp index bd591dbf47..27d19051cd 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/AttachmentsPlugin.cpp @@ -290,4 +290,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/moc_AttachmentsPlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/Attachments/moc_AttachmentsPlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/MorphTargetEditWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/MorphTargetEditWindow.cpp index ab11c03972..9dfebb5a74 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/MorphTargetEditWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/MorphTargetEditWindow.cpp @@ -171,4 +171,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/moc_MorphTargetEditWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/moc_MorphTargetEditWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/PhonemeSelectionWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/PhonemeSelectionWindow.h index ea7f41490c..57268e65fa 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/PhonemeSelectionWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MorphTargetsWindow/PhonemeSelectionWindow.h @@ -161,4 +161,4 @@ namespace EMStudio bool mDirtyFlag; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionListWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionListWindow.h index 128543611f..2f48dad550 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionListWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionListWindow.h @@ -120,4 +120,4 @@ namespace EMStudio AZStd::string m_searchWidgetText; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionRetargetingWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionRetargetingWindow.cpp index 941ee07955..ae2d29759b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionRetargetingWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/MotionRetargetingWindow.cpp @@ -141,4 +141,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/moc_MotionRetargetingWindow.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionWindow/moc_MotionRetargetingWindow.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupManagementWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupManagementWidget.h index d4aeeae752..2fbb815400 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupManagementWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupManagementWidget.h @@ -112,4 +112,4 @@ namespace EMStudio QPushButton* mRemoveButton; QPushButton* mClearButton; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupWidget.h index 0198f5da38..1ec51dc998 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupWidget.h @@ -70,4 +70,4 @@ namespace EMStudio QPushButton* mAddNodesButton; QPushButton* mRemoveNodesButton; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupsPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupsPlugin.cpp index 43ca790f67..342bf1597b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupsPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/NodeGroupsPlugin.cpp @@ -260,4 +260,4 @@ namespace EMStudio bool NodeGroupsPlugin::CommandRemoveNodeGroupCallback::Undo(MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(command); MCORE_UNUSED(commandLine); return ReInitNodeGroupsPlugin(); } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/moc_NodeGroupsPlugin.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeGroups/moc_NodeGroupsPlugin.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeWindow/MeshInfo.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeWindow/MeshInfo.cpp index 49d673ab6d..a3e83d90ca 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeWindow/MeshInfo.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/NodeWindow/MeshInfo.cpp @@ -89,9 +89,6 @@ namespace EMStudio case EMotionFX::Mesh::ATTRIB_BITANGENTS: tmpString = "Vertex bitangents"; break; - case EMotionFX::Mesh::ATTRIB_CLOTH_DATA: - tmpString = "Vertex cloth data in 32-bits"; - break; default: tmpString = AZStd::string::format("Unknown data (TypeID=%d)", attributeLayerType); } diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/SceneManager/MirrorSetupWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/SceneManager/MirrorSetupWindow.h index 08a0019139..d698fb9c22 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/SceneManager/MirrorSetupWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/SceneManager/MirrorSetupWindow.h @@ -101,4 +101,4 @@ namespace EMStudio void ApplyCurrentMapAsCommand(); EMotionFX::Actor* GetSelectedActor() const; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.cpp index 6ff41b4f18..21d14b22ec 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.cpp @@ -178,4 +178,4 @@ namespace EMStudio } } // namespace EMStudio -#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/moc_TimeInfoWidget.cpp> \ No newline at end of file +#include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/moc_TimeInfoWidget.cpp> diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.h index 0d851f56df..6e3e1a1688 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeInfoWidget.h @@ -65,4 +65,4 @@ namespace EMStudio void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeTrackElement.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeTrackElement.h index 6ef2bb305d..8d134b2ae4 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeTrackElement.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TimeTrackElement.h @@ -110,4 +110,4 @@ namespace EMStudio static QColor mHighlightedTextColor; static int32 mTickHalfWidth; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Android.h b/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Android.h index c5679fb6cc..30a7969f69 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Android.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Android.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_EMOTIONFX_HAS_GAME_CONTROLLER 0 -#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 \ No newline at end of file +#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 diff --git a/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Platform.h b/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Platform.h index e24dfbea65..84bbc194bc 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Platform.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Android/EMotionFX_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <EMotionFX_Traits_Android.h> \ No newline at end of file +#include <EMotionFX_Traits_Android.h> diff --git a/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Linux.h b/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Linux.h index c5679fb6cc..30a7969f69 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Linux.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Linux.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_EMOTIONFX_HAS_GAME_CONTROLLER 0 -#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 \ No newline at end of file +#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 diff --git a/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Platform.h b/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Platform.h index ec70dc18f2..11de46f302 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Platform.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Linux/EMotionFX_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <EMotionFX_Traits_Linux.h> \ No newline at end of file +#include <EMotionFX_Traits_Linux.h> diff --git a/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Mac.h b/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Mac.h index 539fe0e95d..01c1bd73ac 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Mac.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Mac.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_EMOTIONFX_HAS_GAME_CONTROLLER 0 -#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 1 \ No newline at end of file +#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 1 diff --git a/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Platform.h b/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Platform.h index d62a40f1e8..ae00945221 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Platform.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Mac/EMotionFX_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <EMotionFX_Traits_Mac.h> \ No newline at end of file +#include <EMotionFX_Traits_Mac.h> diff --git a/Gems/EMotionFX/Code/Editor/Platform/Mac/platform_mac.cmake b/Gems/EMotionFX/Code/Editor/Platform/Mac/platform_mac.cmake index 95df062a93..bafe20e506 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Mac/platform_mac.cmake +++ b/Gems/EMotionFX/Code/Editor/Platform/Mac/platform_mac.cmake @@ -13,4 +13,4 @@ # based on the active platform # NOTE: functions in cmake are global, therefore adding functions to this file # is being avoided to prevent overriding functions declared in other targets platfrom -# specific cmake files \ No newline at end of file +# specific cmake files diff --git a/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Platform.h b/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Platform.h index dbd8d14afe..fae049bdb7 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Platform.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <EMotionFX_Traits_Windows.h> \ No newline at end of file +#include <EMotionFX_Traits_Windows.h> diff --git a/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Windows.h b/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Windows.h index df4c9e7299..1843965b16 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Windows.h +++ b/Gems/EMotionFX/Code/Editor/Platform/Windows/EMotionFX_Traits_Windows.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_EMOTIONFX_HAS_GAME_CONTROLLER 1 -#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 \ No newline at end of file +#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 diff --git a/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_Platform.h b/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_Platform.h index 5f59784600..63dd5b0998 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_Platform.h +++ b/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <EMotionFX_Traits_iOS.h> \ No newline at end of file +#include <EMotionFX_Traits_iOS.h> diff --git a/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_iOS.h b/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_iOS.h index c5679fb6cc..30a7969f69 100644 --- a/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_iOS.h +++ b/Gems/EMotionFX/Code/Editor/Platform/iOS/EMotionFX_Traits_iOS.h @@ -12,4 +12,4 @@ #pragma once #define AZ_TRAIT_EMOTIONFX_HAS_GAME_CONTROLLER 0 -#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 \ No newline at end of file +#define AZ_TRAIT_EMOTIONFX_MAIN_WINDOW_DETACHED 0 diff --git a/Gems/EMotionFX/Code/Include/Integration/AnimGraphNetworkingBus.h b/Gems/EMotionFX/Code/Include/Integration/AnimGraphNetworkingBus.h index f4438084bb..b65676ab25 100644 --- a/Gems/EMotionFX/Code/Include/Integration/AnimGraphNetworkingBus.h +++ b/Gems/EMotionFX/Code/Include/Integration/AnimGraphNetworkingBus.h @@ -43,4 +43,4 @@ namespace EMotionFX }; using AnimGraphComponentNetworkRequestBus = AZ::EBus<AnimGraphComponentNetworkRequests>; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Include/Integration/EditorSimpleMotionComponentBus.h b/Gems/EMotionFX/Code/Include/Integration/EditorSimpleMotionComponentBus.h index e6a39b050f..7e3d03f52a 100644 --- a/Gems/EMotionFX/Code/Include/Integration/EditorSimpleMotionComponentBus.h +++ b/Gems/EMotionFX/Code/Include/Integration/EditorSimpleMotionComponentBus.h @@ -30,4 +30,4 @@ namespace EMotionFX }; using EditorSimpleMotionComponentRequestBus = AZ::EBus<EditorSimpleMotionComponentRequests>; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Include/Integration/SimpleMotionComponentBus.h b/Gems/EMotionFX/Code/Include/Integration/SimpleMotionComponentBus.h index ecb8b66d8a..2514c4daa6 100644 --- a/Gems/EMotionFX/Code/Include/Integration/SimpleMotionComponentBus.h +++ b/Gems/EMotionFX/Code/Include/Integration/SimpleMotionComponentBus.h @@ -48,4 +48,4 @@ namespace EMotionFX }; using SimpleMotionComponentRequestBus = AZ::EBus<SimpleMotionComponentRequests>; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/MCore/Source/AttributeAllocator.cpp b/Gems/EMotionFX/Code/MCore/Source/AttributeAllocator.cpp index 066ddd90fd..66f44900fa 100644 --- a/Gems/EMotionFX/Code/MCore/Source/AttributeAllocator.cpp +++ b/Gems/EMotionFX/Code/MCore/Source/AttributeAllocator.cpp @@ -19,4 +19,4 @@ namespace MCore { return "EMotionFX MCore attribute allocator"; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/MCore/Source/AttributeFactory.cpp b/Gems/EMotionFX/Code/MCore/Source/AttributeFactory.cpp index 5e97740bda..75fb8b29ae 100644 --- a/Gems/EMotionFX/Code/MCore/Source/AttributeFactory.cpp +++ b/Gems/EMotionFX/Code/MCore/Source/AttributeFactory.cpp @@ -130,4 +130,4 @@ namespace MCore RegisterAttribute(aznew AttributeColor()); RegisterAttribute(aznew AttributePointer()); } -} // namespace MCore \ No newline at end of file +} // namespace MCore diff --git a/Gems/EMotionFX/Code/MCore/Source/BoundingSphere.h b/Gems/EMotionFX/Code/MCore/Source/BoundingSphere.h index 0f33d90f51..6b02f799b7 100644 --- a/Gems/EMotionFX/Code/MCore/Source/BoundingSphere.h +++ b/Gems/EMotionFX/Code/MCore/Source/BoundingSphere.h @@ -174,4 +174,4 @@ namespace MCore float mRadius; /**< The radius of the sphere. */ float mRadiusSq; /**< The squared radius of the sphere (mRadius*mRadius).*/ }; -} // namespace MCore \ No newline at end of file +} // namespace MCore diff --git a/Gems/EMotionFX/Code/MCore/Source/MCoreSystem.h b/Gems/EMotionFX/Code/MCore/Source/MCoreSystem.h index 318f792833..873e4e4304 100644 --- a/Gems/EMotionFX/Code/MCore/Source/MCoreSystem.h +++ b/Gems/EMotionFX/Code/MCore/Source/MCoreSystem.h @@ -187,4 +187,4 @@ namespace MCore MCORE_INLINE StringIdPool& GetStringIdPool() { return GetMCore().GetStringIdPool(); } MCORE_INLINE AttributeFactory& GetAttributeFactory() { return GetMCore().GetAttributeFactory(); } MCORE_INLINE MemoryTracker& GetMemoryTracker() { return GetMCore().GetMemoryTracker(); } -} // namespace MCore \ No newline at end of file +} // namespace MCore diff --git a/Gems/EMotionFX/Code/MysticQt/Source/DialogStack.cpp b/Gems/EMotionFX/Code/MysticQt/Source/DialogStack.cpp index face1e38af..a4d5a20603 100644 --- a/Gems/EMotionFX/Code/MysticQt/Source/DialogStack.cpp +++ b/Gems/EMotionFX/Code/MysticQt/Source/DialogStack.cpp @@ -716,4 +716,4 @@ namespace MysticQt } } // namespace MysticQt -#include <MysticQt/Source/moc_DialogStack.cpp> \ No newline at end of file +#include <MysticQt/Source/moc_DialogStack.cpp> diff --git a/Gems/EMotionFX/Code/MysticQt/Source/RecentFiles.h b/Gems/EMotionFX/Code/MysticQt/Source/RecentFiles.h index d2edb620ac..10351c3410 100644 --- a/Gems/EMotionFX/Code/MysticQt/Source/RecentFiles.h +++ b/Gems/EMotionFX/Code/MysticQt/Source/RecentFiles.h @@ -58,4 +58,4 @@ namespace MysticQt QAction* m_resetRecentFilesAction; QString m_configStringName; }; -} // namespace MysticQt \ No newline at end of file +} // namespace MysticQt diff --git a/Gems/EMotionFX/Code/Platform/Common/FileOffsetType/MCore/Source/DiskFile_FileOffsetType.cpp b/Gems/EMotionFX/Code/Platform/Common/FileOffsetType/MCore/Source/DiskFile_FileOffsetType.cpp index 41f9a627ef..5e6edb04a9 100644 --- a/Gems/EMotionFX/Code/Platform/Common/FileOffsetType/MCore/Source/DiskFile_FileOffsetType.cpp +++ b/Gems/EMotionFX/Code/Platform/Common/FileOffsetType/MCore/Source/DiskFile_FileOffsetType.cpp @@ -75,4 +75,4 @@ namespace MCore return fileSize; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Platform/Common/WinAPI/MCore/Source/DiskFile_WinAPI.cpp b/Gems/EMotionFX/Code/Platform/Common/WinAPI/MCore/Source/DiskFile_WinAPI.cpp index cb4befe6ad..53c0686b6d 100644 --- a/Gems/EMotionFX/Code/Platform/Common/WinAPI/MCore/Source/DiskFile_WinAPI.cpp +++ b/Gems/EMotionFX/Code/Platform/Common/WinAPI/MCore/Source/DiskFile_WinAPI.cpp @@ -75,4 +75,4 @@ namespace MCore return fileSize; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Editor/ActorEditorBus.h b/Gems/EMotionFX/Code/Source/Editor/ActorEditorBus.h index 7e5304db5f..84ec9613f5 100644 --- a/Gems/EMotionFX/Code/Source/Editor/ActorEditorBus.h +++ b/Gems/EMotionFX/Code/Source/Editor/ActorEditorBus.h @@ -55,4 +55,4 @@ namespace EMotionFX }; using ActorEditorNotificationBus = AZ::EBus<ActorEditorNotifications>; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/JointSelectionWidget.h b/Gems/EMotionFX/Code/Source/Editor/JointSelectionWidget.h index e698c6b874..5593d84497 100644 --- a/Gems/EMotionFX/Code/Source/Editor/JointSelectionWidget.h +++ b/Gems/EMotionFX/Code/Source/Editor/JointSelectionWidget.h @@ -63,4 +63,4 @@ namespace EMotionFX SkeletonSortFilterProxyModel* m_filterProxyModel; QLabel* m_noSelectionLabel; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectActionManager.h b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectActionManager.h index 84e18dee56..21d6bd21cd 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectActionManager.h +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectActionManager.h @@ -41,4 +41,4 @@ namespace EMStudio */ void OnAddNewObjectAndAddJoints(EMotionFX::Actor* actor, const QModelIndexList& selectedJoints, bool addChildJoints, QWidget* parent); }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.cpp index 42c1e637ba..364da6a5b5 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.cpp @@ -153,4 +153,4 @@ namespace EMStudio AZStd::to_lower(m_searchWidgetText.begin(), m_searchWidgetText.end()); Update(); } -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.h b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.h index 5f52af6a2d..7d1003d225 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.h +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWidget.h @@ -75,4 +75,4 @@ namespace EMStudio AZStd::vector<AZStd::string> m_selectedSimulatedObjectNames; AZStd::vector<AZStd::string> m_oldSelectedSimulatedObjectNames; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWindow.h b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWindow.h index 59af69ce4c..8385d96afd 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWindow.h +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWindow.h @@ -41,4 +41,4 @@ namespace EMStudio QPushButton* m_cancelButton = nullptr; bool m_accepted = false; }; -} // namespace EMStudio \ No newline at end of file +} // namespace EMStudio diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SkeletonOutliner/SkeletonOutlinerBus.h b/Gems/EMotionFX/Code/Source/Editor/Plugins/SkeletonOutliner/SkeletonOutlinerBus.h index a6231513c4..ed93f2c8d0 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SkeletonOutliner/SkeletonOutlinerBus.h +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SkeletonOutliner/SkeletonOutlinerBus.h @@ -58,4 +58,4 @@ namespace EMotionFX }; using SkeletonOutlinerNotificationBus = AZ::EBus<SkeletonOutlinerNotifications>; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorGoalNodeHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorGoalNodeHandler.h index 158641c9dc..6279efe654 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorGoalNodeHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorGoalNodeHandler.h @@ -67,4 +67,4 @@ namespace EMotionFX void WriteGUIValuesIntoProperty(size_t index, ActorGoalNodePicker* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; bool ReadValuesIntoGUI(size_t index, ActorGoalNodePicker* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorMorphTargetHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorMorphTargetHandler.h index 1c88649314..467398e766 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorMorphTargetHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/ActorMorphTargetHandler.h @@ -86,4 +86,4 @@ namespace EMotionFX ActorMultiMorphTargetHandler(); AZ::u32 GetHandlerName() const override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.cpp index 20ab047533..6a7887e908 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.cpp @@ -221,4 +221,4 @@ namespace EMotionFX } } // namespace EMotionFX -#include <Source/Editor/PropertyWidgets/moc_AnimGraphNodeHandler.cpp> \ No newline at end of file +#include <Source/Editor/PropertyWidgets/moc_AnimGraphNodeHandler.cpp> diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.h index 5e5807800f..34220bf2a1 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeHandler.h @@ -107,4 +107,4 @@ namespace EMotionFX AnimGraphStateIdHandler(); AZ::u32 GetHandlerName() const override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.cpp index 5cbc59899a..c6d84a53da 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.cpp @@ -120,4 +120,4 @@ namespace EMotionFX GUI->setText(instance.c_str()); return true; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.h index 1313247dd5..271dc6efe5 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphNodeNameHandler.h @@ -67,4 +67,4 @@ namespace EMotionFX protected: AnimGraphNode* m_node; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.cpp index 85325f5a9e..dc34a35ba2 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.cpp @@ -76,4 +76,4 @@ namespace EMotionFX GUI->InitializeParameterNames(instance); return true; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.h index 812f5415e3..7a13525b05 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphParameterMaskHandler.h @@ -45,4 +45,4 @@ namespace EMotionFX protected: ObjectAffectedByParameterChanges* m_object; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.cpp index b975ba7c6b..538c7221fb 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.cpp @@ -107,4 +107,4 @@ namespace EMotionFX GUI->SetTags(instance); return true; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.h index a5af7b4775..f6980e8e3d 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTagHandler.h @@ -62,4 +62,4 @@ namespace EMotionFX protected: AnimGraph* m_animGraph; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.h index 11546e774a..39fdfc0d13 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.h @@ -111,4 +111,4 @@ namespace EMotionFX protected: AnimGraphStateTransition* m_transition = nullptr; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendNParamWeightsHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendNParamWeightsHandler.h index 339bbd4c71..6d42610b64 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendNParamWeightsHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendNParamWeightsHandler.h @@ -207,4 +207,4 @@ namespace EMotionFX BlendNParamWeightContainerWidget* m_containerWidget = nullptr; AnimGraphNode* m_node = nullptr; }; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.cpp index f87d68ba83..a5288e1cfe 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.cpp @@ -134,4 +134,4 @@ namespace EMotionFX } } // namespace EMotionFX -#include <Source/Editor/PropertyWidgets/moc_BlendSpaceEvaluatorHandler.cpp> \ No newline at end of file +#include <Source/Editor/PropertyWidgets/moc_BlendSpaceEvaluatorHandler.cpp> diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.h index c2fb1dc82f..1b3f4b736c 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceEvaluatorHandler.h @@ -64,4 +64,4 @@ namespace EMotionFX void WriteGUIValuesIntoProperty(size_t index, BlendSpaceEvaluatorPicker* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; bool ReadValuesIntoGUI(size_t index, BlendSpaceEvaluatorPicker* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.cpp index 9b02c97691..6e3ba0d867 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.cpp @@ -133,4 +133,4 @@ namespace EMotionFX } } // namespace EMotionFX -#include <Source/Editor/PropertyWidgets/moc_BlendSpaceMotionHandler.cpp> \ No newline at end of file +#include <Source/Editor/PropertyWidgets/moc_BlendSpaceMotionHandler.cpp> diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.h index 354224e189..32ba81fa86 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendSpaceMotionHandler.h @@ -70,4 +70,4 @@ namespace EMotionFX private: BlendSpaceNode* m_blendSpaceNode; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.cpp index b42ff2ddb2..ce1a403ff6 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.cpp @@ -184,4 +184,4 @@ namespace EMotionFX return true; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.h index b29c6aaa26..7b7721ff16 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/BlendTreeRotationLimitHandler.h @@ -119,4 +119,4 @@ namespace EMotionFX // Used to set the values on the widget bool ReadValuesIntoGUI(size_t index, RotationLimitContainerWdget* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; }; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.cpp index e1cea17a49..7315f66ae9 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.cpp @@ -83,4 +83,4 @@ namespace EMotionFX } } -#include <Source/Editor/PropertyWidgets/moc_LODTreeSelectionHandler.cpp> \ No newline at end of file +#include <Source/Editor/PropertyWidgets/moc_LODTreeSelectionHandler.cpp> diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.h index 2c79ba8af5..5e7c333890 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/LODTreeSelectionHandler.h @@ -50,4 +50,4 @@ namespace EMotionFX }; } } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/MotionSetNameHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/MotionSetNameHandler.h index d9e8f20004..b1d1bc8a0a 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/MotionSetNameHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/MotionSetNameHandler.h @@ -50,4 +50,4 @@ namespace EMotionFX private: AZ::Data::Asset<Integration::MotionSetAsset>* m_motionSetAsset; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/PropertyWidgetAllocator.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/PropertyWidgetAllocator.h index 700ea0fd13..7ea96fee1c 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/PropertyWidgetAllocator.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/PropertyWidgetAllocator.h @@ -30,4 +30,4 @@ namespace EMotionFX } }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.cpp index 0e4f11c1b9..8eef76d43e 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.cpp @@ -61,4 +61,4 @@ namespace EMotionFX GUI->SetJointNames(instance); return true; } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.h index ede80e49b2..56cf73dff1 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/RagdollJointHandler.h @@ -37,4 +37,4 @@ namespace EMotionFX void WriteGUIValuesIntoProperty(size_t index, ActorJointPicker* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; bool ReadValuesIntoGUI(size_t index, ActorJointPicker* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectColliderTagHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectColliderTagHandler.h index 0f8cbc4abb..8101324c1a 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectColliderTagHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectColliderTagHandler.h @@ -99,4 +99,4 @@ namespace EMotionFX protected: SimulatedObject* m_simulatedObject = nullptr; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectSelectionHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectSelectionHandler.h index 71992317a6..a7c845f520 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectSelectionHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/SimulatedObjectSelectionHandler.h @@ -72,4 +72,4 @@ namespace EMotionFX void WriteGUIValuesIntoProperty(size_t index, SimulatedObjectPicker* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; bool ReadValuesIntoGUI(size_t index, SimulatedObjectPicker* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/TransitionStateFilterLocalHandler.h b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/TransitionStateFilterLocalHandler.h index 717fa5f8a2..2268e499ec 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/TransitionStateFilterLocalHandler.h +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/TransitionStateFilterLocalHandler.h @@ -76,4 +76,4 @@ namespace EMotionFX private: AnimGraphStateMachine* m_stateMachine; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectBus.h b/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectBus.h index b55658ae46..a062413eb3 100644 --- a/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectBus.h +++ b/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectBus.h @@ -33,4 +33,4 @@ namespace EMotionFX }; using SimulatedObjectRequestBus = AZ::EBus<SimulatedObjectRequests>; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectHelpers.cpp b/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectHelpers.cpp index 93bc0062ca..8ed793751a 100644 --- a/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectHelpers.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/SimulatedObjectHelpers.cpp @@ -104,4 +104,4 @@ namespace EMotionFX AZStd::string result; AZ_Error("EMotionFX", CommandSystem::GetCommandManager()->ExecuteCommandGroup(commandGroup, result), result.c_str()); } -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Editor/TagSelector.h b/Gems/EMotionFX/Code/Source/Editor/TagSelector.h index 7f101922a1..1071d8c0e4 100644 --- a/Gems/EMotionFX/Code/Source/Editor/TagSelector.h +++ b/Gems/EMotionFX/Code/Source/Editor/TagSelector.h @@ -51,4 +51,4 @@ namespace EMotionFX AZStd::vector<AZStd::string> m_tags; AzQtComponents::TagSelector* m_tagSelector = nullptr; }; -} // namespace EMotionFX \ No newline at end of file +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index d0b24cb203..518db289e2 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -68,6 +68,8 @@ namespace EMotionFX &actorSettings, ""); + assetData->ReleaseEMotionFXData(); + if (!assetData->m_emfxActor) { AZ_Error("EMotionFX", false, "Failed to initialize actor asset %s", asset.ToString<AZStd::string>().c_str()); @@ -77,7 +79,6 @@ namespace EMotionFX assetData->m_emfxActor->SetIsOwnedByRuntime(true); // Note: Render actor depends on the mesh asset, so we need to manually create it after mesh asset has been loaded. - return static_cast<bool>(assetData->m_emfxActor); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 82bb487d2e..a8b9746789 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,6 +90,7 @@ namespace EMotionFX } } + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast<bool>(assetData->m_emfxAnimGraph); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 2936076258..ca0f6d996d 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -36,6 +36,12 @@ namespace EMotionFX : AZ::Data::AssetData(id) {} + void ReleaseEMotionFXData() + { + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); + } + AZStd::vector<AZ::u8> m_emfxNativeData; }; diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index 6bcc572ec6..2d95066b13 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -47,6 +47,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index f437cea256..a49dd95986 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -232,6 +232,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); + assetData->ReleaseEMotionFXData(); return true; } diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.cpp index 9dabade61f..7b444d3970 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.cpp @@ -378,18 +378,36 @@ namespace EMotionFX } } + NodeIndexContainer AnimGraphComponent::s_emptyNodeIndexContainer = {}; const NodeIndexContainer& AnimGraphComponent::GetActiveStates() const { - const AZStd::shared_ptr<AnimGraphSnapshot> snapshot = m_animGraphInstance->GetSnapshot(); - AZ_Error("EMotionFX", snapshot, "Call GetActiveStates function but no snapshot is created for this instance."); - return snapshot->GetActiveNodes(); + if (m_animGraphInstance) + { + const AZStd::shared_ptr<AnimGraphSnapshot> snapshot = m_animGraphInstance->GetSnapshot(); + if (snapshot) + { + AZ_Warning("EMotionFX", false, "Call GetActiveStates function but no snapshot is created for this instance."); + return snapshot->GetActiveNodes(); + } + } + + return s_emptyNodeIndexContainer; } + MotionNodePlaytimeContainer AnimGraphComponent::s_emptyMotionNodePlaytimeContainer = {}; const MotionNodePlaytimeContainer& AnimGraphComponent::GetMotionPlaytimes() const { - const AZStd::shared_ptr<AnimGraphSnapshot> snapshot = m_animGraphInstance->GetSnapshot(); - AZ_Error("EMotionFX", snapshot, "Call GetActiveStates function but no snapshot is created for this instance."); - return snapshot->GetMotionNodePlaytimes(); + if (m_animGraphInstance) + { + const AZStd::shared_ptr<AnimGraphSnapshot> snapshot = m_animGraphInstance->GetSnapshot(); + if (snapshot) + { + AZ_Warning("EMotionFX", false, "Call GetActiveStates function but no snapshot is created for this instance."); + return snapshot->GetMotionNodePlaytimes(); + } + } + + return s_emptyMotionNodePlaytimeContainer; } void AnimGraphComponent::UpdateActorExternal(float deltatime) diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.h b/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.h index 37e6a57199..db4a2c62b9 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/Components/AnimGraphComponent.h @@ -155,7 +155,9 @@ namespace EMotionFX bool HasSnapshot() const override; void CreateSnapshot(bool isAuthoritative) override; void SetActiveStates(const NodeIndexContainer& activeStates) override; + static NodeIndexContainer s_emptyNodeIndexContainer; const NodeIndexContainer& GetActiveStates() const override; + static MotionNodePlaytimeContainer s_emptyMotionNodePlaytimeContainer; void SetMotionPlaytimes(const MotionNodePlaytimeContainer& motionNodePlaytimes) override; const MotionNodePlaytimeContainer& GetMotionPlaytimes() const override; void UpdateActorExternal(float deltatime) override; diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.cpp index d60ecf622e..2e0ca16af2 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.cpp @@ -43,6 +43,7 @@ namespace EMotionFX ->Field("BlendIn", &Configuration::m_blendInTime) ->Field("BlendOut", &Configuration::m_blendOutTime) ->Field("PlayOnActivation", &Configuration::m_playOnActivation) + ->Field("InPlace", &Configuration::m_inPlace) ; AZ::EditContext* editContext = serializeContext->GetEditContext(); @@ -61,7 +62,9 @@ namespace EMotionFX ->Attribute(AZ::Edit::Attributes::Min, 0.0f) ->DataElement(AZ::Edit::UIHandlers::Default, &Configuration::m_blendOutTime, "Blend Out Time", "Determines the blend out time in seconds") ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->DataElement(AZ::Edit::UIHandlers::Default, &Configuration::m_playOnActivation, "Play on active", "Playing animation immediately after activition.") + ->DataElement(AZ::Edit::UIHandlers::Default, &Configuration::m_playOnActivation, "Play on active", "Playing animation immediately after activation.") + ->DataElement(AZ::Edit::UIHandlers::Default, &Configuration::m_inPlace, "In-place", + "Plays the animation in-place and removes any positional and rotational changes from root joints.") ; } } @@ -128,6 +131,7 @@ namespace EMotionFX , m_blendInTime(0.0f) , m_blendOutTime(0.0f) , m_playOnActivation(true) + , m_inPlace(false) { } @@ -235,7 +239,7 @@ namespace EMotionFX void SimpleMotionComponent::PlayMotion() { - m_motionInstance = PlayMotionInternal(m_actorInstance.get(), m_configuration, /*deleteOnZeroWeight*/true, /*inPlace*/false); + m_motionInstance = PlayMotionInternal(m_actorInstance.get(), m_configuration, /*deleteOnZeroWeight*/true); } void SimpleMotionComponent::RemoveMotionInstanceFromActor(EMotionFX::MotionInstance* motionInstance) @@ -425,7 +429,7 @@ namespace EMotionFX return m_configuration.m_blendOutTime; } - EMotionFX::MotionInstance* SimpleMotionComponent::PlayMotionInternal(const EMotionFX::ActorInstance* actorInstance, const SimpleMotionComponent::Configuration& cfg, bool deleteOnZeroWeight, bool inPlace) + EMotionFX::MotionInstance* SimpleMotionComponent::PlayMotionInternal(const EMotionFX::ActorInstance* actorInstance, const SimpleMotionComponent::Configuration& cfg, bool deleteOnZeroWeight) { if (!actorInstance || !cfg.m_motionAsset.IsReady()) { @@ -439,6 +443,7 @@ namespace EMotionFX auto* motionAsset = cfg.m_motionAsset.GetAs<MotionAsset>(); if (!motionAsset) + { AZ_Error("EMotionFX", motionAsset, "Motion asset is not valid."); return nullptr; @@ -456,7 +461,7 @@ namespace EMotionFX info.mCanOverwrite = false; info.mBlendInTime = cfg.m_blendInTime; info.mBlendOutTime = cfg.m_blendOutTime; - info.mInPlace = inPlace; + info.mInPlace = cfg.m_inPlace; return actorInstance->GetMotionSystem()->PlayMotion(motionAsset->m_emfxMotion.get(), &info); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.h b/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.h index 4e3173a3b8..5f5066b9bb 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/Components/SimpleMotionComponent.h @@ -46,7 +46,7 @@ namespace EMotionFX struct Configuration { AZ_TYPE_INFO(Configuration, "{DA661C5F-E79E-41C3-B055-5F5A4E353F84}") - Configuration(); + Configuration(); AZ::Data::Asset<MotionAsset> m_motionAsset; ///< Assigned motion asset bool m_loop; ///< Toggles looping of the motion @@ -56,7 +56,8 @@ namespace EMotionFX float m_playspeed; ///< Determines the rate at which the motion is played float m_blendInTime; ///< Determines the blend in time in seconds. float m_blendOutTime; ///< Determines the blend out time in seconds. - bool m_playOnActivation; ///< Determines if the motion should be played immediately + bool m_playOnActivation; ///< Determines if the motion should be played immediately + bool m_inPlace; ///< Determines if the motion should be played in-place. static void Reflect(AZ::ReflectContext* context); }; @@ -121,7 +122,7 @@ namespace EMotionFX void RemoveMotionInstanceFromActor(EMotionFX::MotionInstance* motionInstance); - static EMotionFX::MotionInstance* PlayMotionInternal(const EMotionFX::ActorInstance* actorInstance, const SimpleMotionComponent::Configuration& cfg, bool deleteOnZeroWeight, bool inPlace); + static EMotionFX::MotionInstance* PlayMotionInternal(const EMotionFX::ActorInstance* actorInstance, const SimpleMotionComponent::Configuration& cfg, bool deleteOnZeroWeight); Configuration m_configuration; ///< Component configuration. EMotionFXPtr<EMotionFX::ActorInstance> m_actorInstance; ///< Associated actor instance (retrieved from Actor Component). diff --git a/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.cpp index 228a82856d..1d09b3e255 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.cpp @@ -170,7 +170,7 @@ namespace EMotionFX // The Editor allows scrubbing back and forth on animation blending transitions, so don't delete // motion instances if it's blend weight is zero. // The Editor preview should preview the motion in place to prevent off center movement. - m_motionInstance = SimpleMotionComponent::PlayMotionInternal(m_actorInstance, m_configuration, /*deleteOnZeroWeight*/false, /*inPlace*/true); + m_motionInstance = SimpleMotionComponent::PlayMotionInternal(m_actorInstance, m_configuration, /*deleteOnZeroWeight*/false); } } diff --git a/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.h b/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.h index 2ee9cbd328..e5f1dadf63 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/Editor/Components/EditorSimpleMotionComponent.h @@ -112,4 +112,4 @@ namespace EMotionFX EMotionFX::MotionInstance* m_lastMotionInstance; ///< Last active motion instance, kept alive for blending. }; } -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.cpp index 64aff0f8d2..e3b41d536c 100644 --- a/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.cpp @@ -84,4 +84,4 @@ namespace EMotionFX } } // Pipeline } // EMotionFX -#endif \ No newline at end of file +#endif diff --git a/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.h b/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.h index 03767177f2..35e1ad0cfb 100644 --- a/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/System/PipelineComponent.h @@ -46,4 +46,4 @@ namespace EMotionFX }; } // Pipeline } // EMotionFX -#endif \ No newline at end of file +#endif diff --git a/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.cpp b/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.cpp index a6ab6abd7c..39f674b89a 100644 --- a/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.cpp +++ b/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.cpp @@ -89,4 +89,4 @@ namespace EMotionFX } m_numTransitionsEnded++; } -} // EMotionFX \ No newline at end of file +} // EMotionFX diff --git a/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.h b/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.h index a379803f2b..d4de3fc0f1 100644 --- a/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.h +++ b/Gems/EMotionFX/Code/Tests/AnimGraphEventHandlerCounter.h @@ -43,4 +43,4 @@ namespace EMotionFX int m_numTransitionsStarted = 0; int m_numTransitionsEnded = 0; }; -} \ No newline at end of file +} diff --git a/Gems/EMotionFX/Code/Tests/AnimGraphNetworkingBusTests.cpp b/Gems/EMotionFX/Code/Tests/AnimGraphNetworkingBusTests.cpp new file mode 100644 index 0000000000..2c94a9689e --- /dev/null +++ b/Gems/EMotionFX/Code/Tests/AnimGraphNetworkingBusTests.cpp @@ -0,0 +1,65 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <AzFramework/Components/TransformComponent.h> +#include <Include/Integration/AnimGraphNetworkingBus.h> +#include <Integration/Components/ActorComponent.h> +#include <Integration/Components/AnimGraphComponent.h> +#include <Tests/Integration/EntityComponentFixture.h> + +namespace EMotionFX +{ + class AnimGraphNetworkingBusTests + : public EntityComponentFixture + { + public: + void SetUp() override + { + EntityComponentFixture::SetUp(); + + m_entity = AZStd::make_unique<AZ::Entity>(); + m_entityId = AZ::EntityId(740216387); + m_entity->SetId(m_entityId); + + m_entity->CreateComponent<AzFramework::TransformComponent>(); + m_entity->CreateComponent<Integration::ActorComponent>(); + auto animGraphComponent = m_entity->CreateComponent<Integration::AnimGraphComponent>(); + + m_entity->Init(); + + m_entity->Activate(); + AnimGraphInstance* animGraphInstance = animGraphComponent->GetAnimGraphInstance(); + EXPECT_EQ(animGraphInstance, nullptr) << "Expecting an invalid anim graph instance as no asset has been set."; + } + + void TearDown() override + { + m_entity->Deactivate(); + EntityComponentFixture::TearDown(); + } + + AZ::EntityId m_entityId; + AZStd::unique_ptr<AZ::Entity> m_entity; + }; + + TEST_F(AnimGraphNetworkingBusTests, AnimGraphNetworkingBus_GetActiveStates_Test) + { + NodeIndexContainer result; + EMotionFX::AnimGraphComponentNetworkRequestBus::EventResult(result, m_entityId, &EMotionFX::AnimGraphComponentNetworkRequestBus::Events::GetActiveStates); + } + + TEST_F(AnimGraphNetworkingBusTests, AnimGraphNetworkingBus_GetMotionPlaytimes_Test) + { + MotionNodePlaytimeContainer result; + EMotionFX::AnimGraphComponentNetworkRequestBus::EventResult(result, m_entityId, &EMotionFX::AnimGraphComponentNetworkRequestBus::Events::GetMotionPlaytimes); + } +} // end namespace EMotionFX diff --git a/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.cpp b/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.cpp index 57109acb2e..941b5e4245 100644 --- a/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.cpp +++ b/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.cpp @@ -24,7 +24,6 @@ namespace EMotionFX const AZStd::vector<AZ::Vector3>& vertices, const AZStd::vector<AZ::Vector3>& normals, const AZStd::vector<AZ::Vector2>& uvs, - const AZStd::vector<AZ::Color>& clothData, const AZStd::vector<VertexSkinInfluences>& skinningInfo ) { const AZ::u32 vertCount = aznumeric_cast<AZ::u32>(vertices.size()); @@ -90,16 +89,6 @@ namespace EMotionFX uvsLayer->ResetToOriginalData(); } - // The cloth layer. - EMotionFX::VertexAttributeLayerAbstractData* clothLayer = nullptr; - if (!clothData.empty() && clothData.size() == vertices.size()) - { - clothLayer = EMotionFX::VertexAttributeLayerAbstractData::Create(vertCount, EMotionFX::Mesh::ATTRIB_CLOTH_DATA, sizeof(AZ::u32), false); - mesh->AddVertexAttributeLayer(clothLayer); - AZStd::transform(clothData.begin(), clothData.end(), static_cast<AZ::u32*>(clothLayer->GetOriginalData()), [](const AZ::Color& color) { return color.ToU32(); }); - clothLayer->ResetToOriginalData(); - } - auto* subMesh = EMotionFX::SubMesh::Create( /*parentMesh=*/ mesh, /*startVertex=*/ 0, diff --git a/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.h b/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.h index 95b28d4cd6..365469b979 100644 --- a/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.h +++ b/Gems/EMotionFX/Code/Tests/TestAssetCode/MeshFactory.h @@ -33,7 +33,6 @@ namespace EMotionFX const AZStd::vector<AZ::Vector3>& vertices, const AZStd::vector<AZ::Vector3>& normals, const AZStd::vector<AZ::Vector2>& uvs = {}, - const AZStd::vector<AZ::Color>& clothData = {}, const AZStd::vector<VertexSkinInfluences>& skinningInfo = {} ); }; diff --git a/Gems/EMotionFX/Code/emotionfx_tests_files.cmake b/Gems/EMotionFX/Code/emotionfx_tests_files.cmake index fff931d98d..7017975a98 100644 --- a/Gems/EMotionFX/Code/emotionfx_tests_files.cmake +++ b/Gems/EMotionFX/Code/emotionfx_tests_files.cmake @@ -22,6 +22,7 @@ set(FILES Tests/AnimGraphActionCommandTests.cpp Tests/AnimGraphActionTests.cpp Tests/AnimGraphComponentBusTests.cpp + Tests/AnimGraphNetworkingBusTests.cpp Tests/AnimGraphCopyPasteTests.cpp Tests/AnimGraphDeferredInitTests.cpp Tests/AnimGraphEventHandlerCounter.h diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp index 11ac32cede..53f5be5bc4 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp @@ -550,7 +550,7 @@ namespace EditorPythonBindings } if (appended) { - ExecuteByString(pathAppend.c_str(), true); + ExecuteByString(pathAppend.c_str(), false); return true; } return false; @@ -653,8 +653,8 @@ namespace EditorPythonBindings } else { - // something when wrong with executing the test script - AZ::Debug::Trace::Terminate(1); + // something went wrong with executing the test script + AZ::Debug::Trace::Terminate(0xF); } } diff --git a/Gems/ExpressionEvaluation/Code/Source/ExpressionEngine/Utils.h b/Gems/ExpressionEvaluation/Code/Source/ExpressionEngine/Utils.h index 25a9659fb6..1ff508e905 100644 --- a/Gems/ExpressionEvaluation/Code/Source/ExpressionEngine/Utils.h +++ b/Gems/ExpressionEvaluation/Code/Source/ExpressionEngine/Utils.h @@ -29,4 +29,4 @@ namespace ExpressionEvaluation return defaultValue; } }; -} \ No newline at end of file +} diff --git a/Gems/FastNoise/Code/Include/FastNoise/Ebuses/FastNoiseGradientRequestBus.h b/Gems/FastNoise/Code/Include/FastNoise/Ebuses/FastNoiseGradientRequestBus.h index 39f7996f21..86eeb2a79d 100644 --- a/Gems/FastNoise/Code/Include/FastNoise/Ebuses/FastNoiseGradientRequestBus.h +++ b/Gems/FastNoise/Code/Include/FastNoise/Ebuses/FastNoiseGradientRequestBus.h @@ -54,4 +54,4 @@ namespace FastNoiseGem }; using FastNoiseGradientRequestBus = AZ::EBus<FastNoiseGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.cpp b/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.cpp index e99b691012..4e70d1d4cf 100644 --- a/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.cpp +++ b/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.cpp @@ -62,4 +62,4 @@ namespace FastNoiseGem return ConfigurationChanged(); } -} //namespace FastNoiseGem \ No newline at end of file +} //namespace FastNoiseGem diff --git a/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.h b/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.h index 06cc22e575..316bddc26c 100644 --- a/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.h +++ b/Gems/FastNoise/Code/Source/EditorFastNoiseGradientComponent.h @@ -37,4 +37,4 @@ namespace FastNoiseGem private: AZ::Crc32 OnGenerateRandomSeed(); }; -} //namespace FastNoiseGem \ No newline at end of file +} //namespace FastNoiseGem diff --git a/Gems/FastNoise/Code/Source/FastNoiseEditorModule.cpp b/Gems/FastNoise/Code/Source/FastNoiseEditorModule.cpp index 1b98710d17..aa0be4a8de 100644 --- a/Gems/FastNoise/Code/Source/FastNoiseEditorModule.cpp +++ b/Gems/FastNoise/Code/Source/FastNoiseEditorModule.cpp @@ -32,4 +32,4 @@ namespace FastNoiseGem } } -AZ_DECLARE_MODULE_CLASS(Gem_FastNoiseEditor, FastNoiseGem::FastNoiseEditorModule) \ No newline at end of file +AZ_DECLARE_MODULE_CLASS(Gem_FastNoiseEditor, FastNoiseGem::FastNoiseEditorModule) diff --git a/Gems/FastNoise/Code/Source/FastNoiseEditorModule.h b/Gems/FastNoise/Code/Source/FastNoiseEditorModule.h index 4012eda95e..e974128677 100644 --- a/Gems/FastNoise/Code/Source/FastNoiseEditorModule.h +++ b/Gems/FastNoise/Code/Source/FastNoiseEditorModule.h @@ -28,4 +28,4 @@ namespace FastNoiseGem AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/FastNoise/Code/Source/FastNoiseGradientComponent.h b/Gems/FastNoise/Code/Source/FastNoiseGradientComponent.h index c53f00ff7f..38830a79e7 100644 --- a/Gems/FastNoise/Code/Source/FastNoiseGradientComponent.h +++ b/Gems/FastNoise/Code/Source/FastNoiseGradientComponent.h @@ -128,4 +128,4 @@ namespace FastNoiseGem template <typename TValueType, TValueType FastNoiseGradientConfig::*TConfigMember, void (FastNoise::*TMethod)(TValueType)> void SetConfigValue(TValueType value); }; -} //namespace FastNoiseGem \ No newline at end of file +} //namespace FastNoiseGem diff --git a/Gems/FastNoise/Code/Source/FastNoiseModule.h b/Gems/FastNoise/Code/Source/FastNoiseModule.h index 411397af31..7c1791499f 100644 --- a/Gems/FastNoise/Code/Source/FastNoiseModule.h +++ b/Gems/FastNoise/Code/Source/FastNoiseModule.h @@ -28,4 +28,4 @@ namespace FastNoiseGem AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/FastNoise/Code/fastnoise_editor_shared_files.cmake b/Gems/FastNoise/Code/fastnoise_editor_shared_files.cmake index 0f9a330c0a..10a0efc69f 100644 --- a/Gems/FastNoise/Code/fastnoise_editor_shared_files.cmake +++ b/Gems/FastNoise/Code/fastnoise_editor_shared_files.cmake @@ -14,4 +14,4 @@ set(FILES Source/FastNoiseModule.cpp Source/FastNoiseEditorModule.cpp Source/FastNoiseEditorModule.h -) \ No newline at end of file +) diff --git a/Gems/GameEffectSystem/Assets/GameEffectsSystem_Dependencies.xml b/Gems/GameEffectSystem/Assets/GameEffectsSystem_Dependencies.xml index cee31790d7..0e958e3c7d 100644 --- a/Gems/GameEffectSystem/Assets/GameEffectsSystem_Dependencies.xml +++ b/Gems/GameEffectSystem/Assets/GameEffectsSystem_Dependencies.xml @@ -1,3 +1,3 @@ <EngineDependencies versionnumber="1.0.0"> <Dependency path="scripts/effects/gameeffects.xml" optional="true" /> -</EngineDependencies> \ No newline at end of file +</EngineDependencies> diff --git a/Gems/GameEffectSystem/Code/source/GameEffectSystem_precompiled.cpp b/Gems/GameEffectSystem/Code/source/GameEffectSystem_precompiled.cpp index f546848431..9a1af37a08 100644 --- a/Gems/GameEffectSystem/Code/source/GameEffectSystem_precompiled.cpp +++ b/Gems/GameEffectSystem/Code/source/GameEffectSystem_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "GameEffectSystem_precompiled.h" \ No newline at end of file +#include "GameEffectSystem_precompiled.h" diff --git a/Gems/GameState/Code/CMakeLists.txt b/Gems/GameState/Code/CMakeLists.txt index 34db30fdb5..d57cf8feed 100644 --- a/Gems/GameState/Code/CMakeLists.txt +++ b/Gems/GameState/Code/CMakeLists.txt @@ -63,4 +63,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_googletest( NAME Gem::GameState.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Gems/GameStateSamples/Code/Include/Platform/Android/GameStateSamples/GameStateSamples_Traits_Platform.h b/Gems/GameStateSamples/Code/Include/Platform/Android/GameStateSamples/GameStateSamples_Traits_Platform.h index 86a13a4f6b..b5f65f7d98 100644 --- a/Gems/GameStateSamples/Code/Include/Platform/Android/GameStateSamples/GameStateSamples_Traits_Platform.h +++ b/Gems/GameStateSamples/Code/Include/Platform/Android/GameStateSamples/GameStateSamples_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <GameStateSamples/GameStateSamples_Traits_Android.h> \ No newline at end of file +#include <GameStateSamples/GameStateSamples_Traits_Android.h> diff --git a/Gems/GameStateSamples/Code/Include/Platform/Linux/GameStateSamples/GameStateSamples_Traits_Platform.h b/Gems/GameStateSamples/Code/Include/Platform/Linux/GameStateSamples/GameStateSamples_Traits_Platform.h index 18ac50dd25..0663021eb3 100644 --- a/Gems/GameStateSamples/Code/Include/Platform/Linux/GameStateSamples/GameStateSamples_Traits_Platform.h +++ b/Gems/GameStateSamples/Code/Include/Platform/Linux/GameStateSamples/GameStateSamples_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <GameStateSamples/GameStateSamples_Traits_Linux.h> \ No newline at end of file +#include <GameStateSamples/GameStateSamples_Traits_Linux.h> diff --git a/Gems/GameStateSamples/Code/Include/Platform/Mac/GameStateSamples/GameStateSamples_Traits_Platform.h b/Gems/GameStateSamples/Code/Include/Platform/Mac/GameStateSamples/GameStateSamples_Traits_Platform.h index feb815616a..80f43e65b0 100644 --- a/Gems/GameStateSamples/Code/Include/Platform/Mac/GameStateSamples/GameStateSamples_Traits_Platform.h +++ b/Gems/GameStateSamples/Code/Include/Platform/Mac/GameStateSamples/GameStateSamples_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <GameStateSamples/GameStateSamples_Traits_Mac.h> \ No newline at end of file +#include <GameStateSamples/GameStateSamples_Traits_Mac.h> diff --git a/Gems/GameStateSamples/Code/Include/Platform/Windows/GameStateSamples/GameStateSamples_Traits_Platform.h b/Gems/GameStateSamples/Code/Include/Platform/Windows/GameStateSamples/GameStateSamples_Traits_Platform.h index 5b6a749ff0..3a3650e5db 100644 --- a/Gems/GameStateSamples/Code/Include/Platform/Windows/GameStateSamples/GameStateSamples_Traits_Platform.h +++ b/Gems/GameStateSamples/Code/Include/Platform/Windows/GameStateSamples/GameStateSamples_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <GameStateSamples/GameStateSamples_Traits_Windows.h> \ No newline at end of file +#include <GameStateSamples/GameStateSamples_Traits_Windows.h> diff --git a/Gems/GameStateSamples/Code/Include/Platform/iOS/GameStateSamples/GameStateSamples_Traits_Platform.h b/Gems/GameStateSamples/Code/Include/Platform/iOS/GameStateSamples/GameStateSamples_Traits_Platform.h index 26b98af665..8809c024ea 100644 --- a/Gems/GameStateSamples/Code/Include/Platform/iOS/GameStateSamples/GameStateSamples_Traits_Platform.h +++ b/Gems/GameStateSamples/Code/Include/Platform/iOS/GameStateSamples/GameStateSamples_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <GameStateSamples/GameStateSamples_Traits_iOS.h> \ No newline at end of file +#include <GameStateSamples/GameStateSamples_Traits_iOS.h> diff --git a/Gems/Gestures/Code/CMakeLists.txt b/Gems/Gestures/Code/CMakeLists.txt index fe0fd9d98b..677886c0ed 100644 --- a/Gems/Gestures/Code/CMakeLists.txt +++ b/Gems/Gestures/Code/CMakeLists.txt @@ -20,6 +20,9 @@ ly_add_target( PUBLIC Include BUILD_DEPENDENCIES + PUBLIC + Gem::Atom_RPI.Public + AZ::AtomCore PRIVATE Legacy::CryCommon ) @@ -63,4 +66,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_googletest( NAME Gem::Gestures.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Gems/Gestures/Code/Include/Gestures/IGestureRecognizer.h b/Gems/Gestures/Code/Include/Gestures/IGestureRecognizer.h index 3f71cd4b62..4b5b7726d8 100644 --- a/Gems/Gestures/Code/Include/Gestures/IGestureRecognizer.h +++ b/Gems/Gestures/Code/Include/Gestures/IGestureRecognizer.h @@ -19,6 +19,9 @@ #include <AzFramework/Input/Devices/Mouse/InputDeviceMouse.h> #include <AzFramework/Input/Devices/Touch/InputDeviceTouch.h> +#include <Atom/RPI.Public/ViewportContext.h> +#include <Atom/RPI.Public/ViewportContextBus.h> + //////////////////////////////////////////////////////////////////////////////////////////////////// namespace Gestures { @@ -184,8 +187,16 @@ namespace Gestures return; } - const AZ::Vector2 eventScreenPositionPixels = positionData2D->ConvertToScreenSpaceCoordinates(static_cast<float>(gEnv->pRenderer->GetWidth()), - static_cast<float>(gEnv->pRenderer->GetHeight())); + auto atomViewportRequests = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); + AZ::RPI::ViewportContextPtr viewportContext = atomViewportRequests->GetDefaultViewportContext(); + if (viewportContext == nullptr) + { + return; + } + + AzFramework::WindowSize windowSize = viewportContext->GetViewportSize(); + const AZ::Vector2 eventScreenPositionPixels = positionData2D->ConvertToScreenSpaceCoordinates(static_cast<float>(windowSize.m_width), + static_cast<float>(windowSize.m_height)); if (inputChannel.IsStateBegan()) { o_hasBeenConsumed = OnPressedEvent(eventScreenPositionPixels, pointerIndex); @@ -225,8 +236,16 @@ namespace Gestures //////////////////////////////////////////////////////////////////////////////////////////////// inline void IRecognizer::UpdateNormalizedPositionAndDeltaFromScreenPosition(const AZ::Vector2& screenPositionPixels) { - const AZ::Vector2 normalizedPosition(screenPositionPixels.GetX() / static_cast<float>(gEnv->pRenderer->GetWidth()), - screenPositionPixels.GetY() / static_cast<float>(gEnv->pRenderer->GetHeight())); + auto atomViewportRequests = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); + AZ::RPI::ViewportContextPtr viewportContext = atomViewportRequests->GetDefaultViewportContext(); + if (viewportContext == nullptr) + { + return; + } + + AzFramework::WindowSize windowSize = viewportContext->GetViewportSize(); + const AZ::Vector2 normalizedPosition(screenPositionPixels.GetX() / static_cast<float>(windowSize.m_width), + screenPositionPixels.GetY() / static_cast<float>(windowSize.m_height)); AzFramework::InputChannel::PositionData2D::UpdateNormalizedPositionAndDelta(normalizedPosition); } } diff --git a/Gems/Gestures/Code/Mocks/IRecognizerMock.h b/Gems/Gestures/Code/Mocks/IRecognizerMock.h index 7beabd9c14..42331bd329 100644 --- a/Gems/Gestures/Code/Mocks/IRecognizerMock.h +++ b/Gems/Gestures/Code/Mocks/IRecognizerMock.h @@ -26,4 +26,4 @@ namespace Gestures MOCK_METHOD2(OnReleasedEvent, bool(const Vec2&screenPositionPixels, uint32_t pointerIndex)); }; -} \ No newline at end of file +} diff --git a/Gems/Gestures/Code/Source/Gestures_precompiled.cpp b/Gems/Gestures/Code/Source/Gestures_precompiled.cpp index bcf6550755..f0f3900ac9 100644 --- a/Gems/Gestures/Code/Source/Gestures_precompiled.cpp +++ b/Gems/Gestures/Code/Source/Gestures_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Gestures_precompiled.h" \ No newline at end of file +#include "Gestures_precompiled.h" diff --git a/Gems/Gestures/Code/Tests/GestureRecognizerClickOrTapTests.cpp b/Gems/Gestures/Code/Tests/GestureRecognizerClickOrTapTests.cpp index 789383277c..cf4770c1cc 100644 --- a/Gems/Gestures/Code/Tests/GestureRecognizerClickOrTapTests.cpp +++ b/Gems/Gestures/Code/Tests/GestureRecognizerClickOrTapTests.cpp @@ -122,4 +122,4 @@ TEST_F(SimpleTests, Tap_MoveOutsideLimits_NotRecognized) MouseUpAt(mockRecognizer, 0.5f); ASSERT_EQ(0, mockRecognizer.m_count); -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Assets/Editor/Icons/Components/Gradient.svg b/Gems/GradientSignal/Assets/Editor/Icons/Components/Gradient.svg index 06209695f6..c28bcc82df 100644 --- a/Gems/GradientSignal/Assets/Editor/Icons/Components/Gradient.svg +++ b/Gems/GradientSignal/Assets/Editor/Icons/Components/Gradient.svg @@ -66,4 +66,4 @@ <polygon id="Path-Copy-49" fill="#D04160" points="21 13 23 13 23 15 21 15"></polygon> <polygon id="Path-Copy-53" fill="#D04160" points="21 15 23 15 23 17 21 17"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GradientSignal/Assets/Editor/Icons/Components/GradientModifier.svg b/Gems/GradientSignal/Assets/Editor/Icons/Components/GradientModifier.svg index daf5fa4d38..7fcb31a2a4 100644 --- a/Gems/GradientSignal/Assets/Editor/Icons/Components/GradientModifier.svg +++ b/Gems/GradientSignal/Assets/Editor/Icons/Components/GradientModifier.svg @@ -8,4 +8,4 @@ <path d="M4.06499057,13.4583309 C4.68568627,12.9256661 5.53729958,12.2472212 6.70688177,12.2472212 C7.48660323,12.2472212 8.42186043,12.6509245 9.51265337,13.4583309 C10.1656159,12.6509245 10.9663009,12.2472212 11.9147083,12.2472212 C12.8631157,12.2472212 13.6920095,12.6442211 14.4013899,13.4382208 C15.447479,12.6442211 16.3908247,12.2472212 17.231427,12.2472212 C18.4923303,12.2472212 19.0878809,12.7782064 19.9350094,13.4850428 C19.9350094,10.2447077 17.121932,6.23879932 12.6377997,6.23879932 C12.3069055,6.23879932 11.9147083,6.23879932 11.37559,6.23879932 C8.08749857,6.23879932 4.06499057,8.87677068 4.06499057,13.4583309 Z" id="Path-48" fill="#D04160"></path> <path d="M12.9432575,14.4506417 C12.9432575,15.1921693 12.9432575,17.9349906 12.9432575,19.6280258 C12.9432575,21.321061 11.8802698,22.702033 10.4350335,22.702033 C8.9897972,22.702033 9.73203462,22.702033 9.30706659,22.702033 C8.06189692,22.702033 6.74671725,21.3377506 6.74671725,20.2078226 C6.74671725,20.0934976 6.74671725,20.2059582 6.74671725,19.7592882 C6.74671725,19.3126181 6.87175798,18.9731257 7.48840038,18.9731257 C8.10504278,18.9731257 8.17555313,19.6563439 8.17555313,19.9968513 C8.17555313,20.3373588 8.9255005,21.1604653 9.46974851,21.1610141 C10.0139965,21.1615628 9.622862,21.1613752 10.1078755,21.1604653 C10.5928891,21.1595554 11.3536399,20.7293311 11.3536399,19.7592882 C11.3536399,18.7892452 11.3536399,14.7598693 11.3536399,14.4506417 C11.3536399,14.1414141 11.5668004,13.4850428 12.0438468,13.4850428 C12.5208932,13.4850428 12.1751181,13.4850428 12.3354788,13.4850428 C12.4958394,13.4850428 12.9432575,13.7091142 12.9432575,14.4506417 Z" id="Path-49" fill="#D04160"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/Gradient.svg b/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/Gradient.svg index 7439facd68..daa0d83fc4 100644 --- a/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/Gradient.svg +++ b/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/Gradient.svg @@ -22,4 +22,4 @@ </g> <path d="M21,15 L21,13 L19,13 L19,11 L17,11 L17,9 L19,9 L19,7 L21,7 L21,5 L19,5 L19,3 L17,3 L17,1 L19,1 L21,1 C21.4201027,1 21.753436,1 22,1 C22.369846,1 23,1.51450797 23,2 C23,2.32366135 23,2.65699468 23,3 L23,5 L23,7 L23,9 L23,11 L23,13 L23,15 L23,17 L23,19 L23,21 L21,21 L21,21.0049147 L23,21.0049147 C23,21.34792 23,21.6812533 23,22.0049147 C23,22.4904067 22.369846,23.0049147 22,23.0049147 C21.753436,23.0049147 21.4201027,23.0049147 21,23.0049147 L21,23 L19,23 L17,23 L17,21 L19,21 L19,19 L17,19 L17,21 L15,21 L15,19 L13,19 L13,17 L15,17 L15,15 L17,15 L17,17 L18.9995284,17 L18.9995284,15 L17,15 L17,13 L19,13 L19,15 L20.9995284,15 L20.9995284,17 L21,15 Z M17,5 L15,5 L15,3 L17,3 L17,5 L19,5 L19,7 L17,7 L17,9 L15,9 L15,7 L13,7 L13,5 L15,5 Z M14.9985099,13 L14.9985099,11 L13,11 L13,9 L15,9 L15,11 L16.9985099,11 L16.9985099,13 L15,13 L15,15 L13,15 L13,13 L14.9985099,13 Z M9,21.0049147 L7,21.0049147 L7,23 L5,23 L5,21 L7,21 L7,19.0049147 L9,19.0049147 L9,21 L11,21 L11,23 L9,23 L9,21.0049147 Z M9,4.99508535 L11,4.99508535 L11,6.99508535 L9,6.99508535 L9,5 L7,5 L7,3 L9,3 L9,4.99508535 Z M3,19 L5,19 L5,21 L3,21 L3,19 Z M5,1 L7,1 L7,3 L5,3 L5,1 Z M1,7 L3,7 L3,9 L1,9 L1,7 Z M1.00047156,15 L3.00047156,15 L3.00047156,17 L1.00047156,17 L1.00047156,15 Z M3,3 L5,3 L5,5 L3,5 L3,3 Z M5,15 L7,15 L7,17 L5,17 L5,15 Z M9,1 L11,1 L11,3 L9,3 L9,1 Z M9,17 L11,17 L11,19 L9,19 L9,17 Z M9,13 L11,13 L11,15 L9,15 L9,13 Z M5,7 L7,7 L7,9 L5,9 L5,7 Z M3.00047156,11 L5.00047156,11 L5.00047156,13 L3.00047156,13 L3.00047156,11 Z M7,13 L7,11 L9,11 L9,13 L7,13 Z M9,9 L11,9 L11,11 L9,11 L9,9 Z M11,7 L13,7 L13,9 L11,9 L11,7 Z M11,15 L13,15 L13,17 L11,17 L11,15 Z M13,21 L15,21 L15,23 L13,23 L13,21 Z M13,1 L15,1 L15,3 L13,3 L13,1 Z M3,1 L3,3 L1,3 C1,2.65699468 1,2.32366135 1,2 C1,1.51450797 1.63015401,1 2,1 C2.24656399,1 2.57989733,1 3,1 Z M3,23.0049147 C2.57989733,23.0049147 2.24656399,23.0049147 2,23.0049147 C1.63015401,23.0049147 1,22.4904067 1,22.0049147 C1,21.6812533 1,21.34792 1,21.0049147 L3,21.0049147 L3,23.0049147 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/GradientModifier.svg b/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/GradientModifier.svg index 2664e588c7..d2b151b8cd 100644 --- a/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/GradientModifier.svg +++ b/Gems/GradientSignal/Assets/Editor/Icons/Components/Viewport/GradientModifier.svg @@ -22,4 +22,4 @@ </g> <path d="M13,4.90237112 C12.6723149,4.87038395 12.3345657,4.85376711 11.9867518,4.85376711 C11.6476316,4.85376711 11.3187503,4.8661135 11,4.89002548 L11,3 L9,3 L9,5 L7,5 L7,3 L5,3 L5,1 L7,1 L9,1 L11,1 L13,1 L15,1 L17,1 L19,1 L19,3 L17,3 L15,3 L13,3 L13,4.90237112 Z M5,7.52877515 C4.56985817,7.98652039 4.21137255,8.48257286 3.92220571,9 L3,9 L3,7 L5,7 L5,5 L7,5 L7,5.99959675 C6.21357577,6.42361924 5.54852485,6.94504993 5,7.52877515 L5,7 L5,7.52877515 Z M19.6741167,9 C19.0222693,7.96287783 18.1309227,7.00542867 17,6.27249828 L17,5.00047156 L15,5.00047156 L15,3.00047156 L17,3.00047156 L17,5 L19,5 L19,7 L21,7 L21,9 L19.6741167,9 Z M21,13.3176313 C21.0016365,13.3159559 21.0032747,13.3142794 21.0049147,13.3126018 C21.0049147,13.2310653 21.0032765,13.1487249 21,13.0656625 L21,13 L23,13 L23,15 L21.0049147,15 L21.0049147,17 L23,17 L23,19 L21,19 L21,17 L20.0049147,17 L20.0049147,15 L21,15 L21,13.3176313 Z M9,23 L7,23 L9,23 Z M5.00047156,13 L5.00047156,15 L4.99508535,15 L4.99508535,13 L5.00047156,13 Z M21.0049147,3 L21.0049147,5 L23,5 L23,7 L21,7 L21,5 L19.0049147,5 L19.0049147,3 L19.0049147,1 L21.0049147,1 L23.0049147,1 L23.0049147,3 L21.0049147,3 Z M2.99508535,1 L4.99508535,1 L4.99508535,3 L5,3 L5,5 L3,5 L3,3.00047156 L1,3.00047156 L1,1.00047156 L2.99508535,1.00047156 L2.99508535,1 Z M20.0049147,21 L20.0049147,19 L21,19 L21,21 L20.0049147,21 Z M1,19 L1,17 L3,17 L3,19 L1,19 Z M22,23 L22,21 L23,21 L23,23 L22,23 Z M1,23 L1,21 L2,21 L2,23 L1,23 Z M3,21 L3,19 L4,19 L4,21 L3,21 Z M3,17 L3,15 L4,15 L4,17 L3,17 Z M1,15 L1,13 L3,13 L3,15 L1,15 Z M21,11 L21,9 L23,9 L23,11 L21,11 Z M1,11 L1,9 L3,9 L3,11 L1,11 Z M1,7 L1,5 L3,5 L3,7 L1,7 Z M4.06499057,13.4583309 C4.06499057,8.87677068 8.08749857,6.23879932 11.37559,6.23879932 C11.9147083,6.23879932 12.3069055,6.23879932 12.6377997,6.23879932 C17.121932,6.23879932 19.9350094,10.2447077 19.9350094,13.4850428 C19.0878809,12.7782064 18.4923303,12.2472212 17.231427,12.2472212 C16.3908247,12.2472212 15.447479,12.6442211 14.4013899,13.4382208 C13.6920095,12.6442211 12.8631157,12.2472212 11.9147083,12.2472212 C10.9663009,12.2472212 10.1656159,12.6509245 9.51265337,13.4583309 C8.42186043,12.6509245 7.48660323,12.2472212 6.70688177,12.2472212 C5.53729958,12.2472212 4.68568627,12.9256661 4.06499057,13.4583309 Z M12.9432575,14.4506417 C12.9432575,15.1921693 12.9432575,17.9349906 12.9432575,19.6280258 C12.9432575,21.321061 11.8802698,22.702033 10.4350335,22.702033 C8.9897972,22.702033 9.73203462,22.702033 9.30706659,22.702033 C8.06189692,22.702033 6.74671725,21.3377506 6.74671725,20.2078226 C6.74671725,20.0934976 6.74671725,20.2059582 6.74671725,19.7592882 C6.74671725,19.3126181 6.87175798,18.9731257 7.48840038,18.9731257 C8.10504278,18.9731257 8.17555313,19.6563439 8.17555313,19.9968513 C8.17555313,20.3373588 8.9255005,21.1604653 9.46974851,21.1610141 C10.0139965,21.1615628 9.622862,21.1613752 10.1078755,21.1604653 C10.5928891,21.1595554 11.3536399,20.7293311 11.3536399,19.7592882 C11.3536399,18.7892452 11.3536399,14.7598693 11.3536399,14.4506417 C11.3536399,14.1414141 11.5668004,13.4850428 12.0438468,13.4850428 C12.5208932,13.4850428 12.1751181,13.4850428 12.3354788,13.4850428 C12.4958394,13.4850428 12.9432575,13.7091142 12.9432575,14.4506417 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ConstantGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ConstantGradientRequestBus.h index 67b81116ff..08397fc6b0 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ConstantGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ConstantGradientRequestBus.h @@ -32,4 +32,4 @@ namespace GradientSignal }; using ConstantGradientRequestBus = AZ::EBus<ConstantGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/DitherGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/DitherGradientRequestBus.h index 2b3d2f8ffa..4a0fefba39 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/DitherGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/DitherGradientRequestBus.h @@ -42,4 +42,4 @@ namespace GradientSignal }; using DitherGradientRequestBus = AZ::EBus<DitherGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientPreviewContextRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientPreviewContextRequestBus.h index b11f759120..07de42e13e 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientPreviewContextRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientPreviewContextRequestBus.h @@ -61,4 +61,4 @@ namespace GradientSignal using GradientPreviewContextRequestBus = AZ::EBus<GradientPreviewContextRequests>; -} // namespace GradientSignal \ No newline at end of file +} // namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformModifierRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformModifierRequestBus.h index b47e2c5b67..07e8f95944 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformModifierRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformModifierRequestBus.h @@ -74,4 +74,4 @@ namespace GradientSignal }; using GradientTransformModifierRequestBus = AZ::EBus<GradientTransformModifierRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformRequestBus.h index 06aa30866e..9be7b38edc 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/GradientTransformRequestBus.h @@ -37,4 +37,4 @@ namespace GradientSignal }; using GradientTransformRequestBus = AZ::EBus<GradientTransformRequests>; -} //namespace GradientSignal \ No newline at end of file +} //namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ImageGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ImageGradientRequestBus.h index e76fb92abf..5383f79a9d 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ImageGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ImageGradientRequestBus.h @@ -39,4 +39,4 @@ namespace GradientSignal }; using ImageGradientRequestBus = AZ::EBus<ImageGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/InvertGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/InvertGradientRequestBus.h index e0c5811fd5..55e3f734b3 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/InvertGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/InvertGradientRequestBus.h @@ -31,4 +31,4 @@ namespace GradientSignal }; using InvertGradientRequestBus = AZ::EBus<InvertGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/LevelsGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/LevelsGradientRequestBus.h index 028a3bf758..631f968353 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/LevelsGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/LevelsGradientRequestBus.h @@ -46,4 +46,4 @@ namespace GradientSignal }; using LevelsGradientRequestBus = AZ::EBus<LevelsGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/MixedGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/MixedGradientRequestBus.h index ec310ce4e7..d5abe03e94 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/MixedGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/MixedGradientRequestBus.h @@ -35,4 +35,4 @@ namespace GradientSignal }; using MixedGradientRequestBus = AZ::EBus<MixedGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PerlinGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PerlinGradientRequestBus.h index 7304a9989c..39267f2bba 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PerlinGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PerlinGradientRequestBus.h @@ -40,4 +40,4 @@ namespace GradientSignal }; using PerlinGradientRequestBus = AZ::EBus<PerlinGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PosterizeGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PosterizeGradientRequestBus.h index 6e3634ba3c..46cc42019c 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PosterizeGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/PosterizeGradientRequestBus.h @@ -38,4 +38,4 @@ namespace GradientSignal }; using PosterizeGradientRequestBus = AZ::EBus<PosterizeGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/RandomGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/RandomGradientRequestBus.h index b54d16a16a..1b981331b8 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/RandomGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/RandomGradientRequestBus.h @@ -31,4 +31,4 @@ namespace GradientSignal }; using RandomGradientRequestBus = AZ::EBus<RandomGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ReferenceGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ReferenceGradientRequestBus.h index 6ef5837139..8117c98670 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ReferenceGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ReferenceGradientRequestBus.h @@ -32,4 +32,4 @@ namespace GradientSignal using ReferenceGradientRequestBus = AZ::EBus<ReferenceGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ShapeAreaFalloffGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ShapeAreaFalloffGradientRequestBus.h index 59858e8ecb..e5e73de7e2 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ShapeAreaFalloffGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ShapeAreaFalloffGradientRequestBus.h @@ -45,4 +45,4 @@ namespace GradientSignal }; using ShapeAreaFalloffGradientRequestBus = AZ::EBus<ShapeAreaFalloffGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepGradientRequestBus.h index f57ad51834..2042845e93 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepGradientRequestBus.h @@ -31,4 +31,4 @@ namespace GradientSignal }; using SmoothStepGradientRequestBus = AZ::EBus<SmoothStepGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepRequestBus.h index 374afd6682..86c5db4015 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SmoothStepRequestBus.h @@ -37,4 +37,4 @@ namespace GradientSignal }; using SmoothStepRequestBus = AZ::EBus<SmoothStepRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceAltitudeGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceAltitudeGradientRequestBus.h index 1ce928d045..bd411adec8 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceAltitudeGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceAltitudeGradientRequestBus.h @@ -42,4 +42,4 @@ namespace GradientSignal }; using SurfaceAltitudeGradientRequestBus = AZ::EBus<SurfaceAltitudeGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceMaskGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceMaskGradientRequestBus.h index 859a1d534c..d07c7df325 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceMaskGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceMaskGradientRequestBus.h @@ -33,4 +33,4 @@ namespace GradientSignal }; using SurfaceMaskGradientRequestBus = AZ::EBus<SurfaceMaskGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceSlopeGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceSlopeGradientRequestBus.h index cebc90bd68..c7a416222c 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceSlopeGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/SurfaceSlopeGradientRequestBus.h @@ -42,4 +42,4 @@ namespace GradientSignal }; using SurfaceSlopeGradientRequestBus = AZ::EBus<SurfaceSlopeGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ThresholdGradientRequestBus.h b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ThresholdGradientRequestBus.h index 8f06e46af8..fcd26bfc17 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ThresholdGradientRequestBus.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Ebuses/ThresholdGradientRequestBus.h @@ -34,4 +34,4 @@ namespace GradientSignal }; using ThresholdGradientRequestBus = AZ::EBus<ThresholdGradientRequests>; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/PerlinImprovedNoise.h b/Gems/GradientSignal/Code/Include/GradientSignal/PerlinImprovedNoise.h index 023ec40675..ffa799fa8e 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/PerlinImprovedNoise.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/PerlinImprovedNoise.h @@ -48,4 +48,4 @@ namespace GradientSignal AZStd::array<int, 512> m_permutationTable; }; -} // namespace GradientSignal \ No newline at end of file +} // namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/SmoothStep.h b/Gems/GradientSignal/Code/Include/GradientSignal/SmoothStep.h index 711d9a2c04..4d43025b8c 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/SmoothStep.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/SmoothStep.h @@ -56,4 +56,4 @@ namespace GradientSignal return output; } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/ConstantGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/ConstantGradientComponent.h index 5c48ae926a..a1877ae0ac 100644 --- a/Gems/GradientSignal/Code/Source/Components/ConstantGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/ConstantGradientComponent.h @@ -76,4 +76,4 @@ namespace GradientSignal private: ConstantGradientConfig m_configuration; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/DitherGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/DitherGradientComponent.h index 7231566388..263586dedb 100644 --- a/Gems/GradientSignal/Code/Source/Components/DitherGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/DitherGradientComponent.h @@ -109,4 +109,4 @@ namespace GradientSignal DitherGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/GradientTransformComponent.h b/Gems/GradientSignal/Code/Source/Components/GradientTransformComponent.h index 15aaf40494..8b0bfad672 100644 --- a/Gems/GradientSignal/Code/Source/Components/GradientTransformComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/GradientTransformComponent.h @@ -176,4 +176,4 @@ namespace GradientSignal LmbrCentral::DependencyMonitor m_dependencyMonitor; AZStd::atomic_bool m_dirty{ false }; }; -} //namespace GradientSignal \ No newline at end of file +} //namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Source/Components/InvertGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/InvertGradientComponent.h index a6be9c8b3e..13fbe6607a 100644 --- a/Gems/GradientSignal/Code/Source/Components/InvertGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/InvertGradientComponent.h @@ -79,4 +79,4 @@ namespace GradientSignal InvertGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/LevelsGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/LevelsGradientComponent.h index e900a77006..fd01295b0a 100644 --- a/Gems/GradientSignal/Code/Source/Components/LevelsGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/LevelsGradientComponent.h @@ -99,4 +99,4 @@ namespace GradientSignal LevelsGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/MixedGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/MixedGradientComponent.h index 3e3e8ebdda..9e6f170b8d 100644 --- a/Gems/GradientSignal/Code/Source/Components/MixedGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/MixedGradientComponent.h @@ -117,4 +117,4 @@ namespace GradientSignal MixedGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/PerlinGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/PerlinGradientComponent.h index a1bf4d889e..df7895e0d0 100644 --- a/Gems/GradientSignal/Code/Source/Components/PerlinGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/PerlinGradientComponent.h @@ -93,4 +93,4 @@ namespace GradientSignal float GetFrequency() const override; void SetFrequency(float frequency) override; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/PosterizeGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/PosterizeGradientComponent.h index f482564b0a..d07c706e3a 100644 --- a/Gems/GradientSignal/Code/Source/Components/PosterizeGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/PosterizeGradientComponent.h @@ -93,4 +93,4 @@ namespace GradientSignal PosterizeGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/RandomGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/RandomGradientComponent.h index 9c08a496c4..d6b9b52d1b 100644 --- a/Gems/GradientSignal/Code/Source/Components/RandomGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/RandomGradientComponent.h @@ -74,4 +74,4 @@ namespace GradientSignal int GetRandomSeed() const override; void SetRandomSeed(int seed) override; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/ReferenceGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/ReferenceGradientComponent.h index 3b5c49aa53..a3379537c3 100644 --- a/Gems/GradientSignal/Code/Source/Components/ReferenceGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/ReferenceGradientComponent.h @@ -79,4 +79,4 @@ namespace GradientSignal ReferenceGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/ShapeAreaFalloffGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/ShapeAreaFalloffGradientComponent.h index 0ed9d0a628..560a31c193 100644 --- a/Gems/GradientSignal/Code/Source/Components/ShapeAreaFalloffGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/ShapeAreaFalloffGradientComponent.h @@ -90,4 +90,4 @@ namespace GradientSignal ShapeAreaFalloffGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/SmoothStepGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/SmoothStepGradientComponent.h index 912bc7f8a7..44b1f270ca 100644 --- a/Gems/GradientSignal/Code/Source/Components/SmoothStepGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/SmoothStepGradientComponent.h @@ -98,4 +98,4 @@ namespace GradientSignal SmoothStepGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/SurfaceAltitudeGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/SurfaceAltitudeGradientComponent.h index 6dcb707661..3c785446d7 100644 --- a/Gems/GradientSignal/Code/Source/Components/SurfaceAltitudeGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/SurfaceAltitudeGradientComponent.h @@ -114,4 +114,4 @@ namespace GradientSignal LmbrCentral::DependencyMonitor m_dependencyMonitor; AZStd::atomic_bool m_dirty{ false }; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/SurfaceSlopeGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/SurfaceSlopeGradientComponent.h index e8eb86093b..3e471da4ea 100644 --- a/Gems/GradientSignal/Code/Source/Components/SurfaceSlopeGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/SurfaceSlopeGradientComponent.h @@ -127,4 +127,4 @@ namespace GradientSignal private: SurfaceSlopeGradientConfig m_configuration; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Components/ThresholdGradientComponent.h b/Gems/GradientSignal/Code/Source/Components/ThresholdGradientComponent.h index deeed0ef84..62083090bf 100644 --- a/Gems/GradientSignal/Code/Source/Components/ThresholdGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Components/ThresholdGradientComponent.h @@ -83,4 +83,4 @@ namespace GradientSignal ThresholdGradientConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorConstantGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorConstantGradientComponent.cpp index d24dfbd959..6be90dc867 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorConstantGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorConstantGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorWrappedComponentBase::ReflectSubClass<EditorConstantGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorDitherGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorDitherGradientComponent.cpp index 7eed180d73..3445ea1785 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorDitherGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorDitherGradientComponent.cpp @@ -25,4 +25,4 @@ namespace GradientSignal BaseClassType::ConfigurationChanged(); return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorGradientComponentBase.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorGradientComponentBase.cpp index 1a8bcce790..6cabb323e9 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorGradientComponentBase.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorGradientComponentBase.cpp @@ -18,4 +18,4 @@ namespace GradientSignal { -} //namespace GradientSignal \ No newline at end of file +} //namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.cpp index 8ee76011cb..d7410443e7 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.cpp @@ -65,4 +65,4 @@ namespace GradientSignal m_component.WriteOutConfig(&m_configuration); SetDirty(); } -} //namespace GradientSignal \ No newline at end of file +} //namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.h b/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.h index 28203524d9..0b1ca6e182 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.h +++ b/Gems/GradientSignal/Code/Source/Editor/EditorGradientTransformComponent.h @@ -46,4 +46,4 @@ namespace GradientSignal void UpdateFromShape(); }; -} //namespace GradientSignal \ No newline at end of file +} //namespace GradientSignal diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.cpp index fbeff8d995..96aeb74cf8 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorImageGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.h b/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.h index 9b0742839a..db19c901f5 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Editor/EditorImageGradientComponent.h @@ -32,4 +32,4 @@ namespace GradientSignal static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/Gradient.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/gradients/image-gradient"; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.cpp index fe34e99307..c645ce769a 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorInvertGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.h b/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.h index 65a121b647..4f0a85c2be 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Editor/EditorInvertGradientComponent.h @@ -32,4 +32,4 @@ namespace GradientSignal static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/GradientModifier.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/gradientmodifiers/invert-gradient-modifier"; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.cpp index aabd507414..1c448442d1 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorLevelsGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.h b/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.h index 73d1d805d4..d798029c56 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.h +++ b/Gems/GradientSignal/Code/Source/Editor/EditorLevelsGradientComponent.h @@ -32,4 +32,4 @@ namespace GradientSignal static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/GradientModifier.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/gradientmodifiers/levels-gradient-modifier"; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorPerlinGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorPerlinGradientComponent.cpp index a369c0bef4..08062b1d6b 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorPerlinGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorPerlinGradientComponent.cpp @@ -52,4 +52,4 @@ namespace GradientSignal return EditorGradientComponentBase::ConfigurationChanged(); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorPosterizeGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorPosterizeGradientComponent.cpp index 3c3b5257f8..4ff2bdc2c6 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorPosterizeGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorPosterizeGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorPosterizeGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorRandomGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorRandomGradientComponent.cpp index ec0a973ec0..d65f90a485 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorRandomGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorRandomGradientComponent.cpp @@ -52,4 +52,4 @@ namespace GradientSignal return EditorGradientComponentBase::ConfigurationChanged(); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorReferenceGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorReferenceGradientComponent.cpp index c1d8989dff..33a3f3b781 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorReferenceGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorReferenceGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorReferenceGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorShapeAreaFalloffGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorShapeAreaFalloffGradientComponent.cpp index 8abd07e065..14e18a7ddd 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorShapeAreaFalloffGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorShapeAreaFalloffGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorShapeAreaFalloffGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorSmoothStepGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorSmoothStepGradientComponent.cpp index 40c66fe591..335bbf4676 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorSmoothStepGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorSmoothStepGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorSmoothStepGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceAltitudeGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceAltitudeGradientComponent.cpp index dc04ebd423..976e101874 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceAltitudeGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceAltitudeGradientComponent.cpp @@ -54,4 +54,4 @@ namespace GradientSignal m_component.WriteOutConfig(&m_configuration); SetDirty(); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceMaskGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceMaskGradientComponent.cpp index 45ffc7d834..016c1fd2f9 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceMaskGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceMaskGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorSurfaceMaskGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceSlopeGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceSlopeGradientComponent.cpp index 1f8b82adf3..46f916c0ec 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceSlopeGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorSurfaceSlopeGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorSurfaceSlopeGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Editor/EditorThresholdGradientComponent.cpp b/Gems/GradientSignal/Code/Source/Editor/EditorThresholdGradientComponent.cpp index 6e81800b9d..4411e14839 100644 --- a/Gems/GradientSignal/Code/Source/Editor/EditorThresholdGradientComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Editor/EditorThresholdGradientComponent.cpp @@ -19,4 +19,4 @@ namespace GradientSignal { EditorGradientComponentBase::ReflectSubClass<EditorThresholdGradientComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.cpp b/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.cpp index 2f8f5be24a..e591d50511 100644 --- a/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.cpp +++ b/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.cpp @@ -125,4 +125,4 @@ namespace GradientSignal } } -AZ_DECLARE_MODULE_CLASS(Gem_GradientSignalEditor, GradientSignal::GradientSignalEditorModule) \ No newline at end of file +AZ_DECLARE_MODULE_CLASS(Gem_GradientSignalEditor, GradientSignal::GradientSignalEditorModule) diff --git a/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.h b/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.h index db62a6ef09..6e47681596 100644 --- a/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.h +++ b/Gems/GradientSignal/Code/Source/GradientSignalEditorModule.h @@ -46,4 +46,4 @@ namespace GradientSignal void Activate() override; void Deactivate() override; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/GradientSignalModule.h b/Gems/GradientSignal/Code/Source/GradientSignalModule.h index e6972ff932..b09b8598a9 100644 --- a/Gems/GradientSignal/Code/Source/GradientSignalModule.h +++ b/Gems/GradientSignal/Code/Source/GradientSignalModule.h @@ -28,4 +28,4 @@ namespace GradientSignal AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/PerlinImprovedNoise.cpp b/Gems/GradientSignal/Code/Source/PerlinImprovedNoise.cpp index 2f4e6f36cf..74fb1d50a0 100644 --- a/Gems/GradientSignal/Code/Source/PerlinImprovedNoise.cpp +++ b/Gems/GradientSignal/Code/Source/PerlinImprovedNoise.cpp @@ -150,4 +150,4 @@ namespace GradientSignal m_permutationTable[x + 256] = randtable[x]; } } -} \ No newline at end of file +} diff --git a/Gems/GradientSignal/Code/Source/Util.cpp b/Gems/GradientSignal/Code/Source/Util.cpp index 776b244807..16ee77c81f 100644 --- a/Gems/GradientSignal/Code/Source/Util.cpp +++ b/Gems/GradientSignal/Code/Source/Util.cpp @@ -79,4 +79,4 @@ namespace GradientSignal { return point - bounds.GetMin(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilterBus.h b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilterBus.h index b12fe64baf..70a8e43a97 100644 --- a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilterBus.h +++ b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilterBus.h @@ -61,4 +61,4 @@ namespace GraphCanvas using ConnectionFilterRequestBus = AZ::EBus<ConnectionFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilters.h b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilters.h index 42276f3a61..eef0df0b52 100644 --- a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilters.h +++ b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilters.h @@ -140,4 +140,4 @@ namespace GraphCanvas AZStd::unordered_set<ConnectionType> m_connectionTypes; ConnectionFilterType m_filterType; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/DataConnectionFilters.h b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/DataConnectionFilters.h index 5bc4241771..2ac9bb575b 100644 --- a/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/DataConnectionFilters.h +++ b/Gems/GraphCanvas/Code/Include/GraphCanvas/Components/Connections/ConnectionFilters/DataConnectionFilters.h @@ -132,4 +132,4 @@ namespace GraphCanvas return acceptConnection; } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorComponent.h b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorComponent.h index e81762ad54..d443296cfc 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorComponent.h @@ -95,4 +95,4 @@ namespace GraphCanvas AZ::EntityId m_sceneId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorLayerControllerComponent.h b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorLayerControllerComponent.h index a1c81a6479..844d4e46ab 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorLayerControllerComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorLayerControllerComponent.h @@ -39,4 +39,4 @@ namespace GraphCanvas } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h index a67d9c37d5..16ca354513 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h @@ -146,4 +146,4 @@ namespace GraphCanvas const BookmarkAnchorVisualComponent& operator=(const BookmarkAnchorVisualComponent&) = delete; AZStd::unique_ptr<BookmarkAnchorVisualGraphicsWidget> m_graphicsWidget; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.cpp index f4d4565a3c..92e576f774 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.cpp @@ -231,4 +231,4 @@ namespace GraphCanvas m_shortcuts[previousIndex].SetInvalid(); } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.h b/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.h index 7c6bcd0f6f..a0b1e05404 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkManagerComponent.h @@ -67,4 +67,4 @@ namespace GraphCanvas AZStd::fixed_vector<AZ::EntityId, 10> m_shortcuts; AZStd::set<AZ::EntityId> m_bookmarks; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.cpp index f7ecfc9168..26b9cd788f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.cpp @@ -124,4 +124,4 @@ namespace GraphCanvas OnOffsetsChanged(0, 0); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h index b68cfd0af0..fd75fdef97 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h @@ -53,4 +53,4 @@ namespace GraphCanvas LayerControllerRequests* m_sourceLayerController; LayerControllerRequests* m_targetLayerController; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionComponent.h b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionComponent.h index 63660ccb06..b751f12f18 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionComponent.h @@ -40,4 +40,4 @@ namespace GraphCanvas const DataConnectionComponent& operator=(const DataConnectionComponent&) = delete; ConnectionMoveResult OnConnectionMoveComplete(const QPointF& scenePos, const QPoint& screenPos, AZ::EntityId groupTarget) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.cpp b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.cpp index ddd83ed2ad..d5e9348e53 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.cpp @@ -248,4 +248,4 @@ namespace GraphCanvas } } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.h b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.h index 2e0c516f8c..cb1cd09b7c 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.h +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionGraphicsItem.h @@ -84,4 +84,4 @@ namespace GraphCanvas QColor m_sourceDataColor; QColor m_targetDataColor; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.cpp index fb43495267..77a94e19c4 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.cpp @@ -38,4 +38,4 @@ namespace GraphCanvas { m_connectionGraphicsItem = AZStd::make_unique<DataConnectionGraphicsItem>(GetEntityId()); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.h b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.h index 7842d8fae0..f94fd415f8 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/DataConnections/DataConnectionVisualComponent.h @@ -32,4 +32,4 @@ namespace GraphCanvas private: DataConnectionVisualComponent(const DataConnectionVisualComponent &) = delete; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/GridComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/GridComponent.cpp index 20053c5dfc..ad67ee5591 100644 --- a/Gems/GraphCanvas/Code/Source/Components/GridComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/GridComponent.cpp @@ -159,4 +159,4 @@ namespace GraphCanvas { return m_scene; } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.cpp b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.cpp index afa5eafe4b..e5e594b61f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.cpp @@ -83,4 +83,4 @@ namespace GraphCanvas { TryAndSelectNode(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.h index c66c848a0f..71122a37a4 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/BooleanNodePropertyDisplay.h @@ -52,4 +52,4 @@ namespace GraphCanvas GraphCanvasCheckBox* m_checkBox; GraphCanvasLabel* m_disabledLabel; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/EntityIdNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/EntityIdNodePropertyDisplay.h index 86046dd8c7..69d585962f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/EntityIdNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/EntityIdNodePropertyDisplay.h @@ -74,4 +74,4 @@ namespace GraphCanvas QGraphicsProxyWidget* m_proxyWidget; GraphCanvasLabel* m_displayLabel; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/NumericNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/NumericNodePropertyDisplay.h index 0c364c049d..d6eda39e4f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/NumericNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/NumericNodePropertyDisplay.h @@ -103,4 +103,4 @@ namespace GraphCanvas Internal::FocusableDoubleSpinBox* m_spinBox; QGraphicsProxyWidget* m_proxyWidget; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/ReadOnlyNodePropertyDisplay.cpp b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/ReadOnlyNodePropertyDisplay.cpp index 770b408bea..25464f5383 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/ReadOnlyNodePropertyDisplay.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/ReadOnlyNodePropertyDisplay.cpp @@ -72,4 +72,4 @@ namespace GraphCanvas UpdateStyleForDragDrop(dragState, styleHelper); m_displayLabel->update(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.cpp b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.cpp index fc2a108b30..e783a54fca 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.cpp @@ -422,4 +422,4 @@ namespace GraphCanvas } #include <Source/Components/NodePropertyDisplays/moc_VariableReferenceNodePropertyDisplay.cpp> -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.h index 9b95f1a6ea..544b4cc813 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VariableReferenceNodePropertyDisplay.h @@ -160,4 +160,4 @@ namespace GraphCanvas QGraphicsProxyWidget* m_proxyWidget; VariableSelectionWidget* m_variableSelectionWidget; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h index a040652604..5d88ce94fc 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h @@ -123,4 +123,4 @@ namespace GraphCanvas bool m_releaseLayout; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentLayerControllerComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentLayerControllerComponent.cpp index 27633aaef3..8e3dc4ac63 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentLayerControllerComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentLayerControllerComponent.cpp @@ -11,4 +11,4 @@ */ #include "precompiled.h" -#include <Source/Components/Nodes/Comment/CommentLayerControllerComponent.h> \ No newline at end of file +#include <Source/Components/Nodes/Comment/CommentLayerControllerComponent.h> diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h index 009476e039..848a457e89 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h @@ -102,4 +102,4 @@ namespace GraphCanvas void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override; //// }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h index 7d2b6cf8c7..898c7ad2c1 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h @@ -79,4 +79,4 @@ namespace GraphCanvas QGraphicsLinearLayout* m_comment; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h index 7fd04c76e0..2dd5fc26a8 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h @@ -194,4 +194,4 @@ namespace GraphCanvas AZ::EntityId m_entityId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h index f32b4af510..f2430cfb83 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h @@ -106,4 +106,4 @@ namespace GraphCanvas void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; //// }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.cpp index 2924887221..7a8de415a4 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.cpp @@ -142,4 +142,4 @@ namespace GraphCanvas GetLayout()->invalidate(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.h index 68d035fdb9..8008e531be 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeLayoutComponent.h @@ -74,4 +74,4 @@ namespace GraphCanvas QGraphicsLinearLayout* m_title; QGraphicsLinearLayout* m_slots; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeTitleComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeTitleComponent.h index 7bdfea188e..65d1842694 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeTitleComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeTitleComponent.h @@ -183,4 +183,4 @@ namespace GraphCanvas Styling::StyleHelper m_styleHelper; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h index 77cdd1ff3b..d7e604fd90 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h @@ -213,4 +213,4 @@ namespace GraphCanvas bool m_addedToScene; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h index daea8bd7a0..49e44b282d 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h @@ -80,4 +80,4 @@ namespace GraphCanvas QGraphicsLinearLayout* m_comment; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeLayoutComponent.h index 798ad8ebc8..19007ad9a3 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeLayoutComponent.h @@ -110,4 +110,4 @@ namespace GraphCanvas QGraphicsLayout* m_layout; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h index 2c59d15fa9..9096731447 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h @@ -222,4 +222,4 @@ namespace GraphCanvas WrappedNodeLayout* m_wrappedNodeLayout; WrappedNodeActionGraphicsWidget* m_wrapperNodeActionWidget; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/PersistentIdComponent.h b/Gems/GraphCanvas/Code/Source/Components/PersistentIdComponent.h index 6f6f4965ee..c43e222e76 100644 --- a/Gems/GraphCanvas/Code/Source/Components/PersistentIdComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/PersistentIdComponent.h @@ -63,4 +63,4 @@ namespace GraphCanvas PersistentGraphMemberId m_previousId; PersistentIdComponentSaveData m_saveData; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.cpp index 72e7c567d6..ca32099b12 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.cpp @@ -196,4 +196,4 @@ namespace GraphCanvas painter->restore(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.h index fddbcb4293..2527c6fd2a 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotConnectionPin.h @@ -36,4 +36,4 @@ namespace GraphCanvas const Styling::StyleHelper* m_colorPalette; AZStd::vector<const Styling::StyleHelper*> m_containerColorPalettes; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.cpp index 195cf03fb9..ea9b95b775 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.cpp @@ -164,4 +164,4 @@ namespace GraphCanvas m_defaultSlotLayout->Deactivate(); SlotLayoutComponent::Deactivate(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h index 035f8178b8..beee1b71b2 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h @@ -82,4 +82,4 @@ namespace GraphCanvas private: DefaultSlotLayout* m_defaultSlotLayout; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.cpp index c49ee88f60..448235b02a 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.cpp @@ -108,4 +108,4 @@ namespace GraphCanvas return ConnectionComponent::CreateGeneralConnection(sourceEndpoint, targetEndpoint, createModelConnection, k_connectionSubStyle); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.h index 9438a26191..e9195d6a53 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotComponent.h @@ -38,4 +38,4 @@ namespace GraphCanvas ExecutionSlotComponent& operator=(const ExecutionSlotComponent&) = delete; AZ::Entity* ConstructConnectionEntity(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint, bool createModelConnection) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.cpp index f79aea898a..239ab7bcd5 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.cpp @@ -60,4 +60,4 @@ namespace GraphCanvas drawRect.center() + QPointF(-halfLength, halfLength) })); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.h index 8c7f54bae8..0d26614002 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotConnectionPin.h @@ -33,4 +33,4 @@ namespace GraphCanvas Styling::StyleHelper m_connectedStyle; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotConnectionPin.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotConnectionPin.h index 72039bf955..81efdc9018 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotConnectionPin.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotConnectionPin.h @@ -33,4 +33,4 @@ namespace GraphCanvas void OnSlotClicked() override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h index 7fec564a28..0f1cfbc1b8 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h @@ -94,4 +94,4 @@ namespace GraphCanvas ExtenderSlotLayout* m_layout; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h index 9ab1caf275..ca7347c815 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h @@ -98,4 +98,4 @@ namespace GraphCanvas private: PropertySlotLayout* m_layout; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.cpp b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.cpp index a604e66c8b..29e6a6894b 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.cpp +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.cpp @@ -125,4 +125,4 @@ namespace GraphCanvas } ); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.h index c7e8d8e2f0..bfdf74571e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotConnectionFilterComponent.h @@ -59,4 +59,4 @@ namespace GraphCanvas AZStd::vector< ConnectionFilter* > m_filters; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Components/StylingComponent.h b/Gems/GraphCanvas/Code/Source/Components/StylingComponent.h index d9d568f1e3..2d39cc8b31 100644 --- a/Gems/GraphCanvas/Code/Source/Components/StylingComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/StylingComponent.h @@ -133,4 +133,4 @@ namespace GraphCanvas bool m_hovered = false; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/GraphCanvas.h b/Gems/GraphCanvas/Code/Source/GraphCanvas.h index a86f038bd3..51ba5f7ff5 100644 --- a/Gems/GraphCanvas/Code/Source/GraphCanvas.h +++ b/Gems/GraphCanvas/Code/Source/GraphCanvas.h @@ -95,4 +95,4 @@ namespace GraphCanvas TranslationDatabase m_translationDatabase; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/GraphCanvasModule.h b/Gems/GraphCanvas/Code/Source/GraphCanvasModule.h index b6f6b5d3b1..1166eceb0c 100644 --- a/Gems/GraphCanvas/Code/Source/GraphCanvasModule.h +++ b/Gems/GraphCanvas/Code/Source/GraphCanvasModule.h @@ -31,4 +31,4 @@ namespace GraphCanvas AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/Source/Widgets/GraphCanvasCheckBox.h b/Gems/GraphCanvas/Code/Source/Widgets/GraphCanvasCheckBox.h index 6b8b11acba..970274c70f 100644 --- a/Gems/GraphCanvas/Code/Source/Widgets/GraphCanvasCheckBox.h +++ b/Gems/GraphCanvas/Code/Source/Widgets/GraphCanvasCheckBox.h @@ -75,4 +75,4 @@ namespace GraphCanvas }; using GraphCanvasCheckBoxNotificationBus = AZ::EBus<GraphCanvasCheckBoxNotifications>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Bookmarks/BookmarkBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Bookmarks/BookmarkBus.h index 9519cf92a5..258e2c02c4 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Bookmarks/BookmarkBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Bookmarks/BookmarkBus.h @@ -252,4 +252,4 @@ namespace GraphCanvas BookmarkAnchorComponentSaveDataCallback* m_callback; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ColorPaletteManager/ColorPaletteManagerComponent.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ColorPaletteManager/ColorPaletteManagerComponent.h index a3c4495324..283334560c 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ColorPaletteManager/ColorPaletteManagerComponent.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ColorPaletteManager/ColorPaletteManagerComponent.h @@ -54,4 +54,4 @@ namespace GraphCanvas //// }; } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GridBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GridBus.h index 8155b1356a..09bdfd583e 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GridBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GridBus.h @@ -73,4 +73,4 @@ namespace GraphCanvas using GridNotificationBus = AZ::EBus<GridNotifications>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/MimeDataHandlerBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/MimeDataHandlerBus.h index 7fa7a42a90..4fd2509b6b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/MimeDataHandlerBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/MimeDataHandlerBus.h @@ -81,4 +81,4 @@ namespace GraphCanvas using SceneMimeDelegateHandlerRequestBus = AZ::EBus<SceneMimeDelegateHandlerRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/AssetIdDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/AssetIdDataInterface.h index 2bafa51524..09e7ced521 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/AssetIdDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/AssetIdDataInterface.h @@ -28,4 +28,4 @@ namespace GraphCanvas virtual AZStd::string GetStringFilter() const = 0; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/BooleanDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/BooleanDataInterface.h index bcb2a508d6..6e945be305 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/BooleanDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/BooleanDataInterface.h @@ -22,4 +22,4 @@ namespace GraphCanvas virtual bool GetBool() const = 0; virtual void SetBool(bool value) = 0; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/DoubleDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/DoubleDataInterface.h index 0f286e022f..8d614905ff 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/DoubleDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/DoubleDataInterface.h @@ -38,4 +38,4 @@ namespace GraphCanvas SetDouble(value); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/EntityIdDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/EntityIdDataInterface.h index dc6a1dc98a..f79f8aa8b2 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/EntityIdDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/EntityIdDataInterface.h @@ -93,4 +93,4 @@ namespace GraphCanvas } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/NumericDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/NumericDataInterface.h index 57f477a363..f752dee4d7 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/NumericDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/NumericDataInterface.h @@ -51,4 +51,4 @@ namespace GraphCanvas return ""; } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/ReadOnlyDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/ReadOnlyDataInterface.h index e2d8a2dad6..150cd5319f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/ReadOnlyDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/ReadOnlyDataInterface.h @@ -23,4 +23,4 @@ namespace GraphCanvas public: virtual AZStd::string GetString() const = 0; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/StringDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/StringDataInterface.h index 1cf9b93cb0..0371e7507d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/StringDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/StringDataInterface.h @@ -24,4 +24,4 @@ namespace GraphCanvas virtual bool ResizeToContents() const { return true; } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/VariableDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/VariableDataInterface.h index 76376f281d..658fb09eb1 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/VariableDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/NodePropertyDisplay/VariableDataInterface.h @@ -28,4 +28,4 @@ namespace GraphCanvas // Returns the type of variable that should be assigned to this value. virtual AZ::Uuid GetVariableDataType() const = 0; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeLayoutBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeLayoutBus.h index 682667629c..d0ca3dc547 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeLayoutBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeLayoutBus.h @@ -51,4 +51,4 @@ namespace GraphCanvas }; using NodeSlotsRequestBus = AZ::EBus<NodeSlotsRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeTitleBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeTitleBus.h index 65cba06769..7534aa1392 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeTitleBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/NodeTitleBus.h @@ -104,4 +104,4 @@ namespace GraphCanvas AZStd::string m_paletteOverride; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Variable/VariableNodeBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Variable/VariableNodeBus.h index 16a203ef57..ac3f7198fb 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Variable/VariableNodeBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Variable/VariableNodeBus.h @@ -56,4 +56,4 @@ namespace GraphCanvas using VariableRequestBus = AZ::EBus<VariableRequests>; } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Wrapper/WrapperNodeBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Wrapper/WrapperNodeBus.h index 7b2becdce4..e857fef86a 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Wrapper/WrapperNodeBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Nodes/Wrapper/WrapperNodeBus.h @@ -127,4 +127,4 @@ namespace GraphCanvas }; using ForcedWrappedNodeRequestBus = AZ::EBus<ForcedWrappedNodeRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/PersistentIdBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/PersistentIdBus.h index fc7bed3eb5..702adbe321 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/PersistentIdBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/PersistentIdBus.h @@ -87,4 +87,4 @@ namespace GraphCanvas SignalDirty(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h index 650052a45d..35157bd965 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h @@ -54,4 +54,4 @@ namespace GraphCanvas }; using ExtenderSlotNotificationBus = AZ::EBus<ExtenderSlotNotifications>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ToastBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ToastBus.h index 6986e96c1b..2ee2d2b653 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ToastBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/ToastBus.h @@ -30,4 +30,4 @@ namespace GraphCanvas }; using ToastNotificationBus = AZ::EBus<ToastNotifications>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/EditorDockWidgetBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/EditorDockWidgetBus.h index 05fa192616..8ec181383b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/EditorDockWidgetBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Editor/EditorDockWidgetBus.h @@ -58,4 +58,4 @@ namespace GraphCanvas }; using ActiveEditorDockWidgetRequestBus = AZ::EBus<ActiveEditorDockWidgetRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffect.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffect.h index 7333d69da2..406d693ca6 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffect.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffect.h @@ -82,4 +82,4 @@ namespace GraphCanvas } //// }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffectBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffectBus.h index 2a145d1a95..9152eb995f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffectBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GraphicsEffectBus.h @@ -32,4 +32,4 @@ namespace GraphCanvas }; using GraphicsEffectRequestBus = AZ::EBus<GraphicsEffectRequests>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/ParticleGraphicsItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/ParticleGraphicsItem.h index c48e15c209..0694328338 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/ParticleGraphicsItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/ParticleGraphicsItem.h @@ -103,4 +103,4 @@ namespace GraphCanvas QRectF m_boundingRect; QPainterPath m_clipPath; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/PulseBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/PulseBus.h index 9ba75254bc..2793bd7ef5 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/PulseBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/PulseBus.h @@ -40,4 +40,4 @@ namespace GraphCanvas }; using PulseNotificationBus = AZ::EBus<PulseNotifications>; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/PseudoElement.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/PseudoElement.cpp index aaa6a6bee0..9d9340541c 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/PseudoElement.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/PseudoElement.cpp @@ -123,4 +123,4 @@ namespace GraphCanvas } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.h index 9722ec9b5f..782f7b2b4c 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.h @@ -113,4 +113,4 @@ namespace GraphCanvas }; } // namespace Styling -} // namespace GraphCanvas \ No newline at end of file +} // namespace GraphCanvas diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ComponentSaveDataInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ComponentSaveDataInterface.h index d065893f97..361300b376 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ComponentSaveDataInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ComponentSaveDataInterface.h @@ -64,4 +64,4 @@ namespace GraphCanvas } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ConstructPresets.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ConstructPresets.h index 83ba45ca40..b53f15ccaf 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ConstructPresets.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/ConstructPresets.h @@ -241,4 +241,4 @@ namespace GraphCanvas EditorId m_editorId; AZStd::unordered_map< ConstructType, AZStd::shared_ptr<ConstructTypePresetBucket> > m_presetMapping; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.cpp index 7c067968e2..7ee7627c6b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.cpp @@ -53,4 +53,4 @@ namespace GraphCanvas } } } -} // namespace GraphCanvas \ No newline at end of file +} // namespace GraphCanvas diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.h index 5f476253be..d56cf200a3 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/GraphCanvasGraphData.h @@ -40,4 +40,4 @@ namespace GraphCanvas AZStd::unordered_multimap<Endpoint, Endpoint> m_endpointMap; ///< Endpoint map built at edit time based on active connections }; -} // namespace GraphCanvas \ No newline at end of file +} // namespace GraphCanvas diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/TranslationTypes.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/TranslationTypes.h index adee444a36..b194f4ecde 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/TranslationTypes.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/TranslationTypes.h @@ -117,4 +117,4 @@ namespace GraphCanvas bool m_dirtyText; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/ConversionUtils.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/ConversionUtils.h index 616d4adc98..ae1a910807 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/ConversionUtils.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/ConversionUtils.h @@ -39,4 +39,4 @@ namespace GraphCanvas return AZ::Vector2(aznumeric_cast<float>(point.x()), aznumeric_cast<float>(point.y())); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtDrawingUtils.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtDrawingUtils.h index b407887a43..771942571b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtDrawingUtils.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtDrawingUtils.h @@ -37,4 +37,4 @@ namespace GraphCanvas static void PatternFillArea(QPainter& painter, const QRectF& area, const QPixmap& pixmap, const PatternFillConfiguration& patternFillConfiguration); static void PatternFillArea(QPainter& painter, const QRectF& area, const PatternedFillGenerator& patternedFillGenerator); }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtMimeUtils.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtMimeUtils.h index e7d5247060..563d20e19e 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtMimeUtils.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/QtMimeUtils.h @@ -58,4 +58,4 @@ namespace GraphCanvas return Type{}; } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h index fbc45a3a1d..6e31843cd4 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h @@ -100,4 +100,4 @@ namespace GraphCanvas AZStd::multiset<T, Compare> m_valueSet; AZStd::unordered_map<StateSetter<T>*, T> m_valueMapping; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h index 2828f5a4e4..9ee18fd08e 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h @@ -92,4 +92,4 @@ namespace GraphCanvas AZStd::vector< AZStd::pair< StateSetter<T>*, T> > m_states; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StateController.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StateController.h index 8950472508..1cdfdc1379 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StateController.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StateController.h @@ -250,4 +250,4 @@ namespace GraphCanvas bool m_hasPushedState; AZStd::unordered_set< StateController<T>* > m_stateControllers; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModelInterface.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModelInterface.h index d12490bf6e..3fd5149622 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModelInterface.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModelInterface.h @@ -51,4 +51,4 @@ namespace GraphCanvas virtual int GetCompleterColumn() const = 0; //// }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ConstructPresetDialog/ConstructPresetDialog.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ConstructPresetDialog/ConstructPresetDialog.h index 0f64ceed96..8a803b0ef3 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ConstructPresetDialog/ConstructPresetDialog.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ConstructPresetDialog/ConstructPresetDialog.h @@ -153,4 +153,4 @@ namespace GraphCanvas ConstructPresetsTableModel* m_presetsModel; EditorId m_editorId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h index a53c4c6b8e..d03a356d47 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h @@ -54,4 +54,4 @@ namespace GraphCanvas return GetAlignmentContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h index 95ff2945b4..940a71104e 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h @@ -42,4 +42,4 @@ namespace GraphCanvas GraphUtils::VerticalAlignment m_verAlign; GraphUtils::HorizontalAlignment m_horAlign; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h index d9d7cd3cd3..4d826f9e70 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h @@ -48,4 +48,4 @@ namespace GraphCanvas return GetCommentContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.cpp index 54c0035197..830b52e3d3 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.cpp @@ -49,4 +49,4 @@ namespace GraphCanvas return SceneReaction::Nothing; } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h index 838cb08430..b883a214af 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h @@ -26,4 +26,4 @@ namespace GraphCanvas SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h index cd42d273a7..b69e905954 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h @@ -26,4 +26,4 @@ namespace GraphCanvas SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructContextMenuAction.h index 0d011e4f7e..05be40bbd0 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructContextMenuAction.h @@ -36,4 +36,4 @@ namespace GraphCanvas return GetConstructContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.cpp index 9a1b544627..653121fabf 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.cpp @@ -73,4 +73,4 @@ namespace GraphCanvas } #include <StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/moc_ContextMenuAction.cpp> -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.h index cec138e112..bceda2e3df 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ContextMenuAction.h @@ -97,4 +97,4 @@ namespace GraphCanvas bool m_recursionFix = false; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableActionsMenuGroup.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableActionsMenuGroup.h index 9fa1cedd71..16c9a8cc90 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableActionsMenuGroup.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableActionsMenuGroup.h @@ -37,4 +37,4 @@ namespace GraphCanvas ContextMenuAction* m_setSelectionEnableState; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuAction.h index 538c55c428..3f518cecd1 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuAction.h @@ -36,4 +36,4 @@ namespace GraphCanvas return GetDisableContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h index 68d5629d8e..5e21f6eeac 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h @@ -32,4 +32,4 @@ namespace GraphCanvas bool m_enableState; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.cpp index dc72cef548..909e8b51a8 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.cpp @@ -77,4 +77,4 @@ namespace GraphCanvas { m_duplicateAction->setEnabled(enabled); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.h index 58c15e8f1b..db25a76fe3 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditActionsMenuGroup.h @@ -40,4 +40,4 @@ namespace GraphCanvas ContextMenuAction* m_deleteAction; ContextMenuAction* m_duplicateAction; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h index 760ed35bb5..82757b3f7d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h @@ -48,4 +48,4 @@ namespace GraphCanvas return GetEditContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h index 4a857bfeeb..ea655fa230 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h @@ -79,4 +79,4 @@ namespace GraphCanvas SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h index cf71065c5d..b0d7d94fcb 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h @@ -48,4 +48,4 @@ namespace GraphCanvas return GetNodeGroupContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h index d9e9479707..3291121ce1 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h @@ -94,4 +94,4 @@ namespace GraphCanvas void RefreshAction() override; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuAction.h index 375bd7fab8..da8f88ac2d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuAction.h @@ -38,4 +38,4 @@ namespace GraphCanvas return GetNodeContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h index 3d1de9c798..fe61fbca11 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h @@ -34,4 +34,4 @@ namespace GraphCanvas bool m_hideSlots = true; AZ::EntityId m_targetId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.cpp index f556b6171e..29b6bcacb3 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.cpp @@ -37,4 +37,4 @@ namespace GraphCanvas { m_removeUnusedNodesAction->setEnabled(enabled); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.h index 46c83ee85b..57cd5310f4 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneActionsMenuGroup.h @@ -31,4 +31,4 @@ namespace GraphCanvas ContextMenuAction* m_removeUnusedNodesAction; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuAction.h index a965d9823d..871fb5cd0c 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuAction.h @@ -36,4 +36,4 @@ namespace GraphCanvas return GetSceneContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h index fe223d2e66..21da31e309 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h @@ -46,4 +46,4 @@ namespace GraphCanvas SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuAction.h index 6de3ecef23..359e407c81 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuAction.h @@ -36,4 +36,4 @@ namespace GraphCanvas return GetSlotContextMenuActionGroupId(); } }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h index e9c487c3af..04a71988af 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h @@ -100,4 +100,4 @@ namespace GraphCanvas GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.cpp index 24a941bccb..856c9b3a78 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.cpp @@ -30,4 +30,4 @@ namespace GraphCanvas m_editActionMenuGroup.SetPasteEnabled(false); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.h index e77a42c514..7715ad93be 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/BookmarkContextMenu.h @@ -30,4 +30,4 @@ namespace GraphCanvas EditActionsMenuGroup m_editActionMenuGroup; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.cpp index 1fe77905e9..ce51d3812a 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.cpp @@ -34,4 +34,4 @@ namespace GraphCanvas m_nodeGroupActionGroup.RefreshPresets(); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.h index 17a11ab576..4584ab9d6e 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/CollapsedNodeGroupContextMenu.h @@ -36,4 +36,4 @@ namespace GraphCanvas NodeGroupActionsMenuGroup m_nodeGroupActionGroup; AlignmentActionsMenuGroup m_alignmentActionGroup; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.cpp index 1f5aa81ca9..7871c5f8d4 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.cpp @@ -34,4 +34,4 @@ namespace GraphCanvas m_editActionsGroup.SetCopyEnabled(false); m_editActionsGroup.SetPasteEnabled(false); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.h index b34577b358..ac5a5dff3b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/ConnectionContextMenu.h @@ -34,4 +34,4 @@ namespace GraphCanvas EditActionsMenuGroup m_editActionsGroup; AlignmentActionsMenuGroup m_alignmentActionsGroup; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.cpp index 7c38cf7fd6..4aa015468a 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.cpp @@ -46,4 +46,4 @@ namespace GraphCanvas m_nodeGroupActionGroup.RefreshPresets(); m_disableActionGroup.RefreshActions(graphId); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.h index cf40db01a3..4ce8069a66 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/NodeContextMenu.h @@ -36,4 +36,4 @@ namespace GraphCanvas DisableActionsMenuGroup m_disableActionGroup; AlignmentActionsMenuGroup m_alignmentActionGroup; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.cpp index ea79491e38..50f9afcfe2 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.cpp @@ -40,4 +40,4 @@ namespace GraphCanvas AddMenuAction(aznew PromoteToVariableAction(this)); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.h index 2a2cd5dc39..b22856114b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenus/SlotContextMenu.h @@ -24,4 +24,4 @@ namespace GraphCanvas SlotContextMenu(EditorId editorId, QWidget* parent = nullptr); ~SlotContextMenu() override = default; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/EditorContextMenu.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/EditorContextMenu.cpp index 8b829bd974..737cffa113 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/EditorContextMenu.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/EditorContextMenu.cpp @@ -313,4 +313,4 @@ namespace GraphCanvas } #include <StaticLib/GraphCanvas/Widgets/EditorContextMenu/moc_EditorContextMenu.cpp> -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasEditorDockWidget.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasEditorDockWidget.cpp index ba22f2dc78..aaf370ad75 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasEditorDockWidget.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasEditorDockWidget.cpp @@ -116,4 +116,4 @@ namespace GraphCanvas } #include <StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/moc_GraphCanvasEditorDockWidget.cpp> -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.cpp index 12b65c366f..a850bb0c1f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.cpp @@ -69,4 +69,4 @@ namespace GraphCanvas { return FromBuffer(buffer.data(), buffer.size()); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.h index 62d3af98be..5e4c8e186d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeContainer.h @@ -37,4 +37,4 @@ namespace GraphCanvas AZStd::vector< GraphCanvasMimeEvent* > m_mimeEvents; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.cpp index f80b0c4ce6..a5be292147 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.cpp @@ -35,4 +35,4 @@ namespace GraphCanvas { return m_createdNodeId; } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.h index 2b53af9ae4..134bb59bbd 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasMimeEvent.h @@ -42,4 +42,4 @@ namespace GraphCanvas protected: NodeId m_createdNodeId; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.cpp index d05ed67da3..f1126fde60 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.cpp @@ -31,4 +31,4 @@ namespace GraphCanvas ; } } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.h index 69d081c70c..00c84cf7a5 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/MimeEvents/CreateSplicingNodeMimeEvent.h @@ -29,4 +29,4 @@ namespace GraphCanvas virtual AZ::EntityId CreateSplicingNode(const AZ::EntityId& graphId) = 0; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/DraggableNodePaletteTreeItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/DraggableNodePaletteTreeItem.h index fa56629c77..dae3ad7c63 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/DraggableNodePaletteTreeItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/DraggableNodePaletteTreeItem.h @@ -30,4 +30,4 @@ namespace GraphCanvas protected: Qt::ItemFlags OnFlags() const override; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.cpp index 91786c581e..03e964edc5 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.cpp @@ -74,4 +74,4 @@ namespace GraphCanvas m_paletteConfiguration.SetColorPalette(GetTitlePalette()); StyleManagerRequestBus::EventResult(m_iconPixmap, GetEditorId(), &StyleManagerRequests::GetConfiguredPaletteIcon, m_paletteConfiguration); } -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h index 5d4803a17b..9f77c9dfdc 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h @@ -44,4 +44,4 @@ namespace GraphCanvas PaletteIconConfiguration m_paletteConfiguration; const QPixmap* m_iconPixmap; }; -} \ No newline at end of file +} diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/bottom_align_icon.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/bottom_align_icon.svg index 7ebdeef401..d7247a8521 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/bottom_align_icon.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/bottom_align_icon.svg @@ -9,4 +9,4 @@ <path d="M21,19 L21,21 L3,21 L3,19 L21,19 Z M18,7 L18,17 L14,17 L14,7 L18,7 Z M10,3 L10,17 L6,17 L6,3 L10,3 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="evenodd"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/comment.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/comment.svg index 25c21e78ae..7e2426af6c 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/comment.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/comment.svg @@ -9,4 +9,4 @@ <path d="M22,4 L22,17 L10.001,16.999 L7,20 L7,16.999 L2,17 L2,4 L22,4 Z M4,6 L4,15 L8.499,14.999 L8.5,16.5 L10,14.999 L20,15 L20,6 L4,6 Z" id="Combined-Shape" fill="#E9E9E9" fill-rule="nonzero"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/group.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/group.svg index 40f007decc..1e13863a60 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/group.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/group.svg @@ -6,4 +6,4 @@ <g id="icons-/-Landscape-Canvas-/-Grouping" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M30,2 L30,30 L2,30 L2,2 L30,2 Z M26.5462028,5.52392578 L5.54620282,5.52392578 L5.54620282,26.5239258 L26.5462028,26.5239258 L26.5462028,5.52392578 Z M17.7111051,9.02445276 L17.7111051,14.2817803 L23.0356379,14.2817803 L23.0356379,22.9755472 L14.2418294,22.9755472 L14.2418294,17.7867383 L8.96436214,17.7867383 L8.96436214,9.02445276 L17.7111051,9.02445276 Z M17.7349663,15.983006 L17.7349663,17.743742 L15.9632358,17.743742 L15.9632358,21.1949384 L21.2383309,21.1949384 L21.2383309,16 L17.7349663,15.983006 Z" id="Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/left_align_icon.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/left_align_icon.svg index cf640c44ca..5784ef7ce6 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/left_align_icon.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/left_align_icon.svg @@ -9,4 +9,4 @@ <path d="M5,3 L5,21 L3,21 L3,3 L5,3 Z M21,14 L21,18 L7,18 L7,14 L21,14 Z M17,6 L17,10 L7,10 L7,6 L17,6 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="evenodd"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/right_align_icon.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/right_align_icon.svg index d749cb1c02..3cf0cb6016 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/right_align_icon.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/right_align_icon.svg @@ -9,4 +9,4 @@ <path d="M21,3 L21,21 L19,21 L19,3 L21,3 Z M17,14 L17,18 L3,18 L3,14 L17,14 Z M17,6 L17,10 L7,10 L7,6 L17,6 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="evenodd"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/top_align_icon.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/top_align_icon.svg index efe0d3c63b..bfeb99518f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/top_align_icon.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/top_align_icon.svg @@ -9,4 +9,4 @@ <path d="M10,7 L10,21 L6,21 L6,7 L10,7 Z M18,7 L18,17 L14,17 L14,7 L18,7 Z M21,3 L21,5 L3,5 L3,3 L21,3 Z" id="Combined-Shape" fill="#FFFFFF" fill-rule="evenodd"></path> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/ungroup.svg b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/ungroup.svg index 3134e1213a..4572330eda 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/ungroup.svg +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Resources/ungroup.svg @@ -6,4 +6,4 @@ <g id="icons-/-Landscape-Canvas-/-Remove-grouping" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M5.47902674,26.4735381 L5.47902674,30 L2,30 L2,26.4735381 L5.47902674,26.4735381 Z M14.2789101,26.4735381 L14.2789101,30 L8.9762327,30 L8.9762327,26.4735381 L14.2789101,26.4735381 Z M22.9896853,26.4735381 L22.9896853,30 L17.7378398,30 L17.7378398,26.4735381 L22.9896853,26.4735381 Z M29.999125,26.472875 L30,30 L26.4790267,30 L26.4790267,26.4735381 L29.999125,26.472875 Z M2,17.7332467 L5.47902674,17.7731917 L5.47902674,23.0190096 L2,23.0190096 L2,17.7332467 Z M30,17.7332467 L30,23.0190096 L26.4790267,23.0086668 L26.4790267,17.7332467 L30,17.7332467 Z M17.7111051,9.02445276 L17.7111051,14.2817803 L23.0356379,14.2817803 L23.0356379,22.9755472 L14.2418294,22.9755472 L14.2418294,17.7867383 L8.96436214,17.7867383 L8.96436214,9.02445276 L17.7111051,9.02445276 Z M17.7349663,15.983006 L17.7349663,17.743742 L15.9632358,17.743742 L15.9632358,21.1949384 L21.2383309,21.1949384 L21.2383309,16 L17.7349663,15.983006 Z M5.47902674,8.93482633 L5.47902674,14.2809008 L2,14.2809008 L2,8.93482633 L5.47902674,8.93482633 Z M14.3320952,2 L14.3320952,5.47353812 L8.93753784,5.47353812 L8.93753784,2 L14.3320952,2 Z M26.9064078,2 L30,5.09359217 L27.2157248,7.877375 L30,10.6620581 L26.9064078,13.7556502 L24.1217248,10.971375 L21.3379419,13.7556502 L18.2443498,10.6620581 L21.0285998,7.877375 L18.2443498,5.09359217 L21.3379419,2 L24.1217248,4.78425 L26.9064078,2 Z M5.47902674,2 L5.47902674,5.47353812 L2,5.47353812 L2,2 L5.47902674,2 Z" id="Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/GraphModel/Code/Source/Model/DataType.cpp b/Gems/GraphModel/Code/Source/Model/DataType.cpp index b953e1a1d5..b0cd0a0fae 100644 --- a/Gems/GraphModel/Code/Source/Model/DataType.cpp +++ b/Gems/GraphModel/Code/Source/Model/DataType.cpp @@ -97,4 +97,4 @@ namespace GraphModel return m_cppName; } -} // namespace GraphModel \ No newline at end of file +} // namespace GraphModel diff --git a/Gems/GraphModel/graphModelIcon.svg b/Gems/GraphModel/graphModelIcon.svg index fd92bbde76..243acfec02 100644 --- a/Gems/GraphModel/graphModelIcon.svg +++ b/Gems/GraphModel/graphModelIcon.svg @@ -15,4 +15,4 @@ <path d="M116.234623,51 L116.235151,61.1172047 C119.234313,61.6941486 121.5,64.3324845 121.5,67.5 C121.5,71.0898509 118.589851,74 115,74 C111.410149,74 108.5,71.0898509 108.5,67.5 C108.5,64.1006491 111.109483,61.3107755 114.434576,61.0242519 L114.434872,53 L94.266304,53 L94.266304,51 L116.234623,51 Z M115,61 C114.8095,61 114.620914,61.0081951 114.434576,61.0242519 L114.434872,68.1169974 L112.089197,65.9431628 L110.964598,67.1398202 L115.214598,71 L119.464598,67.1398202 L118.491298,65.9431628 L116.234623,68.1169974 L116.235151,61.1172047 C115.835263,61.0402789 115.422335,61 115,61 Z" id="Combined-Shape" fill="#FFFFFF"></path> <path d="M70.7797259,53 L70.7795543,61.0462657 C74.0018665,61.4314035 76.5,64.1739666 76.5,67.5 C76.5,71.0898509 73.5898509,74 70,74 C66.4101491,74 63.5,71.0898509 63.5,67.5 C63.5,64.2574979 65.874231,61.5695271 68.9790649,61.0797158 L68.9799751,53 L70.7797259,53 Z M70,61 C69.6526513,61 69.3116661,61.0272454 68.9790649,61.0797158 L68.9799751,68.1169974 L66.7233001,65.9431628 L65.75,67.1398202 L70,71 L74.25,67.1398202 L73.1254005,65.9431628 L70.7797259,68.1169974 L70.7795543,61.0462657 C70.523964,61.015717 70.2638174,61 70,61 Z" id="Combined-Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp b/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp index bce46bce0e..326bb125f6 100644 --- a/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp +++ b/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp @@ -198,4 +198,4 @@ namespace HttpRequestor AZStd::string data(std::istreambuf_iterator<char>(httpResponse->GetResponseBody()), eos); httpRequestParameters.GetCallback()(AZStd::move(data), httpResponse->GetResponseCode()); } -} \ No newline at end of file +} diff --git a/Gems/HttpRequestor/Code/Source/HttpRequestor_precompiled.h b/Gems/HttpRequestor/Code/Source/HttpRequestor_precompiled.h index 02b1192e47..f6fc1d0ee9 100644 --- a/Gems/HttpRequestor/Code/Source/HttpRequestor_precompiled.h +++ b/Gems/HttpRequestor/Code/Source/HttpRequestor_precompiled.h @@ -12,4 +12,4 @@ #pragma once -#include <AzCore/PlatformDef.h> \ No newline at end of file +#include <AzCore/PlatformDef.h> diff --git a/Gems/ImGui/Code/CMakeLists.txt b/Gems/ImGui/Code/CMakeLists.txt index 1f04033039..9b594d86f9 100644 --- a/Gems/ImGui/Code/CMakeLists.txt +++ b/Gems/ImGui/Code/CMakeLists.txt @@ -26,7 +26,7 @@ ly_add_target( PRIVATE Source INTERFACE - ../External/ImGui/v1.70 + ../External/ImGui/v1.82 PUBLIC Include COMPILE_DEFINITIONS diff --git a/Gems/ImGui/Code/Editor/ImGuiMainWindow.h b/Gems/ImGui/Code/Editor/ImGuiMainWindow.h index e123e20fce..659ec7b4c1 100644 --- a/Gems/ImGui/Code/Editor/ImGuiMainWindow.h +++ b/Gems/ImGui/Code/Editor/ImGuiMainWindow.h @@ -52,4 +52,4 @@ namespace ImGui }; } -#endif //__IMGUI_MAINWINDOW_H__ \ No newline at end of file +#endif //__IMGUI_MAINWINDOW_H__ diff --git a/Gems/ImGui/Code/Editor/ImGuiViewport.cpp b/Gems/ImGui/Code/Editor/ImGuiViewport.cpp index 8ba6b81239..2db55f8d3e 100644 --- a/Gems/ImGui/Code/Editor/ImGuiViewport.cpp +++ b/Gems/ImGui/Code/Editor/ImGuiViewport.cpp @@ -45,7 +45,7 @@ ImGuiViewportWidget::ImGuiViewportWidget(QWidget* parent) ImGuiViewportWidget::~ImGuiViewportWidget() { DestroyRenderContext(); - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetEditorWindowState, + ImGuiManagerBus::Broadcast(&IImGuiManager::SetEditorWindowState, DisplayState::Hidden); } @@ -68,7 +68,7 @@ bool ImGuiViewportWidget::CreateRenderContext() editor->GetEnv()->pRenderer->CreateContext(window); RestorePreviousContext(); - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetEditorWindowState, + ImGuiManagerBus::Broadcast(&IImGuiManager::SetEditorWindowState, DisplayState::Visible); m_creatingRenderContext = false; @@ -154,8 +154,8 @@ void ImGuiViewportWidget::Render() ColorF stateMessageColor(Col_Gray); AZStd::string stateMessage = "No State"; DisplayState visibilityState = DisplayState::Hidden; - ImGuiManagerListenerBus::BroadcastResult(visibilityState, - &IImGuiManagerListener::GetEditorWindowState); + ImGuiManagerBus::BroadcastResult(visibilityState, + &IImGuiManager::GetEditorWindowState); switch (visibilityState) { case ImGui::DisplayState::Hidden: diff --git a/Gems/ImGui/Code/Include/ImGuiBus.h b/Gems/ImGui/Code/Include/ImGuiBus.h index 2b2afacb8e..92747b81e9 100644 --- a/Gems/ImGui/Code/Include/ImGuiBus.h +++ b/Gems/ImGui/Code/Include/ImGuiBus.h @@ -68,13 +68,12 @@ namespace ImGui typedef AZ::EBus<IImGuiUpdateListener> ImGuiUpdateListenerBus; // Bus for sending events and getting state from the ImGui manager - class IImGuiManagerListener : public AZ::EBusTraits + class IImGuiManager { public: - static const char* GetUniqueName() { return "IImGuiManagerListener"; } - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; - using Bus = AZ::EBus<IImGuiManagerListener>; + AZ_RTTI(IImGuiManager, "{F5A0F08B-F2DA-43B7-8CD2-C6FC71E1A712}"); + + static const char* GetUniqueName() { return "IImGuiManager"; } virtual DisplayState GetEditorWindowState() const = 0; virtual void SetEditorWindowState(DisplayState state) = 0; @@ -90,9 +89,20 @@ namespace ImGui virtual void SetResolutionMode(ImGuiResolutionMode state) = 0; virtual const ImVec2& GetImGuiRenderResolution() const = 0; virtual void SetImGuiRenderResolution(const ImVec2& res) = 0; + virtual void OverrideRenderWindowSize(uint32_t width, uint32_t height) = 0; + virtual void RestoreRenderWindowSizeToDefault() = 0; virtual void Render() = 0; }; - typedef AZ::EBus<IImGuiManagerListener> ImGuiManagerListenerBus; + + class IImGuiManagerRequests + : public AZ::EBusTraits + { + public: + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + using Bus = AZ::EBus<IImGuiManager>; + }; + using ImGuiManagerBus = AZ::EBus<IImGuiManager, IImGuiManagerRequests>; // Bus for getting notifications from the IMGUI Entity Outliner class IImGuiEntityOutlinerNotifcations : public AZ::EBusTraits diff --git a/Gems/ImGui/Code/Include/ImGuiLYCurveEditorBus.h b/Gems/ImGui/Code/Include/ImGuiLYCurveEditorBus.h index ddefbbf343..19b79e4927 100644 --- a/Gems/ImGui/Code/Include/ImGuiLYCurveEditorBus.h +++ b/Gems/ImGui/Code/Include/ImGuiLYCurveEditorBus.h @@ -28,4 +28,4 @@ namespace ImGui using ImGuiCurveEditorRequestBus = AZ::EBus<IImGuiCurveEditorRequests>; -} // namespace ImGui \ No newline at end of file +} // namespace ImGui diff --git a/Gems/ImGui/Code/Source/ImGuiManager.cpp b/Gems/ImGui/Code/Source/ImGuiManager.cpp index c446c98175..e10a59bde1 100644 --- a/Gems/ImGui/Code/Source/ImGuiManager.cpp +++ b/Gems/ImGui/Code/Source/ImGuiManager.cpp @@ -143,7 +143,7 @@ namespace void ImGuiManager::Initialize() { // Register for Buses - ImGuiManagerListenerBus::Handler::BusConnect(); + ImGuiManagerBus::Handler::BusConnect(); // Register for Input Notifications InputChannelEventListener::Connect(); @@ -236,10 +236,14 @@ void ImGuiManager::Initialize() // Future work here could include responding to the mouse being connected and disconnected at run-time, but this is fine for now. const AzFramework::InputDevice* mouseDevice = AzFramework::InputDeviceRequests::FindInputDevice(AzFramework::InputDeviceMouse::Id); m_hardwardeMouseConnected = mouseDevice && mouseDevice->IsConnected(); + + AZ::Interface<ImGui::IImGuiManager>::Register(this); } void ImGuiManager::Shutdown() { + AZ::Interface<ImGui::IImGuiManager>::Unregister(this); + if (!gEnv) { AZ_Warning("ImGuiManager", false, "%s %s", __func__, "gEnv Invalid -- Skipping ImGui Shutdown."); @@ -253,7 +257,7 @@ void ImGuiManager::Shutdown() #endif // Unregister from Buses - ImGuiManagerListenerBus::Handler::BusDisconnect(); + ImGuiManagerBus::Handler::BusDisconnect(); InputChannelEventListener::Disconnect(); InputTextEventListener::Disconnect(); AzFramework::WindowNotificationBus::Handler::BusDisconnect(); @@ -262,6 +266,21 @@ void ImGuiManager::Shutdown() ImGui::DestroyContext(m_imguiContext); } +void ImGui::ImGuiManager::OverrideRenderWindowSize(uint32_t width, uint32_t height) +{ + m_windowSize.m_width = width; + m_windowSize.m_height = height; + m_overridingWindowSize = true; + // Don't listen for window updates if our window size is being overridden + AzFramework::WindowNotificationBus::Handler::BusDisconnect(); +} + +void ImGui::ImGuiManager::RestoreRenderWindowSizeToDefault() +{ + m_overridingWindowSize = false; + InitWindowSize(); +} + void ImGuiManager::Render() { if (m_clientMenuBarState == DisplayState::Hidden && m_editorWindowState == DisplayState::Hidden) @@ -317,7 +336,7 @@ void ImGuiManager::Render() } // If no item and no window is focused, we should artificially add focus to the Main Menu Bar, to save 1 step when navigating with a controller. - if (!ImGui::IsAnyItemFocused() && !ImGui::IsAnyWindowFocused()) + if (!ImGui::IsAnyItemFocused() && !ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)) { ImGuiWindow* mainMenuWin = ImGui::FindWindowByName("##MainMenuBar"); if (mainMenuWin) @@ -757,7 +776,7 @@ void ImGuiManager::InitWindowSize() { // We only need to initialize the window size by querying the window the first time. // After that we will get OnWindowResize notifications - if (!AzFramework::WindowNotificationBus::Handler::BusIsConnected()) + if (!m_overridingWindowSize && !AzFramework::WindowNotificationBus::Handler::BusIsConnected()) { AzFramework::NativeWindowHandle windowHandle = nullptr; AzFramework::WindowSystemRequestBus::BroadcastResult(windowHandle, &AzFramework::WindowSystemRequestBus::Events::GetDefaultWindowHandle); @@ -814,27 +833,27 @@ void OnEnableCameraMonitorCBFunc(ICVar* pArgs) void OnShowImGuiCBFunc(ICVar* pArgs) { - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::SetClientMenuBarState, pArgs->GetIVal() != 0 ? ImGui::DisplayState::Visible : ImGui::DisplayState::Hidden); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::SetClientMenuBarState, pArgs->GetIVal() != 0 ? ImGui::DisplayState::Visible : ImGui::DisplayState::Hidden); } void OnDiscreteInputModeCBFunc(ICVar* pArgs) { - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::SetEnableDiscreteInputMode, pArgs->GetIVal() != 0 ); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::SetEnableDiscreteInputMode, pArgs->GetIVal() != 0 ); } void OnEnableControllerCBFunc(ICVar* pArgs) { - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::EnableControllerSupportMode, ImGuiControllerModeFlags::Contextual, (pArgs->GetIVal() != 0)); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Contextual, (pArgs->GetIVal() != 0)); } void OnEnableControllerMouseCBFunc(ICVar* pArgs) { - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::EnableControllerSupportMode, ImGuiControllerModeFlags::Mouse, (pArgs->GetIVal() != 0)); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Mouse, (pArgs->GetIVal() != 0)); } void OnControllerMouseSensitivityCBFunc(ICVar* pArgs) { - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::SetControllerMouseSensitivity, pArgs->GetFVal()); + ImGui::ImGuiManagerBus::Broadcast(&ImGui::IImGuiManager::SetControllerMouseSensitivity, pArgs->GetFVal()); } diff --git a/Gems/ImGui/Code/Source/ImGuiManager.h b/Gems/ImGui/Code/Source/ImGuiManager.h index 6d2281d8d3..3af1c6a22b 100644 --- a/Gems/ImGui/Code/Source/ImGuiManager.h +++ b/Gems/ImGui/Code/Source/ImGuiManager.h @@ -33,7 +33,7 @@ namespace ImGui class ImGuiManager : public AzFramework::InputChannelEventListener , public AzFramework::InputTextEventListener - , public ImGuiManagerListenerBus::Handler + , public ImGuiManagerBus::Handler , public AzFramework::WindowNotificationBus::Handler { public: @@ -45,7 +45,7 @@ namespace ImGui protected: void RenderImGuiBuffers(const ImVec2& scaleRects); - // -- ImGuiManagerListenerBus Interface ------------------------------------------------------------------- + // -- ImGuiManagerBus Interface ------------------------------------------------------------------- DisplayState GetEditorWindowState() const override { return m_editorWindowState; } void SetEditorWindowState(DisplayState state) override { m_editorWindowState = state; } DisplayState GetClientMenuBarState() const override { return m_clientMenuBarState; } @@ -60,8 +60,10 @@ namespace ImGui void SetResolutionMode(ImGuiResolutionMode mode) override { m_resolutionMode = mode; } const ImVec2& GetImGuiRenderResolution() const override { return m_renderResolution; } void SetImGuiRenderResolution(const ImVec2& res) override { m_renderResolution = res; } + void OverrideRenderWindowSize(uint32_t width, uint32_t height) override; + void RestoreRenderWindowSizeToDefault() override; void Render() override; - // -- ImGuiManagerListenerBus Interface ------------------------------------------------------------------- + // -- ImGuiManagerBus Interface ------------------------------------------------------------------- // -- AzFramework::InputChannelEventListener and AzFramework::InputTextEventListener Interface ------------ bool OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) override; @@ -89,6 +91,7 @@ namespace ImGui ImVec2 m_renderResolution = ImVec2(1920.0f, 1080.0f); ImVec2 m_lastRenderResolution; AzFramework::WindowSize m_windowSize = AzFramework::WindowSize(1920, 1080); + bool m_overridingWindowSize = false; // Rendering buffers std::vector<SVF_P3F_C4B_T2F> m_vertBuffer; diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp index 68780c6f60..770e1190be 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp @@ -362,7 +362,7 @@ namespace ImGui ImGui::NextColumn(); // A Small Legend and Hints section for help using this thing ImGui::BeginChild("MouseHoverLegendChild", ImVec2(250.0f, 30.0f), true); - if (ImGui::IsMouseHoveringWindow()) + if (ImGui::IsWindowHovered()) { ImGui::BeginTooltip(); ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Legend:"); @@ -389,7 +389,7 @@ namespace ImGui ImGui::EndTooltip(); } - ImGui::TextColored(ImGui::IsMouseHoveringWindow() ? ImGui::Colors::s_NiceLabelColor : ImGui::Colors::s_PlainLabelColor, "Mouse Over For Legend and Tips"); + ImGui::TextColored(ImGui::IsWindowHovered() ? ImGui::Colors::s_NiceLabelColor : ImGui::Colors::s_PlainLabelColor, "Mouse Over For Legend and Tips"); ImGui::EndChild(); // MouseHover Child ImGui::NextColumn(); diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCameraMonitor.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCameraMonitor.cpp index 1549157c44..8b55efbc4b 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCameraMonitor.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCameraMonitor.cpp @@ -115,7 +115,7 @@ namespace ImGui ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Previous Cam %d: %s %s", i, camInfo.m_camId.ToString().c_str(), camInfo.m_camName.c_str()); ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, " Active Cam frames/time: %d / %.02f", camInfo.m_activeFrames, camInfo.m_activeTime); - if (ImGui::IsMouseHoveringWindow()) + if (ImGui::IsWindowHovered()) { ImGui::BeginTooltip(); ImGui::BeginChild(AZStd::string::format("cameraInfoTooltip%d", i).c_str(), ImVec2(500.0f, 140.0f), true); diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp index c157189400..8e3e2663d5 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCommonMenu.cpp @@ -100,7 +100,7 @@ namespace ImGui { // Get Discrete Input state now, we will use it both inside the ImGui SubMenu, and along the main task bar ( when it is on ) bool discreteInputEnabled = false; - ImGuiManagerListenerBus::BroadcastResult(discreteInputEnabled, &IImGuiManagerListener::GetEnableDiscreteInputMode); + ImGuiManagerBus::BroadcastResult(discreteInputEnabled, &IImGuiManager::GetEnableDiscreteInputMode); // Input Mode Display { @@ -116,7 +116,7 @@ namespace ImGui { // Discrete Input - Control ImGui and Game independently. ImGui::DisplayState state; - ImGui::ImGuiManagerListenerBus::BroadcastResult(state, &ImGui::IImGuiManagerListener::GetClientMenuBarState); + ImGui::ImGuiManagerBus::BroadcastResult(state, &ImGui::IImGuiManager::GetClientMenuBarState); if (state == DisplayState::Visible) { inputTitle.append("ImGui"); @@ -414,40 +414,40 @@ namespace ImGui // Controller Support - Contextual { bool controllerEnabled = false; - ImGuiManagerListenerBus::BroadcastResult(controllerEnabled, &IImGuiManagerListener::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual); + ImGuiManagerBus::BroadcastResult(controllerEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual); bool controllerEnabledCheckbox = controllerEnabled; ImGui::Checkbox(AZStd::string::format("Controller Support (Contextual) %s (Click Checkbox to Toggle)", controllerEnabledCheckbox ? "On" : "Off").c_str(), &controllerEnabledCheckbox); if (controllerEnabledCheckbox != controllerEnabled) { - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::EnableControllerSupportMode, ImGuiControllerModeFlags::Contextual, controllerEnabledCheckbox); + ImGuiManagerBus::Broadcast(&IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Contextual, controllerEnabledCheckbox); } } // Controller Support - Mouse { bool controllerMouseEnabled = false; - ImGuiManagerListenerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManagerListener::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse); + ImGuiManagerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse); bool controllerMouseEnabledCheckbox = controllerMouseEnabled; ImGui::Checkbox(AZStd::string::format("Controller Support (Mouse) %s (Click Checkbox to Toggle)", controllerMouseEnabledCheckbox ? "On" : "Off").c_str(), &controllerMouseEnabledCheckbox); if (controllerMouseEnabledCheckbox != controllerMouseEnabled) { - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::EnableControllerSupportMode, ImGuiControllerModeFlags::Mouse, controllerMouseEnabledCheckbox); + ImGuiManagerBus::Broadcast(&IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Mouse, controllerMouseEnabledCheckbox); } // Only draw Controller Mouse Sensitivity slider if the mouse is enabled if (controllerMouseEnabled) { float controllerMouseSensitivity = 1.0f; - ImGuiManagerListenerBus::BroadcastResult(controllerMouseSensitivity, &IImGuiManagerListener::GetControllerMouseSensitivity); + ImGuiManagerBus::BroadcastResult(controllerMouseSensitivity, &IImGuiManager::GetControllerMouseSensitivity); float controllerMouseSensitivitySlider = controllerMouseSensitivity; ImGui::DragFloat("Controller Mouse Sensitivity", &controllerMouseSensitivitySlider, 0.1f, 0.1f, 50.0f); if (controllerMouseSensitivitySlider != controllerMouseSensitivity) { - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetControllerMouseSensitivity, controllerMouseSensitivitySlider); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetControllerMouseSensitivity, controllerMouseSensitivitySlider); } } } @@ -458,7 +458,7 @@ namespace ImGui ImGui::Checkbox(AZStd::string::format("Discrete Input %s (Click Checkbox to Toggle)", discreteInputEnabledCheckbox ? "On" : "Off").c_str(), &discreteInputEnabledCheckbox); if (discreteInputEnabledCheckbox != discreteInputEnabled) { - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetEnableDiscreteInputMode, discreteInputEnabledCheckbox); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetEnableDiscreteInputMode, discreteInputEnabledCheckbox); } } @@ -484,7 +484,7 @@ namespace ImGui ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "ImGui Resolution Mode:"); ImGuiResolutionMode resMode = ImGuiResolutionMode::MatchRenderResolution; - ImGuiManagerListenerBus::BroadcastResult(resMode, &IImGuiManagerListener::GetResolutionMode); + ImGuiManagerBus::BroadcastResult(resMode, &IImGuiManager::GetResolutionMode); int resModeRadioBtn = static_cast<int>(resMode); ImGui::RadioButton("Force Resolution", &resModeRadioBtn, static_cast<int>(ImGuiResolutionMode::LockToResolution)); @@ -496,12 +496,12 @@ namespace ImGui ImGuiResolutionMode resModeRadioBtnResult = static_cast<ImGuiResolutionMode>(resModeRadioBtn); if (resModeRadioBtnResult != resMode) { - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetResolutionMode, resModeRadioBtnResult); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetResolutionMode, resModeRadioBtnResult); } // Resolutions ImVec2 imGuiRes; - ImGuiManagerListenerBus::BroadcastResult(imGuiRes, &IImGuiManagerListener::GetImGuiRenderResolution); + ImGuiManagerBus::BroadcastResult(imGuiRes, &IImGuiManager::GetImGuiRenderResolution); ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Current ImGui Resolution: "); ImGui::SameLine(); @@ -518,7 +518,7 @@ namespace ImGui if (ImGui::Button(AZStd::string::format("%d x %d", s_renderResolutionWidths[j], renderHeight).c_str(), ImVec2(400, 0))) { ImVec2 newRenderRes(static_cast<float>(s_renderResolutionWidths[j]), static_cast<float>(renderHeight)); - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetImGuiRenderResolution, newRenderRes); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetImGuiRenderResolution, newRenderRes); } } } @@ -539,8 +539,8 @@ namespace ImGui { int assertLevelValue = gAssertLevelCVAR->GetIVal(); int dragIntVal = assertLevelValue; - ImGui::Text("sys_asserts: %d ( 0-off | 1-log | 2-popup )", assertLevelValue); - ImGui::SliderInt("##sys_asserts", &dragIntVal, 0, 2); + ImGui::Text("sys_asserts: %d ( 0-off | 1-log | 2-popup | 3-crash )", assertLevelValue); + ImGui::SliderInt("##sys_asserts", &dragIntVal, 0, 3); if (dragIntVal != assertLevelValue) { gAssertLevelCVAR->Set(dragIntVal); @@ -577,10 +577,10 @@ namespace ImGui void ImGuiLYCommonMenu::OnImGuiUpdate_DrawControllerLegend() { bool contextualControllerEnabled = false; - ImGuiManagerListenerBus::BroadcastResult(contextualControllerEnabled, &IImGuiManagerListener::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual); + ImGuiManagerBus::BroadcastResult(contextualControllerEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual); bool controllerMouseEnabled = false; - ImGuiManagerListenerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManagerListener::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse); + ImGuiManagerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse); ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Contextual Controller Input Legend. Currently Enabled:"); ImGui::SameLine(); @@ -701,10 +701,10 @@ namespace ImGui AZ::TickBus::Handler::BusConnect(); // Get the current ImGui Display state to restore it later. - ImGuiManagerListenerBus::BroadcastResult(m_telemetryCapturePreCaptureState, &IImGuiManagerListener::GetClientMenuBarState); + ImGuiManagerBus::BroadcastResult(m_telemetryCapturePreCaptureState, &IImGuiManager::GetClientMenuBarState); // Turn off the ImGui Manager - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetClientMenuBarState, DisplayState::Hidden); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetClientMenuBarState, DisplayState::Hidden); } void ImGuiLYCommonMenu::StopTelemetryCapture() @@ -714,7 +714,7 @@ namespace ImGui // Restore ImGui State // Turn off the ImGui Manager - ImGuiManagerListenerBus::Broadcast(&IImGuiManagerListener::SetClientMenuBarState, m_telemetryCapturePreCaptureState); + ImGuiManagerBus::Broadcast(&IImGuiManager::SetClientMenuBarState, m_telemetryCapturePreCaptureState); // Reset timer and disconnect tick bus m_telemetryCaptureTimeRemaining = 0.0f; diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCurveEditor.h b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCurveEditor.h index f375730f37..859d87e61c 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCurveEditor.h +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYCurveEditor.h @@ -30,4 +30,4 @@ namespace ImGui }; } -#endif // IMGUI_ENABLED \ No newline at end of file +#endif // IMGUI_ENABLED diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp index a9479c91c5..9d0641e0a3 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp @@ -1227,4 +1227,4 @@ namespace ImGui } } // namespace ImGui -#endif // IMGUI_ENABLED \ No newline at end of file +#endif // IMGUI_ENABLED diff --git a/Gems/ImGui/Code/Source/LYImGuiUtils/HistogramContainer.cpp b/Gems/ImGui/Code/Source/LYImGuiUtils/HistogramContainer.cpp index 6170195874..742dec0be9 100644 --- a/Gems/ImGui/Code/Source/LYImGuiUtils/HistogramContainer.cpp +++ b/Gems/ImGui/Code/Source/LYImGuiUtils/HistogramContainer.cpp @@ -96,7 +96,7 @@ namespace ImGui } // Toggle collapsing when double clicking this "window" - if (ImGui::IsMouseDoubleClicked(0) && ImGui::IsMouseHoveringWindow()) + if (ImGui::IsMouseDoubleClicked(0) && ImGui::IsWindowHovered()) { m_collapsed = !m_collapsed; } diff --git a/Gems/ImGui/Code/Source/Platform/Windows/imgui_windows.cmake b/Gems/ImGui/Code/Source/Platform/Windows/imgui_windows.cmake index e67e6e6177..8cbcfa68bc 100644 --- a/Gems/ImGui/Code/Source/Platform/Windows/imgui_windows.cmake +++ b/Gems/ImGui/Code/Source/Platform/Windows/imgui_windows.cmake @@ -13,4 +13,4 @@ set(LY_COMPILE_DEFINITIONS PRIVATE IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS -) \ No newline at end of file +) diff --git a/Gems/ImGui/Code/imgui_lib_files.cmake b/Gems/ImGui/Code/imgui_lib_files.cmake index 395af97e17..f663dd14d0 100644 --- a/Gems/ImGui/Code/imgui_lib_files.cmake +++ b/Gems/ImGui/Code/imgui_lib_files.cmake @@ -10,12 +10,13 @@ # set(FILES - ../External/ImGui/v1.70/imgui/imconfig.h - ../External/ImGui/v1.70/imgui/imgui.cpp - ../External/ImGui/v1.70/imgui/imgui.h - ../External/ImGui/v1.70/imgui/imgui_draw.cpp - ../External/ImGui/v1.70/imgui/imgui_internal.h - ../External/ImGui/v1.70/imgui/imgui_user.h - ../External/ImGui/v1.70/imgui/imgui_user.inl - ../External/ImGui/v1.70/imgui/imgui_widgets.cpp + ../External/ImGui/v1.82/imgui/imconfig.h + ../External/ImGui/v1.82/imgui/imgui.cpp + ../External/ImGui/v1.82/imgui/imgui.h + ../External/ImGui/v1.82/imgui/imgui_draw.cpp + ../External/ImGui/v1.82/imgui/imgui_internal.h + ../External/ImGui/v1.82/imgui/imgui_tables.cpp + ../External/ImGui/v1.82/imgui/imgui_user.h + ../External/ImGui/v1.82/imgui/imgui_user.inl + ../External/ImGui/v1.82/imgui/imgui_widgets.cpp ) diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/.editorconfig b/Gems/ImGui/External/ImGui/v1.70/imgui/.editorconfig deleted file mode 100644 index 3dd05d3de1..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# editorconfig.org - -# top-most EditorConfig file -root = true - -# Default settings: -# Use 4 spaces as indentation -[*] -indent_style = space -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[imstb_*] -indent_size = 3 -trim_trailing_whitespace = false - -[Makefile] -indent_style = tab -indent_size = 4 diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/.travis.yml b/Gems/ImGui/External/ImGui/v1.70/imgui/.travis.yml deleted file mode 100644 index 7a554baf67..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -language: cpp -sudo: required -dist: trusty - -os: - - linux - - osx - -compiler: - - gcc - - clang - -before_install: - - if [ $TRAVIS_OS_NAME == linux ]; then - sudo apt-get update -qq; - sudo apt-get install -y --no-install-recommends libxrandr-dev libxi-dev libxxf86vm-dev libsdl2-dev; - wget https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip; - unzip glfw-3.2.1.zip && cd glfw-3.2.1; - cmake -DBUILD_SHARED_LIBS=true -DGLFW_BUILD_EXAMPLES=false -DGLFW_BUILD_TESTS=false -DGLFW_BUILD_DOCS=false .; - sudo make -j $CPU_NUM install && cd ..; - fi - - if [ $TRAVIS_OS_NAME == osx ]; then - brew update; - brew install glfw3; - brew install sdl2; - fi - -script: - - make -C examples/example_glfw_opengl2 - - make -C examples/example_glfw_opengl3 - - make -C examples/example_sdl_opengl3 - - if [ $TRAVIS_OS_NAME == osx ]; then - xcodebuild -project examples/example_apple_metal/example_apple_metal.xcodeproj -target example_apple_metal_macos; - fi diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imconfig.h b/Gems/ImGui/External/ImGui/v1.70/imgui/imconfig.h deleted file mode 100644 index cfc2af53e8..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imconfig.h +++ /dev/null @@ -1,81 +0,0 @@ -// Modifications copyright Amazon.com, Inc. or its affiliates. - -//----------------------------------------------------------------------------- -// COMPILE-TIME OPTIONS FOR DEAR IMGUI -// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. -// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. -//----------------------------------------------------------------------------- -// A) You may edit imconfig.h (and not overwrite it when updating imgui, or maintain a patch/branch with your modifications to imconfig.h) -// B) or add configuration directives in your own file and compile with #define IMGUI_USER_CONFIG "myfilename.h" -// If you do so you need to make sure that configuration settings are defined consistently _everywhere_ dear imgui is used, which include -// the imgui*.cpp files but also _any_ of your code that uses imgui. This is because some compile-time options have an affect on data structures. -// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. -// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. -//----------------------------------------------------------------------------- - -#pragma once - -// Include Platform Def to get mutliplatform AZ_DLL_IMPORT and AZ_DLL_EXPORT to use below -#include <AzCore/PlatformDef.h> - -//---- Define assertion handler. Defaults to calling assert(). -//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) -//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts - -//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows. -#ifdef IMGUI_API_IMPORT - #define IMGUI_API AZ_DLL_IMPORT -#else - #define IMGUI_API AZ_DLL_EXPORT -#endif // IMGUI_API_IMPORT - -//---- Don't define obsolete functions/enums names. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. -//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty) -//---- It is very strongly recommended to NOT disable the demo windows during development. Please read the comments in imgui_demo.cpp. -//#define IMGUI_DISABLE_DEMO_WINDOWS - -//---- Don't implement some functions to reduce linkage requirements. -//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. -//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] Don't implement default IME handler. Won't use and link with ImmGetContext/ImmSetCompositionWindow. -//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function. -//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself if you don't want to link with vsnprintf. -//#define IMGUI_DISABLE_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 wrapper so you can implement them yourself. Declare your prototypes in imconfig.h. -//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). - -//---- Include imgui_user.h at the end of imgui.h as a convenience -//#define IMGUI_INCLUDE_IMGUI_USER_H - -//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) -//#define IMGUI_USE_BGRA_PACKED_COLOR - -//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version -// By default the embedded implementations are declared static and not available outside of imgui cpp files. -//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" -//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" -//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION -//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION - -//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. -// This will be inlined as part of ImVec2 and ImVec4 class declarations. -/* -#define IM_VEC2_CLASS_EXTRA \ - ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \ - operator MyVec2() const { return MyVec2(x,y); } - -#define IM_VEC4_CLASS_EXTRA \ - ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \ - operator MyVec4() const { return MyVec4(x,y,z,w); } -*/ - -//---- Use 32-bit vertex indices (default is 16-bit) to allow meshes with more than 64K vertices. Render function needs to support it. -//#define ImDrawIdx unsigned int - -//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. -/* -namespace ImGui -{ - void MyFunction(const char* name, const MyMatrix44& v); -} -*/ diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_demo.cpp b/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_demo.cpp deleted file mode 100644 index 62196c64dd..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_demo.cpp +++ /dev/null @@ -1,4501 +0,0 @@ -// dear imgui, v1.70 -// (demo code) - -// Message to the person tempted to delete this file when integrating Dear ImGui into their code base: -// Do NOT remove this file from your project! Think again! It is the most useful reference code that you and other coders -// will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of -// your game/app! Removing this file from your project is hindering access to documentation for everyone in your team, -// likely leading you to poorer usage of the library. -// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). -// If you want to link core Dear ImGui in your shipped builds but want an easy guarantee that the demo will not be linked, -// you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty. -// In other situation, whenever you have Dear ImGui available you probably want this to be available for reference. -// Thank you, -// -Your beloved friend, imgui_demo.cpp (that you won't delete) - -// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: -// In this demo code, we frequently we use 'static' variables inside functions. A static variable persist across calls, so it is -// essentially like a global variable but declared inside the scope of the function. We do this as a way to gather code and data -// in the same place, to make the demo source code faster to read, faster to write, and smaller in size. -// It also happens to be a convenient way of storing simple UI related information as long as your function doesn't need to be reentrant -// or used in threads. This might be a pattern you will want to use in your code, but most of the real data you would be editing is -// likely going to be stored outside your functions. - -/* - -Index of this file: - -// [SECTION] Forward Declarations, Helpers -// [SECTION] Demo Window / ShowDemoWindow() -// [SECTION] About Window / ShowAboutWindow() -// [SECTION] Style Editor / ShowStyleEditor() -// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() -// [SECTION] Example App: Debug Console / ShowExampleAppConsole() -// [SECTION] Example App: Debug Log / ShowExampleAppLog() -// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() -// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() -// [SECTION] Example App: Long Text / ShowExampleAppLongText() -// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() -// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() -// [SECTION] Example App: Simple Overlay / ShowExampleAppSimpleOverlay() -// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() -// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() -// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() - -*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#include <ctype.h> // toupper -#include <limits.h> // INT_MIN, INT_MAX -#include <math.h> // sqrtf, powf, cosf, sinf, floorf, ceilf -#include <stdio.h> // vsnprintf, sscanf, printf -#include <stdlib.h> // NULL, malloc, free, atoi -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include <stddef.h> // intptr_t -#else -#include <stdint.h> // intptr_t -#endif - -#ifdef _MSC_VER -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#endif -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning : 'xx' is deprecated: The POSIX name for this item.. // for strdup used in demo code (so user can copy & paste the code) -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int' -#pragma clang diagnostic ignored "-Wformat-security" // warning : warning: format string is not a string literal -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#pragma clang diagnostic ignored "-Wunused-macros" // warning : warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used. -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0 -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#endif -#if __has_warning("-Wreserved-id-macro") -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier // -#endif -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size -#pragma GCC diagnostic ignored "-Wformat-security" // warning : format string is not a string literal (potentially insecure) -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#if (__GNUC__ >= 6) -#pragma GCC diagnostic ignored "-Wmisleading-indentation" // warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. -#endif -#endif - -// Play it nice with Windows users. Notepad in 2017 still doesn't display text data with Unix-style \n. -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#else -#define IM_NEWLINE "\n" -#endif - -#define IM_MAX(_A,_B) (((_A) >= (_B)) ? (_A) : (_B)) - -//----------------------------------------------------------------------------- -// [SECTION] Forward Declarations, Helpers -//----------------------------------------------------------------------------- - -#if !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && defined(IMGUI_DISABLE_TEST_WINDOWS) && !defined(IMGUI_DISABLE_DEMO_WINDOWS) // Obsolete name since 1.53, TEST->DEMO -#define IMGUI_DISABLE_DEMO_WINDOWS -#endif - -#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) - -// Forward Declarations -static void ShowExampleAppDocuments(bool* p_open); -static void ShowExampleAppMainMenuBar(); -static void ShowExampleAppConsole(bool* p_open); -static void ShowExampleAppLog(bool* p_open); -static void ShowExampleAppLayout(bool* p_open); -static void ShowExampleAppPropertyEditor(bool* p_open); -static void ShowExampleAppLongText(bool* p_open); -static void ShowExampleAppAutoResize(bool* p_open); -static void ShowExampleAppConstrainedResize(bool* p_open); -static void ShowExampleAppSimpleOverlay(bool* p_open); -static void ShowExampleAppWindowTitles(bool* p_open); -static void ShowExampleAppCustomRendering(bool* p_open); -static void ShowExampleMenuFile(); - -// Helper to display a little (?) mark which shows a tooltip when hovered. -// In your own code you may want to display an actual icon if you are using a merged icon fonts (see misc/fonts/README.txt) -static void HelpMarker(const char* desc) -{ - ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); - ImGui::TextUnformatted(desc); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -// Helper to display basic user controls. -void ImGui::ShowUserGuide() -{ - ImGuiIO& io = ImGui::GetIO(); - ImGui::BulletText("Double-click on title bar to collapse window."); - ImGui::BulletText("Click and drag on lower right corner to resize window\n(double-click to auto fit window to its contents)."); - ImGui::BulletText("Click and drag on any empty space to move window."); - ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); - ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); - if (io.FontAllowUserScaling) - ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); - ImGui::BulletText("Mouse Wheel to scroll."); - ImGui::BulletText("While editing text:\n"); - ImGui::Indent(); - ImGui::BulletText("Hold SHIFT or use mouse to select text."); - ImGui::BulletText("CTRL+Left/Right to word jump."); - ImGui::BulletText("CTRL+A or double-click to select all."); - ImGui::BulletText("CTRL+X,CTRL+C,CTRL+V to use clipboard."); - ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); - ImGui::BulletText("ESCAPE to revert."); - ImGui::BulletText("You can apply arithmetic operators +,*,/ on numerical values.\nUse +- to subtract."); - ImGui::Unindent(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Demo Window / ShowDemoWindow() -//----------------------------------------------------------------------------- - -// We split the contents of the big ShowDemoWindow() function into smaller functions (because the link time of very large functions grow non-linearly) -static void ShowDemoWindowWidgets(); -static void ShowDemoWindowLayout(); -static void ShowDemoWindowPopups(); -static void ShowDemoWindowColumns(); -static void ShowDemoWindowMisc(); - -// Demonstrate most Dear ImGui features (this is big function!) -// You may execute this function to experiment with the UI and understand what it does. You may then search for keywords in the code when you are interested by a specific feature. -void ImGui::ShowDemoWindow(bool* p_open) -{ - IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); // Exceptionally add an extra assert here for people confused with initial dear imgui setup - - // Examples Apps (accessible from the "Examples" menu) - static bool show_app_documents = false; - static bool show_app_main_menu_bar = false; - static bool show_app_console = false; - static bool show_app_log = false; - static bool show_app_layout = false; - static bool show_app_property_editor = false; - static bool show_app_long_text = false; - static bool show_app_auto_resize = false; - static bool show_app_constrained_resize = false; - static bool show_app_simple_overlay = false; - static bool show_app_window_titles = false; - static bool show_app_custom_rendering = false; - - if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); - if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); - if (show_app_console) ShowExampleAppConsole(&show_app_console); - if (show_app_log) ShowExampleAppLog(&show_app_log); - if (show_app_layout) ShowExampleAppLayout(&show_app_layout); - if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); - if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); - if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); - if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); - if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); - if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); - if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); - - // Dear ImGui Apps (accessible from the "Help" menu) - static bool show_app_metrics = false; - static bool show_app_style_editor = false; - static bool show_app_about = false; - - if (show_app_metrics) { ImGui::ShowMetricsWindow(&show_app_metrics); } - if (show_app_style_editor) { ImGui::Begin("Style Editor", &show_app_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); } - if (show_app_about) { ImGui::ShowAboutWindow(&show_app_about); } - - // Demonstrate the various window flags. Typically you would just use the default! - static bool no_titlebar = false; - static bool no_scrollbar = false; - static bool no_menu = false; - static bool no_move = false; - static bool no_resize = false; - static bool no_collapse = false; - static bool no_close = false; - static bool no_nav = false; - static bool no_background = false; - static bool no_bring_to_front = false; - - ImGuiWindowFlags window_flags = 0; - if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; - if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; - if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; - if (no_move) window_flags |= ImGuiWindowFlags_NoMove; - if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; - if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; - if (no_nav) window_flags |= ImGuiWindowFlags_NoNav; - if (no_background) window_flags |= ImGuiWindowFlags_NoBackground; - if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; - if (no_close) p_open = NULL; // Don't pass our bool* to Begin - - // We specify a default position/size in case there's no data in the .ini file. Typically this isn't required! We only do it to make the Demo applications a little more welcoming. - ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver); - ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); - - // Main body of the Demo window starts here. - if (!ImGui::Begin("ImGui Demo", p_open, window_flags)) - { - // Early out if the window is collapsed, as an optimization. - ImGui::End(); - return; - } - - // Most "big" widgets share a common width settings by default. - //ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // Use 2/3 of the space for widgets and 1/3 for labels (default) - ImGui::PushItemWidth(ImGui::GetFontSize() * -12); // Use fixed width for labels (by passing a negative value), the rest goes to widgets. We choose a width proportional to our font size. - - // Menu Bar - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Menu")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Examples")) - { - ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); - ImGui::MenuItem("Console", NULL, &show_app_console); - ImGui::MenuItem("Log", NULL, &show_app_log); - ImGui::MenuItem("Simple layout", NULL, &show_app_layout); - ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); - ImGui::MenuItem("Long text display", NULL, &show_app_long_text); - ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); - ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); - ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); - ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); - ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); - ImGui::MenuItem("Documents", NULL, &show_app_documents); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Help")) - { - ImGui::MenuItem("Metrics", NULL, &show_app_metrics); - ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); - ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION); - ImGui::Spacing(); - - if (ImGui::CollapsingHeader("Help")) - { - ImGui::Text("PROGRAMMER GUIDE:"); - ImGui::BulletText("Please see the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); - ImGui::BulletText("Please see the comments in imgui.cpp."); - ImGui::BulletText("Please see the examples/ in application."); - ImGui::BulletText("Enable 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); - ImGui::BulletText("Enable 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); - ImGui::Separator(); - - ImGui::Text("USER GUIDE:"); - ImGui::ShowUserGuide(); - } - - if (ImGui::CollapsingHeader("Configuration")) - { - ImGuiIO& io = ImGui::GetIO(); - - if (ImGui::TreeNode("Configuration##2")) - { - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); - ImGui::SameLine(); HelpMarker("Required back-end to feed in gamepad inputs in io.NavInputs[] and set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details."); - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos); - ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos."); - ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NoMouse); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) // Create a way to restore this flag otherwise we could be stuck completely! - { - if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f) - { - ImGui::SameLine(); - ImGui::Text("<<PRESS SPACE TO DISABLE>>"); - } - if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Space))) - io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse; - } - ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); - ImGui::SameLine(); HelpMarker("Instruct back-end to not alter mouse cursor shape and visibility."); - ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink); - ImGui::SameLine(); HelpMarker("Set to false to disable blinking cursor, for users who consider it distracting"); - ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges); - ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); - ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); - ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); - ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor for you. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); - ImGui::TreePop(); - ImGui::Separator(); - } - - if (ImGui::TreeNode("Backend Flags")) - { - HelpMarker("Those flags are set by the back-ends (imgui_impl_xxx files) to specify their capabilities."); - ImGuiBackendFlags backend_flags = io.BackendFlags; // Make a local copy to avoid modifying actual back-end flags. - ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasGamepad); - ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasMouseCursors); - ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasSetMousePos); - ImGui::TreePop(); - ImGui::Separator(); - } - - if (ImGui::TreeNode("Style")) - { - ImGui::ShowStyleEditor(); - ImGui::TreePop(); - ImGui::Separator(); - } - - if (ImGui::TreeNode("Capture/Logging")) - { - ImGui::TextWrapped("The logging API redirects all text output so you can easily capture the content of a window or a block. Tree nodes can be automatically expanded."); - HelpMarker("Try opening any of the contents below in this window and then click one of the \"Log To\" button."); - ImGui::LogButtons(); - ImGui::TextWrapped("You can also call ImGui::LogText() to output directly to the log without a visual output."); - if (ImGui::Button("Copy \"Hello, world!\" to clipboard")) - { - ImGui::LogToClipboard(); - ImGui::LogText("Hello, world!"); - ImGui::LogFinish(); - } - ImGui::TreePop(); - } - } - - if (ImGui::CollapsingHeader("Window options")) - { - ImGui::Checkbox("No titlebar", &no_titlebar); ImGui::SameLine(150); - ImGui::Checkbox("No scrollbar", &no_scrollbar); ImGui::SameLine(300); - ImGui::Checkbox("No menu", &no_menu); - ImGui::Checkbox("No move", &no_move); ImGui::SameLine(150); - ImGui::Checkbox("No resize", &no_resize); ImGui::SameLine(300); - ImGui::Checkbox("No collapse", &no_collapse); - ImGui::Checkbox("No close", &no_close); ImGui::SameLine(150); - ImGui::Checkbox("No nav", &no_nav); ImGui::SameLine(300); - ImGui::Checkbox("No background", &no_background); - ImGui::Checkbox("No bring to front", &no_bring_to_front); - } - - // All demo contents - ShowDemoWindowWidgets(); - ShowDemoWindowLayout(); - ShowDemoWindowPopups(); - ShowDemoWindowColumns(); - ShowDemoWindowMisc(); - - // End of ShowDemoWindow() - ImGui::End(); -} - -static void ShowDemoWindowWidgets() -{ - if (!ImGui::CollapsingHeader("Widgets")) - return; - - if (ImGui::TreeNode("Basic")) - { - static int clicked = 0; - if (ImGui::Button("Button")) - clicked++; - if (clicked & 1) - { - ImGui::SameLine(); - ImGui::Text("Thanks for clicking me!"); - } - - static bool check = true; - ImGui::Checkbox("checkbox", &check); - - static int e = 0; - ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); - ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); - ImGui::RadioButton("radio c", &e, 2); - - // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. - for (int i = 0; i < 7; i++) - { - if (i > 0) - ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i/7.0f, 0.8f, 0.8f)); - ImGui::Button("Click"); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - - // Use AlignTextToFramePadding() to align text baseline to the baseline of framed elements (otherwise a Text+SameLine+Button sequence will have the text a little too high by default) - ImGui::AlignTextToFramePadding(); - ImGui::Text("Hold to repeat:"); - ImGui::SameLine(); - - // Arrow buttons with Repeater - static int counter = 0; - float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::PushButtonRepeat(true); - if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; } - ImGui::SameLine(0.0f, spacing); - if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; } - ImGui::PopButtonRepeat(); - ImGui::SameLine(); - ImGui::Text("%d", counter); - - ImGui::Text("Hover over me"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip"); - - ImGui::SameLine(); - ImGui::Text("- or me"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("I am a fancy tooltip"); - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); - ImGui::EndTooltip(); - } - - ImGui::Separator(); - - ImGui::LabelText("label", "Value"); - - { - // Using the _simplified_ one-liner Combo() api here - // See "Combo" section for examples of how to use the more complete BeginCombo()/EndCombo() api. - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; - static int item_current = 0; - ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); - ImGui::SameLine(); HelpMarker("Refer to the \"Combo\" section below for an explanation of the full BeginCombo/EndCombo API, and demonstration of various flags.\n"); - } - - { - static char str0[128] = "Hello, world!"; - ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); - ImGui::SameLine(); HelpMarker("USER:\nHold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n\nPROGRAMMER:\nYou can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated in imgui_demo.cpp)."); - - static char str1[128] = ""; - ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1)); - - static int i0 = 123; - ImGui::InputInt("input int", &i0); - ImGui::SameLine(); HelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\nUse +- to subtract.\n"); - - static float f0 = 0.001f; - ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f"); - - static double d0 = 999999.00000001; - ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f"); - - static float f1 = 1.e10f; - ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e"); - ImGui::SameLine(); HelpMarker("You can input value using the scientific notation,\n e.g. \"1e+8\" becomes \"100000000\".\n"); - - static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - ImGui::InputFloat3("input float3", vec4a); - } - - { - static int i1 = 50, i2 = 42; - ImGui::DragInt("drag int", &i1, 1); - ImGui::SameLine(); HelpMarker("Click and drag to edit value.\nHold SHIFT/ALT for faster/slower edit.\nDouble-click or CTRL+click to input value."); - - ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%"); - - static float f1=1.00f, f2=0.0067f; - ImGui::DragFloat("drag float", &f1, 0.005f); - ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); - } - - { - static int i1=0; - ImGui::SliderInt("slider int", &i1, -1, 3); - ImGui::SameLine(); HelpMarker("CTRL+click to input value."); - - static float f1=0.123f, f2=0.0f; - ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); - ImGui::SliderFloat("slider float (curve)", &f2, -10.0f, 10.0f, "%.4f", 2.0f); - static float angle = 0.0f; - ImGui::SliderAngle("slider angle", &angle); - } - - { - static float col1[3] = { 1.0f,0.0f,0.2f }; - static float col2[4] = { 0.4f,0.7f,0.0f,0.5f }; - ImGui::ColorEdit3("color 1", col1); - ImGui::SameLine(); HelpMarker("Click on the colored square to open a color picker.\nClick and hold to use drag and drop.\nRight-click on the colored square to show options.\nCTRL+click on individual component to input value.\n"); - - ImGui::ColorEdit4("color 2", col2); - } - - { - // List box - const char* listbox_items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; - static int listbox_item_current = 1; - ImGui::ListBox("listbox\n(single select)", &listbox_item_current, listbox_items, IM_ARRAYSIZE(listbox_items), 4); - - //static int listbox_item_current2 = 2; - //ImGui::SetNextItemWidth(-1); - //ImGui::ListBox("##listbox2", &listbox_item_current2, listbox_items, IM_ARRAYSIZE(listbox_items), 4); - } - - ImGui::TreePop(); - } - - // Testing ImGuiOnceUponAFrame helper. - //static ImGuiOnceUponAFrame once; - //for (int i = 0; i < 5; i++) - // if (once) - // ImGui::Text("This will be displayed only once."); - - if (ImGui::TreeNode("Trees")) - { - if (ImGui::TreeNode("Basic trees")) - { - for (int i = 0; i < 5; i++) - if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) - { - ImGui::Text("blah blah"); - ImGui::SameLine(); - if (ImGui::SmallButton("button")) { }; - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Advanced, with Selectable nodes")) - { - HelpMarker("This is a more typical looking tree with selectable nodes.\nClick to select, CTRL+Click to toggle, click on arrows or double-click to open."); - static bool align_label_with_current_x_position = false; - ImGui::Checkbox("Align label with current X position)", &align_label_with_current_x_position); - ImGui::Text("Hello!"); - if (align_label_with_current_x_position) - ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); - - static int selection_mask = (1 << 2); // Dumb representation of what may be user-side selection state. You may carry selection state inside or outside your objects in whatever format you see fit. - int node_clicked = -1; // Temporary storage of what node we have clicked to process selection at the end of the loop. May be a pointer to your own node type, etc. - ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, ImGui::GetFontSize()*3); // Increase spacing to differentiate leaves from expanded contents. - for (int i = 0; i < 6; i++) - { - // Disable the default open on single-click behavior and pass in Selected flag according to our selection state. - ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; - if (selection_mask & (1 << i)) - node_flags |= ImGuiTreeNodeFlags_Selected; - if (i < 3) - { - // Items 0..2 are Tree Node - bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); - if (ImGui::IsItemClicked()) - node_clicked = i; - if (node_open) - { - ImGui::Text("Blah blah\nBlah Blah"); - ImGui::TreePop(); - } - } - else - { - // Items 3..5 are Tree Leaves - // The only reason we use TreeNode at all is to allow selection of the leaf. - // Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text(). - node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet - ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); - if (ImGui::IsItemClicked()) - node_clicked = i; - } - } - if (node_clicked != -1) - { - // Update selection state. Process outside of tree loop to avoid visual inconsistencies during the clicking-frame. - if (ImGui::GetIO().KeyCtrl) - selection_mask ^= (1 << node_clicked); // CTRL+click to toggle - else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, this commented bit preserve selection when clicking on item that is part of the selection - selection_mask = (1 << node_clicked); // Click to single-select - } - ImGui::PopStyleVar(); - if (align_label_with_current_x_position) - ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Collapsing Headers")) - { - static bool closable_group = true; - ImGui::Checkbox("Show 2nd header", &closable_group); - if (ImGui::CollapsingHeader("Header")) - { - ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("Some content %d", i); - } - if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) - { - ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("More content %d", i); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Bullets")) - { - ImGui::BulletText("Bullet point 1"); - ImGui::BulletText("Bullet point 2\nOn multiple lines"); - ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); - ImGui::Bullet(); ImGui::SmallButton("Button"); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Text")) - { - if (ImGui::TreeNode("Colored Text")) - { - // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. - ImGui::TextColored(ImVec4(1.0f,0.0f,1.0f,1.0f), "Pink"); - ImGui::TextColored(ImVec4(1.0f,1.0f,0.0f,1.0f), "Yellow"); - ImGui::TextDisabled("Disabled"); - ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle."); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Word Wrapping")) - { - // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. - ImGui::TextWrapped("This text should automatically wrap on the edge of the window. The current implementation for text wrapping follows simple rules suitable for English and possibly other languages."); - ImGui::Spacing(); - - static float wrap_width = 200.0f; - ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); - - ImGui::Text("Test paragraph 1:"); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255)); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); - ImGui::Text("The lazy dog is a good dog. This paragraph is made to fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); - ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255)); - ImGui::PopTextWrapPos(); - - ImGui::Text("Test paragraph 2:"); - pos = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255)); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); - ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); - ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255)); - ImGui::PopTextWrapPos(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("UTF-8 Text")) - { - // UTF-8 test with Japanese characters - // (Needs a suitable font, try Noto, or Arial Unicode, or M+ fonts. Read misc/fonts/README.txt for details.) - // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 - // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. Visual Studio save your file as 'UTF-8 without signature') - // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 CHARACTERS IN THIS SOURCE FILE. - // Instead we are encoding a few strings with hexadecimal constants. Don't do this in your application! - // Please use u8"text in any language" in your application! - // Note that characters values are preserved even by InputText() if the font cannot be displayed, so you can safely copy & paste garbled characters into another application. - ImGui::TextWrapped("CJK text will only appears if the font was loaded with the appropriate CJK character ranges. Call io.Font->AddFontFromFileTTF() manually to load extra character ranges. Read misc/fonts/README.txt for details."); - ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. - ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); - static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; - //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis - ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Images")) - { - ImGuiIO& io = ImGui::GetIO(); - ImGui::TextWrapped("Below we are displaying the font texture (which is the only texture we have access to in this demo). Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. Hover the texture for a zoomed view!"); - - // Here we are grabbing the font texture because that's the only one we have access to inside the demo code. - // Remember that ImTextureID is just storage for whatever you want it to be, it is essentially a value that will be passed to the render function inside the ImDrawCmd structure. - // If you use one of the default imgui_impl_XXXX.cpp renderer, they all have comments at the top of their file to specify what they expect to be stored in ImTextureID. - // (for example, the imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer. The imgui_impl_glfw_gl3.cpp renderer expect a GLuint OpenGL texture identifier etc.) - // If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers to ImGui::Image(), and gather width/height through your own functions, etc. - // Using ShowMetricsWindow() as a "debugger" to inspect the draw data that are being passed to your render will help you debug issues if you are confused about this. - // Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). - ImTextureID my_tex_id = io.Fonts->TexID; - float my_tex_w = (float)io.Fonts->TexWidth; - float my_tex_h = (float)io.Fonts->TexHeight; - - ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0,0), ImVec2(1,1), ImVec4(1.0f,1.0f,1.0f,1.0f), ImVec4(1.0f,1.0f,1.0f,0.5f)); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - float region_sz = 32.0f; - float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; if (region_x < 0.0f) region_x = 0.0f; else if (region_x > my_tex_w - region_sz) region_x = my_tex_w - region_sz; - float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; if (region_y < 0.0f) region_y = 0.0f; else if (region_y > my_tex_h - region_sz) region_y = my_tex_h - region_sz; - float zoom = 4.0f; - ImGui::Text("Min: (%.2f, %.2f)", region_x, region_y); - ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz); - ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); - ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); - ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f)); - ImGui::EndTooltip(); - } - ImGui::TextWrapped("And now some textured buttons.."); - static int pressed_count = 0; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); - int frame_padding = -1 + i; // -1 = uses default padding - if (ImGui::ImageButton(my_tex_id, ImVec2(32,32), ImVec2(0,0), ImVec2(32.0f/my_tex_w,32/my_tex_h), frame_padding, ImVec4(0.0f,0.0f,0.0f,1.0f))) - pressed_count += 1; - ImGui::PopID(); - ImGui::SameLine(); - } - ImGui::NewLine(); - ImGui::Text("Pressed %d times.", pressed_count); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Combo")) - { - // Expose flags as checkbox for the demo - static ImGuiComboFlags flags = 0; - ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", (unsigned int*)&flags, ImGuiComboFlags_PopupAlignLeft); - ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); - if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", (unsigned int*)&flags, ImGuiComboFlags_NoArrowButton)) - flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both - if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", (unsigned int*)&flags, ImGuiComboFlags_NoPreview)) - flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both - - // General BeginCombo() API, you have full control over your selection data and display type. - // (your selection data could be an index, a pointer to the object, an id for the object, a flag stored in the object itself, etc.) - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; - static const char* item_current = items[0]; // Here our selection is a single pointer stored outside the object. - if (ImGui::BeginCombo("combo 1", item_current, flags)) // The second parameter is the label previewed before opening the combo. - { - for (int n = 0; n < IM_ARRAYSIZE(items); n++) - { - bool is_selected = (item_current == items[n]); - if (ImGui::Selectable(items[n], is_selected)) - item_current = items[n]; - if (is_selected) - ImGui::SetItemDefaultFocus(); // Set the initial focus when opening the combo (scrolling + for keyboard navigation support in the upcoming navigation branch) - } - ImGui::EndCombo(); - } - - // Simplified one-liner Combo() API, using values packed in a single constant string - static int item_current_2 = 0; - ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - - // Simplified one-liner Combo() using an array of const char* - static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview - ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); - - // Simplified one-liner Combo() using an accessor function - struct FuncHolder { static bool ItemGetter(void* data, int idx, const char** out_str) { *out_str = ((const char**)data)[idx]; return true; } }; - static int item_current_4 = 0; - ImGui::Combo("combo 4 (function)", &item_current_4, &FuncHolder::ItemGetter, items, IM_ARRAYSIZE(items)); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Selectables")) - { - // Selectable() has 2 overloads: - // - The one taking "bool selected" as a read-only selection information. When Selectable() has been clicked is returns true and you can alter selection state accordingly. - // - The one taking "bool* p_selected" as a read-write selection information (convenient in some cases) - // The earlier is more flexible, as in real application your selection may be stored in a different manner (in flags within objects, as an external list, etc). - if (ImGui::TreeNode("Basic")) - { - static bool selection[5] = { false, true, false, false, false }; - ImGui::Selectable("1. I am selectable", &selection[0]); - ImGui::Selectable("2. I am selectable", &selection[1]); - ImGui::Text("3. I am not selectable"); - ImGui::Selectable("4. I am selectable", &selection[3]); - if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) - if (ImGui::IsMouseDoubleClicked(0)) - selection[4] = !selection[4]; - ImGui::TreePop(); - } - if (ImGui::TreeNode("Selection State: Single Selection")) - { - static int selected = -1; - for (int n = 0; n < 5; n++) - { - char buf[32]; - sprintf(buf, "Object %d", n); - if (ImGui::Selectable(buf, selected == n)) - selected = n; - } - ImGui::TreePop(); - } - if (ImGui::TreeNode("Selection State: Multiple Selection")) - { - HelpMarker("Hold CTRL and click to select multiple items."); - static bool selection[5] = { false, false, false, false, false }; - for (int n = 0; n < 5; n++) - { - char buf[32]; - sprintf(buf, "Object %d", n); - if (ImGui::Selectable(buf, selection[n])) - { - if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held - memset(selection, 0, sizeof(selection)); - selection[n] ^= 1; - } - } - ImGui::TreePop(); - } - if (ImGui::TreeNode("Rendering more text into the same line")) - { - // Using the Selectable() override that takes "bool* p_selected" parameter and toggle your booleans automatically. - static bool selected[3] = { false, false, false }; - ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); - ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::TreePop(); - } - if (ImGui::TreeNode("In columns")) - { - ImGui::Columns(3, NULL, false); - static bool selected[16] = { 0 }; - for (int i = 0; i < 16; i++) - { - char label[32]; sprintf(label, "Item %d", i); - if (ImGui::Selectable(label, &selected[i])) {} - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::TreePop(); - } - if (ImGui::TreeNode("Grid")) - { - static bool selected[4*4] = { true, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true }; - for (int i = 0; i < 4*4; i++) - { - ImGui::PushID(i); - if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50))) - { - // Note: We _unnecessarily_ test for both x/y and i here only to silence some static analyzer. The second part of each test is unnecessary. - int x = i % 4; - int y = i / 4; - if (x > 0) { selected[i - 1] ^= 1; } - if (x < 3 && i < 15) { selected[i + 1] ^= 1; } - if (y > 0 && i > 3) { selected[i - 4] ^= 1; } - if (y < 3 && i < 12) { selected[i + 4] ^= 1; } - } - if ((i % 4) < 3) ImGui::SameLine(); - ImGui::PopID(); - } - ImGui::TreePop(); - } - if (ImGui::TreeNode("Alignment")) - { - HelpMarker("Alignment applies when a selectable is larger than its text content.\nBy default, Selectables uses style.SelectableTextAlign but it can be overriden on a per-item basis using PushStyleVar()."); - static bool selected[3*3] = { true, false, true, false, true, false, true, false, true }; - for (int y = 0; y < 3; y++) - { - for (int x = 0; x < 3; x++) - { - ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f); - char name[32]; - sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y); - if (x > 0) ImGui::SameLine(); - ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); - ImGui::Selectable(name, &selected[3*y+x], ImGuiSelectableFlags_None, ImVec2(80,80)); - ImGui::PopStyleVar(); - } - } - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Text Input")) - { - if (ImGui::TreeNode("Multi-line Text Input")) - { - // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize - // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings. - static char text[1024 * 16] = - "/*\n" - " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" - " the hexadecimal encoding of one offending instruction,\n" - " more formally, the invalid operand with locked CMPXCHG8B\n" - " instruction bug, is a design flaw in the majority of\n" - " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" - " processors (all in the P5 microarchitecture).\n" - "*/\n\n" - "label:\n" - "\tlock cmpxchg8b eax\n"; - - static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput; - HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp)"); - ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", (unsigned int*)&flags, ImGuiInputTextFlags_ReadOnly); - ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", (unsigned int*)&flags, ImGuiInputTextFlags_AllowTabInput); - ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", (unsigned int*)&flags, ImGuiInputTextFlags_CtrlEnterForNewLine); - ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), flags); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Filtered Text Input")) - { - static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); - static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); - static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); - static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); - static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); - struct TextFilters { static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) { if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) return 0; return 1; } }; - static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); - - ImGui::Text("Password input"); - static char bufpass[64] = "password123"; - ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank); - ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); - ImGui::InputTextWithHint("password (w/ hint)", "<password>", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank); - ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Resize Callback")) - { - // If you have a custom string type you would typically create a ImGui::InputText() wrapper than takes your type as input. - // See misc/cpp/imgui_stdlib.h and .cpp for an implementation of this using std::string. - HelpMarker("Demonstrate using ImGuiInputTextFlags_CallbackResize to wire your resizable string type to InputText().\n\nSee misc/cpp/imgui_stdlib.h for an implementation of this for std::string."); - struct Funcs - { - static int MyResizeCallback(ImGuiInputTextCallbackData* data) - { - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) - { - ImVector<char>* my_str = (ImVector<char>*)data->UserData; - IM_ASSERT(my_str->begin() == data->Buf); - my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 - data->Buf = my_str->begin(); - } - return 0; - } - - // Tip: Because ImGui:: is a namespace you would typicall add your own function into the namespace in your own source files. - // For example, you may add a function called ImGui::InputText(const char* label, MyString* my_str). - static bool MyInputTextMultiline(const char* label, ImVector<char>* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) - { - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str); - } - }; - - // For this demo we are using ImVector as a string container. - // Note that because we need to store a terminating zero character, our size/capacity are 1 more than usually reported by a typical string class. - static ImVector<char> my_str; - if (my_str.empty()) - my_str.push_back(0); - Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16)); - ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity()); - ImGui::TreePop(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Plots Widgets")) - { - static bool animate = true; - ImGui::Checkbox("Animate", &animate); - - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); - - // Create a dummy array of contiguous float values to plot - // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float and the sizeof() of your structure in the Stride parameter. - static float values[90] = { 0 }; - static int values_offset = 0; - static double refresh_time = 0.0; - if (!animate || refresh_time == 0.0) - refresh_time = ImGui::GetTime(); - while (refresh_time < ImGui::GetTime()) // Create dummy data at fixed 60 hz rate for the demo - { - static float phase = 0.0f; - values[values_offset] = cosf(phase); - values_offset = (values_offset+1) % IM_ARRAYSIZE(values); - phase += 0.10f*values_offset; - refresh_time += 1.0f/60.0f; - } - ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80)); - ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80)); - - // Use functions to generate output - // FIXME: This is rather awkward because current plot API only pass in indices. We probably want an API passing floats and user provide sample rate/count. - struct Funcs - { - static float Sin(void*, int i) { return sinf(i * 0.1f); } - static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } - }; - static int func_type = 0, display_count = 70; - ImGui::Separator(); - ImGui::SetNextItemWidth(100); - ImGui::Combo("func", &func_type, "Sin\0Saw\0"); - ImGui::SameLine(); - ImGui::SliderInt("Sample count", &display_count, 1, 400); - float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; - ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80)); - ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80)); - ImGui::Separator(); - - // Animate a simple progress bar - static float progress = 0.0f, progress_dir = 1.0f; - if (animate) - { - progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; - if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } - if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } - } - - // Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. - ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f)); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - ImGui::Text("Progress Bar"); - - float progress_saturated = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress; - char buf[32]; - sprintf(buf, "%d/%d", (int)(progress_saturated*1753), 1753); - ImGui::ProgressBar(progress, ImVec2(0.f,0.f), buf); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Color/Picker Widgets")) - { - static ImVec4 color = ImVec4(114.0f/255.0f, 144.0f/255.0f, 154.0f/255.0f, 200.0f/255.0f); - - static bool alpha_preview = true; - static bool alpha_half_preview = false; - static bool drag_and_drop = true; - static bool options_menu = true; - static bool hdr = false; - ImGui::Checkbox("With Alpha Preview", &alpha_preview); - ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); - ImGui::Checkbox("With Drag and Drop", &drag_and_drop); - ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options."); - ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); - int misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); - - ImGui::Text("Color widget:"); - ImGui::SameLine(); HelpMarker("Click on the colored square to open a color picker.\nCTRL+click on individual component to input value.\n"); - ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); - - ImGui::Text("Color widget HSV with Alpha:"); - ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags); - - ImGui::Text("Color widget with Float Display:"); - ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); - - ImGui::Text("Color button with Picker:"); - ImGui::SameLine(); HelpMarker("With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\nWith the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only be used for the tooltip and picker popup."); - ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); - - ImGui::Text("Color button with Custom Picker Popup:"); - - // Generate a dummy default palette. The palette will persist and can be edited. - static bool saved_palette_init = true; - static ImVec4 saved_palette[32] = { }; - if (saved_palette_init) - { - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); - saved_palette[n].w = 1.0f; // Alpha - } - saved_palette_init = false; - } - - static ImVec4 backup_color; - bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); - ImGui::SameLine(); - open_popup |= ImGui::Button("Palette"); - if (open_popup) - { - ImGui::OpenPopup("mypicker"); - backup_color = color; - } - if (ImGui::BeginPopup("mypicker")) - { - ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); - ImGui::Separator(); - ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); - ImGui::SameLine(); - - ImGui::BeginGroup(); // Lock X position - ImGui::Text("Current"); - ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40)); - ImGui::Text("Previous"); - if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40))) - color = backup_color; - ImGui::Separator(); - ImGui::Text("Palette"); - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::PushID(n); - if ((n % 8) != 0) - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); - if (ImGui::ColorButton("##palette", saved_palette[n], ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip, ImVec2(20,20))) - color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! - - // Allow user to drop colors into each palette entry - // (Note that ColorButton is already a drag source by default, unless using ImGuiColorEditFlags_NoDragDrop) - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); - ImGui::EndDragDropTarget(); - } - - ImGui::PopID(); - } - ImGui::EndGroup(); - ImGui::EndPopup(); - } - - ImGui::Text("Color button only:"); - ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags, ImVec2(80,80)); - - ImGui::Text("Color picker:"); - static bool alpha = true; - static bool alpha_bar = true; - static bool side_preview = true; - static bool ref_color = false; - static ImVec4 ref_color_v(1.0f,0.0f,1.0f,0.5f); - static int display_mode = 0; - static int picker_mode = 0; - ImGui::Checkbox("With Alpha", &alpha); - ImGui::Checkbox("With Alpha Bar", &alpha_bar); - ImGui::Checkbox("With Side Preview", &side_preview); - if (side_preview) - { - ImGui::SameLine(); - ImGui::Checkbox("With Ref Color", &ref_color); - if (ref_color) - { - ImGui::SameLine(); - ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); - } - } - ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0"); - ImGui::SameLine(); HelpMarker("ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, but the user can change it with a right-click.\n\nColorPicker defaults to displaying RGB+HSV+Hex if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions()."); - ImGui::Combo("Picker Mode", &picker_mode, "Auto/Current\0Hue bar + SV rect\0Hue wheel + SV triangle\0"); - ImGui::SameLine(); HelpMarker("User can right-click the picker to change mode."); - ImGuiColorEditFlags flags = misc_flags; - if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() - if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; - if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; - if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; - if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; - if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays - if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode - if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV; - if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex; - ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); - - ImGui::Text("Programmatically set defaults:"); - ImGui::SameLine(); HelpMarker("SetColorEditOptions() is designed to allow you to set boot-time default.\nWe don't have Push/Pop functions because you can force options on a per-widget basis if needed, and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid encouraging you to persistently save values that aren't forward-compatible."); - if (ImGui::Button("Default: Uint8 + HSV + Hue Bar")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar); - if (ImGui::Button("Default: Float + HDR + Hue Wheel")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); - - // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0) - static ImVec4 color_stored_as_hsv(0.23f, 1.0f, 1.0f, 1.0f); - ImGui::Spacing(); - ImGui::Text("HSV encoded colors"); - ImGui::SameLine(); HelpMarker("By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the added benefit that you can manipulate hue values with the picker even when saturation or value are zero."); - ImGui::Text("Color widget with InputHSV:"); - ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_stored_as_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); - ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_stored_as_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); - ImGui::DragFloat4("Raw HSV values", (float*)&color_stored_as_hsv, 0.01f, 0.0f, 1.0f); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Range Widgets")) - { - static float begin = 10, end = 90; - static int begin_i = 100, end_i = 1000; - ImGui::DragFloatRange2("range", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%"); - ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units"); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Data Types")) - { - // The DragScalar/InputScalar/SliderScalar functions allow various data types: signed/unsigned int/long long and float/double - // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum to pass the type, - // and passing all arguments by address. - // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each types. - // In practice, if you frequently use a given type that is not covered by the normal API entry points, you can wrap it - // yourself inside a 1 line function which can take typed argument as value instead of void*, and then pass their address - // to the generic function. For example: - // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld") - // { - // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format); - // } - - // Limits (as helper variables that we can take the address of) - // Note that the SliderScalar function has a maximum usable range of half the natural type maximum, hence the /2 below. - #ifndef LLONG_MIN - ImS64 LLONG_MIN = -9223372036854775807LL - 1; - ImS64 LLONG_MAX = 9223372036854775807LL; - ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1); - #endif - const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127; - const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255; - const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767; - const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535; - const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2; - const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2; - const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2; - const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2; - const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f; - const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0; - - // State - static char s8_v = 127; - static ImU8 u8_v = 255; - static short s16_v = 32767; - static ImU16 u16_v = 65535; - static ImS32 s32_v = -1; - static ImU32 u32_v = (ImU32)-1; - static ImS64 s64_v = -1; - static ImU64 u64_v = (ImU64)-1; - static float f32_v = 0.123f; - static double f64_v = 90000.01234567890123456789; - - const float drag_speed = 0.2f; - static bool drag_clamp = false; - ImGui::Text("Drags:"); - ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); ImGui::SameLine(); HelpMarker("As with every widgets in dear imgui, we never modify values unless there is a user interaction.\nYou can override the clamping limits by using CTRL+Click to input a value."); - ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL); - ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL); - ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL); - ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL); - ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL); - ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", 1.0f); - ImGui::DragScalar("drag float ^2", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", 2.0f); ImGui::SameLine(); HelpMarker("You can use the 'power' parameter to increase tweaking precision on one side of the range."); - ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams", 1.0f); - ImGui::DragScalar("drag double ^2", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", 2.0f); - - ImGui::Text("Sliders"); - ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d"); - ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u"); - ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d"); - ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u"); - ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d"); - ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d"); - ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d"); - ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); - ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); - ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); - ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%I64d"); - ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%I64d"); - ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%I64d"); - ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%I64u ms"); - ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%I64u ms"); - ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%I64u ms"); - ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); - ImGui::SliderScalar("slider float low^2", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", 2.0f); - ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); - ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams", 1.0f); - ImGui::SliderScalar("slider double low^2",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", 2.0f); - ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams", 1.0f); - - static bool inputs_step = true; - ImGui::Text("Inputs"); - ImGui::Checkbox("Show step buttons", &inputs_step); - ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); - ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%08X", ImGuiInputTextFlags_CharsHexadecimal); - ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); - ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X", ImGuiInputTextFlags_CharsHexadecimal); - ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); - ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); - ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); - ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Multi-component Widgets")) - { - static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - static int vec4i[4] = { 1, 5, 100, 255 }; - - ImGui::InputFloat2("input float2", vec4f); - ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); - ImGui::InputInt2("input int2", vec4i); - ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); - ImGui::SliderInt2("slider int2", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat3("input float3", vec4f); - ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); - ImGui::InputInt3("input int3", vec4i); - ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); - ImGui::SliderInt3("slider int3", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat4("input float4", vec4f); - ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); - ImGui::InputInt4("input int4", vec4i); - ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); - ImGui::SliderInt4("slider int4", vec4i, 0, 255); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Vertical Sliders")) - { - const float spacing = 4; - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); - - static int int_value = 0; - ImGui::VSliderInt("##int", ImVec2(18,160), &int_value, 0, 5); - ImGui::SameLine(); - - static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; - ImGui::PushID("set1"); - for (int i = 0; i < 7; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i/7.0f, 0.5f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i/7.0f, 0.9f, 0.9f)); - ImGui::VSliderFloat("##v", ImVec2(18,160), &values[i], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values[i]); - ImGui::PopStyleColor(4); - ImGui::PopID(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set2"); - static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; - const int rows = 3; - const ImVec2 small_slider_size(18, (160.0f-(rows-1)*spacing)/rows); - for (int nx = 0; nx < 4; nx++) - { - if (nx > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - for (int ny = 0; ny < rows; ny++) - { - ImGui::PushID(nx*rows+ny); - ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values2[nx]); - ImGui::PopID(); - } - ImGui::EndGroup(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set3"); - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); - ImGui::VSliderFloat("##v", ImVec2(40,160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); - ImGui::PopStyleVar(); - ImGui::PopID(); - } - ImGui::PopID(); - ImGui::PopStyleVar(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Drag and Drop")) - { - { - // ColorEdit widgets automatically act as drag source and drag target. - // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F to allow your own widgets - // to use colors in their drag and drop interaction. Also see the demo in Color Picker -> Palette demo. - ImGui::BulletText("Drag and drop in standard widgets"); - ImGui::Indent(); - static float col1[3] = { 1.0f,0.0f,0.2f }; - static float col2[4] = { 0.4f,0.7f,0.0f,0.5f }; - ImGui::ColorEdit3("color 1", col1); - ImGui::ColorEdit4("color 2", col2); - ImGui::Unindent(); - } - - { - ImGui::BulletText("Drag and drop to copy/swap items"); - ImGui::Indent(); - enum Mode - { - Mode_Copy, - Mode_Move, - Mode_Swap - }; - static int mode = 0; - if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine(); - if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine(); - if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; } - static const char* names[9] = { "Bobby", "Beatrice", "Betty", "Brianna", "Barry", "Bernard", "Bibi", "Blaine", "Bryn" }; - for (int n = 0; n < IM_ARRAYSIZE(names); n++) - { - ImGui::PushID(n); - if ((n % 3) != 0) - ImGui::SameLine(); - ImGui::Button(names[n], ImVec2(60,60)); - - // Our buttons are both drag sources and drag targets here! - if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) - { - ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); // Set payload to carry the index of our item (could be anything) - if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } // Display preview (could be anything, e.g. when dragging an image we could decide to display the filename and a small preview of the image, etc.) - if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); } - if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); } - ImGui::EndDragDropSource(); - } - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL")) - { - IM_ASSERT(payload->DataSize == sizeof(int)); - int payload_n = *(const int*)payload->Data; - if (mode == Mode_Copy) - { - names[n] = names[payload_n]; - } - if (mode == Mode_Move) - { - names[n] = names[payload_n]; - names[payload_n] = ""; - } - if (mode == Mode_Swap) - { - const char* tmp = names[n]; - names[n] = names[payload_n]; - names[payload_n] = tmp; - } - } - ImGui::EndDragDropTarget(); - } - ImGui::PopID(); - } - ImGui::Unindent(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Querying Status (Active/Focused/Hovered etc.)")) - { - // Display the value of IsItemHovered() and other common item state functions. Note that the flags can be combined. - // (because BulletText is an item itself and that would affect the output of IsItemHovered() we pass all state in a single call to simplify the code). - static int item_type = 1; - static bool b = false; - static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f }; - static char str[16] = {}; - ImGui::RadioButton("Text", &item_type, 0); - ImGui::RadioButton("Button", &item_type, 1); - ImGui::RadioButton("Checkbox", &item_type, 2); - ImGui::RadioButton("SliderFloat", &item_type, 3); - ImGui::RadioButton("InputText", &item_type, 4); - ImGui::RadioButton("ColorEdit4", &item_type, 5); - ImGui::RadioButton("MenuItem", &item_type, 6); - ImGui::RadioButton("TreeNode (w/ double-click)", &item_type, 7); - ImGui::RadioButton("ListBox", &item_type, 8); - ImGui::Separator(); - bool ret = false; - if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction - if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button - if (item_type == 2) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox - if (item_type == 3) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item - if (item_type == 4) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing) - if (item_type == 5) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) - if (item_type == 6) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) - if (item_type == 7) { ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. - if (item_type == 8) { const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } - ImGui::BulletText( - "Return value = %d\n" - "IsItemFocused() = %d\n" - "IsItemHovered() = %d\n" - "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsItemHovered(_AllowWhenOverlapped) = %d\n" - "IsItemHovered(_RectOnly) = %d\n" - "IsItemActive() = %d\n" - "IsItemEdited() = %d\n" - "IsItemActivated() = %d\n" - "IsItemDeactivated() = %d\n" - "IsItemDeactivatedAfterEdit() = %d\n" - "IsItemVisible() = %d\n" - "IsItemClicked() = %d\n" - "GetItemRectMin() = (%.1f, %.1f)\n" - "GetItemRectMax() = (%.1f, %.1f)\n" - "GetItemRectSize() = (%.1f, %.1f)", - ret, - ImGui::IsItemFocused(), - ImGui::IsItemHovered(), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), - ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), - ImGui::IsItemActive(), - ImGui::IsItemEdited(), - ImGui::IsItemActivated(), - ImGui::IsItemDeactivated(), - ImGui::IsItemDeactivatedAfterEdit(), - ImGui::IsItemVisible(), - ImGui::IsItemClicked(), - ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y, - ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y, - ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y - ); - - static bool embed_all_inside_a_child_window = false; - ImGui::Checkbox("Embed everything inside a child window (for additional testing)", &embed_all_inside_a_child_window); - if (embed_all_inside_a_child_window) - ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20), true); - - // Testing IsWindowFocused() function with its various flags. Note that the flags can be combined. - ImGui::BulletText( - "IsWindowFocused() = %d\n" - "IsWindowFocused(_ChildWindows) = %d\n" - "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" - "IsWindowFocused(_RootWindow) = %d\n" - "IsWindowFocused(_AnyWindow) = %d\n", - ImGui::IsWindowFocused(), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow), - ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow), - ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)); - - // Testing IsWindowHovered() function with its various flags. Note that the flags can be combined. - ImGui::BulletText( - "IsWindowHovered() = %d\n" - "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsWindowHovered(_ChildWindows) = %d\n" - "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" - "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_RootWindow) = %d\n" - "IsWindowHovered(_AnyWindow) = %d\n", - ImGui::IsWindowHovered(), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); - - ImGui::BeginChild("child", ImVec2(0, 50), true); - ImGui::Text("This is another child window for testing the _ChildWindows flag."); - ImGui::EndChild(); - if (embed_all_inside_a_child_window) - ImGui::EndChild(); - - // Calling IsItemHovered() after begin returns the hovered status of the title bar. - // This is useful in particular if you want to create a context menu (with BeginPopupContextItem) associated to the title bar of a window. - static bool test_window = false; - ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window); - if (test_window) - { - ImGui::Begin("Title bar Hovered/Active tests", &test_window); - if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered() - { - if (ImGui::MenuItem("Close")) { test_window = false; } - ImGui::EndPopup(); - } - ImGui::Text( - "IsItemHovered() after begin = %d (== is title bar hovered)\n" - "IsItemActive() after begin = %d (== is window being clicked/moved)\n", - ImGui::IsItemHovered(), ImGui::IsItemActive()); - ImGui::End(); - } - - ImGui::TreePop(); - } -} - -static void ShowDemoWindowLayout() -{ - if (!ImGui::CollapsingHeader("Layout")) - return; - - if (ImGui::TreeNode("Child windows")) - { - HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window."); - static bool disable_mouse_wheel = false; - static bool disable_menu = false; - ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); - ImGui::Checkbox("Disable Menu", &disable_menu); - - static int line = 50; - bool goto_line = ImGui::Button("Goto"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(100); - goto_line |= ImGui::InputInt("##Line", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue); - - // Child 1: no border, enable horizontal scrollbar - { - ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar | (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0); - ImGui::BeginChild("Child1", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f, 260), false, window_flags); - for (int i = 0; i < 100; i++) - { - ImGui::Text("%04d: scrollable region", i); - if (goto_line && line == i) - ImGui::SetScrollHereY(); - } - if (goto_line && line >= 100) - ImGui::SetScrollHereY(); - ImGui::EndChild(); - } - - ImGui::SameLine(); - - // Child 2: rounded border - { - ImGuiWindowFlags window_flags = (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0) | (disable_menu ? 0 : ImGuiWindowFlags_MenuBar); - ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); - ImGui::BeginChild("Child2", ImVec2(0, 260), true, window_flags); - if (!disable_menu && ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Menu")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - ImGui::Columns(2); - for (int i = 0; i < 100; i++) - { - char buf[32]; - sprintf(buf, "%03d", i); - ImGui::Button(buf, ImVec2(-1.0f, 0.0f)); - ImGui::NextColumn(); - } - ImGui::EndChild(); - ImGui::PopStyleVar(); - } - - ImGui::Separator(); - - // Demonstrate a few extra things - // - Changing ImGuiCol_ChildBg (which is transparent black in default styles) - // - Using SetCursorPos() to position the child window (because the child window is an item from the POV of the parent window) - // You can also call SetNextWindowPos() to position the child window. The parent window will effectively layout from this position. - // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from the POV of the parent window) - // See "Widgets" -> "Querying Status (Active/Focused/Hovered etc.)" section for more details about this. - { - ImGui::SetCursorPosX(50); - ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); - ImGui::BeginChild("blah", ImVec2(200, 100), true, ImGuiWindowFlags_None); - for (int n = 0; n < 50; n++) - ImGui::Text("Some test %d", n); - ImGui::EndChild(); - ImVec2 child_rect_min = ImGui::GetItemRectMin(); - ImVec2 child_rect_max = ImGui::GetItemRectMax(); - ImGui::PopStyleColor(); - ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Widgets Width")) - { - // Use SetNextItemWidth() to set the width of a single upcoming item. - // Use PushItemWidth()/PopItemWidth() to set the width of a group of items. - static float f = 0.0f; - ImGui::Text("SetNextItemWidth/PushItemWidth(100)"); - ImGui::SameLine(); HelpMarker("Fixed width."); - ImGui::SetNextItemWidth(100); - ImGui::DragFloat("float##1", &f); - - ImGui::Text("SetNextItemWidth/PushItemWidth(GetWindowWidth() * 0.5f)"); - ImGui::SameLine(); HelpMarker("Half of window width."); - ImGui::SetNextItemWidth(ImGui::GetWindowWidth() * 0.5f); - ImGui::DragFloat("float##2", &f); - - ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)"); - ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x * 0.5f); - ImGui::DragFloat("float##3", &f); - - ImGui::Text("SetNextItemWidth/PushItemWidth(-100)"); - ImGui::SameLine(); HelpMarker("Align to right edge minus 100"); - ImGui::SetNextItemWidth(-100); - ImGui::DragFloat("float##4", &f); - - // Demonstrate using PushItemWidth to surround three items. Calling SetNextItemWidth() before each of them would have the same effect. - ImGui::Text("SetNextItemWidth/PushItemWidth(-1)"); - ImGui::SameLine(); HelpMarker("Align to right edge"); - ImGui::PushItemWidth(-1); - ImGui::DragFloat("float##5a", &f); - ImGui::DragFloat("float##5b", &f); - ImGui::DragFloat("float##5c", &f); - ImGui::PopItemWidth(); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Basic Horizontal Layout")) - { - ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); - - // Text - ImGui::Text("Two items: Hello"); ImGui::SameLine(); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Adjust spacing - ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Button - ImGui::AlignTextToFramePadding(); - ImGui::Text("Normal buttons"); ImGui::SameLine(); - ImGui::Button("Banana"); ImGui::SameLine(); - ImGui::Button("Apple"); ImGui::SameLine(); - ImGui::Button("Corniflower"); - - // Button - ImGui::Text("Small buttons"); ImGui::SameLine(); - ImGui::SmallButton("Like this one"); ImGui::SameLine(); - ImGui::Text("can fit within a text block."); - - // Aligned to arbitrary position. Easy/cheap column. - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::Text("x=150"); - ImGui::SameLine(300); ImGui::Text("x=300"); - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::SmallButton("x=150"); - ImGui::SameLine(300); ImGui::SmallButton("x=300"); - - // Checkbox - static bool c1 = false, c2 = false, c3 = false, c4 = false; - ImGui::Checkbox("My", &c1); ImGui::SameLine(); - ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); - ImGui::Checkbox("Is", &c3); ImGui::SameLine(); - ImGui::Checkbox("Rich", &c4); - - // Various - static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f; - ImGui::PushItemWidth(80); - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; - static int item = -1; - ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); - ImGui::SliderFloat("X", &f0, 0.0f, 5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Y", &f1, 0.0f, 5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Z", &f2, 0.0f, 5.0f); - ImGui::PopItemWidth(); - - ImGui::PushItemWidth(80); - ImGui::Text("Lists:"); - static int selection[4] = { 0, 1, 2, 3 }; - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); - ImGui::PopID(); - //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); - } - ImGui::PopItemWidth(); - - // Dummy - ImVec2 button_sz(40, 40); - ImGui::Button("A", button_sz); ImGui::SameLine(); - ImGui::Dummy(button_sz); ImGui::SameLine(); - ImGui::Button("B", button_sz); - - // Manually wrapping (we should eventually provide this as an automatic layout feature, but for now you can do it manually) - ImGui::Text("Manually wrapping:"); - ImGuiStyle& style = ImGui::GetStyle(); - int buttons_count = 20; - float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x; - for (int n = 0; n < buttons_count; n++) - { - ImGui::PushID(n); - ImGui::Button("Box", button_sz); - float last_button_x2 = ImGui::GetItemRectMax().x; - float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x; // Expected position if next button was on same line - if (n + 1 < buttons_count && next_button_x2 < window_visible_x2) - ImGui::SameLine(); - ImGui::PopID(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Tabs")) - { - if (ImGui::TreeNode("Basic")) - { - ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; - if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) - { - if (ImGui::BeginTabItem("Avocado")) - { - ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Broccoli")) - { - ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Cucumber")) - { - ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::Separator(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Advanced & Close Button")) - { - // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0). - static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; - ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_Reorderable); - ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); - ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); - ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); - if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) - tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); - - // Tab Bar - const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" }; - static bool opened[4] = { true, true, true, true }; // Persistent user state - for (int n = 0; n < IM_ARRAYSIZE(opened); n++) - { - if (n > 0) { ImGui::SameLine(); } - ImGui::Checkbox(names[n], &opened[n]); - } - - // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): the underlying bool will be set to false when the tab is closed. - if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) - { - for (int n = 0; n < IM_ARRAYSIZE(opened); n++) - if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n])) - { - ImGui::Text("This is the %s tab!", names[n]); - if (n & 1) - ImGui::Text("I am an odd tab."); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::Separator(); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Groups")) - { - HelpMarker("Using ImGui::BeginGroup()/EndGroup() to layout items. BeginGroup() basically locks the horizontal position. EndGroup() bundles the whole group so that you can use functions such as IsItemHovered() on it."); - ImGui::BeginGroup(); - { - ImGui::BeginGroup(); - ImGui::Button("AAA"); - ImGui::SameLine(); - ImGui::Button("BBB"); - ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Button("CCC"); - ImGui::Button("DDD"); - ImGui::EndGroup(); - ImGui::SameLine(); - ImGui::Button("EEE"); - ImGui::EndGroup(); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("First group hovered"); - } - // Capture the group size and create widgets using the same size - ImVec2 size = ImGui::GetItemRectSize(); - const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; - ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); - - ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f, size.y)); - ImGui::SameLine(); - ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f, size.y)); - ImGui::EndGroup(); - ImGui::SameLine(); - - ImGui::Button("LEVERAGE\nBUZZWORD", size); - ImGui::SameLine(); - - if (ImGui::ListBoxHeader("List", size)) - { - ImGui::Selectable("Selected", true); - ImGui::Selectable("Not Selected", false); - ImGui::ListBoxFooter(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Text Baseline Alignment")) - { - HelpMarker("This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets."); - - ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("One\nTwo\nThree"); - - ImGui::Button("HOP##1"); ImGui::SameLine(); - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Button("HOP##2"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Button("TEST##1"); ImGui::SameLine(); - ImGui::Text("TEST"); ImGui::SameLine(); - ImGui::SmallButton("TEST##2"); - - ImGui::AlignTextToFramePadding(); // If your line starts with text, call this to align it to upcoming widgets. - ImGui::Text("Text aligned to Widget"); ImGui::SameLine(); - ImGui::Button("Widget##1"); ImGui::SameLine(); - ImGui::Text("Widget"); ImGui::SameLine(); - ImGui::SmallButton("Widget##2"); ImGui::SameLine(); - ImGui::Button("Widget##3"); - - // Tree - const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::Button("Button##1"); - ImGui::SameLine(0.0f, spacing); - if (ImGui::TreeNode("Node##1")) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data - - ImGui::AlignTextToFramePadding(); // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit). - bool node_open = ImGui::TreeNode("Node##2"); // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content. - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); - if (node_open) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data - - // Bullet - ImGui::Button("Button##3"); - ImGui::SameLine(0.0f, spacing); - ImGui::BulletText("Bullet text"); - - ImGui::AlignTextToFramePadding(); - ImGui::BulletText("Node"); - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Scrolling")) - { - HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given position."); - - static bool track = true; - static int track_line = 50, scroll_to_px = 200; - ImGui::Checkbox("Track", &track); - ImGui::PushItemWidth(100); - ImGui::SameLine(130); track |= ImGui::DragInt("##line", &track_line, 0.25f, 0, 99, "Line = %d"); - bool scroll_to = ImGui::Button("Scroll To Pos"); - ImGui::SameLine(130); scroll_to |= ImGui::DragInt("##pos_y", &scroll_to_px, 1.00f, 0, 9999, "Y = %d px"); - ImGui::PopItemWidth(); - if (scroll_to) track = false; - - for (int i = 0; i < 5; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Text("%s", i == 0 ? "Top" : i == 1 ? "25%" : i == 2 ? "Center" : i == 3 ? "75%" : "Bottom"); - ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true); - if (scroll_to) - ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_px, i * 0.25f); - for (int line = 0; line < 100; line++) - { - if (track && line == track_line) - { - ImGui::TextColored(ImVec4(1,1,0,1), "Line %d", line); - ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom - } - else - { - ImGui::Text("Line %d", line); - } - } - float scroll_y = ImGui::GetScrollY(), scroll_max_y = ImGui::GetScrollMaxY(); - ImGui::EndChild(); - ImGui::Text("%.0f/%0.f", scroll_y, scroll_max_y); - ImGui::EndGroup(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Horizontal Scrolling")) - { - HelpMarker("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\nYou may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin()."); - static int lines = 7; - ImGui::SliderInt("Lines", &lines, 1, 15); - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); - ImGui::BeginChild("scrolling", ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30), true, ImGuiWindowFlags_HorizontalScrollbar); - for (int line = 0; line < lines; line++) - { - // Display random stuff (for the sake of this trivial demo we are using basic Button+SameLine. If you want to create your own time line for a real application you may be better off - // manipulating the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets yourself. You may also want to use the lower-level ImDrawList API) - int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); - for (int n = 0; n < num_buttons; n++) - { - if (n > 0) ImGui::SameLine(); - ImGui::PushID(n + line * 1000); - char num_buf[16]; - sprintf(num_buf, "%d", n); - const char* label = (!(n%15)) ? "FizzBuzz" : (!(n%3)) ? "Fizz" : (!(n%5)) ? "Buzz" : num_buf; - float hue = n*0.05f; - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); - ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - } - float scroll_x = ImGui::GetScrollX(); - float scroll_max_x = ImGui::GetScrollMaxX(); - ImGui::EndChild(); - ImGui::PopStyleVar(2); - float scroll_x_delta = 0.0f; - ImGui::SmallButton("<<"); if (ImGui::IsItemActive()) { scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; } ImGui::SameLine(); - ImGui::Text("Scroll from code"); ImGui::SameLine(); - ImGui::SmallButton(">>"); if (ImGui::IsItemActive()) { scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; } ImGui::SameLine(); - ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); - if (scroll_x_delta != 0.0f) - { - ImGui::BeginChild("scrolling"); // Demonstrate a trick: you can use Begin to set yourself in the context of another window (here we are already out of your child window) - ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); - ImGui::EndChild(); - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Clipping")) - { - static ImVec2 size(100, 100), offset(50, 20); - ImGui::TextWrapped("On a per-widget basis we are occasionally clipping text CPU-side if it won't fit in its frame. Otherwise we are doing coarser clipping + passing a scissor rectangle to the renderer. The system is designed to try minimizing both execution and CPU/GPU rendering cost."); - ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f"); - ImGui::TextWrapped("(Click and drag)"); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImVec4 clip_rect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); - ImGui::InvisibleButton("##dummy", size); - if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; } - ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(90, 90, 120, 255)); - ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize()*2.0f, ImVec2(pos.x + offset.x, pos.y + offset.y), IM_COL32(255, 255, 255, 255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect); - ImGui::TreePop(); - } -} - -static void ShowDemoWindowPopups() -{ - if (!ImGui::CollapsingHeader("Popups & Modal windows")) - return; - - // The properties of popups windows are: - // - They block normal mouse hovering detection outside them. (*) - // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. - // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls. - // User can manipulate the visibility state by calling OpenPopup(). - // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup. - // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time. - - // Typical use for regular windows: - // bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End(); - // Typical use for popups: - // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); } - - // With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state. - // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below. - - if (ImGui::TreeNode("Popups")) - { - ImGui::TextWrapped("When a popup is active, it inhibits interacting with windows that are behind the popup. Clicking outside the popup closes it."); - - static int selected_fish = -1; - const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; - static bool toggles[] = { true, false, false, false, false }; - - // Simple selection popup - // (If you want to show the current selection inside the Button itself, you may want to build a string using the "###" operator to preserve a constant ID with a variable label) - if (ImGui::Button("Select..")) - ImGui::OpenPopup("my_select_popup"); - ImGui::SameLine(); - ImGui::TextUnformatted(selected_fish == -1 ? "<None>" : names[selected_fish]); - if (ImGui::BeginPopup("my_select_popup")) - { - ImGui::Text("Aquarium"); - ImGui::Separator(); - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - if (ImGui::Selectable(names[i])) - selected_fish = i; - ImGui::EndPopup(); - } - - // Showing a menu with toggles - if (ImGui::Button("Toggle..")) - ImGui::OpenPopup("my_toggle_popup"); - if (ImGui::BeginPopup("my_toggle_popup")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - ImGui::EndMenu(); - } - - ImGui::Separator(); - ImGui::Text("Tooltip here"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip over a popup"); - - if (ImGui::Button("Stacked Popup")) - ImGui::OpenPopup("another popup"); - if (ImGui::BeginPopup("another popup")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - if (ImGui::Button("Stacked Popup")) - ImGui::OpenPopup("another popup"); - if (ImGui::BeginPopup("another popup")) - { - ImGui::Text("I am the last one here."); - ImGui::EndPopup(); - } - ImGui::EndMenu(); - } - ImGui::EndPopup(); - } - ImGui::EndPopup(); - } - - // Call the more complete ShowExampleMenuFile which we use in various places of this demo - if (ImGui::Button("File Menu..")) - ImGui::OpenPopup("my_file_popup"); - if (ImGui::BeginPopup("my_file_popup")) - { - ShowExampleMenuFile(); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Context menus")) - { - // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: - // if (IsItemHovered() && IsMouseReleased(0)) - // OpenPopup(id); - // return BeginPopup(id); - // For more advanced uses you may want to replicate and cuztomize this code. This the comments inside BeginPopupContextItem() implementation. - static float value = 0.5f; - ImGui::Text("Value = %.3f (<-- right-click here)", value); - if (ImGui::BeginPopupContextItem("item context menu")) - { - if (ImGui::Selectable("Set to zero")) value = 0.0f; - if (ImGui::Selectable("Set to PI")) value = 3.1415f; - ImGui::SetNextItemWidth(-1); - ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); - ImGui::EndPopup(); - } - - // We can also use OpenPopupOnItemClick() which is the same as BeginPopupContextItem() but without the Begin call. - // So here we will make it that clicking on the text field with the right mouse button (1) will toggle the visibility of the popup above. - ImGui::Text("(You can also right-click me to open the same popup as above.)"); - ImGui::OpenPopupOnItemClick("item context menu", 1); - - // When used after an item that has an ID (here the Button), we can skip providing an ID to BeginPopupContextItem(). - // BeginPopupContextItem() will use the last item ID as the popup ID. - // In addition here, we want to include your editable label inside the button label. We use the ### operator to override the ID (read FAQ about ID for details) - static char name[32] = "Label1"; - char buf[64]; sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label - ImGui::Button(buf); - if (ImGui::BeginPopupContextItem()) - { - ImGui::Text("Edit name:"); - ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Modals")) - { - ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside the window."); - - if (ImGui::Button("Delete..")) - ImGui::OpenPopup("Delete?"); - - if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n"); - ImGui::Separator(); - - //static int dummy_i = 0; - //ImGui::Combo("Combo", &dummy_i, "Delete\0Delete harder\0"); - - static bool dont_ask_me_next_time = false; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); - ImGui::PopStyleVar(); - - if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } - ImGui::SetItemDefaultFocus(); - ImGui::SameLine(); - if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } - ImGui::EndPopup(); - } - - if (ImGui::Button("Stacked modals..")) - ImGui::OpenPopup("Stacked 1"); - if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar)) - { - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - if (ImGui::MenuItem("Dummy menu item")) {} - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it."); - - // Testing behavior of widgets stacking their own regular popups over the modal. - static int item = 1; - static float color[4] = { 0.4f,0.7f,0.0f,0.5f }; - ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - ImGui::ColorEdit4("color", color); - - if (ImGui::Button("Add another modal..")) - ImGui::OpenPopup("Stacked 2"); - - // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which will close the popup. - // Note that the visibility state of popups is owned by imgui, so the input value of the bool actually doesn't matter here. - bool dummy_open = true; - if (ImGui::BeginPopupModal("Stacked 2", &dummy_open)) - { - ImGui::Text("Hello from Stacked The Second!"); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Menus inside a regular window")) - { - ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); - ImGui::Separator(); - // NB: As a quirk in this very specific example, we want to differentiate the parent of this menu from the parent of the various popup menus above. - // To do so we are encloding the items in a PushID()/PopID() block to make them two different menusets. If we don't, opening any popup above and hovering our menu here - // would open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, which is the desired behavior for regular menus. - ImGui::PushID("foo"); - ImGui::MenuItem("Menu item", "CTRL+M"); - if (ImGui::BeginMenu("Menu inside a regular window")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::PopID(); - ImGui::Separator(); - ImGui::TreePop(); - } -} - -static void ShowDemoWindowColumns() -{ - if (!ImGui::CollapsingHeader("Columns")) - return; - - ImGui::PushID("Columns"); - - static bool disable_indent = false; - ImGui::Checkbox("Disable tree indentation", &disable_indent); - ImGui::SameLine(); - HelpMarker("Disable the indenting of tree nodes so demo columns can use the full window width."); - if (disable_indent) - ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); - - // Basic columns - if (ImGui::TreeNode("Basic")) - { - ImGui::Text("Without border:"); - ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border - ImGui::Separator(); - for (int n = 0; n < 14; n++) - { - char label[32]; - sprintf(label, "Item %d", n); - if (ImGui::Selectable(label)) {} - //if (ImGui::Button(label, ImVec2(-1,0))) {} - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - - ImGui::Text("With border:"); - ImGui::Columns(4, "mycolumns"); // 4-ways, with border - ImGui::Separator(); - ImGui::Text("ID"); ImGui::NextColumn(); - ImGui::Text("Name"); ImGui::NextColumn(); - ImGui::Text("Path"); ImGui::NextColumn(); - ImGui::Text("Hovered"); ImGui::NextColumn(); - ImGui::Separator(); - const char* names[3] = { "One", "Two", "Three" }; - const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; - static int selected = -1; - for (int i = 0; i < 3; i++) - { - char label[32]; - sprintf(label, "%04d", i); - if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) - selected = i; - bool hovered = ImGui::IsItemHovered(); - ImGui::NextColumn(); - ImGui::Text(names[i]); ImGui::NextColumn(); - ImGui::Text(paths[i]); ImGui::NextColumn(); - ImGui::Text("%d", hovered); ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - // Create multiple items in a same cell before switching to next column - if (ImGui::TreeNode("Mixed items")) - { - ImGui::Columns(3, "mixed"); - ImGui::Separator(); - - ImGui::Text("Hello"); - ImGui::Button("Banana"); - ImGui::NextColumn(); - - ImGui::Text("ImGui"); - ImGui::Button("Apple"); - static float foo = 1.0f; - ImGui::InputFloat("red", &foo, 0.05f, 0, "%.3f"); - ImGui::Text("An extra line here."); - ImGui::NextColumn(); - - ImGui::Text("Sailor"); - ImGui::Button("Corniflower"); - static float bar = 1.0f; - ImGui::InputFloat("blue", &bar, 0.05f, 0, "%.3f"); - ImGui::NextColumn(); - - if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - // Word wrapping - if (ImGui::TreeNode("Word-wrapping")) - { - ImGui::Columns(2, "word-wrapping"); - ImGui::Separator(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Left"); - ImGui::NextColumn(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Right"); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Borders")) - { - // NB: Future columns API should allow automatic horizontal borders. - static bool h_borders = true; - static bool v_borders = true; - ImGui::Checkbox("horizontal", &h_borders); - ImGui::SameLine(); - ImGui::Checkbox("vertical", &v_borders); - ImGui::Columns(4, NULL, v_borders); - for (int i = 0; i < 4*3; i++) - { - if (h_borders && ImGui::GetColumnIndex() == 0) - ImGui::Separator(); - ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i); - ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); - ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); - ImGui::Text("Long text that is likely to clip"); - ImGui::Button("Button", ImVec2(-1.0f, 0.0f)); - ImGui::NextColumn(); - } - ImGui::Columns(1); - if (h_borders) - ImGui::Separator(); - ImGui::TreePop(); - } - - // Scrolling columns - /* - if (ImGui::TreeNode("Vertical Scrolling")) - { - ImGui::BeginChild("##header", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y)); - ImGui::Columns(3); - ImGui::Text("ID"); ImGui::NextColumn(); - ImGui::Text("Name"); ImGui::NextColumn(); - ImGui::Text("Path"); ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::EndChild(); - ImGui::BeginChild("##scrollingregion", ImVec2(0, 60)); - ImGui::Columns(3); - for (int i = 0; i < 10; i++) - { - ImGui::Text("%04d", i); ImGui::NextColumn(); - ImGui::Text("Foobar"); ImGui::NextColumn(); - ImGui::Text("/path/foobar/%04d/", i); ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::EndChild(); - ImGui::TreePop(); - } - */ - - if (ImGui::TreeNode("Horizontal Scrolling")) - { - ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); - ImGui::BeginChild("##ScrollingRegion", ImVec2(0, ImGui::GetFontSize() * 20), false, ImGuiWindowFlags_HorizontalScrollbar); - ImGui::Columns(10); - int ITEMS_COUNT = 2000; - ImGuiListClipper clipper(ITEMS_COUNT); // Also demonstrate using the clipper for large list - while (clipper.Step()) - { - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - for (int j = 0; j < 10; j++) - { - ImGui::Text("Line %d Column %d...", i, j); - ImGui::NextColumn(); - } - } - ImGui::Columns(1); - ImGui::EndChild(); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Tree")) - { - ImGui::Columns(2, "tree", true); - for (int x = 0; x < 3; x++) - { - bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x); - ImGui::NextColumn(); - ImGui::Text("Node contents"); - ImGui::NextColumn(); - if (open1) - { - for (int y = 0; y < 5; y++) - { - bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y); - ImGui::NextColumn(); - ImGui::Text("Node contents"); - if (open2) - { - ImGui::Text("Even more contents"); - if (ImGui::TreeNode("Tree in column")) - { - ImGui::Text("The quick brown fox jumps over the lazy dog"); - ImGui::TreePop(); - } - } - ImGui::NextColumn(); - if (open2) - ImGui::TreePop(); - } - ImGui::TreePop(); - } - } - ImGui::Columns(1); - ImGui::TreePop(); - } - - if (disable_indent) - ImGui::PopStyleVar(); - ImGui::PopID(); -} - -static void ShowDemoWindowMisc() -{ - if (ImGui::CollapsingHeader("Filtering")) - { - static ImGuiTextFilter filter; - ImGui::Text("Filter usage:\n" - " \"\" display all lines\n" - " \"xxx\" display lines containing \"xxx\"\n" - " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" - " \"-xxx\" hide lines containing \"xxx\""); - filter.Draw(); - const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; - for (int i = 0; i < IM_ARRAYSIZE(lines); i++) - if (filter.PassFilter(lines[i])) - ImGui::BulletText("%s", lines[i]); - } - - if (ImGui::CollapsingHeader("Inputs, Navigation & Focus")) - { - ImGuiIO& io = ImGui::GetIO(); - - ImGui::Text("WantCaptureMouse: %d", io.WantCaptureMouse); - ImGui::Text("WantCaptureKeyboard: %d", io.WantCaptureKeyboard); - ImGui::Text("WantTextInput: %d", io.WantTextInput); - ImGui::Text("WantSetMousePos: %d", io.WantSetMousePos); - ImGui::Text("NavActive: %d, NavVisible: %d", io.NavActive, io.NavVisible); - - if (ImGui::TreeNode("Keyboard, Mouse & Navigation State")) - { - if (ImGui::IsMousePosValid()) - ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); - else - ImGui::Text("Mouse pos: <INVALID>"); - ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); - ImGui::Text("Mouse down:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (io.MouseDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } - ImGui::Text("Mouse clicked:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse dbl-clicked:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDoubleClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse released:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); - - ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (0x%X) (%.02f secs)", i, i, io.KeysDownDuration[i]); } - ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); } - ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); } - ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); - ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. - - ImGui::Text("NavInputs down:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputs[i] > 0.0f) { ImGui::SameLine(); ImGui::Text("[%d] %.2f", i, io.NavInputs[i]); } - ImGui::Text("NavInputs pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputsDownDuration[i] == 0.0f) { ImGui::SameLine(); ImGui::Text("[%d]", i); } - ImGui::Text("NavInputs duration:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputsDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("[%d] %.2f", i, io.NavInputsDownDuration[i]); } - - ImGui::Button("Hovering me sets the\nkeyboard capture flag"); - if (ImGui::IsItemHovered()) - ImGui::CaptureKeyboardFromApp(true); - ImGui::SameLine(); - ImGui::Button("Holding me clears the\nthe keyboard capture flag"); - if (ImGui::IsItemActive()) - ImGui::CaptureKeyboardFromApp(false); - - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Tabbing")) - { - ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); - static char buf[32] = "dummy"; - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); - ImGui::PushAllowKeyboardFocus(false); - ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); - //ImGui::SameLine(); HelpMarker("Use ImGui::PushAllowKeyboardFocus(bool)\nto disable tabbing through certain widgets."); - ImGui::PopAllowKeyboardFocus(); - ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Focus from code")) - { - bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); - bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); - bool focus_3 = ImGui::Button("Focus on 3"); - int has_focus = 0; - static char buf[128] = "click on a button to set focus"; - - if (focus_1) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 1; - - if (focus_2) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 2; - - ImGui::PushAllowKeyboardFocus(false); - if (focus_3) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 3; - ImGui::PopAllowKeyboardFocus(); - - if (has_focus) - ImGui::Text("Item with focus: %d", has_focus); - else - ImGui::Text("Item with focus: <none>"); - - // Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item - static float f3[3] = { 0.0f, 0.0f, 0.0f }; - int focus_ahead = -1; - if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine(); - if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine(); - if (ImGui::Button("Focus on Z")) { focus_ahead = 2; } - if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead); - ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f); - - ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code."); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Dragging")) - { - ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); - for (int button = 0; button < 3; button++) - ImGui::Text("IsMouseDragging(%d):\n w/ default threshold: %d,\n w/ zero threshold: %d\n w/ large threshold: %d", - button, ImGui::IsMouseDragging(button), ImGui::IsMouseDragging(button, 0.0f), ImGui::IsMouseDragging(button, 20.0f)); - - ImGui::Button("Drag Me"); - if (ImGui::IsItemActive()) - ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor - - // Drag operations gets "unlocked" when the mouse has moved past a certain threshold (the default threshold is stored in io.MouseDragThreshold) - // You can request a lower or higher threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta() - ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); - ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); - ImVec2 mouse_delta = io.MouseDelta; - ImGui::Text("GetMouseDragDelta(0):\n w/ default threshold: (%.1f, %.1f),\n w/ zero threshold: (%.1f, %.1f)\nMouseDelta: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y, value_raw.x, value_raw.y, mouse_delta.x, mouse_delta.y); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Mouse cursors")) - { - const char* mouse_cursors_names[] = { "Arrow", "TextInput", "Move", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand" }; - IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT); - - ImGui::Text("Current mouse cursor = %d: %s", ImGui::GetMouseCursor(), mouse_cursors_names[ImGui::GetMouseCursor()]); - ImGui::Text("Hover to see mouse cursors:"); - ImGui::SameLine(); HelpMarker("Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, otherwise your backend needs to handle it."); - for (int i = 0; i < ImGuiMouseCursor_COUNT; i++) - { - char label[32]; - sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); - ImGui::Bullet(); ImGui::Selectable(label, false); - if (ImGui::IsItemHovered() || ImGui::IsItemFocused()) - ImGui::SetMouseCursor(i); - } - ImGui::TreePop(); - } - } -} - -//----------------------------------------------------------------------------- -// [SECTION] About Window / ShowAboutWindow() -// Access from ImGui Demo -> Help -> About -//----------------------------------------------------------------------------- - -void ImGui::ShowAboutWindow(bool* p_open) -{ - if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::End(); - return; - } - ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); - ImGui::Separator(); - ImGui::Text("By Omar Cornut and all dear imgui contributors."); - ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); - - static bool show_config_info = false; - ImGui::Checkbox("Config/Build Information", &show_config_info); - if (show_config_info) - { - ImGuiIO& io = ImGui::GetIO(); - ImGuiStyle& style = ImGui::GetStyle(); - - bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); - ImGui::BeginChildFrame(ImGui::GetID("cfginfos"), ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18), ImGuiWindowFlags_NoMove); - if (copy_to_clipboard) - ImGui::LogToClipboard(); - - ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); - ImGui::Separator(); - ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert)); - ImGui::Text("define: __cplusplus=%d", (int)__cplusplus); -#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_MATH_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_MATH_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS - ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS"); -#endif -#ifdef IMGUI_USE_BGRA_PACKED_COLOR - ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR"); -#endif -#ifdef _WIN32 - ImGui::Text("define: _WIN32"); -#endif -#ifdef _WIN64 - ImGui::Text("define: _WIN64"); -#endif -#ifdef __linux__ - ImGui::Text("define: __linux__"); -#endif -#ifdef __APPLE__ - ImGui::Text("define: __APPLE__"); -#endif -#ifdef _MSC_VER - ImGui::Text("define: _MSC_VER=%d", _MSC_VER); -#endif -#ifdef __MINGW32__ - ImGui::Text("define: __MINGW32__"); -#endif -#ifdef __MINGW64__ - ImGui::Text("define: __MINGW64__"); -#endif -#ifdef __GNUC__ - ImGui::Text("define: __GNUC__=%d", (int)__GNUC__); -#endif -#ifdef __clang_version__ - ImGui::Text("define: __clang_version__=%s", __clang_version__); -#endif - ImGui::Separator(); - ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL"); - ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL"); - ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard"); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad"); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos"); - if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard"); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse"); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange"); - if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor"); - if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors"); - if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink"); - if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges"); - if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly"); - ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags); - if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad"); - if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors"); - if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos"); - ImGui::Separator(); - ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); - ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); - ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - ImGui::Separator(); - ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y); - ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize); - ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y); - ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding); - ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize); - ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y); - ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y); - - if (copy_to_clipboard) - ImGui::LogFinish(); - ImGui::EndChildFrame(); - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Style Editor / ShowStyleEditor() -//----------------------------------------------------------------------------- - -// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. -// Here we use the simplified Combo() api that packs items into a single literal string. Useful for quick combo boxes where the choices are known locally. -bool ImGui::ShowStyleSelector(const char* label) -{ - static int style_idx = -1; - if (ImGui::Combo(label, &style_idx, "Classic\0Dark\0Light\0")) - { - switch (style_idx) - { - case 0: ImGui::StyleColorsClassic(); break; - case 1: ImGui::StyleColorsDark(); break; - case 2: ImGui::StyleColorsLight(); break; - } - return true; - } - return false; -} - -// Demo helper function to select among loaded fonts. -// Here we use the regular BeginCombo()/EndCombo() api which is more the more flexible one. -void ImGui::ShowFontSelector(const char* label) -{ - ImGuiIO& io = ImGui::GetIO(); - ImFont* font_current = ImGui::GetFont(); - if (ImGui::BeginCombo(label, font_current->GetDebugName())) - { - for (int n = 0; n < io.Fonts->Fonts.Size; n++) - { - ImFont* font = io.Fonts->Fonts[n]; - ImGui::PushID((void*)font); - if (ImGui::Selectable(font->GetDebugName(), font == font_current)) - io.FontDefault = font; - ImGui::PopID(); - } - ImGui::EndCombo(); - } - ImGui::SameLine(); - HelpMarker( - "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" - "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" - "- Read FAQ and documentation in misc/fonts/ for more details.\n" - "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); -} - -void ImGui::ShowStyleEditor(ImGuiStyle* ref) -{ - // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it compares to an internally stored reference) - ImGuiStyle& style = ImGui::GetStyle(); - static ImGuiStyle ref_saved_style; - - // Default to using internal storage as reference - static bool init = true; - if (init && ref == NULL) - ref_saved_style = style; - init = false; - if (ref == NULL) - ref = &ref_saved_style; - - ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); - - if (ImGui::ShowStyleSelector("Colors##Selector")) - ref_saved_style = style; - ImGui::ShowFontSelector("Fonts##Selector"); - - // Simplified Settings - if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) - style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding - { bool window_border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &window_border)) style.WindowBorderSize = window_border ? 1.0f : 0.0f; } - ImGui::SameLine(); - { bool frame_border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &frame_border)) style.FrameBorderSize = frame_border ? 1.0f : 0.0f; } - ImGui::SameLine(); - { bool popup_border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &popup_border)) style.PopupBorderSize = popup_border ? 1.0f : 0.0f; } - - // Save/Revert button - if (ImGui::Button("Save Ref")) - *ref = ref_saved_style = style; - ImGui::SameLine(); - if (ImGui::Button("Revert Ref")) - style = *ref; - ImGui::SameLine(); - HelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \"Export Colors\" below to save them somewhere."); - - ImGui::Separator(); - - if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) - { - if (ImGui::BeginTabItem("Sizes")) - { - ImGui::Text("Main"); - ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); - ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); - ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); - ImGui::Text("Borders"); - ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::Text("Rounding"); - ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); - ImGui::Text("Alignment"); - ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); - ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); - ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); - ImGui::Text("Safe Area Padding"); ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); - ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Colors")) - { - static int output_dest = 0; - static bool output_only_modified = true; - if (ImGui::Button("Export Unsaved")) - { - if (output_dest == 0) - ImGui::LogToClipboard(); - else - ImGui::LogToTTY(); - ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const ImVec4& col = style.Colors[i]; - const char* name = ImGui::GetStyleColorName(i); - if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) - ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w); - } - ImGui::LogFinish(); - } - ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); - ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); - - static ImGuiTextFilter filter; - filter.Draw("Filter colors", ImGui::GetFontSize() * 16); - - static ImGuiColorEditFlags alpha_flags = 0; - ImGui::RadioButton("Opaque", &alpha_flags, 0); ImGui::SameLine(); - ImGui::RadioButton("Alpha", &alpha_flags, ImGuiColorEditFlags_AlphaPreview); ImGui::SameLine(); - ImGui::RadioButton("Both", &alpha_flags, ImGuiColorEditFlags_AlphaPreviewHalf); ImGui::SameLine(); - HelpMarker("In the color list:\nLeft-click on colored square to open color picker,\nRight-click to open edit options menu."); - - ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); - ImGui::PushItemWidth(-160); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName(i); - if (!filter.PassFilter(name)) - continue; - ImGui::PushID(i); - ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); - if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) - { - // Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons. - // Read the FAQ and misc/fonts/README.txt about using icon fonts. It's really easy and super convenient! - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) ref->Colors[i] = style.Colors[i]; - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) style.Colors[i] = ref->Colors[i]; - } - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); - ImGui::TextUnformatted(name); - ImGui::PopID(); - } - ImGui::PopItemWidth(); - ImGui::EndChild(); - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Fonts")) - { - ImGuiIO& io = ImGui::GetIO(); - ImFontAtlas* atlas = io.Fonts; - HelpMarker("Read FAQ and misc/fonts/README.txt for details on font loading."); - ImGui::PushItemWidth(120); - for (int i = 0; i < atlas->Fonts.Size; i++) - { - ImFont* font = atlas->Fonts[i]; - ImGui::PushID(font); - bool font_details_opened = ImGui::TreeNode(font, "Font %d: \"%s\"\n%.2f px, %d glyphs, %d file(s)", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount); - ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) { io.FontDefault = font; } - if (font_details_opened) - { - ImGui::PushFont(font); - ImGui::Text("The quick brown fox jumps over the lazy dog"); - ImGui::PopFont(); - ImGui::DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); // Scale only this font - ImGui::SameLine(); HelpMarker("Note than the default embedded font is NOT meant to be scaled.\n\nFont are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime.\n\n(Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.)"); - ImGui::InputFloat("Font offset", &font->DisplayOffset.y, 1, 1, "%.0f"); - ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); - ImGui::Text("Fallback character: '%c' (%d)", font->FallbackChar, font->FallbackChar); - const float surface_sqrt = sqrtf((float)font->MetricsTotalSurface); - ImGui::Text("Texture surface: %d pixels (approx) ~ %dx%d", font->MetricsTotalSurface, (int)surface_sqrt, (int)surface_sqrt); - for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) - if (const ImFontConfig* cfg = &font->ConfigData[config_i]) - ImGui::BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH); - if (ImGui::TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) - { - // Display all glyphs of the fonts in separate pages of 256 characters - for (int base = 0; base < 0x10000; base += 256) - { - int count = 0; - for (int n = 0; n < 256; n++) - count += font->FindGlyphNoFallback((ImWchar)(base + n)) ? 1 : 0; - if (count > 0 && ImGui::TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph")) - { - float cell_size = font->FontSize * 1; - float cell_spacing = style.ItemSpacing.y; - ImVec2 base_pos = ImGui::GetCursorScreenPos(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - for (int n = 0; n < 256; n++) - { - ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing)); - ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size); - const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n)); - draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50)); - if (glyph) - font->RenderChar(draw_list, cell_size, cell_p1, ImGui::GetColorU32(ImGuiCol_Text), (ImWchar)(base + n)); // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string. - if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2)) - { - ImGui::BeginTooltip(); - ImGui::Text("Codepoint: U+%04X", base + n); - ImGui::Separator(); - ImGui::Text("AdvanceX: %.1f", glyph->AdvanceX); - ImGui::Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); - ImGui::Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); - ImGui::EndTooltip(); - } - } - ImGui::Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16)); - ImGui::TreePop(); - } - } - ImGui::TreePop(); - } - ImGui::TreePop(); - } - ImGui::PopID(); - } - if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) - { - ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); - ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); - ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0, 0), ImVec2(1, 1), tint_col, border_col); - ImGui::TreePop(); - } - - static float window_scale = 1.0f; - if (ImGui::DragFloat("this window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.2f")) // scale only this window - ImGui::SetWindowFontScale(window_scale); - ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.2f"); // scale everything - ImGui::PopItemWidth(); - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Rendering")) - { - ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); ImGui::SameLine(); HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); - ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); - ImGui::PushItemWidth(100); - ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, "%.2f", 2.0f); - if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; - ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. - ImGui::PopItemWidth(); - - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - - ImGui::PopItemWidth(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() -//----------------------------------------------------------------------------- - -// Demonstrate creating a "main" fullscreen menu bar and populating it. -// Note the difference between BeginMainMenuBar() and BeginMenuBar(): -// - BeginMenuBar() = menu-bar inside current window we Begin()-ed into (the window needs the ImGuiWindowFlags_MenuBar flag) -// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it. -static void ShowExampleAppMainMenuBar() -{ - if (ImGui::BeginMainMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Edit")) - { - if (ImGui::MenuItem("Undo", "CTRL+Z")) {} - if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item - ImGui::Separator(); - if (ImGui::MenuItem("Cut", "CTRL+X")) {} - if (ImGui::MenuItem("Copy", "CTRL+C")) {} - if (ImGui::MenuItem("Paste", "CTRL+V")) {} - ImGui::EndMenu(); - } - ImGui::EndMainMenuBar(); - } -} - -// Note that shortcuts are currently provided for display only (future version will add flags to BeginMenu to process shortcuts) -static void ShowExampleMenuFile() -{ - ImGui::MenuItem("(dummy menu)", NULL, false, false); - if (ImGui::MenuItem("New")) {} - if (ImGui::MenuItem("Open", "Ctrl+O")) {} - if (ImGui::BeginMenu("Open Recent")) - { - ImGui::MenuItem("fish_hat.c"); - ImGui::MenuItem("fish_hat.inl"); - ImGui::MenuItem("fish_hat.h"); - if (ImGui::BeginMenu("More..")) - { - ImGui::MenuItem("Hello"); - ImGui::MenuItem("Sailor"); - if (ImGui::BeginMenu("Recurse..")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - if (ImGui::MenuItem("Save", "Ctrl+S")) {} - if (ImGui::MenuItem("Save As..")) {} - ImGui::Separator(); - if (ImGui::BeginMenu("Options")) - { - static bool enabled = true; - ImGui::MenuItem("Enabled", "", &enabled); - ImGui::BeginChild("child", ImVec2(0, 60), true); - for (int i = 0; i < 10; i++) - ImGui::Text("Scrolling Text %d", i); - ImGui::EndChild(); - static float f = 0.5f; - static int n = 0; - static bool b = true; - ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); - ImGui::InputFloat("Input", &f, 0.1f); - ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); - ImGui::Checkbox("Check", &b); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Colors")) - { - float sz = ImGui::GetTextLineHeight(); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName((ImGuiCol)i); - ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x+sz, p.y+sz), ImGui::GetColorU32((ImGuiCol)i)); - ImGui::Dummy(ImVec2(sz, sz)); - ImGui::SameLine(); - ImGui::MenuItem(name); - } - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Disabled", false)) // Disabled - { - IM_ASSERT(0); - } - if (ImGui::MenuItem("Checked", NULL, true)) {} - if (ImGui::MenuItem("Quit", "Alt+F4")) {} -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Debug Console / ShowExampleAppConsole() -//----------------------------------------------------------------------------- - -// Demonstrate creating a simple console window, with scrolling, filtering, completion and history. -// For the console example, here we are using a more C++ like approach of declaring a class to hold the data and the functions. -struct ExampleAppConsole -{ - char InputBuf[256]; - ImVector<char*> Items; - ImVector<const char*> Commands; - ImVector<char*> History; - int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. - ImGuiTextFilter Filter; - bool AutoScroll; - bool ScrollToBottom; - - ExampleAppConsole() - { - ClearLog(); - memset(InputBuf, 0, sizeof(InputBuf)); - HistoryPos = -1; - Commands.push_back("HELP"); - Commands.push_back("HISTORY"); - Commands.push_back("CLEAR"); - Commands.push_back("CLASSIFY"); // "classify" is only here to provide an example of "C"+[tab] completing to "CL" and displaying matches. - AutoScroll = true; - ScrollToBottom = true; - AddLog("Welcome to Dear ImGui!"); - } - ~ExampleAppConsole() - { - ClearLog(); - for (int i = 0; i < History.Size; i++) - free(History[i]); - } - - // Portable helpers - static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; } - static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; } - static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)str, len); } - static void Strtrim(char* str) { char* str_end = str + strlen(str); while (str_end > str && str_end[-1] == ' ') str_end--; *str_end = 0; } - - void ClearLog() - { - for (int i = 0; i < Items.Size; i++) - free(Items[i]); - Items.clear(); - ScrollToBottom = true; - } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - // FIXME-OPT - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf)-1] = 0; - va_end(args); - Items.push_back(Strdup(buf)); - if (AutoScroll) - ScrollToBottom = true; - } - - void Draw(const char* title, bool* p_open) - { - ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin(title, p_open)) - { - ImGui::End(); - return; - } - - // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. So e.g. IsItemHovered() will return true when hovering the title bar. - // Here we create a context menu only available from the title bar. - if (ImGui::BeginPopupContextItem()) - { - if (ImGui::MenuItem("Close Console")) - *p_open = false; - ImGui::EndPopup(); - } - - ImGui::TextWrapped("This example implements a console with basic coloring, completion and history. A more elaborate implementation may want to store entries along with extra data such as timestamp, emitter, etc."); - ImGui::TextWrapped("Enter 'HELP' for help, press TAB to use text completion."); - - // TODO: display items starting from the bottom - - if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine(); - if (ImGui::SmallButton("Add Dummy Error")) { AddLog("[error] something went wrong"); } ImGui::SameLine(); - if (ImGui::SmallButton("Clear")) { ClearLog(); } ImGui::SameLine(); - bool copy_to_clipboard = ImGui::SmallButton("Copy"); ImGui::SameLine(); - if (ImGui::SmallButton("Scroll to bottom")) ScrollToBottom = true; - //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } - - ImGui::Separator(); - - // Options menu - if (ImGui::BeginPopup("Options")) - { - if (ImGui::Checkbox("Auto-scroll", &AutoScroll)) - if (AutoScroll) - ScrollToBottom = true; - ImGui::EndPopup(); - } - - // Options, Filter - if (ImGui::Button("Options")) - ImGui::OpenPopup("Options"); - ImGui::SameLine(); - Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); - ImGui::Separator(); - - const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); // 1 separator, 1 input text - ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); // Leave room for 1 separator + 1 InputText - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::Selectable("Clear")) ClearLog(); - ImGui::EndPopup(); - } - - // Display every line as a separate entry so we can change their color or add custom widgets. If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); - // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping to only process visible items. - // You can seek and display only the lines that are visible using the ImGuiListClipper helper, if your elements are evenly spaced and you have cheap random access to the elements. - // To use the clipper we could replace the 'for (int i = 0; i < Items.Size; i++)' loop with: - // ImGuiListClipper clipper(Items.Size); - // while (clipper.Step()) - // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - // However, note that you can not use this code as is if a filter is active because it breaks the 'cheap random-access' property. We would need random-access on the post-filtered list. - // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices that passed the filtering test, recomputing this array when user changes the filter, - // and appending newly elements as they are inserted. This is left as a task to the user until we can manage to improve this example code! - // If your items are of variable size you may want to implement code similar to what ImGuiListClipper does. Or split your data into fixed height items to allow random-seeking into your list. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing - if (copy_to_clipboard) - ImGui::LogToClipboard(); - for (int i = 0; i < Items.Size; i++) - { - const char* item = Items[i]; - if (!Filter.PassFilter(item)) - continue; - - // Normally you would store more information in your item (e.g. make Items[] an array of structure, store color/type etc.) - bool pop_color = false; - if (strstr(item, "[error]")) { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.4f, 0.4f, 1.0f)); pop_color = true; } - else if (strncmp(item, "# ", 2) == 0) { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.8f, 0.6f, 1.0f)); pop_color = true; } - ImGui::TextUnformatted(item); - if (pop_color) - ImGui::PopStyleColor(); - } - if (copy_to_clipboard) - ImGui::LogFinish(); - if (ScrollToBottom) - ImGui::SetScrollHereY(1.0f); - ScrollToBottom = false; - ImGui::PopStyleVar(); - ImGui::EndChild(); - ImGui::Separator(); - - // Command-line - bool reclaim_focus = false; - if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), ImGuiInputTextFlags_EnterReturnsTrue|ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_CallbackHistory, &TextEditCallbackStub, (void*)this)) - { - char* s = InputBuf; - Strtrim(s); - if (s[0]) - ExecCommand(s); - strcpy(s, ""); - reclaim_focus = true; - } - - // Auto-focus on window apparition - ImGui::SetItemDefaultFocus(); - if (reclaim_focus) - ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget - - ImGui::End(); - } - - void ExecCommand(const char* command_line) - { - AddLog("# %s\n", command_line); - - // Insert into history. First find match and delete it so it can be pushed to the back. This isn't trying to be smart or optimal. - HistoryPos = -1; - for (int i = History.Size-1; i >= 0; i--) - if (Stricmp(History[i], command_line) == 0) - { - free(History[i]); - History.erase(History.begin() + i); - break; - } - History.push_back(Strdup(command_line)); - - // Process command - if (Stricmp(command_line, "CLEAR") == 0) - { - ClearLog(); - } - else if (Stricmp(command_line, "HELP") == 0) - { - AddLog("Commands:"); - for (int i = 0; i < Commands.Size; i++) - AddLog("- %s", Commands[i]); - } - else if (Stricmp(command_line, "HISTORY") == 0) - { - int first = History.Size - 10; - for (int i = first > 0 ? first : 0; i < History.Size; i++) - AddLog("%3d: %s\n", i, History[i]); - } - else - { - AddLog("Unknown command: '%s'\n", command_line); - } - - // On commad input, we scroll to bottom even if AutoScroll==false - ScrollToBottom = true; - } - - static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) // In C++11 you are better off using lambdas for this sort of forwarding callbacks - { - ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; - return console->TextEditCallback(data); - } - - int TextEditCallback(ImGuiInputTextCallbackData* data) - { - //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); - switch (data->EventFlag) - { - case ImGuiInputTextFlags_CallbackCompletion: - { - // Example of TEXT COMPLETION - - // Locate beginning of current word - const char* word_end = data->Buf + data->CursorPos; - const char* word_start = word_end; - while (word_start > data->Buf) - { - const char c = word_start[-1]; - if (c == ' ' || c == '\t' || c == ',' || c == ';') - break; - word_start--; - } - - // Build a list of candidates - ImVector<const char*> candidates; - for (int i = 0; i < Commands.Size; i++) - if (Strnicmp(Commands[i], word_start, (int)(word_end-word_start)) == 0) - candidates.push_back(Commands[i]); - - if (candidates.Size == 0) - { - // No match - AddLog("No match for \"%.*s\"!\n", (int)(word_end-word_start), word_start); - } - else if (candidates.Size == 1) - { - // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing - data->DeleteChars((int)(word_start-data->Buf), (int)(word_end-word_start)); - data->InsertChars(data->CursorPos, candidates[0]); - data->InsertChars(data->CursorPos, " "); - } - else - { - // Multiple matches. Complete as much as we can, so inputing "C" will complete to "CL" and display "CLEAR" and "CLASSIFY" - int match_len = (int)(word_end - word_start); - for (;;) - { - int c = 0; - bool all_candidates_matches = true; - for (int i = 0; i < candidates.Size && all_candidates_matches; i++) - if (i == 0) - c = toupper(candidates[i][match_len]); - else if (c == 0 || c != toupper(candidates[i][match_len])) - all_candidates_matches = false; - if (!all_candidates_matches) - break; - match_len++; - } - - if (match_len > 0) - { - data->DeleteChars((int)(word_start - data->Buf), (int)(word_end-word_start)); - data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); - } - - // List matches - AddLog("Possible matches:\n"); - for (int i = 0; i < candidates.Size; i++) - AddLog("- %s\n", candidates[i]); - } - - break; - } - case ImGuiInputTextFlags_CallbackHistory: - { - // Example of HISTORY - const int prev_history_pos = HistoryPos; - if (data->EventKey == ImGuiKey_UpArrow) - { - if (HistoryPos == -1) - HistoryPos = History.Size - 1; - else if (HistoryPos > 0) - HistoryPos--; - } - else if (data->EventKey == ImGuiKey_DownArrow) - { - if (HistoryPos != -1) - if (++HistoryPos >= History.Size) - HistoryPos = -1; - } - - // A better implementation would preserve the data on the current input line along with cursor position. - if (prev_history_pos != HistoryPos) - { - const char* history_str = (HistoryPos >= 0) ? History[HistoryPos] : ""; - data->DeleteChars(0, data->BufTextLen); - data->InsertChars(0, history_str); - } - } - } - return 0; - } -}; - -static void ShowExampleAppConsole(bool* p_open) -{ - static ExampleAppConsole console; - console.Draw("Example: Console", p_open); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Debug Log / ShowExampleAppLog() -//----------------------------------------------------------------------------- - -// Usage: -// static ExampleAppLog my_log; -// my_log.AddLog("Hello %d world\n", 123); -// my_log.Draw("title"); -struct ExampleAppLog -{ - ImGuiTextBuffer Buf; - ImGuiTextFilter Filter; - ImVector<int> LineOffsets; // Index to lines offset. We maintain this with AddLog() calls, allowing us to have a random access on lines - bool AutoScroll; - bool ScrollToBottom; - - ExampleAppLog() - { - AutoScroll = true; - ScrollToBottom = false; - Clear(); - } - - void Clear() - { - Buf.clear(); - LineOffsets.clear(); - LineOffsets.push_back(0); - } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - int old_size = Buf.size(); - va_list args; - va_start(args, fmt); - Buf.appendfv(fmt, args); - va_end(args); - for (int new_size = Buf.size(); old_size < new_size; old_size++) - if (Buf[old_size] == '\n') - LineOffsets.push_back(old_size + 1); - if (AutoScroll) - ScrollToBottom = true; - } - - void Draw(const char* title, bool* p_open = NULL) - { - if (!ImGui::Begin(title, p_open)) - { - ImGui::End(); - return; - } - - // Options menu - if (ImGui::BeginPopup("Options")) - { - if (ImGui::Checkbox("Auto-scroll", &AutoScroll)) - if (AutoScroll) - ScrollToBottom = true; - ImGui::EndPopup(); - } - - // Main window - if (ImGui::Button("Options")) - ImGui::OpenPopup("Options"); - ImGui::SameLine(); - bool clear = ImGui::Button("Clear"); - ImGui::SameLine(); - bool copy = ImGui::Button("Copy"); - ImGui::SameLine(); - Filter.Draw("Filter", -100.0f); - - ImGui::Separator(); - ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_HorizontalScrollbar); - - if (clear) - Clear(); - if (copy) - ImGui::LogToClipboard(); - - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - const char* buf = Buf.begin(); - const char* buf_end = Buf.end(); - if (Filter.IsActive()) - { - // In this example we don't use the clipper when Filter is enabled. - // This is because we don't have a random access on the result on our filter. - // A real application processing logs with ten of thousands of entries may want to store the result of search/filter. - // especially if the filtering function is not trivial (e.g. reg-exp). - for (int line_no = 0; line_no < LineOffsets.Size; line_no++) - { - const char* line_start = buf + LineOffsets[line_no]; - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - if (Filter.PassFilter(line_start, line_end)) - ImGui::TextUnformatted(line_start, line_end); - } - } - else - { - // The simplest and easy way to display the entire buffer: - // ImGui::TextUnformatted(buf_begin, buf_end); - // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward to skip non-visible lines. - // Here we instead demonstrate using the clipper to only process lines that are within the visible area. - // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them on your side is recommended. - // Using ImGuiListClipper requires A) random access into your data, and B) items all being the same height, - // both of which we can handle since we an array pointing to the beginning of each line of text. - // When using the filter (in the block of code above) we don't have random access into the data to display anymore, which is why we don't use the clipper. - // Storing or skimming through the search result would make it possible (and would be recommended if you want to search through tens of thousands of entries) - ImGuiListClipper clipper; - clipper.Begin(LineOffsets.Size); - while (clipper.Step()) - { - for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) - { - const char* line_start = buf + LineOffsets[line_no]; - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - ImGui::TextUnformatted(line_start, line_end); - } - } - clipper.End(); - } - ImGui::PopStyleVar(); - - if (ScrollToBottom) - ImGui::SetScrollHereY(1.0f); - ScrollToBottom = false; - ImGui::EndChild(); - ImGui::End(); - } -}; - -// Demonstrate creating a simple log window with basic filtering. -static void ShowExampleAppLog(bool* p_open) -{ - static ExampleAppLog log; - - // For the demo: add a debug button _BEFORE_ the normal log window contents - // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window. - // Most of the contents of the window will be added by the log.Draw() call. - ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver); - ImGui::Begin("Example: Log", p_open); - if (ImGui::SmallButton("[Debug] Add 5 entries")) - { - static int counter = 0; - for (int n = 0; n < 5; n++) - { - const char* categories[3] = { "info", "warn", "error" }; - const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" }; - log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n", - ImGui::GetFrameCount(), categories[counter % IM_ARRAYSIZE(categories)], ImGui::GetTime(), words[counter % IM_ARRAYSIZE(words)]); - counter++; - } - } - ImGui::End(); - - // Actually call in the regular Log helper (which will Begin() into the same window as we just did) - log.Draw("Example: Log", p_open); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() -//----------------------------------------------------------------------------- - -// Demonstrate create a window with multiple child windows. -static void ShowExampleAppLayout(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); - if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar)) - { - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - if (ImGui::MenuItem("Close")) *p_open = false; - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - // left - static int selected = 0; - ImGui::BeginChild("left pane", ImVec2(150, 0), true); - for (int i = 0; i < 100; i++) - { - char label[128]; - sprintf(label, "MyObject %d", i); - if (ImGui::Selectable(label, selected == i)) - selected = i; - } - ImGui::EndChild(); - ImGui::SameLine(); - - // right - ImGui::BeginGroup(); - ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us - ImGui::Text("MyObject: %d", selected); - ImGui::Separator(); - if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None)) - { - if (ImGui::BeginTabItem("Description")) - { - ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Details")) - { - ImGui::Text("ID: 0123456789"); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::EndChild(); - if (ImGui::Button("Revert")) {} - ImGui::SameLine(); - if (ImGui::Button("Save")) {} - ImGui::EndGroup(); - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() -//----------------------------------------------------------------------------- - -// Demonstrate create a simple property editor. -static void ShowExampleAppPropertyEditor(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(430,450), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Property editor", p_open)) - { - ImGui::End(); - return; - } - - HelpMarker("This example shows how you may implement a property editor using two columns.\nAll objects/fields data are dummies here.\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\nyour cursor horizontally instead of using the Columns() API."); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2,2)); - ImGui::Columns(2); - ImGui::Separator(); - - struct funcs - { - static void ShowDummyObject(const char* prefix, int uid) - { - ImGui::PushID(uid); // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. - ImGui::AlignTextToFramePadding(); // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high. - bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); - ImGui::NextColumn(); - ImGui::AlignTextToFramePadding(); - ImGui::Text("my sailor is rich"); - ImGui::NextColumn(); - if (node_open) - { - static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f }; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); // Use field index as identifier. - if (i < 2) - { - ShowDummyObject("Child", 424242); - } - else - { - // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well) - ImGui::AlignTextToFramePadding(); - ImGui::TreeNodeEx("Field", ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet, "Field_%d", i); - ImGui::NextColumn(); - ImGui::SetNextItemWidth(-1); - if (i >= 5) - ImGui::InputFloat("##value", &dummy_members[i], 1.0f); - else - ImGui::DragFloat("##value", &dummy_members[i], 0.01f); - ImGui::NextColumn(); - } - ImGui::PopID(); - } - ImGui::TreePop(); - } - ImGui::PopID(); - } - }; - - // Iterate dummy objects with dummy members (all the same data) - for (int obj_i = 0; obj_i < 3; obj_i++) - funcs::ShowDummyObject("Object", obj_i); - - ImGui::Columns(1); - ImGui::Separator(); - ImGui::PopStyleVar(); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Long Text / ShowExampleAppLongText() -//----------------------------------------------------------------------------- - -// Demonstrate/test rendering huge amount of text, and the incidence of clipping. -static void ShowExampleAppLongText(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Long text display", p_open)) - { - ImGui::End(); - return; - } - - static int test_type = 0; - static ImGuiTextBuffer log; - static int lines = 0; - ImGui::Text("Printing unusually long amount of text."); - ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped manually\0Multiple calls to Text(), not clipped (slow)\0"); - ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); - if (ImGui::Button("Clear")) { log.clear(); lines = 0; } - ImGui::SameLine(); - if (ImGui::Button("Add 1000 lines")) - { - for (int i = 0; i < 1000; i++) - log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines+i); - lines += 1000; - } - ImGui::BeginChild("Log"); - switch (test_type) - { - case 0: - // Single call to TextUnformatted() with a big buffer - ImGui::TextUnformatted(log.begin(), log.end()); - break; - case 1: - { - // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0)); - ImGuiListClipper clipper(lines); - while (clipper.Step()) - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - case 2: - // Multiple calls to Text(), not clipped (slow) - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0)); - for (int i = 0; i < lines; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - ImGui::EndChild(); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() -//----------------------------------------------------------------------------- - -// Demonstrate creating a window which gets auto-resized according to its content. -static void ShowExampleAppAutoResize(bool* p_open) -{ - if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::End(); - return; - } - - static int lines = 10; - ImGui::Text("Window will resize every-frame to the size of its content.\nNote that you probably don't want to query the window size to\noutput your content because that would create a feedback loop."); - ImGui::SliderInt("Number of lines", &lines, 1, 20); - for (int i = 0; i < lines; i++) - ImGui::Text("%*sThis is line %d", i * 4, "", i); // Pad with space to extend size horizontally - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() -//----------------------------------------------------------------------------- - -// Demonstrate creating a window with custom resize constraints. -static void ShowExampleAppConstrainedResize(bool* p_open) -{ - struct CustomConstraints // Helper functions to demonstrate programmatic constraints - { - static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize = ImVec2(IM_MAX(data->DesiredSize.x, data->DesiredSize.y), IM_MAX(data->DesiredSize.x, data->DesiredSize.y)); } - static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); } - }; - - static bool auto_resize = false; - static int type = 0; - static int display_lines = 10; - if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only - if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only - if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 - if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500 - if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500 - if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square - if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step - - ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; - if (ImGui::Begin("Example: Constrained Resize", p_open, flags)) - { - const char* desc[] = - { - "Resize vertical only", - "Resize horizontal only", - "Width > 100, Height > 100", - "Width 400-500", - "Height 400-500", - "Custom: Always Square", - "Custom: Fixed Steps (100)", - }; - if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); - if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); - if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } - ImGui::SetNextItemWidth(200); - ImGui::Combo("Constraint", &type, desc, IM_ARRAYSIZE(desc)); - ImGui::SetNextItemWidth(200); - ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); - ImGui::Checkbox("Auto-resize", &auto_resize); - for (int i = 0; i < display_lines; i++) - ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Simple Overlay / ShowExampleAppSimpleOverlay() -//----------------------------------------------------------------------------- - -// Demonstrate creating a simple static window with no decoration + a context-menu to choose which corner of the screen to use. -static void ShowExampleAppSimpleOverlay(bool* p_open) -{ - const float DISTANCE = 10.0f; - static int corner = 0; - ImGuiIO& io = ImGui::GetIO(); - if (corner != -1) - { - ImVec2 window_pos = ImVec2((corner & 1) ? io.DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? io.DisplaySize.y - DISTANCE : DISTANCE); - ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f); - ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); - } - ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background - if (ImGui::Begin("Example: Simple overlay", p_open, (corner != -1 ? ImGuiWindowFlags_NoMove : 0) | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) - { - ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)"); - ImGui::Separator(); - if (ImGui::IsMousePosValid()) - ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y); - else - ImGui::Text("Mouse Position: <invalid>"); - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::MenuItem("Custom", NULL, corner == -1)) corner = -1; - if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; - if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; - if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; - if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; - if (p_open && ImGui::MenuItem("Close")) *p_open = false; - ImGui::EndPopup(); - } - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() -//----------------------------------------------------------------------------- - -// Demonstrate using "##" and "###" in identifiers to manipulate ID generation. -// This apply to all regular items as well. Read FAQ section "How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on the purpose of labels/IDs." for details. -static void ShowExampleAppWindowTitles(bool*) -{ - // By default, Windows are uniquely identified by their title. - // You can use the "##" and "###" markers to manipulate the display/ID. - - // Using "##" to display same title but have unique identifier. - ImGui::SetNextWindowPos(ImVec2(100, 100), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##1"); - ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); - ImGui::End(); - - ImGui::SetNextWindowPos(ImVec2(100, 200), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##2"); - ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); - ImGui::End(); - - // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" - char buf[128]; - sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount()); - ImGui::SetNextWindowPos(ImVec2(100, 300), ImGuiCond_FirstUseEver); - ImGui::Begin(buf); - ImGui::Text("This window has a changing title."); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() -//----------------------------------------------------------------------------- - -// Demonstrate using the low-level ImDrawList to draw custom shapes. -static void ShowExampleAppCustomRendering(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(350, 560), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Custom rendering", p_open)) - { - ImGui::End(); - return; - } - - // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc. - // Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4. - // ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types) - // In this example we are not using the maths operators! - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - - if (ImGui::BeginTabBar("##TabBar")) - { - // Primitives - if (ImGui::BeginTabItem("Primitives")) - { - static float sz = 36.0f; - static float thickness = 3.0f; - static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f); - ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f"); - ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f"); - ImGui::ColorEdit4("Color", &colf.x); - const ImVec2 p = ImGui::GetCursorScreenPos(); - const ImU32 col = ImColor(colf); - float x = p.x + 4.0f, y = p.y + 4.0f; - float spacing = 10.0f; - ImDrawCornerFlags corners_none = 0; - ImDrawCornerFlags corners_all = ImDrawCornerFlags_All; - ImDrawCornerFlags corners_tl_br = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotRight; - for (int n = 0; n < 2; n++) - { - // First line uses a thickness of 1.0f, second line uses the configurable thickness - float th = (n == 0) ? 1.0f : thickness; - draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, 6, th); x += sz + spacing; // Hexagon - draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, 20, th); x += sz + spacing; // Circle - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, corners_none, th); x += sz + spacing; // Square - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_all, th); x += sz + spacing; // Square with all rounded corners - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners - draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th); x += sz + spacing; // Triangle - draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th); x += sz*0.4f + spacing; // Thin triangle - draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) - draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) - draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line - draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x + sz*1.3f, y + sz*0.3f), ImVec2(x + sz - sz*1.3f, y + sz - sz*0.3f), ImVec2(x + sz, y + sz), col, th); - x = p.x + 4; - y += sz + spacing; - } - draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, 6); x += sz + spacing; // Hexagon - draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, 32); x += sz + spacing; // Circle - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners - draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle - draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing*2.0f; // Vertical line (faster than AddLine, but only handle integer thickness) - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) - draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); - ImGui::Dummy(ImVec2((sz + spacing) * 9.8f, (sz + spacing) * 3)); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Canvas")) - { - static ImVector<ImVec2> points; - static bool adding_line = false; - if (ImGui::Button("Clear")) points.clear(); - if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } } - ImGui::Text("Left-click and drag to add lines,\nRight-click to undo"); - - // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered() - // But you can also draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos(). - // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max). - ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! - ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available - if (canvas_size.x < 50.0f) canvas_size.x = 50.0f; - if (canvas_size.y < 50.0f) canvas_size.y = 50.0f; - draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(50, 50, 50, 255), IM_COL32(50, 50, 60, 255), IM_COL32(60, 60, 70, 255), IM_COL32(50, 50, 60, 255)); - draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(255, 255, 255, 255)); - - bool adding_preview = false; - ImGui::InvisibleButton("canvas", canvas_size); - ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y); - if (adding_line) - { - adding_preview = true; - points.push_back(mouse_pos_in_canvas); - if (!ImGui::IsMouseDown(0)) - adding_line = adding_preview = false; - } - if (ImGui::IsItemHovered()) - { - if (!adding_line && ImGui::IsMouseClicked(0)) - { - points.push_back(mouse_pos_in_canvas); - adding_line = true; - } - if (ImGui::IsMouseClicked(1) && !points.empty()) - { - adding_line = adding_preview = false; - points.pop_back(); - points.pop_back(); - } - } - draw_list->PushClipRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), true); // clip lines within the canvas (if we resize it, etc.) - for (int i = 0; i < points.Size - 1; i += 2) - draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i + 1].x, canvas_pos.y + points[i + 1].y), IM_COL32(255, 255, 0, 255), 2.0f); - draw_list->PopClipRect(); - if (adding_preview) - points.pop_back(); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("BG/FG draw lists")) - { - static bool draw_bg = true; - static bool draw_fg = true; - ImGui::Checkbox("Draw in Background draw list", &draw_bg); - ImGui::Checkbox("Draw in Foreground draw list", &draw_fg); - ImVec2 window_pos = ImGui::GetWindowPos(); - ImVec2 window_size = ImGui::GetWindowSize(); - ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f); - if (draw_bg) - ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 32, 10+4); - if (draw_fg) - ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 32, 10); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() -//----------------------------------------------------------------------------- - -// Simplified structure to mimic a Document model -struct MyDocument -{ - const char* Name; // Document title - bool Open; // Set when the document is open (in this demo, we keep an array of all available documents to simplify the demo) - bool OpenPrev; // Copy of Open from last update. - bool Dirty; // Set when the document has been modified - bool WantClose; // Set when the document - ImVec4 Color; // An arbitrary variable associated to the document - - MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f,1.0f,1.0f,1.0f)) - { - Name = name; - Open = OpenPrev = open; - Dirty = false; - WantClose = false; - Color = color; - } - void DoOpen() { Open = true; } - void DoQueueClose() { WantClose = true; } - void DoForceClose() { Open = false; Dirty = false; } - void DoSave() { Dirty = false; } - - // Display dummy contents for the Document - static void DisplayContents(MyDocument* doc) - { - ImGui::PushID(doc); - ImGui::Text("Document \"%s\"", doc->Name); - ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); - ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); - ImGui::PopStyleColor(); - if (ImGui::Button("Modify", ImVec2(100, 0))) - doc->Dirty = true; - ImGui::SameLine(); - if (ImGui::Button("Save", ImVec2(100, 0))) - doc->DoSave(); - ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. - ImGui::PopID(); - } - - // Display context menu for the Document - static void DisplayContextMenu(MyDocument* doc) - { - if (!ImGui::BeginPopupContextItem()) - return; - - char buf[256]; - sprintf(buf, "Save %s", doc->Name); - if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) - doc->DoSave(); - if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) - doc->DoQueueClose(); - ImGui::EndPopup(); - } -}; - -struct ExampleAppDocuments -{ - ImVector<MyDocument> Documents; - - ExampleAppDocuments() - { - Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); - Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); - Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("A Rather Long Title", false)); - Documents.push_back(MyDocument("Some Document", false)); - } -}; - -// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. -// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, as opposed -// to clicking on the regular tab closing button) and stops being submitted, it will take a frame for the tab bar to notice its absence. -// During this frame there will be a gap in the tab bar, and if the tab that has disappeared was the selected one, the tab bar -// will report no selected tab during the frame. This will effectively give the impression of a flicker for one frame. -// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. -// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. -static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) -{ - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open && doc->OpenPrev) - ImGui::SetTabItemClosed(doc->Name); - doc->OpenPrev = doc->Open; - } -} - -void ShowExampleAppDocuments(bool* p_open) -{ - static ExampleAppDocuments app; - - // Options - static bool opt_reorderable = true; - static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_; - - if (!ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar)) - { - ImGui::End(); - return; - } - - // Menu - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - int open_count = 0; - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - open_count += app.Documents[doc_n].Open ? 1 : 0; - - if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) - { - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) - if (ImGui::MenuItem(doc->Name)) - doc->DoOpen(); - } - ImGui::EndMenu(); - } - if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - app.Documents[doc_n].DoQueueClose(); - if (ImGui::MenuItem("Exit", "Alt+F4")) {} - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - // [Debug] List documents with one checkbox for each - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (doc_n > 0) - ImGui::SameLine(); - ImGui::PushID(doc); - if (ImGui::Checkbox(doc->Name, &doc->Open)) - if (!doc->Open) - doc->DoForceClose(); - ImGui::PopID(); - } - - ImGui::Separator(); - - // Submit Tab Bar and Tabs - { - ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0); - if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) - { - if (opt_reorderable) - NotifyOfDocumentsClosedElsewhere(app); - - // [DEBUG] Stress tests - //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. - //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. - - // Submit Tabs - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) - continue; - - ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); - bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); - - // Cancel attempt to close when unsaved add to save queue so we can display a popup. - if (!doc->Open && doc->Dirty) - { - doc->Open = true; - doc->DoQueueClose(); - } - - MyDocument::DisplayContextMenu(doc); - if (visible) - { - MyDocument::DisplayContents(doc); - ImGui::EndTabItem(); - } - } - - ImGui::EndTabBar(); - } - } - - // Update closing queue - static ImVector<MyDocument*> close_queue; - if (close_queue.empty()) - { - // Close queue is locked once we started a popup - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (doc->WantClose) - { - doc->WantClose = false; - close_queue.push_back(doc); - } - } - } - - // Display closing confirmation UI - if (!close_queue.empty()) - { - int close_queue_unsaved_documents = 0; - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) - close_queue_unsaved_documents++; - - if (close_queue_unsaved_documents == 0) - { - // Close documents when all are unsaved - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); - } - else - { - if (!ImGui::IsPopupOpen("Save?")) - ImGui::OpenPopup("Save?"); - if (ImGui::BeginPopupModal("Save?")) - { - ImGui::Text("Save change to the following items?"); - ImGui::SetNextItemWidth(-1.0f); - if (ImGui::ListBoxHeader("##", close_queue_unsaved_documents, 6)) - { - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) - ImGui::Text("%s", close_queue[n]->Name); - ImGui::ListBoxFooter(); - } - - if (ImGui::Button("Yes", ImVec2(80, 0))) - { - for (int n = 0; n < close_queue.Size; n++) - { - if (close_queue[n]->Dirty) - close_queue[n]->DoSave(); - close_queue[n]->DoForceClose(); - } - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("No", ImVec2(80, 0))) - { - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("Cancel", ImVec2(80, 0))) - { - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - } - } - - ImGui::End(); -} - -// End of Demo code -#else - -void ImGui::ShowAboutWindow(bool*) {} -void ImGui::ShowDemoWindow(bool*) {} -void ImGui::ShowUserGuide() {} -void ImGui::ShowStyleEditor(ImGuiStyle*) {} - -#endif diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_internal.h b/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_internal.h deleted file mode 100644 index 9811f9b0ed..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_internal.h +++ /dev/null @@ -1,1627 +0,0 @@ -// Modifications Copyright Amazon.com, Inc. or its affiliates. - -// dear imgui, v1.70 -// (internal structures/api) - -// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! -// Set: -// #define IMGUI_DEFINE_MATH_OPERATORS -// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators) - -/* - -Index of this file: -// Header mess -// Forward declarations -// STB libraries includes -// Context pointer -// Generic helpers -// Misc data structures -// Main imgui context -// Tab bar, tab item -// Internal API - -*/ - -#pragma once - -//----------------------------------------------------------------------------- -// Header mess -//----------------------------------------------------------------------------- - -#ifndef IMGUI_VERSION -#error Must include imgui.h before imgui_internal.h -#endif - -#include <stdio.h> // FILE* -#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof -#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf -#include <limits.h> // INT_MIN, INT_MAX - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport) -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h -#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h -#pragma clang diagnostic ignored "-Wold-style-cast" -#pragma clang diagnostic ignored "-Wdllexport-hidden-visibility" -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" -#endif -#endif - -//----------------------------------------------------------------------------- -// Forward declarations -//----------------------------------------------------------------------------- - -struct ImRect; // An axis-aligned rectangle (2 points) -struct ImDrawDataBuilder; // Helper to build a ImDrawData instance -struct ImDrawListSharedData; // Data shared between all ImDrawList instances -struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it -struct ImGuiColumnData; // Storage data for a single column -struct ImGuiColumns; // Storage data for a columns set -struct ImGuiContext; // Main imgui context -struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum -struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() -struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box -struct ImGuiItemHoveredDataBackup; // Backup and restore IsItemHovered() internal data -struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only -struct ImGuiNavMoveResult; // Result of a directional navigation move query result -struct ImGuiNextWindowData; // Storage for SetNexWindow** functions -struct ImGuiPopupData; // Storage for current popup stack -struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file -struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it -struct ImGuiTabBar; // Storage for a tab bar -struct ImGuiTabItem; // Storage for a tab item (within a tab bar) -struct ImGuiWindow; // Storage for one window -struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame) -struct ImGuiWindowSettings; // Storage for window settings stored in .ini file (we keep one of those even if the actual window wasn't instanced during this session) - -// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. -typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical -typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for ButtonEx(), ButtonBehavior() -typedef int ImGuiDragFlags; // -> enum ImGuiDragFlags_ // Flags: for DragBehavior() -typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() -typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags -typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() -typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d() -typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests -typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for Separator() - internal -typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for SliderBehavior() -typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() - -//------------------------------------------------------------------------- -// STB libraries includes -//------------------------------------------------------------------------- - -namespace ImStb -{ - -#undef STB_TEXTEDIT_STRING -#undef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_STRING ImGuiInputTextState -#define STB_TEXTEDIT_CHARTYPE ImWchar -#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 -#include "imstb_textedit.h" - -} // namespace ImStb - -//----------------------------------------------------------------------------- -// Context pointer -//----------------------------------------------------------------------------- - -#ifndef GImGui -extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer -#endif - -//----------------------------------------------------------------------------- -// Generic helpers -//----------------------------------------------------------------------------- - -#define IM_PI 3.14159265358979323846f -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" // Play it nice with Windows users (2018/05 news: Microsoft announced that Notepad will finally display Unix-style carriage returns!) -#else -#define IM_NEWLINE "\n" -#endif -#define IM_TABSIZE (4) - -#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__) -#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1] -#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose -#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 - -// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall -#ifdef _MSC_VER -#define IMGUI_CDECL __cdecl -#else -#define IMGUI_CDECL -#endif - -// Helpers: UTF-8 <> wchar -IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count -IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count -IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count -IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) -IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 -IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 - -// Helpers: Misc -IMGUI_API ImU32 ImHashData(const void* data, size_t data_size, ImU32 seed = 0); -IMGUI_API ImU32 ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); -IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size = NULL, int padding_bytes = 0); -IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode); -static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } -static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } -static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } -static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } -#define ImQsort qsort -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -static inline ImU32 ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68] -#endif - -// Helpers: Geometry -IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); -IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); -IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); -IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); -IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); - -// Helpers: String -IMGUI_API int ImStricmp(const char* str1, const char* str2); -IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); -IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); -IMGUI_API char* ImStrdup(const char* str); -IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); -IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); -IMGUI_API int ImStrlenW(const ImWchar* str); -IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line -IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line -IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); -IMGUI_API void ImStrTrimBlanks(char* str); -IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); -IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); -IMGUI_API const char* ImParseFormatFindStart(const char* format); -IMGUI_API const char* ImParseFormatFindEnd(const char* format); -IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); -IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); - -// Helpers: ImVec2/ImVec4 operators -// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.) -// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. -#ifdef IMGUI_DEFINE_MATH_OPERATORS -static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); } -static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x/rhs, lhs.y/rhs); } -static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); } -static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); } -static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); } -static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); } -static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } -static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } -static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } -static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } -static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x+rhs.x, lhs.y+rhs.y, lhs.z+rhs.z, lhs.w+rhs.w); } -static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x-rhs.x, lhs.y-rhs.y, lhs.z-rhs.z, lhs.w-rhs.w); } -static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x*rhs.x, lhs.y*rhs.y, lhs.z*rhs.z, lhs.w*rhs.w); } -#endif - -// Helpers: Maths -// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) -#ifndef IMGUI_DISABLE_MATH_FUNCTIONS -static inline float ImFabs(float x) { return fabsf(x); } -static inline float ImSqrt(float x) { return sqrtf(x); } -static inline float ImPow(float x, float y) { return powf(x, y); } -static inline double ImPow(double x, double y) { return pow(x, y); } -static inline float ImFmod(float x, float y) { return fmodf(x, y); } -static inline double ImFmod(double x, double y) { return fmod(x, y); } -static inline float ImCos(float x) { return cosf(x); } -static inline float ImSin(float x) { return sinf(x); } -static inline float ImAcos(float x) { return acosf(x); } -static inline float ImAtan2(float y, float x) { return atan2f(y, x); } -static inline double ImAtof(const char* s) { return atof(s); } -static inline float ImFloorStd(float x) { return floorf(x); } // we already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by stb_truetype) -static inline float ImCeil(float x) { return ceilf(x); } -#endif -// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support for variety of types: signed/unsigned int/long long float/double -// (Exceptionally using templates here but we could also redefine them for variety of types) -template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } -template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } -template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } -template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } -template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } -template<typename T> static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } -template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } -// - Misc maths helpers -static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); } -static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); } -static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } -static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } -static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } -static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } -static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } -static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; } -static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; } -static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; } -static inline float ImFloor(float f) { return (float)(int)f; } -static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); } -static inline int ImModPositive(int a, int b) { return (a + b) % b; } -static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } -static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } -static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } -static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } - -// Helper: ImBoolVector. Store 1-bit per value. -// Note that Resize() currently clears the whole vector. -struct ImBoolVector -{ - ImVector<int> Storage; - ImBoolVector() { } - void Resize(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } - void Clear() { Storage.clear(); } - bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (Storage[off] & mask) != 0; } - void SetBit(int n, bool v) { int off = (n >> 5); int mask = 1 << (n & 31); if (v) Storage[off] |= mask; else Storage[off] &= ~mask; } -}; - -// Helper: ImPool<>. Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, -// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. -typedef int ImPoolIdx; -template<typename T> -struct IMGUI_API ImPool -{ - ImVector<T> Data; // Contiguous data - ImGuiStorage Map; // ID->Index - ImPoolIdx FreeIdx; // Next free idx to use - - ImPool() { FreeIdx = 0; } - ~ImPool() { Clear(); } - T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Data[idx] : NULL; } - T* GetByIndex(ImPoolIdx n) { return &Data[n]; } - ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Data.Data && p < Data.Data + Data.Size); return (ImPoolIdx)(p - Data.Data); } - T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Data[*p_idx]; *p_idx = FreeIdx; return Add(); } - bool Contains(const T* p) const { return (p >= Data.Data && p < Data.Data + Data.Size); } - void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Data[idx].~T(); } Map.Clear(); Data.clear(); FreeIdx = 0; } - T* Add() { int idx = FreeIdx; if (idx == Data.Size) { Data.resize(Data.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Data[idx]; } IM_PLACEMENT_NEW(&Data[idx]) T(); return &Data[idx]; } - void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } - void Remove(ImGuiID key, ImPoolIdx idx) { Data[idx].~T(); *(int*)&Data[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); } - void Reserve(int capacity) { Data.reserve(capacity); Map.Data.reserve(capacity); } - int GetSize() const { return Data.Size; } -}; - -//----------------------------------------------------------------------------- -// Misc data structures -//----------------------------------------------------------------------------- - -enum ImGuiButtonFlags_ -{ - ImGuiButtonFlags_None = 0, - ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat - ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // [Default] return true on click + release on same item - ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release) - ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release) - ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release) - ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping - ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() - ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED] - ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions - ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine - ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held - ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) - ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12, // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) - ImGuiButtonFlags_NoNavFocus = 1 << 13, // don't override navigation focus when activated - ImGuiButtonFlags_NoHoveredOnNav = 1 << 14 // don't report as hovered when navigated on -}; - -enum ImGuiSliderFlags_ -{ - ImGuiSliderFlags_None = 0, - ImGuiSliderFlags_Vertical = 1 << 0 -}; - -enum ImGuiDragFlags_ -{ - ImGuiDragFlags_None = 0, - ImGuiDragFlags_Vertical = 1 << 0 -}; - -enum ImGuiColumnsFlags_ -{ - // Default: 0 - ImGuiColumnsFlags_None = 0, - ImGuiColumnsFlags_NoBorder = 1 << 0, // Disable column dividers - ImGuiColumnsFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers - ImGuiColumnsFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns - ImGuiColumnsFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window - ImGuiColumnsFlags_GrowParentContentsSize= 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. -}; - -enum ImGuiSelectableFlagsPrivate_ -{ - // NB: need to be in sync with last value of ImGuiSelectableFlags_ - ImGuiSelectableFlags_NoHoldingActiveID = 1 << 10, - ImGuiSelectableFlags_PressedOnClick = 1 << 11, - ImGuiSelectableFlags_PressedOnRelease = 1 << 12, - ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 13, // FIXME: We may be able to remove this (added in 6251d379 for menus) - ImGuiSelectableFlags_AllowItemOverlap = 1 << 14 -}; - -enum ImGuiSeparatorFlags_ -{ - ImGuiSeparatorFlags_None = 0, - ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar - ImGuiSeparatorFlags_Vertical = 1 << 1 -}; - -// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). -// This is going to be exposed in imgui.h when stabilized enough. -enum ImGuiItemFlags_ -{ - ImGuiItemFlags_NoTabStop = 1 << 0, // false - ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. - ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211 - ImGuiItemFlags_NoNav = 1 << 3, // false - ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false - ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window - ImGuiItemFlags_Default_ = 0 -}; - -// Storage for LastItem data -enum ImGuiItemStatusFlags_ -{ - ImGuiItemStatusFlags_None = 0, - ImGuiItemStatusFlags_HoveredRect = 1 << 0, - ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, - ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) - ImGuiItemStatusFlags_ToggledSelection = 1 << 3 // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues. - -#ifdef IMGUI_ENABLE_TEST_ENGINE - , // [imgui-test only] - ImGuiItemStatusFlags_Openable = 1 << 10, // - ImGuiItemStatusFlags_Opened = 1 << 11, // - ImGuiItemStatusFlags_Checkable = 1 << 12, // - ImGuiItemStatusFlags_Checked = 1 << 13 // -#endif -}; - -enum ImGuiTextFlags_ -{ - ImGuiTextFlags_None = 0, - ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0 -}; - -// FIXME: this is in development, not exposed/functional as a generic feature yet. -// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 -enum ImGuiLayoutType_ -{ - ImGuiLayoutType_Horizontal = 0, - ImGuiLayoutType_Vertical = 1 -}; - -enum ImGuiLogType -{ - ImGuiLogType_None = 0, - ImGuiLogType_TTY, - ImGuiLogType_File, - ImGuiLogType_Buffer, - ImGuiLogType_Clipboard -}; - -// X/Y enums are fixed to 0/1 so they may be used to index ImVec2 -enum ImGuiAxis -{ - ImGuiAxis_None = -1, - ImGuiAxis_X = 0, - ImGuiAxis_Y = 1 -}; - -enum ImGuiPlotType -{ - ImGuiPlotType_Lines, - ImGuiPlotType_Histogram -}; - -enum ImGuiInputSource -{ - ImGuiInputSource_None = 0, - ImGuiInputSource_Mouse, - ImGuiInputSource_Nav, - ImGuiInputSource_NavKeyboard, // Only used occasionally for storage, not tested/handled by most code - ImGuiInputSource_NavGamepad, // " - ImGuiInputSource_COUNT -}; - -// FIXME-NAV: Clarify/expose various repeat delay/rate -enum ImGuiInputReadMode -{ - ImGuiInputReadMode_Down, - ImGuiInputReadMode_Pressed, - ImGuiInputReadMode_Released, - ImGuiInputReadMode_Repeat, - ImGuiInputReadMode_RepeatSlow, - ImGuiInputReadMode_RepeatFast -}; - -enum ImGuiNavHighlightFlags_ -{ - ImGuiNavHighlightFlags_None = 0, - ImGuiNavHighlightFlags_TypeDefault = 1 << 0, - ImGuiNavHighlightFlags_TypeThin = 1 << 1, - ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. - ImGuiNavHighlightFlags_NoRounding = 1 << 3 -}; - -enum ImGuiNavDirSourceFlags_ -{ - ImGuiNavDirSourceFlags_None = 0, - ImGuiNavDirSourceFlags_Keyboard = 1 << 0, - ImGuiNavDirSourceFlags_PadDPad = 1 << 1, - ImGuiNavDirSourceFlags_PadLStick = 1 << 2 -}; - -enum ImGuiNavMoveFlags_ -{ - ImGuiNavMoveFlags_None = 0, - ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side - ImGuiNavMoveFlags_LoopY = 1 << 1, - ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) - ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness - ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) - ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5 // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible. -}; - -enum ImGuiNavForward -{ - ImGuiNavForward_None, - ImGuiNavForward_ForwardQueued, - ImGuiNavForward_ForwardActive -}; - -enum ImGuiNavLayer -{ - ImGuiNavLayer_Main = 0, // Main scrolling layer - ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu) - ImGuiNavLayer_COUNT -}; - -enum ImGuiPopupPositionPolicy -{ - ImGuiPopupPositionPolicy_Default, - ImGuiPopupPositionPolicy_ComboBox -}; - -// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) -struct ImVec1 -{ - float x; - ImVec1() { x = 0.0f; } - ImVec1(float _x) { x = _x; } -}; - -// 2D axis aligned bounding-box -// NB: we can't rely on ImVec2 math operators being available here -struct IMGUI_API ImRect -{ - ImVec2 Min; // Upper-left - ImVec2 Max; // Lower-right - - ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {} - ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} - ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} - ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} - - ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } - ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } - float GetWidth() const { return Max.x - Min.x; } - float GetHeight() const { return Max.y - Min.y; } - ImVec2 GetTL() const { return Min; } // Top-left - ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right - ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left - ImVec2 GetBR() const { return Max; } // Bottom-right - bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } - bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } - bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } - void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } - void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } - void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } - void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } - void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } - void TranslateX(float dx) { Min.x += dx; Max.x += dx; } - void TranslateY(float dy) { Min.y += dy; Max.y += dy; } - void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. - void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. - void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; } - bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } -}; - -// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). -struct ImGuiDataTypeInfo -{ - size_t Size; // Size in byte - const char* PrintFmt; // Default printf format for the type - const char* ScanFmt; // Default scanf format for the type -}; - -// Stacked color modifier, backup of modified data so we can restore it -struct ImGuiColorMod -{ - ImGuiCol Col; - ImVec4 BackupValue; -}; - -// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. -struct ImGuiStyleMod -{ - ImGuiStyleVar VarIdx; - union { int BackupInt[2]; float BackupFloat[2]; }; - ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } - ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } - ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } -}; - -// Stacked storage data for BeginGroup()/EndGroup() -struct ImGuiGroupData -{ - ImVec2 BackupCursorPos; - ImVec2 BackupCursorMaxPos; - ImVec1 BackupIndent; - ImVec1 BackupGroupOffset; - ImVec2 BackupCurrentLineSize; - float BackupCurrentLineTextBaseOffset; - ImGuiID BackupActiveIdIsAlive; - bool BackupActiveIdPreviousFrameIsAlive; - bool AdvanceCursor; -}; - -// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. -struct IMGUI_API ImGuiMenuColumns -{ - float Spacing; - float Width, NextWidth; - float Pos[3], NextWidths[3]; - - ImGuiMenuColumns(); - void Update(int count, float spacing, bool clear); - float DeclColumns(float w0, float w1, float w2); - float CalcExtraSpace(float avail_w); -}; - -// Internal state of the currently focused/edited text input box -struct IMGUI_API ImGuiInputTextState -{ - ImGuiID ID; // widget id owning the text state - int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 len is valid even if TextA is not. - ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. - ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. - ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) - bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) - int BufCapacityA; // end-user buffer capacity - float ScrollX; // horizontal scrolling/offset - ImStb::STB_TexteditState Stb; // state for stb_textedit.h - float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately - bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) - bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection - - // Temporarily set when active - ImGuiInputTextFlags UserFlags; - ImGuiInputTextCallback UserCallback; - void* UserCallbackData; - - ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } - void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } - void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking - void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } - bool HasSelection() const { return Stb.select_start != Stb.select_end; } - void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } - void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } - int GetUndoAvailCount() const { return Stb.undostate.undo_point; } - int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } - void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation -}; - -// Windows data saved in imgui.ini file -struct ImGuiWindowSettings -{ - char* Name; - ImGuiID ID; - ImVec2 Pos; - ImVec2 Size; - bool Collapsed; - - ImGuiWindowSettings() { Name = NULL; ID = 0; Pos = Size = ImVec2(0,0); Collapsed = false; } -}; - -struct ImGuiSettingsHandler -{ - const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' - ImGuiID TypeHash; // == ImHashStr(TypeName) - void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" - void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry - void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' - void* UserData; - - ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } -}; - -// Storage for current popup stack -struct ImGuiPopupData -{ - ImGuiID PopupId; // Set on OpenPopup() - ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() - ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup - int OpenFrameCount; // Set on OpenPopup() - ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) - ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) - ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup - - ImGuiPopupData() { PopupId = 0; Window = SourceWindow = NULL; OpenFrameCount = -1; OpenParentId = 0; } -}; - -struct ImGuiColumnData -{ - float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) - float OffsetNormBeforeResize; - ImGuiColumnsFlags Flags; // Not exposed - ImRect ClipRect; - - ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = ImGuiColumnsFlags_None; } -}; - -struct ImGuiColumns -{ - ImGuiID ID; - ImGuiColumnsFlags Flags; - bool IsFirstFrame; - bool IsBeingResized; - int Current; - int Count; - float MinX, MaxX; - float LineMinY, LineMaxY; - float BackupCursorPosY; // Backup of CursorPos at the time of BeginColumns() - float BackupCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() - ImVector<ImGuiColumnData> Columns; - - ImGuiColumns() { Clear(); } - void Clear() - { - ID = 0; - Flags = ImGuiColumnsFlags_None; - IsFirstFrame = false; - IsBeingResized = false; - Current = 0; - Count = 1; - MinX = MaxX = 0.0f; - LineMinY = LineMaxY = 0.0f; - BackupCursorPosY = 0.0f; - BackupCursorMaxPosX = 0.0f; - Columns.clear(); - } -}; - -// Data shared between all ImDrawList instances -struct IMGUI_API ImDrawListSharedData -{ - ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas - ImFont* Font; // Current/default font (optional, for simplified AddText overload) - float FontSize; // Current/default font size (optional, for simplified AddText overload) - float CurveTessellationTol; - ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() - - // Const data - // FIXME: Bake rounded corners fill/borders in atlas - ImVec2 CircleVtx12[12]; - - ImDrawListSharedData(); -}; - -struct ImDrawDataBuilder -{ - ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip - - void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } - void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } - IMGUI_API void FlattenIntoSingleLayer(); -}; - -struct ImGuiNavMoveResult -{ - ImGuiID ID; // Best candidate - ImGuiID SelectScopeId;// Best candidate window current selectable group ID - ImGuiWindow* Window; // Best candidate window - float DistBox; // Best candidate box distance to current NavId - float DistCenter; // Best candidate center distance to current NavId - float DistAxial; - ImRect RectRel; // Best candidate bounding box in window relative space - - ImGuiNavMoveResult() { Clear(); } - void Clear() { ID = SelectScopeId = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); } -}; - -// Storage for SetNexWindow** functions -struct ImGuiNextWindowData -{ - ImGuiCond PosCond; - ImGuiCond SizeCond; - ImGuiCond ContentSizeCond; - ImGuiCond CollapsedCond; - ImGuiCond SizeConstraintCond; - ImGuiCond FocusCond; - ImGuiCond BgAlphaCond; - ImVec2 PosVal; - ImVec2 PosPivotVal; - ImVec2 SizeVal; - ImVec2 ContentSizeVal; - bool CollapsedVal; - ImRect SizeConstraintRect; - ImGuiSizeCallback SizeCallback; - void* SizeCallbackUserData; - float BgAlphaVal; - ImVec2 MenuBarOffsetMinVal; // This is not exposed publicly, so we don't clear it. - - ImGuiNextWindowData() - { - PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0; - PosVal = PosPivotVal = SizeVal = ImVec2(0.0f, 0.0f); - ContentSizeVal = ImVec2(0.0f, 0.0f); - CollapsedVal = false; - SizeConstraintRect = ImRect(); - SizeCallback = NULL; - SizeCallbackUserData = NULL; - BgAlphaVal = FLT_MAX; - MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); - } - - void Clear() - { - PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0; - } -}; - -//----------------------------------------------------------------------------- -// Tabs -//----------------------------------------------------------------------------- - -struct ImGuiTabBarSortItem -{ - int Index; - float Width; -}; - -struct ImGuiTabBarRef -{ - ImGuiTabBar* Ptr; // Either field can be set, not both. Dock node tab bars are loose while BeginTabBar() ones are in a pool. - int IndexInMainPool; - - ImGuiTabBarRef(ImGuiTabBar* ptr) { Ptr = ptr; IndexInMainPool = -1; } - ImGuiTabBarRef(int index_in_main_pool) { Ptr = NULL; IndexInMainPool = index_in_main_pool; } -}; - -//----------------------------------------------------------------------------- -// Main imgui context -//----------------------------------------------------------------------------- - -struct ImGuiContext -{ - bool Initialized; - bool FrameScopeActive; // Set by NewFrame(), cleared by EndFrame() - bool FrameScopePushedImplicitWindow; // Set by NewFrame(), cleared by EndFrame() - bool FontAtlasOwnedByContext; // Io.Fonts-> is owned by the ImGuiContext and will be destructed along with it. - ImGuiIO IO; - ImGuiStyle Style; - ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() - float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. - float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. - ImDrawListSharedData DrawListSharedData; - - double Time; - int FrameCount; - int FrameCountEnded; - int FrameCountRendered; - ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front - ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front - ImVector<ImGuiWindow*> WindowsSortBuffer; - ImVector<ImGuiWindow*> CurrentWindowStack; - ImGuiStorage WindowsById; - int WindowsActiveCount; - ImGuiWindow* CurrentWindow; // Being drawn into - ImGuiWindow* HoveredWindow; // Will catch mouse inputs - ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only) - ImGuiID HoveredId; // Hovered widget - bool HoveredIdAllowOverlap; - ImGuiID HoveredIdPreviousFrame; - float HoveredIdTimer; // Measure contiguous hovering time - float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active - ImGuiID ActiveId; // Active widget - ImGuiID ActiveIdPreviousFrame; - ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) - float ActiveIdTimer; - bool ActiveIdIsJustActivated; // Set at the time of activation for one frame - bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) - bool ActiveIdHasBeenPressed; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. - bool ActiveIdHasBeenEdited; // Was the value associated to the widget Edited over the course of the Active state. - bool ActiveIdPreviousFrameIsAlive; - bool ActiveIdPreviousFrameHasBeenEdited; - int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it) - int ActiveIdBlockNavInputFlags; - ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) - ImGuiWindow* ActiveIdWindow; - ImGuiWindow* ActiveIdPreviousFrameWindow; - ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) - ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. - float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. - ImVec2 LastValidMousePos; - ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow. - ImVector<ImGuiColorMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor() - ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar() - ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent) - ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) - ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions - bool NextTreeNodeOpenVal; // Storage for SetNextTreeNode** functions - ImGuiCond NextTreeNodeOpenCond; - - // Navigation data (for gamepad/keyboard) - ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow' - ImGuiID NavId; // Focused item for navigation - ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem() - ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0 - ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 - ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 - ImGuiID NavJustTabbedId; // Just tabbed to this id. - ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). - ImGuiID NavJustMovedToMultiSelectScopeId; // Just navigated to this select scope id (result of a successfully MoveRequest). - ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. - ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. - ImRect NavScoringRectScreen; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring. - int NavScoringCount; // Metrics for debugging - ImGuiWindow* NavWindowingTarget; // When selecting a window (holding Menu+FocusPrev/Next, or equivalent of CTRL-TAB) this window is temporarily displayed front-most. - ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f - ImGuiWindow* NavWindowingList; - float NavWindowingTimer; - float NavWindowingHighlightAlpha; - bool NavWindowingToggleLayer; - ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. - int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing - bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRefRectRel is valid - bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) - bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) - bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. - bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest - bool NavInitRequest; // Init request for appearing window to select first item - bool NavInitRequestFromMove; - ImGuiID NavInitResultId; - ImRect NavInitResultRectRel; - bool NavMoveFromClampedRefRect; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items - bool NavMoveRequest; // Move request for this frame - ImGuiNavMoveFlags NavMoveRequestFlags; - ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu) - ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request - ImGuiDir NavMoveClipDir; - ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow - ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) - ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) - - // Tabbing system (older than Nav, active even if Nav is disabled. FIXME-NAV: This needs a redesign!) - ImGuiWindow* FocusRequestCurrWindow; // - ImGuiWindow* FocusRequestNextWindow; // - int FocusRequestCurrCounterAll; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch) - int FocusRequestCurrCounterTab; // Tab item being requested for focus, stored as an index - int FocusRequestNextCounterAll; // Stored for next frame - int FocusRequestNextCounterTab; // " - bool FocusTabPressed; // - - // Render - ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user - ImDrawDataBuilder DrawDataBuilder; - float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) - ImDrawList BackgroundDrawList; // First draw list to be rendered. - ImDrawList ForegroundDrawList; // Last draw list to be rendered. This is where we the render software mouse cursor (if io.MouseDrawCursor is set) and most debug overlays. - ImGuiMouseCursor MouseCursor; - - // Drag and Drop - bool DragDropActive; - bool DragDropWithinSourceOrTarget; - ImGuiDragDropFlags DragDropSourceFlags; - int DragDropSourceFrameCount; - int DragDropMouseButton; - ImGuiPayload DragDropPayload; - ImRect DragDropTargetRect; - ImGuiID DragDropTargetId; - ImGuiDragDropFlags DragDropAcceptFlags; - float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) - ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) - ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) - int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source - ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly - unsigned char DragDropPayloadBufLocal[8]; // Local buffer for small payloads - - // Tab bars - ImPool<ImGuiTabBar> TabBars; - ImGuiTabBar* CurrentTabBar; - ImVector<ImGuiTabBarRef> CurrentTabBarStack; - ImVector<ImGuiTabBarSortItem> TabSortByWidthBuffer; - - // Widget state - ImGuiInputTextState InputTextState; - ImFont InputTextPasswordFont; - ImGuiID TempInputTextId; // Temporary text input when CTRL+clicking on a slider, etc. - ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets - ImVec4 ColorPickerRef; - bool DragCurrentAccumDirty; - float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings - float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio - ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? - int TooltipOverrideCount; - ImVector<char> PrivateClipboard; // If no custom clipboard handler is defined - - // Range-Select/Multi-Select - // [This is unused in this branch, but left here to facilitate merging/syncing multiple branches] - ImGuiID MultiSelectScopeId; - - // Platform support - ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor - ImVec2 PlatformImeLastPos; - - // Settings - bool SettingsLoaded; - float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero - ImGuiTextBuffer SettingsIniData; // In memory .ini settings - ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers - ImVector<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries (parsed from the last loaded .ini file and maintained on saving) - - // Logging - bool LogEnabled; - ImGuiLogType LogType; - FILE* LogFile; // If != NULL log to stdout/ file - ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. - float LogLinePosY; - bool LogLineFirstItem; - int LogDepthRef; - int LogDepthToExpand; - int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. - - // Misc - float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds. - int FramerateSecPerFrameIdx; - float FramerateSecPerFrameAccum; - int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags - int WantCaptureKeyboardNextFrame; - int WantTextInputNextFrame; - char TempBuffer[1024*3+1]; // Temporary text buffer - - ImGuiContext(ImFontAtlas* shared_font_atlas) : BackgroundDrawList(NULL), ForegroundDrawList(NULL) - { - Initialized = false; - FrameScopeActive = FrameScopePushedImplicitWindow = false; - Font = NULL; - FontSize = FontBaseSize = 0.0f; - FontAtlasOwnedByContext = shared_font_atlas ? false : true; - IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); - - Time = 0.0f; - FrameCount = 0; - FrameCountEnded = FrameCountRendered = -1; - WindowsActiveCount = 0; - CurrentWindow = NULL; - HoveredWindow = NULL; - HoveredRootWindow = NULL; - HoveredId = 0; - HoveredIdAllowOverlap = false; - HoveredIdPreviousFrame = 0; - HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; - ActiveId = 0; - ActiveIdPreviousFrame = 0; - ActiveIdIsAlive = 0; - ActiveIdTimer = 0.0f; - ActiveIdIsJustActivated = false; - ActiveIdAllowOverlap = false; - ActiveIdHasBeenPressed = false; - ActiveIdHasBeenEdited = false; - ActiveIdPreviousFrameIsAlive = false; - ActiveIdPreviousFrameHasBeenEdited = false; - ActiveIdAllowNavDirFlags = 0x00; - ActiveIdBlockNavInputFlags = 0x00; - ActiveIdClickOffset = ImVec2(-1,-1); - ActiveIdWindow = ActiveIdPreviousFrameWindow = NULL; - ActiveIdSource = ImGuiInputSource_None; - LastActiveId = 0; - LastActiveIdTimer = 0.0f; - LastValidMousePos = ImVec2(0.0f, 0.0f); - MovingWindow = NULL; - NextTreeNodeOpenVal = false; - NextTreeNodeOpenCond = 0; - - NavWindow = NULL; - NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; - NavJustTabbedId = NavJustMovedToId = NavJustMovedToMultiSelectScopeId = NavNextActivateId = 0; - NavInputSource = ImGuiInputSource_None; - NavScoringRectScreen = ImRect(); - NavScoringCount = 0; - NavWindowingTarget = NavWindowingTargetAnim = NavWindowingList = NULL; - NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; - NavWindowingToggleLayer = false; - NavLayer = ImGuiNavLayer_Main; - NavIdTabCounter = INT_MAX; - NavIdIsAlive = false; - NavMousePosDirty = false; - NavDisableHighlight = true; - NavDisableMouseHover = false; - NavAnyRequest = false; - NavInitRequest = false; - NavInitRequestFromMove = false; - NavInitResultId = 0; - NavMoveFromClampedRefRect = false; - NavMoveRequest = false; - NavMoveRequestFlags = 0; - NavMoveRequestForward = ImGuiNavForward_None; - NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None; - - FocusRequestCurrWindow = FocusRequestNextWindow = NULL; - FocusRequestCurrCounterAll = FocusRequestCurrCounterTab = INT_MAX; - FocusRequestNextCounterAll = FocusRequestNextCounterTab = INT_MAX; - FocusTabPressed = false; - - DimBgRatio = 0.0f; - BackgroundDrawList._Data = &DrawListSharedData; - BackgroundDrawList._OwnerName = "##Background"; // Give it a name for debugging - ForegroundDrawList._Data = &DrawListSharedData; - ForegroundDrawList._OwnerName = "##Foreground"; // Give it a name for debugging - MouseCursor = ImGuiMouseCursor_Arrow; - - DragDropActive = DragDropWithinSourceOrTarget = false; - DragDropSourceFlags = 0; - DragDropSourceFrameCount = -1; - DragDropMouseButton = -1; - DragDropTargetId = 0; - DragDropAcceptFlags = 0; - DragDropAcceptIdCurrRectSurface = 0.0f; - DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; - DragDropAcceptFrameCount = -1; - memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); - - CurrentTabBar = NULL; - - TempInputTextId = 0; - ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; - DragCurrentAccumDirty = false; - DragCurrentAccum = 0.0f; - DragSpeedDefaultRatio = 1.0f / 100.0f; - ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f); - TooltipOverrideCount = 0; - - MultiSelectScopeId = 0; - - PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX); - - SettingsLoaded = false; - SettingsDirtyTimer = 0.0f; - - LogEnabled = false; - LogType = ImGuiLogType_None; - LogFile = NULL; - LogLinePosY = FLT_MAX; - LogLineFirstItem = false; - LogDepthRef = 0; - LogDepthToExpand = LogDepthToExpandDefault = 2; - - memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); - FramerateSecPerFrameIdx = 0; - FramerateSecPerFrameAccum = 0.0f; - WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; - memset(TempBuffer, 0, sizeof(TempBuffer)); - } -}; - -//----------------------------------------------------------------------------- -// ImGuiWindow -//----------------------------------------------------------------------------- - -// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. -// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered. -struct IMGUI_API ImGuiWindowTempData -{ - ImVec2 CursorPos; - ImVec2 CursorPosPrevLine; - ImVec2 CursorStartPos; // Initial position in client area with padding - ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame - ImVec2 CurrentLineSize; - float CurrentLineTextBaseOffset; - ImVec2 PrevLineSize; - float PrevLineTextBaseOffset; - int TreeDepth; - ImU32 TreeStoreMayJumpToParentOnPop; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. - ImGuiID LastItemId; - ImGuiItemStatusFlags LastItemStatusFlags; - ImRect LastItemRect; // Interaction rect - ImRect LastItemDisplayRect; // End-user display rect (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect) - ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) - int NavLayerCurrentMask; // = (1 << NavLayerCurrent) used by ItemAdd prior to clipping. - int NavLayerActiveMask; // Which layer have been written to (result from previous frame) - int NavLayerActiveMaskNext; // Which layer have been written to (buffer for current frame) - bool NavHideHighlightOneFrame; - bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) - bool MenuBarAppending; // FIXME: Remove this - ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs. - ImVector<ImGuiWindow*> ChildWindows; - ImGuiStorage* StateStorage; - ImGuiLayoutType LayoutType; - ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() - int FocusCounterAll; // Counter for focus/tabbing system. Start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign) - int FocusCounterTab; // (same, but only count widgets which you can Tab through) - - // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. - ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default] - float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window - float NextItemWidth; - float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f] - ImVector<ImGuiItemFlags>ItemFlagsStack; - ImVector<float> ItemWidthStack; - ImVector<float> TextWrapPosStack; - ImVector<ImGuiGroupData>GroupStack; - short StackSizesBackup[6]; // Store size of various stacks for asserting - - ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) - ImVec1 GroupOffset; - ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API. - ImGuiColumns* CurrentColumns; // Current columns set - - ImGuiWindowTempData() - { - CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f); - CurrentLineSize = PrevLineSize = ImVec2(0.0f, 0.0f); - CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f; - TreeDepth = 0; - TreeStoreMayJumpToParentOnPop = 0x00; - LastItemId = 0; - LastItemStatusFlags = 0; - LastItemRect = LastItemDisplayRect = ImRect(); - NavLayerActiveMask = NavLayerActiveMaskNext = 0x00; - NavLayerCurrent = ImGuiNavLayer_Main; - NavLayerCurrentMask = (1 << ImGuiNavLayer_Main); - NavHideHighlightOneFrame = false; - NavHasScroll = false; - MenuBarAppending = false; - MenuBarOffset = ImVec2(0.0f, 0.0f); - StateStorage = NULL; - LayoutType = ParentLayoutType = ImGuiLayoutType_Vertical; - FocusCounterAll = FocusCounterTab = -1; - - ItemFlags = ImGuiItemFlags_Default_; - ItemWidth = 0.0f; - NextItemWidth = +FLT_MAX; - TextWrapPos = -1.0f; - memset(StackSizesBackup, 0, sizeof(StackSizesBackup)); - - Indent = ImVec1(0.0f); - GroupOffset = ImVec1(0.0f); - ColumnsOffset = ImVec1(0.0f); - CurrentColumns = NULL; - } -}; - -// Storage for one window -struct IMGUI_API ImGuiWindow -{ - char* Name; - ImGuiID ID; // == ImHash(Name) - ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ - ImVec2 Pos; // Position (always rounded-up to nearest pixel) - ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) - ImVec2 SizeFull; // Size when non collapsed - ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars. - ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc. - ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize() - ImVec2 WindowPadding; // Window padding at the time of begin. - float WindowRounding; // Window rounding at the time of begin. - float WindowBorderSize; // Window border size at the time of begin. - int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! - ImGuiID MoveId; // == window->GetID("#MOVE") - ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) - ImVec2 Scroll; - ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) - ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered - ImVec2 ScrollbarSizes; // Size taken by scrollbars on each axis - bool ScrollbarX, ScrollbarY; - bool Active; // Set to true on Begin(), unless Collapsed - bool WasActive; - bool WriteAccessed; // Set to true when any widget access the current window - bool Collapsed; // Set when collapsing window to become only title-bar - bool WantCollapseToggle; - bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) - bool Appearing; // Set during the frame where the window is appearing (or re-appearing) - bool Hidden; // Do not display (== (HiddenFrames*** > 0)) - bool HasCloseButton; // Set when the window has a close button (p_open != NULL) - signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) - short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) - short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0. - short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues. - ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) - int AutoFitFramesX, AutoFitFramesY; - bool AutoFitOnlyGrows; - int AutoFitChildAxises; - ImGuiDir AutoPosLastDirection; - int HiddenFramesCanSkipItems; // Hide the window for N frames - int HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size - ImGuiCond SetWindowPosAllowFlags; // store acceptable condition flags for SetNextWindowPos() use. - ImGuiCond SetWindowSizeAllowFlags; // store acceptable condition flags for SetNextWindowSize() use. - ImGuiCond SetWindowCollapsedAllowFlags; // store acceptable condition flags for SetNextWindowCollapsed() use. - ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) - ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right. - - ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. - ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack - ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2. - ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window. - ImRect InnerMainRect, InnerClipRect; - ImRect ContentsRegionRect; // FIXME: This is currently confusing/misleading. Maximum visible content position ~~ Pos + (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis - int LastFrameActive; // Last frame number the window was Active. - float ItemWidthDefault; - ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items - ImGuiStorage StateStorage; - ImVector<ImGuiColumns> ColumnsStorage; - float FontWindowScale; // User scale multiplier per-window - int SettingsIdx; // Index into SettingsWindow[] (indices are always valid as we only grow the array from the back) - - ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) - ImDrawList DrawListInst; - ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL. - ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. - ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. - ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. - - ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) - ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) - ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space - -public: - ImGuiWindow(ImGuiContext* context, const char* name); - ~ImGuiWindow(); - - ImGuiID GetID(const char* str, const char* str_end = NULL); - ImGuiID GetID(const void* ptr); - ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL); - ImGuiID GetIDNoKeepAlive(const void* ptr); - ImGuiID GetIDFromRectangle(const ImRect& r_abs); - - // We don't use g.FontSize because the window may be != g.CurrentWidow. - ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); } - float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; } - float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; } - ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } - float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; } - ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } -}; - -// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data. -struct ImGuiItemHoveredDataBackup -{ - ImGuiID LastItemId; - ImGuiItemStatusFlags LastItemStatusFlags; - ImRect LastItemRect; - ImRect LastItemDisplayRect; - - ImGuiItemHoveredDataBackup() { Backup(); } - void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; } - void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; } -}; - -//----------------------------------------------------------------------------- -// Tab bar, tab item -//----------------------------------------------------------------------------- - -enum ImGuiTabBarFlagsPrivate_ -{ - ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] - ImGuiTabBarFlags_IsFocused = 1 << 21, - ImGuiTabBarFlags_SaveSettings = 1 << 22 // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs -}; - -enum ImGuiTabItemFlagsPrivate_ -{ - ImGuiTabItemFlags_NoCloseButton = 1 << 20 // Store whether p_open is set or not, which we need to recompute WidthContents during layout. -}; - -// Storage for one active tab item (sizeof() 26~32 bytes) -struct ImGuiTabItem -{ - ImGuiID ID; - ImGuiTabItemFlags Flags; - int LastFrameVisible; - int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance - int NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames - float Offset; // Position relative to beginning of tab - float Width; // Width currently displayed - float WidthContents; // Width of actual contents, stored during BeginTabItem() call - - ImGuiTabItem() { ID = Flags = 0; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = WidthContents = 0.0f; } -}; - -// Storage for a tab bar (sizeof() 92~96 bytes) -struct ImGuiTabBar -{ - ImVector<ImGuiTabItem> Tabs; - ImGuiID ID; // Zero for tab-bars used by docking - ImGuiID SelectedTabId; // Selected tab - ImGuiID NextSelectedTabId; - ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) - int CurrFrameVisible; - int PrevFrameVisible; - ImRect BarRect; - float ContentsHeight; - float OffsetMax; // Distance from BarRect.Min.x, locked during layout - float OffsetNextTab; // Distance from BarRect.Min.x, incremented with each BeginTabItem() call, not used if ImGuiTabBarFlags_Reorderable if set. - float ScrollingAnim; - float ScrollingTarget; - float ScrollingTargetDistToVisibility; - float ScrollingSpeed; - ImGuiTabBarFlags Flags; - ImGuiID ReorderRequestTabId; - int ReorderRequestDir; - bool WantLayout; - bool VisibleTabWasSubmitted; - short LastTabItemIdx; // For BeginTabItem()/EndTabItem() - ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() - ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. - - ImGuiTabBar(); - int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } - const char* GetTabName(const ImGuiTabItem* tab) const - { - IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size); - return TabsNames.Buf.Data + tab->NameOffset; - } -}; - -//----------------------------------------------------------------------------- -// Internal API -// No guarantee of forward compatibility here. -//----------------------------------------------------------------------------- - -namespace ImGui -{ - // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) - // If this ever crash because g.CurrentWindow is NULL it means that either - // - ImGui::NewFrame() has never been called, which is illegal. - // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. - inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } - inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } - IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); - IMGUI_API ImGuiWindow* FindWindowByName(const char* name); - IMGUI_API void FocusWindow(ImGuiWindow* window); - IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); - IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); - IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); - IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); - IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); - IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window); - IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); - IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); - IMGUI_API void SetWindowScrollX(ImGuiWindow* window, float new_scroll_x); - IMGUI_API void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y); - IMGUI_API float GetWindowScrollMaxX(ImGuiWindow* window); - IMGUI_API float GetWindowScrollMaxY(ImGuiWindow* window); - IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window); - IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond); - IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond); - IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond); - - IMGUI_API void SetCurrentFont(ImFont* font); - inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } - - // Init - IMGUI_API void Initialize(ImGuiContext* context); - IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). - - // NewFrame - IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); - IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); - IMGUI_API void UpdateMouseMovingWindowNewFrame(); - IMGUI_API void UpdateMouseMovingWindowEndFrame(); - - // Settings - IMGUI_API void MarkIniSettingsDirty(); - IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); - IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); - IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); - IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); - IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); - - // Basic Accessors - inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } - inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } - inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } - IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); - IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); - IMGUI_API void ClearActiveID(); - IMGUI_API ImGuiID GetHoveredID(); - IMGUI_API void SetHoveredID(ImGuiID id); - IMGUI_API void KeepAliveID(ImGuiID id); - IMGUI_API void MarkItemEdited(ImGuiID id); - IMGUI_API void PushOverrideID(ImGuiID id); - - // Basic Helpers for widget code - IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f); - IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f); - IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL); - IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); - IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); - IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id); // Return true if focus is requested - IMGUI_API void FocusableItemUnregister(ImGuiWindow* window); - IMGUI_API float GetNextItemWidth(); - IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); - IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); - IMGUI_API void PushMultiItemsWidths(int components, float width_full); - IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); - IMGUI_API void PopItemFlag(); - IMGUI_API bool IsItemToggledSelection(); // was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) - IMGUI_API ImVec2 GetWorkRectMax(); - - // Logging/Capture - IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. - IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer - - // Popups, Modals, Tooltips - IMGUI_API void OpenPopupEx(ImGuiID id); - IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); - IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); - IMGUI_API bool IsPopupOpen(ImGuiID id); // Test for id within current popup stack level (currently begin-ed into); this doesn't scan the whole popup stack! - IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); - IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true); - IMGUI_API ImGuiWindow* GetFrontMostPopupModal(); - IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); - IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default); - - // Navigation - IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); - IMGUI_API bool NavMoveRequestButNoResultYet(); - IMGUI_API void NavMoveRequestCancel(); - IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags); - IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); - IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode); - IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f); - IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate); - IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. - IMGUI_API void SetNavID(ImGuiID id, int nav_layer); - IMGUI_API void SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel); - - // Inputs - inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { const int key_index = GImGui->IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; } - inline bool IsNavInputDown(ImGuiNavInput n) { return GImGui->IO.NavInputs[n] > 0.0f; } - inline bool IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; } - inline bool IsNavInputPressedAnyOfTwo(ImGuiNavInput n1, ImGuiNavInput n2, ImGuiInputReadMode mode) { return (GetNavInputAmount(n1, mode) + GetNavInputAmount(n2, mode)) > 0.0f; } - - // Drag and Drop - IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); - IMGUI_API void ClearDragDrop(); - IMGUI_API bool IsDragDropPayloadBeingAccepted(); - - // New Columns API (FIXME-WIP) - IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). - IMGUI_API void EndColumns(); // close columns - IMGUI_API void PushColumnClipRect(int column_index = -1); - IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); - IMGUI_API ImGuiColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); - - // Tab Bars - IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); - IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); - IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); - IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); - IMGUI_API void TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir); - IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); - IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button); - IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); - IMGUI_API bool TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id); - - // Render helpers - // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. - // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) - IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); - IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); - IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0,0), const ImRect* clip_rect = NULL); - IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); - IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); - IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); - IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0); - IMGUI_API void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale = 1.0f); - IMGUI_API void RenderBullet(ImVec2 pos); - IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz); - IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight - IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. - IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); - - // Render helpers (those functions don't access any ImGui state!) - IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor = ImGuiMouseCursor_Arrow); - IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); - IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); - IMGUI_API void RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col); - - // Widgets - IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); - IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0); - IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius); - IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); - IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags); - IMGUI_API void Scrollbar(ImGuiAxis axis); - IMGUI_API ImGuiID GetScrollbarID(ImGuiWindow* window, ImGuiAxis axis); - IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout. - - // Widgets low-level behaviors - IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); - IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags); - IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb); - IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); - IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); - IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging - IMGUI_API void TreePushOverrideID(ImGuiID id); - - // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. - // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). - // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); " - template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, float power, ImGuiDragFlags flags); - template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb); - template<typename T, typename FLOAT_T> IMGUI_API float SliderCalcRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, float power, float linear_zero_pos); - template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); - - // Data type helpers - IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); - IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format); - IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2); - IMGUI_API bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format); - - // InputText - IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format); - inline bool TempInputTextIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputTextId == id); } - - // Color - IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); - IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); - IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); - - // Plot - IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); - - // Shade functions (write over already created vertices) - IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); - IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); - -} // namespace ImGui - -// ImFontAtlas internals -IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); -IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); -IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); -IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); - -// Test engine hooks (imgui-test) -//#define IMGUI_ENABLE_TEST_ENGINE -#ifdef IMGUI_ENABLE_TEST_ENGINE -extern void ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx); -extern void ImGuiTestEngineHook_PostNewFrame(ImGuiContext* ctx); -extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); -extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); -#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB, _ID) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register status flags -#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register status flags -#else -#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB, _ID) do { } while (0) -#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) do { } while (0) -#endif - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#ifdef _MSC_VER -#pragma warning (pop) -#endif diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/README.txt b/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/README.txt deleted file mode 100644 index 5c475f2f8b..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/README.txt +++ /dev/null @@ -1,321 +0,0 @@ -dear imgui, v1.70 -(Font Readme) - ---------------------------------------- - -The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' (by Tristan Grimmer), -a 13 pixels high, pixel-perfect font used by default. -We embed it font in source code so you can use Dear ImGui without any file system access. - -You may also load external .TTF/.OTF files. -The files in this folder are suggested fonts, provided as a convenience. - -Fonts are rasterized in a single texture at the time of calling either of io.Fonts->GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build(). -Also read dear imgui FAQ in imgui.cpp! - -If you have other loading/merging/adding fonts, you can post on the Dear ImGui "Getting Started" forum: - https://discourse.dearimgui.org/c/getting-started - - ---------------------------------------- - INDEX: ---------------------------------------- - -- Readme First / FAQ -- Using Icons -- Fonts Loading Instructions -- FreeType rasterizer, Small font sizes -- Building Custom Glyph Ranges -- Embedding Fonts in Source Code -- Credits/Licences for fonts included in this folder -- Fonts Links - - ---------------------------------------- - README FIRST / FAQ ---------------------------------------- - -- You can use the style editor ImGui::ShowStyleEditor() in the "Fonts" section to browse your fonts - and understand what's going on if you have an issue. -- Make sure your font ranges data are persistent (available during the call to GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build(). -- Use C++11 u8"my text" syntax to encode literal strings as UTF-8. e.g.: - u8"hello" - u8"ã“ã‚“ã«ã¡ã¯" // this will be encoded as UTF-8 -- If you want to include a backslash \ character in your string literal, you need to double them e.g. "folder\\filename". -- Please use the Discourse forum (https://discourse.dearimgui.org) and not the Github issue tracker for basic font loading questions. - - ---------------------------------------- - USING ICONS ---------------------------------------- - -Using an icon font (such as FontAwesome: http://fontawesome.io or OpenFontIcons. https://github.com/traverseda/OpenFontIcons) -is an easy and practical way to use icons in your Dear ImGui application. -A common pattern is to merge the icon font within your main font, so you can embed icons directly from your strings without -having to change fonts back and forth. - -To refer to the icon UTF-8 codepoints from your C++ code, you may use those headers files created by Juliette Foucaut: - https://github.com/juliettef/IconFontCppHeaders - -The C++11 version of those files uses the u8"" utf-8 encoding syntax + \u - #define ICON_FA_SEARCH u8"\uf002" -The pre-C++11 version has the values directly encoded as utf-8: - #define ICON_FA_SEARCH "\xEF\x80\x82" - -Example Setup: - - // Merge icons into default tool font - #include "IconsFontAwesome.h" - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->AddFontDefault(); - - ImFontConfig config; - config.MergeMode = true; - config.GlyphMinAdvanceX = 13.0f; // Use if you want to make the icon monospaced - static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 }; - io.Fonts->AddFontFromFileTTF("fonts/fontawesome-webfont.ttf", 13.0f, &config, icon_ranges); - -Example Usage: - - // Usage, e.g. - ImGui::Text("%s among %d items", ICON_FA_SEARCH, count); - ImGui::Button(ICON_FA_SEARCH " Search"); - // C string _literals_ can be concatenated at compilation time, e.g. "hello" " world" - // ICON_FA_SEARCH is defined as a string literal so this is the same as "A" "B" becoming "AB" - -See Links below for other icons fonts and related tools. - - ---------------------------------------- - FONTS LOADING INSTRUCTIONS ---------------------------------------- - -Load default font: - - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->AddFontDefault(); - -Load .TTF/.OTF file with: - - ImGuiIO& io = ImGui::GetIO(); - ImFont* font1 = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels); - ImFont* font2 = io.Fonts->AddFontFromFileTTF("anotherfont.otf", size_pixels); - - // Select font at runtime - ImGui::Text("Hello"); // use the default font (which is the first loaded font) - ImGui::PushFont(font2); - ImGui::Text("Hello with another font"); - ImGui::PopFont(); - -For advanced options create a ImFontConfig structure and pass it to the AddFont function (it will be copied internally): - - ImFontConfig config; - config.OversampleH = 2; - config.OversampleV = 1; - config.GlyphExtraSpacing.x = 1.0f; - ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config); - -Read about oversampling here: - https://github.com/nothings/stb/blob/master/tests/oversample - -If you have very large number of glyphs or multiple fonts, the texture may become too big for your graphics API. -The typical result of failing to upload a texture is if every glyphs appears as white rectangles. -In particular, using a large range such as GetGlyphRangesChineseSimplifiedCommon() is not recommended unless you -set OversampleH/OversampleV to 1 and use a small font size. -Mind the fact that some graphics drivers have texture size limitation. -If you are building a PC application, mind the fact that your users may use hardware with lower limitations than yours. -Some solutions: - - - 1) Reduce glyphs ranges by calculating them from source localization data. - You can use ImFontGlyphRangesBuilder for this purpose, this will be the biggest win! - - 2) You may reduce oversampling, e.g. config.OversampleH = config.OversampleV = 1, this will largely reduce your texture size. - - 3) Set io.Fonts.TexDesiredWidth to specify a texture width to minimize texture height (see comment in ImFontAtlas::Build function). - - 4) Set io.Fonts.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; to disable rounding the texture height to the next power of two. - -Combine two fonts into one: - - // Load a first font - ImFont* font = io.Fonts->AddFontDefault(); - - // Add character ranges and merge into the previous font - // The ranges array is not copied by the AddFont* functions and is used lazily - // so ensure it is available at the time of building or calling GetTexDataAsRGBA32(). - static const ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 }; // Will not be copied by AddFont* so keep in scope. - ImFontConfig config; - config.MergeMode = true; - io.Fonts->AddFontFromFileTTF("DroidSans.ttf", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese()); - io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 18.0f, &config, icons_ranges); - io.Fonts->Build(); - -Add a fourth parameter to bake specific font ranges only: - - // Basic Latin, Extended Latin - io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesDefault()); - - // Default + Selection of 2500 Ideographs used by Simplified Chinese - io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesChineseSimplifiedCommon()); - - // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs - io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesJapanese()); - -See "BUILDING CUSTOM GLYPH RANGES" section to create your own ranges. -Offset font vertically by altering the io.Font->DisplayOffset value: - - ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels); - font->DisplayOffset.y = 1; // Render 1 pixel down - - ---------------------------------------- - FREETYPE RASTERIZER, SMALL FONT SIZES ---------------------------------------- - -Dear ImGui uses imstb_truetype.h to rasterize fonts (with optional oversampling). -This technique and its implementation are not ideal for fonts rendered at _small sizes_, which may appear a -little blurry or hard to read. - -There is an implementation of the ImFontAtlas builder using FreeType that you can use in the misc/freetype/ folder. - -FreeType supports auto-hinting which tends to improve the readability of small fonts. -Note that this code currently creates textures that are unoptimally too large (could be fixed with some work). -Also note that correct sRGB space blending will have an important effect on your font rendering quality. - - ---------------------------------------- - BUILDING CUSTOM GLYPH RANGES ---------------------------------------- - -You can use the ImFontGlyphRangesBuilder helper to create glyph ranges based on text input. -For example: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs. - - ImVector<ImWchar> ranges; - ImFontGlyphRangesBuilder builder; - builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters) - builder.AddChar(0x7262); // Add a specific character - builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges - builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted) - - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data); - io.Fonts->Build(); // Build the atlas while 'ranges' is still in scope and not deleted. - - ---------------------------------------- - EMBEDDING FONTS IN SOURCE CODE ---------------------------------------- - -Compile and use 'binary_to_compressed_c.cpp' to create a compressed C style array that you can embed in source code. -See the documentation in binary_to_compressed_c.cpp for instruction on how to use the tool. -You may find a precompiled version binary_to_compressed_c.exe for Windows instead of demo binaries package (see README). -The tool can optionally output Base85 encoding to reduce the size of _source code_ but the read-only arrays in the -actual binary will be about 20% bigger. - -Then load the font with: - ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...); -or: - ImFont* font = io.Fonts->AddFontFromMemoryCompressedBase85TTF(compressed_data_base85, size_pixels, ...); - - ---------------------------------------- - CREDITS/LICENSES FOR FONTS INCLUDED IN THIS FOLDER ---------------------------------------- - -Roboto-Medium.ttf - - Apache License 2.0 - by Christian Robertson - https://fonts.google.com/specimen/Roboto - -Cousine-Regular.ttf - - by Steve Matteson - Digitized data copyright (c) 2010 Google Corporation. - Licensed under the SIL Open Font License, Version 1.1 - https://fonts.google.com/specimen/Cousine - -DroidSans.ttf - - Copyright (c) Steve Matteson - Apache License, version 2.0 - https://www.fontsquirrel.com/fonts/droid-sans - -ProggyClean.ttf - - Copyright (c) 2004, 2005 Tristan Grimmer - MIT License - recommended loading setting in ImGui: Size = 13.0, DisplayOffset.Y = +1 - http://www.proggyfonts.net/ - -ProggyTiny.ttf - Copyright (c) 2004, 2005 Tristan Grimmer - MIT License - recommended loading setting in ImGui: Size = 10.0, DisplayOffset.Y = +1 - http://www.proggyfonts.net/ - -Karla-Regular.ttf - Copyright (c) 2012, Jonathan Pinhorn - SIL OPEN FONT LICENSE Version 1.1 - - ---------------------------------------- - FONTS LINKS ---------------------------------------- - -ICON FONTS - - C/C++ header for icon fonts (#define with code points to use in source code string literals) - https://github.com/juliettef/IconFontCppHeaders - - FontAwesome - https://fortawesome.github.io/Font-Awesome - - OpenFontIcons - https://github.com/traverseda/OpenFontIcons - - Google Icon Fonts - https://design.google.com/icons/ - - Kenney Icon Font (Game Controller Icons) - https://github.com/nicodinh/kenney-icon-font - - IcoMoon - Custom Icon font builder - https://icomoon.io/app - -REGULAR FONTS - - Google Noto Fonts (worldwide languages) - https://www.google.com/get/noto/ - - Open Sans Fonts - https://fonts.google.com/specimen/Open+Sans - - (Japanese) M+ fonts by Coji Morishita are free - http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html - -MONOSPACE FONTS - - (Pixel Perfect) Proggy Fonts, by Tristan Grimmer - http://www.proggyfonts.net or http://upperbounds.net - - (Pixel Perfect) Sweet16, Sweet16 Mono, by Martin Sedlak (Latin + Supplemental + Extended A) - https://github.com/kmar/Sweet16Font - Also include .inl file to use directly in dear imgui. - - Google Noto Mono Fonts - https://www.google.com/get/noto/ - - Typefaces for source code beautification - https://github.com/chrissimpkins/codeface - - Programmation fonts - http://s9w.github.io/font_compare/ - - Inconsolata - http://www.levien.com/type/myfonts/inconsolata.html - - Adobe Source Code Pro: Monospaced font family for user interface and coding environments - https://github.com/adobe-fonts/source-code-pro - - Monospace/Fixed Width Programmer's Fonts - http://www.lowing.org/fonts/ - - - Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing). diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/README.md b/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/README.md deleted file mode 100644 index 397adec723..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# imgui_freetype - -Build font atlases using FreeType instead of stb_truetype (the default imgui's font rasterizer). -<br>by @vuhdo, @mikesart, @ocornut. - -### Usage - -1. Get latest FreeType binaries or build yourself (under Windows you may use vcpkg with `vcpkg install freetype`). -2. Add imgui_freetype.h/cpp alongside your imgui sources. -3. Include imgui_freetype.h after imgui.h. -4. Call `ImGuiFreeType::BuildFontAtlas()` *BEFORE* calling `ImFontAtlas::GetTexDataAsRGBA32()` or `ImFontAtlas::Build()` (so normal Build() won't be called): - -```cpp -// See ImGuiFreeType::RasterizationFlags -unsigned int flags = ImGuiFreeType::NoHinting; -ImGuiFreeType::BuildFontAtlas(io.Fonts, flags); -io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); -``` - -### Gamma Correct Blending - -FreeType assumes blending in linear space rather than gamma space. -See FreeType note for [FT_Render_Glyph](https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Glyph). -For correct results you need to be using sRGB and convert to linear space in the pixel shader output. -The default imgui styles will be impacted by this change (alpha values will need tweaking). - -### Test code Usage -```cpp -#include "misc/freetype/imgui_freetype.h" -#include "misc/freetype/imgui_freetype.cpp" - -// Load various small fonts -ImGuiIO& io = ImGui::GetIO(); -io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 13.0f); -io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 13.0f); -io.Fonts->AddFontDefault(); - -FreeTypeTest freetype_test; - -// Main Loop -while (true) -{ - if (freetype_test.UpdateRebuild()) - { - // REUPLOAD FONT TEXTURE TO GPU - ImGui_ImplXXX_DestroyDeviceObjects(); - ImGui_ImplXXX_CreateDeviceObjects(); - } - ImGui::NewFrame(); - freetype_test.ShowFreetypeOptionsWindow(); - ... -} -``` - -### Test code -```cpp -#include "misc/freetype/imgui_freetype.h" -#include "misc/freetype/imgui_freetype.cpp" - -struct FreeTypeTest -{ - enum FontBuildMode - { - FontBuildMode_FreeType, - FontBuildMode_Stb - }; - - FontBuildMode BuildMode; - bool WantRebuild; - float FontsMultiply; - int FontsPadding; - unsigned int FontsFlags; - - FreeTypeTest() - { - BuildMode = FontBuildMode_FreeType; - WantRebuild = true; - FontsMultiply = 1.0f; - FontsPadding = 1; - FontsFlags = 0; - } - - // Call _BEFORE_ NewFrame() - bool UpdateRebuild() - { - if (!WantRebuild) - return false; - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->TexGlyphPadding = FontsPadding; - for (int n = 0; n < io.Fonts->ConfigData.Size; n++) - { - ImFontConfig* font_config = (ImFontConfig*)&io.Fonts->ConfigData[n]; - font_config->RasterizerMultiply = FontsMultiply; - font_config->RasterizerFlags = (BuildMode == FontBuildMode_FreeType) ? FontsFlags : 0x00; - } - if (BuildMode == FontBuildMode_FreeType) - ImGuiFreeType::BuildFontAtlas(io.Fonts, FontsFlags); - else if (BuildMode == FontBuildMode_Stb) - io.Fonts->Build(); - WantRebuild = false; - return true; - } - - // Call to draw interface - void ShowFreetypeOptionsWindow() - { - ImGui::Begin("FreeType Options"); - ImGui::ShowFontSelector("Fonts"); - WantRebuild |= ImGui::RadioButton("FreeType", (int*)&BuildMode, FontBuildMode_FreeType); - ImGui::SameLine(); - WantRebuild |= ImGui::RadioButton("Stb (Default)", (int*)&BuildMode, FontBuildMode_Stb); - WantRebuild |= ImGui::DragFloat("Multiply", &FontsMultiply, 0.001f, 0.0f, 2.0f); - WantRebuild |= ImGui::DragInt("Padding", &FontsPadding, 0.1f, 0, 16); - if (BuildMode == FontBuildMode_FreeType) - { - WantRebuild |= ImGui::CheckboxFlags("NoHinting", &FontsFlags, ImGuiFreeType::NoHinting); - WantRebuild |= ImGui::CheckboxFlags("NoAutoHint", &FontsFlags, ImGuiFreeType::NoAutoHint); - WantRebuild |= ImGui::CheckboxFlags("ForceAutoHint", &FontsFlags, ImGuiFreeType::ForceAutoHint); - WantRebuild |= ImGui::CheckboxFlags("LightHinting", &FontsFlags, ImGuiFreeType::LightHinting); - WantRebuild |= ImGui::CheckboxFlags("MonoHinting", &FontsFlags, ImGuiFreeType::MonoHinting); - WantRebuild |= ImGui::CheckboxFlags("Bold", &FontsFlags, ImGuiFreeType::Bold); - WantRebuild |= ImGui::CheckboxFlags("Oblique", &FontsFlags, ImGuiFreeType::Oblique); - } - ImGui::End(); - } -}; -``` - -### Known issues -- `cfg.OversampleH`, `OversampleV` are ignored (but perhaps not so necessary with this rasterizer). - diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.h b/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.h deleted file mode 100644 index b4b0fd66e5..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.h +++ /dev/null @@ -1,35 +0,0 @@ -// Wrapper to use FreeType (instead of stb_truetype) for Dear ImGui -// Get latest version at https://github.com/ocornut/imgui/tree/master/misc/freetype -// Original code by @Vuhdo (Aleksei Skriabin), maintained by @ocornut - -#pragma once - -#include "imgui.h" // IMGUI_API, ImFontAtlas - -namespace ImGuiFreeType -{ - // Hinting greatly impacts visuals (and glyph sizes). - // When disabled, FreeType generates blurrier glyphs, more or less matches the stb's output. - // The Default hinting mode usually looks good, but may distort glyphs in an unusual way. - // The Light hinting mode generates fuzzier glyphs but better matches Microsoft's rasterizer. - - // You can set those flags on a per font basis in ImFontConfig::RasterizerFlags. - // Use the 'extra_flags' parameter of BuildFontAtlas() to force a flag on all your fonts. - enum RasterizerFlags - { - // By default, hinting is enabled and the font's native hinter is preferred over the auto-hinter. - NoHinting = 1 << 0, // Disable hinting. This generally generates 'blurrier' bitmap glyphs when the glyph are rendered in any of the anti-aliased modes. - NoAutoHint = 1 << 1, // Disable auto-hinter. - ForceAutoHint = 1 << 2, // Indicates that the auto-hinter is preferred over the font's native hinter. - LightHinting = 1 << 3, // A lighter hinting algorithm for gray-level modes. Many generated glyphs are fuzzier but better resemble their original shape. This is achieved by snapping glyphs to the pixel grid only vertically (Y-axis), as is done by Microsoft's ClearType and Adobe's proprietary font renderer. This preserves inter-glyph spacing in horizontal text. - MonoHinting = 1 << 4, // Strong hinting algorithm that should only be used for monochrome output. - Bold = 1 << 5, // Styling: Should we artificially embolden the font? - Oblique = 1 << 6 // Styling: Should we slant the font, emulating italic style? - }; - - IMGUI_API bool BuildFontAtlas(ImFontAtlas* atlas, unsigned int extra_flags = 0); - - // By default ImGuiFreeType will use IM_ALLOC()/IM_FREE(). - // However, as FreeType does lots of allocations we provide a way for the user to redirect it to a separate memory heap if desired: - IMGUI_API void SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data = NULL); -} diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/README.txt b/Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/README.txt deleted file mode 100644 index 1219db4534..0000000000 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/README.txt +++ /dev/null @@ -1,4 +0,0 @@ - -Natvis file to describe dear imgui types in the Visual Studio debugger. -With this, types like ImVector<> will be displayed nicely in the debugger. -You can include this file a Visual Studio project file, or install it in Visual Studio folder. diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/.editorconfig b/Gems/ImGui/External/ImGui/v1.82/imgui/.editorconfig new file mode 100644 index 0000000000..c6dc600aa6 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/.editorconfig @@ -0,0 +1,24 @@ +# See http://editorconfig.org to read about the EditorConfig format. +# - In theory automatically supported by VS2017+ and most common IDE or text editors. +# - In practice VS2019 stills gets trailing whitespaces wrong :( +# - Suggest install to trim whitespaces: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespaceVisualizer +# - Alternative for older VS2010 to VS2015: https://marketplace.visualstudio.com/items?itemName=EditorConfigTeam.EditorConfig + +# top-most EditorConfig file +root = true + +# Default settings: +# Use 4 spaces as indentation +[*] +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[imstb_*] +indent_size = 3 +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab +indent_size = 4 diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/LICENSE.txt b/Gems/ImGui/External/ImGui/v1.82/imgui/LICENSE.txt similarity index 96% rename from Gems/ImGui/External/ImGui/v1.70/imgui/LICENSE.txt rename to Gems/ImGui/External/ImGui/v1.82/imgui/LICENSE.txt index 3b439aa490..780533dcb2 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/LICENSE.txt +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2019 Omar Cornut +Copyright (c) 2014-2021 Omar Cornut Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/imconfig.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imconfig.h new file mode 100644 index 0000000000..79e8c9e450 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imconfig.h @@ -0,0 +1,128 @@ +//----------------------------------------------------------------------------- +// COMPILE-TIME OPTIONS FOR DEAR IMGUI +// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. +// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. +//----------------------------------------------------------------------------- +// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it) +// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template. +//----------------------------------------------------------------------------- +// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp +// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. +// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. +// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. +//----------------------------------------------------------------------------- + +#pragma once + +// Include Platform Def to get mutliplatform AZ_DLL_IMPORT and AZ_DLL_EXPORT to use below +#include <AzCore/PlatformDef.h> + +//---- Define assertion handler. Defaults to calling assert(). +// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. +//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) +//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts + +//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows +// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() +// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. +//#define IMGUI_API __declspec( dllexport ) +//#define IMGUI_API __declspec( dllimport ) +#ifdef IMGUI_API_IMPORT +# define IMGUI_API AZ_DLL_IMPORT +#else +# define IMGUI_API AZ_DLL_EXPORT +#endif // IMGUI_API_IMPORT + +//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. +//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +//---- Disable all of Dear ImGui or don't implement standard windows. +// It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp. +//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. +//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended. +//#define IMGUI_DISABLE_METRICS_WINDOW // Disable metrics/debugger window: ShowMetricsWindow() will be empty. + +//---- Don't implement some functions to reduce linkage requirements. +//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) +//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] Don't implement default IME handler. Won't use and link with ImmGetContext/ImmSetCompositionWindow. (imm32.lib/.a) +//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). +//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). +//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) +//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. +//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. +//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). + +//---- Include imgui_user.h at the end of imgui.h as a convenience +//#define IMGUI_INCLUDE_IMGUI_USER_H + +//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) +//#define IMGUI_USE_BGRA_PACKED_COLOR + +//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) +//#define IMGUI_USE_WCHAR32 + +//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version +// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. +//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" +//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" +//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION + +//---- Use stb_printf's faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) +// Requires 'stb_sprintf.h' to be available in the include path. Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by STB sprintf. +// #define IMGUI_USE_STB_SPRINTF + +//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) +// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). +// On Windows you may use vcpkg with 'vcpkg install freetype' + 'vcpkg integrate install'. +//#define IMGUI_ENABLE_FREETYPE + +//---- Use stb_truetype to build and rasterize the font atlas (default) +// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. +//#define IMGUI_ENABLE_STB_TRUETYPE + +//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. +// This will be inlined as part of ImVec2 and ImVec4 class declarations. +/* +#define IM_VEC2_CLASS_EXTRA \ + ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \ + operator MyVec2() const { return MyVec2(x,y); } + +#define IM_VEC4_CLASS_EXTRA \ + ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \ + operator MyVec4() const { return MyVec4(x,y,z,w); } +*/ + +//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices. +// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). +// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. +// Read about ImGuiBackendFlags_RendererHasVtxOffset for details. +//#define ImDrawIdx unsigned int + +//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) +//struct ImDrawList; +//struct ImDrawCmd; +//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); +//#define ImDrawCallback MyImDrawCallback + +//---- Debug Tools: Macro to break in Debugger +// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) +//#define IM_DEBUG_BREAK IM_ASSERT(0) +//#define IM_DEBUG_BREAK __debugbreak() + +//---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(), +// (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.) +// This adds a small runtime cost which is why it is not enabled by default. +//#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX + +//---- Debug Tools: Enable slower asserts +//#define IMGUI_DEBUG_PARANOID + +//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. +/* +namespace ImGui +{ + void MyFunction(const char* name, const MyMatrix44& v); +} +*/ diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui.cpp similarity index 55% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui.cpp index 14dcb4b131..2555d1a6af 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui.cpp @@ -1,20 +1,27 @@ -// Modifications copyright Amazon.com, Inc. or its affiliates. - -// dear imgui, v1.70 +// dear imgui, v1.82 // (main code and documentation) -// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. -// Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. -// Get latest version at https://github.com/ocornut/imgui -// Releases change-log at https://github.com/ocornut/imgui/releases -// Technical Support for Getting Started https://discourse.dearimgui.org/c/getting-started -// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/1269 +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/3488 (please post your screenshots/video there!) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Wiki https://github.com/ocornut/imgui/wiki +// - Issues & support https://github.com/ocornut/imgui/issues +// - Discussions https://github.com/ocornut/imgui/discussions // Developed by Omar Cornut and every direct or indirect contributors to the GitHub. // See LICENSE.txt for copyright and licensing details (standard MIT License). -// This library is free but I need your support to sustain development and maintenance. -// Businesses: you can support continued maintenance and development via support contracts or sponsoring, see docs/README. -// Individuals: you can support continued maintenance and development via donations or Patreon https://www.patreon.com/imgui. +// This library is free but needs your support to sustain development and maintenance. +// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.org". +// Individuals: you can support continued development via donations. See docs/README or web page. // It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. // Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without @@ -30,59 +37,48 @@ DOCUMENTATION - MISSION STATEMENT - END-USER GUIDE -- PROGRAMMER GUIDE (read me!) - - Read first. - - How to update to a newer version of Dear ImGui. - - Getting started with integrating Dear ImGui in your code/engine. - - This is how a simple application may look like (2 variations). - - This is how a simple rendering function may look like. - - Using gamepad/keyboard navigation controls. +- PROGRAMMER GUIDE + - READ FIRST + - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + - HOW A SIMPLE APPLICATION MAY LOOK LIKE + - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE + - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS - API BREAKING CHANGES (read me when you update!) -- FREQUENTLY ASKED QUESTIONS (FAQ), TIPS - - Where is the documentation? - - Which version should I get? - - Who uses Dear ImGui? - - Why the odd dual naming, "Dear ImGui" vs "ImGui"? - - How can I tell whether to dispatch mouse/keyboard to imgui or to my application? - - How can I display an image? What is ImTextureID, how does it works? - - Why are multiple widgets reacting when I interact with a single one? How can I have - multiple widgets with the same label or with an empty label? A primer on labels and the ID Stack... - - How can I use my own math types instead of ImVec2/ImVec4? - - How can I load a different font than the default? - - How can I easily use icons in my application? - - How can I load multiple fonts? - - How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic? - - How can I interact with standard C++ types (such as std::string and std::vector)? - - How can I use the drawing facilities without an ImGui window? (using ImDrawList API) - - How can I use Dear ImGui on a platform that doesn't have a mouse or a keyboard? (input share, remoting, gamepad) - - I integrated Dear ImGui in my engine and the text or lines are blurry.. - - I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around.. - - How can I help? +- FREQUENTLY ASKED QUESTIONS (FAQ) + - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer) CODE (search for "[SECTION]" in the code to find them) +// [SECTION] INCLUDES // [SECTION] FORWARD DECLARATIONS // [SECTION] CONTEXT AND MEMORY ALLOCATORS -// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) -// [SECTION] MISC HELPERS/UTILITIES (Maths, String, Format, Hash, File functions) +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +// [SECTION] MISC HELPERS/UTILITIES (File functions) // [SECTION] MISC HELPERS/UTILITIES (ImText* functions) // [SECTION] MISC HELPERS/UTILITIES (Color functions) // [SECTION] ImGuiStorage // [SECTION] ImGuiTextFilter // [SECTION] ImGuiTextBuffer // [SECTION] ImGuiListClipper +// [SECTION] STYLING // [SECTION] RENDER HELPERS // [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +// [SECTION] ERROR CHECKING +// [SECTION] LAYOUT +// [SECTION] SCROLLING // [SECTION] TOOLTIPS // [SECTION] POPUPS // [SECTION] KEYBOARD/GAMEPAD NAVIGATION -// [SECTION] COLUMNS // [SECTION] DRAG AND DROP // [SECTION] LOGGING/CAPTURING // [SECTION] SETTINGS +// [SECTION] VIEWPORTS // [SECTION] PLATFORM DEPENDENT HELPERS -// [SECTION] METRICS/DEBUG WINDOW +// [SECTION] METRICS/DEBUGGER WINDOW */ @@ -98,14 +94,13 @@ CODE - Easy to use to create code-driven and data-driven tools. - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools. - Easy to hack and improve. - - Minimize screen real-estate usage. - Minimize setup and maintenance. - Minimize state storage on user side. - Portable, minimize dependencies, run on target (consoles, phones, etc.). - - Efficient runtime and memory consumption (NB- we do allocate when "growing" content e.g. creating a window,. - opening a tree node for the first time, etc. but a typical frame should not allocate anything). + - Efficient runtime and memory consumption. + + Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: - Designed for developers and content-creators, not the typical end-user! Some of the weaknesses includes: - Doesn't look fancy, doesn't animate. - Limited layout features, intricate layouts are typically crafted in code. @@ -131,21 +126,21 @@ CODE - You can apply arithmetic operators +,*,/ on numerical values. Use +- to subtract (because - would set a negative value!) - Controls are automatically adjusted for OSX to match standard OSX text editing operations. - General Keyboard controls: enable with ImGuiConfigFlags_NavEnableKeyboard. - - General Gamepad controls: enable with ImGuiConfigFlags_NavEnableGamepad. See suggested mappings in imgui.h ImGuiNavInput_ + download PNG/PSD at http://goo.gl/9LgVZW + - General Gamepad controls: enable with ImGuiConfigFlags_NavEnableGamepad. See suggested mappings in imgui.h ImGuiNavInput_ + download PNG/PSD at http://dearimgui.org/controls_sheets PROGRAMMER GUIDE ================ - READ FIRST: - - - Read the FAQ below this section! + READ FIRST + ---------- + - Remember to read the FAQ (https://www.dearimgui.org/faq) - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, less bugs. - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). - You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links docs/README.md. + You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in the FAQ. - Dear ImGui is a "single pass" rasterizing implementation of the IMGUI paradigm, aimed at ease of use and high-performances. For every application frame your UI code will be called only once. This is in contrast to e.g. Unity's own implementation of an IMGUI, where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. @@ -159,31 +154,39 @@ CODE However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI: + HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + ---------------------------------------------- - Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h) - - Or maintain your own branch where you have imconfig.h modified. + - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over master. + - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. - Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes. If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it. Please report any issue to the GitHub page! - - Try to keep your copy of dear imgui reasonably up to date. + - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. + - Try to keep your copy of Dear ImGui reasonably up to date. - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE: + GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + --------------------------------------------------------------- - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. - - Add the Dear ImGui source files to your projects or using your preferred build system. - It is recommended you build and statically link the .cpp files as part of your project and not as shared library (DLL). - - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating imgui types with your own maths types. + - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. + - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. + It is recommended you build and statically link the .cpp files as part of your project and NOT as shared library (DLL). + - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types. - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them. - Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide. Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" - phases of your own application. All rendering informatioe are stored into command-lists that you will retrieve after calling ImGui::Render(). - - Refer to the bindings and demo applications in the examples/ folder for instruction on how to setup your code. + phases of your own application. All rendering information are stored into command-lists that you will retrieve after calling ImGui::Render(). + - Refer to the backends and demo applications in the examples/ folder for instruction on how to setup your code. - If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder. - HOW A SIMPLE APPLICATION MAY LOOK LIKE: - EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder). + + HOW A SIMPLE APPLICATION MAY LOOK LIKE + -------------------------------------- + EXHIBIT 1: USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder). + The sub-folders in examples/ contains examples applications following this structure. // Application init: create a dear imgui context, setup some options, load fonts ImGui::CreateContext(); @@ -192,7 +195,7 @@ CODE // TODO: Fill optional fields of the io structure later. // TODO: Load TTF/OTF fonts if you don't want to use the default font. - // Initialize helper Platform and Renderer bindings (here we are using imgui_impl_win32 and imgui_impl_dx11) + // Initialize helper Platform and Renderer backends (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp) ImGui_ImplWin32_Init(hwnd); ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); @@ -218,8 +221,7 @@ CODE ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); - HOW A SIMPLE APPLICATION MAY LOOK LIKE: - EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE. + EXHIBIT 2: IMPLEMENTING CUSTOM BACKEND / CUSTOM ENGINE // Application init: create a dear imgui context, setup some options, load fonts ImGui::CreateContext(); @@ -236,15 +238,15 @@ CODE // At this point you've got the texture data and you need to upload that your your graphic system: // After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'. - // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ below for details about ImTextureID. + // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID. MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32) - io.Fonts->TexID = (void*)texture; + io.Fonts->SetTexID((void*)texture); // Application main loop while (true) { // Setup low-level inputs, e.g. on Win32: calling GetKeyboardState(), or write to those fields from your Windows message handlers, etc. - // (In the examples/ app this is usually done within the ImGui_ImplXXX_NewFrame() function from one of the demo Platform bindings) + // (In the examples/ app this is usually done within the ImGui_ImplXXX_NewFrame() function from one of the demo Platform Backends) io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds) io.DisplaySize.x = 1920.0f; // set the current display width io.DisplaySize.y = 1280.0f; // set the current display height here @@ -253,16 +255,16 @@ CODE io.MouseDown[1] = my_mouse_buttons[1]; // Call NewFrame(), after this point you can use ImGui::* functions anytime - // (So you want to try calling NewFrame() as early as you can in your mainloop to be able to use imgui everywhere) + // (So you want to try calling NewFrame() as early as you can in your mainloop to be able to use Dear ImGui everywhere) ImGui::NewFrame(); // Most of your application code here ImGui::Text("Hello, world!"); - MyGameUpdate(); // may use any ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); - MyGameRender(); // may use any ImGui functions as well! + MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); + MyGameRender(); // may use any Dear ImGui functions as well! - // Render imgui, swap buffers - // (You want to try calling EndFrame/Render as late as you can, to be able to use imgui in your own game rendering code) + // Render dear imgui, swap buffers + // (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code) ImGui::EndFrame(); ImGui::Render(); ImDrawData* draw_data = ImGui::GetDrawData(); @@ -273,7 +275,14 @@ CODE // Shutdown ImGui::DestroyContext(); - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE: + To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest your application, + you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + Please read the FAQ and example applications for details about this! + + + HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE + --------------------------------------------- + The backends in impl_impl_XXX.cpp files contains many working implementations of a rendering function. void void MyImGuiRenderFunction(ImDrawData* draw_data) { @@ -284,8 +293,8 @@ CODE for (int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; - const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by ImGui - const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by ImGui + const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; @@ -296,22 +305,23 @@ CODE else { // The texture for the draw call is specified by pcmd->TextureId. - // The vast majority of draw calls will use the imgui texture atlas, which value you have set yourself during initialization. + // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization. MyEngineBindTexture((MyTexture*)pcmd->TextureId); // We are using scissoring to clip some objects. All low-level graphics API should supports it. // - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches // (some elements visible outside their bounds) but you can fix that once everything else works! - // - Clipping coordinates are provided in imgui coordinates space (from draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize) - // In a single viewport application, draw_data->DisplayPos will always be (0,0) and draw_data->DisplaySize will always be == io.DisplaySize. - // However, in the interest of supporting multi-viewport applications in the future (see 'viewport' branch on github), - // always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space. + // - Clipping coordinates are provided in imgui coordinates space: + // - For a given viewport, draw_data->DisplayPos == viewport->Pos and draw_data->DisplaySize == viewport->Size + // - In a single viewport application, draw_data->DisplayPos == (0,0) and draw_data->DisplaySize == io.DisplaySize, but always use GetMainViewport()->Pos/Size instead of hardcoding those values. + // - In the interest of supporting multi-viewport applications (see 'docking' branch on github), + // always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space. // - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min) ImVec2 pos = draw_data->DisplayPos; MyEngineScissor((int)(pcmd->ClipRect.x - pos.x), (int)(pcmd->ClipRect.y - pos.y), (int)(pcmd->ClipRect.z - pos.x), (int)(pcmd->ClipRect.w - pos.y)); // Render 'pcmd->ElemCount/3' indexed triangles. - // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits in imconfig.h if your engine doesn't support 16-bits indices. + // By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices. MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer, vtx_buffer); } idx_buffer += pcmd->ElemCount; @@ -319,29 +329,13 @@ CODE } } - - The examples/ folders contains many actual implementation of the pseudo-codes above. - - When calling NewFrame(), the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags are updated. - They tell you if Dear ImGui intends to use your inputs. When a flag is set you want to hide the corresponding inputs - from the rest of your application. In every cases you need to pass on the inputs to imgui. Refer to the FAQ for more information. - - Please read the FAQ below!. Amusingly, it is called a FAQ because people frequently run into the same issues! USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS - + ------------------------------------------ - The gamepad/keyboard navigation is fairly functional and keeps being improved. - - Gamepad support is particularly useful to use dear imgui on a console system without a mouse! + - Gamepad support is particularly useful to use Dear ImGui on a console system without a mouse! - You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787 - The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. - - Gamepad: - - Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. - - Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + fill the io.NavInputs[] fields before calling NewFrame(). - Note that io.NavInputs[] is cleared by EndFrame(). - - See 'enum ImGuiNavInput_' in imgui.h for a description of inputs. For each entry of io.NavInputs[], set the following values: - 0.0f= not held. 1.0f= fully held. Pass intermediate 0.0f..1.0f values for analog triggers/sticks. - - We uses a simple >0.0f test for activation testing, and won't attempt to test for a dead-zone. - Your code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.). - - You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://goo.gl/9LgVZW. - - If you need to share inputs between your game and the imgui parts, the easiest approach is to go all-or-nothing, with a buttons combo - to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved. - Keyboard: - Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. NewFrame() will automatically fill io.NavInputs[] based on your io.KeysDown[] + io.KeyMap[] arrays. @@ -351,12 +345,23 @@ CODE - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used). - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions. Please reach out if you think the game vs navigation input sharing could be improved. + - Gamepad: + - Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. + - Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + fill the io.NavInputs[] fields before calling NewFrame(). + Note that io.NavInputs[] is cleared by EndFrame(). + - See 'enum ImGuiNavInput_' in imgui.h for a description of inputs. For each entry of io.NavInputs[], set the following values: + 0.0f= not held. 1.0f= fully held. Pass intermediate 0.0f..1.0f values for analog triggers/sticks. + - We uses a simple >0.0f test for activation testing, and won't attempt to test for a dead-zone. + Your code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.). + - You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://dearimgui.org/controls_sheets + - If you need to share inputs between your game and the imgui parts, the easiest approach is to go all-or-nothing, with a buttons combo + to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved. - Mouse: - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + uSynergy.c (on your console/tablet/phone app) to share your PC mouse/keyboard. - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiConfigFlags_NavEnableSetMousePos flag. Enabling ImGuiConfigFlags_NavEnableSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs dear imgui to move your mouse cursor along with navigation movements. When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved. - When that happens your back-end NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the binding in examples/ do that. + When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that. (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, imgui will misbehave as it will see your mouse as moving back and forth!) (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want to set a boolean to ignore your other external mouse positions until the external source is moved again.) @@ -370,14 +375,115 @@ CODE When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. You can read releases logs https://github.com/ocornut/imgui/releases for more details. + - 2021/03/12 (1.82) - upgraded ImDrawList::AddRect(), AddRectFilled(), PathRect() to use ImDrawFlags instead of ImDrawCornersFlags. + - ImDrawCornerFlags_TopLeft -> use ImDrawFlags_RoundCornersTopLeft + - ImDrawCornerFlags_BotRight -> use ImDrawFlags_RoundCornersBottomRight + - ImDrawCornerFlags_None -> use ImDrawFlags_RoundCornersNone etc. + flags now sanely defaults to 0 instead of 0x0F, consistent with all other flags in the API. + breaking: the default with rounding > 0.0f is now "round all corners" vs old implicit "round no corners": + - rounding == 0.0f + flags == 0 --> meant no rounding --> unchanged (common use) + - rounding > 0.0f + flags != 0 --> meant rounding --> unchanged (common use) + - rounding == 0.0f + flags != 0 --> meant no rounding --> unchanged (unlikely use) + - rounding > 0.0f + flags == 0 --> meant no rounding --> BREAKING (unlikely use): will now round all corners --> use ImDrawFlags_RoundCornersNone or rounding == 0.0f. + this ONLY matters for hard coded use of 0 + rounding > 0.0f. Use of named ImDrawFlags_RoundCornersNone (new) or ImDrawCornerFlags_None (old) are ok. + the old ImDrawCornersFlags used awkward default values of ~0 or 0xF (4 lower bits set) to signify "round all corners" and we sometimes encouraged using them as shortcuts. + legacy path still support use of hard coded ~0 or any value from 0x1 or 0xF. They will behave the same with legacy paths enabled (will assert otherwise). + - 2021/03/11 (1.82) - removed redirecting functions/enums names that were marked obsolete in 1.66 (September 2018): + - ImGui::SetScrollHere() -> use ImGui::SetScrollHereY() + - 2021/03/11 (1.82) - clarified that ImDrawList::PathArcTo(), ImDrawList::PathArcToFast() won't render with radius < 0.0f. Previously it sorts of accidentally worked but would generally lead to counter-clockwise paths and have an effect on anti-aliasing. + - 2021/03/10 (1.82) - upgraded ImDrawList::AddPolyline() and PathStroke() "bool closed" parameter to "ImDrawFlags flags". The matching ImDrawFlags_Closed value is guaranteed to always stay == 1 in the future. + - 2021/02/22 (1.82) - win32+mingw: Re-enabled IME functions by default even under MinGW. In July 2016, issue #738 had me incorrectly disable those default functions for MinGW. MinGW users should: either link with -limm32, either set their imconfig file with '#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS'. + - 2021/02/17 (1.82) - renamed rarely used style.CircleSegmentMaxError (old default = 1.60f) to style.CircleTessellationMaxError (new default = 0.30f) as the meaning of the value changed. + - 2021/02/03 (1.81) - renamed ListBoxHeader(const char* label, ImVec2 size) to BeginListBox(). Kept inline redirection function (will obsolete). + - removed ListBoxHeader(const char* label, int items_count, int height_in_items = -1) in favor of specifying size. Kept inline redirection function (will obsolete). + - renamed ListBoxFooter() to EndListBox(). Kept inline redirection function (will obsolete). + - 2021/01/26 (1.81) - removed ImGuiFreeType::BuildFontAtlas(). Kept inline redirection function. Prefer using '#define IMGUI_ENABLE_FREETYPE', but there's a runtime selection path available too. The shared extra flags parameters (very rarely used) are now stored in ImFontAtlas::FontBuilderFlags. + - renamed ImFontConfig::RasterizerFlags (used by FreeType) to ImFontConfig::FontBuilderFlags. + - renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.63 (August 2018): + - ImGui::IsItemDeactivatedAfterChange() -> use ImGui::IsItemDeactivatedAfterEdit(). + - ImGuiCol_ModalWindowDarkening -> use ImGuiCol_ModalWindowDimBg + - ImGuiInputTextCallback -> use ImGuiTextEditCallback + - ImGuiInputTextCallbackData -> use ImGuiTextEditCallbackData + - 2020/12/21 (1.80) - renamed ImDrawList::AddBezierCurve() to AddBezierCubic(), and PathBezierCurveTo() to PathBezierCubicCurveTo(). Kept inline redirection function (will obsolete). + - 2020/12/04 (1.80) - added imgui_tables.cpp file! Manually constructed project files will need the new file added! + - 2020/11/18 (1.80) - renamed undocumented/internals ImGuiColumnsFlags_* to ImGuiOldColumnFlags_* in prevision of incoming Tables API. + - 2020/11/03 (1.80) - renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature will apply to other data structures + - 2020/10/14 (1.80) - backends: moved all backends files (imgui_impl_XXXX.cpp, imgui_impl_XXXX.h) from examples/ to backends/. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.60 (April 2018): + - io.RenderDrawListsFn pointer -> use ImGui::GetDrawData() value and call the render function of your backend + - ImGui::IsAnyWindowFocused() -> use ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) + - ImGui::IsAnyWindowHovered() -> use ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + - ImGuiStyleVar_Count_ -> use ImGuiStyleVar_COUNT + - ImGuiMouseCursor_Count_ -> use ImGuiMouseCursor_COUNT + - removed redirecting functions names that were marked obsolete in 1.61 (May 2018): + - InputFloat (... int decimal_precision ...) -> use InputFloat (... const char* format ...) with format = "%.Xf" where X is your value for decimal_precision. + - same for InputFloat2()/InputFloat3()/InputFloat4() variants taking a `int decimal_precision` parameter. + - 2020/10/05 (1.79) - removed ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the ImGuiListClipper::Begin() function, with misleading edge cases (note: imgui_memory_editor <0.40 from imgui_club/ used this old clipper API. Update your copy if needed). + - 2020/09/25 (1.79) - renamed ImGuiSliderFlags_ClampOnInput to ImGuiSliderFlags_AlwaysClamp. Kept redirection enum (will obsolete sooner because previous name was added recently). + - 2020/09/25 (1.79) - renamed style.TabMinWidthForUnselectedCloseButton to style.TabMinWidthForCloseButton. + - 2020/09/21 (1.79) - renamed OpenPopupContextItem() back to OpenPopupOnItemClick(), reverting the change from 1.77. For varieties of reason this is more self-explanatory. + - 2020/09/21 (1.79) - removed return value from OpenPopupOnItemClick() - returned true on mouse release on item - because it is inconsistent with other popup APIs and makes others misleading. It's also and unnecessary: you can use IsWindowAppearing() after BeginPopup() for a similar result. + - 2020/09/17 (1.79) - removed ImFont::DisplayOffset in favor of ImFontConfig::GlyphOffset. DisplayOffset was applied after scaling and not very meaningful/useful outside of being needed by the default ProggyClean font. If you scaled this value after calling AddFontDefault(), this is now done automatically. It was also getting in the way of better font scaling, so let's get rid of it now! + - 2020/08/17 (1.78) - obsoleted use of the trailing 'float power=1.0f' parameter for DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(), DragFloatRange2(), DragScalar(), DragScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4(), SliderScalar(), SliderScalarN(), VSliderFloat() and VSliderScalar(). + replaced the 'float power=1.0f' argument with integer-based flags defaulting to 0 (as with all our flags). + worked out a backward-compatibility scheme so hopefully most C++ codebase should not be affected. in short, when calling those functions: + - if you omitted the 'power' parameter (likely!), you are not affected. + - if you set the 'power' parameter to 1.0f (same as previous default value): 1/ your compiler may warn on float>int conversion, 2/ everything else will work. 3/ you can replace the 1.0f value with 0 to fix the warning, and be technically correct. + - if you set the 'power' parameter to >1.0f (to enable non-linear editing): 1/ your compiler may warn on float>int conversion, 2/ code will assert at runtime, 3/ in case asserts are disabled, the code will not crash and enable the _Logarithmic flag. 4/ you can replace the >1.0f value with ImGuiSliderFlags_Logarithmic to fix the warning/assert and get a _similar_ effect as previous uses of power >1.0f. + see https://github.com/ocornut/imgui/issues/3361 for all details. + kept inline redirection functions (will obsolete) apart for: DragFloatRange2(), VSliderFloat(), VSliderScalar(). For those three the 'float power=1.0f' version were removed directly as they were most unlikely ever used. + for shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. + - obsoleted use of v_min > v_max in DragInt, DragFloat, DragScalar to lock edits (introduced in 1.73, was not demoed nor documented very), will be replaced by a more generic ReadOnly feature. You may use the ImGuiSliderFlags_ReadOnly internal flag in the meantime. + - 2020/06/23 (1.77) - removed BeginPopupContextWindow(const char*, int mouse_button, bool also_over_items) in favor of BeginPopupContextWindow(const char*, ImGuiPopupFlags flags) with ImGuiPopupFlags_NoOverItems. + - 2020/06/15 (1.77) - renamed OpenPopupOnItemClick() to OpenPopupContextItem(). Kept inline redirection function (will obsolete). [NOTE: THIS WAS REVERTED IN 1.79] + - 2020/06/15 (1.77) - removed CalcItemRectClosestPoint() entry point which was made obsolete and asserting in December 2017. + - 2020/04/23 (1.77) - removed unnecessary ID (first arg) of ImFontAtlas::AddCustomRectRegular(). + - 2020/01/22 (1.75) - ImDrawList::AddCircle()/AddCircleFilled() functions don't accept negative radius any more. + - 2019/12/17 (1.75) - [undid this change in 1.76] made Columns() limited to 64 columns by asserting above that limit. While the current code technically supports it, future code may not so we're putting the restriction ahead. + - 2019/12/13 (1.75) - [imgui_internal.h] changed ImRect() default constructor initializes all fields to 0.0f instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). If you used ImRect::Add() to create bounding boxes by adding multiple points into it, you may need to fix your initial value. + - 2019/12/08 (1.75) - removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017): + - ShowTestWindow() -> use ShowDemoWindow() + - IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow) + - IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) + - SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f) + - GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing() + - ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg + - ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding + - ImGuiTreeNodeFlags_AllowOverlapMode -> use ImGuiTreeNodeFlags_AllowItemOverlap + - IMGUI_DISABLE_TEST_WINDOWS -> use IMGUI_DISABLE_DEMO_WINDOWS + - 2019/12/08 (1.75) - obsoleted calling ImDrawList::PrimReserve() with a negative count (which was the vaguely documented and rarely if ever used). Instead we added an explicit PrimUnreserve() API. + - 2019/12/06 (1.75) - removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions (none of the other functions have it). + - 2019/11/21 (1.74) - ImFontAtlas::AddCustomRectRegular() now requires an ID larger than 0x110000 (instead of 0x10000) to conform with supporting Unicode planes 1-16 in a future update. ID below 0x110000 will now assert. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency. + - 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): + - Begin() [old 5 args version] -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed + - IsRootWindowOrAnyChildHovered() -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows) + - AlignFirstTextHeightToWidgets() -> use AlignTextToFramePadding() + - SetNextWindowPosCenter() -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f) + - ImFont::Glyph -> use ImFontGlyph + - 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function. + if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix. + The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay). + If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you. + - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). + - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). + - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names, or see how they were implemented until 1.71. + - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have + overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering. + This optimization is disabled if the parent window has no visual output, because it appears to be the most common situation leading to the creation of overlapping child windows. + Please reach out if you are affected. + - 2019/05/13 (1.71) - renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Kept inline redirection function (will obsolete). + - 2019/05/11 (1.71) - changed io.AddInputCharacter(unsigned short c) signature to io.AddInputCharacter(unsigned int c). - 2019/04/29 (1.70) - improved ImDrawList thick strokes (>1.0f) preserving correct thickness up to 90 degrees angles (e.g. rectangles). If you have custom rendering using thick lines, they will appear thicker now. - 2019/04/29 (1.70) - removed GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function (will obsolete). - 2019/03/04 (1.69) - renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete). - 2019/02/26 (1.69) - renamed ImGuiColorEditFlags_RGB/ImGuiColorEditFlags_HSV/ImGuiColorEditFlags_HEX to ImGuiColorEditFlags_DisplayRGB/ImGuiColorEditFlags_DisplayHSV/ImGuiColorEditFlags_DisplayHex. Kept redirection enums (will obsolete). - - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with a dummy small value! + - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with an arbitrary small value! - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead! - - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Keep redirection typedef (will obsolete). + - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects. - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags. - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files. @@ -395,10 +501,10 @@ CODE - 2018/08/01 (1.63) - renamed io.OptCursorBlink to io.ConfigCursorBlink [-> io.ConfigInputTextCursorBlink in 1.65], io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency. - 2018/07/22 (1.63) - changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time. - 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete). - - 2018/06/08 (1.62) - examples: the imgui_impl_xxx files have been split to separate platform (Win32, Glfw, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.). - old bindings will still work as is, however prefer using the separated bindings as they will be updated to support multi-viewports. - when adopting new bindings follow the main.cpp code of your preferred examples/ folder to know which functions to call. - in particular, note that old bindings called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function. + - 2018/06/08 (1.62) - examples: the imgui_impl_XXX files have been split to separate platform (Win32, GLFW, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.). + old backends will still work as is, however prefer using the separated backends as they will be updated to support multi-viewports. + when adopting new backends follow the main.cpp code of your preferred examples/ folder to know which functions to call. + in particular, note that old backends called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function. - 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set. - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details. - 2018/05/03 (1.61) - DragInt(): the default compile-time format string has been changed from "%.0f" to "%d", as we are not using integers internally any more. @@ -408,7 +514,7 @@ CODE - 2018/04/28 (1.61) - obsoleted InputFloat() functions taking an optional "int decimal_precision" in favor of an equivalent and more flexible "const char* format", consistent with other functions. Kept redirection functions (will obsolete). - 2018/04/09 (1.61) - IM_DELETE() helper function added in 1.60 doesn't clear the input _pointer_ reference, more consistent with expectation and allows passing r-value. - - 2018/03/20 (1.60) - renamed io.WantMoveMouse to io.WantSetMousePos for consistency and ease of understanding (was added in 1.52, _not_ used by core and only honored by some binding ahead of merging the Nav branch). + - 2018/03/20 (1.60) - renamed io.WantMoveMouse to io.WantSetMousePos for consistency and ease of understanding (was added in 1.52, _not_ used by core and only honored by some backend ahead of merging the Nav branch). - 2018/03/12 (1.60) - removed ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered as the closing cross uses regular button colors now. - 2018/03/08 (1.60) - changed ImFont::DisplayOffset.y to default to 0 instead of +1. Fixed rounding of Ascent/Descent to match TrueType renderer. If you were adding or subtracting to ImFont::DisplayOffset check if your fonts are correctly aligned vertically. - 2018/03/03 (1.60) - renamed ImGuiStyleVar_Count_ to ImGuiStyleVar_COUNT and ImGuiMouseCursor_Count_ to ImGuiMouseCursor_COUNT for consistency with other public enums. @@ -445,24 +551,27 @@ CODE - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details. removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting. + IsItemHoveredRect() --> IsItemHovered(ImGuiHoveredFlags_RectOnly) + IsMouseHoveringAnyWindow() --> IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + IsMouseHoveringWindow() --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior] - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). - - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Keep redirection typedef (will obsolete). + - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). - - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". + - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your backend if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete). - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete). - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency. - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix. - - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame. + - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type. - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely. - - 2017/08/13 (1.51) - renamed ImGuiCol_Columns*** to ImGuiCol_Separator***. Kept redirection enums (will obsolete). - - 2017/08/11 (1.51) - renamed ImGuiSetCond_*** types and flags to ImGuiCond_***. Kept redirection enums (will obsolete). + - 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete). + - 2017/08/11 (1.51) - renamed ImGuiSetCond_Always to ImGuiCond_Always, ImGuiSetCond_Once to ImGuiCond_Once, ImGuiSetCond_FirstUseEver to ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing to ImGuiCond_Appearing. Kept redirection enums (will obsolete). - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton(). - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu. - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options. - - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0))' + - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0))' - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity. @@ -471,14 +580,9 @@ CODE - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc. - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal. - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. - If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you. - If your TitleBg/TitleBgActive alpha was <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. - This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color. - ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) - { - float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; - return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); - } + If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. + This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color: + ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); } If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color. - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext(). - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection. @@ -501,7 +605,7 @@ CODE you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text. - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost. this necessary change will break your rendering function! the fix should be very easy. sorry for that :( - - if you are using a vanilla copy of one of the imgui_impl_XXXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. + - if you are using a vanilla copy of one of the imgui_impl_XXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. - the signature of the io.RenderDrawListsFn handler has changed! old: ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count) new: ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data). @@ -537,14 +641,13 @@ CODE - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused) - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions. - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader. - (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. - font init: { const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); <..Upload texture to GPU..>; } - became: { unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); <..Upload texture to GPU>; io.Fonts->TexId = YourTextureIdentifier; } - you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. - it is now recommended that you sample the font texture with bilinear interpolation. - (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID. - (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) - (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets + - 2015/01/11 (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. + - old: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); [..Upload texture to GPU..]; + - new: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); [..Upload texture to GPU..]; io.Fonts->SetTexID(YourTexIdentifier); + you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. It is now recommended that you sample the font texture with bilinear interpolation. + - 2015/01/11 (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to call io.Fonts->SetTexID() + - 2015/01/11 (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) + - 2015/01/11 (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility @@ -558,423 +661,118 @@ CODE - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes - FREQUENTLY ASKED QUESTIONS (FAQ), TIPS - ====================================== + FREQUENTLY ASKED QUESTIONS (FAQ) + ================================ + + Read all answers online: + https://www.dearimgui.org/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url) + Read all answers locally (with a text editor or ideally a Markdown viewer): + docs/FAQ.md + Some answers are copied down here to facilitate searching in code. + + Q&A: Basics + =========== Q: Where is the documentation? A: This library is poorly documented at the moment and expects of the user to be acquainted with C/C++. - Run the examples/ and explore them. - - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. - - The demo covers most features of Dear ImGui, so you can read the code and see its output. + - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. + - The demo covers most features of Dear ImGui, so you can read the code and see its output. - See documentation and comments at the top of imgui.cpp + effectively imgui.h. - - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the examples/ - folder to explain how to integrate Dear ImGui with your own engine/application. - - Your programming IDE is your friend, find the type or function declaration to find comments + - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the + examples/ folder to explain how to integrate Dear ImGui with your own engine/application. + - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. + - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. + - Your programming IDE is your friend, find the type or function declaration to find comments associated to it. + Q: What is this library called? Q: Which version should I get? - A: I occasionally tag Releases (https://github.com/ocornut/imgui/releases) but it is generally safe - and recommended to sync to master/latest. The library is fairly stable and regressions tend to be - fixed fast when reported. You may also peak at the 'docking' branch which includes: - - Docking/Merging features (https://github.com/ocornut/imgui/issues/2109) - - Multi-viewport features (https://github.com/ocornut/imgui/issues/1542) - Many projects are using this branch and it is kept in sync with master regularly. + >> This library is called "Dear ImGui", please don't call it "ImGui" :) + >> See https://www.dearimgui.org/faq for details. + + Q&A: Integration + ================ + + Q: How to get started? + A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. + + Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or to my application? + A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + >> See https://www.dearimgui.org/faq for fully detailed answer. You really want to read this. + + Q. How can I enable keyboard controls? + Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) + Q: I integrated Dear ImGui in my engine and little squares are showing instead of text.. + Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around.. + Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries.. + >> See https://www.dearimgui.org/faq + + Q&A: Usage + ---------- + + Q: Why is my widget not reacting when I click on it? + Q: How can I have widgets with an empty label? + Q: How can I have multiple widgets with the same label? + Q: How can I display an image? What is ImTextureID, how does it works? + Q: How can I use my own math types instead of ImVec2/ImVec4? + Q: How can I interact with standard C++ types (such as std::string and std::vector)? + Q: How can I display custom shapes? (using low-level ImDrawList API) + >> See https://www.dearimgui.org/faq + + Q&A: Fonts, Text + ================ + + Q: How should I handle DPI in my application? + Q: How can I load a different font than the default? + Q: How can I easily use icons in my application? + Q: How can I load multiple fonts? + Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? + >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md + + Q&A: Concerns + ============= Q: Who uses Dear ImGui? - A: See "Quotes" (https://github.com/ocornut/imgui/wiki/Quotes) and - "Software using Dear ImGui" (https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) Wiki pages - for a list of games/software which are publicly known to use dear imgui. Please add yours if you can! + Q: Can you create elaborate/serious tools with Dear ImGui? + Q: Can you reskin the look of Dear ImGui? + Q: Why using C++ (as opposed to C)? + >> See https://www.dearimgui.org/faq - Q: Why the odd dual naming, "Dear ImGui" vs "ImGui"? - A: The library started its life as "ImGui" due to the fact that I didn't give it a proper name when - when I released 1.0, and had no particular expectation that it would take off. However, the term IMGUI - (immediate-mode graphical user interface) was coined before and is being used in variety of other - situations (e.g. Unity uses it own implementation of the IMGUI paradigm). - To reduce the ambiguity without affecting existing code bases, I have decided on an alternate, - longer name "Dear ImGui" that people can use to refer to this specific library. - Please try to refer to this library as "Dear ImGui". - - Q: How can I tell whether to dispatch mouse/keyboard to imgui or to my application? - A: You can read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags from the ImGuiIO structure (e.g. if (ImGui::GetIO().WantCaptureMouse) { ... } ) - - When 'io.WantCaptureMouse' is set, imgui wants to use your mouse state, and you may want to discard/hide the inputs from the rest of your application. - - When 'io.WantCaptureKeyboard' is set, imgui wants to use your keyboard state, and you may want to discard/hide the inputs from the rest of your application. - - When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS). - Note: you should always pass your mouse/keyboard inputs to imgui, even when the io.WantCaptureXXX flag are set false. - This is because imgui needs to detect that you clicked in the void to unfocus its own windows. - Note: The 'io.WantCaptureMouse' is more accurate that any attempt to "check if the mouse is hovering a window" (don't do that!). - It handle mouse dragging correctly (both dragging that started over your application or over an imgui window) and handle e.g. modal windows blocking inputs. - Those flags are updated by ImGui::NewFrame(). Preferably read the flags after calling NewFrame() if you can afford it, but reading them before is also - perfectly fine, as the bool toggle fairly rarely. If you have on a touch device, you might find use for an early call to UpdateHoveredWindowAndCaptureFlags(). - Note: Text input widget releases focus on "Return KeyDown", so the subsequent "Return KeyUp" event that your application receive will typically - have 'io.WantCaptureKeyboard=false'. Depending on your application logic it may or not be inconvenient. You might want to track which key-downs - were targeted for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.) - - Q: How can I display an image? What is ImTextureID, how does it works? - A: Short explanation: - - You may use functions such as ImGui::Image(), ImGui::ImageButton() or lower-level ImDrawList::AddImage() to emit draw calls that will use your own textures. - - Actual textures are identified in a way that is up to the user/engine. Those identifiers are stored and passed as ImTextureID (void*) value. - - Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason). - Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward. - - Long explanation: - - Dear ImGui's job is to create "meshes", defined in a renderer-agnostic format made of draw commands and vertices. - At the end of the frame those meshes (ImDrawList) will be displayed by your rendering function. They are made up of textured polygons and the code - to render them is generally fairly short (a few dozen lines). In the examples/ folder we provide functions for popular graphics API (OpenGL, DirectX, etc.). - - Each rendering function decides on a data type to represent "textures". The concept of what is a "texture" is entirely tied to your underlying engine/graphics API. - We carry the information to identify a "texture" in the ImTextureID type. - ImTextureID is nothing more that a void*, aka 4/8 bytes worth of data: just enough to store 1 pointer or 1 integer of your choice. - Dear ImGui doesn't know or understand what you are storing in ImTextureID, it merely pass ImTextureID values until they reach your rendering function. - - In the examples/ bindings, for each graphics API binding we decided on a type that is likely to be a good representation for specifying - an image from the end-user perspective. This is what the _examples_ rendering functions are using: - - OpenGL: ImTextureID = GLuint (see ImGui_ImplGlfwGL3_RenderDrawData() function in imgui_impl_glfw_gl3.cpp) - DirectX9: ImTextureID = LPDIRECT3DTEXTURE9 (see ImGui_ImplDX9_RenderDrawData() function in imgui_impl_dx9.cpp) - DirectX11: ImTextureID = ID3D11ShaderResourceView* (see ImGui_ImplDX11_RenderDrawData() function in imgui_impl_dx11.cpp) - DirectX12: ImTextureID = D3D12_GPU_DESCRIPTOR_HANDLE (see ImGui_ImplDX12_RenderDrawData() function in imgui_impl_dx12.cpp) - - For example, in the OpenGL example binding we store raw OpenGL texture identifier (GLuint) inside ImTextureID. - Whereas in the DirectX11 example binding we store a pointer to ID3D11ShaderResourceView inside ImTextureID, which is a higher-level structure - tying together both the texture and information about its format and how to read it. - - If you have a custom engine built over e.g. OpenGL, instead of passing GLuint around you may decide to use a high-level data type to carry information about - the texture as well as how to display it (shaders, etc.). The decision of what to use as ImTextureID can always be made better knowing how your codebase - is designed. If your engine has high-level data types for "textures" and "material" then you may want to use them. - If you are starting with OpenGL or DirectX or Vulkan and haven't built much of a rendering engine over them, keeping the default ImTextureID - representation suggested by the example bindings is probably the best choice. - (Advanced users may also decide to keep a low-level type in ImTextureID, and use ImDrawList callback and pass information to their renderer) - - User code may do: - - // Cast our texture type to ImTextureID / void* - MyTexture* texture = g_CoffeeTableTexture; - ImGui::Image((void*)texture, ImVec2(texture->Width, texture->Height)); - - The renderer function called after ImGui::Render() will receive that same value that the user code passed: - - // Cast ImTextureID / void* stored in the draw command as our texture type - MyTexture* texture = (MyTexture*)pcmd->TextureId; - MyEngineBindTexture2D(texture); - - Once you understand this design you will understand that loading image files and turning them into displayable textures is not within the scope of Dear ImGui. - This is by design and is actually a good thing, because it means your code has full control over your data types and how you display them. - If you want to display an image file (e.g. PNG file) into the screen, please refer to documentation and tutorials for the graphics API you are using. - - Here's a simplified OpenGL example using stb_image.h: - - // Use stb_image.h to load a PNG from disk and turn it into raw RGBA pixel data: - #define STB_IMAGE_IMPLEMENTATION - #include <stb_image.h> - [...] - int my_image_width, my_image_height; - unsigned char* my_image_data = stbi_load("my_image.png", &my_image_width, &my_image_height, NULL, 4); - - // Turn the RGBA pixel data into an OpenGL texture: - GLuint my_opengl_texture; - glGenTextures(1, &my_opengl_texture); - glBindTexture(GL_TEXTURE_2D, my_opengl_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data); - - // Now that we have an OpenGL texture, assuming our imgui rendering function (imgui_impl_xxx.cpp file) takes GLuint as ImTextureID, we can display it: - ImGui::Image((void*)(intptr_t)my_opengl_texture, ImVec2(my_image_width, my_image_height)); - - C/C++ tip: a void* is pointer-sized storage. You may safely store any pointer or integer into it by casting your value to ImTextureID / void*, and vice-versa. - Because both end-points (user code and rendering function) are under your control, you know exactly what is stored inside the ImTextureID / void*. - Examples: - - GLuint my_tex = XXX; - void* my_void_ptr; - my_void_ptr = (void*)(intptr_t)my_tex; // cast a GLuint into a void* (we don't take its address! we literally store the value inside the pointer) - my_tex = (GLuint)(intptr_t)my_void_ptr; // cast a void* into a GLuint - - ID3D11ShaderResourceView* my_dx11_srv = XXX; - void* my_void_ptr; - my_void_ptr = (void*)my_dx11_srv; // cast a ID3D11ShaderResourceView* into an opaque void* - my_dx11_srv = (ID3D11ShaderResourceView*)my_void_ptr; // cast a void* into a ID3D11ShaderResourceView* - - Finally, you may call ImGui::ShowMetricsWindow() to explore/visualize/understand how the ImDrawList are generated. - - Q: Why are multiple widgets reacting when I interact with a single one? - Q: How can I have multiple widgets with the same label or with an empty label? - A: A primer on labels and the ID Stack... - - Dear ImGui internally need to uniquely identify UI elements. - Elements that are typically not clickable (such as calls to the Text functions) don't need an ID. - Interactive widgets (such as calls to Button buttons) need a unique ID. - Unique ID are used internally to track active widgets and occasionally associate state to widgets. - Unique ID are implicitly built from the hash of multiple elements that identify the "path" to the UI element. - - - Unique ID are often derived from a string label: - - Button("OK"); // Label = "OK", ID = hash of (..., "OK") - Button("Cancel"); // Label = "Cancel", ID = hash of (..., "Cancel") - - - ID are uniquely scoped within windows, tree nodes, etc. which all pushes to the ID stack. Having - two buttons labeled "OK" in different windows or different tree locations is fine. - We used "..." above to signify whatever was already pushed to the ID stack previously: - - Begin("MyWindow"); - Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "OK") - End(); - Begin("MyOtherWindow"); - Button("OK"); // Label = "OK", ID = hash of ("MyOtherWindow", "OK") - End(); - - - If you have a same ID twice in the same location, you'll have a conflict: - - Button("OK"); - Button("OK"); // ID collision! Interacting with either button will trigger the first one. - - Fear not! this is easy to solve and there are many ways to solve it! - - - Solving ID conflict in a simple/local context: - When passing a label you can optionally specify extra ID information within string itself. - Use "##" to pass a complement to the ID that won't be visible to the end-user. - This helps solving the simple collision cases when you know e.g. at compilation time which items - are going to be created: - - Begin("MyWindow"); - Button("Play"); // Label = "Play", ID = hash of ("MyWindow", "Play") - Button("Play##foo1"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo1") // Different from above - Button("Play##foo2"); // Label = "Play", ID = hash of ("MyWindow", "Play##foo2") // Different from above - End(); - - - If you want to completely hide the label, but still need an ID: - - Checkbox("##On", &b); // Label = "", ID = hash of (..., "##On") // No visible label, just a checkbox! - - - Occasionally/rarely you might want change a label while preserving a constant ID. This allows - you to animate labels. For example you may want to include varying information in a window title bar, - but windows are uniquely identified by their ID. Use "###" to pass a label that isn't part of ID: - - Button("Hello###ID"); // Label = "Hello", ID = hash of (..., "###ID") - Button("World###ID"); // Label = "World", ID = hash of (..., "###ID") // Same as above, even though the label looks different - - sprintf(buf, "My game (%f FPS)###MyGame", fps); - Begin(buf); // Variable title, ID = hash of "MyGame" - - - Solving ID conflict in a more general manner: - Use PushID() / PopID() to create scopes and manipulate the ID stack, as to avoid ID conflicts - within the same window. This is the most convenient way of distinguishing ID when iterating and - creating many UI elements programmatically. - You can push a pointer, a string or an integer value into the ID stack. - Remember that ID are formed from the concatenation of _everything_ pushed into the ID stack. - At each level of the stack we store the seed used for items at this level of the ID stack. - - Begin("Window"); - for (int i = 0; i < 100; i++) - { - PushID(i); // Push i to the id tack - Button("Click"); // Label = "Click", ID = hash of ("Window", i, "Click") - PopID(); - } - for (int i = 0; i < 100; i++) - { - MyObject* obj = Objects[i]; - PushID(obj); - Button("Click"); // Label = "Click", ID = hash of ("Window", obj pointer, "Click") - PopID(); - } - for (int i = 0; i < 100; i++) - { - MyObject* obj = Objects[i]; - PushID(obj->Name); - Button("Click"); // Label = "Click", ID = hash of ("Window", obj->Name, "Click") - PopID(); - } - End(); - - - You can stack multiple prefixes into the ID stack: - - Button("Click"); // Label = "Click", ID = hash of (..., "Click") - PushID("node"); - Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click") - PushID(my_ptr); - Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click") - PopID(); - PopID(); - - - Tree nodes implicitly creates a scope for you by calling PushID(). - - Button("Click"); // Label = "Click", ID = hash of (..., "Click") - if (TreeNode("node")) // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag) - { - Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click") - TreePop(); - } - - - When working with trees, ID are used to preserve the open/close state of each tree node. - Depending on your use cases you may want to use strings, indices or pointers as ID. - e.g. when following a single pointer that may change over time, using a static string as ID - will preserve your node open/closed state when the targeted object change. - e.g. when displaying a list of objects, using indices or pointers as ID will preserve the - node open/closed state differently. See what makes more sense in your situation! - - Q: How can I use my own math types instead of ImVec2/ImVec4? - A: You can edit imconfig.h and setup the IM_VEC2_CLASS_EXTRA/IM_VEC4_CLASS_EXTRA macros to add implicit type conversions. - This way you'll be able to use your own types everywhere, e.g. passing glm::vec2 to ImGui functions instead of ImVec2. - - Q: How can I load a different font than the default? - A: Use the font atlas to load the TTF/OTF file you want: - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels); - io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8() - Default is ProggyClean.ttf, monospace, rendered at size 13, embedded in dear imgui's source code. - (Tip: monospace fonts are convenient because they allow to facilitate horizontal alignment directly at the string level.) - (Read the 'misc/fonts/README.txt' file for more details about font loading.) - - New programmers: remember that in C/C++ and most programming languages if you want to use a - backslash \ within a string literal, you need to write it double backslash "\\": - io.Fonts->AddFontFromFileTTF("MyDataFolder\MyFontFile.ttf", size_in_pixels); // WRONG (you are escape the M here!) - io.Fonts->AddFontFromFileTTF("MyDataFolder\\MyFontFile.ttf", size_in_pixels); // CORRECT - io.Fonts->AddFontFromFileTTF("MyDataFolder/MyFontFile.ttf", size_in_pixels); // ALSO CORRECT - - Q: How can I easily use icons in my application? - A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you - main font. Then you can refer to icons within your strings. - You may want to see ImFontConfig::GlyphMinAdvanceX to make your icon look monospace to facilitate alignment. - (Read the 'misc/fonts/README.txt' file for more details about icons font loading.) - - Q: How can I load multiple fonts? - A: Use the font atlas to pack them into a single texture: - (Read the 'misc/fonts/README.txt' file and the code in ImFontAtlas for more details.) - - ImGuiIO& io = ImGui::GetIO(); - ImFont* font0 = io.Fonts->AddFontDefault(); - ImFont* font1 = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels); - ImFont* font2 = io.Fonts->AddFontFromFileTTF("myfontfile2.ttf", size_in_pixels); - io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8() - // the first loaded font gets used by default - // use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime - - // Options - ImFontConfig config; - config.OversampleH = 2; - config.OversampleV = 1; - config.GlyphOffset.y -= 1.0f; // Move everything by 1 pixels up - config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, &config); - - // Combine multiple fonts into one (e.g. for icon fonts) - static ImWchar ranges[] = { 0xf000, 0xf3ff, 0 }; - ImFontConfig config; - config.MergeMode = true; - io.Fonts->AddFontDefault(); - io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 16.0f, &config, ranges); // Merge icon font - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, NULL, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs - - Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? - A: When loading a font, pass custom Unicode ranges to specify the glyphs to load. - - // Add default Japanese ranges - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese()); - - // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need) - ImVector<ImWchar> ranges; - ImFontGlyphRangesBuilder builder; - builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters) - builder.AddChar(0x7262); // Add a specific character - builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges - builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted) - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data); - - All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8 - by using the u8"hello" syntax. Specifying literal in your source code using a local code page - (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work! - Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8. - - Text input: it is up to your application to pass the right character code by calling io.AddInputCharacter(). - The applications in examples/ are doing that. - Windows: you can use the WM_CHAR or WM_UNICHAR or WM_IME_CHAR message (depending if your app is built using Unicode or MultiByte mode). - You may also use MultiByteToWideChar() or ToUnicode() to retrieve Unicode codepoints from MultiByte characters or keyboard state. - Windows: if your language is relying on an Input Method Editor (IME), you copy the HWND of your window to io.ImeWindowHandle in order for - the default implementation of io.ImeSetInputScreenPosFn() to set your Microsoft IME position correctly. - - Q: How can I interact with standard C++ types (such as std::string and std::vector)? - A: - Being highly portable (bindings for several languages, frameworks, programming style, obscure or older platforms/compilers), - and aiming for compatibility & performance suitable for every modern real-time game engines, dear imgui does not use - any of std C++ types. We use raw types (e.g. char* instead of std::string) because they adapt to more use cases. - - To use ImGui::InputText() with a std::string or any resizable string class, see misc/cpp/imgui_stdlib.h. - - To use combo boxes and list boxes with std::vector or any other data structure: the BeginCombo()/EndCombo() API - lets you iterate and submit items yourself, so does the ListBoxHeader()/ListBoxFooter() API. - Prefer using them over the old and awkward Combo()/ListBox() api. - - Generally for most high-level types you should be able to access the underlying data type. - You may write your own one-liner wrappers to facilitate user code (tip: add new functions in ImGui:: namespace from your code). - - Dear ImGui applications often need to make intensive use of strings. It is expected that many of the strings you will pass - to the API are raw literals (free in C/C++) or allocated in a manner that won't incur a large cost on your application. - Please bear in mind that using std::string on applications with large amount of UI may incur unsatisfactory performances. - Modern implementations of std::string often include small-string optimization (which is often a local buffer) but those - are not configurable and not the same across implementations. - - If you are finding your UI traversal cost to be too large, make sure your string usage is not leading to excessive amount - of heap allocations. Consider using literals, statically sized buffers and your own helper functions. A common pattern - is that you will need to build lots of strings on the fly, and their maximum length can be easily be scoped ahead. - One possible implementation of a helper to facilitate printf-style building of strings: https://github.com/ocornut/Str - This is a small helper where you can instance strings with configurable local buffers length. Many game engines will - provide similar or better string helpers. - - Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API) - A: - You can create a dummy window. Call Begin() with the NoBackground | NoDecoration | NoSavedSettings | NoInputs flags. - (The ImGuiWindowFlags_NoDecoration flag itself is a shortcut for NoTitleBar | NoResize | NoScrollbar | NoCollapse) - Then you can retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like. - - You can call ImGui::GetBackgroundDrawList() or ImGui::GetForegroundDrawList() and use those draw list to display - contents behind or over every other imgui windows (one bg/fg drawlist per viewport). - - You can create your own ImDrawList instance. You'll need to initialize them ImGui::GetDrawListSharedData(), or create - your own ImDrawListSharedData, and then call your rendered code with your own ImDrawList or ImDrawData data. - - Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) - A: - You can control Dear ImGui with a gamepad. Read about navigation in "Using gamepad/keyboard navigation controls". - (short version: map gamepad inputs into the io.NavInputs[] array + set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad) - - You can share your computer mouse seamlessly with your console/tablet/phone using Synergy (https://symless.com/synergy) - This is the preferred solution for developer productivity. - In particular, the "micro-synergy-client" repository (https://github.com/symless/micro-synergy-client) has simple - and portable source code (uSynergy.c/.h) for a small embeddable client that you can use on any platform to connect - to your host computer, based on the Synergy 1.x protocol. Make sure you download the Synergy 1 server on your computer. - Console SDK also sometimes provide equivalent tooling or wrapper for Synergy-like protocols. - - You may also use a third party solution such as Remote ImGui (https://github.com/JordiRos/remoteimgui) which sends - the vertices to render over the local network, allowing you to use Dear ImGui even on a screen-less machine. - - For touch inputs, you can increase the hit box of widgets (via the style.TouchPadding setting) to accommodate - for the lack of precision of touch inputs, but it is recommended you use a mouse or gamepad to allow optimizing - for screen real-estate and precision. - - Q: I integrated Dear ImGui in my engine and the text or lines are blurry.. - A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f). - Also make sure your orthographic projection matrix and io.DisplaySize matches your actual framebuffer dimension. - - Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around.. - A: You are probably mishandling the clipping rectangles in your render function. - Rectangles provided by ImGui are defined as (x1=left,y1=top,x2=right,y2=bottom) and NOT as (x1,y1,width,height). + Q&A: Community + ============== Q: How can I help? - A: - If you are experienced with Dear ImGui and C++, look at the github issues, look at the Wiki, read docs/TODO.txt + A: - Businesses: please reach out to "contact AT dearimgui.org" if you work in a place using Dear ImGui! + We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. + This is among the most useful thing you can do for Dear ImGui. With increased funding we can hire more people working on this project. + - Individuals: you can support continued development via PayPal donations. See README. + - If you are experienced with Dear ImGui and C++, look at the github issues, look at the Wiki, read docs/TODO.txt and see how you want to help and can help! - - Businesses: convince your company to fund development via support contracts/sponsoring! This is among the most useful thing you can do for dear imgui. - - Individuals: you can also become a Patron (http://www.patreon.com/imgui) or donate on PayPal! See README. - - Disclose your usage of dear imgui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. - You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/1902). Visuals are ideal as they inspire other programmers. + - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. + You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/3488). Visuals are ideal as they inspire other programmers. But even without visuals, disclosing your use of dear imgui help the library grow credibility, and help other teams and programmers with taking decisions. - If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues (on github or privately). - - tip: you can call Begin() multiple times with the same name during the same frame, it will keep appending to the same window. - this is also useful to set yourself in the context of another window (to get/set other settings) - - tip: you can create widgets without a Begin()/End() block, they will go in an implicit window called "Debug". - - tip: the ImGuiOnceUponAFrame helper will allow run the block of code only once a frame. You can use it to quickly add custom UI in the middle - of a deep nested inner loop in your code. - - tip: you can call Render() multiple times (e.g for VR renders). - - tip: call and read the ShowDemoWindow() code in imgui_demo.cpp for more example of how to use ImGui! - */ +//------------------------------------------------------------------------- +// [SECTION] INCLUDES +//------------------------------------------------------------------------- + #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) #define _CRT_SECURE_NO_WARNINGS #endif #include "imgui.h" +#ifndef IMGUI_DISABLE + #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS #endif #include "imgui_internal.h" +// System includes #include <ctype.h> // toupper #include <stdio.h> // vsnprintf, sscanf, printf #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier @@ -983,34 +781,62 @@ CODE #include <stdint.h> // intptr_t #endif -// Debug options -#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL -#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window +// [Windows] OS specific includes (optional) +#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#define IMGUI_DISABLE_WIN32_FUNCTIONS +#endif +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif +#ifndef __MINGW32__ +#include <Windows.h> // _wfopen, OpenClipboard +#else +#include <windows.h> +#endif +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions +#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS +#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS +#endif +#endif + +// [Apple] OS specific includes +#if defined(__APPLE__) +#include <TargetConditionals.h> +#endif // Visual Studio warnings #ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif #endif // Clang/GCC warnings with -Weverything -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning : unknown warning group '-Wformat-pedantic *' // not all warnings are known by all clang versions.. so ignoring warnings triggers new warnings on some configuration. great! -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference is. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#pragma clang diagnostic ignored "-Wformat-pedantic" // warning : format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int' -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0 -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! #endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int' +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision #elif defined(__GNUC__) +// We disable -Wpragmas because GCC doesn't provide an has_warning equivalent and some forks/patches may not following the warning/version association. +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size #pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*' @@ -1018,18 +844,22 @@ CODE #pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value #pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked #pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false -#if __GNUC__ >= 8 -#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead #endif +// Debug options +#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL +#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window +#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) + // When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear -// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by back-end) +// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) static const float WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS = 4.0f; // Extend outside and inside windows. Affect FindHoveredWindow(). static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. +static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 2.00f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. //------------------------------------------------------------------------- // [SECTION] FORWARD DECLARATIONS @@ -1037,19 +867,18 @@ static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduc static void SetCurrentWindow(ImGuiWindow* window); static void FindHoveredWindow(); -static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags); -static void CheckStacksSize(ImGuiWindow* window, bool write); -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges); +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list); static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window); -static ImRect GetViewportRect(); - // Settings -static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); -static void SettingsHandlerWindow_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); -static void SettingsHandlerWindow_WriteAll(ImGuiContext* imgui_ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf); +static void WindowSettingsHandler_ClearAll(ImGuiContext*, ImGuiSettingsHandler*); +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); +static void WindowSettingsHandler_ApplyAll(ImGuiContext*, ImGuiSettingsHandler*); +static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf); // Platform Dependents default implementation for IO functions static const char* GetClipboardTextFn_DefaultImpl(void* user_data); @@ -1058,26 +887,41 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y); namespace ImGui { -static bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); - // Navigation static void NavUpdate(); static void NavUpdateWindowing(); -static void NavUpdateWindowingList(); +static void NavUpdateWindowingOverlay(); static void NavUpdateMoveResult(); -static float NavUpdatePageUpPageDown(int allowed_dir_flags); +static void NavUpdateInitResult(); +static float NavUpdatePageUpPageDown(); static inline void NavUpdateAnyRequestFlag(); +static void NavEndFrame(); +static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand); +static void NavApplyItemToResult(ImGuiNavMoveResult* result, ImGuiWindow* window, ImGuiID id, const ImRect& nav_bb_rel); static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, ImGuiID id); static ImVec2 NavCalcPreferredRefPos(); static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); +static void NavRestoreLayer(ImGuiNavLayer layer); static int FindWindowFocusIndex(ImGuiWindow* window); +// Error Checking +static void ErrorCheckNewFrameSanityChecks(); +static void ErrorCheckEndFrameSanityChecks(); + // Misc +static void UpdateSettings(); static void UpdateMouseInputs(); static void UpdateMouseWheel(); -static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]); -static void RenderOuterBorders(ImGuiWindow* window); +static void UpdateTabFocus(); +static void UpdateDebugToolItemPicker(); +static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); +static void RenderWindowOuterBorders(ImGuiWindow* window); +static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); +static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); + +// Viewports +static void UpdateViewportsNewFrame(); } @@ -1085,27 +929,33 @@ static void RenderOuterBorders(ImGuiWindow* window); // [SECTION] CONTEXT AND MEMORY ALLOCATORS //----------------------------------------------------------------------------- +// DLL users: +// - Heaps and globals are not shared across DLL boundaries! +// - You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling from. +// - Same apply for hot-reloading mechanisms that are reliant on reloading DLL (note that many hot-reloading mechanism works without DLL). +// - Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// - Confused? In a debugger: add GImGui to your watch window and notice how its value changes depending on your current location (which DLL boundary you are in). + // Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL. -// ImGui::CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext(). -// 1) Important: globals are not shared across DLL boundaries! If you use DLLs or any form of hot-reloading: you will need to call -// SetCurrentContext() (with the pointer you got from CreateContext) from each unique static/DLL boundary, and after each hot-reloading. -// In your debugger, add GImGui to your watch window and notice how its value changes depending on which location you are currently stepping into. -// 2) Important: Dear ImGui functions are not thread-safe because of this pointer. -// If you want thread-safety to allow N threads to access N different contexts, you can: -// - Change this variable to use thread local storage so each thread can refer to a different context, in imconfig.h: -// struct ImGuiContext; -// extern thread_local ImGuiContext* MyImGuiTLS; -// #define GImGui MyImGuiTLS -// And then define MyImGuiTLS in one of your cpp file. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword. -// - Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 -// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from different namespace. +// - ImGui::CreateContext() will automatically set this pointer if it is NULL. +// Change to a different context by calling ImGui::SetCurrentContext(). +// - Important: Dear ImGui functions are not thread-safe because of this pointer. +// If you want thread-safety to allow N threads to access N different contexts: +// - Change this variable to use thread local storage so each thread can refer to a different context, in your imconfig.h: +// struct ImGuiContext; +// extern thread_local ImGuiContext* MyImGuiTLS; +// #define GImGui MyImGuiTLS +// And then define MyImGuiTLS in one of your cpp file. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword. +// - Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 +// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from different namespace. +// - DLL users: read comments above. #ifndef GImGui ImGuiContext* GImGui = NULL; #endif // Memory Allocator functions. Use SetAllocatorFunctions() to change them. -// If you use DLL hotreloading you might need to call SetAllocatorFunctions() after reloading code from this file. -// Otherwise, you probably don't want to modify them mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction. +// - You probably don't want to modify those mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction. +// - DLL users: read comments above. #ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); } static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); } @@ -1113,23 +963,23 @@ static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_d static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; } static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); } #endif - -static void* (*GImAllocatorAllocFunc)(size_t size, void* user_data) = MallocWrapper; -static void (*GImAllocatorFreeFunc)(void* ptr, void* user_data) = FreeWrapper; -static void* GImAllocatorUserData = NULL; +static ImGuiMemAllocFunc GImAllocatorAllocFunc = MallocWrapper; +static ImGuiMemFreeFunc GImAllocatorFreeFunc = FreeWrapper; +static void* GImAllocatorUserData = NULL; //----------------------------------------------------------------------------- -// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) //----------------------------------------------------------------------------- ImGuiStyle::ImGuiStyle() { Alpha = 1.0f; // Global alpha applies to everything in ImGui WindowPadding = ImVec2(8,8); // Padding within a window - WindowRounding = 7.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows + WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. WindowMinSize = ImVec2(32,32); // Minimum window size WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text + WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows @@ -1139,23 +989,29 @@ ImGuiStyle::ImGuiStyle() FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) + CellPadding = ImVec2(4,2); // Padding within a table cell TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns - ScrollbarSize = 16.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar + ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar GrabMinSize = 10.0f; // Minimum width/height of a grab box for slider/scrollbar GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. TabBorderSize = 0.0f; // Thickness of border around tabs. + TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. - SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text when button is larger than text. - DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. + SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - AntiAliasedLines = true; // Enable anti-aliasing on lines/borders. Disable if you are really short on CPU/GPU. - AntiAliasedFill = true; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.) + AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. + AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering. + AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. // Default theme ImGui::StyleColorsDark(this); @@ -1174,6 +1030,7 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor) FrameRounding = ImFloor(FrameRounding * scale_factor); ItemSpacing = ImFloor(ItemSpacing * scale_factor); ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); + CellPadding = ImFloor(CellPadding * scale_factor); TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); IndentSpacing = ImFloor(IndentSpacing * scale_factor); ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); @@ -1181,7 +1038,9 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor) ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); GrabMinSize = ImFloor(GrabMinSize * scale_factor); GrabRounding = ImFloor(GrabRounding * scale_factor); + LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor); TabRounding = ImFloor(TabRounding * scale_factor); + TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); MouseCursorScale = ImFloor(MouseCursorScale * scale_factor); @@ -1191,12 +1050,13 @@ ImGuiIO::ImGuiIO() { // Most fields are initialized with zero memset(this, 0, sizeof(*this)); + IM_ASSERT(IM_ARRAYSIZE(ImGuiIO::MouseDown) == ImGuiMouseButton_COUNT && IM_ARRAYSIZE(ImGuiIO::MouseClicked) == ImGuiMouseButton_COUNT); // Our pre-C++11 IM_STATIC_ASSERT() macros triggers warning on modern compilers so we don't use it here. // Settings ConfigFlags = ImGuiConfigFlags_None; BackendFlags = ImGuiBackendFlags_None; DisplaySize = ImVec2(-1.0f, -1.0f); - DeltaTime = 1.0f/60.0f; + DeltaTime = 1.0f / 60.0f; IniSavingRate = 5.0f; IniFilename = "imgui.ini"; LogFilename = "imgui_log.txt"; @@ -1204,7 +1064,7 @@ ImGuiIO::ImGuiIO() MouseDoubleClickMaxDist = 6.0f; for (int i = 0; i < ImGuiKey_COUNT; i++) KeyMap[i] = -1; - KeyRepeatDelay = 0.250f; + KeyRepeatDelay = 0.275f; KeyRepeatRate = 0.050f; UserData = NULL; @@ -1224,6 +1084,7 @@ ImGuiIO::ImGuiIO() ConfigInputTextCursorBlink = true; ConfigWindowsResizeFromEdges = true; ConfigWindowsMoveFromTitleBarOnly = false; + ConfigMemoryCompactTimer = 60.0f; // Platform Functions BackendPlatformName = BackendRendererName = NULL; @@ -1234,10 +1095,6 @@ ImGuiIO::ImGuiIO() ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl; ImeWindowHandle = NULL; -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - RenderDrawListsFn = NULL; -#endif - // Input (NB: we already have memset zero the entire structure!) MousePos = ImVec2(-FLT_MAX, -FLT_MAX); MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); @@ -1250,9 +1107,39 @@ ImGuiIO::ImGuiIO() // Pass in translated ASCII characters for text input. // - with glfw you can get those from the callback set in glfwSetCharCallback() // - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message -void ImGuiIO::AddInputCharacter(ImWchar c) +void ImGuiIO::AddInputCharacter(unsigned int c) { - InputQueueCharacters.push_back(c); + if (c != 0) + InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID); +} + +// UTF16 strings use surrogate pairs to encode codepoints >= 0x10000, so +// we should save the high surrogate. +void ImGuiIO::AddInputCharacterUTF16(ImWchar16 c) +{ + if (c == 0 && InputQueueSurrogate == 0) + return; + + if ((c & 0xFC00) == 0xD800) // High surrogate, must save + { + if (InputQueueSurrogate != 0) + InputQueueCharacters.push_back(IM_UNICODE_CODEPOINT_INVALID); + InputQueueSurrogate = c; + return; + } + + ImWchar cp = c; + if (InputQueueSurrogate != 0) + { + if ((c & 0xFC00) != 0xDC00) // Invalid low surrogate + InputQueueCharacters.push_back(IM_UNICODE_CODEPOINT_INVALID); + else if (IM_UNICODE_CODEPOINT_MAX == (0xFFFF)) // Codepoint will not fit in ImWchar (extra parenthesis around 0xFFFF somehow fixes -Wunreachable-code with Clang) + cp = IM_UNICODE_CODEPOINT_INVALID; + else + cp = (ImWchar)(((InputQueueSurrogate - 0xD800) << 10) + (c - 0xDC00) + 0x10000); + InputQueueSurrogate = 0; + } + InputQueueCharacters.push_back(cp); } void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) @@ -1261,7 +1148,7 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) { unsigned int c = 0; utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL); - if (c > 0 && c <= 0xFFFF) + if (c != 0) InputQueueCharacters.push_back((ImWchar)c); } } @@ -1272,9 +1159,77 @@ void ImGuiIO::ClearInputCharacters() } //----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (Maths, String, Format, Hash, File functions) +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) //----------------------------------------------------------------------------- +ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments) +{ + IM_ASSERT(num_segments > 0); // Use ImBezierCubicClosestPointCasteljau() + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + { + ImVec2 p_current = ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + return p_closest; +} + +// Closely mimics PathBezierToCasteljau() in imgui_draw.cpp +static void ImBezierCubicClosestPointCasteljauStep(const ImVec2& p, ImVec2& p_closest, ImVec2& p_last, float& p_closest_dist2, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +{ + float dx = x4 - x1; + float dy = y4 - y1; + float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); + float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); + d2 = (d2 >= 0) ? d2 : -d2; + d3 = (d3 >= 0) ? d3 : -d3; + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) + { + ImVec2 p_current(x4, y4); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + else if (level < 10) + { + float x12 = (x1 + x2)*0.5f, y12 = (y1 + y2)*0.5f; + float x23 = (x2 + x3)*0.5f, y23 = (y2 + y3)*0.5f; + float x34 = (x3 + x4)*0.5f, y34 = (y3 + y4)*0.5f; + float x123 = (x12 + x23)*0.5f, y123 = (y12 + y23)*0.5f; + float x234 = (x23 + x34)*0.5f, y234 = (y23 + y34)*0.5f; + float x1234 = (x123 + x234)*0.5f, y1234 = (y123 + y234)*0.5f; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); + } +} + +// tess_tol is generally the same value you would find in ImGui::GetStyle().CurveTessellationTol +// Because those ImXXX functions are lower-level than ImGui:: we cannot access this value automatically. +ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol) +{ + IM_ASSERT(tess_tol > 0.0f); + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0); + return p_closest; +} + ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) { ImVec2 ap = p - a; @@ -1323,6 +1278,10 @@ ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, return proj_ca; } +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +//----------------------------------------------------------------------------- + // Consider using _stricmp/_strnicmp under Windows or strcasecmp/strncasecmp. We don't actually use either ImStricmp/ImStrnicmp in the codebase any more. int ImStricmp(const char* str1, const char* str2) { @@ -1376,7 +1335,7 @@ const char* ImStrchrRange(const char* str, const char* str_end, char c) int ImStrlenW(const ImWchar* str) { - //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bits + //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bit int n = 0; while (*str++) n++; return n; @@ -1434,15 +1393,25 @@ void ImStrTrimBlanks(char* buf) buf[p - p_start] = 0; // Zero terminate } +const char* ImStrSkipBlank(const char* str) +{ + while (str[0] == ' ' || str[0] == '\t') + str++; + return str; +} + // A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). // Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm. // B) When buf==NULL vsnprintf() will return the output size. -#ifndef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS +#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS -//#define IMGUI_USE_STB_SPRINTF +// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h) +// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are +// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) #ifdef IMGUI_USE_STB_SPRINTF #define STB_SPRINTF_IMPLEMENTATION -#include "imstb_sprintf.h" +#include "stb_sprintf.h" #endif #if defined(_MSC_VER) && !defined(vsnprintf) @@ -1481,7 +1450,7 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) buf[w] = 0; return w; } -#endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS +#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // CRC32 needs a 1KB lookup table (not cache friendly) // Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily: @@ -1509,7 +1478,7 @@ static const ImU32 GCrc32LookupTable[256] = // Known size hash // It is ok to call ImHashData on a string with known length but the ### operator won't be supported. // FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. -ImU32 ImHashData(const void* data_p, size_t data_size, ImU32 seed) +ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed) { ImU32 crc = ~seed; const unsigned char* data = (const unsigned char*)data_p; @@ -1525,7 +1494,7 @@ ImU32 ImHashData(const void* data_p, size_t data_size, ImU32 seed) // - If we reach ### in the string we discard the hash so far and reset to the seed. // - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build) // FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. -ImU32 ImHashStr(const char* data_p, size_t data_size, ImU32 seed) +ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed) { seed = ~seed; ImU32 crc = seed; @@ -1553,58 +1522,73 @@ ImU32 ImHashStr(const char* data_p, size_t data_size, ImU32 seed) return ~crc; } -FILE* ImFileOpen(const char* filename, const char* mode) +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (File functions) +//----------------------------------------------------------------------------- + +// Default file functions +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +ImFileHandle ImFileOpen(const char* filename, const char* mode) { -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__) - // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can) - const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1; - const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1; +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__) + // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. + // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! + const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); + const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); ImVector<ImWchar> buf; buf.resize(filename_wsize + mode_wsize); - ImTextStrFromUtf8(&buf[0], filename_wsize, filename, NULL); - ImTextStrFromUtf8(&buf[filename_wsize], mode_wsize, mode, NULL); - return _wfopen((wchar_t*)&buf[0], (wchar_t*)&buf[filename_wsize]); + ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); + return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); #else return fopen(filename, mode); #endif } -// Load file content into memory +// We should in theory be using fseeko()/ftello() with off_t and _fseeki64()/_ftelli64() with __int64, waiting for the PR that does that in a very portable pre-C++11 zero-warnings way. +bool ImFileClose(ImFileHandle f) { return fclose(f) == 0; } +ImU64 ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (ImU64)sz : (ImU64)-1; } +ImU64 ImFileRead(void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fread(data, (size_t)sz, (size_t)count, f); } +ImU64 ImFileWrite(const void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fwrite(data, (size_t)sz, (size_t)count, f); } +#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +// Helper: Load file content into memory // Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree() -void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size, int padding_bytes) +// This can't really be used with "rt" because fseek size won't match read size. +void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes) { - IM_ASSERT(filename && file_open_mode); + IM_ASSERT(filename && mode); if (out_file_size) *out_file_size = 0; - FILE* f; - if ((f = ImFileOpen(filename, file_open_mode)) == NULL) + ImFileHandle f; + if ((f = ImFileOpen(filename, mode)) == NULL) return NULL; - long file_size_signed; - if (fseek(f, 0, SEEK_END) || (file_size_signed = ftell(f)) == -1 || fseek(f, 0, SEEK_SET)) + size_t file_size = (size_t)ImFileGetSize(f); + if (file_size == (size_t)-1) { - fclose(f); + ImFileClose(f); return NULL; } - size_t file_size = (size_t)file_size_signed; void* file_data = IM_ALLOC(file_size + padding_bytes); if (file_data == NULL) { - fclose(f); + ImFileClose(f); return NULL; } - if (fread(file_data, 1, file_size, f) != file_size) + if (ImFileRead(file_data, 1, file_size, f) != file_size) { - fclose(f); + ImFileClose(f); IM_FREE(file_data); return NULL; } if (padding_bytes > 0) memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes); - fclose(f); + ImFileClose(f); if (out_file_size) *out_file_size = file_size; @@ -1615,79 +1599,72 @@ void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_ // [SECTION] MISC HELPERS/UTILITIES (ImText* functions) //----------------------------------------------------------------------------- -// Convert UTF-8 to 32-bits character, process single character input. -// Based on stb_from_utf8() from github.com/nothings/stb/ +// Convert UTF-8 to 32-bit character, process single character input. +// A nearly-branchless UTF-8 decoder, based on work of Christopher Wellons (https://github.com/skeeto/branchless-utf8). // We handle UTF-8 decoding error by skipping forward. int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end) { - unsigned int c = (unsigned int)-1; - const unsigned char* str = (const unsigned char*)in_text; - if (!(*str & 0x80)) + static const char lengths[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0 }; + static const int masks[] = { 0x00, 0x7f, 0x1f, 0x0f, 0x07 }; + static const uint32_t mins[] = { 0x400000, 0, 0x80, 0x800, 0x10000 }; + static const int shiftc[] = { 0, 18, 12, 6, 0 }; + static const int shifte[] = { 0, 6, 4, 2, 0 }; + int len = lengths[*(const unsigned char*)in_text >> 3]; + int wanted = len + !len; + + if (in_text_end == NULL) + in_text_end = in_text + wanted; // Max length, nulls will be taken into account. + + // Copy at most 'len' bytes, stop copying at 0 or past in_text_end. Branch predictor does a good job here, + // so it is fast even with excessive branching. + unsigned char s[4]; + s[0] = in_text + 0 < in_text_end ? in_text[0] : 0; + s[1] = in_text + 1 < in_text_end ? in_text[1] : 0; + s[2] = in_text + 2 < in_text_end ? in_text[2] : 0; + s[3] = in_text + 3 < in_text_end ? in_text[3] : 0; + + // Assume a four-byte character and load four bytes. Unused bits are shifted out. + *out_char = (uint32_t)(s[0] & masks[len]) << 18; + *out_char |= (uint32_t)(s[1] & 0x3f) << 12; + *out_char |= (uint32_t)(s[2] & 0x3f) << 6; + *out_char |= (uint32_t)(s[3] & 0x3f) << 0; + *out_char >>= shiftc[len]; + + // Accumulate the various error conditions. + int e = 0; + e = (*out_char < mins[len]) << 6; // non-canonical encoding + e |= ((*out_char >> 11) == 0x1b) << 7; // surrogate half? + e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range? + e |= (s[1] & 0xc0) >> 2; + e |= (s[2] & 0xc0) >> 4; + e |= (s[3] ) >> 6; + e ^= 0x2a; // top two bits of each tail byte correct? + e >>= shifte[len]; + + if (e) { - c = (unsigned int)(*str++); - *out_char = c; - return 1; + // No bytes are consumed when *in_text == 0 || in_text == in_text_end. + // One byte is consumed in case of invalid first byte of in_text. + // All available bytes (at most `len` bytes) are consumed on incomplete/invalid second to last bytes. + // Invalid or incomplete input may consume less bytes than wanted, therefore every byte has to be inspected in s. + wanted = ImMin(wanted, !!s[0] + !!s[1] + !!s[2] + !!s[3]); + *out_char = IM_UNICODE_CODEPOINT_INVALID; } - if ((*str & 0xe0) == 0xc0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 2) return 1; - if (*str < 0xc2) return 2; - c = (unsigned int)((*str++ & 0x1f) << 6); - if ((*str & 0xc0) != 0x80) return 2; - c += (*str++ & 0x3f); - *out_char = c; - return 2; - } - if ((*str & 0xf0) == 0xe0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 3) return 1; - if (*str == 0xe0 && (str[1] < 0xa0 || str[1] > 0xbf)) return 3; - if (*str == 0xed && str[1] > 0x9f) return 3; // str[1] < 0x80 is checked below - c = (unsigned int)((*str++ & 0x0f) << 12); - if ((*str & 0xc0) != 0x80) return 3; - c += (unsigned int)((*str++ & 0x3f) << 6); - if ((*str & 0xc0) != 0x80) return 3; - c += (*str++ & 0x3f); - *out_char = c; - return 3; - } - if ((*str & 0xf8) == 0xf0) - { - *out_char = 0xFFFD; // will be invalid but not end of string - if (in_text_end && in_text_end - (const char*)str < 4) return 1; - if (*str > 0xf4) return 4; - if (*str == 0xf0 && (str[1] < 0x90 || str[1] > 0xbf)) return 4; - if (*str == 0xf4 && str[1] > 0x8f) return 4; // str[1] < 0x80 is checked below - c = (unsigned int)((*str++ & 0x07) << 18); - if ((*str & 0xc0) != 0x80) return 4; - c += (unsigned int)((*str++ & 0x3f) << 12); - if ((*str & 0xc0) != 0x80) return 4; - c += (unsigned int)((*str++ & 0x3f) << 6); - if ((*str & 0xc0) != 0x80) return 4; - c += (*str++ & 0x3f); - // utf-8 encodings of values used in surrogate pairs are invalid - if ((c & 0xFFFFF800) == 0xD800) return 4; - *out_char = c; - return 4; - } - *out_char = 0; - return 0; + + return wanted; } int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining) { ImWchar* buf_out = buf; ImWchar* buf_end = buf + buf_size; - while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text) + while (buf_out < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) { unsigned int c; in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); if (c == 0) break; - if (c < 0x10000) // FIXME: Losing characters that don't fit in 2 bytes - *buf_out++ = (ImWchar)c; + *buf_out++ = (ImWchar)c; } *buf_out = 0; if (in_text_remaining) @@ -1704,8 +1681,7 @@ int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end) in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); if (c == 0) break; - if (c < 0x10000) - char_count++; + char_count++; } return char_count; } @@ -1725,11 +1701,15 @@ static inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c) buf[1] = (char)(0x80 + (c & 0x3f)); return 2; } - if (c >= 0xdc00 && c < 0xe000) + if (c < 0x10000) { - return 0; + if (buf_size < 3) return 0; + buf[0] = (char)(0xe0 + (c >> 12)); + buf[1] = (char)(0x80 + ((c >> 6) & 0x3f)); + buf[2] = (char)(0x80 + ((c ) & 0x3f)); + return 3; } - if (c >= 0xd800 && c < 0xdc00) + if (c <= 0x10FFFF) { if (buf_size < 4) return 0; buf[0] = (char)(0xf0 + (c >> 18)); @@ -1738,29 +1718,23 @@ static inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c) buf[3] = (char)(0x80 + ((c ) & 0x3f)); return 4; } - //else if (c < 0x10000) - { - if (buf_size < 3) return 0; - buf[0] = (char)(0xe0 + (c >> 12)); - buf[1] = (char)(0x80 + ((c>> 6) & 0x3f)); - buf[2] = (char)(0x80 + ((c ) & 0x3f)); - return 3; - } + // Invalid code point, the max unicode is 0x10FFFF + return 0; } // Not optimal but we very rarely use this function. int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end) { - unsigned int dummy = 0; - return ImTextCharFromUtf8(&dummy, in_text, in_text_end); + unsigned int unused = 0; + return ImTextCharFromUtf8(&unused, in_text, in_text_end); } static inline int ImTextCountUtf8BytesFromChar(unsigned int c) { if (c < 0x80) return 1; if (c < 0x800) return 2; - if (c >= 0xdc00 && c < 0xe000) return 0; - if (c >= 0xd800 && c < 0xdc00) return 4; + if (c < 0x10000) return 3; + if (c <= 0x10FFFF) return 4; return 3; } @@ -1768,13 +1742,13 @@ int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWch { char* buf_out = buf; const char* buf_end = buf + buf_size; - while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text) + while (buf_out < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) { unsigned int c = (unsigned int)(*in_text++); if (c < 0x80) *buf_out++ = (char)c; else - buf_out += ImTextCharToUtf8(buf_out, (int)(buf_end-buf_out-1), c); + buf_out += ImTextCharToUtf8(buf_out, (int)(buf_end - buf_out - 1), c); } *buf_out = 0; return (int)(buf_out - buf); @@ -1795,13 +1769,22 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e } //----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILTIES (Color functions) +// [SECTION] MISC HELPERS/UTILITIES (Color functions) // Note: The Convert functions are early design which are not consistent with other API. //----------------------------------------------------------------------------- +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b) +{ + float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; + int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); + int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); + int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); + return IM_COL32(r, g, b, 0xFF); +} + ImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in) { - float s = 1.0f/255.0f; + float s = 1.0f / 255.0f; return ImVec4( ((in >> IM_COL32_R_SHIFT) & 0xFF) * s, ((in >> IM_COL32_G_SHIFT) & 0xFF) * s, @@ -1852,7 +1835,7 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& return; } - h = ImFmod(h, 1.0f) / (60.0f/360.0f); + h = ImFmod(h, 1.0f) / (60.0f / 360.0f); int i = (int)h; float f = h - (float)i; float p = v * (1.0f - s); @@ -1870,53 +1853,21 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& } } -ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = style.Colors[idx]; - c.w *= style.Alpha * alpha_mul; - return ColorConvertFloat4ToU32(c); -} - -ImU32 ImGui::GetColorU32(const ImVec4& col) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = col; - c.w *= style.Alpha; - return ColorConvertFloat4ToU32(c); -} - -const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) -{ - ImGuiStyle& style = GImGui->Style; - return style.Colors[idx]; -} - -ImU32 ImGui::GetColorU32(ImU32 col) -{ - float style_alpha = GImGui->Style.Alpha; - if (style_alpha >= 1.0f) - return col; - ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; - a = (ImU32)(a * style_alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. - return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); -} - //----------------------------------------------------------------------------- // [SECTION] ImGuiStorage // Helper: Key->value storage //----------------------------------------------------------------------------- // std::lower_bound but without the bullshit -static ImGuiStorage::Pair* LowerBound(ImVector<ImGuiStorage::Pair>& data, ImGuiID key) +static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiStoragePair>& data, ImGuiID key) { - ImGuiStorage::Pair* first = data.Data; - ImGuiStorage::Pair* last = data.Data + data.Size; + ImGuiStorage::ImGuiStoragePair* first = data.Data; + ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size; size_t count = (size_t)(last - first); while (count > 0) { size_t count2 = count >> 1; - ImGuiStorage::Pair* mid = first + count2; + ImGuiStorage::ImGuiStoragePair* mid = first + count2; if (mid->key < key) { first = ++mid; @@ -1938,18 +1889,18 @@ void ImGuiStorage::BuildSortByKey() static int IMGUI_CDECL PairCompareByID(const void* lhs, const void* rhs) { // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. - if (((const Pair*)lhs)->key > ((const Pair*)rhs)->key) return +1; - if (((const Pair*)lhs)->key < ((const Pair*)rhs)->key) return -1; + if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; + if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1; return 0; } }; if (Data.Size > 1) - ImQsort(Data.Data, (size_t)Data.Size, sizeof(Pair), StaticFunc::PairCompareByID); + ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairCompareByID); } int ImGuiStorage::GetInt(ImGuiID key, int default_val) const { - ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); if (it == Data.end() || it->key != key) return default_val; return it->val_i; @@ -1962,7 +1913,7 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const { - ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); if (it == Data.end() || it->key != key) return default_val; return it->val_f; @@ -1970,7 +1921,7 @@ float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const void* ImGuiStorage::GetVoidPtr(ImGuiID key) const { - ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); if (it == Data.end() || it->key != key) return NULL; return it->val_p; @@ -1979,9 +1930,9 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const // References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); + it = Data.insert(it, ImGuiStoragePair(key, default_val)); return &it->val_i; } @@ -1992,27 +1943,27 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); + it = Data.insert(it, ImGuiStoragePair(key, default_val)); return &it->val_f; } void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - it = Data.insert(it, Pair(key, default_val)); + it = Data.insert(it, ImGuiStoragePair(key, default_val)); return &it->val_p; } // FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) void ImGuiStorage::SetInt(ImGuiID key, int val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) { - Data.insert(it, Pair(key, val)); + Data.insert(it, ImGuiStoragePair(key, val)); return; } it->val_i = val; @@ -2025,10 +1976,10 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val) void ImGuiStorage::SetFloat(ImGuiID key, float val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) { - Data.insert(it, Pair(key, val)); + Data.insert(it, ImGuiStoragePair(key, val)); return; } it->val_f = val; @@ -2036,10 +1987,10 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val) void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) { - ImGuiStorage::Pair* it = LowerBound(Data, key); + ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) { - Data.insert(it, Pair(key, val)); + Data.insert(it, ImGuiStoragePair(key, val)); return; } it->val_p = val; @@ -2080,7 +2031,7 @@ bool ImGuiTextFilter::Draw(const char* label, float width) return value_changed; } -void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out) const +void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector<ImGuiTextRange>* out) const { out->resize(0); const char* wb = b; @@ -2089,25 +2040,25 @@ void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out) { if (*we == separator) { - out->push_back(TextRange(wb, we)); + out->push_back(ImGuiTextRange(wb, we)); wb = we + 1; } we++; } if (wb != we) - out->push_back(TextRange(wb, we)); + out->push_back(ImGuiTextRange(wb, we)); } void ImGuiTextFilter::Build() { Filters.resize(0); - TextRange input_range(InputBuf, InputBuf+strlen(InputBuf)); + ImGuiTextRange input_range(InputBuf, InputBuf + strlen(InputBuf)); input_range.split(',', &Filters); CountGrep = 0; for (int i = 0; i != Filters.Size; i++) { - TextRange& f = Filters[i]; + ImGuiTextRange& f = Filters[i]; while (f.b < f.e && ImCharIsBlankA(f.b[0])) f.b++; while (f.e > f.b && ImCharIsBlankA(f.e[-1])) @@ -2129,19 +2080,19 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const for (int i = 0; i != Filters.Size; i++) { - const TextRange& f = Filters[i]; + const ImGuiTextRange& f = Filters[i]; if (f.empty()) continue; if (f.b[0] == '-') { // Subtract - if (ImStristr(text, text_end, f.begin()+1, f.end()) != NULL) + if (ImStristr(text, text_end, f.b + 1, f.e) != NULL) return false; } else { // Grep - if (ImStristr(text, text_end, f.begin(), f.end()) != NULL) + if (ImStristr(text, text_end, f.b, f.e) != NULL) return true; } } @@ -2224,93 +2175,464 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) //----------------------------------------------------------------------------- // [SECTION] ImGuiListClipper -// This is currently not as flexible/powerful as it should be, needs some rework (see TODO) +// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed +// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) //----------------------------------------------------------------------------- -static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height) +// FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. +// The problem we have is that without a Begin/End scheme for rows using the clipper is ambiguous. +static bool GetSkipItemForListClipping() +{ + ImGuiContext& g = *GImGui; + return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); +} + +// Helper to calculate coarse clipping of large list of evenly sized items. +// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern. +// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX +void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.LogEnabled) + { + // If logging is active, do not perform any clipping + *out_items_display_start = 0; + *out_items_display_end = items_count; + return; + } + if (GetSkipItemForListClipping()) + { + *out_items_display_start = *out_items_display_end = 0; + return; + } + + // We create the union of the ClipRect and the NavScoringRect which at worst should be 1 page away from ClipRect + ImRect unclipped_rect = window->ClipRect; + if (g.NavMoveRequest) + unclipped_rect.Add(g.NavScoringRect); + if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) + unclipped_rect.Add(ImRect(window->Pos + window->NavRectRel[0].Min, window->Pos + window->NavRectRel[0].Max)); + + const ImVec2 pos = window->DC.CursorPos; + int start = (int)((unclipped_rect.Min.y - pos.y) / items_height); + int end = (int)((unclipped_rect.Max.y - pos.y) / items_height); + + // When performing a navigation request, ensure we have one item extra in the direction we are moving to + if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Up) + start--; + if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Down) + end++; + + start = ImClamp(start, 0, items_count); + end = ImClamp(end + 1, start, items_count); + *out_items_display_start = start; + *out_items_display_end = end; +} + +static void SetCursorPosYAndSetupForPrevLine(float pos_y, float line_height) { // Set cursor position and a few other things so that SetScrollHereY() and Columns() can work when seeking cursor. // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. // The clipper should probably have a 4th step to display the last item in a regular manner. - ImGui::SetCursorPosY(pos_y); - ImGuiWindow* window = ImGui::GetCurrentWindow(); - window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage. - window->DC.PrevLineSize.y = (line_height - GImGui->Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. - if (window->DC.CurrentColumns) - window->DC.CurrentColumns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float off_y = pos_y - window->DC.CursorPos.y; + window->DC.CursorPos.y = pos_y; + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y); + window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage. + window->DC.PrevLineSize.y = (line_height - g.Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. + if (ImGuiOldColumns* columns = window->DC.CurrentColumns) + columns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly + if (ImGuiTable* table = g.CurrentTable) + { + if (table->IsInsideRow) + ImGui::TableEndRow(table); + table->RowPosY2 = window->DC.CursorPos.y; + const int row_increase = (int)((off_y / line_height) + 0.5f); + //table->CurrentRow += row_increase; // Can't do without fixing TableEndRow() + table->RowBgColorCounter += row_increase; + } } -// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1 +ImGuiListClipper::ImGuiListClipper() +{ + memset(this, 0, sizeof(*this)); + ItemsCount = -1; +} + +ImGuiListClipper::~ImGuiListClipper() +{ + IM_ASSERT(ItemsCount == -1 && "Forgot to call End(), or to Step() until false?"); +} + +// Use case A: Begin() called from constructor with items_height<0, then called again from Step() in StepNo 1 // Use case B: Begin() called from constructor with items_height>0 // FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style. -void ImGuiListClipper::Begin(int count, float items_height) +void ImGuiListClipper::Begin(int items_count, float items_height) { - StartPosY = ImGui::GetCursorPosY(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (ImGuiTable* table = g.CurrentTable) + if (table->IsInsideRow) + ImGui::TableEndRow(table); + + StartPosY = window->DC.CursorPos.y; ItemsHeight = items_height; - ItemsCount = count; + ItemsCount = items_count; + ItemsFrozen = 0; StepNo = 0; - DisplayEnd = DisplayStart = -1; - if (ItemsHeight > 0.0f) - { - ImGui::CalcListClipping(ItemsCount, ItemsHeight, &DisplayStart, &DisplayEnd); // calculate how many to clip/display - if (DisplayStart > 0) - SetCursorPosYAndSetupDummyPrevLine(StartPosY + DisplayStart * ItemsHeight, ItemsHeight); // advance cursor - StepNo = 2; - } + DisplayStart = -1; + DisplayEnd = 0; } void ImGuiListClipper::End() { - if (ItemsCount < 0) + if (ItemsCount < 0) // Already ended return; + // In theory here we should assert that ImGui::GetCursorPosY() == StartPosY + DisplayEnd * ItemsHeight, but it feels saner to just seek at the end and not assert/crash the user. - if (ItemsCount < INT_MAX) - SetCursorPosYAndSetupDummyPrevLine(StartPosY + ItemsCount * ItemsHeight, ItemsHeight); // advance cursor + if (ItemsCount < INT_MAX && DisplayStart >= 0) + SetCursorPosYAndSetupForPrevLine(StartPosY + (ItemsCount - ItemsFrozen) * ItemsHeight, ItemsHeight); ItemsCount = -1; StepNo = 3; } bool ImGuiListClipper::Step() { - if (ItemsCount == 0 || ImGui::GetCurrentWindowRead()->SkipItems) + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImGuiTable* table = g.CurrentTable; + if (table && table->IsInsideRow) + ImGui::TableEndRow(table); + + // No items + if (ItemsCount == 0 || GetSkipItemForListClipping()) { + End(); + return false; + } + + // Step 0: Let you process the first element (regardless of it being visible or not, so we can measure the element height) + if (StepNo == 0) + { + // While we are in frozen row state, keep displaying items one by one, unclipped + // FIXME: Could be stored as a table-agnostic state. + if (table != NULL && !table->IsUnfrozenRows) + { + DisplayStart = ItemsFrozen; + DisplayEnd = ItemsFrozen + 1; + ItemsFrozen++; + return true; + } + + StartPosY = window->DC.CursorPos.y; + if (ItemsHeight <= 0.0f) + { + // Submit the first item so we can measure its height (generally it is 0..1) + DisplayStart = ItemsFrozen; + DisplayEnd = ItemsFrozen + 1; + StepNo = 1; + return true; + } + + // Already has item height (given by user in Begin): skip to calculating step + DisplayStart = DisplayEnd; + StepNo = 2; + } + + // Step 1: the clipper infer height from first element + if (StepNo == 1) + { + IM_ASSERT(ItemsHeight <= 0.0f); + if (table) + { + const float pos_y1 = table->RowPosY1; // Using this instead of StartPosY to handle clipper straddling the frozen row + const float pos_y2 = table->RowPosY2; // Using this instead of CursorPos.y to take account of tallest cell. + ItemsHeight = pos_y2 - pos_y1; + window->DC.CursorPos.y = pos_y2; + } + else + { + ItemsHeight = window->DC.CursorPos.y - StartPosY; + } + IM_ASSERT(ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); + StepNo = 2; + } + + // Reached end of list + if (DisplayEnd >= ItemsCount) + { + End(); + return false; + } + + // Step 2: calculate the actual range of elements to display, and position the cursor before the first element + if (StepNo == 2) + { + IM_ASSERT(ItemsHeight > 0.0f); + + int already_submitted = DisplayEnd; + ImGui::CalcListClipping(ItemsCount - already_submitted, ItemsHeight, &DisplayStart, &DisplayEnd); + DisplayStart += already_submitted; + DisplayEnd += already_submitted; + + // Seek cursor + if (DisplayStart > already_submitted) + SetCursorPosYAndSetupForPrevLine(StartPosY + (DisplayStart - ItemsFrozen) * ItemsHeight, ItemsHeight); + + StepNo = 3; + return true; + } + + // Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), + // Advance the cursor to the end of the list and then returns 'false' to end the loop. + if (StepNo == 3) + { + // Seek cursor + if (ItemsCount < INT_MAX) + SetCursorPosYAndSetupForPrevLine(StartPosY + (ItemsCount - ItemsFrozen) * ItemsHeight, ItemsHeight); // advance cursor ItemsCount = -1; return false; } - if (StepNo == 0) // Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height. - { - DisplayStart = 0; - DisplayEnd = 1; - StartPosY = ImGui::GetCursorPosY(); - StepNo = 1; - return true; - } - if (StepNo == 1) // Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element. - { - if (ItemsCount == 1) { ItemsCount = -1; return false; } - float items_height = ImGui::GetCursorPosY() - StartPosY; - IM_ASSERT(items_height > 0.0f); // If this triggers, it means Item 0 hasn't moved the cursor vertically - Begin(ItemsCount-1, items_height); - DisplayStart++; - DisplayEnd++; - StepNo = 3; - return true; - } - if (StepNo == 2) // Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user still call Step(). Does nothing and switch to Step 3. - { - IM_ASSERT(DisplayStart >= 0 && DisplayEnd >= 0); - StepNo = 3; - return true; - } - if (StepNo == 3) // Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop. - End(); + + IM_ASSERT(0); return false; } +//----------------------------------------------------------------------------- +// [SECTION] STYLING +//----------------------------------------------------------------------------- + +ImGuiStyle& ImGui::GetStyle() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + return GImGui->Style; +} + +ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = style.Colors[idx]; + c.w *= style.Alpha * alpha_mul; + return ColorConvertFloat4ToU32(c); +} + +ImU32 ImGui::GetColorU32(const ImVec4& col) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = col; + c.w *= style.Alpha; + return ColorConvertFloat4ToU32(c); +} + +const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) +{ + ImGuiStyle& style = GImGui->Style; + return style.Colors[idx]; +} + +ImU32 ImGui::GetColorU32(ImU32 col) +{ + ImGuiStyle& style = GImGui->Style; + if (style.Alpha >= 1.0f) + return col; + ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; + a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. + return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); +} + +// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 +void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); +} + +void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = col; +} + +void ImGui::PopStyleColor(int count) +{ + ImGuiContext& g = *GImGui; + while (count > 0) + { + ImGuiColorMod& backup = g.ColorStack.back(); + g.Style.Colors[backup.Col] = backup.BackupValue; + g.ColorStack.pop_back(); + count--; + } +} + +struct ImGuiStyleVarInfo +{ + ImGuiDataType Type; + ImU32 Count; + ImU32 Offset; + void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); } +}; + +static const ImGuiStyleVarInfo GStyleVarInfo[] = +{ + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign +}; + +static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx) +{ + IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT); + IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT); + return &GStyleVarInfo[idx]; +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) +{ + const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) + { + ImGuiContext& g = *GImGui; + float* pvar = (float*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!"); +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) +{ + const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2) + { + ImGuiContext& g = *GImGui; + ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!"); +} + +void ImGui::PopStyleVar(int count) +{ + ImGuiContext& g = *GImGui; + while (count > 0) + { + // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it. + ImGuiStyleMod& backup = g.StyleVarStack.back(); + const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx); + void* data = info->GetVarPtr(&g.Style); + if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; } + else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; } + g.StyleVarStack.pop_back(); + count--; + } +} + +const char* ImGui::GetStyleColorName(ImGuiCol idx) +{ + // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; + switch (idx) + { + case ImGuiCol_Text: return "Text"; + case ImGuiCol_TextDisabled: return "TextDisabled"; + case ImGuiCol_WindowBg: return "WindowBg"; + case ImGuiCol_ChildBg: return "ChildBg"; + case ImGuiCol_PopupBg: return "PopupBg"; + case ImGuiCol_Border: return "Border"; + case ImGuiCol_BorderShadow: return "BorderShadow"; + case ImGuiCol_FrameBg: return "FrameBg"; + case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; + case ImGuiCol_FrameBgActive: return "FrameBgActive"; + case ImGuiCol_TitleBg: return "TitleBg"; + case ImGuiCol_TitleBgActive: return "TitleBgActive"; + case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; + case ImGuiCol_MenuBarBg: return "MenuBarBg"; + case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; + case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; + case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; + case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; + case ImGuiCol_CheckMark: return "CheckMark"; + case ImGuiCol_SliderGrab: return "SliderGrab"; + case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; + case ImGuiCol_Button: return "Button"; + case ImGuiCol_ButtonHovered: return "ButtonHovered"; + case ImGuiCol_ButtonActive: return "ButtonActive"; + case ImGuiCol_Header: return "Header"; + case ImGuiCol_HeaderHovered: return "HeaderHovered"; + case ImGuiCol_HeaderActive: return "HeaderActive"; + case ImGuiCol_Separator: return "Separator"; + case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; + case ImGuiCol_SeparatorActive: return "SeparatorActive"; + case ImGuiCol_ResizeGrip: return "ResizeGrip"; + case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; + case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; + case ImGuiCol_Tab: return "Tab"; + case ImGuiCol_TabHovered: return "TabHovered"; + case ImGuiCol_TabActive: return "TabActive"; + case ImGuiCol_TabUnfocused: return "TabUnfocused"; + case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive"; + case ImGuiCol_PlotLines: return "PlotLines"; + case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; + case ImGuiCol_PlotHistogram: return "PlotHistogram"; + case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; + case ImGuiCol_TableHeaderBg: return "TableHeaderBg"; + case ImGuiCol_TableBorderStrong: return "TableBorderStrong"; + case ImGuiCol_TableBorderLight: return "TableBorderLight"; + case ImGuiCol_TableRowBg: return "TableRowBg"; + case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt"; + case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; + case ImGuiCol_DragDropTarget: return "DragDropTarget"; + case ImGuiCol_NavHighlight: return "NavHighlight"; + case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight"; + case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg"; + case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg"; + } + IM_ASSERT(0); + return "Unknown"; +} + + //----------------------------------------------------------------------------- // [SECTION] RENDER HELPERS -// Those (internal) functions are currently quite a legacy mess - their signature and behavior will change. -// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: state. +// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change, +// we need a nicer separation between low-level functions and high-level functions relying on the ImGui context. +// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: context. //----------------------------------------------------------------------------- const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end) @@ -2413,6 +2735,87 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons LogRenderedText(&pos_min, text, text_display_end); } + +// Another overly complex function until we reorganize everything into a nice all-in-one helper. +// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display. +// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move. +void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known) +{ + ImGuiContext& g = *GImGui; + if (text_end_full == NULL) + text_end_full = FindRenderedTextEnd(text); + const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f); + + //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255)); + //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255)); + //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255)); + // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels. + if (text_size.x > pos_max.x - pos_min.x) + { + // Hello wo... + // | | | + // min max ellipsis_max + // <-> this is generally some padding value + + const ImFont* font = draw_list->_Data->Font; + const float font_size = draw_list->_Data->FontSize; + const char* text_end_ellipsis = NULL; + + ImWchar ellipsis_char = font->EllipsisChar; + int ellipsis_char_count = 1; + if (ellipsis_char == (ImWchar)-1) + { + ellipsis_char = (ImWchar)'.'; + ellipsis_char_count = 3; + } + const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char); + + float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side + float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis + + if (ellipsis_char_count > 1) + { + // Full ellipsis size without free spacing after it. + const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize); + ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots; + ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots; + } + + // We can now claim the space between pos_max.x and ellipsis_max.x + const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f); + float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x; + if (text == text_end_ellipsis && text_end_ellipsis < text_end_full) + { + // Always display at least 1 character if there's no room for character + ellipsis + text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full); + text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x; + } + while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1])) + { + // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text) + text_end_ellipsis--; + text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte + } + + // Render text, render ellipsis + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); + float ellipsis_x = pos_min.x + text_size_clipped_x; + if (ellipsis_x + ellipsis_total_width <= ellipsis_max_x) + for (int i = 0; i < ellipsis_char_count; i++) + { + font->RenderChar(draw_list, font_size, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_char); + ellipsis_x += ellipsis_glyph_width; + } + } + else + { + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_full, &text_size, ImVec2(0.0f, 0.0f)); + } + + if (g.LogEnabled) + LogRenderedText(&pos_min, text, text_end_full); +} + // Render a rectangle shaped with optional rounding and borders void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding) { @@ -2422,8 +2825,8 @@ void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, const float border_size = g.Style.FrameBorderSize; if (border && border_size > 0.0f) { - window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size); + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); } } @@ -2434,71 +2837,11 @@ void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding) const float border_size = g.Style.FrameBorderSize; if (border_size > 0.0f) { - window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size); + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); } } -// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state -void ImGui::RenderArrow(ImVec2 p_min, ImGuiDir dir, float scale) -{ - ImGuiContext& g = *GImGui; - - const float h = g.FontSize * 1.00f; - float r = h * 0.40f * scale; - ImVec2 center = p_min + ImVec2(h * 0.50f, h * 0.50f * scale); - - ImVec2 a, b, c; - switch (dir) - { - case ImGuiDir_Up: - case ImGuiDir_Down: - if (dir == ImGuiDir_Up) r = -r; - a = ImVec2(+0.000f,+0.750f) * r; - b = ImVec2(-0.866f,-0.750f) * r; - c = ImVec2(+0.866f,-0.750f) * r; - break; - case ImGuiDir_Left: - case ImGuiDir_Right: - if (dir == ImGuiDir_Left) r = -r; - a = ImVec2(+0.750f,+0.000f) * r; - b = ImVec2(-0.750f,+0.866f) * r; - c = ImVec2(-0.750f,-0.866f) * r; - break; - case ImGuiDir_None: - case ImGuiDir_COUNT: - IM_ASSERT(0); - break; - } - - g.CurrentWindow->DrawList->AddTriangleFilled(center + a, center + b, center + c, GetColorU32(ImGuiCol_Text)); -} - -void ImGui::RenderBullet(ImVec2 pos) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - window->DrawList->AddCircleFilled(pos, g.FontSize*0.20f, GetColorU32(ImGuiCol_Text), 8); -} - -void ImGui::RenderCheckMark(ImVec2 pos, ImU32 col, float sz) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - float thickness = ImMax(sz / 5.0f, 1.0f); - sz -= thickness*0.5f; - pos += ImVec2(thickness*0.25f, thickness*0.25f); - - float third = sz / 3.0f; - float bx = pos.x + third; - float by = pos.y + sz - third*0.5f; - window->DrawList->PathLineTo(ImVec2(bx - third, by - third)); - window->DrawList->PathLineTo(ImVec2(bx, by)); - window->DrawList->PathLineTo(ImVec2(bx + third*2, by - third*2)); - window->DrawList->PathStroke(col, false, thickness); -} - void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags) { ImGuiContext& g = *GImGui; @@ -2517,17 +2860,17 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl { const float THICKNESS = 2.0f; const float DISTANCE = 3.0f + THICKNESS * 0.5f; - display_rect.Expand(ImVec2(DISTANCE,DISTANCE)); + display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); bool fully_visible = window->ClipRect.Contains(display_rect); if (!fully_visible) window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); - window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), display_rect.Max - ImVec2(THICKNESS*0.5f,THICKNESS*0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, ImDrawCornerFlags_All, THICKNESS); + window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); if (!fully_visible) window->DrawList->PopClipRect(); } if (flags & ImGuiNavHighlightFlags_TypeThin) { - window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, ~0, 1.0f); + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); } } @@ -2536,63 +2879,27 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl //----------------------------------------------------------------------------- // ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods -ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) - : DrawListInst(&context->DrawListSharedData) +ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst(NULL) { + memset(this, 0, sizeof(*this)); Name = ImStrdup(name); + NameBufLen = (int)strlen(name) + 1; ID = ImHashStr(name); IDStack.push_back(ID); - Flags = ImGuiWindowFlags_None; - Pos = ImVec2(0.0f, 0.0f); - Size = SizeFull = ImVec2(0.0f, 0.0f); - SizeContents = SizeContentsExplicit = ImVec2(0.0f, 0.0f); - WindowPadding = ImVec2(0.0f, 0.0f); - WindowRounding = 0.0f; - WindowBorderSize = 0.0f; - NameBufLen = (int)strlen(name) + 1; MoveId = GetID("#MOVE"); - ChildId = 0; - Scroll = ImVec2(0.0f, 0.0f); ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f); - ScrollbarSizes = ImVec2(0.0f, 0.0f); - ScrollbarX = ScrollbarY = false; - Active = WasActive = false; - WriteAccessed = false; - Collapsed = false; - WantCollapseToggle = false; - SkipItems = false; - Appearing = false; - Hidden = false; - HasCloseButton = false; - ResizeBorderHeld = -1; - BeginCount = 0; - BeginOrderWithinParent = -1; - BeginOrderWithinContext = -1; - PopupId = 0; AutoFitFramesX = AutoFitFramesY = -1; - AutoFitOnlyGrows = false; - AutoFitChildAxises = 0x00; AutoPosLastDirection = ImGuiDir_None; - HiddenFramesCanSkipItems = HiddenFramesCannotSkipItems = 0; SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX); - LastFrameActive = -1; - ItemWidthDefault = 0.0f; + LastTimeActive = -1.0f; FontWindowScale = 1.0f; - SettingsIdx = -1; - + SettingsOffset = -1; DrawList = &DrawListInst; + DrawList->_Data = &context->DrawListSharedData; DrawList->_OwnerName = Name; - ParentWindow = NULL; - RootWindow = NULL; - RootWindowForTitleBarHighlight = NULL; - RootWindowForNav = NULL; - - NavLastIds[0] = NavLastIds[1] = 0; - NavRectRel[0] = NavRectRel[1] = ImRect(); - NavLastChildNavWindow = NULL; } ImGuiWindow::~ImGuiWindow() @@ -2600,7 +2907,7 @@ ImGuiWindow::~ImGuiWindow() IM_ASSERT(DrawList == &DrawListInst); IM_DELETE(Name); for (int i = 0; i != ColumnsStorage.Size; i++) - ColumnsStorage[i].~ImGuiColumns(); + ColumnsStorage[i].~ImGuiOldColumns(); } ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) @@ -2608,6 +2915,10 @@ ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) ImGuiID seed = IDStack.back(); ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); ImGui::KeepAliveID(id); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO2(id, ImGuiDataType_String, str, str_end); +#endif return id; } @@ -2616,19 +2927,56 @@ ImGuiID ImGuiWindow::GetID(const void* ptr) ImGuiID seed = IDStack.back(); ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); ImGui::KeepAliveID(id); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO(id, ImGuiDataType_Pointer, ptr); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetID(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); + ImGui::KeepAliveID(id); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO(id, ImGuiDataType_S32, (intptr_t)n); +#endif return id; } ImGuiID ImGuiWindow::GetIDNoKeepAlive(const char* str, const char* str_end) { ImGuiID seed = IDStack.back(); - return ImHashStr(str, str_end ? (str_end - str) : 0, seed); + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO2(id, ImGuiDataType_String, str, str_end); +#endif + return id; } ImGuiID ImGuiWindow::GetIDNoKeepAlive(const void* ptr) { ImGuiID seed = IDStack.back(); - return ImHashData(&ptr, sizeof(void*), seed); + ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO(id, ImGuiDataType_Pointer, ptr); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetIDNoKeepAlive(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO(id, ImGuiDataType_S32, (intptr_t)n); +#endif + return id; } // This is only used in rare/specific situations to manufacture an ID out of nowhere. @@ -2645,27 +2993,43 @@ static void SetCurrentWindow(ImGuiWindow* window) { ImGuiContext& g = *GImGui; g.CurrentWindow = window; + g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; if (window) g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); } -void ImGui::SetNavID(ImGuiID id, int nav_layer) +void ImGui::GcCompactTransientMiscBuffers() { ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavWindow); - IM_ASSERT(nav_layer == 0 || nav_layer == 1); - g.NavId = id; - g.NavWindow->NavLastIds[nav_layer] = id; + g.ItemFlagsStack.clear(); + g.GroupStack.clear(); + TableGcCompactSettings(); } -void ImGui::SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel) +// Free up/compact internal window buffers, we can use this when a window becomes unused. +// Not freed: +// - ImGuiWindow, ImGuiWindowSettings, Name, StateStorage, ColumnsStorage (may hold useful data) +// This should have no noticeable visual effect. When the window reappear however, expect new allocation/buffer growth/copy cost. +void ImGui::GcCompactTransientWindowBuffers(ImGuiWindow* window) { - ImGuiContext& g = *GImGui; - SetNavID(id, nav_layer); - g.NavWindow->NavRectRel[nav_layer] = rect_rel; - g.NavMousePosDirty = true; - g.NavDisableHighlight = false; - g.NavDisableMouseHover = true; + window->MemoryCompacted = true; + window->MemoryDrawListIdxCapacity = window->DrawList->IdxBuffer.Capacity; + window->MemoryDrawListVtxCapacity = window->DrawList->VtxBuffer.Capacity; + window->IDStack.clear(); + window->DrawList->_ClearFreeMemory(); + window->DC.ChildWindows.clear(); + window->DC.ItemWidthStack.clear(); + window->DC.TextWrapPosStack.clear(); +} + +void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window) +{ + // We stored capacity of the ImDrawList buffer to reduce growth-caused allocation/copy when awakening. + // The other buffers tends to amortize much faster. + window->MemoryCompacted = false; + window->DrawList->IdxBuffer.reserve(window->MemoryDrawListIdxCapacity); + window->DrawList->VtxBuffer.reserve(window->MemoryDrawListVtxCapacity); + window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0; } void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) @@ -2675,8 +3039,9 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) if (g.ActiveIdIsJustActivated) { g.ActiveIdTimer = 0.0f; - g.ActiveIdHasBeenPressed = false; - g.ActiveIdHasBeenEdited = false; + g.ActiveIdHasBeenPressedBefore = false; + g.ActiveIdHasBeenEditedBefore = false; + g.ActiveIdMouseButton = -1; if (id != 0) { g.LastActiveId = id; @@ -2684,43 +3049,27 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) } } g.ActiveId = id; - g.ActiveIdAllowNavDirFlags = 0; - g.ActiveIdBlockNavInputFlags = 0; g.ActiveIdAllowOverlap = false; + g.ActiveIdNoClearOnFocusLoss = false; g.ActiveIdWindow = window; + g.ActiveIdHasBeenEditedThisFrame = false; if (id) { g.ActiveIdIsAlive = id; g.ActiveIdSource = (g.NavActivateId == id || g.NavInputId == id || g.NavJustTabbedId == id || g.NavJustMovedToId == id) ? ImGuiInputSource_Nav : ImGuiInputSource_Mouse; } -} -// FIXME-NAV: The existence of SetNavID/SetNavIDWithRectRel/SetFocusID is incredibly messy and confusing and needs some explanation or refactoring. -void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(id != 0); - - // Assume that SetFocusID() is called in the context where its NavLayer is the current layer, which is the case everywhere we call it. - const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; - if (g.NavWindow != window) - g.NavInitRequest = false; - g.NavId = id; - g.NavWindow = window; - g.NavLayer = nav_layer; - window->NavLastIds[nav_layer] = id; - if (window->DC.LastItemId == id) - window->NavRectRel[nav_layer] = ImRect(window->DC.LastItemRect.Min - window->Pos, window->DC.LastItemRect.Max - window->Pos); - - if (g.ActiveIdSource == ImGuiInputSource_Nav) - g.NavDisableMouseHover = true; - else - g.NavDisableHighlight = true; + // Clear declaration of inputs claimed by the widget + // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet) + g.ActiveIdUsingMouseWheel = false; + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingNavInputMask = 0x00; + g.ActiveIdUsingKeyInputMask = 0x00; } void ImGui::ClearActiveID() { - SetActiveID(0, NULL); + SetActiveID(0, NULL); // g.ActiveId = 0; } void ImGui::SetHoveredID(ImGuiID id) @@ -2728,6 +3077,7 @@ void ImGui::SetHoveredID(ImGuiID id) ImGuiContext& g = *GImGui; g.HoveredId = id; g.HoveredIdAllowOverlap = false; + g.HoveredIdUsingMouseWheel = false; if (id != 0 && g.HoveredIdPreviousFrame != id) g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f; } @@ -2755,7 +3105,8 @@ void ImGui::MarkItemEdited(ImGuiID id) IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive); IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out. //IM_ASSERT(g.CurrentWindow->DC.LastItemId == id); - g.ActiveIdHasBeenEdited = true; + g.ActiveIdHasBeenEditedThisFrame = true; + g.ActiveIdHasBeenEditedBefore = true; g.CurrentWindow->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited; } @@ -2775,83 +3126,6 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFla if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup)) return false; } - - return true; -} - -// Advance cursor given item size for layout. -void ImGui::ItemSize(const ImVec2& size, float text_offset_y) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - // Always align ourselves on pixel boundaries - const float line_height = ImMax(window->DC.CurrentLineSize.y, size.y); - const float text_base_offset = ImMax(window->DC.CurrentLineTextBaseOffset, text_offset_y); - //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] - window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y); - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - window->DC.CursorPos.y = (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y); - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); - //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] - - window->DC.PrevLineSize.y = line_height; - window->DC.PrevLineTextBaseOffset = text_base_offset; - window->DC.CurrentLineSize.y = window->DC.CurrentLineTextBaseOffset = 0.0f; - - // Horizontal layout mode - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - SameLine(); -} - -void ImGui::ItemSize(const ImRect& bb, float text_offset_y) -{ - ItemSize(bb.GetSize(), text_offset_y); -} - -// Declare item bounding box for clipping and interaction. -// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface -// declare their minimum size requirement to ItemSize() and then use a larger region for drawing/interaction, which is passed to ItemAdd(). -bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (id != 0) - { - // Navigation processing runs prior to clipping early-out - // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget - // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests unfortunately, but it is still limited to one window. - // it may not scale very well for windows with ten of thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. - // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick) - window->DC.NavLayerActiveMaskNext |= window->DC.NavLayerCurrentMask; - if ((g.NavId == id || g.NavAnyRequest) && g.NavWindow != nullptr && window != nullptr) - if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) - if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) - NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id); - } - - window->DC.LastItemId = id; - window->DC.LastItemRect = bb; - window->DC.LastItemStatusFlags = ImGuiItemStatusFlags_None; - -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (id != 0) - IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id); -#endif - - // Clipping test - const bool is_clipped = IsClippedEx(bb, id, false); - if (is_clipped) - return false; - //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] - - // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) - if (IsMouseHoveringRect(bb.Min, bb.Max)) - window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HoveredRect; return true; } @@ -2866,20 +3140,22 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) return IsItemFocused(); // Test for bounding box overlap, as updated as ItemAdd() - if (!(window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HoveredRect)) + ImGuiItemStatusFlags status_flags = window->DC.LastItemStatusFlags; + if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) return false; IM_ASSERT((flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows)) == 0); // Flags not supported by this function // Test if we are hovering the right window (our window could be behind another window) - // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable to use IsItemHovered() after EndChild() itself. - // Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was the test that has been running for a long while. - //if (g.HoveredWindow != window) - // return false; - if (g.HoveredRootWindow != window->RootWindow && !(flags & ImGuiHoveredFlags_AllowWhenOverlapped)) - return false; + // [2021/03/02] Reworked / reverted the revert, finally. Note we want e.g. BeginGroup/ItemAdd/EndGroup to work as well. (#3851) + // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable + // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was + // the test that has been running for a long while. + if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) + return false; // Test if another item is active (e.g. being dragged) - if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) + if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) return false; @@ -2892,7 +3168,7 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) if ((window->DC.ItemFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) return false; - // Special handling for the dummy item after Begin() which represent the title bar or tab. + // Special handling for calling after Begin() which represent the title bar or tab. // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. if (window->DC.LastItemId == window->MoveId && window->WriteAccessed) return false; @@ -2913,12 +3189,31 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) return false; if (!IsMouseHoveringRect(bb.Min, bb.Max)) return false; - if (g.NavDisableMouseHover || !IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) + if (g.NavDisableMouseHover) return false; - if (window->DC.ItemFlags & ImGuiItemFlags_Disabled) + if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_None) || (window->DC.ItemFlags & ImGuiItemFlags_Disabled)) + { + g.HoveredIdDisabled = true; return false; + } + + // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level + // hover test in widgets code. We could also decide to split this function is two. + if (id != 0) + { + SetHoveredID(id); + + // [DEBUG] Item Picker tool! + // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making + // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered + // items if we perform the test in ItemAdd(), but that would incur a small runtime cost. + // #define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX in imconfig.h if you want this check to also be performed in ItemAdd(). + if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) + GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); + if (g.DebugItemPickerBreakId == id) + IM_DEBUG_BREAK(); + } - SetHoveredID(id); return true; } @@ -2927,12 +3222,21 @@ bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (!bb.Overlaps(window->ClipRect)) - if (id == 0 || id != g.ActiveId) + if (id == 0 || (id != g.ActiveId && id != g.NavId)) if (clip_even_when_logged || !g.LogEnabled) return true; return false; } +// This is also inlined in ItemAdd() +// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set window->DC.LastItemDisplayRect! +void ImGui::SetLastItemData(ImGuiWindow* window, ImGuiID item_id, ImGuiItemStatusFlags item_flags, const ImRect& item_rect) +{ + window->DC.LastItemId = item_id; + window->DC.LastItemStatusFlags = item_flags; + window->DC.LastItemRect = item_rect; +} + // Process TAB/Shift+TAB. Be mindful that this function may _clear_ the ActiveID when tabbing out. bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { @@ -2940,24 +3244,24 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // Increment counters const bool is_tab_stop = (window->DC.ItemFlags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0; - window->DC.FocusCounterAll++; + window->DC.FocusCounterRegular++; if (is_tab_stop) - window->DC.FocusCounterTab++; + window->DC.FocusCounterTabStop++; // Process TAB/Shift-TAB to tab *OUT* of the currently focused item. // (Note that we can always TAB out of a widget that doesn't allow tabbing in) - if (g.ActiveId == id && g.FocusTabPressed && !(g.ActiveIdBlockNavInputFlags & (1 << ImGuiNavInput_KeyTab_)) && g.FocusRequestNextWindow == NULL) + if (g.ActiveId == id && g.TabFocusPressed && !IsActiveIdUsingKey(ImGuiKey_Tab) && g.TabFocusRequestNextWindow == NULL) { - g.FocusRequestNextWindow = window; - g.FocusRequestNextCounterTab = window->DC.FocusCounterTab + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items. + g.TabFocusRequestNextWindow = window; + g.TabFocusRequestNextCounterTabStop = window->DC.FocusCounterTabStop + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items. } // Handle focus requests - if (g.FocusRequestCurrWindow == window) + if (g.TabFocusRequestCurrWindow == window) { - if (window->DC.FocusCounterAll == g.FocusRequestCurrCounterAll) + if (window->DC.FocusCounterRegular == g.TabFocusRequestCurrCounterRegular) return true; - if (is_tab_stop && window->DC.FocusCounterTab == g.FocusRequestCurrCounterTab) + if (is_tab_stop && window->DC.FocusCounterTabStop == g.TabFocusRequestCurrCounterTabStop) { g.NavJustTabbedId = id; return true; @@ -2973,8 +3277,8 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id) void ImGui::FocusableItemUnregister(ImGuiWindow* window) { - window->DC.FocusCounterAll--; - window->DC.FocusCounterTab--; + window->DC.FocusCounterRegular--; + window->DC.FocusCounterTabStop--; } float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) @@ -2982,11 +3286,21 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) if (wrap_pos_x < 0.0f) return 0.0f; - ImGuiWindow* window = GImGui->CurrentWindow; + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; if (wrap_pos_x == 0.0f) - wrap_pos_x = GetWorkRectMax().x; + { + // We could decide to setup a default wrapping max point for auto-resizing windows, + // or have auto-wrap (with unspecified wrapping pos) behave as a ContentSize extending function? + //if (window->Hidden && (window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) + // wrap_pos_x = ImMax(window->WorkRect.Min.x + g.FontSize * 10.0f, window->WorkRect.Max.x); + //else + wrap_pos_x = window->WorkRect.Max.x; + } else if (wrap_pos_x > 0.0f) + { wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space + } return ImMax(wrap_pos_x - pos.x, 1.0f); } @@ -2996,7 +3310,7 @@ void* ImGui::MemAlloc(size_t size) { if (ImGuiContext* ctx = GImGui) ctx->IO.MetricsActiveAllocations++; - return GImAllocatorAllocFunc(size, GImAllocatorUserData); + return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); } // IM_FREE() == ImGui::MemFree() @@ -3005,18 +3319,20 @@ void ImGui::MemFree(void* ptr) if (ptr) if (ImGuiContext* ctx = GImGui) ctx->IO.MetricsActiveAllocations--; - return GImAllocatorFreeFunc(ptr, GImAllocatorUserData); + return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); } const char* ImGui::GetClipboardText() { - return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn(GImGui->IO.ClipboardUserData) : ""; + ImGuiContext& g = *GImGui; + return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : ""; } void ImGui::SetClipboardText(const char* text) { - if (GImGui->IO.SetClipboardTextFn) - GImGui->IO.SetClipboardTextFn(GImGui->IO.ClipboardUserData, text); + ImGuiContext& g = *GImGui; + if (g.IO.SetClipboardTextFn) + g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text); } const char* ImGui::GetVersion() @@ -3024,7 +3340,7 @@ const char* ImGui::GetVersion() return IMGUI_VERSION; } -// Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself +// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself // Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module ImGuiContext* ImGui::GetCurrentContext() { @@ -3040,31 +3356,21 @@ void ImGui::SetCurrentContext(ImGuiContext* ctx) #endif } -// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. -// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit -// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. your user code -// may see different structures thanwhat imgui.cpp sees, which is problematic. -// We usually require settings to be in imconfig.h to make sure that they are accessible to all compilation units involved with Dear ImGui. -bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) -{ - bool error = false; - if (strcmp(version, IMGUI_VERSION)!=0) { error = true; IM_ASSERT(strcmp(version,IMGUI_VERSION)==0 && "Mismatched version string!"); } - if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } - if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } - if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } - if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } - if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } - if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } - return !error; -} - -void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data) +void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data) { GImAllocatorAllocFunc = alloc_func; GImAllocatorFreeFunc = free_func; GImAllocatorUserData = user_data; } +// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space) +void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data) +{ + *p_alloc_func = GImAllocatorAllocFunc; + *p_free_func = GImAllocatorFreeFunc; + *p_user_data = GImAllocatorUserData; +} + ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas) { ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas); @@ -3084,23 +3390,48 @@ void ImGui::DestroyContext(ImGuiContext* ctx) IM_DELETE(ctx); } +// No specific ordering/dependency support, will see as needed +ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_); + g.Hooks.push_back(*hook); + g.Hooks.back().HookId = ++g.HookIdNext; + return g.HookIdNext; +} + +// Deferred removal, avoiding issue with changing vector while iterating it +void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook_id != 0); + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].HookId == hook_id) + g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; +} + +// Call context hooks (used by e.g. test engine) +// We assume a small number of hooks so all stored in same array +void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) +{ + ImGuiContext& g = *ctx; + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].Type == hook_type) + g.Hooks[n].Callback(&g, &g.Hooks[n]); +} + ImGuiIO& ImGui::GetIO() { IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); return GImGui->IO; } -ImGuiStyle& ImGui::GetStyle() -{ - IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); - return GImGui->Style; -} - -// Same value as passed to the old io.RenderDrawListsFn function. Valid after Render() and until the next call to NewFrame() +// Pass this to your backend rendering function! Valid after Render() and until the next call to NewFrame() ImDrawData* ImGui::GetDrawData() { ImGuiContext& g = *GImGui; - return g.DrawData.Valid ? &g.DrawData : NULL; + ImGuiViewportP* viewport = g.Viewports[0]; + return viewport->DrawDataP.Valid ? &viewport->DrawDataP : NULL; } double ImGui::GetTime() @@ -3113,20 +3444,50 @@ int ImGui::GetFrameCount() return GImGui->FrameCount; } -ImDrawList* ImGui::GetBackgroundDrawList() +static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) { - return &GImGui->BackgroundDrawList; + // Create the draw list on demand, because they are not frequently used for all viewports + ImGuiContext& g = *GImGui; + IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); + ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; + if (draw_list == NULL) + { + draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); + draw_list->_OwnerName = drawlist_name; + viewport->DrawLists[drawlist_no] = draw_list; + } + + // Our ImDrawList system requires that there is always a command + if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) + { + draw_list->_ResetForNewFrame(); + draw_list->PushTextureID(g.IO.Fonts->TexID); + draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); + viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; + } + return draw_list; } -static ImDrawList* GetForegroundDrawList(ImGuiWindow*) +ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) { - // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. - return &GImGui->ForegroundDrawList; + return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); +} + +ImDrawList* ImGui::GetBackgroundDrawList() +{ + ImGuiContext& g = *GImGui; + return GetBackgroundDrawList(g.Viewports[0]); +} + +ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) +{ + return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); } ImDrawList* ImGui::GetForegroundDrawList() { - return &GImGui->ForegroundDrawList; + ImGuiContext& g = *GImGui; + return GetForegroundDrawList(g.Viewports[0]); } ImDrawListSharedData* ImGui::GetDrawListSharedData() @@ -3143,6 +3504,7 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window) FocusWindow(window); SetActiveID(window->MoveId, window); g.NavDisableHighlight = true; + g.ActiveIdNoClearOnFocusLoss = true; g.ActiveIdClickOffset = g.IO.MousePos - window->RootWindow->Pos; bool can_move_window = true; @@ -3154,6 +3516,9 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window) // Handle mouse moving window // Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing() +// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId. +// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs, +// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other. void ImGui::UpdateMouseMovingWindowNewFrame() { ImGuiContext& g = *GImGui; @@ -3192,10 +3557,10 @@ void ImGui::UpdateMouseMovingWindowNewFrame() } } -// Initiate moving window, handle left-click and right-click focus +// Initiate moving window when clicking on empty space or title bar. +// Handle left-click and right-click focus. void ImGui::UpdateMouseMovingWindowEndFrame() { - // Initiate moving window ImGuiContext& g = *GImGui; if (g.ActiveId != 0 || g.HoveredId != 0) return; @@ -3204,17 +3569,29 @@ void ImGui::UpdateMouseMovingWindowEndFrame() if (g.NavWindow && g.NavWindow->Appearing) return; - // Click to focus window and start moving (after we're done with all our widgets) + // Click on empty space to focus window and start moving + // (after we're done with all our widgets) if (g.IO.MouseClicked[0]) { - if (g.HoveredRootWindow != NULL) + // Handle the edge case of a popup being closed while clicking in its empty space. + // If we try to focus it, FocusWindow() > ClosePopupsOverWindow() will accidentally close any parent popups because they are not linked together any more. + ImGuiWindow* root_window = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; + const bool is_closed_popup = root_window && (root_window->Flags & ImGuiWindowFlags_Popup) && !IsPopupOpen(root_window->PopupId, ImGuiPopupFlags_AnyPopupLevel); + + if (root_window != NULL && !is_closed_popup) { - StartMouseMovingWindow(g.HoveredWindow); - if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoTitleBar)) - if (!g.HoveredRootWindow->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) + StartMouseMovingWindow(g.HoveredWindow); //-V595 + + // Cancel moving if clicked outside of title bar + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(root_window->Flags & ImGuiWindowFlags_NoTitleBar)) + if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) g.MovingWindow = NULL; + + // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already) + if (g.HoveredIdDisabled) + g.MovingWindow = NULL; } - else if (g.NavWindow != NULL && GetFrontMostPopupModal() == NULL) + else if (root_window == NULL && g.NavWindow != NULL && GetTopMostPopupModal() == NULL) { // Clicking on void disable focus FocusWindow(NULL); @@ -3226,20 +3603,10 @@ void ImGui::UpdateMouseMovingWindowEndFrame() // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger) if (g.IO.MouseClicked[1]) { - // Find the top-most window between HoveredWindow and the front most Modal Window. + // Find the top-most window between HoveredWindow and the top-most Modal Window. // This is where we can trim the popup stack. - ImGuiWindow* modal = GetFrontMostPopupModal(); - bool hovered_window_above_modal = false; - if (modal == NULL) - hovered_window_above_modal = true; - for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--) - { - ImGuiWindow* window = g.Windows[i]; - if (window == modal) - break; - if (window == g.HoveredWindow) - hovered_window_above_modal = true; - } + ImGuiWindow* modal = GetTopMostPopupModal(); + bool hovered_window_above_modal = g.HoveredWindow && IsWindowAbove(g.HoveredWindow, modal); ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal, true); } } @@ -3280,7 +3647,7 @@ static void ImGui::UpdateMouseInputs() ImVec2 delta_from_click_pos = IsMousePosValid(&g.IO.MousePos) ? (g.IO.MousePos - g.IO.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f); if (ImLengthSqr(delta_from_click_pos) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist) g.IO.MouseDoubleClicked[i] = true; - g.IO.MouseClickedTime[i] = -FLT_MAX; // so the third click isn't turned into a double-click + g.IO.MouseClickedTime[i] = -g.IO.MouseDoubleClickTime * 2.0f; // Mark as "old enough" so the third click isn't turned into a double-click } else { @@ -3306,26 +3673,55 @@ static void ImGui::UpdateMouseInputs() } } +static void StartLockWheelingWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.WheelingWindow == window) + return; + g.WheelingWindow = window; + g.WheelingWindowRefMousePos = g.IO.MousePos; + g.WheelingWindowTimer = WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER; +} + void ImGui::UpdateMouseWheel() { ImGuiContext& g = *GImGui; - if (!g.HoveredWindow || g.HoveredWindow->Collapsed) - return; + + // Reset the locked window if we move the mouse or after the timer elapses + if (g.WheelingWindow != NULL) + { + g.WheelingWindowTimer -= g.IO.DeltaTime; + if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold) + g.WheelingWindowTimer = 0.0f; + if (g.WheelingWindowTimer <= 0.0f) + { + g.WheelingWindow = NULL; + g.WheelingWindowTimer = 0.0f; + } + } + if (g.IO.MouseWheel == 0.0f && g.IO.MouseWheelH == 0.0f) return; - ImGuiWindow* window = g.HoveredWindow; + + if ((g.ActiveId != 0 && g.ActiveIdUsingMouseWheel) || (g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrameUsingMouseWheel)) + return; + + ImGuiWindow* window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; + if (!window || window->Collapsed) + return; // Zoom / Scale window // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned. if (g.IO.MouseWheel != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling) { + StartLockWheelingWindow(window); const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); const float scale = new_font_scale / window->FontWindowScale; window->FontWindowScale = new_font_scale; - if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) + if (window == window->RootWindow) { const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; - window->Pos = ImFloor(window->Pos + offset); + SetWindowPos(window, window->Pos + offset, 0); window->Size = ImFloor(window->Size * scale); window->SizeFull = ImFloor(window->SizeFull * scale); } @@ -3333,33 +3729,73 @@ void ImGui::UpdateMouseWheel() } // Mouse wheel scrolling - // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent (unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set). - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs) && window->ParentWindow) - window = window->ParentWindow; - const bool scroll_allowed = !(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs); - if (scroll_allowed && (g.IO.MouseWheel != 0.0f || g.IO.MouseWheelH != 0.0f) && !g.IO.KeyCtrl) + // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent + + // Vertical Mouse Wheel scrolling + const float wheel_y = (g.IO.MouseWheel != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f; + if (wheel_y != 0.0f && !g.IO.KeyCtrl) { - ImVec2 max_step = (window->ContentsRegionRect.GetSize() + window->WindowPadding * 2.0f) * 0.67f; - - // Vertical Mouse Wheel Scrolling (hold Shift to scroll horizontally) - if (g.IO.MouseWheel != 0.0f && !g.IO.KeyShift) + StartLockWheelingWindow(window); + while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) + window = window->ParentWindow; + if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) { - float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step.y)); - SetWindowScrollY(window, window->Scroll.y - g.IO.MouseWheel * scroll_step); - } - else if (g.IO.MouseWheel != 0.0f && g.IO.KeyShift) - { - float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step.x)); - SetWindowScrollX(window, window->Scroll.x - g.IO.MouseWheel * scroll_step); - } - - // Horizontal Mouse Wheel Scrolling (for hardware that supports it) - if (g.IO.MouseWheelH != 0.0f && !g.IO.KeyShift) - { - float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step.x)); - SetWindowScrollX(window, window->Scroll.x - g.IO.MouseWheelH * scroll_step); + float max_step = window->InnerRect.GetHeight() * 0.67f; + float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); + SetScrollY(window, window->Scroll.y - wheel_y * scroll_step); } } + + // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held + const float wheel_x = (g.IO.MouseWheelH != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheelH : (g.IO.MouseWheel != 0.0f && g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f; + if (wheel_x != 0.0f && !g.IO.KeyCtrl) + { + StartLockWheelingWindow(window); + while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) + window = window->ParentWindow; + if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + { + float max_step = window->InnerRect.GetWidth() * 0.67f; + float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); + SetScrollX(window, window->Scroll.x - wheel_x * scroll_step); + } + } +} + +void ImGui::UpdateTabFocus() +{ + ImGuiContext& g = *GImGui; + + // Pressing TAB activate widget focus + g.TabFocusPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab)); + if (g.ActiveId == 0 && g.TabFocusPressed) + { + // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also + // manipulate the Next fields even, even though they will be turned into Curr fields by the code below. + g.TabFocusRequestNextWindow = g.NavWindow; + g.TabFocusRequestNextCounterRegular = INT_MAX; + if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX) + g.TabFocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1); + else + g.TabFocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0; + } + + // Turn queued focus request into current one + g.TabFocusRequestCurrWindow = NULL; + g.TabFocusRequestCurrCounterRegular = g.TabFocusRequestCurrCounterTabStop = INT_MAX; + if (g.TabFocusRequestNextWindow != NULL) + { + ImGuiWindow* window = g.TabFocusRequestNextWindow; + g.TabFocusRequestCurrWindow = window; + if (g.TabFocusRequestNextCounterRegular != INT_MAX && window->DC.FocusCounterRegular != -1) + g.TabFocusRequestCurrCounterRegular = ImModPositive(g.TabFocusRequestNextCounterRegular, window->DC.FocusCounterRegular + 1); + if (g.TabFocusRequestNextCounterTabStop != INT_MAX && window->DC.FocusCounterTabStop != -1) + g.TabFocusRequestCurrCounterTabStop = ImModPositive(g.TabFocusRequestNextCounterTabStop, window->DC.FocusCounterTabStop + 1); + g.TabFocusRequestNextWindow = NULL; + g.TabFocusRequestNextCounterRegular = g.TabFocusRequestNextCounterTabStop = INT_MAX; + } + + g.NavIdTabCounter = INT_MAX; } // The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app) @@ -3371,17 +3807,17 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow. // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. + bool clear_hovered_windows = false; FindHoveredWindow(); - // Modal windows prevents cursor from hovering behind them. - ImGuiWindow* modal_window = GetFrontMostPopupModal(); - if (modal_window) - if (g.HoveredRootWindow && !IsWindowChildOf(g.HoveredRootWindow, modal_window)) - g.HoveredRootWindow = g.HoveredWindow = NULL; + // Modal windows prevents mouse from hovering behind them. + ImGuiWindow* modal_window = GetTopMostPopupModal(); + if (modal_window && g.HoveredWindow && !IsWindowChildOf(g.HoveredWindow->RootWindow, modal_window)) + clear_hovered_windows = true; // Disabled mouse? if (g.IO.ConfigFlags & ImGuiConfigFlags_NoMouse) - g.HoveredWindow = g.HoveredRootWindow = NULL; + clear_hovered_windows = true; // We track click ownership. When clicked outside of a window the click is owned by the application and won't report hovering nor request capture even while dragging over our windows afterward. int mouse_earliest_button_down = -1; @@ -3389,7 +3825,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++) { if (g.IO.MouseClicked[i]) - g.IO.MouseDownOwned[i] = (g.HoveredWindow != NULL) || (!g.OpenPopupStack.empty()); + g.IO.MouseDownOwned[i] = (g.HoveredWindow != NULL) || (g.OpenPopupStack.Size > 0); mouse_any_down |= g.IO.MouseDown[i]; if (g.IO.MouseDown[i]) if (mouse_earliest_button_down == -1 || g.IO.MouseClickedTime[i] < g.IO.MouseClickedTime[mouse_earliest_button_down]) @@ -3401,15 +3837,18 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() // FIXME: For patterns of drag and drop across OS windows, we may need to rework/remove this test (first committed 311c0ca9 on 2015/02) const bool mouse_dragging_extern_payload = g.DragDropActive && (g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) != 0; if (!mouse_avail_to_imgui && !mouse_dragging_extern_payload) - g.HoveredWindow = g.HoveredRootWindow = NULL; + clear_hovered_windows = true; - // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to imgui, false = dispatch mouse info to imgui + app) + if (clear_hovered_windows) + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; + + // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to imgui, false = dispatch mouse info to Dear ImGui + app) if (g.WantCaptureMouseNextFrame != -1) g.IO.WantCaptureMouse = (g.WantCaptureMouseNextFrame != 0); else - g.IO.WantCaptureMouse = (mouse_avail_to_imgui && (g.HoveredWindow != NULL || mouse_any_down)) || (!g.OpenPopupStack.empty()); + g.IO.WantCaptureMouse = (mouse_avail_to_imgui && (g.HoveredWindow != NULL || mouse_any_down)) || (g.OpenPopupStack.Size > 0); - // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to imgui, false = dispatch keyboard info to imgui + app) + // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to imgui, false = dispatch keyboard info to Dear ImGui + app) if (g.WantCaptureKeyboardNextFrame != -1) g.IO.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); else @@ -3421,91 +3860,83 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() g.IO.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; } +ImGuiKeyModFlags ImGui::GetMergedKeyModFlags() +{ + ImGuiContext& g = *GImGui; + ImGuiKeyModFlags key_mod_flags = ImGuiKeyModFlags_None; + if (g.IO.KeyCtrl) { key_mod_flags |= ImGuiKeyModFlags_Ctrl; } + if (g.IO.KeyShift) { key_mod_flags |= ImGuiKeyModFlags_Shift; } + if (g.IO.KeyAlt) { key_mod_flags |= ImGuiKeyModFlags_Alt; } + if (g.IO.KeySuper) { key_mod_flags |= ImGuiKeyModFlags_Super; } + return key_mod_flags; +} + void ImGui::NewFrame() { IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); ImGuiContext& g = *GImGui; -#ifdef IMGUI_ENABLE_TEST_ENGINE - ImGuiTestEngineHook_PreNewFrame(&g); -#endif + // Remove pending delete hooks before frame start. + // This deferred removal avoid issues of removal while iterating the hook vector + for (int n = g.Hooks.Size - 1; n >= 0; n--) + if (g.Hooks[n].Type == ImGuiContextHookType_PendingRemoval_) + g.Hooks.erase(&g.Hooks[n]); - // Check user data - // (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument) - IM_ASSERT(g.Initialized); - IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!"); - IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); - IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!"); - IM_ASSERT(g.IO.Fonts->Fonts.Size > 0 && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?"); - IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded() && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?"); - IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!"); - IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting. Alpha cannot be negative (allows us to avoid a few clamps in color computations)!"); - IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting."); - for (int n = 0; n < ImGuiKey_COUNT; n++) - IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < IM_ARRAYSIZE(g.IO.KeysDown) && "io.KeyMap[] contains an out of bound value (need to be 0..512, or -1 for unmapped key)"); + CallContextHooks(&g, ImGuiContextHookType_NewFramePre); - // Perform simple check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only recently added in 1.60 WIP) - if (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) - IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation."); + // Check and assert for various common IO and Configuration mistakes + ErrorCheckNewFrameSanityChecks(); - // Perform simple check: the beta io.ConfigWindowsResizeFromEdges option requires back-end to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly. - if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors)) - g.IO.ConfigWindowsResizeFromEdges = false; - - // Load settings on first frame (if not explicitly loaded manually before) - if (!g.SettingsLoaded) - { - IM_ASSERT(g.SettingsWindows.empty()); - if (g.IO.IniFilename) - LoadIniSettingsFromDisk(g.IO.IniFilename); - g.SettingsLoaded = true; - } - - // Save settings (with a delay after the last modification, so we don't spam disk too much) - if (g.SettingsDirtyTimer > 0.0f) - { - g.SettingsDirtyTimer -= g.IO.DeltaTime; - if (g.SettingsDirtyTimer <= 0.0f) - { - if (g.IO.IniFilename != NULL) - SaveIniSettingsToDisk(g.IO.IniFilename); - else - g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves. - g.SettingsDirtyTimer = 0.0f; - } - } + // Load settings on first frame, save settings when modified (after a delay) + UpdateSettings(); g.Time += g.IO.DeltaTime; - g.FrameScopeActive = true; + g.WithinFrameScope = true; g.FrameCount += 1; g.TooltipOverrideCount = 0; g.WindowsActiveCount = 0; + g.MenusIdSubmittedThisFrame.resize(0); + + // Calculate frame-rate for the user, as a purely luxurious feature + g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; + g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; + g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); + g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX; + + UpdateViewportsNewFrame(); // Setup current font and draw list shared data g.IO.Fonts->Locked = true; SetCurrentFont(GetDefaultFont()); IM_ASSERT(g.Font->IsLoaded()); - g.DrawListSharedData.ClipRectFullscreen = ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); + ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + virtual_space.Add(g.Viewports[n]->GetMainRect()); + g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; - - g.BackgroundDrawList.Clear(); - g.BackgroundDrawList.PushTextureID(g.IO.Fonts->TexID); - g.BackgroundDrawList.PushClipRectFullScreen(); - g.BackgroundDrawList.Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); - - g.ForegroundDrawList.Clear(); - g.ForegroundDrawList.PushTextureID(g.IO.Fonts->TexID); - g.ForegroundDrawList.PushClipRectFullScreen(); - g.ForegroundDrawList.Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); + g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); + g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; + if (g.Style.AntiAliasedLines) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; + if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; + if (g.Style.AntiAliasedFill) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; + if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; // Mark rendering data as invalid to prevent user who may have a handle on it to use it. - g.DrawData.Clear(); + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataP.Clear(); + } // Drag and drop keep the source ID alive so even if the source disappear our state is consistent if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) KeepAliveID(g.DragDropPayload.SourceId); - // Clear reference to active widget if the widget isn't alive anymore + // Update HoveredId data if (!g.HoveredIdPreviousFrame) g.HoveredIdTimer = 0.0f; if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId)) @@ -3515,8 +3946,13 @@ void ImGui::NewFrame() if (g.HoveredId && g.ActiveId != g.HoveredId) g.HoveredIdNotActiveTimer += g.IO.DeltaTime; g.HoveredIdPreviousFrame = g.HoveredId; + g.HoveredIdPreviousFrameUsingMouseWheel = g.HoveredIdUsingMouseWheel; g.HoveredId = 0; g.HoveredIdAllowOverlap = false; + g.HoveredIdUsingMouseWheel = false; + g.HoveredIdDisabled = false; + + // Update ActiveId data (clear reference to active widget if the widget isn't alive anymore) if (g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0) ClearActiveID(); if (g.ActiveId) @@ -3524,42 +3960,50 @@ void ImGui::NewFrame() g.LastActiveIdTimer += g.IO.DeltaTime; g.ActiveIdPreviousFrame = g.ActiveId; g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow; - g.ActiveIdPreviousFrameHasBeenEdited = g.ActiveIdHasBeenEdited; + g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore; g.ActiveIdIsAlive = 0; + g.ActiveIdHasBeenEditedThisFrame = false; g.ActiveIdPreviousFrameIsAlive = false; g.ActiveIdIsJustActivated = false; - if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId) - g.TempInputTextId = 0; + if (g.TempInputId != 0 && g.ActiveId != g.TempInputId) + g.TempInputId = 0; + if (g.ActiveId == 0) + { + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingNavInputMask = 0x00; + g.ActiveIdUsingKeyInputMask = 0x00; + } // Drag and drop g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr; g.DragDropAcceptIdCurr = 0; g.DragDropAcceptIdCurrRectSurface = FLT_MAX; - g.DragDropWithinSourceOrTarget = false; + g.DragDropWithinSource = false; + g.DragDropWithinTarget = false; + g.DragDropHoldJustPressedId = 0; // Update keyboard input state + // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools + g.IO.KeyMods = GetMergedKeyModFlags(); memcpy(g.IO.KeysDownDurationPrev, g.IO.KeysDownDuration, sizeof(g.IO.KeysDownDuration)); for (int i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++) g.IO.KeysDownDuration[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownDuration[i] < 0.0f ? 0.0f : g.IO.KeysDownDuration[i] + g.IO.DeltaTime) : -1.0f; - // Update gamepad/keyboard directional navigation + // Update gamepad/keyboard navigation NavUpdate(); // Update mouse input state UpdateMouseInputs(); - // Calculate frame-rate for the user, as a purely luxurious feature - g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; - g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); - g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX; + // Find hovered window + // (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame) + UpdateHoveredWindowAndCaptureFlags(); // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering) UpdateMouseMovingWindowNewFrame(); - UpdateHoveredWindowAndCaptureFlags(); // Background darkening/whitening - if (GetFrontMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f)) + if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f)) g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f); else g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f); @@ -3571,39 +4015,12 @@ void ImGui::NewFrame() // Mouse wheel scrolling, scale UpdateMouseWheel(); - // Pressing TAB activate widget focus - g.FocusTabPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab)); - if (g.ActiveId == 0 && g.FocusTabPressed) - { - // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also - // manipulate the Next fields even, even though they will be turned into Curr fields by the code below. - g.FocusRequestNextWindow = g.NavWindow; - g.FocusRequestNextCounterAll = INT_MAX; - if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX) - g.FocusRequestNextCounterTab = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1); - else - g.FocusRequestNextCounterTab = g.IO.KeyShift ? -1 : 0; - } + // Update legacy TAB focus + UpdateTabFocus(); - // Turn queued focus request into current one - g.FocusRequestCurrWindow = NULL; - g.FocusRequestCurrCounterAll = g.FocusRequestCurrCounterTab = INT_MAX; - if (g.FocusRequestNextWindow != NULL) - { - ImGuiWindow* window = g.FocusRequestNextWindow; - g.FocusRequestCurrWindow = window; - if (g.FocusRequestNextCounterAll != INT_MAX && window->DC.FocusCounterAll != -1) - g.FocusRequestCurrCounterAll = ImModPositive(g.FocusRequestNextCounterAll, window->DC.FocusCounterAll + 1); - if (g.FocusRequestNextCounterTab != INT_MAX && window->DC.FocusCounterTab != -1) - g.FocusRequestCurrCounterTab = ImModPositive(g.FocusRequestNextCounterTab, window->DC.FocusCounterTab + 1); - g.FocusRequestNextWindow = NULL; - g.FocusRequestNextCounterAll = g.FocusRequestNextCounterTab = INT_MAX; - } - - g.NavIdTabCounter = INT_MAX; - - // Mark all windows as not visible + // Mark all windows as not visible and compact unused memory. IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size); + const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; for (int i = 0; i != g.Windows.Size; i++) { ImGuiWindow* window = g.Windows[i]; @@ -3611,8 +4028,20 @@ void ImGui::NewFrame() window->BeginCount = 0; window->Active = false; window->WriteAccessed = false; + + // Garbage collect transient buffers of recently unused windows + if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time) + GcCompactTransientWindowBuffers(window); } + // Garbage collect transient buffers of recently unused tables + for (int i = 0; i < g.TablesLastTimeActive.Size; i++) + if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) + TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); + if (g.GcCompactAll) + GcCompactTransientMiscBuffers(); + g.GcCompactAll = false; + // Closing the focused window restore focus to the first active root window in descending z-order if (g.NavWindow && !g.NavWindow->WasActive) FocusTopMostWindowUnderOne(NULL, NULL); @@ -3621,18 +4050,48 @@ void ImGui::NewFrame() // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. g.CurrentWindowStack.resize(0); g.BeginPopupStack.resize(0); + g.ItemFlagsStack.resize(0); + g.ItemFlagsStack.push_back(ImGuiItemFlags_Default_); + g.GroupStack.resize(0); ClosePopupsOverWindow(g.NavWindow, false); + // [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. + UpdateDebugToolItemPicker(); + // Create implicit/fallback window - which we will only render it if the user has added something to it. // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. // This fallback is particularly important as it avoid ImGui:: calls from crashing. - SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver); + g.WithinFrameScopeWithImplicitWindow = true; + SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); Begin("Debug##Default"); - g.FrameScopePushedImplicitWindow = true; + IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true); -#ifdef IMGUI_ENABLE_TEST_ENGINE - ImGuiTestEngineHook_PostNewFrame(&g); -#endif + CallContextHooks(&g, ImGuiContextHookType_NewFramePost); +} + +// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. +void ImGui::UpdateDebugToolItemPicker() +{ + ImGuiContext& g = *GImGui; + g.DebugItemPickerBreakId = 0; + if (g.DebugItemPickerActive) + { + const ImGuiID hovered_id = g.HoveredIdPreviousFrame; + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + if (ImGui::IsKeyPressedMap(ImGuiKey_Escape)) + g.DebugItemPickerActive = false; + if (ImGui::IsMouseClicked(0) && hovered_id) + { + g.DebugItemPickerBreakId = hovered_id; + g.DebugItemPickerActive = false; + } + ImGui::SetNextWindowBgAlpha(0.60f); + ImGui::BeginTooltip(); + ImGui::Text("HoveredId: 0x%08X", hovered_id); + ImGui::Text("Press ESC to abort picking."); + ImGui::TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click to break in debugger!"); + ImGui::EndTooltip(); + } } void ImGui::Initialize(ImGuiContext* context) @@ -3641,13 +4100,29 @@ void ImGui::Initialize(ImGuiContext* context) IM_ASSERT(!g.Initialized && !g.SettingsLoaded); // Add .ini handle for ImGuiWindow type - ImGuiSettingsHandler ini_handler; - ini_handler.TypeName = "Window"; - ini_handler.TypeHash = ImHashStr("Window"); - ini_handler.ReadOpenFn = SettingsHandlerWindow_ReadOpen; - ini_handler.ReadLineFn = SettingsHandlerWindow_ReadLine; - ini_handler.WriteAllFn = SettingsHandlerWindow_WriteAll; - g.SettingsHandlers.push_back(ini_handler); + { + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Window"; + ini_handler.TypeHash = ImHashStr("Window"); + ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll; + g.SettingsHandlers.push_back(ini_handler); + } + +#ifdef IMGUI_HAS_TABLE + // Add .ini handle for ImGuiTable type + TableSettingsInstallHandler(context); +#endif // #ifdef IMGUI_HAS_TABLE + + // Create default viewport + ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); + g.Viewports.push_back(viewport); + +#ifdef IMGUI_HAS_DOCK +#endif // #ifdef IMGUI_HAS_DOCK g.Initialized = true; } @@ -3664,7 +4139,7 @@ void ImGui::Shutdown(ImGuiContext* context) } g.IO.Fonts = NULL; - // Cleanup of other data are conditional on actually having initialized ImGui. + // Cleanup of other data are conditional on actually having initialized Dear ImGui. if (!g.Initialized) return; @@ -3672,43 +4147,57 @@ void ImGui::Shutdown(ImGuiContext* context) if (g.SettingsLoaded && g.IO.IniFilename != NULL) { ImGuiContext* backup_context = GImGui; - SetCurrentContext(context); + SetCurrentContext(&g); SaveIniSettingsToDisk(g.IO.IniFilename); SetCurrentContext(backup_context); } + CallContextHooks(&g, ImGuiContextHookType_Shutdown); + // Clear everything else for (int i = 0; i < g.Windows.Size; i++) IM_DELETE(g.Windows[i]); g.Windows.clear(); g.WindowsFocusOrder.clear(); - g.WindowsSortBuffer.clear(); + g.WindowsTempSortBuffer.clear(); g.CurrentWindow = NULL; g.CurrentWindowStack.clear(); g.WindowsById.Clear(); g.NavWindow = NULL; - g.HoveredWindow = g.HoveredRootWindow = NULL; + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL; g.MovingWindow = NULL; - g.ColorModifiers.clear(); - g.StyleModifiers.clear(); + g.ColorStack.clear(); + g.StyleVarStack.clear(); g.FontStack.clear(); g.OpenPopupStack.clear(); g.BeginPopupStack.clear(); - g.DrawDataBuilder.ClearFreeMemory(); - g.BackgroundDrawList.ClearFreeMemory(); - g.ForegroundDrawList.ClearFreeMemory(); - g.PrivateClipboard.clear(); + + for (int i = 0; i < g.Viewports.Size; i++) + IM_DELETE(g.Viewports[i]); + g.Viewports.clear(); + + g.TabBars.Clear(); + g.CurrentTabBarStack.clear(); + g.ShrinkWidthBuffer.clear(); + + g.Tables.Clear(); + g.CurrentTableStack.clear(); + g.DrawChannelsTempMergeBuffer.clear(); + + g.ClipboardHandlerData.clear(); + g.MenusIdSubmittedThisFrame.clear(); g.InputTextState.ClearFreeMemory(); - for (int i = 0; i < g.SettingsWindows.Size; i++) - IM_DELETE(g.SettingsWindows[i].Name); g.SettingsWindows.clear(); g.SettingsHandlers.clear(); - if (g.LogFile && g.LogFile != stdout) + if (g.LogFile) { - fclose(g.LogFile); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + if (g.LogFile != stdout) +#endif + ImFileClose(g.LogFile); g.LogFile = NULL; } g.LogBuffer.clear(); @@ -3735,7 +4224,7 @@ static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, Im { int count = window->DC.ChildWindows.Size; if (count > 1) - ImQsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); + ImQsort(window->DC.ChildWindows.Data, (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); for (int i = 0; i < count; i++) { ImGuiWindow* child = window->DC.ChildWindows[i]; @@ -3747,58 +4236,59 @@ static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, Im static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list) { - if (draw_list->CmdBuffer.empty()) + // Remove trailing command if unused. + // Technically we could return directly instead of popping, but this make things looks neat in Metrics/Debugger window as well. + draw_list->_PopUnusedDrawCmd(); + if (draw_list->CmdBuffer.Size == 0) return; - // Remove trailing command if unused - ImDrawCmd& last_cmd = draw_list->CmdBuffer.back(); - if (last_cmd.ElemCount == 0 && last_cmd.UserCallback == NULL) - { - draw_list->CmdBuffer.pop_back(); - if (draw_list->CmdBuffer.empty()) - return; - } - - // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. May trigger for you if you are using PrimXXX functions incorrectly. + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + // May trigger for you if you are using PrimXXX functions incorrectly. IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) // If this assert triggers because you are drawing lots of stuff manually: - // A) Make sure you are coarse clipping, because ImDrawList let all your vertices pass. You can use the Metrics window to inspect draw list contents. - // B) If you need/want meshes with more than 64K vertices, uncomment the '#define ImDrawIdx unsigned int' line in imconfig.h to set the index size to 4 bytes. - // You'll need to handle the 4-bytes indices to your renderer. For example, the OpenGL example code detect index size at compile-time by doing: - // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); - // Your own engine or render API may use different parameters or function calls to specify index sizes. 2 and 4 bytes indices are generally supported by most API. - // C) If for some reason you cannot use 4 bytes indices or don't want to, a workaround is to call BeginChild()/EndChild() before reaching the 64K limit to split your draw commands in multiple draw lists. + // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. + // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. + // - If you want large meshes with more than 64K vertices, you can either: + // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. + // Most example backends already support this from 1.71. Pre-1.71 backends won't. + // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. + // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. + // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: + // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); + // Your own engine or render API may use different parameters or function calls to specify index sizes. + // 2 and 4 bytes indices are generally supported by most graphics API. + // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching + // the 64K limit to split your draw commands in multiple draw lists. if (sizeof(ImDrawIdx) == 2) IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); out_list->push_back(draw_list); } -static void AddWindowToDrawData(ImVector<ImDrawList*>* out_render_list, ImGuiWindow* window) +static void AddWindowToDrawData(ImGuiWindow* window, int layer) { ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = g.Viewports[0]; g.IO.MetricsRenderWindows++; - AddDrawListToDrawData(out_render_list, window->DrawList); + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); for (int i = 0; i < window->DC.ChildWindows.Size; i++) { ImGuiWindow* child = window->DC.ChildWindows[i]; - if (IsWindowActiveAndVisible(child)) // clipped children may have been marked not active - AddWindowToDrawData(out_render_list, child); + if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active + AddWindowToDrawData(child, layer); } } // Layer is locked for the root window, however child windows may use a different viewport (e.g. extruding menu) static void AddRootWindowToDrawData(ImGuiWindow* window) { - ImGuiContext& g = *GImGui; - if (window->Flags & ImGuiWindowFlags_Tooltip) - AddWindowToDrawData(&g.DrawDataBuilder.Layers[1], window); - else - AddWindowToDrawData(&g.DrawDataBuilder.Layers[0], window); + int layer = (window->Flags & ImGuiWindowFlags_Tooltip) ? 1 : 0; + AddWindowToDrawData(window, layer); } void ImDrawDataBuilder::FlattenIntoSingleLayer() @@ -3819,15 +4309,16 @@ void ImDrawDataBuilder::FlattenIntoSingleLayer() } } -static void SetupDrawData(ImVector<ImDrawList*>* draw_lists, ImDrawData* draw_data) +static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector<ImDrawList*>* draw_lists) { ImGuiIO& io = ImGui::GetIO(); + ImDrawData* draw_data = &viewport->DrawDataP; draw_data->Valid = true; draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; draw_data->CmdListsCount = draw_lists->Size; draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; - draw_data->DisplayPos = ImVec2(0.0f, 0.0f); - draw_data->DisplaySize = io.DisplaySize; + draw_data->DisplayPos = viewport->Pos; + draw_data->DisplaySize = viewport->Size; draw_data->FramebufferScale = io.DisplayFramebufferScale; for (int n = 0; n < draw_lists->Size; n++) { @@ -3836,7 +4327,12 @@ static void SetupDrawData(ImVector<ImDrawList*>* draw_lists, ImDrawData* draw_da } } -// When using this function it is sane to ensure that float are perfectly rounded to integer values, to that e.g. (int)(max.x-min.x) in user's render produce correct result. +// Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. +// - When using this function it is sane to ensure that float are perfectly rounded to integer values, +// so that e.g. (int)(max.x-min.x) in user's render produce correct result. +// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect(): +// some frequently called functions which to modify both channels and clipping simultaneously tend to use the +// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds. void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect) { ImGuiWindow* window = GetCurrentWindow(); @@ -3856,9 +4352,15 @@ void ImGui::EndFrame() { ImGuiContext& g = *GImGui; IM_ASSERT(g.Initialized); - if (g.FrameCountEnded == g.FrameCount) // Don't process EndFrame() multiple times. + + // Don't process EndFrame() multiple times. + if (g.FrameCountEnded == g.FrameCount) return; - IM_ASSERT(g.FrameScopeActive && "Forgot to call ImGui::NewFrame()?"); + IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?"); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePre); + + ErrorCheckEndFrameSanityChecks(); // Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) if (g.IO.ImeSetInputScreenPosFn && (g.PlatformImeLastPos.x == FLT_MAX || ImLengthSqr(g.PlatformImeLastPos - g.PlatformImePos) > 0.0001f)) @@ -3867,31 +4369,14 @@ void ImGui::EndFrame() g.PlatformImeLastPos = g.PlatformImePos; } - // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you - // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API). - if (g.CurrentWindowStack.Size != 1) - { - if (g.CurrentWindowStack.Size > 1) - { - IM_ASSERT(g.CurrentWindowStack.Size == 1 && "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?"); - while (g.CurrentWindowStack.Size > 1) // FIXME-ERRORHANDLING - End(); - } - else - { - IM_ASSERT(g.CurrentWindowStack.Size == 1 && "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?"); - } - } - // Hide implicit/fallback "Debug" window if it hasn't been used - g.FrameScopePushedImplicitWindow = false; + g.WithinFrameScopeWithImplicitWindow = false; if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed) g.CurrentWindow->Active = false; End(); - // Show CTRL+TAB list window - if (g.NavWindowingTarget) - NavUpdateWindowingList(); + // Update navigation: CTRL+Tab, wrap-around requests + NavEndFrame(); // Drag and Drop: Elapse payload (if delivered, or if source stops being submitted) if (g.DragDropActive) @@ -3903,35 +4388,35 @@ void ImGui::EndFrame() } // Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing. - if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount) + if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) { - g.DragDropWithinSourceOrTarget = true; + g.DragDropWithinSource = true; SetTooltip("..."); - g.DragDropWithinSourceOrTarget = false; + g.DragDropWithinSource = false; } // End frame - g.FrameScopeActive = false; + g.WithinFrameScope = false; g.FrameCountEnded = g.FrameCount; // Initiate moving window + handle left-click and right-click focus UpdateMouseMovingWindowEndFrame(); // Sort the window list so that all child windows are after their parent - // We cannot do that on FocusWindow() because childs may not exist yet - g.WindowsSortBuffer.resize(0); - g.WindowsSortBuffer.reserve(g.Windows.Size); + // We cannot do that on FocusWindow() because children may not exist yet + g.WindowsTempSortBuffer.resize(0); + g.WindowsTempSortBuffer.reserve(g.Windows.Size); for (int i = 0; i != g.Windows.Size; i++) { ImGuiWindow* window = g.Windows[i]; if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it continue; - AddWindowToSortBuffer(&g.WindowsSortBuffer, window); + AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); } // This usually assert if there is a mismatch between the ImGuiWindowFlags_ChildWindow / ParentWindow values and DC.ChildWindows[] in parents, aka we've done something wrong. - IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); - g.Windows.swap(g.WindowsSortBuffer); + IM_ASSERT(g.Windows.Size == g.WindowsTempSortBuffer.Size); + g.Windows.swap(g.WindowsTempSortBuffer); g.IO.MetricsActiveWindows = g.WindowsActiveCount; // Unlock font atlas @@ -3941,6 +4426,8 @@ void ImGui::EndFrame() g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; g.IO.InputQueueCharacters.resize(0); memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs)); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePost); } void ImGui::Render() @@ -3951,48 +4438,59 @@ void ImGui::Render() if (g.FrameCountEnded != g.FrameCount) EndFrame(); g.FrameCountRendered = g.FrameCount; + g.IO.MetricsRenderWindows = 0; - // Gather ImDrawList to render (for each active window) - g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsRenderWindows = 0; - g.DrawDataBuilder.Clear(); - if (!g.BackgroundDrawList.VtxBuffer.empty()) - AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.BackgroundDrawList); + CallContextHooks(&g, ImGuiContextHookType_RenderPre); - ImGuiWindow* windows_to_render_front_most[2]; - windows_to_render_front_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; - windows_to_render_front_most[1] = g.NavWindowingTarget ? g.NavWindowingList : NULL; + // Add background ImDrawList (for each active viewport) + for (int n = 0; n != g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.Clear(); + if (viewport->DrawLists[0] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); + } + + // Add ImDrawList to render + ImGuiWindow* windows_to_render_top_most[2]; + windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; + windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); for (int n = 0; n != g.Windows.Size; n++) { ImGuiWindow* window = g.Windows[n]; - if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_front_most[0] && window != windows_to_render_front_most[1]) + if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) AddRootWindowToDrawData(window); } - for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_front_most); n++) - if (windows_to_render_front_most[n] && IsWindowActiveAndVisible(windows_to_render_front_most[n])) // NavWindowingTarget is always temporarily displayed as the front-most window - AddRootWindowToDrawData(windows_to_render_front_most[n]); - g.DrawDataBuilder.FlattenIntoSingleLayer(); + for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++) + if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window + AddRootWindowToDrawData(windows_to_render_top_most[n]); - // Draw software mouse cursor if requested - if (g.IO.MouseDrawCursor) - RenderMouseCursor(&g.ForegroundDrawList, g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor); + // Setup ImDrawData structures for end-user + g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.FlattenIntoSingleLayer(); - if (!g.ForegroundDrawList.VtxBuffer.empty()) - AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.ForegroundDrawList); + // Draw software mouse cursor if requested by io.MouseDrawCursor flag + if (g.IO.MouseDrawCursor) + RenderMouseCursor(GetForegroundDrawList(viewport), g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); - // Setup ImDrawData structure for end-user - SetupDrawData(&g.DrawDataBuilder.Layers[0], &g.DrawData); - g.IO.MetricsRenderVertices = g.DrawData.TotalVtxCount; - g.IO.MetricsRenderIndices = g.DrawData.TotalIdxCount; + // Add foreground ImDrawList (for each active viewport) + if (viewport->DrawLists[1] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); - // (Legacy) Call the Render callback function. The current prefer way is to let the user retrieve GetDrawData() and call the render function themselves. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - if (g.DrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL) - g.IO.RenderDrawListsFn(&g.DrawData); -#endif + SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); + ImDrawData* draw_data = &viewport->DrawDataP; + g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; + g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; + } + + CallContextHooks(&g, ImGuiContextHookType_RenderPost); } // Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. -// CalcTextSize("") should return ImVec2(0.0f, GImGui->FontSize) +// CalcTextSize("") should return ImVec2(0.0f, g.FontSize) ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) { ImGuiContext& g = *GImGui; @@ -4010,54 +4508,17 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); // Round - text_size.x = (float)(int)(text_size.x + 0.95f); + // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. + // FIXME: Investigate using ceilf or e.g. + // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c + // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html + text_size.x = IM_FLOOR(text_size.x + 0.99999f); return text_size; } -// Helper to calculate coarse clipping of large list of evenly sized items. -// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern. -// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX -void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - *out_items_display_start = 0; - *out_items_display_end = items_count; - return; - } - if (window->SkipItems) - { - *out_items_display_start = *out_items_display_end = 0; - return; - } - - // We create the union of the ClipRect and the NavScoringRect which at worst should be 1 page away from ClipRect - ImRect unclipped_rect = window->ClipRect; - if (g.NavMoveRequest) - unclipped_rect.Add(g.NavScoringRectScreen); - - const ImVec2 pos = window->DC.CursorPos; - int start = (int)((unclipped_rect.Min.y - pos.y) / items_height); - int end = (int)((unclipped_rect.Max.y - pos.y) / items_height); - - // When performing a navigation request, ensure we have one item extra in the direction we are moving to - if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Up) - start--; - if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Down) - end++; - - start = ImClamp(start, 0, items_count); - end = ImClamp(end + 1, start, items_count); - *out_items_display_start = start; - *out_items_display_end = end; -} - // Find window given position, search front-to-back -// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programatically +// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically // with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is // called, aka before the next Begin(). Moving window isn't affected. static void FindHoveredWindow() @@ -4065,6 +4526,7 @@ static void FindHoveredWindow() ImGuiContext& g = *GImGui; ImGuiWindow* hovered_window = NULL; + ImGuiWindow* hovered_window_ignoring_moving_window = NULL; if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) hovered_window = g.MovingWindow; @@ -4087,16 +4549,26 @@ static void FindHoveredWindow() if (!bb.Contains(g.IO.MousePos)) continue; - // Those seemingly unnecessary extra tests are because the code here is a little different in viewport/docking branches. + // Support for one rectangular hole in any given window + // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) + if (window->HitTestHoleSize.x != 0) + { + ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); + ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); + if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) + continue; + } + if (hovered_window == NULL) hovered_window = window; - if (hovered_window) + if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) + hovered_window_ignoring_moving_window = window; + if (hovered_window && hovered_window_ignoring_moving_window) break; } g.HoveredWindow = hovered_window; - g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; - + g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; } // Test if mouse cursor is hovering given rectangle @@ -4121,25 +4593,37 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c int ImGui::GetKeyIndex(ImGuiKey imgui_key) { IM_ASSERT(imgui_key >= 0 && imgui_key < ImGuiKey_COUNT); - return GImGui->IO.KeyMap[imgui_key]; + ImGuiContext& g = *GImGui; + return g.IO.KeyMap[imgui_key]; } -// Note that imgui doesn't know the semantic of each entry of io.KeysDown[]. Use your own indices/enums according to how your back-end/engine stored them into io.KeysDown[]! +// Note that dear imgui doesn't know the semantic of each entry of io.KeysDown[]! +// Use your own indices/enums according to how your backend/engine stored them into io.KeysDown[]! bool ImGui::IsKeyDown(int user_key_index) { - if (user_key_index < 0) return false; - IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(GImGui->IO.KeysDown)); - return GImGui->IO.KeysDown[user_key_index]; + if (user_key_index < 0) + return false; + ImGuiContext& g = *GImGui; + IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown)); + return g.IO.KeysDown[user_key_index]; } -int ImGui::CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate) +// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) +// t1 = current time (e.g.: g.Time) +// An event is triggered at: +// t = 0.0f t = repeat_delay, t = repeat_delay + repeat_rate*N +int ImGui::CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate) { - if (t == 0.0f) + if (t1 == 0.0f) return 1; - if (t <= repeat_delay || repeat_rate <= 0.0f) + if (t0 >= t1) return 0; - const int count = (int)((t - repeat_delay) / repeat_rate) - (int)((t_prev - repeat_delay) / repeat_rate); - return (count > 0) ? count : 0; + if (repeat_rate <= 0.0f) + return (t0 < repeat_delay) && (t1 >= repeat_delay); + const int count_t0 = (t0 < repeat_delay) ? -1 : (int)((t0 - repeat_delay) / repeat_rate); + const int count_t1 = (t1 < repeat_delay) ? -1 : (int)((t1 - repeat_delay) / repeat_rate); + const int count = count_t1 - count_t0; + return count; } int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate) @@ -4149,7 +4633,7 @@ int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_r return 0; IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown)); const float t = g.IO.KeysDownDuration[key_index]; - return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate); + return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, repeat_delay, repeat_rate); } bool ImGui::IsKeyPressed(int user_key_index, bool repeat) @@ -4174,23 +4658,14 @@ bool ImGui::IsKeyReleased(int user_key_index) return g.IO.KeysDownDurationPrev[user_key_index] >= 0.0f && !g.IO.KeysDown[user_key_index]; } -bool ImGui::IsMouseDown(int button) +bool ImGui::IsMouseDown(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); return g.IO.MouseDown[button]; } -bool ImGui::IsAnyMouseDown() -{ - ImGuiContext& g = *GImGui; - for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++) - if (g.IO.MouseDown[n]) - return true; - return false; -} - -bool ImGui::IsMouseClicked(int button, bool repeat) +bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); @@ -4201,42 +4676,51 @@ bool ImGui::IsMouseClicked(int button, bool repeat) if (repeat && t > g.IO.KeyRepeatDelay) { // FIXME: 2019/05/03: Our old repeat code was wrong here and led to doubling the repeat rate, which made it an ok rate for repeat on mouse hold. - int amount = CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate * 0.5f); + int amount = CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate * 0.50f); if (amount > 0) return true; } - return false; } -bool ImGui::IsMouseReleased(int button) +bool ImGui::IsMouseReleased(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); return g.IO.MouseReleased[button]; } -bool ImGui::IsMouseDoubleClicked(int button) +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); return g.IO.MouseDoubleClicked[button]; } -bool ImGui::IsMouseDragging(int button, float lock_threshold) +// Return if a mouse click/drag went past the given threshold. Valid to call during the MouseReleased frame. +// [Internal] This doesn't test if the button is pressed +bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (!g.IO.MouseDown[button]) - return false; if (lock_threshold < 0.0f) lock_threshold = g.IO.MouseDragThreshold; return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; } +bool ImGui::IsMouseDragging(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (!g.IO.MouseDown[button]) + return false; + return IsMouseDragPastThreshold(button, lock_threshold); +} + ImVec2 ImGui::GetMousePos() { - return GImGui->IO.MousePos; + ImGuiContext& g = *GImGui; + return g.IO.MousePos; } // NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! @@ -4244,7 +4728,7 @@ ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() { ImGuiContext& g = *GImGui; if (g.BeginPopupStack.Size > 0) - return g.OpenPopupStack[g.BeginPopupStack.Size-1].OpenMousePos; + return g.OpenPopupStack[g.BeginPopupStack.Size - 1].OpenMousePos; return g.IO.MousePos; } @@ -4259,10 +4743,19 @@ bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID; } +bool ImGui::IsAnyMouseDown() +{ + ImGuiContext& g = *GImGui; + for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++) + if (g.IO.MouseDown[n]) + return true; + return false; +} + // Return the delta from the initial clicking position while the mouse button is clicked or was just released. // This is locked and return 0.0f until the mouse moves past a distance threshold at least once. -// NB: This is only valid if IsMousePosValid(). Back-ends in theory should always keep mouse position valid when dragging even outside the client window. -ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) +// NB: This is only valid if IsMousePosValid(). backends in theory should always keep mouse position valid when dragging even outside the client window. +ImVec2 ImGui::GetMouseDragDelta(ImGuiMouseButton button, float lock_threshold) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); @@ -4275,7 +4768,7 @@ ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) return ImVec2(0.0f, 0.0f); } -void ImGui::ResetMouseDragDelta(int button) +void ImGui::ResetMouseDragDelta(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); @@ -4330,30 +4823,41 @@ bool ImGui::IsItemDeactivated() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + if (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HasDeactivated) + return (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_Deactivated) != 0; return (g.ActiveIdPreviousFrame == window->DC.LastItemId && g.ActiveIdPreviousFrame != 0 && g.ActiveId != window->DC.LastItemId); } bool ImGui::IsItemDeactivatedAfterEdit() { ImGuiContext& g = *GImGui; - return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEdited || (g.ActiveId == 0 && g.ActiveIdHasBeenEdited)); + return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore)); } +// == GetItemID() == GetFocusID() bool ImGui::IsItemFocused() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - if (g.NavId == 0 || g.NavDisableHighlight || g.NavId != window->DC.LastItemId) + if (g.NavId != window->DC.LastItemId || g.NavId == 0) return false; return true; } -bool ImGui::IsItemClicked(int mouse_button) +// Important: this can be useful but it is NOT equivalent to the behavior of e.g.Button()! +// Most widgets have specific reactions based on mouse-up/down state, mouse position etc. +bool ImGui::IsItemClicked(ImGuiMouseButton mouse_button) { return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); } +bool ImGui::IsItemToggledOpen() +{ + ImGuiContext& g = *GImGui; + return (g.CurrentWindow->DC.LastItemStatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false; +} + bool ImGui::IsItemToggledSelection() { ImGuiContext& g = *GImGui; @@ -4391,15 +4895,27 @@ bool ImGui::IsItemEdited() } // Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. +// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. void ImGui::SetItemAllowOverlap() { ImGuiContext& g = *GImGui; - if (g.HoveredId == g.CurrentWindow->DC.LastItemId) + ImGuiID id = g.CurrentWindow->DC.LastItemId; + if (g.HoveredId == id) g.HoveredIdAllowOverlap = true; - if (g.ActiveId == g.CurrentWindow->DC.LastItemId) + if (g.ActiveId == id) g.ActiveIdAllowOverlap = true; } +void ImGui::SetItemUsingMouseWheel() +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.CurrentWindow->DC.LastItemId; + if (g.HoveredId == id) + g.HoveredIdUsingMouseWheel = true; + if (g.ActiveId == id) + g.ActiveIdUsingMouseWheel = true; +} + ImVec2 ImGui::GetItemRectMin() { ImGuiWindow* window = GetCurrentWindowRead(); @@ -4418,18 +4934,12 @@ ImVec2 ImGui::GetItemRectSize() return window->DC.LastItemRect.GetSize(); } -static ImRect GetViewportRect() -{ - ImGuiContext& g = *GImGui; - return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); -} - -static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) +bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* parent_window = g.CurrentWindow; - flags |= ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_ChildWindow; + flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag // Size @@ -4443,21 +4953,20 @@ static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size SetNextWindowSize(size); // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. - char title[256]; if (name) - ImFormatString(title, IM_ARRAYSIZE(title), "%s/%s_%08X", parent_window->Name, name, id); + ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%s/%s_%08X", parent_window->Name, name, id); else - ImFormatString(title, IM_ARRAYSIZE(title), "%s/%08X", parent_window->Name, id); + ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%s/%08X", parent_window->Name, id); const float backup_border_size = g.Style.ChildBorderSize; if (!border) g.Style.ChildBorderSize = 0.0f; - bool ret = Begin(title, NULL, flags); + bool ret = Begin(g.TempBuffer, NULL, flags); g.Style.ChildBorderSize = backup_border_size; ImGuiWindow* child_window = g.CurrentWindow; child_window->ChildId = id; - child_window->AutoFitChildAxises = auto_fit_axises; + child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. // While this is not really documented/defined, it seems that the expected thing to do. @@ -4469,7 +4978,7 @@ static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size { FocusWindow(child_window); NavInitWindow(child_window, false); - SetActiveID(id+1, child_window); // Steal ActiveId with a dummy id so that key-press won't activate child item + SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item g.ActiveIdSource = ImGuiInputSource_Nav; } return ret; @@ -4492,7 +5001,10 @@ void ImGui::EndChild() ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss + IM_ASSERT(g.WithinEndChild == false); + IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls + + g.WithinEndChild = true; if (window->BeginCount > 1) { End(); @@ -4516,14 +5028,18 @@ void ImGui::EndChild() // When browsing a window that has no activable items (scroll only) we keep a highlight on the child if (window->DC.NavLayerActiveMask == 0 && window == g.NavWindow) - RenderNavHighlight(ImRect(bb.Min - ImVec2(2,2), bb.Max + ImVec2(2,2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); + RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); } else { // Not navigable into ItemAdd(bb, 0); } + if (g.HoveredWindow == window) + parent_window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HoveredWindow; } + g.WithinEndChild = false; + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return } // Helper to create a child window / scrolling region that looks like a normal widget frame. @@ -4546,22 +5062,6 @@ void ImGui::EndChildFrame() EndChild(); } -// Save and compare stack sizes on Begin()/End() to detect usage errors -static void CheckStacksSize(ImGuiWindow* window, bool write) -{ - // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) - ImGuiContext& g = *GImGui; - short* p_backup = &window->DC.StackSizesBackup[0]; - { int current = window->IDStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "PushID/PopID or TreeNode/TreePop Mismatch!"); p_backup++; } // Too few or too many PopID()/TreePop() - { int current = window->DC.GroupStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "BeginGroup/EndGroup Mismatch!"); p_backup++; } // Too few or too many EndGroup() - { int current = g.BeginPopupStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup == current && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch"); p_backup++;}// Too few or too many EndMenu()/EndPopup() - // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them. - { int current = g.ColorModifiers.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushStyleColor/PopStyleColor Mismatch!"); p_backup++; } // Too few or too many PopStyleColor() - { int current = g.StyleModifiers.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushStyleVar/PopStyleVar Mismatch!"); p_backup++; } // Too few or too many PopStyleVar() - { int current = g.FontStack.Size; if (write) *p_backup = (short)current; else IM_ASSERT(*p_backup >= current && "PushFont/PopFont Mismatch!"); p_backup++; } // Too few or too many PopFont() - IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup)); -} - static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) { window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); @@ -4581,9 +5081,18 @@ ImGuiWindow* ImGui::FindWindowByName(const char* name) return FindWindowByID(id); } -static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags) +static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) +{ + window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); + if (settings->Size.x > 0 && settings->Size.y > 0) + window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); + window->Collapsed = settings->Collapsed; +} + +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; + //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags); // Create window the first time ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name); @@ -4591,22 +5100,19 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl g.WindowsById.SetVoidPtr(window->ID, window); // Default/arbitrary window position. Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. - window->Pos = ImVec2(60, 60); + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + window->Pos = main_viewport->Pos + ImVec2(60, 60); // User can disable loading and saving of settings. Tooltip and child windows also don't store settings. if (!(flags & ImGuiWindowFlags_NoSavedSettings)) if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID)) { // Retrieve settings from .ini file - window->SettingsIdx = g.SettingsWindows.index_from_ptr(settings); + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false); - window->Pos = ImFloor(settings->Pos); - window->Collapsed = settings->Collapsed; - if (ImLengthSqr(settings->Size) > 0.00001f) - size = ImFloor(settings->Size); + ApplyWindowSettings(window, settings); } - window->Size = window->SizeFull = window->SizeFullAtLastBegin = ImFloor(size); - window->DC.CursorMaxPos = window->Pos; // So first call to CalcSizeContents() doesn't return crazy values + window->DC.CursorStartPos = window->DC.CursorMaxPos = window->Pos; // So first call to CalcContentSize() doesn't return crazy values if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) { @@ -4630,10 +5136,11 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl return window; } -static ImVec2 CalcSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size) +static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) { ImGuiContext& g = *GImGui; - if (g.NextWindowData.SizeConstraintCond != 0) + ImVec2 new_size = size_desired; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) { // Using -1,-1 on either X/Y axis to preserve the current size. ImRect cr = g.NextWindowData.SizeConstraintRect; @@ -4649,106 +5156,86 @@ static ImVec2 CalcSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size) g.NextWindowData.SizeCallback(&data); new_size = data.DesiredSize; } - new_size.x = ImFloor(new_size.x); - new_size.y = ImFloor(new_size.y); + new_size.x = IM_FLOOR(new_size.x); + new_size.y = IM_FLOOR(new_size.y); } // Minimum size if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) { + ImGuiWindow* window_for_height = window; new_size = ImMax(new_size, g.Style.WindowMinSize); - new_size.y = ImMax(new_size.y, window->TitleBarHeight() + window->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows + new_size.y = ImMax(new_size.y, window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows } return new_size; } -static ImVec2 CalcSizeContents(ImGuiWindow* window) +static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) { - if (window->Collapsed) - if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - return window->SizeContents; - if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0) - return window->SizeContents; + bool preserve_old_content_sizes = false; + if (window->Collapsed && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) + preserve_old_content_sizes = true; + else if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0) + preserve_old_content_sizes = true; + if (preserve_old_content_sizes) + { + *content_size_current = window->ContentSize; + *content_size_ideal = window->ContentSizeIdeal; + return; + } - ImVec2 sz; - sz.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : (window->DC.CursorMaxPos.x - window->Pos.x + window->Scroll.x)); - sz.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : (window->DC.CursorMaxPos.y - window->Pos.y + window->Scroll.y)); - return sz + window->WindowPadding; + content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); + content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); + content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); + content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); } -static ImVec2 CalcSizeAutoFit(ImGuiWindow* window, const ImVec2& size_contents) +static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) { ImGuiContext& g = *GImGui; ImGuiStyle& style = g.Style; + ImVec2 size_decorations = ImVec2(0.0f, window->TitleBarHeight() + window->MenuBarHeight()); + ImVec2 size_pad = window->WindowPadding * 2.0f; + ImVec2 size_desired = size_contents + size_pad + size_decorations; if (window->Flags & ImGuiWindowFlags_Tooltip) { // Tooltip always resize - return size_contents; + return size_desired; } else { - // Maximum window size is determined by the display size + // Maximum window size is determined by the viewport size or monitor size const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; ImVec2 size_min = style.WindowMinSize; if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); - ImVec2 size_auto_fit = ImClamp(size_contents, size_min, ImMax(size_min, g.IO.DisplaySize - style.DisplaySafeAreaPadding * 2.0f)); + + // FIXME-VIEWPORT-WORKAREA: May want to use GetWorkSize() instead of Size depending on the type of windows? + ImVec2 avail_size = ImGui::GetMainViewport()->Size; + ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); // When the window cannot fit all contents (either because of constraints, either because screen is too small), // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. - ImVec2 size_auto_fit_after_constraint = CalcSizeAfterConstraint(window, size_auto_fit); - if (size_auto_fit_after_constraint.x < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) + ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); + bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - size_decorations.x < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); + bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - size_decorations.y < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); + if (will_have_scrollbar_x) size_auto_fit.y += style.ScrollbarSize; - if (size_auto_fit_after_constraint.y < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) + if (will_have_scrollbar_y) size_auto_fit.x += style.ScrollbarSize; return size_auto_fit; } } -ImVec2 ImGui::CalcWindowExpectedSize(ImGuiWindow* window) +ImVec2 ImGui::CalcWindowNextAutoFitSize(ImGuiWindow* window) { - ImVec2 size_contents = CalcSizeContents(window); - return CalcSizeAfterConstraint(window, CalcSizeAutoFit(window, size_contents)); -} - -float ImGui::GetWindowScrollMaxX(ImGuiWindow* window) -{ - return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x)); -} - -float ImGui::GetWindowScrollMaxY(ImGuiWindow* window) -{ - return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y)); -} - -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges) -{ - ImGuiContext& g = *GImGui; - ImVec2 scroll = window->Scroll; - if (window->ScrollTarget.x < FLT_MAX) - { - float cr_x = window->ScrollTargetCenterRatio.x; - scroll.x = window->ScrollTarget.x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x); - } - if (window->ScrollTarget.y < FLT_MAX) - { - // 'snap_on_edges' allows for a discontinuity at the edge of scrolling limits to take account of WindowPadding so that scrolling to make the last item visible scroll far enough to see the padding. - float cr_y = window->ScrollTargetCenterRatio.y; - float target_y = window->ScrollTarget.y; - if (snap_on_edges && cr_y <= 0.0f && target_y <= window->WindowPadding.y) - target_y = 0.0f; - if (snap_on_edges && cr_y >= 1.0f && target_y >= window->SizeContents.y - window->WindowPadding.y + g.Style.ItemSpacing.y) - target_y = window->SizeContents.y; - scroll.y = target_y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y); - } - scroll = ImMax(scroll, ImVec2(0.0f, 0.0f)); - if (!window->Collapsed && !window->SkipItems) - { - scroll.x = ImMin(scroll.x, ImGui::GetWindowScrollMaxX(window)); - scroll.y = ImMin(scroll.y, ImGui::GetWindowScrollMaxY(window)); - } - return scroll; + ImVec2 size_contents_current; + ImVec2 size_contents_ideal; + CalcWindowContentSizes(window, &size_contents_current, &size_contents_ideal); + ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, size_contents_ideal); + ImVec2 size_final = CalcWindowSizeAfterConstraint(window, size_auto_fit); + return size_final; } static ImGuiCol GetWindowBgColorIdxFromFlags(ImGuiWindowFlags flags) @@ -4765,7 +5252,7 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right ImVec2 size_expected = pos_max - pos_min; - ImVec2 size_constrained = CalcSizeAfterConstraint(window, size_expected); + ImVec2 size_constrained = CalcWindowSizeAfterConstraint(window, size_expected); *out_pos = pos_min; if (corner_norm.x == 0.0f) out_pos->x -= (size_constrained.x - size_expected.x); @@ -4783,37 +5270,66 @@ struct ImGuiResizeGripDef static const ImGuiResizeGripDef resize_grip_def[4] = { - { ImVec2(1,1), ImVec2(-1,-1), 0, 3 }, // Lower right - { ImVec2(0,1), ImVec2(+1,-1), 3, 6 }, // Lower left - { ImVec2(0,0), ImVec2(+1,+1), 6, 9 }, // Upper left - { ImVec2(1,0), ImVec2(-1,+1), 9,12 }, // Upper right + { ImVec2(1, 1), ImVec2(-1, -1), 0, 3 }, // Lower-right + { ImVec2(0, 1), ImVec2(+1, -1), 3, 6 }, // Lower-left + { ImVec2(0, 0), ImVec2(+1, +1), 6, 9 }, // Upper-left (Unused) + { ImVec2(1, 0), ImVec2(-1, +1), 9, 12 }, // Upper-right (Unused) +}; + +struct ImGuiResizeBorderDef +{ + ImVec2 InnerDir; + ImVec2 CornerPosN1, CornerPosN2; + float OuterAngle; +}; + +static const ImGuiResizeBorderDef resize_border_def[4] = +{ + { ImVec2(0, +1), ImVec2(0, 0), ImVec2(1, 0), IM_PI * 1.50f }, // Top + { ImVec2(-1, 0), ImVec2(1, 0), ImVec2(1, 1), IM_PI * 0.00f }, // Right + { ImVec2(0, -1), ImVec2(1, 1), ImVec2(0, 1), IM_PI * 0.50f }, // Bottom + { ImVec2(+1, 0), ImVec2(0, 1), ImVec2(0, 0), IM_PI * 1.00f } // Left }; static ImRect GetResizeBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness) { ImRect rect = window->Rect(); - if (thickness == 0.0f) rect.Max -= ImVec2(1,1); - if (border_n == 0) return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); // Top - if (border_n == 1) return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); // Right - if (border_n == 2) return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); // Bottom - if (border_n == 3) return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); // Left + if (thickness == 0.0f) rect.Max -= ImVec2(1, 1); + if (border_n == 0) { return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); } // Top + if (border_n == 1) { return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); } // Right + if (border_n == 2) { return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); } // Bottom + if (border_n == 3) { return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); } // Left IM_ASSERT(0); return ImRect(); } +// 0..3: corners (Lower-right, Lower-left, Unused, Unused) +// 4..7: borders (Top, Right, Bottom, Left) +ImGuiID ImGui::GetWindowResizeID(ImGuiWindow* window, int n) +{ + IM_ASSERT(n >= 0 && n <= 7); + ImGuiID id = window->ID; + id = ImHashStr("#RESIZE", 0, id); + id = ImHashData(&n, sizeof(int), id); + return id; +} + // Handle resize for: Resize Grips, Borders, Gamepad -static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]) +// Return true when using auto-fit (double click on resize grip) +static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) { ImGuiContext& g = *GImGui; ImGuiWindowFlags flags = window->Flags; - if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) - return; - if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window. - return; + if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + return false; + if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window. + return false; + + bool ret_auto_fit = false; const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; - const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f); - const float grip_hover_inner_size = (float)(int)(grip_draw_size * 0.75f); + const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS : 0.0f; ImVec2 pos_target(FLT_MAX, FLT_MAX); @@ -4821,7 +5337,6 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au // Resize grips and borders are on layer 1 window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu); // Manual resize grips PushID("#RESIZE"); @@ -4835,7 +5350,7 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au if (resize_rect.Min.x > resize_rect.Max.x) ImSwap(resize_rect.Min.x, resize_rect.Max.x); if (resize_rect.Min.y > resize_rect.Max.y) ImSwap(resize_rect.Min.y, resize_rect.Max.y); bool hovered, held; - ButtonBehavior(resize_rect, window->GetID((void*)(intptr_t)resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); + ButtonBehavior(resize_rect, window->GetID(resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); //GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255)); if (hovered || held) g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; @@ -4843,7 +5358,8 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au if (held && g.IO.MouseDoubleClicked[0] && resize_grip_n == 0) { // Manual auto-fit when double-clicking - size_target = CalcSizeAfterConstraint(window, size_auto_fit); + size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); + ret_auto_fit = true; ClearActiveID(); } else if (held) @@ -4851,6 +5367,9 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au // Resize from any of the four corners // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(grip.InnerDir * grip_hover_outer_size, grip.InnerDir * -grip_hover_inner_size, grip.CornerPosN); // Corner of the window corresponding to our corner grip + ImVec2 clamp_min = ImVec2(grip.CornerPosN.x == 1.0f ? visibility_rect.Min.x : -FLT_MAX, grip.CornerPosN.y == 1.0f ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max = ImVec2(grip.CornerPosN.x == 0.0f ? visibility_rect.Max.x : +FLT_MAX, grip.CornerPosN.y == 0.0f ? visibility_rect.Max.y : +FLT_MAX); + corner_target = ImClamp(corner_target, clamp_min, clamp_max); CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerPosN, &pos_target, &size_target); } if (resize_grip_n == 0 || held || hovered) @@ -4860,7 +5379,7 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au { bool hovered, held; ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); - ButtonBehavior(border_rect, window->GetID((void*)(intptr_t)(border_n + 4)), &hovered, &held, ImGuiButtonFlags_FlattenChildren); + ButtonBehavior(border_rect, window->GetID(border_n + 4), &hovered, &held, ImGuiButtonFlags_FlattenChildren); //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) { @@ -4876,28 +5395,35 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au if (border_n == 1) { border_posn = ImVec2(1, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Right if (border_n == 2) { border_posn = ImVec2(0, 1); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Bottom if (border_n == 3) { border_posn = ImVec2(0, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Left + ImVec2 clamp_min = ImVec2(border_n == 1 ? visibility_rect.Min.x : -FLT_MAX, border_n == 2 ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max = ImVec2(border_n == 3 ? visibility_rect.Max.x : +FLT_MAX, border_n == 0 ? visibility_rect.Max.y : +FLT_MAX); + border_target = ImClamp(border_target, clamp_min, clamp_max); CalcResizePosSizeFromAnyCorner(window, border_target, border_posn, &pos_target, &size_target); } } PopID(); + // Restore nav layer + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + // Navigation resize (keyboard/gamepad) if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window) { ImVec2 nav_resize_delta; - if (g.NavInputSource == ImGuiInputSource_NavKeyboard && g.IO.KeyShift) + if (g.NavInputSource == ImGuiInputSource_Keyboard && g.IO.KeyShift) nav_resize_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard, ImGuiInputReadMode_Down); - if (g.NavInputSource == ImGuiInputSource_NavGamepad) + if (g.NavInputSource == ImGuiInputSource_Gamepad) nav_resize_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_Down); if (nav_resize_delta.x != 0.0f || nav_resize_delta.y != 0.0f) { const float NAV_RESIZE_SPEED = 600.0f; nav_resize_delta *= ImFloor(NAV_RESIZE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); + nav_resize_delta = ImMax(nav_resize_delta, visibility_rect.Min - window->Pos - window->Size); g.NavWindowingToggleLayer = false; g.NavDisableMouseHover = true; resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. - size_target = CalcSizeAfterConstraint(window, window->SizeFull + nav_resize_delta); + size_target = CalcWindowSizeAfterConstraint(window, window->SizeFull + nav_resize_delta); } } @@ -4913,49 +5439,35 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au MarkIniSettingsDirty(window); } - // Resize nav layer - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main); - window->Size = window->SizeFull; + return ret_auto_fit; } -static inline void ClampWindowRect(ImGuiWindow* window, const ImRect& rect, const ImVec2& padding) +static inline void ClampWindowRect(ImGuiWindow* window, const ImRect& visibility_rect) { ImGuiContext& g = *GImGui; - ImVec2 size_for_clamping = (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) ? ImVec2(window->Size.x, window->TitleBarHeight()) : window->Size; - window->Pos = ImMin(rect.Max - padding, ImMax(window->Pos + size_for_clamping, rect.Min + padding) - size_for_clamping); + ImVec2 size_for_clamping = window->Size; + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + size_for_clamping.y = window->TitleBarHeight(); + window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); } -static void ImGui::RenderOuterBorders(ImGuiWindow* window) +static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) { ImGuiContext& g = *GImGui; float rounding = window->WindowRounding; float border_size = window->WindowBorderSize; if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) - window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size); + window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); int border_held = window->ResizeBorderHeld; if (border_held != -1) { - struct ImGuiResizeBorderDef - { - ImVec2 InnerDir; - ImVec2 CornerPosN1, CornerPosN2; - float OuterAngle; - }; - static const ImGuiResizeBorderDef resize_border_def[4] = - { - { ImVec2(0,+1), ImVec2(0,0), ImVec2(1,0), IM_PI*1.50f }, // Top - { ImVec2(-1,0), ImVec2(1,0), ImVec2(1,1), IM_PI*0.00f }, // Right - { ImVec2(0,-1), ImVec2(1,1), ImVec2(0,1), IM_PI*0.50f }, // Bottom - { ImVec2(+1,0), ImVec2(0,1), ImVec2(0,0), IM_PI*1.00f } // Left - }; const ImGuiResizeBorderDef& def = resize_border_def[border_held]; ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI*0.25f, def.OuterAngle); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI*0.25f); - window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), false, ImMax(2.0f, border_size)); // Thicker than usual + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); + window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual } if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) { @@ -4964,6 +5476,175 @@ static void ImGui::RenderOuterBorders(ImGuiWindow* window) } } +// Draw background and borders +// Draw and handle scrollbars +void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + // Ensure that ScrollBar doesn't read last frame's SkipItems + IM_ASSERT(window->BeginCount == 0); + window->SkipItems = false; + + // Draw window + handle manual resize + // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame. + const float window_rounding = window->WindowRounding; + const float window_border_size = window->WindowBorderSize; + if (window->Collapsed) + { + // Title bar only + float backup_border_size = style.FrameBorderSize; + g.Style.FrameBorderSize = window->WindowBorderSize; + ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed); + RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding); + g.Style.FrameBorderSize = backup_border_size; + } + else + { + // Window background + if (!(flags & ImGuiWindowFlags_NoBackground)) + { + ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags)); + bool override_alpha = false; + float alpha = 1.0f; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha) + { + alpha = g.NextWindowData.BgAlphaVal; + override_alpha = true; + } + if (override_alpha) + bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); + window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); + } + + // Title bar + if (!(flags & ImGuiWindowFlags_NoTitleBar)) + { + ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg); + window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawFlags_RoundCornersTop); + } + + // Menu bar + if (flags & ImGuiWindowFlags_MenuBar) + { + ImRect menu_bar_rect = window->MenuBarRect(); + menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. + window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop); + if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) + window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); + } + + // Scrollbars + if (window->ScrollbarX) + Scrollbar(ImGuiAxis_X); + if (window->ScrollbarY) + Scrollbar(ImGuiAxis_Y); + + // Render resize grips (after their input handling so we don't have a frame of latency) + if (!(flags & ImGuiWindowFlags_NoResize)) + { + for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) + { + const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; + const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size))); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size))); + window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); + window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]); + } + } + + // Borders + RenderWindowOuterBorders(window); + } +} + +// Render title text, collapse button, close button +void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + const bool has_close_button = (p_open != NULL); + const bool has_collapse_button = !(flags & ImGuiWindowFlags_NoCollapse) && (style.WindowMenuButtonPosition != ImGuiDir_None); + + // Close & Collapse button are on the Menu NavLayer and don't default focus (unless there's nothing else on that layer) + const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags; + window->DC.ItemFlags |= ImGuiItemFlags_NoNavDefaultFocus; + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + + // Layout buttons + // FIXME: Would be nice to generalize the subtleties expressed here into reusable code. + float pad_l = style.FramePadding.x; + float pad_r = style.FramePadding.x; + float button_sz = g.FontSize; + ImVec2 close_button_pos; + ImVec2 collapse_button_pos; + if (has_close_button) + { + pad_r += button_sz; + close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) + { + pad_r += button_sz; + collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) + { + collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); + pad_l += button_sz; + } + + // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) + if (has_collapse_button) + if (CollapseButton(window->GetID("#COLLAPSE"), collapse_button_pos)) + window->WantCollapseToggle = true; // Defer actual collapsing to next frame as we are too far in the Begin() function + + // Close button + if (has_close_button) + if (CloseButton(window->GetID("#CLOSE"), close_button_pos)) + *p_open = false; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + window->DC.ItemFlags = item_flags_backup; + + // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker) + // FIXME: Refactor text alignment facilities along with RenderText helpers, this is WAY too much messy code.. + const char* UNSAVED_DOCUMENT_MARKER = "*"; + const float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? CalcTextSize(UNSAVED_DOCUMENT_MARKER, NULL, false).x : 0.0f; + const ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f); + + // As a nice touch we try to ensure that centered title text doesn't get affected by visibility of Close/Collapse button, + // while uncentered title text will still reach edges correctly. + if (pad_l > style.FramePadding.x) + pad_l += g.Style.ItemInnerSpacing.x; + if (pad_r > style.FramePadding.x) + pad_r += g.Style.ItemInnerSpacing.x; + if (style.WindowTitleAlign.x > 0.0f && style.WindowTitleAlign.x < 1.0f) + { + float centerness = ImSaturate(1.0f - ImFabs(style.WindowTitleAlign.x - 0.5f) * 2.0f); // 0.0f on either edges, 1.0f on center + float pad_extend = ImMin(ImMax(pad_l, pad_r), title_bar_rect.GetWidth() - pad_l - pad_r - text_size.x); + pad_l = ImMax(pad_l, pad_extend * centerness); + pad_r = ImMax(pad_r, pad_extend * centerness); + } + + ImRect layout_r(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y, title_bar_rect.Max.x - pad_r, title_bar_rect.Max.y); + ImRect clip_r(layout_r.Min.x, layout_r.Min.y, ImMin(layout_r.Max.x + g.Style.ItemInnerSpacing.x, title_bar_rect.Max.x), layout_r.Max.y); + //if (g.IO.KeyShift) window->DrawList->AddRect(layout_r.Min, layout_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + //if (g.IO.KeyCtrl) window->DrawList->AddRect(clip_r.Min, clip_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + RenderTextClipped(layout_r.Min, layout_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_r); + if (flags & ImGuiWindowFlags_UnsavedDocument) + { + ImVec2 marker_pos = ImVec2(ImMax(layout_r.Min.x, layout_r.Min.x + (layout_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x) + text_size.x, layout_r.Min.y) + ImVec2(2 - marker_size_x, 0.0f); + ImVec2 off = ImVec2(0.0f, IM_FLOOR(-g.FontSize * 0.25f)); + RenderTextClipped(marker_pos + off, layout_r.Max + off, UNSAVED_DOCUMENT_MARKER, NULL, NULL, ImVec2(0, style.WindowTitleAlign.y), &clip_r); + } +} + void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window) { window->ParentWindow = parent_window; @@ -4979,7 +5660,7 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags } } -// Push a new ImGui window to add widgets to. +// Push a new Dear ImGui window to add widgets to. // - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair. // - Begin/End can be called multiple times during the frame with the same window name to append content. // - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). @@ -4991,17 +5672,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required - IM_ASSERT(g.FrameScopeActive); // Forgot to call ImGui::NewFrame() + IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame() IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet // Find or create ImGuiWindow* window = FindWindowByName(name); const bool window_just_created = (window == NULL); if (window_just_created) - { - ImVec2 size_on_first_use = (g.NextWindowData.SizeCond != 0) ? g.NextWindowData.SizeVal : ImVec2(0.0f, 0.0f); // Any condition flag will do since we are creating a new window here. - window = CreateNewWindow(name, size_on_first_use, flags); - } + window = CreateNewWindow(name, flags); // Automatically disable manual moving/resizing when NoInputs is set if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) @@ -5012,6 +5690,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) const int current_frame = g.FrameCount; const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame); + window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow); // Update the Appearing flag bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on @@ -5031,6 +5710,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { window->Flags = (ImGuiWindowFlags)flags; window->LastFrameActive = current_frame; + window->LastTimeActive = (float)g.Time; window->BeginOrderWithinParent = 0; window->BeginOrderWithinContext = (short)(g.WindowsActiveCount++); } @@ -5044,11 +5724,17 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow; IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); + // We allow window memory to be compacted so recreate the base stack when needed. + if (window->IDStack.Size == 0) + window->IDStack.push_back(window->ID); + // Add to stack // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() g.CurrentWindowStack.push_back(window); + g.CurrentWindow = window; + window->DC.StackSizesOnBegin.SetToCurrentState(); g.CurrentWindow = NULL; - CheckStacksSize(window, true); + if (flags & ImGuiWindowFlags_Popup) { ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; @@ -5057,13 +5743,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->PopupId = popup_ref.PopupId; } - if (window_just_appearing_after_hidden_for_resize && !(flags & ImGuiWindowFlags_ChildWindow)) - window->NavLastIds[0] = 0; + // Update ->RootWindow and others pointers (before any possible call to FocusWindow) + if (first_begin_of_the_frame) + UpdateWindowParentAndRootLinks(window, flags, parent_window); // Process SetNextWindow***() calls + // (FIXME: Consider splitting the HasXXX flags into X/Y components bool window_pos_set_by_api = false; bool window_size_x_set_by_api = false, window_size_y_set_by_api = false; - if (g.NextWindowData.PosCond) + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) { window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0; if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f) @@ -5079,26 +5767,32 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond); } } - if (g.NextWindowData.SizeCond) + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) { window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); } - if (g.NextWindowData.ContentSizeCond) + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) { - // Adjust passed "client size" to become a "window size" - window->SizeContentsExplicit = g.NextWindowData.ContentSizeVal; - if (window->SizeContentsExplicit.y != 0.0f) - window->SizeContentsExplicit.y += window->TitleBarHeight() + window->MenuBarHeight(); + if (g.NextWindowData.ScrollVal.x >= 0.0f) + { + window->ScrollTarget.x = g.NextWindowData.ScrollVal.x; + window->ScrollTargetCenterRatio.x = 0.0f; + } + if (g.NextWindowData.ScrollVal.y >= 0.0f) + { + window->ScrollTarget.y = g.NextWindowData.ScrollVal.y; + window->ScrollTargetCenterRatio.y = 0.0f; + } } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize) + window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal; else if (first_begin_of_the_frame) - { - window->SizeContentsExplicit = ImVec2(0.0f, 0.0f); - } - if (g.NextWindowData.CollapsedCond) + window->ContentSizeExplicit = ImVec2(0.0f, 0.0f); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed) SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond); - if (g.NextWindowData.FocusCond) + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus) FocusWindow(window); if (window->Appearing) SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); @@ -5108,17 +5802,21 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { // Initialize const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) - UpdateWindowParentAndRootLinks(window, flags, parent_window); - window->Active = true; window->HasCloseButton = (p_open != NULL); - window->ClipRect = ImVec4(-FLT_MAX,-FLT_MAX,+FLT_MAX,+FLT_MAX); + window->ClipRect = ImVec4(-FLT_MAX, -FLT_MAX, +FLT_MAX, +FLT_MAX); window->IDStack.resize(1); + window->DrawList->_ResetForNewFrame(); + window->DC.CurrentTableIdx = -1; + + // Restore buffer capacity when woken from a compacted state, to avoid + if (window->MemoryCompacted) + GcAwakeTransientWindowBuffers(window); // Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged). // The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere. bool window_title_visible_elsewhere = false; - if (g.NavWindowingList != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB + if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB window_title_visible_elsewhere = true; if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0) { @@ -5130,18 +5828,20 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS // Update contents size from last frame for auto-fitting (or use explicit size) - window->SizeContents = CalcSizeContents(window); + CalcWindowContentSizes(window, &window->ContentSize, &window->ContentSizeIdeal); if (window->HiddenFramesCanSkipItems > 0) window->HiddenFramesCanSkipItems--; if (window->HiddenFramesCannotSkipItems > 0) window->HiddenFramesCannotSkipItems--; + if (window->HiddenFramesForRenderOnly > 0) + window->HiddenFramesForRenderOnly--; // Hide new windows for one frame until they calculate their size if (window_just_created && (!window_size_x_set_by_api || !window_size_y_set_by_api)) window->HiddenFramesCannotSkipItems = 1; // Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows) - // We reset Size/SizeContents for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size. + // We reset Size/ContentSize for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size. if (window_just_activated_by_user && (flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0) { window->HiddenFramesCannotSkipItems = 1; @@ -5151,13 +5851,16 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->Size.x = window->SizeFull.x = 0.f; if (!window_size_y_set_by_api) window->Size.y = window->SizeFull.y = 0.f; - window->SizeContents = ImVec2(0.f, 0.f); + window->ContentSize = window->ContentSizeIdeal = ImVec2(0.f, 0.f); } } + // SELECT VIEWPORT + // FIXME-VIEWPORT: In the docking/viewport branch, this is the point where we select the current viewport (which may affect the style) SetCurrentWindow(window); - // Lock border size and padding for the frame (so that altering them doesn't cause inconsistencies) + // LOCK BORDER SIZE AND PADDING FOR THE FRAME (so that altering them doesn't cause inconsistencies) + if (flags & ImGuiWindowFlags_ChildWindow) window->WindowBorderSize = style.ChildBorderSize; else @@ -5165,6 +5868,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->WindowPadding = style.WindowPadding; if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); + + // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; @@ -5180,7 +5885,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { window->Collapsed = !window->Collapsed; MarkIniSettingsDirty(window); - FocusWindow(window); } } else @@ -5192,46 +5896,47 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // SIZE // Calculate auto-fit size, handle automatic resize - const ImVec2 size_auto_fit = CalcSizeAutoFit(window, window->SizeContents); - ImVec2 size_full_modified(FLT_MAX, FLT_MAX); + const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal); + bool use_current_size_for_scrollbar_x = window_just_created; + bool use_current_size_for_scrollbar_y = window_just_created; if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed) { // Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc. if (!window_size_x_set_by_api) - window->SizeFull.x = size_full_modified.x = size_auto_fit.x; + { + window->SizeFull.x = size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } if (!window_size_y_set_by_api) - window->SizeFull.y = size_full_modified.y = size_auto_fit.y; + { + window->SizeFull.y = size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } } else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) { // Auto-fit may only grow window during the first few frames // We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. if (!window_size_x_set_by_api && window->AutoFitFramesX > 0) - window->SizeFull.x = size_full_modified.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; + { + window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } if (!window_size_y_set_by_api && window->AutoFitFramesY > 0) - window->SizeFull.y = size_full_modified.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; + { + window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } if (!window->Collapsed) MarkIniSettingsDirty(window); } // Apply minimum/maximum window size constraints and final size - window->SizeFull = CalcSizeAfterConstraint(window, window->SizeFull); + window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull); window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull; - // SCROLLBAR STATUS - - // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). - if (!window->Collapsed) - { - // When reading the current size we need to read it after size constraints have been applied - float size_x_for_scrollbars = size_full_modified.x != FLT_MAX ? window->SizeFull.x : window->SizeFullAtLastBegin.x; - float size_y_for_scrollbars = size_full_modified.y != FLT_MAX ? window->SizeFull.y : window->SizeFullAtLastBegin.y; - window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); - window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); - if (window->ScrollbarX && !window->ScrollbarY) - window->ScrollbarY = (window->SizeContents.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar); - window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); - } + // Decoration size + const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // POSITION @@ -5239,7 +5944,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (window_just_activated_by_user) { window->AutoPosLastDirection = ImGuiDir_None; - if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api) + if ((flags & ImGuiWindowFlags_Popup) != 0 && !(flags & ImGuiWindowFlags_Modal) && !window_pos_set_by_api) // FIXME: BeginPopup() could use SetNextWindowPos() window->Pos = g.BeginPopupStack.back().OpenPopupPos; } @@ -5255,7 +5960,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesCannotSkipItems == 0); if (window_pos_with_pivot) - SetWindowPos(window, ImMax(style.DisplaySafeAreaPadding, window->SetWindowPosVal - window->SizeFull * window->SetWindowPosPivot), 0); // Position given a pivot (e.g. for centering) + SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) window->Pos = FindBestWindowPosForPopup(window); else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) @@ -5263,25 +5968,28 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) window->Pos = FindBestWindowPosForPopup(window); - // Clamp position so it stays visible + // Calculate the range of allowed position for that window (to be movable and visible past safe area padding) + // When clamping to stay visible, we will enforce that window->Pos stays inside of visibility_rect. + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + ImRect viewport_rect(viewport->GetMainRect()); + ImRect viewport_work_rect(viewport->GetWorkRect()); + ImVec2 visibility_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); + ImRect visibility_rect(viewport_work_rect.Min + visibility_padding, viewport_work_rect.Max - visibility_padding); + + // Clamp position/size so window stays visible within its viewport or monitor // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. - ImRect viewport_rect(GetViewportRect()); if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - { - if (g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. - { - ImVec2 clamp_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); - ClampWindowRect(window, viewport_rect, clamp_padding); - } - } + if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) + ClampWindowRect(window, visibility_rect); window->Pos = ImFloor(window->Pos); // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) + // Large values tend to lead to variety of artifacts and are not recommended. window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; - // Apply scrolling - window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true); - window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); + // For windows with title bar or menu bar, we clamp to FrameHeight(FontSize + FramePadding.y * 2.0f) to completely hide artifacts. + //if ((window->Flags & ImGuiWindowFlags_MenuBar) || !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + // window->WindowRounding = ImMin(window->WindowRounding, g.FontSize + style.FramePadding.y * 2.0f); // Apply window focus (new and reactivated windows are moved to front) bool want_focus = false; @@ -5295,32 +6003,101 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // Handle manual resize: Resize Grips, Borders, Gamepad int border_held = -1; - ImU32 resize_grip_col[4] = { 0 }; - const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // 4 - const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f); + ImU32 resize_grip_col[4] = {}; + const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. + const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); if (!window->Collapsed) - UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]); + if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) + use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; window->ResizeBorderHeld = (signed char)border_held; + // SCROLLBAR VISIBILITY + + // Update scrollbar visibility (based on the Size that was effective during last frame or the auto-resized Size). + if (!window->Collapsed) + { + // When reading the current size we need to read it after size constraints have been applied. + // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again. + ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height); + ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes; + ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f; + float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x; + float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y; + //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons? + window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); + window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); + if (window->ScrollbarX && !window->ScrollbarY) + window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); + window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); + } + + // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING) + // Update various regions. Variables they depends on should be set above in this function. + // We set this up after processing the resize grip so that our rectangles doesn't lag by a frame. + + // Outer rectangle + // Not affected by window border size. Used by: + // - FindHoveredWindow() (w/ extra padding when border resize is enabled) + // - Begin() initial clipping rect for drawing window background and borders. + // - Begin() clipping whole child + const ImRect host_rect = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) ? parent_window->ClipRect : viewport_rect; + const ImRect outer_rect = window->Rect(); + const ImRect title_bar_rect = window->TitleBarRect(); + window->OuterRectClipped = outer_rect; + window->OuterRectClipped.ClipWith(host_rect); + + // Inner rectangle + // Not affected by window border size. Used by: + // - InnerClipRect + // - ScrollToBringRectIntoView() + // - NavUpdatePageUpPageDown() + // - Scrollbar() + window->InnerRect.Min.x = window->Pos.x; + window->InnerRect.Min.y = window->Pos.y + decoration_up_height; + window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x; + window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y; + + // Inner clipping rectangle. + // Will extend a little bit outside the normal work region. + // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. + // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. + // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. + // Affected by window/frame border size. Used by: + // - Begin() initial clip rect + float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); + window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); + window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); + window->InnerClipRect.ClipWithFull(host_rect); + // Default item width. Make it proportional to window size if window manually resizes if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) - window->ItemWidthDefault = (float)(int)(window->Size.x * 0.65f); + window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); else - window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f); + window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); + + // SCROLLING + + // Lock down maximum scrolling + // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate + // for right/bottom aligned items without creating a scrollbar. + window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); + window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); + + // Apply scrolling + window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window); + window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); // DRAWING // Setup draw list and outer clipping rectangle - window->DrawList->Clear(); - window->DrawList->Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0); + IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0); window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) - PushClipRect(parent_window->ClipRect.Min, parent_window->ClipRect.Max, true); - else - PushClipRect(viewport_rect.Min, viewport_rect.Max, true); + PushClipRect(host_rect.Min, host_rect.Max, false); // Draw modal window background (darkens what is behind them, all viewports) - const bool dim_bg_for_modal = (flags & ImGuiWindowFlags_Modal) && window == GetFrontMostPopupModal() && window->HiddenFramesCannotSkipItems <= 0; + const bool dim_bg_for_modal = (flags & ImGuiWindowFlags_Modal) && window == GetTopMostPopupModal() && window->HiddenFramesCannotSkipItems <= 0; const bool dim_bg_for_window_list = g.NavWindowingTargetAnim && (window == g.NavWindowingTargetAnim->RootWindow); if (dim_bg_for_modal || dim_bg_for_window_list) { @@ -5337,76 +6114,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha * 0.25f), g.Style.WindowRounding); } - // Draw window + handle manual resize - // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame. - const float window_rounding = window->WindowRounding; - const float window_border_size = window->WindowBorderSize; - const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; - const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); - const ImRect title_bar_rect = window->TitleBarRect(); - if (window->Collapsed) + // Since 1.71, child window can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call. + // When using overlapping child windows, this will break the assumption that child z-order is mapped to submission order. + // We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping child. + // We also disabled this when we have dimming overlay behind this specific one child. + // FIXME: More code may rely on explicit sorting of overlapping child window and would need to disable this somehow. Please get in contact if you are affected. { - // Title bar only - float backup_border_size = style.FrameBorderSize; - g.Style.FrameBorderSize = window->WindowBorderSize; - ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed); - RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding); - g.Style.FrameBorderSize = backup_border_size; - } - else - { - // Window background - if (!(flags & ImGuiWindowFlags_NoBackground)) - { - ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags)); - float alpha = 1.0f; - if (g.NextWindowData.BgAlphaCond != 0) - alpha = g.NextWindowData.BgAlphaVal; - if (alpha != 1.0f) - bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); - window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot); - } - g.NextWindowData.BgAlphaCond = 0; + bool render_decorations_in_parent = false; + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) + if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_window->DrawList->VtxBuffer.Size > 0) + render_decorations_in_parent = true; + if (render_decorations_in_parent) + window->DrawList = parent_window->DrawList; - // Title bar - if (!(flags & ImGuiWindowFlags_NoTitleBar)) - { - ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg); - window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawCornerFlags_Top); - } + // Handle title bar, scrollbar, resize grips and resize borders + const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; + const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); + RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size); - // Menu bar - if (flags & ImGuiWindowFlags_MenuBar) - { - ImRect menu_bar_rect = window->MenuBarRect(); - menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. - window->DrawList->AddRectFilled(menu_bar_rect.Min+ImVec2(window_border_size,0), menu_bar_rect.Max-ImVec2(window_border_size,0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top); - if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) - window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); - } - - // Scrollbars - if (window->ScrollbarX) - Scrollbar(ImGuiAxis_X); - if (window->ScrollbarY) - Scrollbar(ImGuiAxis_Y); - - // Render resize grips (after their input handling so we don't have a frame of latency) - if (!(flags & ImGuiWindowFlags_NoResize)) - { - for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) - { - const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; - const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, grip_draw_size) : ImVec2(grip_draw_size, window_border_size))); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(grip_draw_size, window_border_size) : ImVec2(window_border_size, grip_draw_size))); - window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); - window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]); - } - } - - // Borders - RenderOuterBorders(window); + if (render_decorations_in_parent) + window->DrawList = &window->DrawListInst; } // Draw navigation selection/windowing rectangle border @@ -5420,76 +6147,69 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) bb.Expand(-g.FontSize - 1.0f); rounding = window->WindowRounding; } - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f); + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, 0, 3.0f); } - // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars. - window->SizeFullAtLastBegin = window->SizeFull; + // UPDATE RECTANGLES (2- THOSE AFFECTED BY SCROLLING) - // Update various regions. Variables they depends on are set above in this function. - // FIXME: window->ContentsRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. - // NB: WindowBorderSize is included in WindowPadding _and_ ScrollbarSizes so we need to cancel one out. - window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; - window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); - window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x + ImMin(window->ScrollbarSizes.x, window->WindowBorderSize))); - window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y + ImMin(window->ScrollbarSizes.y, window->WindowBorderSize))); + // Work rectangle. + // Affected by window padding and border size. Used by: + // - Columns() for right-most edge + // - TreeNode(), CollapsingHeader() for right-most edge + // - BeginTabBar() for right-most edge + const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar); + const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); + const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); + const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); + window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); + window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); + window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; + window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; + window->ParentWorkRect = window->WorkRect; - // Save clipped aabb so we can access it in constant-time in FindHoveredWindow() - window->OuterRectClipped = window->Rect(); - window->OuterRectClipped.ClipWith(window->ClipRect); + // [LEGACY] Content Region + // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. + // Used by: + // - Mouse wheel scrolling + many other things + window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; + window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height; + window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); + window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); - // Inner rectangle - // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame - // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. - window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; - window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); - window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - ImMax(window->ScrollbarSizes.x, window->WindowBorderSize); - window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - ImMax(window->ScrollbarSizes.y, window->WindowBorderSize); - - // Inner clipping rectangle - // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. - window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); - window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y); - window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x * 0.5f - window->WindowBorderSize))); - window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y); // Setup drawing context // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x; window->DC.GroupOffset.x = 0.0f; window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.Indent.x + window->DC.ColumnsOffset.x, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y); + window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.Indent.x + window->DC.ColumnsOffset.x, decoration_up_height + window->WindowPadding.y - window->Scroll.y); window->DC.CursorPos = window->DC.CursorStartPos; window->DC.CursorPosPrevLine = window->DC.CursorPos; window->DC.CursorMaxPos = window->DC.CursorStartPos; - window->DC.CurrentLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); - window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.NavHideHighlightOneFrame = false; - window->DC.NavHasScroll = (GetWindowScrollMaxY(window) > 0.0f); + window->DC.IdealMaxPos = window->DC.CursorStartPos; + window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; window->DC.NavLayerActiveMask = window->DC.NavLayerActiveMaskNext; window->DC.NavLayerActiveMaskNext = 0x00; + window->DC.NavHideHighlightOneFrame = false; + window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f); + window->DC.MenuBarAppending = false; + window->DC.MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user); + window->DC.TreeDepth = 0; + window->DC.TreeJumpToParentOnPopMask = 0x00; window->DC.ChildWindows.resize(0); + window->DC.StateStorage = &window->StateStorage; + window->DC.CurrentColumns = NULL; window->DC.LayoutType = ImGuiLayoutType_Vertical; window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical; - window->DC.FocusCounterAll = window->DC.FocusCounterTab = -1; - window->DC.ItemFlags = parent_window ? parent_window->DC.ItemFlags : ImGuiItemFlags_Default_; + window->DC.FocusCounterRegular = window->DC.FocusCounterTabStop = -1; + window->DC.ItemWidth = window->ItemWidthDefault; window->DC.TextWrapPos = -1.0f; // disabled - window->DC.ItemFlagsStack.resize(0); window->DC.ItemWidthStack.resize(0); window->DC.TextWrapPosStack.resize(0); - window->DC.CurrentColumns = NULL; - window->DC.TreeDepth = 0; - window->DC.TreeStoreMayJumpToParentOnPop = 0x00; - window->DC.StateStorage = &window->StateStorage; - window->DC.GroupStack.resize(0); - window->MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user); - - if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags)) - { - window->DC.ItemFlags = parent_window->DC.ItemFlags; - window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags); - } if (window->AutoFitFramesX > 0) window->AutoFitFramesX--; @@ -5500,72 +6220,30 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (want_focus) { FocusWindow(window); - NavInitWindow(window, false); + NavInitWindow(window, false); // <-- this is in the way for us to be able to defer and sort reappearing FocusWindow() calls } // Title bar if (!(flags & ImGuiWindowFlags_NoTitleBar)) - { - // Close & collapse button are on layer 1 (same as menus) and don't default focus - const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags; - window->DC.ItemFlags |= ImGuiItemFlags_NoNavDefaultFocus; - window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu); + RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), name, p_open); - // Collapse button - if (!(flags & ImGuiWindowFlags_NoCollapse)) - if (CollapseButton(window->GetID("#COLLAPSE"), window->Pos)) - window->WantCollapseToggle = true; // Defer collapsing to next frame as we are too far in the Begin() function - - // Close button - if (p_open != NULL) - { - const float rad = g.FontSize * 0.5f; - if (CloseButton(window->GetID("#CLOSE"), ImVec2(window->Pos.x + window->Size.x - style.FramePadding.x - rad, window->Pos.y + style.FramePadding.y + rad), rad + 1)) - *p_open = false; - } - - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main); - window->DC.ItemFlags = item_flags_backup; - - // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker) - // FIXME: Refactor text alignment facilities along with RenderText helpers, this is too much code.. - const char* UNSAVED_DOCUMENT_MARKER = "*"; - float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? CalcTextSize(UNSAVED_DOCUMENT_MARKER, NULL, false).x : 0.0f; - ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f); - ImRect text_r = title_bar_rect; - float pad_left = (flags & ImGuiWindowFlags_NoCollapse) ? style.FramePadding.x : (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x); - float pad_right = (p_open == NULL) ? style.FramePadding.x : (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x); - if (style.WindowTitleAlign.x > 0.0f) - pad_right = ImLerp(pad_right, pad_left, style.WindowTitleAlign.x); - text_r.Min.x += pad_left; - text_r.Max.x -= pad_right; - ImRect clip_rect = text_r; - clip_rect.Max.x = window->Pos.x + window->Size.x - (p_open ? title_bar_rect.GetHeight() - 3 : style.FramePadding.x); // Match the size of CloseButton() - RenderTextClipped(text_r.Min, text_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_rect); - if (flags & ImGuiWindowFlags_UnsavedDocument) - { - ImVec2 marker_pos = ImVec2(ImMax(text_r.Min.x, text_r.Min.x + (text_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x) + text_size.x, text_r.Min.y) + ImVec2(2 - marker_size_x, 0.0f); - ImVec2 off = ImVec2(0.0f, (float)(int)(-g.FontSize * 0.25f)); - RenderTextClipped(marker_pos + off, text_r.Max + off, UNSAVED_DOCUMENT_MARKER, NULL, NULL, ImVec2(0, style.WindowTitleAlign.y), &clip_rect); - } - } + // Clear hit test shape every frame + window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0; // Pressing CTRL+C while holding on a window copy its content to the clipboard // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. // Maybe we can support CTRL+C on every element? /* - if (g.ActiveId == move_id) + //if (g.NavWindow == window && g.ActiveId == 0) + if (g.ActiveId == window->MoveId) if (g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_C)) LogToClipboard(); */ // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). // This is useful to allow creating context menus on title bar only, etc. - window->DC.LastItemId = window->MoveId; - window->DC.LastItemStatusFlags = IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0; - window->DC.LastItemRect = title_bar_rect; + SetLastItemData(window, window->MoveId, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + #ifdef IMGUI_ENABLE_TEST_ENGINE if (!(window->Flags & ImGuiWindowFlags_NoTitleBar)) IMGUI_TEST_ENGINE_ITEM_ADD(window->DC.LastItemRect, window->DC.LastItemId); @@ -5577,76 +6255,74 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) SetCurrentWindow(window); } + // Pull/inherit current state + window->DC.ItemFlags = g.ItemFlagsStack.back(); // Inherit from shared stack + window->DC.NavFocusScopeIdCurrent = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window->DC.NavFocusScopeIdCurrent : 0; // Inherit from parent only // -V595 + PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) - if (first_begin_of_the_frame) - window->WriteAccessed = false; - + window->WriteAccessed = false; window->BeginCount++; - g.NextWindowData.Clear(); + g.NextWindowData.ClearFlags(); - if (flags & ImGuiWindowFlags_ChildWindow) + // Update visibility + if (first_begin_of_the_frame) { - // Child window can be out of sight and have "negative" clip windows. - // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). - IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) - window->HiddenFramesCanSkipItems = 1; + if (flags & ImGuiWindowFlags_ChildWindow) + { + // Child window can be out of sight and have "negative" clip windows. + // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). + IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); + if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? + if (!g.LogEnabled) + if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + window->HiddenFramesCanSkipItems = 1; - // Completely hide along with parent or if parent is collapsed - if (parent_window && (parent_window->Collapsed || parent_window->Hidden)) + // Hide along with parent or if parent is collapsed + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) + window->HiddenFramesCanSkipItems = 1; + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0)) + window->HiddenFramesCannotSkipItems = 1; + } + + // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point) + if (style.Alpha <= 0.0f) window->HiddenFramesCanSkipItems = 1; + + // Update the Hidden flag + window->Hidden = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0) || (window->HiddenFramesForRenderOnly > 0); + + // Update the SkipItems flag, used to early out of all items functions (no layout required) + bool skip_items = false; + if (window->Collapsed || !window->Active || window->Hidden) + if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0) + skip_items = true; + window->SkipItems = skip_items; } - // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point) - if (style.Alpha <= 0.0f) - window->HiddenFramesCanSkipItems = 1; - - // Update the Hidden flag - window->Hidden = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0); - - // Update the SkipItems flag, used to early out of all items functions (no layout required) - bool skip_items = false; - if (window->Collapsed || !window->Active || window->Hidden) - if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0) - skip_items = true; - window->SkipItems = skip_items; - - return !skip_items; + return !window->SkipItems; } -// Old Begin() API with 5 parameters, avoid calling this version directly! Use SetNextWindowSize()/SetNextWindowBgAlpha() + Begin() instead. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_first_use, float bg_alpha_override, ImGuiWindowFlags flags) -{ - // Old API feature: we could pass the initial window size as a parameter. This was misleading because it only had an effect if the window didn't have data in the .ini file. - if (size_first_use.x != 0.0f || size_first_use.y != 0.0f) - SetNextWindowSize(size_first_use, ImGuiCond_FirstUseEver); - - // Old API feature: override the window background alpha with a parameter. - if (bg_alpha_override >= 0.0f) - SetNextWindowBgAlpha(bg_alpha_override); - - return Begin(name, p_open, flags); -} -#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS - void ImGui::End() { ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; - if (g.CurrentWindowStack.Size <= 1 && g.FrameScopePushedImplicitWindow) + // Error checking: verify that user hasn't called End() too many times! + if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow) { - IM_ASSERT(g.CurrentWindowStack.Size > 1 && "Calling End() too many times!"); - return; // FIXME-ERRORHANDLING + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!"); + return; } IM_ASSERT(g.CurrentWindowStack.Size > 0); - ImGuiWindow* window = g.CurrentWindow; + // Error checking: verify that user doesn't directly call End() on a child window. + if (window->Flags & ImGuiWindowFlags_ChildWindow) + IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!"); - if (window->DC.CurrentColumns != NULL) + // Close anything that is open + if (window->DC.CurrentColumns) EndColumns(); PopClipRect(); // Inner window clip rectangle @@ -5658,7 +6334,7 @@ void ImGui::End() g.CurrentWindowStack.pop_back(); if (window->Flags & ImGuiWindowFlags_Popup) g.BeginPopupStack.pop_back(); - CheckStacksSize(window, false); + window->DC.StackSizesOnBegin.CompareWithCurrentState(); SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back()); } @@ -5667,7 +6343,7 @@ void ImGui::BringWindowToFocusFront(ImGuiWindow* window) ImGuiContext& g = *GImGui; if (g.WindowsFocusOrder.back() == window) return; - for (int i = g.WindowsFocusOrder.Size - 2; i >= 0; i--) // We can ignore the front most window + for (int i = g.WindowsFocusOrder.Size - 2; i >= 0; i--) // We can ignore the top-most window if (g.WindowsFocusOrder[i] == window) { memmove(&g.WindowsFocusOrder[i], &g.WindowsFocusOrder[i + 1], (size_t)(g.WindowsFocusOrder.Size - i - 1) * sizeof(ImGuiWindow*)); @@ -5680,9 +6356,9 @@ void ImGui::BringWindowToDisplayFront(ImGuiWindow* window) { ImGuiContext& g = *GImGui; ImGuiWindow* current_front_window = g.Windows.back(); - if (current_front_window == window || current_front_window->RootWindow == window) + if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better) return; - for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the front most window + for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window if (g.Windows[i] == window) { memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*)); @@ -5715,33 +6391,38 @@ void ImGui::FocusWindow(ImGuiWindow* window) g.NavWindow = window; if (window && g.NavDisableMouseHover) g.NavMousePosDirty = true; - g.NavInitRequest = false; g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId + g.NavFocusScopeId = 0; g.NavIdIsAlive = false; g.NavLayer = ImGuiNavLayer_Main; + g.NavInitRequest = g.NavMoveRequest = false; + NavUpdateAnyRequestFlag(); //IMGUI_DEBUG_LOG("FocusWindow(\"%s\")\n", window ? window->Name : NULL); } // Close popups if any ClosePopupsOverWindow(window, false); + // Move the root window to the top of the pile + IM_ASSERT(window == NULL || window->RootWindow != NULL); + ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop + ImGuiWindow* display_front_window = window ? window->RootWindow : NULL; + + // Steal active widgets. Some of the cases it triggers includes: + // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run. + // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId) + if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window) + if (!g.ActiveIdNoClearOnFocusLoss) + ClearActiveID(); + // Passing NULL allow to disable keyboard focus if (!window) return; - // Move the root window to the top of the pile - if (window->RootWindow) - window = window->RootWindow; - - // Steal focus on active widgets - if (window->Flags & ImGuiWindowFlags_Popup) // FIXME: This statement should be unnecessary. Need further testing before removing it.. - if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != window) - ClearActiveID(); - // Bring to front - BringWindowToFocusFront(window); - if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) - BringWindowToDisplayFront(window); + BringWindowToFocusFront(focus_front_window); + if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0) + BringWindowToDisplayFront(display_front_window); } void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window) @@ -5770,98 +6451,7 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind FocusWindow(NULL); } -void ImGui::SetNextItemWidth(float item_width) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.NextItemWidth = item_width; -} - -void ImGui::PushItemWidth(float item_width) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); - window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); -} - -void ImGui::PushMultiItemsWidths(int components, float w_full) -{ - ImGuiWindow* window = GetCurrentWindow(); - const ImGuiStyle& style = GImGui->Style; - const float w_item_one = ImMax(1.0f, (float)(int)((w_full - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); - const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); - window->DC.ItemWidthStack.push_back(w_item_last); - for (int i = 0; i < components-1; i++) - window->DC.ItemWidthStack.push_back(w_item_one); - window->DC.ItemWidth = window->DC.ItemWidthStack.back(); -} - -void ImGui::PopItemWidth() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemWidthStack.pop_back(); - window->DC.ItemWidth = window->DC.ItemWidthStack.empty() ? window->ItemWidthDefault : window->DC.ItemWidthStack.back(); -} - -// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth(), -// Then consume the -float ImGui::GetNextItemWidth() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - float w; - if (window->DC.NextItemWidth != FLT_MAX) - { - w = window->DC.NextItemWidth; - window->DC.NextItemWidth = FLT_MAX; - } - else - { - w = window->DC.ItemWidth; - } - if (w < 0.0f) - { - float region_max_x = GetWorkRectMax().x; - w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); - } - w = (float)(int)w; - return w; -} - -// Calculate item width *without* popping/consuming NextItemWidth if it was set. -// (rarely used, which is why we avoid calling this from GetNextItemWidth() and instead do a backup/restore here) -float ImGui::CalcItemWidth() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - float backup_next_item_width = window->DC.NextItemWidth; - float w = GetNextItemWidth(); - window->DC.NextItemWidth = backup_next_item_width; - return w; -} - -// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == GetNextItemWidth(). -// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical. -// Note that only CalcItemWidth() is publicly exposed. -// The 4.0f here may be changed to match GetNextItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable) -ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - - ImVec2 region_max; - if (size.x < 0.0f || size.y < 0.0f) - region_max = GetWorkRectMax(); - - if (size.x == 0.0f) - size.x = default_w; - else if (size.x < 0.0f) - size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x); - - if (size.y == 0.0f) - size.y = default_h; - else if (size.y < 0.0f) - size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y); - - return size; -} - +// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only. void ImGui::SetCurrentFont(ImFont* font) { ImGuiContext& g = *GImGui; @@ -5873,6 +6463,7 @@ void ImGui::SetCurrentFont(ImFont* font) ImFontAtlas* atlas = g.Font->ContainerAtlas; g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; + g.DrawListSharedData.TexUvLines = atlas->TexUvLines; g.DrawListSharedData.Font = g.Font; g.DrawListSharedData.FontSize = g.FontSize; } @@ -5897,19 +6488,25 @@ void ImGui::PopFont() void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled) { - ImGuiWindow* window = GetCurrentWindow(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiItemFlags item_flags = window->DC.ItemFlags; + IM_ASSERT(item_flags == g.ItemFlagsStack.back()); if (enabled) - window->DC.ItemFlags |= option; + item_flags |= option; else - window->DC.ItemFlags &= ~option; - window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags); + item_flags &= ~option; + window->DC.ItemFlags = item_flags; + g.ItemFlagsStack.push_back(item_flags); } void ImGui::PopItemFlag() { - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemFlagsStack.pop_back(); - window->DC.ItemFlags = window->DC.ItemFlagsStack.empty() ? ImGuiItemFlags_Default_ : window->DC.ItemFlagsStack.back(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.ItemFlagsStack.Size > 1); // Too many calls to PopItemFlag() - we always leave a 0 at the bottom of the stack. + g.ItemFlagsStack.pop_back(); + window->DC.ItemFlags = g.ItemFlagsStack.back(); } // FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system. @@ -5936,192 +6533,15 @@ void ImGui::PopButtonRepeat() void ImGui::PushTextWrapPos(float wrap_pos_x) { ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPosStack.push_back(window->DC.TextWrapPos); window->DC.TextWrapPos = wrap_pos_x; - window->DC.TextWrapPosStack.push_back(wrap_pos_x); } void ImGui::PopTextWrapPos() { ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPos = window->DC.TextWrapPosStack.back(); window->DC.TextWrapPosStack.pop_back(); - window->DC.TextWrapPos = window->DC.TextWrapPosStack.empty() ? -1.0f : window->DC.TextWrapPosStack.back(); -} - -// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 -void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) -{ - ImGuiContext& g = *GImGui; - ImGuiColorMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorModifiers.push_back(backup); - g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); -} - -void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) -{ - ImGuiContext& g = *GImGui; - ImGuiColorMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorModifiers.push_back(backup); - g.Style.Colors[idx] = col; -} - -void ImGui::PopStyleColor(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - ImGuiColorMod& backup = g.ColorModifiers.back(); - g.Style.Colors[backup.Col] = backup.BackupValue; - g.ColorModifiers.pop_back(); - count--; - } -} - -struct ImGuiStyleVarInfo -{ - ImGuiDataType Type; - ImU32 Count; - ImU32 Offset; - void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); } -}; - -static const ImGuiStyleVarInfo GStyleVarInfo[] = -{ - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign -}; - -static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx) -{ - IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT); - IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT); - return &GStyleVarInfo[idx]; -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) - { - ImGuiContext& g = *GImGui; - float* pvar = (float*)var_info->GetVarPtr(&g.Style); - g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!"); -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2) - { - ImGuiContext& g = *GImGui; - ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); - g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!"); -} - -void ImGui::PopStyleVar(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it. - ImGuiStyleMod& backup = g.StyleModifiers.back(); - const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx); - void* data = info->GetVarPtr(&g.Style); - if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; } - else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; } - g.StyleModifiers.pop_back(); - count--; - } -} - -const char* ImGui::GetStyleColorName(ImGuiCol idx) -{ - // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; - switch (idx) - { - case ImGuiCol_Text: return "Text"; - case ImGuiCol_TextDisabled: return "TextDisabled"; - case ImGuiCol_WindowBg: return "WindowBg"; - case ImGuiCol_ChildBg: return "ChildBg"; - case ImGuiCol_PopupBg: return "PopupBg"; - case ImGuiCol_Border: return "Border"; - case ImGuiCol_BorderShadow: return "BorderShadow"; - case ImGuiCol_FrameBg: return "FrameBg"; - case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; - case ImGuiCol_FrameBgActive: return "FrameBgActive"; - case ImGuiCol_TitleBg: return "TitleBg"; - case ImGuiCol_TitleBgActive: return "TitleBgActive"; - case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; - case ImGuiCol_MenuBarBg: return "MenuBarBg"; - case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; - case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; - case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; - case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; - case ImGuiCol_CheckMark: return "CheckMark"; - case ImGuiCol_SliderGrab: return "SliderGrab"; - case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; - case ImGuiCol_Button: return "Button"; - case ImGuiCol_ButtonHovered: return "ButtonHovered"; - case ImGuiCol_ButtonActive: return "ButtonActive"; - case ImGuiCol_Header: return "Header"; - case ImGuiCol_HeaderHovered: return "HeaderHovered"; - case ImGuiCol_HeaderActive: return "HeaderActive"; - case ImGuiCol_Separator: return "Separator"; - case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; - case ImGuiCol_SeparatorActive: return "SeparatorActive"; - case ImGuiCol_ResizeGrip: return "ResizeGrip"; - case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; - case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; - case ImGuiCol_Tab: return "Tab"; - case ImGuiCol_TabHovered: return "TabHovered"; - case ImGuiCol_TabActive: return "TabActive"; - case ImGuiCol_TabUnfocused: return "TabUnfocused"; - case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive"; - case ImGuiCol_PlotLines: return "PlotLines"; - case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; - case ImGuiCol_PlotHistogram: return "PlotHistogram"; - case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; - case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; - case ImGuiCol_DragDropTarget: return "DragDropTarget"; - case ImGuiCol_NavHighlight: return "NavHighlight"; - case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight"; - case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg"; - case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg"; - } - IM_ASSERT(0); - return "Unknown"; } bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent) @@ -6137,34 +6557,46 @@ bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent) return false; } +bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below) +{ + ImGuiContext& g = *GImGui; + for (int i = g.Windows.Size - 1; i >= 0; i--) + { + ImGuiWindow* candidate_window = g.Windows[i]; + if (candidate_window == potential_above) + return true; + if (candidate_window == potential_below) + return false; + } + return false; +} + bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) { IM_ASSERT((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0); // Flags not supported by this function ImGuiContext& g = *GImGui; + if (g.HoveredWindow == NULL) + return false; - if (flags & ImGuiHoveredFlags_AnyWindow) - { - if (g.HoveredWindow == NULL) - return false; - } - else + if ((flags & ImGuiHoveredFlags_AnyWindow) == 0) { + ImGuiWindow* window = g.CurrentWindow; switch (flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows)) { case ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows: - if (g.HoveredRootWindow != g.CurrentWindow->RootWindow) + if (g.HoveredWindow->RootWindow != window->RootWindow) return false; break; case ImGuiHoveredFlags_RootWindow: - if (g.HoveredWindow != g.CurrentWindow->RootWindow) + if (g.HoveredWindow != window->RootWindow) return false; break; case ImGuiHoveredFlags_ChildWindows: - if (g.HoveredWindow == NULL || !IsWindowChildOf(g.HoveredWindow, g.CurrentWindow)) + if (!IsWindowChildOf(g.HoveredWindow, window)) return false; break; default: - if (g.HoveredWindow != g.CurrentWindow) + if (g.HoveredWindow != window) return false; break; } @@ -6200,11 +6632,11 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags) } // Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext) -// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmaticaly. +// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically. // If you want a window to never be focused, you may use the e.g. NoInputs flag. bool ImGui::IsWindowNavFocusable(ImGuiWindow* window) { - return window->Active && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus); + return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus); } float ImGui::GetWindowWidth() @@ -6226,20 +6658,6 @@ ImVec2 ImGui::GetWindowPos() return window->Pos; } -void ImGui::SetWindowScrollX(ImGuiWindow* window, float new_scroll_x) -{ - window->DC.CursorMaxPos.x += window->Scroll.x; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. - window->Scroll.x = new_scroll_x; - window->DC.CursorMaxPos.x -= window->Scroll.x; -} - -void ImGui::SetWindowScrollY(ImGuiWindow* window, float new_scroll_y) -{ - window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. - window->Scroll.y = new_scroll_y; - window->DC.CursorMaxPos.y -= window->Scroll.y; -} - void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) { // Test condition (NB: bit 0 is always true) and clear flags for next time @@ -6253,8 +6671,11 @@ void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) // Set const ImVec2 old_pos = window->Pos; window->Pos = ImFloor(pos); - window->DC.CursorPos += (window->Pos - old_pos); // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor - window->DC.CursorMaxPos += (window->Pos - old_pos); // And more importantly we need to adjust this so size calculation doesn't get affected. + ImVec2 offset = window->Pos - old_pos; + window->DC.CursorPos += offset; // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor + window->DC.CursorMaxPos += offset; // And more importantly we need to offset CursorMaxPos/CursorStartPos this so ContentSize calculation doesn't get affected. + window->DC.IdealMaxPos += offset; + window->DC.CursorStartPos += offset; } void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond) @@ -6288,7 +6709,7 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con if (size.x > 0.0f) { window->AutoFitFramesX = 0; - window->SizeFull.x = ImFloor(size.x); + window->SizeFull.x = IM_FLOOR(size.x); } else { @@ -6298,7 +6719,7 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con if (size.y > 0.0f) { window->AutoFitFramesY = 0; - window->SizeFull.y = ImFloor(size.y); + window->SizeFull.y = IM_FLOOR(size.y); } else { @@ -6329,6 +6750,13 @@ void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond co window->Collapsed = collapsed; } +void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size) +{ + IM_ASSERT(window->HitTestHoleSize.x == 0); // We don't support multiple holes/hit test filters + window->HitTestHoleSize = ImVec2ih(size); + window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); +} + void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) { SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); @@ -6374,6 +6802,7 @@ void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pi { ImGuiContext& g = *GImGui; IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos; g.NextWindowData.PosVal = pos; g.NextWindowData.PosPivotVal = pivot; g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always; @@ -6383,6 +6812,7 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) { ImGuiContext& g = *GImGui; IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize; g.NextWindowData.SizeVal = size; g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; } @@ -6390,23 +6820,33 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) { ImGuiContext& g = *GImGui; - g.NextWindowData.SizeConstraintCond = ImGuiCond_Always; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint; g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max); g.NextWindowData.SizeCallback = custom_callback; g.NextWindowData.SizeCallbackUserData = custom_callback_user_data; } +// Content size = inner scrollable rectangle, padded with WindowPadding. +// SetNextWindowContentSize(ImVec2(100,100) + ImGuiWindowFlags_AlwaysAutoResize will always allow submitting a 100x100 item. void ImGui::SetNextWindowContentSize(const ImVec2& size) { ImGuiContext& g = *GImGui; - g.NextWindowData.ContentSizeVal = size; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value. - g.NextWindowData.ContentSizeCond = ImGuiCond_Always; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; + g.NextWindowData.ContentSizeVal = ImFloor(size); +} + +void ImGui::SetNextWindowScroll(const ImVec2& scroll) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasScroll; + g.NextWindowData.ScrollVal = scroll; } void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) { ImGuiContext& g = *GImGui; IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed; g.NextWindowData.CollapsedVal = collapsed; g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always; } @@ -6414,83 +6854,14 @@ void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) void ImGui::SetNextWindowFocus() { ImGuiContext& g = *GImGui; - g.NextWindowData.FocusCond = ImGuiCond_Always; // Using a Cond member for consistency (may transition all of them to single flag set for fast Clear() op) + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus; } void ImGui::SetNextWindowBgAlpha(float alpha) { ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha; g.NextWindowData.BgAlphaVal = alpha; - g.NextWindowData.BgAlphaCond = ImGuiCond_Always; // Using a Cond member for consistency (may transition all of them to single flag set for fast Clear() op) -} - -// FIXME: This is in window space (not screen space!). We should try to obsolete all those functions. -ImVec2 ImGui::GetContentRegionMax() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - ImVec2 mx = window->ContentsRegionRect.Max - window->Pos; - if (window->DC.CurrentColumns) - mx.x = GetColumnOffset(window->DC.CurrentColumns->Current + 1) - window->WindowPadding.x; - return mx; -} - -// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. -ImVec2 ImGui::GetWorkRectMax() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - ImVec2 mx = window->ContentsRegionRect.Max; - if (window->DC.CurrentColumns) - mx.x = window->Pos.x + GetColumnOffset(window->DC.CurrentColumns->Current + 1) - window->WindowPadding.x; - return mx; -} - -ImVec2 ImGui::GetContentRegionAvail() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return GetWorkRectMax() - window->DC.CursorPos; -} - -// In window space (not screen space!) -ImVec2 ImGui::GetWindowContentRegionMin() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.Min - window->Pos; -} - -ImVec2 ImGui::GetWindowContentRegionMax() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.Max - window->Pos; -} - -float ImGui::GetWindowContentRegionWidth() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->ContentsRegionRect.GetWidth(); -} - -float ImGui::GetTextLineHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize; -} - -float ImGui::GetTextLineHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.ItemSpacing.y; -} - -float ImGui::GetFrameHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f; -} - -float ImGui::GetFrameHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; } ImDrawList* ImGui::GetWindowDrawList() @@ -6516,12 +6887,545 @@ ImVec2 ImGui::GetFontTexUvWhitePixel() void ImGui::SetWindowFontScale(float scale) { + IM_ASSERT(scale > 0.0f); ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); window->FontWindowScale = scale; g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); } +void ImGui::ActivateItem(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavNextActivateId = id; +} + +void ImGui::PushFocusScope(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + g.FocusScopeStack.push_back(window->DC.NavFocusScopeIdCurrent); + window->DC.NavFocusScopeIdCurrent = id; +} + +void ImGui::PopFocusScope() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? + window->DC.NavFocusScopeIdCurrent = g.FocusScopeStack.back(); + g.FocusScopeStack.pop_back(); +} + +void ImGui::SetKeyboardFocusHere(int offset) +{ + IM_ASSERT(offset >= -1); // -1 is allowed but not below + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + g.TabFocusRequestNextWindow = window; + g.TabFocusRequestNextCounterRegular = window->DC.FocusCounterRegular + 1 + offset; + g.TabFocusRequestNextCounterTabStop = INT_MAX; +} + +void ImGui::SetItemDefaultFocus() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!window->Appearing) + return; + if (g.NavWindow == window->RootWindowForNav && (g.NavInitRequest || g.NavInitResultId != 0) && g.NavLayer == g.NavWindow->DC.NavLayerCurrent) + { + g.NavInitRequest = false; + g.NavInitResultId = g.NavWindow->DC.LastItemId; + g.NavInitResultRectRel = ImRect(g.NavWindow->DC.LastItemRect.Min - g.NavWindow->Pos, g.NavWindow->DC.LastItemRect.Max - g.NavWindow->Pos); + NavUpdateAnyRequestFlag(); + if (!IsItemVisible()) + SetScrollHereY(); + } +} + +void ImGui::SetStateStorage(ImGuiStorage* tree) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + window->DC.StateStorage = tree ? tree : &window->StateStorage; +} + +ImGuiStorage* ImGui::GetStateStorage() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->DC.StateStorage; +} + +void ImGui::PushID(const char* str_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetIDNoKeepAlive(str_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetIDNoKeepAlive(str_id_begin, str_id_end); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const void* ptr_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetIDNoKeepAlive(ptr_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(int int_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetIDNoKeepAlive(int_id); + window->IDStack.push_back(id); +} + +// Push a given id value ignoring the ID stack as a seed. +void ImGui::PushOverrideID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->IDStack.push_back(id); +} + +// Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call +// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. +// for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) +ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) +{ + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); + ImGui::KeepAliveID(id); +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiContext& g = *GImGui; + IMGUI_TEST_ENGINE_ID_INFO2(id, ImGuiDataType_String, str, str_end); +#endif + return id; +} + +void ImGui::PopID() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + IM_ASSERT(window->IDStack.Size > 1); // Too many PopID(), or could be popping in a wrong/different window? + window->IDStack.pop_back(); +} + +ImGuiID ImGui::GetID(const char* str_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id); +} + +ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id_begin, str_id_end); +} + +ImGuiID ImGui::GetID(const void* ptr_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(ptr_id); +} + +bool ImGui::IsRectVisible(const ImVec2& size) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); +} + +bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); +} + + +//----------------------------------------------------------------------------- +// [SECTION] ERROR CHECKING +//----------------------------------------------------------------------------- + +// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. +// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit +// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. your user code +// may see different structures than what imgui.cpp sees, which is problematic. +// We usually require settings to be in imconfig.h to make sure that they are accessible to all compilation units involved with Dear ImGui. +bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) +{ + bool error = false; + if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } + if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } + if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } + if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } + if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } + if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } + if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } + return !error; +} + +static void ImGui::ErrorCheckNewFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Check user IM_ASSERT macro + // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means you assert macro is incorrectly defined! + // If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block. + // This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.) + // #define IM_ASSERT(EXPR) if (SomeCode(EXPR)) SomeMoreCode(); // Wrong! + // #define IM_ASSERT(EXPR) do { if (SomeCode(EXPR)) SomeMoreCode(); } while (0) // Correct! + if (true) IM_ASSERT(1); else IM_ASSERT(0); + + // Check user data + // (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument) + IM_ASSERT(g.Initialized); + IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!"); + IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); + IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!"); + IM_ASSERT(g.IO.Fonts->Fonts.Size > 0 && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()?"); + IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded() && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()?"); + IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations + IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting."); + IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right); + for (int n = 0; n < ImGuiKey_COUNT; n++) + IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < IM_ARRAYSIZE(g.IO.KeysDown) && "io.KeyMap[] contains an out of bound value (need to be 0..512, or -1 for unmapped key)"); + + // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP) + if (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) + IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation."); + + // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly. + if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors)) + g.IO.ConfigWindowsResizeFromEdges = false; +} + +static void ImGui::ErrorCheckEndFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Verify that io.KeyXXX fields haven't been tampered with. Key mods should not be modified between NewFrame() and EndFrame() + // One possible reason leading to this assert is that your backends update inputs _AFTER_ NewFrame(). + // It is known that when some modal native windows called mid-frame takes focus away, some backends such as GLFW will + // send key release events mid-frame. This would normally trigger this assertion and lead to sheared inputs. + // We silently accommodate for this case by ignoring/ the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0), + // while still correctly asserting on mid-frame key press events. + const ImGuiKeyModFlags key_mod_flags = GetMergedKeyModFlags(); + IM_ASSERT((key_mod_flags == 0 || g.IO.KeyMods == key_mod_flags) && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods"); + IM_UNUSED(key_mod_flags); + + // Recover from errors + //ErrorCheckEndFrameRecover(); + + // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you + // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API). + if (g.CurrentWindowStack.Size != 1) + { + if (g.CurrentWindowStack.Size > 1) + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?"); + while (g.CurrentWindowStack.Size > 1) + End(); + } + else + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?"); + } + } + + IM_ASSERT_USER_ERROR(g.GroupStack.Size == 0, "Missing EndGroup call!"); +} + +// Experimental recovery from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls. +// Must be called during or before EndFrame(). +// This is generally flawed as we are not necessarily End/Popping things in the right order. +// FIXME: Can't recover from inside BeginTabItem/EndTabItem yet. +// FIXME: Can't recover from interleaved BeginTabBar/Begin +void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data) +{ + // PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations" + ImGuiContext& g = *GImGui; + while (g.CurrentWindowStack.Size > 0) + { +#ifdef IMGUI_HAS_TABLE + while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow)) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'", g.CurrentTable->OuterWindow->Name); + EndTable(); + } +#endif + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window != NULL); + while (g.CurrentTabBar != NULL) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'", window->Name); + EndTabBar(); + } + while (window->DC.TreeDepth > 0) + { + if (log_callback) log_callback(user_data, "Recovered from missing TreePop() in '%s'", window->Name); + TreePop(); + } + while (g.GroupStack.Size > window->DC.StackSizesOnBegin.SizeOfGroupStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndGroup() in '%s'", window->Name); + EndGroup(); + } + while (window->IDStack.Size > 1) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopID() in '%s'", window->Name); + PopID(); + } + while (g.ColorStack.Size > window->DC.StackSizesOnBegin.SizeOfColorStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleColor() in '%s' for ImGuiCol_%s", window->Name, GetStyleColorName(g.ColorStack.back().Col)); + PopStyleColor(); + } + while (g.StyleVarStack.Size > window->DC.StackSizesOnBegin.SizeOfStyleVarStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleVar() in '%s'", window->Name); + PopStyleVar(); + } + while (g.FocusScopeStack.Size > window->DC.StackSizesOnBegin.SizeOfFocusScopeStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopFocusScope() in '%s'", window->Name); + PopFocusScope(); + } + if (g.CurrentWindowStack.Size == 1) + { + IM_ASSERT(g.CurrentWindow->IsFallbackWindow); + break; + } + IM_ASSERT(window == g.CurrentWindow); + if (window->Flags & ImGuiWindowFlags_ChildWindow) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndChild() for '%s'", window->Name); + EndChild(); + } + else + { + if (log_callback) log_callback(user_data, "Recovered from missing End() for '%s'", window->Name); + End(); + } + } +} + +// Save current stack sizes for later compare +void ImGuiStackSizes::SetToCurrentState() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + SizeOfIDStack = (short)window->IDStack.Size; + SizeOfColorStack = (short)g.ColorStack.Size; + SizeOfStyleVarStack = (short)g.StyleVarStack.Size; + SizeOfFontStack = (short)g.FontStack.Size; + SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size; + SizeOfGroupStack = (short)g.GroupStack.Size; + SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size; +} + +// Compare to detect usage errors +void ImGuiStackSizes::CompareWithCurrentState() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_UNUSED(window); + + // Window stacks + // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) + IM_ASSERT(SizeOfIDStack == window->IDStack.Size && "PushID/PopID or TreeNode/TreePop Mismatch!"); + + // Global stacks + // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them. + IM_ASSERT(SizeOfGroupStack == g.GroupStack.Size && "BeginGroup/EndGroup Mismatch!"); + IM_ASSERT(SizeOfBeginPopupStack == g.BeginPopupStack.Size && "BeginPopup/EndPopup or BeginMenu/EndMenu Mismatch!"); + IM_ASSERT(SizeOfColorStack >= g.ColorStack.Size && "PushStyleColor/PopStyleColor Mismatch!"); + IM_ASSERT(SizeOfStyleVarStack >= g.StyleVarStack.Size && "PushStyleVar/PopStyleVar Mismatch!"); + IM_ASSERT(SizeOfFontStack >= g.FontStack.Size && "PushFont/PopFont Mismatch!"); + IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); +} + + +//----------------------------------------------------------------------------- +// [SECTION] LAYOUT +//----------------------------------------------------------------------------- +// - ItemSize() +// - ItemAdd() +// - SameLine() +// - GetCursorScreenPos() +// - SetCursorScreenPos() +// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() +// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() +// - GetCursorStartPos() +// - Indent() +// - Unindent() +// - SetNextItemWidth() +// - PushItemWidth() +// - PushMultiItemsWidths() +// - PopItemWidth() +// - CalcItemWidth() +// - CalcItemSize() +// - GetTextLineHeight() +// - GetTextLineHeightWithSpacing() +// - GetFrameHeight() +// - GetFrameHeightWithSpacing() +// - GetContentRegionMax() +// - GetContentRegionMaxAbs() [Internal] +// - GetContentRegionAvail(), +// - GetWindowContentRegionMin(), GetWindowContentRegionMax() +// - GetWindowContentRegionWidth() +// - BeginGroup() +// - EndGroup() +// Also see in imgui_widgets: tab bars, columns. +//----------------------------------------------------------------------------- + +// Advance cursor given item size for layout. +// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. +// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. +void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // We increase the height in this function to accommodate for baseline offset. + // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, + // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. + const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; + const float line_height = ImMax(window->DC.CurrLineSize.y, size.y + offset_to_match_baseline_y); + + // Always align ourselves on pixel boundaries + //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; + window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line + window->DC.CursorPos.y = IM_FLOOR(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y); // Next line + window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); + //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] + + window->DC.PrevLineSize.y = line_height; + window->DC.CurrLineSize.y = 0.0f; + window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); + window->DC.CurrLineTextBaseOffset = 0.0f; + + // Horizontal layout mode + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + SameLine(); +} + +void ImGui::ItemSize(const ImRect& bb, float text_baseline_y) +{ + ItemSize(bb.GetSize(), text_baseline_y); +} + +// Declare item bounding box for clipping and interaction. +// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface +// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. +bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (id != 0) + { + // Navigation processing runs prior to clipping early-out + // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget + // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests + // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of + // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. + // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able + // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). + // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. + // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. + window->DC.NavLayerActiveMaskNext |= (1 << window->DC.NavLayerCurrent); + if (g.NavId == id || g.NavAnyRequest) + if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) + if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) + NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id); + + // [DEBUG] Item Picker tool, when enabling the "extended" version we perform the check in ItemAdd() +#ifdef IMGUI_DEBUG_TOOL_ITEM_PICKER_EX + if (id == g.DebugItemPickerBreakId) + { + IM_DEBUG_BREAK(); + g.DebugItemPickerBreakId = 0; + } +#endif + } + + // Equivalent to calling SetLastItemData() + window->DC.LastItemId = id; + window->DC.LastItemRect = bb; + window->DC.LastItemStatusFlags = ImGuiItemStatusFlags_None; + g.NextItemData.Flags = ImGuiNextItemDataFlags_None; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (id != 0) + IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id); +#endif + + // Clipping test + const bool is_clipped = IsClippedEx(bb, id, false); + if (is_clipped) + return false; + //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] + + // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) + if (IsMouseHoveringRect(bb.Min, bb.Max)) + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HoveredRect; + return true; +} + +// Gets back to previous line and continue with horizontal layout +// offset_from_start_x == 0 : follow right after previous item +// offset_from_start_x != 0 : align to specified x position (relative to window/group left) +// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 +// spacing_w >= 0 : enforce spacing amount +void ImGui::SameLine(float offset_from_start_x, float spacing_w) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + if (offset_from_start_x != 0.0f) + { + if (spacing_w < 0.0f) spacing_w = 0.0f; + window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + else + { + if (spacing_w < 0.0f) spacing_w = g.Style.ItemSpacing.x; + window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + window->DC.CurrLineSize = window->DC.PrevLineSize; + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; +} + +ImVec2 ImGui::GetCursorScreenPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos; +} + +void ImGui::SetCursorScreenPos(const ImVec2& pos) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos = pos; + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); +} + // User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient. // Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. ImVec2 ImGui::GetCursorPos() @@ -6569,279 +7473,6 @@ ImVec2 ImGui::GetCursorStartPos() return window->DC.CursorStartPos - window->Pos; } -ImVec2 ImGui::GetCursorScreenPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos; -} - -void ImGui::SetCursorScreenPos(const ImVec2& pos) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos = pos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); -} - -float ImGui::GetScrollX() -{ - return GImGui->CurrentWindow->Scroll.x; -} - -float ImGui::GetScrollY() -{ - return GImGui->CurrentWindow->Scroll.y; -} - -float ImGui::GetScrollMaxX() -{ - return GetWindowScrollMaxX(GImGui->CurrentWindow); -} - -float ImGui::GetScrollMaxY() -{ - return GetWindowScrollMaxY(GImGui->CurrentWindow); -} - -void ImGui::SetScrollX(float scroll_x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->ScrollTarget.x = scroll_x; - window->ScrollTargetCenterRatio.x = 0.0f; -} - -void ImGui::SetScrollY(float scroll_y) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->ScrollTarget.y = scroll_y + window->TitleBarHeight() + window->MenuBarHeight(); // title bar height canceled out when using ScrollTargetRelY - window->ScrollTargetCenterRatio.y = 0.0f; -} - -void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio) -{ - // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); - window->ScrollTarget.y = (float)(int)(local_y + window->Scroll.y); - window->ScrollTargetCenterRatio.y = center_y_ratio; -} - -// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. -void ImGui::SetScrollHereY(float center_y_ratio) -{ - ImGuiWindow* window = GetCurrentWindow(); - float target_y = window->DC.CursorPosPrevLine.y - window->Pos.y; // Top of last item, in window space - target_y += (window->DC.PrevLineSize.y * center_y_ratio) + (GImGui->Style.ItemSpacing.y * (center_y_ratio - 0.5f) * 2.0f); // Precisely aim above, in the middle or below the last line. - SetScrollFromPosY(target_y, center_y_ratio); -} - -void ImGui::ActivateItem(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.NavNextActivateId = id; -} - -void ImGui::SetKeyboardFocusHere(int offset) -{ - IM_ASSERT(offset >= -1); // -1 is allowed but not below - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - g.FocusRequestNextWindow = window; - g.FocusRequestNextCounterAll = window->DC.FocusCounterAll + 1 + offset; - g.FocusRequestNextCounterTab = INT_MAX; -} - -void ImGui::SetItemDefaultFocus() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!window->Appearing) - return; - if (g.NavWindow == window->RootWindowForNav && (g.NavInitRequest || g.NavInitResultId != 0) && g.NavLayer == g.NavWindow->DC.NavLayerCurrent) - { - g.NavInitRequest = false; - g.NavInitResultId = g.NavWindow->DC.LastItemId; - g.NavInitResultRectRel = ImRect(g.NavWindow->DC.LastItemRect.Min - g.NavWindow->Pos, g.NavWindow->DC.LastItemRect.Max - g.NavWindow->Pos); - NavUpdateAnyRequestFlag(); - if (!IsItemVisible()) - SetScrollHereY(); - } -} - -void ImGui::SetStateStorage(ImGuiStorage* tree) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->DC.StateStorage = tree ? tree : &window->StateStorage; -} - -ImGuiStorage* ImGui::GetStateStorage() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->DC.StateStorage; -} - -void ImGui::PushID(const char* str_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.push_back(window->GetIDNoKeepAlive(str_id)); -} - -void ImGui::PushID(const char* str_id_begin, const char* str_id_end) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.push_back(window->GetIDNoKeepAlive(str_id_begin, str_id_end)); -} - -void ImGui::PushID(const void* ptr_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.push_back(window->GetIDNoKeepAlive(ptr_id)); -} - -void ImGui::PushID(int int_id) -{ - const void* ptr_id = (void*)(intptr_t)int_id; - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.push_back(window->GetIDNoKeepAlive(ptr_id)); -} - -// Push a given id value ignoring the ID stack as a seed. -void ImGui::PushOverrideID(ImGuiID id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.push_back(id); -} - -void ImGui::PopID() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->IDStack.pop_back(); -} - -ImGuiID ImGui::GetID(const char* str_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(str_id); -} - -ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(str_id_begin, str_id_end); -} - -ImGuiID ImGui::GetID(const void* ptr_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(ptr_id); -} - -bool ImGui::IsRectVisible(const ImVec2& size) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); -} - -bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); -} - -// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) -void ImGui::BeginGroup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - window->DC.GroupStack.resize(window->DC.GroupStack.Size + 1); - ImGuiGroupData& group_data = window->DC.GroupStack.back(); - group_data.BackupCursorPos = window->DC.CursorPos; - group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; - group_data.BackupIndent = window->DC.Indent; - group_data.BackupGroupOffset = window->DC.GroupOffset; - group_data.BackupCurrentLineSize = window->DC.CurrentLineSize; - group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset; - group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; - group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; - group_data.AdvanceCursor = true; - - window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x; - window->DC.Indent = window->DC.GroupOffset; - window->DC.CursorMaxPos = window->DC.CursorPos; - window->DC.CurrentLineSize = ImVec2(0.0f, 0.0f); - if (g.LogEnabled) - g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return -} - -void ImGui::EndGroup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls - - ImGuiGroupData& group_data = window->DC.GroupStack.back(); - - ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos); - group_bb.Max = ImMax(group_bb.Min, group_bb.Max); - - window->DC.CursorPos = group_data.BackupCursorPos; - window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); - window->DC.Indent = group_data.BackupIndent; - window->DC.GroupOffset = group_data.BackupGroupOffset; - window->DC.CurrentLineSize = group_data.BackupCurrentLineSize; - window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset; - if (g.LogEnabled) - g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return - - if (group_data.AdvanceCursor) - { - window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrentLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. - ItemSize(group_bb.GetSize(), 0.0f); - ItemAdd(group_bb, 0); - } - - // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group. - // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets. - // (and if you grep for LastItemId you'll notice it is only used in that context. - if ((group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId) // && g.ActiveIdWindow->RootWindow == window->RootWindow) - window->DC.LastItemId = g.ActiveId; - else if (!group_data.BackupActiveIdPreviousFrameIsAlive && g.ActiveIdPreviousFrameIsAlive) // && g.ActiveIdPreviousFrameWindow->RootWindow == window->RootWindow) - window->DC.LastItemId = g.ActiveIdPreviousFrame; - window->DC.LastItemRect = group_bb; - - window->DC.GroupStack.pop_back(); - - //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] -} - -// Gets back to previous line and continue with horizontal layout -// offset_from_start_x == 0 : follow right after previous item -// offset_from_start_x != 0 : align to specified x position (relative to window/group left) -// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 -// spacing_w >= 0 : enforce spacing amount -void ImGui::SameLine(float offset_from_start_x, float spacing_w) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - if (offset_from_start_x != 0.0f) - { - if (spacing_w < 0.0f) spacing_w = 0.0f; - window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - else - { - if (spacing_w < 0.0f) spacing_w = g.Style.ItemSpacing.x; - window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - window->DC.CurrentLineSize = window->DC.PrevLineSize; - window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; -} - void ImGui::Indent(float indent_w) { ImGuiContext& g = *GImGui; @@ -6858,14 +7489,464 @@ void ImGui::Unindent(float indent_w) window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; } +// Affect large frame+labels widgets only. +void ImGui::SetNextItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth; + g.NextItemData.Width = item_width; +} + +// FIXME: Remove the == 0.0f behavior? +void ImGui::PushItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PushMultiItemsWidths(int components, float w_full) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiStyle& style = g.Style; + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidthStack.push_back(w_item_last); + for (int i = 0; i < components - 2; i++) + window->DC.ItemWidthStack.push_back(w_item_one); + window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PopItemWidth() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.ItemWidth = window->DC.ItemWidthStack.back(); + window->DC.ItemWidthStack.pop_back(); +} + +// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth(). +// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags() +float ImGui::CalcItemWidth() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float w; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) + w = g.NextItemData.Width; + else + w = window->DC.ItemWidth; + if (w < 0.0f) + { + float region_max_x = GetContentRegionMaxAbs().x; + w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); + } + w = IM_FLOOR(w); + return w; +} + +// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth(). +// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical. +// Note that only CalcItemWidth() is publicly exposed. +// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable) +ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + + ImVec2 region_max; + if (size.x < 0.0f || size.y < 0.0f) + region_max = GetContentRegionMaxAbs(); + + if (size.x == 0.0f) + size.x = default_w; + else if (size.x < 0.0f) + size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x); + + if (size.y == 0.0f) + size.y = default_h; + else if (size.y < 0.0f) + size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y); + + return size; +} + +float ImGui::GetTextLineHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize; +} + +float ImGui::GetTextLineHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.ItemSpacing.y; +} + +float ImGui::GetFrameHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f; +} + +float ImGui::GetFrameHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; +} + +// FIXME: All the Contents Region function are messy or misleading. WE WILL AIM TO OBSOLETE ALL OF THEM WITH A NEW "WORK RECT" API. Thanks for your patience! + +// FIXME: This is in window space (not screen space!). +ImVec2 ImGui::GetContentRegionMax() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max - window->Pos; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x - window->Pos.x; + return mx; +} + +// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. +ImVec2 ImGui::GetContentRegionMaxAbs() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x; + return mx; +} + +ImVec2 ImGui::GetContentRegionAvail() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return GetContentRegionMaxAbs() - window->DC.CursorPos; +} + +// In window space (not screen space!) +ImVec2 ImGui::GetWindowContentRegionMin() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Min - window->Pos; +} + +ImVec2 ImGui::GetWindowContentRegionMax() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Max - window->Pos; +} + +float ImGui::GetWindowContentRegionWidth() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.GetWidth(); +} + +// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) +// Groups are currently a mishmash of functionalities which should perhaps be clarified and separated. +void ImGui::BeginGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + g.GroupStack.resize(g.GroupStack.Size + 1); + ImGuiGroupData& group_data = g.GroupStack.back(); + group_data.WindowID = window->ID; + group_data.BackupCursorPos = window->DC.CursorPos; + group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; + group_data.BackupIndent = window->DC.Indent; + group_data.BackupGroupOffset = window->DC.GroupOffset; + group_data.BackupCurrLineSize = window->DC.CurrLineSize; + group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; + group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; + group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; + group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; + group_data.EmitItem = true; + + window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x; + window->DC.Indent = window->DC.GroupOffset; + window->DC.CursorMaxPos = window->DC.CursorPos; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return +} + +void ImGui::EndGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.GroupStack.Size > 0); // Mismatched BeginGroup()/EndGroup() calls + + ImGuiGroupData& group_data = g.GroupStack.back(); + IM_ASSERT(group_data.WindowID == window->ID); // EndGroup() in wrong window? + + ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); + + window->DC.CursorPos = group_data.BackupCursorPos; + window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); + window->DC.Indent = group_data.BackupIndent; + window->DC.GroupOffset = group_data.BackupGroupOffset; + window->DC.CurrLineSize = group_data.BackupCurrLineSize; + window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return + + if (!group_data.EmitItem) + { + g.GroupStack.pop_back(); + return; + } + + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. + ItemSize(group_bb.GetSize()); + ItemAdd(group_bb, 0); + + // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group. + // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets. + // Also if you grep for LastItemId you'll notice it is only used in that context. + // (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.) + const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId; + const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true); + if (group_contains_curr_active_id) + window->DC.LastItemId = g.ActiveId; + else if (group_contains_prev_active_id) + window->DC.LastItemId = g.ActiveIdPreviousFrame; + window->DC.LastItemRect = group_bb; + + // Forward Hovered flag + const bool group_contains_curr_hovered_id = (group_data.BackupHoveredIdIsAlive == false) && g.HoveredId != 0; + if (group_contains_curr_hovered_id) + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + + // Forward Edited flag + if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame) + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited; + + // Forward Deactivated flag + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDeactivated; + if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame) + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Deactivated; + + g.GroupStack.pop_back(); + //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] +} + + +//----------------------------------------------------------------------------- +// [SECTION] SCROLLING +//----------------------------------------------------------------------------- + +// Helper to snap on edges when aiming at an item very close to the edge, +// So the difference between WindowPadding and ItemSpacing will be in the visible area after scrolling. +// When we refactor the scrolling API this may be configurable with a flag? +// Note that the effect for this won't be visible on X axis with default Style settings as WindowPadding.x == ItemSpacing.x by default. +static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, float snap_threshold, float center_ratio) +{ + if (target <= snap_min + snap_threshold) + return ImLerp(snap_min, target, center_ratio); + if (target >= snap_max - snap_threshold) + return ImLerp(target, snap_max, center_ratio); + return target; +} + +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) +{ + ImVec2 scroll = window->Scroll; + if (window->ScrollTarget.x < FLT_MAX) + { + float center_x_ratio = window->ScrollTargetCenterRatio.x; + float scroll_target_x = window->ScrollTarget.x; + float snap_x_min = 0.0f; + float snap_x_max = window->ScrollMax.x + window->Size.x; + if (window->ScrollTargetEdgeSnapDist.x > 0.0f) + scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio); + scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - window->ScrollbarSizes.x); + } + if (window->ScrollTarget.y < FLT_MAX) + { + float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); + float center_y_ratio = window->ScrollTargetCenterRatio.y; + float scroll_target_y = window->ScrollTarget.y; + float snap_y_min = 0.0f; + float snap_y_max = window->ScrollMax.y + window->Size.y - decoration_up_height; + if (window->ScrollTargetEdgeSnapDist.y > 0.0f) + scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio); + scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - window->ScrollbarSizes.y - decoration_up_height); + } + scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f)); + scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f)); + if (!window->Collapsed && !window->SkipItems) + { + scroll.x = ImMin(scroll.x, window->ScrollMax.x); + scroll.y = ImMin(scroll.y, window->ScrollMax.y); + } + return scroll; +} + +// Scroll to keep newly navigated item fully into view +ImVec2 ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect) +{ + ImGuiContext& g = *GImGui; + ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); + //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] + + ImVec2 delta_scroll; + if (!window_rect.Contains(item_rect)) + { + if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x) + SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x - g.Style.ItemSpacing.x, 0.0f); + else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x) + SetScrollFromPosX(window, item_rect.Max.x - window->Pos.x + g.Style.ItemSpacing.x, 1.0f); + if (item_rect.Min.y < window_rect.Min.y) + SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y - g.Style.ItemSpacing.y, 0.0f); + else if (item_rect.Max.y >= window_rect.Max.y) + SetScrollFromPosY(window, item_rect.Max.y - window->Pos.y + g.Style.ItemSpacing.y, 1.0f); + + ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); + delta_scroll = next_scroll - window->Scroll; + } + + // Also scroll parent window to keep us into view if necessary + if (window->Flags & ImGuiWindowFlags_ChildWindow) + delta_scroll += ScrollToBringRectIntoView(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll)); + + return delta_scroll; +} + +float ImGui::GetScrollX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.x; +} + +float ImGui::GetScrollY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.y; +} + +float ImGui::GetScrollMaxX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.x; +} + +float ImGui::GetScrollMaxY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.y; +} + +void ImGui::SetScrollX(ImGuiWindow* window, float scroll_x) +{ + window->ScrollTarget.x = scroll_x; + window->ScrollTargetCenterRatio.x = 0.0f; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollY(ImGuiWindow* window, float scroll_y) +{ + window->ScrollTarget.y = scroll_y; + window->ScrollTargetCenterRatio.y = 0.0f; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollX(float scroll_x) +{ + ImGuiContext& g = *GImGui; + SetScrollX(g.CurrentWindow, scroll_x); +} + +void ImGui::SetScrollY(float scroll_y) +{ + ImGuiContext& g = *GImGui; + SetScrollY(g.CurrentWindow, scroll_y); +} + +// Note that a local position will vary depending on initial scroll value, +// This is a little bit confusing so bear with us: +// - local_pos = (absolution_pos - window->Pos) +// - So local_x/local_y are 0.0f for a position at the upper-left corner of a window, +// and generally local_x/local_y are >(padding+decoration) && <(size-padding-decoration) when in the visible area. +// - They mostly exists because of legacy API. +// Following the rules above, when trying to work with scrolling code, consider that: +// - SetScrollFromPosY(0.0f) == SetScrollY(0.0f + scroll.y) == has no effect! +// - SetScrollFromPosY(-scroll.y) == SetScrollY(-scroll.y + scroll.y) == SetScrollY(0.0f) == reset scroll. Of course writing SetScrollY(0.0f) directly then makes more sense +// We store a target position so centering and clamping can occur on the next frame when we are guaranteed to have a known window size +void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) +{ + IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); + window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.x = center_x_ratio; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) +{ + IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); + local_y -= window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect + window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.y = center_y_ratio; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosX(g.CurrentWindow, local_x, center_x_ratio); +} + +void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosY(g.CurrentWindow, local_y, center_y_ratio); +} + +// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item. +void ImGui::SetScrollHereX(float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_x = g.Style.ItemSpacing.x; + float target_pos_x = ImLerp(window->DC.LastItemRect.Min.x - spacing_x, window->DC.LastItemRect.Max.x + spacing_x, center_x_ratio); + SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.x = ImMax(0.0f, window->WindowPadding.x - spacing_x); +} + +// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. +void ImGui::SetScrollHereY(float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_y = g.Style.ItemSpacing.y; + float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio); + SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.y = ImMax(0.0f, window->WindowPadding.y - spacing_y); +} + //----------------------------------------------------------------------------- // [SECTION] TOOLTIPS //----------------------------------------------------------------------------- void ImGui::BeginTooltip() +{ + BeginTooltipEx(ImGuiWindowFlags_None, ImGuiTooltipFlags_None); +} + +void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags) { ImGuiContext& g = *GImGui; - if (g.DragDropWithinSourceOrTarget) + + if (g.DragDropWithinSource || g.DragDropWithinTarget) { // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. @@ -6875,30 +7956,21 @@ void ImGui::BeginTooltip() SetNextWindowPos(tooltip_pos); SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( - BeginTooltipEx(0, true); + tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; } - else - { - BeginTooltipEx(0, false); - } -} -// Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first. -void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip) -{ - ImGuiContext& g = *GImGui; char window_name[16]; ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); - if (override_previous_tooltip) + if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) if (ImGuiWindow* window = FindWindowByName(window_name)) if (window->Active) { // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. window->Hidden = true; - window->HiddenFramesCanSkipItems = 1; + window->HiddenFramesCanSkipItems = 1; // FIXME: This may not be necessary? ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); } - ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoInputs|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize; + ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; Begin(window_name, NULL, flags | extra_flags); } @@ -6910,11 +7982,7 @@ void ImGui::EndTooltip() void ImGui::SetTooltipV(const char* fmt, va_list args) { - ImGuiContext& g = *GImGui; - if (g.DragDropWithinSourceOrTarget) - BeginTooltip(); - else - BeginTooltipEx(0, true); + BeginTooltipEx(0, ImGuiTooltipFlags_OverridePreviousTooltip); TextV(fmt, args); EndTooltip(); } @@ -6931,43 +7999,77 @@ void ImGui::SetTooltip(const char* fmt, ...) // [SECTION] POPUPS //----------------------------------------------------------------------------- -bool ImGui::IsPopupOpen(ImGuiID id) +// Supported flags: ImGuiPopupFlags_AnyPopupId, ImGuiPopupFlags_AnyPopupLevel +bool ImGui::IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags) { ImGuiContext& g = *GImGui; - return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id; + if (popup_flags & ImGuiPopupFlags_AnyPopupId) + { + // Return true if any popup is open at the current BeginPopup() level of the popup stack + // This may be used to e.g. test for another popups already opened to handle popups priorities at the same level. + IM_ASSERT(id == 0); + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + return g.OpenPopupStack.Size > 0; + else + return g.OpenPopupStack.Size > g.BeginPopupStack.Size; + } + else + { + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + { + // Return true if the popup is open anywhere in the popup stack + for (int n = 0; n < g.OpenPopupStack.Size; n++) + if (g.OpenPopupStack[n].PopupId == id) + return true; + return false; + } + else + { + // Return true if the popup is open at the current BeginPopup() level of the popup stack (this is the most-common query) + return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id; + } + } } -bool ImGui::IsPopupOpen(const char* str_id) +bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags) { ImGuiContext& g = *GImGui; - return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == g.CurrentWindow->GetID(str_id); + ImGuiID id = (popup_flags & ImGuiPopupFlags_AnyPopupId) ? 0 : g.CurrentWindow->GetID(str_id); + if ((popup_flags & ImGuiPopupFlags_AnyPopupLevel) && id != 0) + IM_ASSERT(0 && "Cannot use IsPopupOpen() with a string id and ImGuiPopupFlags_AnyPopupLevel."); // But non-string version is legal and used internally + return IsPopupOpen(id, popup_flags); } -ImGuiWindow* ImGui::GetFrontMostPopupModal() +ImGuiWindow* ImGui::GetTopMostPopupModal() { ImGuiContext& g = *GImGui; - for (int n = g.OpenPopupStack.Size-1; n >= 0; n--) + for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) if (popup->Flags & ImGuiWindowFlags_Modal) return popup; return NULL; } -void ImGui::OpenPopup(const char* str_id) +void ImGui::OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags) { ImGuiContext& g = *GImGui; - OpenPopupEx(g.CurrentWindow->GetID(str_id)); + OpenPopupEx(g.CurrentWindow->GetID(str_id), popup_flags); } // Mark popup as open (toggle toward open state). // Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. // Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). // One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL) -void ImGui::OpenPopupEx(ImGuiID id) +void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) { ImGuiContext& g = *GImGui; ImGuiWindow* parent_window = g.CurrentWindow; - int current_stack_size = g.BeginPopupStack.Size; + const int current_stack_size = g.BeginPopupStack.Size; + + if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup) + if (IsPopupOpen(0u, ImGuiPopupFlags_AnyPopupId)) + return; + ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. popup_ref.PopupId = id; popup_ref.Window = NULL; @@ -6977,7 +8079,7 @@ void ImGui::OpenPopupEx(ImGuiID id) popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); popup_ref.OpenMousePos = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : popup_ref.OpenPopupPos; - //IMGUI_DEBUG_LOG("OpenPopupEx(0x%08X)\n", g.FrameCount, id); + IMGUI_DEBUG_LOG_POPUP("OpenPopupEx(0x%08X)\n", id); if (g.OpenPopupStack.Size < current_stack_size + 1) { g.OpenPopupStack.push_back(popup_ref); @@ -6994,8 +8096,8 @@ void ImGui::OpenPopupEx(ImGuiID id) else { // Close child popups if any, then flag popup for open/reopen - g.OpenPopupStack.resize(current_stack_size + 1); - g.OpenPopupStack[current_stack_size] = popup_ref; + ClosePopupToLevel(current_stack_size, false); + g.OpenPopupStack.push_back(popup_ref); } // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by ClosePopupsOverWindow(). @@ -7005,26 +8107,14 @@ void ImGui::OpenPopupEx(ImGuiID id) } } -bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - { - ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! - IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) - OpenPopupEx(id); - return true; - } - return false; -} - +// When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. +// This function closes any popups that are over 'ref_window'. void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup) { ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.empty()) + if (g.OpenPopupStack.Size == 0) return; - // When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. // Don't close our own child popup windows. int popup_count_to_keep = 0; if (ref_window) @@ -7039,19 +8129,26 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) continue; - // Trim the stack when popups are not direct descendant of the reference window (the reference window is often the NavWindow) - bool popup_or_descendent_is_ref_window = false; - for (int m = popup_count_to_keep; m < g.OpenPopupStack.Size && !popup_or_descendent_is_ref_window; m++) - if (ImGuiWindow* popup_window = g.OpenPopupStack[m].Window) + // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) + // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: + // Window -> Popup1 -> Popup2 -> Popup3 + // - Each popups may contain child windows, which is why we compare ->RootWindow! + // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child + bool ref_window_is_descendent_of_popup = false; + for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) + if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) if (popup_window->RootWindow == ref_window->RootWindow) - popup_or_descendent_is_ref_window = true; - if (!popup_or_descendent_is_ref_window) + { + ref_window_is_descendent_of_popup = true; + break; + } + if (!ref_window_is_descendent_of_popup) break; } } if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below { - //IMGUI_DEBUG_LOG("ClosePopupsOverWindow(%s) -> ClosePopupToLevel(%d)\n", ref_window->Name, popup_count_to_keep); + IMGUI_DEBUG_LOG_POPUP("ClosePopupsOverWindow(\"%s\") -> ClosePopupToLevel(%d)\n", ref_window->Name, popup_count_to_keep); ClosePopupToLevel(popup_count_to_keep, restore_focus_to_window_under_popup); } } @@ -7059,7 +8156,10 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) { ImGuiContext& g = *GImGui; + IMGUI_DEBUG_LOG_POPUP("ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); + + // Trim open popup stack ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow; ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; g.OpenPopupStack.resize(remaining); @@ -7073,7 +8173,7 @@ void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_ } else { - if (g.NavLayer == 0 && focus_window) + if (g.NavLayer == ImGuiNavLayer_Main && focus_window) focus_window = NavRestoreLastChildNavWindow(focus_window); FocusWindow(focus_window); } @@ -7101,7 +8201,7 @@ void ImGui::CloseCurrentPopup() break; popup_idx--; } - //IMGUI_DEBUG_LOG("CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx); + IMGUI_DEBUG_LOG_POPUP("CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx); ClosePopupToLevel(popup_idx, true); // A common pattern is to close a popup when selecting a menu item/selectable that will open another window. @@ -7111,22 +8211,24 @@ void ImGui::CloseCurrentPopup() window->DC.NavHideHighlightOneFrame = true; } -bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags) +// Attention! BeginPopup() adds default flags which BeginPopupEx()! +bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; - if (!IsPopupOpen(id)) + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) { - g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values return false; } char name[20]; - if (extra_flags & ImGuiWindowFlags_ChildMenu) + if (flags & ImGuiWindowFlags_ChildMenu) ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth else ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame - bool is_open = Begin(name, NULL, extra_flags | ImGuiWindowFlags_Popup); + flags |= ImGuiWindowFlags_Popup; + bool is_open = Begin(name, NULL, flags); if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) EndPopup(); @@ -7138,7 +8240,7 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) ImGuiContext& g = *GImGui; if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance { - g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values return false; } flags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings; @@ -7146,24 +8248,28 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) } // If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. -// Note that popup visibility status is owned by imgui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. +// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; const ImGuiID id = window->GetID(name); - if (!IsPopupOpen(id)) + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) { - g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values return false; } - // Center modal windows by default + // Center modal windows by default for increased visibility + // (this won't really last as settings will kick in, and is mostly for backward compatibility. user may do the same themselves) // FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window. - if (g.NextWindowData.PosCond == 0) - SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0) + { + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f)); + } - flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings; + flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse; const bool is_open = Begin(name, p_open, flags); if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display) { @@ -7178,51 +8284,85 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla void ImGui::EndPopup() { ImGuiContext& g = *GImGui; - IM_ASSERT(g.CurrentWindow->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls IM_ASSERT(g.BeginPopupStack.Size > 0); // Make all menus and popups wrap around for now, may need to expose that policy. - NavMoveRequestTryWrapping(g.CurrentWindow, ImGuiNavMoveFlags_LoopY); + if (g.NavWindow == window) + NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY); + // Child-popups don't need to be laid out + IM_ASSERT(g.WithinEndChild == false); + if (window->Flags & ImGuiWindowFlags_ChildWindow) + g.WithinEndChild = true; End(); + g.WithinEndChild = false; +} + +// Helper to open a popup if mouse button is released over the item +// - This is essentially the same as BeginPopupContextItem() but without the trailing BeginPopup() +void ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + { + ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! + IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + OpenPopupEx(id, popup_flags); + } } // This is a helper to handle the simplest case of associating one named popup to one given widget. -// You may want to handle this on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). -// You can pass a NULL str_id to use the identifier of the last item. -bool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button) +// - You can pass a NULL str_id to use the identifier of the last item. +// - You may want to handle this on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). +// - This is essentially the same as calling OpenPopupOnItemClick() + BeginPopup() but written to avoid +// computing the ID twice because BeginPopupContextXXX functions may be called very frequently. +bool ImGui::BeginPopupContextItem(const char* str_id, ImGuiPopupFlags popup_flags) { ImGuiWindow* window = GImGui->CurrentWindow; + if (window->SkipItems) + return false; ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - OpenPopupEx(id); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); } -bool ImGui::BeginPopupContextWindow(const char* str_id, int mouse_button, bool also_over_items) +bool ImGui::BeginPopupContextWindow(const char* str_id, ImGuiPopupFlags popup_flags) { + ImGuiWindow* window = GImGui->CurrentWindow; if (!str_id) str_id = "window_context"; - ImGuiID id = GImGui->CurrentWindow->GetID(str_id); + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); if (IsMouseReleased(mouse_button) && IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - if (also_over_items || !IsAnyItemHovered()) - OpenPopupEx(id); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); + if (!(popup_flags & ImGuiPopupFlags_NoOpenOverItems) || !IsAnyItemHovered()) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); } -bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button) +bool ImGui::BeginPopupContextVoid(const char* str_id, ImGuiPopupFlags popup_flags) { + ImGuiWindow* window = GImGui->CurrentWindow; if (!str_id) str_id = "void_context"; - ImGuiID id = GImGui->CurrentWindow->GetID(str_id); + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); if (IsMouseReleased(mouse_button) && !IsWindowHovered(ImGuiHoveredFlags_AnyWindow)) - OpenPopupEx(id); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings); + if (GetTopMostPopupModal() == NULL) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); } // r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.) // r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it. +// (r_outer is usually equivalent to the viewport rectangle minus padding, but when multi-viewports are enabled and monitor +// information are available, it may represent the entire platform monitor from the frame of reference of the current viewport. +// this allows us to have tooltips/popups displayed out of the parent viewport.) ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy) { ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size); @@ -7250,37 +8390,60 @@ ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& s } } - // Default popup policy - const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; - for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + // Tooltip and Default popup policy + // (Always first try the direction we used on the last frame, if any) + if (policy == ImGuiPopupPositionPolicy_Tooltip || policy == ImGuiPopupPositionPolicy_Default) { - const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; - if (n != -1 && dir == *last_dir) // Already tried this direction? - continue; - float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); - float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); - if (avail_w < size.x || avail_h < size.y) - continue; - ImVec2 pos; - pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; - pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; - *last_dir = dir; - return pos; + const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; + for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + { + const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; + if (n != -1 && dir == *last_dir) // Already tried this direction? + continue; + + const float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); + const float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); + + // If there not enough room on one axis, there's no point in positioning on a side on this axis (e.g. when not enough width, use a top/bottom position to maximize available width) + if (avail_w < size.x && (dir == ImGuiDir_Left || dir == ImGuiDir_Right)) + continue; + if (avail_h < size.y && (dir == ImGuiDir_Up || dir == ImGuiDir_Down)) + continue; + + ImVec2 pos; + pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; + pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; + + // Clamp top-left corner of popup + pos.x = ImMax(pos.x, r_outer.Min.x); + pos.y = ImMax(pos.y, r_outer.Min.y); + + *last_dir = dir; + return pos; + } } - // Fallback, try to keep within display + // Fallback when not enough room: *last_dir = ImGuiDir_None; + + // For tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. + if (policy == ImGuiPopupPositionPolicy_Tooltip) + return ref_pos + ImVec2(2, 2); + + // Otherwise try to keep within display ImVec2 pos = ref_pos; pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x); pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y); return pos; } +// Note that this is used for popups, which can overlap the non work-area of individual viewports. ImRect ImGui::GetWindowAllowedExtentRect(ImGuiWindow* window) { + ImGuiContext& g = *GImGui; IM_UNUSED(window); - ImVec2 padding = GImGui->Style.DisplaySafeAreaPadding; - ImRect r_screen = GetViewportRect(); + ImRect r_screen = ((ImGuiViewportP*)(void*)GetMainViewport())->GetMainRect(); + ImVec2 padding = g.Style.DisplaySafeAreaPadding; r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f)); return r_screen; } @@ -7299,15 +8462,15 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) float horizontal_overlap = g.Style.ItemInnerSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x). ImRect r_avoid; if (parent_window->DC.MenuBarAppending) - r_avoid = ImRect(-FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight(), FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight() + parent_window->MenuBarHeight()); + r_avoid = ImRect(-FLT_MAX, parent_window->ClipRect.Min.y, FLT_MAX, parent_window->ClipRect.Max.y); // Avoid parent menu-bar. If we wanted multi-line menu-bar, we may instead want to have the calling window setup e.g. a NextWindowData.PosConstraintAvoidRect field else r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); - return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid); + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); } if (window->Flags & ImGuiWindowFlags_Popup) { ImRect r_avoid = ImRect(window->Pos.x - 1, window->Pos.y - 1, window->Pos.x + 1, window->Pos.y + 1); - return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid); + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); } if (window->Flags & ImGuiWindowFlags_Tooltip) { @@ -7319,20 +8482,55 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); else r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. - ImVec2 pos = FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid); - if (window->AutoPosLastDirection == ImGuiDir_None) - pos = ref_pos + ImVec2(2, 2); // If there's not enough room, for tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. - return pos; + return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); } IM_ASSERT(0); return window->Pos; } - //----------------------------------------------------------------------------- // [SECTION] KEYBOARD/GAMEPAD NAVIGATION //----------------------------------------------------------------------------- +// FIXME-NAV: The existence of SetNavID vs SetFocusID properly needs to be clarified/reworked. +void ImGui::SetNavID(ImGuiID id, int nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindow != NULL); + IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); + g.NavId = id; + g.NavLayer = (ImGuiNavLayer)nav_layer; + g.NavFocusScopeId = focus_scope_id; + g.NavWindow->NavLastIds[nav_layer] = id; + g.NavWindow->NavRectRel[nav_layer] = rect_rel; + //g.NavDisableHighlight = false; + //g.NavDisableMouseHover = g.NavMousePosDirty = true; +} + +void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(id != 0); + + // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and window->DC.NavFocusScopeIdCurrent are valid. + // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text) + const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; + if (g.NavWindow != window) + g.NavInitRequest = false; + g.NavWindow = window; + g.NavId = id; + g.NavLayer = nav_layer; + g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; + window->NavLastIds[nav_layer] = id; + if (window->DC.LastItemId == id) + window->NavRectRel[nav_layer] = ImRect(window->DC.LastItemRect.Min - window->Pos, window->DC.LastItemRect.Max - window->Pos); + + if (g.ActiveIdSource == ImGuiInputSource_Nav) + g.NavDisableMouseHover = true; + else + g.NavDisableHighlight = true; +} + ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy) { if (ImFabs(dx) > ImFabs(dy)) @@ -7363,22 +8561,22 @@ static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect } } -// Scoring function for directional navigation. Based on https://gist.github.com/rygorous/6981057 -static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) +// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057 +static bool ImGui::NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (g.NavLayer != window->DC.NavLayerCurrent) return false; - const ImRect& curr = g.NavScoringRectScreen; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width) + const ImRect& curr = g.NavScoringRect; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width) g.NavScoringCount++; // When entering through a NavFlattened border, we consider child window items as fully clipped for scoring if (window->ParentWindow == g.NavWindow) { IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened); - if (!window->ClipRect.Contains(cand)) + if (!window->ClipRect.Overlaps(cand)) return false; cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window } @@ -7392,7 +8590,7 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x); float dby = NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)); // Scale down on Y to keep using box-distance for vertically touching items if (dby != 0.0f && dbx != 0.0f) - dbx = (dbx/1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); + dbx = (dbx / 1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); float dist_box = ImFabs(dbx) + ImFabs(dby); // Compute distance between centers (this is off by a factor of 2, but we only compare center distances with each other so it doesn't matter) @@ -7427,27 +8625,27 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) #if IMGUI_DEBUG_NAV_SCORING char buf[128]; - if (ImGui::IsMouseHoveringRect(cand.Min, cand.Max)) + if (IsMouseHoveringRect(cand.Min, cand.Max)) { ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]); - ImDrawList* draw_list = ImGui::GetForegroundDrawList(window); + ImDrawList* draw_list = GetForegroundDrawList(window); draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100)); draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200)); - draw_list->AddRectFilled(cand.Max-ImVec2(4,4), cand.Max+ImGui::CalcTextSize(buf)+ImVec2(4,4), IM_COL32(40,0,0,150)); + draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40,0,0,150)); draw_list->AddText(g.IO.FontDefault, 13.0f, cand.Max, ~0U, buf); } else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate. { - if (ImGui::IsKeyPressedMap(ImGuiKey_C)) { g.NavMoveDirLast = (ImGuiDir)((g.NavMoveDirLast + 1) & 3); g.IO.KeysDownDuration[g.IO.KeyMap[ImGuiKey_C]] = 0.01f; } + if (IsKeyPressedMap(ImGuiKey_C)) { g.NavMoveDirLast = (ImGuiDir)((g.NavMoveDirLast + 1) & 3); g.IO.KeysDownDuration[g.IO.KeyMap[ImGuiKey_C]] = 0.01f; } if (quadrant == g.NavMoveDir) { ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center); - ImDrawList* draw_list = ImGui::GetForegroundDrawList(window); + ImDrawList* draw_list = GetForegroundDrawList(window); draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200)); draw_list->AddText(g.IO.FontDefault, 13.0f, cand.Min, IM_COL32(255, 255, 255, 255), buf); } } - #endif +#endif // Is it in the quadrant we're interesting in moving to? bool new_best = false; @@ -7485,7 +8683,7 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) // 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward. // Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option? if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match - if (g.NavLayer == 1 && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) + if (g.NavLayer == ImGuiNavLayer_Menu && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) if ((g.NavMoveDir == ImGuiDir_Left && dax < 0.0f) || (g.NavMoveDir == ImGuiDir_Right && dax > 0.0f) || (g.NavMoveDir == ImGuiDir_Up && day < 0.0f) || (g.NavMoveDir == ImGuiDir_Down && day > 0.0f)) { result->DistAxial = dist_axial; @@ -7495,6 +8693,14 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand) return new_best; } +static void ImGui::NavApplyItemToResult(ImGuiNavMoveResult* result, ImGuiWindow* window, ImGuiID id, const ImRect& nav_bb_rel) +{ + result->Window = window; + result->ID = id; + result->FocusScopeId = window->DC.NavFocusScopeIdCurrent; + result->RectRel = nav_bb_rel; +} + // We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id) { @@ -7523,7 +8729,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con // Process Move Request (scoring for navigation) // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRectScreen + scoring from a rect wrapped according to current wrapping policy) - if ((g.NavId != id || (g.NavMoveRequestFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & (ImGuiItemFlags_Disabled|ImGuiItemFlags_NoNav))) + if ((g.NavId != id || (g.NavMoveRequestFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & (ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNav))) { ImGuiNavMoveResult* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; #if IMGUI_DEBUG_NAV_SCORING @@ -7535,24 +8741,14 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con bool new_best = g.NavMoveRequest && NavScoreItem(result, nav_bb); #endif if (new_best) - { - result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; - result->Window = window; - result->RectRel = nav_bb_rel; - } + NavApplyItemToResult(result, window, id, nav_bb_rel); + // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. const float VISIBLE_RATIO = 0.70f; if ((g.NavMoveRequestFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) if (NavScoreItem(&g.NavMoveResultLocalVisibleSet, nav_bb)) - { - result = &g.NavMoveResultLocalVisibleSet; - result->ID = id; - result->SelectScopeId = g.MultiSelectScopeId; - result->Window = window; - result->RectRel = nav_bb_rel; - } + NavApplyItemToResult(&g.NavMoveResultLocalVisibleSet, window, id, nav_bb_rel); } // Update window-relative bounding box of navigated item @@ -7560,8 +8756,9 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con { g.NavWindow = window; // Always refresh g.NavWindow, because some operations such as FocusItem() don't have a window. g.NavLayer = window->DC.NavLayerCurrent; + g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; g.NavIdIsAlive = true; - g.NavIdTabCounter = window->DC.FocusCounterTab; + g.NavIdTabCounter = window->DC.FocusCounterTabStop; window->NavRectRel[window->DC.NavLayerCurrent] = nav_bb_rel; // Store item bounding box (relative to window position) } } @@ -7583,7 +8780,7 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const Im { ImGuiContext& g = *GImGui; IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_None); - ImGui::NavMoveRequestCancel(); + NavMoveRequestCancel(); g.NavMoveDir = move_dir; g.NavMoveClipDir = clip_dir; g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued; @@ -7594,66 +8791,50 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const Im void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags) { ImGuiContext& g = *GImGui; - if (g.NavWindow != window || !NavMoveRequestButNoResultYet() || g.NavMoveRequestForward != ImGuiNavForward_None || g.NavLayer != 0) - return; - IM_ASSERT(move_flags != 0); // No points calling this with no wrapping - ImRect bb_rel = window->NavRectRel[0]; - ImGuiDir clip_dir = g.NavMoveDir; - if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) - { - bb_rel.Min.x = bb_rel.Max.x = ImMax(window->SizeFull.x, window->SizeContents.x) - window->Scroll.x; - if (move_flags & ImGuiNavMoveFlags_WrapX) { bb_rel.TranslateY(-bb_rel.GetHeight()); clip_dir = ImGuiDir_Up; } - NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); - } - if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) - { - bb_rel.Min.x = bb_rel.Max.x = -window->Scroll.x; - if (move_flags & ImGuiNavMoveFlags_WrapX) { bb_rel.TranslateY(+bb_rel.GetHeight()); clip_dir = ImGuiDir_Down; } - NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); - } - if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) - { - bb_rel.Min.y = bb_rel.Max.y = ImMax(window->SizeFull.y, window->SizeContents.y) - window->Scroll.y; - if (move_flags & ImGuiNavMoveFlags_WrapY) { bb_rel.TranslateX(-bb_rel.GetWidth()); clip_dir = ImGuiDir_Left; } - NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); - } - if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) - { - bb_rel.Min.y = bb_rel.Max.y = -window->Scroll.y; - if (move_flags & ImGuiNavMoveFlags_WrapY) { bb_rel.TranslateX(+bb_rel.GetWidth()); clip_dir = ImGuiDir_Right; } - NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); - } + // Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire + // popup is assembled and in case of appended popups it is not clear which EndPopup() call is final. + g.NavWrapRequestWindow = window; + g.NavWrapRequestFlags = move_flags; } // FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0). // This way we could find the last focused window among our children. It would be much less confusing this way? static void ImGui::NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window) { - ImGuiWindow* parent_window = nav_window; - while (parent_window && (parent_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 && (parent_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) - parent_window = parent_window->ParentWindow; - if (parent_window && parent_window != nav_window) - parent_window->NavLastChildNavWindow = nav_window; + ImGuiWindow* parent = nav_window; + while (parent && parent->RootWindow != parent && (parent->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) + parent = parent->ParentWindow; + if (parent && parent != nav_window) + parent->NavLastChildNavWindow = nav_window; } // Restore the last focused child. // Call when we are expected to land on the Main Layer (0) after FocusWindow() static ImGuiWindow* ImGui::NavRestoreLastChildNavWindow(ImGuiWindow* window) { - return window->NavLastChildNavWindow ? window->NavLastChildNavWindow : window; + if (window->NavLastChildNavWindow && window->NavLastChildNavWindow->WasActive) + return window->NavLastChildNavWindow; + return window; } -static void NavRestoreLayer(ImGuiNavLayer layer) +void ImGui::NavRestoreLayer(ImGuiNavLayer layer) { ImGuiContext& g = *GImGui; - g.NavLayer = layer; - if (layer == 0) - g.NavWindow = ImGui::NavRestoreLastChildNavWindow(g.NavWindow); - if (layer == 0 && g.NavWindow->NavLastIds[0] != 0) - ImGui::SetNavIDWithRectRel(g.NavWindow->NavLastIds[0], layer, g.NavWindow->NavRectRel[0]); + if (layer == ImGuiNavLayer_Main) + g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); + ImGuiWindow* window = g.NavWindow; + if (window->NavLastIds[layer] != 0) + { + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); + g.NavDisableHighlight = false; + g.NavDisableMouseHover = g.NavMousePosDirty = true; + } else - ImGui::NavInitWindow(g.NavWindow, true); + { + g.NavLayer = layer; + NavInitWindow(window, true); + } } static inline void ImGui::NavUpdateAnyRequestFlag() @@ -7671,11 +8852,12 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) IM_ASSERT(window == g.NavWindow); bool init_for_nav = false; if (!(window->Flags & ImGuiWindowFlags_NoNavInputs)) - if (!(window->Flags & ImGuiWindowFlags_ChildWindow) || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit) + if (window == window->RootWindow || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit) init_for_nav = true; + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from NavInitWindow(), init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer); if (init_for_nav) { - SetNavID(0, g.NavLayer); + SetNavID(0, g.NavLayer, 0, ImRect()); g.NavInitRequest = true; g.NavInitRequestFromMove = false; g.NavInitResultId = 0; @@ -7685,6 +8867,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) else { g.NavId = window->NavLastIds[0]; + g.NavFocusScopeId = 0; } } @@ -7703,8 +8886,8 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() // When navigation is active and mouse is disabled, decide on an arbitrary position around the bottom left of the currently navigated item. const ImRect& rect_rel = g.NavWindow->NavRectRel[g.NavLayer]; ImVec2 pos = g.NavWindow->Pos + ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); - ImRect visible_rect = GetViewportRect(); - return ImFloor(ImClamp(pos, visible_rect.Min, visible_rect.Max)); // ImFloor() is important because non-integer mouse position application in back-end might be lossy and result in undesirable non-zero delta. + ImGuiViewport* viewport = GetMainViewport(); + return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. } } @@ -7722,11 +8905,11 @@ float ImGui::GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode) if (mode == ImGuiInputReadMode_Pressed) // Return 1.0f when just pressed, no repeat, ignore analog input. return (t == 0.0f) ? 1.0f : 0.0f; if (mode == ImGuiInputReadMode_Repeat) - return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 0.80f, g.IO.KeyRepeatRate * 0.80f); + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.80f); if (mode == ImGuiInputReadMode_RepeatSlow) - return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 1.00f, g.IO.KeyRepeatRate * 2.00f); + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 1.25f, g.IO.KeyRepeatRate * 2.00f); if (mode == ImGuiInputReadMode_RepeatFast) - return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 0.80f, g.IO.KeyRepeatRate * 0.30f); + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.30f); return 0.0f; } @@ -7746,57 +8929,33 @@ ImVec2 ImGui::GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInput return delta; } -// Scroll to keep newly navigated item fully into view -// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated. -static void NavScrollToBringItemIntoView(ImGuiWindow* window, const ImRect& item_rect) -{ - ImRect window_rect(window->InnerMainRect.Min - ImVec2(1, 1), window->InnerMainRect.Max + ImVec2(1, 1)); - //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] - if (window_rect.Contains(item_rect)) - return; - - ImGuiContext& g = *GImGui; - if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x) - { - window->ScrollTarget.x = item_rect.Min.x - window->Pos.x + window->Scroll.x - g.Style.ItemSpacing.x; - window->ScrollTargetCenterRatio.x = 0.0f; - } - else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x) - { - window->ScrollTarget.x = item_rect.Max.x - window->Pos.x + window->Scroll.x + g.Style.ItemSpacing.x; - window->ScrollTargetCenterRatio.x = 1.0f; - } - if (item_rect.Min.y < window_rect.Min.y) - { - window->ScrollTarget.y = item_rect.Min.y - window->Pos.y + window->Scroll.y - g.Style.ItemSpacing.y; - window->ScrollTargetCenterRatio.y = 0.0f; - } - else if (item_rect.Max.y >= window_rect.Max.y) - { - window->ScrollTarget.y = item_rect.Max.y - window->Pos.y + window->Scroll.y + g.Style.ItemSpacing.y; - window->ScrollTargetCenterRatio.y = 1.0f; - } -} - static void ImGui::NavUpdate() { ImGuiContext& g = *GImGui; - g.IO.WantSetMousePos = false; + ImGuiIO& io = g.IO; + + io.WantSetMousePos = false; + g.NavWrapRequestWindow = NULL; + g.NavWrapRequestFlags = ImGuiNavMoveFlags_None; #if 0 if (g.NavScoringCount > 0) IMGUI_DEBUG_LOG("NavScoringCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.FrameCount, g.NavScoringCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest); #endif - // Set input source as Gamepad when buttons are pressed before we map Keyboard (some features differs when used with Gamepad vs Keyboard) - bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - if (nav_gamepad_active) - if (g.IO.NavInputs[ImGuiNavInput_Activate] > 0.0f || g.IO.NavInputs[ImGuiNavInput_Input] > 0.0f || g.IO.NavInputs[ImGuiNavInput_Cancel] > 0.0f || g.IO.NavInputs[ImGuiNavInput_Menu] > 0.0f) - g.NavInputSource = ImGuiInputSource_NavGamepad; + // Set input source as Gamepad when buttons are pressed (as some features differs when used with Gamepad vs Keyboard) + // (do it before we map Keyboard input!) + bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + if (nav_gamepad_active && g.NavInputSource != ImGuiInputSource_Gamepad) + { + if (io.NavInputs[ImGuiNavInput_Activate] > 0.0f || io.NavInputs[ImGuiNavInput_Input] > 0.0f || io.NavInputs[ImGuiNavInput_Cancel] > 0.0f || io.NavInputs[ImGuiNavInput_Menu] > 0.0f + || io.NavInputs[ImGuiNavInput_DpadLeft] > 0.0f || io.NavInputs[ImGuiNavInput_DpadRight] > 0.0f || io.NavInputs[ImGuiNavInput_DpadUp] > 0.0f || io.NavInputs[ImGuiNavInput_DpadDown] > 0.0f) + g.NavInputSource = ImGuiInputSource_Gamepad; + } // Update Keyboard->Nav inputs mapping if (nav_keyboard_active) { - #define NAV_MAP_KEY(_KEY, _NAV_INPUT) if (IsKeyDown(g.IO.KeyMap[_KEY])) { g.IO.NavInputs[_NAV_INPUT] = 1.0f; g.NavInputSource = ImGuiInputSource_NavKeyboard; } + #define NAV_MAP_KEY(_KEY, _NAV_INPUT) do { if (IsKeyDown(io.KeyMap[_KEY])) { io.NavInputs[_NAV_INPUT] = 1.0f; g.NavInputSource = ImGuiInputSource_Keyboard; } } while (0) NAV_MAP_KEY(ImGuiKey_Space, ImGuiNavInput_Activate ); NAV_MAP_KEY(ImGuiKey_Enter, ImGuiNavInput_Input ); NAV_MAP_KEY(ImGuiKey_Escape, ImGuiNavInput_Cancel ); @@ -7804,30 +8963,21 @@ static void ImGui::NavUpdate() NAV_MAP_KEY(ImGuiKey_RightArrow,ImGuiNavInput_KeyRight_); NAV_MAP_KEY(ImGuiKey_UpArrow, ImGuiNavInput_KeyUp_ ); NAV_MAP_KEY(ImGuiKey_DownArrow, ImGuiNavInput_KeyDown_ ); - NAV_MAP_KEY(ImGuiKey_Tab, ImGuiNavInput_KeyTab_ ); - if (g.IO.KeyCtrl) - g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f; - if (g.IO.KeyShift) - g.IO.NavInputs[ImGuiNavInput_TweakFast] = 1.0f; - if (g.IO.KeyAlt && !g.IO.KeyCtrl) // AltGR is Alt+Ctrl, also even on keyboards without AltGR we don't want Alt+Ctrl to open menu. - g.IO.NavInputs[ImGuiNavInput_KeyMenu_] = 1.0f; + if (io.KeyCtrl) + io.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f; + if (io.KeyShift) + io.NavInputs[ImGuiNavInput_TweakFast] = 1.0f; + if (io.KeyAlt && !io.KeyCtrl) // AltGR is Alt+Ctrl, also even on keyboards without AltGR we don't want Alt+Ctrl to open menu. + io.NavInputs[ImGuiNavInput_KeyMenu_] = 1.0f; #undef NAV_MAP_KEY } - memcpy(g.IO.NavInputsDownDurationPrev, g.IO.NavInputsDownDuration, sizeof(g.IO.NavInputsDownDuration)); - for (int i = 0; i < IM_ARRAYSIZE(g.IO.NavInputs); i++) - g.IO.NavInputsDownDuration[i] = (g.IO.NavInputs[i] > 0.0f) ? (g.IO.NavInputsDownDuration[i] < 0.0f ? 0.0f : g.IO.NavInputsDownDuration[i] + g.IO.DeltaTime) : -1.0f; + memcpy(io.NavInputsDownDurationPrev, io.NavInputsDownDuration, sizeof(io.NavInputsDownDuration)); + for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) + io.NavInputsDownDuration[i] = (io.NavInputs[i] > 0.0f) ? (io.NavInputsDownDuration[i] < 0.0f ? 0.0f : io.NavInputsDownDuration[i] + io.DeltaTime) : -1.0f; // Process navigation init request (select first/default focus) - if (g.NavInitResultId != 0 && (!g.NavDisableHighlight || g.NavInitRequestFromMove)) - { - // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) - IM_ASSERT(g.NavWindow); - if (g.NavInitRequestFromMove) - SetNavIDWithRectRel(g.NavInitResultId, g.NavLayer, g.NavInitResultRectRel); - else - SetNavID(g.NavInitResultId, g.NavLayer); - g.NavWindow->NavRectRel[g.NavLayer] = g.NavInitResultRectRel; - } + if (g.NavInitResultId != 0) + NavUpdateInitResult(); g.NavInitRequest = false; g.NavInitRequestFromMove = false; g.NavInitResultId = 0; @@ -7850,14 +9000,12 @@ static void ImGui::NavUpdate() if (g.NavMousePosDirty && g.NavIdIsAlive) { // Set mouse position given our knowledge of the navigated item position from last frame - if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (g.IO.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) - { + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) if (!g.NavDisableHighlight && g.NavDisableMouseHover && g.NavWindow) { - g.IO.MousePos = g.IO.MousePosPrev = NavCalcPreferredRefPos(); - g.IO.WantSetMousePos = true; + io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); + io.WantSetMousePos = true; } - } g.NavMousePosDirty = false; } g.NavIdIsAlive = false; @@ -7867,35 +9015,34 @@ static void ImGui::NavUpdate() // Store our return window (for returning from Layer 1 to Layer 0) and clear it as soon as we step back in our own Layer 0 if (g.NavWindow) NavSaveLastChildNavWindowIntoParent(g.NavWindow); - if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == 0) + if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == ImGuiNavLayer_Main) g.NavWindow->NavLastChildNavWindow = NULL; // Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.) NavUpdateWindowing(); // Set output flags for user application - g.IO.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs); - g.IO.NavVisible = (g.IO.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL); + io.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs); + io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL); // Process NavCancel input (to close a popup, get back to parent, clear focus) - if (IsNavInputPressed(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed)) + if (IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed)) { + IMGUI_DEBUG_LOG_NAV("[nav] ImGuiNavInput_Cancel\n"); if (g.ActiveId != 0) { - if (!(g.ActiveIdBlockNavInputFlags & (1 << ImGuiNavInput_Cancel))) + if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel)) ClearActiveID(); } - else if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow) && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) + else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) { // Exit child window ImGuiWindow* child_window = g.NavWindow; ImGuiWindow* parent_window = g.NavWindow->ParentWindow; IM_ASSERT(child_window->ChildId != 0); + ImRect child_rect = child_window->Rect(); FocusWindow(parent_window); - SetNavID(child_window->ChildId, 0); - g.NavIdIsAlive = false; - if (g.NavDisableMouseHover) - g.NavMousePosDirty = true; + SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, ImRect(child_rect.Min - parent_window->Pos, child_rect.Max - parent_window->Pos)); } else if (g.OpenPopupStack.Size > 0) { @@ -7903,7 +9050,7 @@ static void ImGui::NavUpdate() if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) ClosePopupToLevel(g.OpenPopupStack.Size - 1, true); } - else if (g.NavLayer != 0) + else if (g.NavLayer != ImGuiNavLayer_Main) { // Leave the "menu" layer NavRestoreLayer(ImGuiNavLayer_Main); @@ -7913,7 +9060,7 @@ static void ImGui::NavUpdate() // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow))) g.NavWindow->NavLastIds[0] = 0; - g.NavId = 0; + g.NavId = g.NavFocusScopeId = 0; } } @@ -7922,14 +9069,14 @@ static void ImGui::NavUpdate() if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) { bool activate_down = IsNavInputDown(ImGuiNavInput_Activate); - bool activate_pressed = activate_down && IsNavInputPressed(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed); + bool activate_pressed = activate_down && IsNavInputTest(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed); if (g.ActiveId == 0 && activate_pressed) g.NavActivateId = g.NavId; if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down) g.NavActivateDownId = g.NavId; if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed) g.NavActivatePressedId = g.NavId; - if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputPressed(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed)) + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputTest(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed)) g.NavInputId = g.NavId; } if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) @@ -7944,17 +9091,17 @@ static void ImGui::NavUpdate() g.NavNextActivateId = 0; // Initiate directional inputs request - const int allowed_dir_flags = (g.ActiveId == 0) ? ~0 : g.ActiveIdAllowNavDirFlags; if (g.NavMoveRequestForward == ImGuiNavForward_None) { g.NavMoveDir = ImGuiDir_None; g.NavMoveRequestFlags = ImGuiNavMoveFlags_None; - if (g.NavWindow && !g.NavWindowingTarget && allowed_dir_flags && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) + if (g.NavWindow && !g.NavWindowingTarget && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) { - if ((allowed_dir_flags & (1<<ImGuiDir_Left)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Left; - if ((allowed_dir_flags & (1<<ImGuiDir_Right)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadRight,ImGuiNavInput_KeyRight_,ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Right; - if ((allowed_dir_flags & (1<<ImGuiDir_Up)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Up; - if ((allowed_dir_flags & (1<<ImGuiDir_Down)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Down; + const ImGuiInputReadMode read_mode = ImGuiInputReadMode_Repeat; + if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && (IsNavInputTest(ImGuiNavInput_DpadLeft, read_mode) || IsNavInputTest(ImGuiNavInput_KeyLeft_, read_mode))) { g.NavMoveDir = ImGuiDir_Left; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && (IsNavInputTest(ImGuiNavInput_DpadRight, read_mode) || IsNavInputTest(ImGuiNavInput_KeyRight_, read_mode))) { g.NavMoveDir = ImGuiDir_Right; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && (IsNavInputTest(ImGuiNavInput_DpadUp, read_mode) || IsNavInputTest(ImGuiNavInput_KeyUp_, read_mode))) { g.NavMoveDir = ImGuiDir_Up; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && (IsNavInputTest(ImGuiNavInput_DpadDown, read_mode) || IsNavInputTest(ImGuiNavInput_KeyDown_, read_mode))) { g.NavMoveDir = ImGuiDir_Down; } } g.NavMoveClipDir = g.NavMoveDir; } @@ -7964,24 +9111,29 @@ static void ImGui::NavUpdate() // (Preserve g.NavMoveRequestFlags, g.NavMoveClipDir which were set by the NavMoveRequestForward() function) IM_ASSERT(g.NavMoveDir != ImGuiDir_None && g.NavMoveClipDir != ImGuiDir_None); IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_ForwardQueued); + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestForward %d\n", g.NavMoveDir); g.NavMoveRequestForward = ImGuiNavForward_ForwardActive; } - // Update PageUp/PageDown scroll + // Update PageUp/PageDown/Home/End scroll + // FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag? float nav_scoring_rect_offset_y = 0.0f; if (nav_keyboard_active) - nav_scoring_rect_offset_y = NavUpdatePageUpPageDown(allowed_dir_flags); + nav_scoring_rect_offset_y = NavUpdatePageUpPageDown(); // If we initiate a movement request and have no current NavId, we initiate a InitDefautRequest that will be used as a fallback if the direction fails to find a match if (g.NavMoveDir != ImGuiDir_None) { g.NavMoveRequest = true; + g.NavMoveRequestKeyMods = io.KeyMods; g.NavMoveDirLast = g.NavMoveDir; } if (g.NavMoveRequest && g.NavId == 0) { + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", g.NavWindow->Name, g.NavLayer); g.NavInitRequest = g.NavInitRequestFromMove = true; - g.NavInitResultId = 0; + // Reassigning with same value, we're being explicit here. + g.NavInitResultId = 0; // -V1048 g.NavDisableHighlight = false; } NavUpdateAnyRequestFlag(); @@ -7991,28 +9143,22 @@ static void ImGui::NavUpdate() { // *Fallback* manual-scroll with Nav directional keys when window has no navigable item ImGuiWindow* window = g.NavWindow; - const float scroll_speed = ImFloor(window->CalcFontSize() * 100 * g.IO.DeltaTime + 0.5f); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. + const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll && g.NavMoveRequest) { if (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) - SetWindowScrollX(window, ImFloor(window->Scroll.x + ((g.NavMoveDir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollX(window, ImFloor(window->Scroll.x + ((g.NavMoveDir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); if (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) - SetWindowScrollY(window, ImFloor(window->Scroll.y + ((g.NavMoveDir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollY(window, ImFloor(window->Scroll.y + ((g.NavMoveDir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); } // *Normal* Manual scroll with NavScrollXXX keys // Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds. - ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down, 1.0f/10.0f, 10.0f); + ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down, 1.0f / 10.0f, 10.0f); if (scroll_dir.x != 0.0f && window->ScrollbarX) - { - SetWindowScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed)); - g.NavMoveFromClampedRefRect = true; - } + SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed)); if (scroll_dir.y != 0.0f) - { - SetWindowScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed)); - g.NavMoveFromClampedRefRect = true; - } + SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed)); } // Reset search results @@ -8020,28 +9166,30 @@ static void ImGui::NavUpdate() g.NavMoveResultLocalVisibleSet.Clear(); g.NavMoveResultOther.Clear(); - // When we have manually scrolled (without using navigation) and NavId becomes out of bounds, we project its bounding box to the visible area to restart navigation within visible items - if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == 0) + // When using gamepad, we project the reference nav bounding box into window visible area. + // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad every movements are relative + // (can't focus a visible object like we can with the mouse). + if (g.NavMoveRequest && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main) { ImGuiWindow* window = g.NavWindow; - ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1,1), window->InnerMainRect.Max - window->Pos + ImVec2(1,1)); + ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1, 1), window->InnerRect.Max - window->Pos + ImVec2(1, 1)); if (!window_rect_rel.Contains(window->NavRectRel[g.NavLayer])) { + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel\n"); float pad = window->CalcFontSize() * 0.5f; window_rect_rel.Expand(ImVec2(-ImMin(window_rect_rel.GetWidth(), pad), -ImMin(window_rect_rel.GetHeight(), pad))); // Terrible approximation for the intent of starting navigation from first fully visible item - window->NavRectRel[g.NavLayer].ClipWith(window_rect_rel); - g.NavId = 0; + window->NavRectRel[g.NavLayer].ClipWithFull(window_rect_rel); + g.NavId = g.NavFocusScopeId = 0; } - g.NavMoveFromClampedRefRect = false; } // For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items) - ImRect nav_rect_rel = (g.NavWindow && !g.NavWindow->NavRectRel[g.NavLayer].IsInverted()) ? g.NavWindow->NavRectRel[g.NavLayer] : ImRect(0,0,0,0); - g.NavScoringRectScreen = g.NavWindow ? ImRect(g.NavWindow->Pos + nav_rect_rel.Min, g.NavWindow->Pos + nav_rect_rel.Max) : GetViewportRect(); - g.NavScoringRectScreen.TranslateY(nav_scoring_rect_offset_y); - g.NavScoringRectScreen.Min.x = ImMin(g.NavScoringRectScreen.Min.x + 1.0f, g.NavScoringRectScreen.Max.x); - g.NavScoringRectScreen.Max.x = g.NavScoringRectScreen.Min.x; - IM_ASSERT(!g.NavScoringRectScreen.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allows us to remove extraneous ImFabs() calls in NavScoreItem(). + ImRect nav_rect_rel = g.NavWindow && !g.NavWindow->NavRectRel[g.NavLayer].IsInverted() ? g.NavWindow->NavRectRel[g.NavLayer] : ImRect(0, 0, 0, 0); + g.NavScoringRect = g.NavWindow ? ImRect(g.NavWindow->Pos + nav_rect_rel.Min, g.NavWindow->Pos + nav_rect_rel.Max) : ImRect(0, 0, 0, 0); + g.NavScoringRect.TranslateY(nav_scoring_rect_offset_y); + g.NavScoringRect.Min.x = ImMin(g.NavScoringRect.Min.x + 1.0f, g.NavScoringRect.Max.x); + g.NavScoringRect.Max.x = g.NavScoringRect.Min.x; + IM_ASSERT(!g.NavScoringRect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allows us to remove extraneous ImFabs() calls in NavScoreItem(). //GetForegroundDrawList()->AddRect(g.NavScoringRectScreen.Min, g.NavScoringRectScreen.Max, IM_COL32(255,200,0,255)); // [DEBUG] g.NavScoringCount = 0; #if IMGUI_DEBUG_NAV_RECTS @@ -8054,6 +9202,23 @@ static void ImGui::NavUpdate() #endif } +static void ImGui::NavUpdateInitResult() +{ + // In very rare cases g.NavWindow may be null (e.g. clearing focus after requesting an init request, which does happen when releasing Alt while clicking on void) + ImGuiContext& g = *GImGui; + if (!g.NavWindow) + return; + + // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name); + SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel); + if (g.NavInitRequestFromMove) + { + g.NavDisableHighlight = false; + g.NavDisableMouseHover = g.NavMousePosDirty = true; + } +} + // Apply result from previous frame navigation directional move request static void ImGui::NavUpdateMoveResult() { @@ -8084,19 +9249,24 @@ static void ImGui::NavUpdateMoveResult() IM_ASSERT(g.NavWindow && result->Window); // Scroll to keep newly navigated item fully into view. - if (g.NavLayer == 0) + if (g.NavLayer == ImGuiNavLayer_Main) { - ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos); - NavScrollToBringItemIntoView(result->Window, rect_abs); + ImVec2 delta_scroll; + if (g.NavMoveRequestFlags & ImGuiNavMoveFlags_ScrollToEdge) + { + float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; + delta_scroll.y = result->Window->Scroll.y - scroll_target; + SetScrollY(result->Window, scroll_target); + } + else + { + ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos); + delta_scroll = ScrollToBringRectIntoView(result->Window, rect_abs); + } - // Estimate upcoming scroll so we can offset our result position so mouse position can be applied immediately after in NavUpdate() - ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(result->Window, false); - ImVec2 delta_scroll = result->Window->Scroll - next_scroll; - result->RectRel.Translate(delta_scroll); - - // Also scroll parent window to keep us into view if necessary (we could/should technically recurse back the whole the parent hierarchy). - if (result->Window->Flags & ImGuiWindowFlags_ChildWindow) - NavScrollToBringItemIntoView(result->Window->ParentWindow, ImRect(rect_abs.Min + delta_scroll, rect_abs.Max + delta_scroll)); + // Offset our result position so mouse position can be applied immediately after in NavUpdate() + result->RectRel.TranslateX(-delta_scroll.x); + result->RectRel.TranslateY(-delta_scroll.y); } ClearActiveID(); @@ -8105,60 +9275,155 @@ static void ImGui::NavUpdateMoveResult() { // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) g.NavJustMovedToId = result->ID; - g.NavJustMovedToMultiSelectScopeId = result->SelectScopeId; + g.NavJustMovedToFocusScopeId = result->FocusScopeId; + g.NavJustMovedToKeyMods = g.NavMoveRequestKeyMods; } - SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel); - g.NavMoveFromClampedRefRect = false; + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); + SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); + g.NavDisableHighlight = false; + g.NavDisableMouseHover = g.NavMousePosDirty = true; } -static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags) +// Handle PageUp/PageDown/Home/End keys +static float ImGui::NavUpdatePageUpPageDown() { ImGuiContext& g = *GImGui; - if (g.NavMoveDir == ImGuiDir_None && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget && g.NavLayer == 0) + ImGuiIO& io = g.IO; + + if (g.NavMoveDir != ImGuiDir_None || g.NavWindow == NULL) + return 0.0f; + if ((g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL || g.NavLayer != ImGuiNavLayer_Main) + return 0.0f; + + ImGuiWindow* window = g.NavWindow; + const bool page_up_held = IsKeyDown(io.KeyMap[ImGuiKey_PageUp]) && !IsActiveIdUsingKey(ImGuiKey_PageUp); + const bool page_down_held = IsKeyDown(io.KeyMap[ImGuiKey_PageDown]) && !IsActiveIdUsingKey(ImGuiKey_PageDown); + const bool home_pressed = IsKeyPressed(io.KeyMap[ImGuiKey_Home]) && !IsActiveIdUsingKey(ImGuiKey_Home); + const bool end_pressed = IsKeyPressed(io.KeyMap[ImGuiKey_End]) && !IsActiveIdUsingKey(ImGuiKey_End); + if (page_up_held != page_down_held || home_pressed != end_pressed) // If either (not both) are pressed { - ImGuiWindow* window = g.NavWindow; - bool page_up_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageUp]) && (allowed_dir_flags & (1 << ImGuiDir_Up)); - bool page_down_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageDown]) && (allowed_dir_flags & (1 << ImGuiDir_Down)); - if (page_up_held != page_down_held) // If either (not both) are pressed + if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll) { - if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll) + // Fallback manual-scroll when window has no navigable item + if (IsKeyPressed(io.KeyMap[ImGuiKey_PageUp], true)) + SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); + else if (IsKeyPressed(io.KeyMap[ImGuiKey_PageDown], true)) + SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); + else if (home_pressed) + SetScrollY(window, 0.0f); + else if (end_pressed) + SetScrollY(window, window->ScrollMax.y); + } + else + { + ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer]; + const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight()); + float nav_scoring_rect_offset_y = 0.0f; + if (IsKeyPressed(io.KeyMap[ImGuiKey_PageUp], true)) { - // Fallback manual-scroll when window has no navigable item - if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true)) - SetWindowScrollY(window, window->Scroll.y - window->InnerMainRect.GetHeight()); - else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true)) - SetWindowScrollY(window, window->Scroll.y + window->InnerMainRect.GetHeight()); + nav_scoring_rect_offset_y = -page_offset_y; + g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Up; + g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; } - else + else if (IsKeyPressed(io.KeyMap[ImGuiKey_PageDown], true)) { - const ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer]; - const float page_offset_y = ImMax(0.0f, window->InnerMainRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight()); - float nav_scoring_rect_offset_y = 0.0f; - if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true)) - { - nav_scoring_rect_offset_y = -page_offset_y; - g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset, we intentionally request the opposite direction (so we can always land on the last item) - g.NavMoveClipDir = ImGuiDir_Up; - g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; - } - else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true)) - { - nav_scoring_rect_offset_y = +page_offset_y; - g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset, we intentionally request the opposite direction (so we can always land on the last item) - g.NavMoveClipDir = ImGuiDir_Down; - g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; - } - return nav_scoring_rect_offset_y; + nav_scoring_rect_offset_y = +page_offset_y; + g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Down; + g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; } + else if (home_pressed) + { + // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y + // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdge flag, we don't scroll immediately to avoid scrolling happening before nav result. + // Preserve current horizontal position if we have any. + nav_rect_rel.Min.y = nav_rect_rel.Max.y = -window->Scroll.y; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Down; + g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge; + } + else if (end_pressed) + { + nav_rect_rel.Min.y = nav_rect_rel.Max.y = window->ScrollMax.y + window->SizeFull.y - window->Scroll.y; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Up; + g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge; + } + return nav_scoring_rect_offset_y; } } return 0.0f; } +static void ImGui::NavEndFrame() +{ + ImGuiContext& g = *GImGui; + + // Show CTRL+TAB list window + if (g.NavWindowingTarget != NULL) + NavUpdateWindowingOverlay(); + + // Perform wrap-around in menus + ImGuiWindow* window = g.NavWrapRequestWindow; + ImGuiNavMoveFlags move_flags = g.NavWrapRequestFlags; + if (window != NULL && g.NavWindow == window && NavMoveRequestButNoResultYet() && g.NavMoveRequestForward == ImGuiNavForward_None && g.NavLayer == ImGuiNavLayer_Main) + { + IM_ASSERT(move_flags != 0); // No points calling this with no wrapping + ImRect bb_rel = window->NavRectRel[0]; + + ImGuiDir clip_dir = g.NavMoveDir; + if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = + ImMax(window->SizeFull.x, window->ContentSize.x + window->WindowPadding.x * 2.0f) - window->Scroll.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(-bb_rel.GetHeight()); + clip_dir = ImGuiDir_Up; + } + NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); + } + if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = -window->Scroll.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(+bb_rel.GetHeight()); + clip_dir = ImGuiDir_Down; + } + NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); + } + if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = + ImMax(window->SizeFull.y, window->ContentSize.y + window->WindowPadding.y * 2.0f) - window->Scroll.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(-bb_rel.GetWidth()); + clip_dir = ImGuiDir_Left; + } + NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); + } + if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = -window->Scroll.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(+bb_rel.GetWidth()); + clip_dir = ImGuiDir_Right; + } + NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags); + } + } +} + static int ImGui::FindWindowFocusIndex(ImGuiWindow* window) // FIXME-OPT O(N) { ImGuiContext& g = *GImGui; - for (int i = g.WindowsFocusOrder.Size-1; i >= 0; i--) + for (int i = g.WindowsFocusOrder.Size - 1; i >= 0; i--) if (g.WindowsFocusOrder[i] == window) return i; return -1; @@ -8198,12 +9463,10 @@ static void ImGui::NavUpdateWindowing() ImGuiWindow* apply_focus_window = NULL; bool apply_toggle_layer = false; - ImGuiWindow* modal_window = GetFrontMostPopupModal(); - if (modal_window != NULL) - { + ImGuiWindow* modal_window = GetTopMostPopupModal(); + bool allow_windowing = (modal_window == NULL); + if (!allow_windowing) g.NavWindowingTarget = NULL; - return; - } // Fade out if (g.NavWindowingTargetAnim && g.NavWindowingTarget == NULL) @@ -8214,33 +9477,33 @@ static void ImGui::NavUpdateWindowing() } // Start CTRL-TAB or Square+L/R window selection - bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed); - bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard); + bool start_windowing_with_gamepad = allow_windowing && !g.NavWindowingTarget && IsNavInputTest(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed); + bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard); if (start_windowing_with_gamepad || start_windowing_with_keyboard) if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) { - g.NavWindowingTarget = g.NavWindowingTargetAnim = window; + g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; // FIXME-DOCK: Will need to use RootWindowDockStop g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f; g.NavWindowingToggleLayer = start_windowing_with_keyboard ? false : true; - g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_NavKeyboard : ImGuiInputSource_NavGamepad; + g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; } // Gamepad update g.NavWindowingTimer += g.IO.DeltaTime; - if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_NavGamepad) + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Gamepad) { // Highlight only appears after a brief time holding the button, so that a fast tap on PadMenu (to toggle NavLayer) doesn't add visual noise g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // Select window to focus - const int focus_change_dir = (int)IsNavInputPressed(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputPressed(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow); + const int focus_change_dir = (int)IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow); if (focus_change_dir != 0) { NavUpdateWindowingHighlightWindow(focus_change_dir); g.NavWindowingHighlightAlpha = 1.0f; } - // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered front-most) + // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most) if (!IsNavInputDown(ImGuiNavInput_Menu)) { g.NavWindowingToggleLayer &= (g.NavWindowingHighlightAlpha < 1.0f); // Once button was held long enough we don't consider it a tap-to-toggle-layer press anymore. @@ -8253,7 +9516,7 @@ static void ImGui::NavUpdateWindowing() } // Keyboard: Focus - if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_NavKeyboard) + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Keyboard) { // Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f @@ -8264,10 +9527,10 @@ static void ImGui::NavUpdateWindowing() } // Keyboard: Press and Release ALT to toggle menu layer - // FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of back-end clearing releases all keys on ALT-TAB - if (IsNavInputPressed(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed)) + // FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of backend clearing releases all keys on ALT-TAB + if (IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed)) g.NavWindowingToggleLayer = true; - if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputPressed(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released)) + if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released)) if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev)) apply_toggle_layer = true; @@ -8275,17 +9538,18 @@ static void ImGui::NavUpdateWindowing() if (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoMove)) { ImVec2 move_delta; - if (g.NavInputSource == ImGuiInputSource_NavKeyboard && !g.IO.KeyShift) + if (g.NavInputSource == ImGuiInputSource_Keyboard && !g.IO.KeyShift) move_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard, ImGuiInputReadMode_Down); - if (g.NavInputSource == ImGuiInputSource_NavGamepad) + if (g.NavInputSource == ImGuiInputSource_Gamepad) move_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down); if (move_delta.x != 0.0f || move_delta.y != 0.0f) { const float NAV_MOVE_SPEED = 800.0f; - const float move_speed = ImFloor(NAV_MOVE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); // FIXME: Doesn't code variable framerate very well - g.NavWindowingTarget->RootWindow->Pos += move_delta * move_speed; + const float move_speed = ImFloor(NAV_MOVE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); // FIXME: Doesn't handle variable framerate very well + ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; + SetWindowPos(moving_window, moving_window->Pos + move_delta * move_speed, ImGuiCond_Always); + MarkIniSettingsDirty(moving_window); g.NavDisableMouseHover = true; - MarkIniSettingsDirty(g.NavWindowingTarget); } } @@ -8327,8 +9591,10 @@ static void ImGui::NavUpdateWindowing() g.NavDisableHighlight = false; g.NavDisableMouseHover = true; - // When entering a regular menu bar with the Alt key, we always reinitialize the navigation ID. + // Reinitialize navigation when entering menu bar with the Alt key. const ImGuiNavLayer new_nav_layer = (g.NavWindow->DC.NavLayerActiveMask & (1 << ImGuiNavLayer_Menu)) ? (ImGuiNavLayer)((int)g.NavLayer ^ 1) : ImGuiNavLayer_Main; + if (new_nav_layer == ImGuiNavLayer_Menu) + g.NavWindow->NavLastIds[new_nav_layer] = 0; NavRestoreLayer(new_nav_layer); } } @@ -8344,7 +9610,7 @@ static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window) } // Overlay displayed when using CTRL+TAB. Called by EndFrame(). -void ImGui::NavUpdateWindowingList() +void ImGui::NavUpdateWindowingOverlay() { ImGuiContext& g = *GImGui; IM_ASSERT(g.NavWindowingTarget != NULL); @@ -8352,10 +9618,11 @@ void ImGui::NavUpdateWindowingList() if (g.NavWindowingTimer < NAV_WINDOWING_LIST_APPEAR_DELAY) return; - if (g.NavWindowingList == NULL) - g.NavWindowingList = FindWindowByName("###NavWindowingList"); - SetNextWindowSizeConstraints(ImVec2(g.IO.DisplaySize.x * 0.20f, g.IO.DisplaySize.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX)); - SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + if (g.NavWindowingListWindow == NULL) + g.NavWindowingListWindow = FindWindowByName("###NavWindowingList"); + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowSizeConstraints(ImVec2(viewport->Size.x * 0.20f, viewport->Size.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX)); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f); Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings); for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--) @@ -8372,357 +9639,6 @@ void ImGui::NavUpdateWindowingList() PopStyleVar(); } -//----------------------------------------------------------------------------- -// [SECTION] COLUMNS -// In the current version, Columns are very weak. Needs to be replaced with a more full-featured system. -//----------------------------------------------------------------------------- - -void ImGui::NextColumn() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems || window->DC.CurrentColumns == NULL) - return; - - ImGuiContext& g = *GImGui; - ImGuiColumns* columns = window->DC.CurrentColumns; - - if (columns->Count == 1) - { - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - IM_ASSERT(columns->Current == 0); - return; - } - - PopItemWidth(); - PopClipRect(); - - columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); - if (++columns->Current < columns->Count) - { - // New column (columns 1+ cancels out IndentX) - window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + g.Style.ItemSpacing.x; - window->DrawList->ChannelsSetCurrent(columns->Current); - } - else - { - // New row/line - window->DC.ColumnsOffset.x = 0.0f; - window->DrawList->ChannelsSetCurrent(0); - columns->Current = 0; - columns->LineMinY = columns->LineMaxY; - } - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - window->DC.CursorPos.y = columns->LineMinY; - window->DC.CurrentLineSize = ImVec2(0.0f, 0.0f); - window->DC.CurrentLineTextBaseOffset = 0.0f; - - PushColumnClipRect(); - PushItemWidth(GetColumnWidth() * 0.65f); // FIXME-COLUMNS: Move on columns setup -} - -int ImGui::GetColumnIndex() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0; -} - -int ImGui::GetColumnsCount() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1; -} - -static float OffsetNormToPixels(const ImGuiColumns* columns, float offset_norm) -{ - return offset_norm * (columns->MaxX - columns->MinX); -} - -static float PixelsToOffsetNorm(const ImGuiColumns* columns, float offset) -{ - return offset / (columns->MaxX - columns->MinX); -} - -static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; - -static float GetDraggedColumnOffset(ImGuiColumns* columns, int column_index) -{ - // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing - // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. - IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); - - float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; - x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); - if ((columns->Flags & ImGuiColumnsFlags_NoPreserveWidths)) - x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); - - return x; -} - -float ImGui::GetColumnOffset(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - const float t = columns->Columns[column_index].OffsetNorm; - const float x_offset = ImLerp(columns->MinX, columns->MaxX, t); - return x_offset; -} - -static float GetColumnWidthEx(ImGuiColumns* columns, int column_index, bool before_resize = false) -{ - if (column_index < 0) - column_index = columns->Current; - - float offset_norm; - if (before_resize) - offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; - else - offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; - return OffsetNormToPixels(columns, offset_norm); -} - -float ImGui::GetColumnWidth(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - return OffsetNormToPixels(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); -} - -void ImGui::SetColumnOffset(int column_index, float offset) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - const bool preserve_width = !(columns->Flags & ImGuiColumnsFlags_NoPreserveWidths) && (column_index < columns->Count-1); - const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; - - if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow)) - offset = ImMin(offset, columns->MaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); - columns->Columns[column_index].OffsetNorm = PixelsToOffsetNorm(columns, offset - columns->MinX); - - if (preserve_width) - SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); -} - -void ImGui::SetColumnWidth(int column_index, float width) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); -} - -void ImGui::PushColumnClipRect(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiColumns* columns = window->DC.CurrentColumns; - if (column_index < 0) - column_index = columns->Current; - - ImGuiColumnData* column = &columns->Columns[column_index]; - PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false); -} - -ImGuiColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id) -{ - // We have few columns per window so for now we don't need bother much with turning this into a faster lookup. - for (int n = 0; n < window->ColumnsStorage.Size; n++) - if (window->ColumnsStorage[n].ID == id) - return &window->ColumnsStorage[n]; - - window->ColumnsStorage.push_back(ImGuiColumns()); - ImGuiColumns* columns = &window->ColumnsStorage.back(); - columns->ID = id; - return columns; -} - -ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count) -{ - ImGuiWindow* window = GetCurrentWindow(); - - // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. - // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. - PushID(0x11223347 + (str_id ? 0 : columns_count)); - ImGuiID id = window->GetID(str_id ? str_id : "columns"); - PopID(); - - return id; -} - -void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - IM_ASSERT(columns_count >= 1); - IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported - - ImGuiID id = GetColumnsID(str_id, columns_count); - - // Acquire storage for the columns set - ImGuiColumns* columns = FindOrCreateColumns(window, id); - IM_ASSERT(columns->ID == id); - columns->Current = 0; - columns->Count = columns_count; - columns->Flags = flags; - window->DC.CurrentColumns = columns; - - // Set state for first column - const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->InnerClipRect.Max.x - window->Pos.x); - columns->MinX = window->DC.Indent.x - g.Style.ItemSpacing.x; // Lock our horizontal range - columns->MaxX = ImMax(content_region_width - window->Scroll.x, columns->MinX + 1.0f); - columns->BackupCursorPosY = window->DC.CursorPos.y; - columns->BackupCursorMaxPosX = window->DC.CursorMaxPos.x; - columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y; - window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - - // Clear data if columns count changed - if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1) - columns->Columns.resize(0); - - // Initialize defaults - columns->IsFirstFrame = (columns->Columns.Size == 0); - if (columns->Columns.Size == 0) - { - columns->Columns.reserve(columns_count + 1); - for (int n = 0; n < columns_count + 1; n++) - { - ImGuiColumnData column; - column.OffsetNorm = n / (float)columns_count; - columns->Columns.push_back(column); - } - } - - for (int n = 0; n < columns_count; n++) - { - // Compute clipping rectangle - ImGuiColumnData* column = &columns->Columns[n]; - float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n)); - float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f); - column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); - column->ClipRect.ClipWith(window->ClipRect); - } - - if (columns->Count > 1) - { - window->DrawList->ChannelsSplit(columns->Count); - PushColumnClipRect(); - } - PushItemWidth(GetColumnWidth() * 0.65f); -} - -void ImGui::EndColumns() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - ImGuiColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - PopItemWidth(); - if (columns->Count > 1) - { - PopClipRect(); - window->DrawList->ChannelsMerge(); - } - - columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); - window->DC.CursorPos.y = columns->LineMaxY; - if (!(columns->Flags & ImGuiColumnsFlags_GrowParentContentsSize)) - window->DC.CursorMaxPos.x = columns->BackupCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent - - // Draw columns borders and handle resize - bool is_being_resized = false; - if (!(columns->Flags & ImGuiColumnsFlags_NoBorder) && !window->SkipItems) - { - // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. - const float y1 = ImMax(columns->BackupCursorPosY, window->ClipRect.Min.y); - const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y); - int dragging_column = -1; - for (int n = 1; n < columns->Count; n++) - { - ImGuiColumnData* column = &columns->Columns[n]; - float x = window->Pos.x + GetColumnOffset(n); - const ImGuiID column_id = columns->ID + ImGuiID(n); - const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; - const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); - KeepAliveID(column_id); - if (IsClippedEx(column_hit_rect, column_id, false)) - continue; - - bool hovered = false, held = false; - if (!(columns->Flags & ImGuiColumnsFlags_NoResize)) - { - ButtonBehavior(column_hit_rect, column_id, &hovered, &held); - if (hovered || held) - g.MouseCursor = ImGuiMouseCursor_ResizeEW; - if (held && !(column->Flags & ImGuiColumnsFlags_NoResize)) - dragging_column = n; - } - - // Draw column - const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - const float xi = (float)(int)x; - window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); - } - - // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. - if (dragging_column != -1) - { - if (!columns->IsBeingResized) - for (int n = 0; n < columns->Count + 1; n++) - columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; - columns->IsBeingResized = is_being_resized = true; - float x = GetDraggedColumnOffset(columns, dragging_column); - SetColumnOffset(dragging_column, x); - } - } - columns->IsBeingResized = is_being_resized; - - window->DC.CurrentColumns = NULL; - window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); -} - -// [2018-03: This is currently the only public API, while we are working on making BeginColumns/EndColumns user-facing] -void ImGui::Columns(int columns_count, const char* id, bool border) -{ - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(columns_count >= 1); - - ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder); - //flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior - ImGuiColumns* columns = window->DC.CurrentColumns; - if (columns != NULL && columns->Count == columns_count && columns->Flags == flags) - return; - - if (columns != NULL) - EndColumns(); - - if (columns_count != 1) - BeginColumns(id, columns_count, flags); -} //----------------------------------------------------------------------------- // [SECTION] DRAG AND DROP @@ -8742,27 +9658,45 @@ void ImGui::ClearDragDrop() memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); } -// Call when current ID is active. // When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() +// If the item has an identifier: +// - This assume/require the item to be activated (typically via ButtonBehavior). +// - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button. +// - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag. +// If the item has no identifier: +// - Currently always assume left mouse button. bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + // FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button, + // in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic). + ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; + bool source_drag_active = false; ImGuiID source_id = 0; ImGuiID source_parent_id = 0; - int mouse_button = 0; if (!(flags & ImGuiDragDropFlags_SourceExtern)) { source_id = window->DC.LastItemId; - if (source_id != 0 && g.ActiveId != source_id) // Early out for most common case - return false; - if (g.IO.MouseDown[mouse_button] == false) - return false; - - if (source_id == 0) + if (source_id != 0) { + // Common path: items with ID + if (g.ActiveId != source_id) + return false; + if (g.ActiveIdMouseButton != -1) + mouse_button = g.ActiveIdMouseButton; + if (g.IO.MouseDown[mouse_button] == false) + return false; + g.ActiveIdAllowOverlap = false; + } + else + { + // Uncommon path: items without ID + if (g.IO.MouseDown[mouse_button] == false) + return false; + // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride. if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) @@ -8789,14 +9723,15 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. g.ActiveIdAllowOverlap = is_hovered; } - else - { - g.ActiveIdAllowOverlap = false; - } if (g.ActiveId != source_id) return false; source_parent_id = window->IDStack.back(); source_drag_active = IsMouseDragging(mouse_button); + + // Disable navigation and key inputs while dragging + g.ActiveIdUsingNavDirMask = ~(ImU32)0; + g.ActiveIdUsingNavInputMask = ~(ImU32)0; + g.ActiveIdUsingKeyInputMask = ~(ImU64)0; } else { @@ -8817,9 +9752,11 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) g.DragDropActive = true; g.DragDropSourceFlags = flags; g.DragDropMouseButton = mouse_button; + if (payload.SourceId == g.ActiveId) + g.ActiveIdNoClearOnFocusLoss = true; } g.DragDropSourceFrameCount = g.FrameCount; - g.DragDropWithinSourceOrTarget = true; + g.DragDropWithinSource = true; if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) { @@ -8846,7 +9783,7 @@ void ImGui::EndDragDropSource() { ImGuiContext& g = *GImGui; IM_ASSERT(g.DragDropActive); - IM_ASSERT(g.DragDropWithinSourceOrTarget && "Not after a BeginDragDropSource()?"); + IM_ASSERT(g.DragDropWithinSource && "Not after a BeginDragDropSource()?"); if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) EndTooltip(); @@ -8854,7 +9791,7 @@ void ImGui::EndDragDropSource() // Discard the drag if have not called SetDragDropPayload() if (g.DragDropPayload.DataFrameCount == -1) ClearDragDrop(); - g.DragDropWithinSourceOrTarget = false; + g.DragDropWithinSource = false; } // Use 'cond' to choose to submit payload on drag start or every frame @@ -8908,7 +9845,8 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) return false; ImGuiWindow* window = g.CurrentWindow; - if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow) + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow) return false; IM_ASSERT(id != 0); if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId)) @@ -8916,10 +9854,10 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) if (window->SkipItems) return false; - IM_ASSERT(g.DragDropWithinSourceOrTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false); g.DragDropTargetRect = bb; g.DragDropTargetId = id; - g.DragDropWithinSourceOrTarget = true; + g.DragDropWithinTarget = true; return true; } @@ -8936,7 +9874,8 @@ bool ImGui::BeginDragDropTarget() ImGuiWindow* window = g.CurrentWindow; if (!(window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HoveredRect)) return false; - if (g.HoveredWindow == NULL || window->RootWindow != g.HoveredWindow->RootWindow) + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow) return false; const ImRect& display_rect = (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect) ? window->DC.LastItemDisplayRect : window->DC.LastItemRect; @@ -8946,10 +9885,10 @@ bool ImGui::BeginDragDropTarget() if (g.DragDropPayload.SourceId == id) return false; - IM_ASSERT(g.DragDropWithinSourceOrTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false); g.DragDropTargetRect = display_rect; g.DragDropTargetId = id; - g.DragDropWithinSourceOrTarget = true; + g.DragDropWithinTarget = true; return true; } @@ -8974,7 +9913,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId); ImRect r = g.DragDropTargetRect; float r_surface = r.GetWidth() * r.GetHeight(); - if (r_surface < g.DragDropAcceptIdCurrRectSurface) + if (r_surface <= g.DragDropAcceptIdCurrRectSurface) { g.DragDropAcceptFlags = flags; g.DragDropAcceptIdCurr = g.DragDropTargetId; @@ -8986,11 +9925,11 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) { - // FIXME-DRAG: Settle on a proper default visuals for drop target. + // FIXME-DRAGDROP: Settle on a proper default visuals for drop target. r.Expand(3.5f); bool push_clip_rect = !window->ClipRect.Contains(r); - if (push_clip_rect) window->DrawList->PushClipRect(r.Min-ImVec2(1,1), r.Max+ImVec2(1,1)); - window->DrawList->AddRect(r.Min, r.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, ~0, 2.0f); + if (push_clip_rect) window->DrawList->PushClipRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1)); + window->DrawList->AddRect(r.Min, r.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); if (push_clip_rect) window->DrawList->PopClipRect(); } @@ -9013,11 +9952,10 @@ void ImGui::EndDragDropTarget() { ImGuiContext& g = *GImGui; IM_ASSERT(g.DragDropActive); - IM_ASSERT(g.DragDropWithinSourceOrTarget); - g.DragDropWithinSourceOrTarget = false; + IM_ASSERT(g.DragDropWithinTarget); + g.DragDropWithinTarget = false; } - //----------------------------------------------------------------------------- // [SECTION] LOGGING/CAPTURING //----------------------------------------------------------------------------- @@ -9026,6 +9964,20 @@ void ImGui::EndDragDropTarget() //----------------------------------------------------------------------------- // Pass text data straight to log (without being displayed) +static inline void LogTextV(ImGuiContext& g, const char* fmt, va_list args) +{ + if (g.LogFile) + { + g.LogBuffer.Buf.resize(0); + g.LogBuffer.appendfv(fmt, args); + ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (ImU64)g.LogBuffer.size(), g.LogFile); + } + else + { + g.LogBuffer.appendfv(fmt, args); + } +} + void ImGui::LogText(const char* fmt, ...) { ImGuiContext& g = *GImGui; @@ -9034,63 +9986,78 @@ void ImGui::LogText(const char* fmt, ...) va_list args; va_start(args, fmt); - if (g.LogFile) - vfprintf(g.LogFile, fmt, args); - else - g.LogBuffer.appendfv(fmt, args); + LogTextV(g, fmt, args); va_end(args); } +void ImGui::LogTextV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + LogTextV(g, fmt, args); +} + // Internal version that takes a position to decide on newline placement and pad items according to their depth. // We split text into individual lines to add current tree level padding +// FIXME: This code is a little complicated perhaps, considering simplifying the whole system. void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + const char* prefix = g.LogNextPrefix; + const char* suffix = g.LogNextSuffix; + g.LogNextPrefix = g.LogNextSuffix = NULL; + if (!text_end) text_end = FindRenderedTextEnd(text, text_end); - const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + 1); + const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + g.Style.FramePadding.y + 1); if (ref_pos) g.LogLinePosY = ref_pos->y; if (log_new_line) + { + LogText(IM_NEWLINE); g.LogLineFirstItem = true; + } - const char* text_remaining = text; - if (g.LogDepthRef > window->DC.TreeDepth) // Re-adjust padding if we have popped out of our starting depth + if (prefix) + LogRenderedText(ref_pos, prefix, prefix + strlen(prefix)); // Calculate end ourself to ensure "##" are included here. + + // Re-adjust padding if we have popped out of our starting depth + if (g.LogDepthRef > window->DC.TreeDepth) g.LogDepthRef = window->DC.TreeDepth; const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef); + + const char* text_remaining = text; for (;;) { - // Split the string. Each new line (after a '\n') is followed by spacing corresponding to the current depth of our log entry. - // We don't add a trailing \n to allow a subsequent item on the same line to be captured. + // Split the string. Each new line (after a '\n') is followed by indentation corresponding to the current depth of our log entry. + // We don't add a trailing \n yet to allow a subsequent item on the same line to be captured. const char* line_start = text_remaining; const char* line_end = ImStreolRange(line_start, text_end); - const bool is_first_line = (line_start == text); const bool is_last_line = (line_end == text_end); - if (!is_last_line || (line_start != line_end)) + if (line_start != line_end || !is_last_line) { - const int char_count = (int)(line_end - line_start); - if (log_new_line || !is_first_line) - LogText(IM_NEWLINE "%*s%.*s", tree_depth * 4, "", char_count, line_start); - else if (g.LogLineFirstItem) - LogText("%*s%.*s", tree_depth * 4, "", char_count, line_start); - else - LogText(" %.*s", char_count, line_start); + const int line_length = (int)(line_end - line_start); + const int indentation = g.LogLineFirstItem ? tree_depth * 4 : 1; + LogText("%*s%.*s", indentation, "", line_length, line_start); g.LogLineFirstItem = false; + if (*line_end == '\n') + { + LogText(IM_NEWLINE); + g.LogLineFirstItem = true; + } } - else if (log_new_line) - { - // An empty "" string at a different Y position should output a carriage return. - LogText(IM_NEWLINE); - break; - } - if (is_last_line) break; text_remaining = line_end + 1; } + + if (suffix) + LogRenderedText(ref_pos, suffix, suffix + strlen(suffix)); } // Start logging/capturing text output @@ -9103,19 +10070,31 @@ void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth) IM_ASSERT(g.LogBuffer.empty()); g.LogEnabled = true; g.LogType = type; + g.LogNextPrefix = g.LogNextSuffix = NULL; g.LogDepthRef = window->DC.TreeDepth; g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault); g.LogLinePosY = FLT_MAX; g.LogLineFirstItem = true; } +// Important: doesn't copy underlying data, use carefully (prefix/suffix must be in scope at the time of the next LogRenderedText) +void ImGui::LogSetNextTextDecoration(const char* prefix, const char* suffix) +{ + ImGuiContext& g = *GImGui; + g.LogNextPrefix = prefix; + g.LogNextSuffix = suffix; +} + void ImGui::LogToTTY(int auto_open_depth) { ImGuiContext& g = *GImGui; if (g.LogEnabled) return; + IM_UNUSED(auto_open_depth); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS LogBegin(ImGuiLogType_TTY, auto_open_depth); g.LogFile = stdout; +#endif } // Start logging/capturing text output to given file @@ -9132,8 +10111,8 @@ void ImGui::LogToFile(int auto_open_depth, const char* filename) filename = g.IO.LogFilename; if (!filename || !filename[0]) return; - FILE* f = ImFileOpen(filename, "ab"); - if (f == NULL) + ImFileHandle f = ImFileOpen(filename, "ab"); + if (!f) { IM_ASSERT(0); return; @@ -9170,10 +10149,12 @@ void ImGui::LogFinish() switch (g.LogType) { case ImGuiLogType_TTY: +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS fflush(g.LogFile); +#endif break; case ImGuiLogType_File: - fclose(g.LogFile); + ImFileClose(g.LogFile); break; case ImGuiLogType_Buffer: break; @@ -9199,7 +10180,11 @@ void ImGui::LogButtons() ImGuiContext& g = *GImGui; PushID("LogButtons"); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS const bool log_to_tty = Button("Log To TTY"); SameLine(); +#else + const bool log_to_tty = false; +#endif const bool log_to_file = Button("Log To File"); SameLine(); const bool log_to_clipboard = Button("Log To Clipboard"); SameLine(); PushAllowKeyboardFocus(false); @@ -9217,9 +10202,51 @@ void ImGui::LogButtons() LogToClipboard(); } + //----------------------------------------------------------------------------- // [SECTION] SETTINGS //----------------------------------------------------------------------------- +// - UpdateSettings() [Internal] +// - MarkIniSettingsDirty() [Internal] +// - CreateNewWindowSettings() [Internal] +// - FindWindowSettings() [Internal] +// - FindOrCreateWindowSettings() [Internal] +// - FindSettingsHandler() [Internal] +// - ClearIniSettings() [Internal] +// - LoadIniSettingsFromDisk() +// - LoadIniSettingsFromMemory() +// - SaveIniSettingsToDisk() +// - SaveIniSettingsToMemory() +// - WindowSettingsHandler_***() [Internal] +//----------------------------------------------------------------------------- + +// Called by NewFrame() +void ImGui::UpdateSettings() +{ + // Load settings on first frame (if not explicitly loaded manually before) + ImGuiContext& g = *GImGui; + if (!g.SettingsLoaded) + { + IM_ASSERT(g.SettingsWindows.empty()); + if (g.IO.IniFilename) + LoadIniSettingsFromDisk(g.IO.IniFilename); + g.SettingsLoaded = true; + } + + // Save settings (with a delay after the last modification, so we don't spam disk too much) + if (g.SettingsDirtyTimer > 0.0f) + { + g.SettingsDirtyTimer -= g.IO.DeltaTime; + if (g.SettingsDirtyTimer <= 0.0f) + { + if (g.IO.IniFilename != NULL) + SaveIniSettingsToDisk(g.IO.IniFilename); + else + g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves. + g.SettingsDirtyTimer = 0.0f; + } + } +} void ImGui::MarkIniSettingsDirty() { @@ -9239,19 +10266,31 @@ void ImGui::MarkIniSettingsDirty(ImGuiWindow* window) ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) { ImGuiContext& g = *GImGui; - g.SettingsWindows.push_back(ImGuiWindowSettings()); - ImGuiWindowSettings* settings = &g.SettingsWindows.back(); - settings->Name = ImStrdup(name); - settings->ID = ImHashStr(name); + +#if !IMGUI_DEBUG_INI_SETTINGS + // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() + // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. + if (const char* p = strstr(name, "###")) + name = p; +#endif + const size_t name_len = strlen(name); + + // Allocate chunk + const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1; + ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size); + IM_PLACEMENT_NEW(settings) ImGuiWindowSettings(); + settings->ID = ImHashStr(name, name_len); + memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator + return settings; } ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id) { ImGuiContext& g = *GImGui; - for (int i = 0; i != g.SettingsWindows.Size; i++) - if (g.SettingsWindows[i].ID == id) - return &g.SettingsWindows[i]; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->ID == id) + return settings; return NULL; } @@ -9262,16 +10301,6 @@ ImGuiWindowSettings* ImGui::FindOrCreateWindowSettings(const char* name) return CreateNewWindowSettings(name); } -void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) -{ - size_t file_data_size = 0; - char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", &file_data_size); - if (!file_data) - return; - LoadIniSettingsFromMemory(file_data, (size_t)file_data_size); - IM_FREE(file_data); -} - ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) { ImGuiContext& g = *GImGui; @@ -9282,21 +10311,48 @@ ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) return NULL; } +void ImGui::ClearIniSettings() +{ + ImGuiContext& g = *GImGui; + g.SettingsIniData.clear(); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ClearAllFn) + g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); +} + +void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) +{ + size_t file_data_size = 0; + char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", &file_data_size); + if (!file_data) + return; + LoadIniSettingsFromMemory(file_data, (size_t)file_data_size); + IM_FREE(file_data); +} + // Zero-tolerance, no error reporting, cheap .ini parsing void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) { ImGuiContext& g = *GImGui; IM_ASSERT(g.Initialized); - IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0); + //IM_ASSERT(!g.WithinFrameScope && "Cannot be called between NewFrame() and EndFrame()"); + //IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0); // For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter). // For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy.. if (ini_size == 0) ini_size = strlen(ini_data); - char* buf = (char*)IM_ALLOC(ini_size + 1); - char* buf_end = buf + ini_size; + g.SettingsIniData.Buf.resize((int)ini_size + 1); + char* const buf = g.SettingsIniData.Buf.Data; + char* const buf_end = buf + ini_size; memcpy(buf, ini_data, ini_size); - buf[ini_size] = 0; + buf_end[0] = 0; + + // Call pre-read handlers + // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ReadInitFn) + g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); void* entry_data = NULL; ImGuiSettingsHandler* entry_handler = NULL; @@ -9319,18 +10375,12 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) line_end[-1] = 0; const char* name_end = line_end - 1; const char* type_start = line + 1; - char* type_end = (char*)(intptr_t)ImStrchrRange(type_start, name_end, ']'); + char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']'); const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL; if (!type_end || !name_start) - { - name_start = type_start; // Import legacy entries that have no type - type_start = "Window"; - } - else - { - *type_end = 0; // Overwrite first ']' - name_start++; // Skip second '[' - } + continue; + *type_end = 0; // Overwrite first ']' + name_start++; // Skip second '[' entry_handler = FindSettingsHandler(type_start); entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL; } @@ -9340,8 +10390,15 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) entry_handler->ReadLineFn(&g, entry_handler, entry_data, line); } } - IM_FREE(buf); g.SettingsLoaded = true; + + // [DEBUG] Restore untouched copy so it can be browsed in Metrics (not strictly necessary) + memcpy(buf, ini_data, ini_size); + + // Call post-read handlers + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ApplyAllFn) + g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); } void ImGui::SaveIniSettingsToDisk(const char* ini_filename) @@ -9353,11 +10410,11 @@ void ImGui::SaveIniSettingsToDisk(const char* ini_filename) size_t ini_data_size = 0; const char* ini_data = SaveIniSettingsToMemory(&ini_data_size); - FILE* f = ImFileOpen(ini_filename, "wt"); + ImFileHandle f = ImFileOpen(ini_filename, "wt"); if (!f) return; - fwrite(ini_data, sizeof(char), ini_data_size, f); - fclose(f); + ImFileWrite(ini_data, sizeof(char), ini_data_size, f); + ImFileClose(f); } // Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer @@ -9377,26 +10434,48 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) return g.SettingsIniData.c_str(); } -static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) { - ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHashStr(name)); - if (!settings) - settings = ImGui::CreateNewWindowSettings(name); + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Windows.Size; i++) + g.Windows[i]->SettingsOffset = -1; + g.SettingsWindows.clear(); +} + +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiWindowSettings* settings = ImGui::FindOrCreateWindowSettings(name); + ImGuiID id = settings->ID; + *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry + settings->ID = id; + settings->WantApply = true; return (void*)settings; } -static void SettingsHandlerWindow_ReadLine(ImGuiContext* ctx, ImGuiSettingsHandler*, void* entry, const char* line) +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) { - ImGuiContext& g = *ctx; ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry; - float x, y; + int x, y; int i; - if (sscanf(line, "Pos=%f,%f", &x, &y) == 2) settings->Pos = ImVec2(x, y); - else if (sscanf(line, "Size=%f,%f", &x, &y) == 2) settings->Size = ImMax(ImVec2(x, y), g.Style.WindowMinSize); - else if (sscanf(line, "Collapsed=%d", &i) == 1) settings->Collapsed = (i != 0); + if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } } -static void SettingsHandlerWindow_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +// Apply to existing windows (if any) +static void WindowSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->WantApply) + { + if (ImGuiWindow* window = ImGui::FindWindowByID(settings->ID)) + ApplyWindowSettings(window, settings); + settings->WantApply = false; + } +} + +static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) { // Gather data from windows that were active during this session // (if a window wasn't opened in this session we preserve its settings) @@ -9407,33 +10486,28 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl if (window->Flags & ImGuiWindowFlags_NoSavedSettings) continue; - ImGuiWindowSettings* settings = (window->SettingsIdx != -1) ? &g.SettingsWindows[window->SettingsIdx] : ImGui::FindWindowSettings(window->ID); + ImGuiWindowSettings* settings = (window->SettingsOffset != -1) ? g.SettingsWindows.ptr_from_offset(window->SettingsOffset) : ImGui::FindWindowSettings(window->ID); if (!settings) { settings = ImGui::CreateNewWindowSettings(window->Name); - window->SettingsIdx = g.SettingsWindows.index_from_ptr(settings); + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); } IM_ASSERT(settings->ID == window->ID); - settings->Pos = window->Pos; - settings->Size = window->SizeFull; + settings->Pos = ImVec2ih((short)window->Pos.x, (short)window->Pos.y); + settings->Size = ImVec2ih((short)window->SizeFull.x, (short)window->SizeFull.y); settings->Collapsed = window->Collapsed; } // Write to text buffer - buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve - for (int i = 0; i != g.SettingsWindows.Size; i++) + buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) { - const ImGuiWindowSettings* settings = &g.SettingsWindows[i]; - if (settings->Pos.x == FLT_MAX) - continue; - const char* name = settings->Name; - if (const char* p = strstr(name, "###")) // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() - name = p; - buf->appendf("[%s][%s]\n", handler->TypeName, name); - buf->appendf("Pos=%d,%d\n", (int)settings->Pos.x, (int)settings->Pos.y); - buf->appendf("Size=%d,%d\n", (int)settings->Size.x, (int)settings->Size.y); + const char* settings_name = settings->GetName(); + buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); + buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); buf->appendf("Collapsed=%d\n", settings->Collapsed); - buf->appendf("\n"); + buf->append("\n"); } } @@ -9441,9 +10515,41 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl //----------------------------------------------------------------------------- // [SECTION] VIEWPORTS, PLATFORM WINDOWS //----------------------------------------------------------------------------- +// - GetMainViewport() +// - UpdateViewportsNewFrame() [Internal] +// (this section is more complete in the 'docking' branch) +//----------------------------------------------------------------------------- -// (this section is filled in the 'docking' branch) +ImGuiViewport* ImGui::GetMainViewport() +{ + ImGuiContext& g = *GImGui; + return g.Viewports[0]; +} +// Update viewports and monitor infos +static void ImGui::UpdateViewportsNewFrame() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Viewports.Size == 1); + + // Update main viewport with current platform position. + // FIXME-VIEWPORT: Size is driven by backend/user code for backward-compatibility but we should aim to make this more consistent. + ImGuiViewportP* main_viewport = g.Viewports[0]; + main_viewport->Flags = ImGuiViewportFlags_IsPlatformWindow | ImGuiViewportFlags_OwnedByApp; + main_viewport->Pos = ImVec2(0.0f, 0.0f); + main_viewport->Size = g.IO.DisplaySize; + + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + + // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. + viewport->WorkOffsetMin = viewport->CurrWorkOffsetMin; + viewport->WorkOffsetMax = viewport->CurrWorkOffsetMax; + viewport->CurrWorkOffsetMin = viewport->CurrWorkOffsetMax = ImVec2(0.0f, 0.0f); + viewport->UpdateWorkRect(); + } +} //----------------------------------------------------------------------------- // [SECTION] DOCKING @@ -9456,28 +10562,19 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl // [SECTION] PLATFORM DEPENDENT HELPERS //----------------------------------------------------------------------------- -#if defined(_WIN32) && !defined(_WINDOWS_) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && (!defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) || !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#ifndef __MINGW32__ -#include <Windows.h> -#else -#include <windows.h> -#endif -#endif - -// Win32 API clipboard implementation #if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) #ifdef _MSC_VER #pragma comment(lib, "user32") +#pragma comment(lib, "kernel32") #endif +// Win32 clipboard implementation +// We use g.ClipboardHandlerData for temporary storage to ensure it is freed on Shutdown() static const char* GetClipboardTextFn_DefaultImpl(void*) { - static ImVector<char> buf_local; - buf_local.clear(); + ImGuiContext& g = *GImGui; + g.ClipboardHandlerData.clear(); if (!::OpenClipboard(NULL)) return NULL; HANDLE wbuf_handle = ::GetClipboardData(CF_UNICODETEXT); @@ -9486,30 +10583,30 @@ static const char* GetClipboardTextFn_DefaultImpl(void*) ::CloseClipboard(); return NULL; } - if (ImWchar* wbuf_global = (ImWchar*)::GlobalLock(wbuf_handle)) + if (const WCHAR* wbuf_global = (const WCHAR*)::GlobalLock(wbuf_handle)) { - int buf_len = ImTextCountUtf8BytesFromStr(wbuf_global, NULL) + 1; - buf_local.resize(buf_len); - ImTextStrToUtf8(buf_local.Data, buf_len, wbuf_global, NULL); + int buf_len = ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, NULL, 0, NULL, NULL); + g.ClipboardHandlerData.resize(buf_len); + ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, g.ClipboardHandlerData.Data, buf_len, NULL, NULL); } ::GlobalUnlock(wbuf_handle); ::CloseClipboard(); - return buf_local.Data; + return g.ClipboardHandlerData.Data; } static void SetClipboardTextFn_DefaultImpl(void*, const char* text) { if (!::OpenClipboard(NULL)) return; - const int wbuf_length = ImTextCountCharsFromUtf8(text, NULL) + 1; - HGLOBAL wbuf_handle = ::GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(ImWchar)); + const int wbuf_length = ::MultiByteToWideChar(CP_UTF8, 0, text, -1, NULL, 0); + HGLOBAL wbuf_handle = ::GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(WCHAR)); if (wbuf_handle == NULL) { ::CloseClipboard(); return; } - ImWchar* wbuf_global = (ImWchar*)::GlobalLock(wbuf_handle); - ImTextStrFromUtf8(wbuf_global, wbuf_length, text, NULL); + WCHAR* wbuf_global = (WCHAR*)::GlobalLock(wbuf_handle); + ::MultiByteToWideChar(CP_UTF8, 0, text, -1, wbuf_global, wbuf_length); ::GlobalUnlock(wbuf_handle); ::EmptyClipboard(); if (::SetClipboardData(CF_UNICODETEXT, wbuf_handle) == NULL) @@ -9517,30 +10614,82 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text) ::CloseClipboard(); } +#elif defined(__APPLE__) && TARGET_OS_OSX && defined(IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS) + +#include <Carbon/Carbon.h> // Use old API to avoid need for separate .mm file +static PasteboardRef main_clipboard = 0; + +// OSX clipboard implementation +// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line! +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardClear(main_clipboard); + CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text)); + if (cf_data) + { + PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0); + CFRelease(cf_data); + } +} + +static const char* GetClipboardTextFn_DefaultImpl(void*) +{ + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardSynchronize(main_clipboard); + + ItemCount item_count = 0; + PasteboardGetItemCount(main_clipboard, &item_count); + for (ItemCount i = 0; i < item_count; i++) + { + PasteboardItemID item_id = 0; + PasteboardGetItemIdentifier(main_clipboard, i + 1, &item_id); + CFArrayRef flavor_type_array = 0; + PasteboardCopyItemFlavors(main_clipboard, item_id, &flavor_type_array); + for (CFIndex j = 0, nj = CFArrayGetCount(flavor_type_array); j < nj; j++) + { + CFDataRef cf_data; + if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr) + { + ImGuiContext& g = *GImGui; + g.ClipboardHandlerData.clear(); + int length = (int)CFDataGetLength(cf_data); + g.ClipboardHandlerData.resize(length + 1); + CFDataGetBytes(cf_data, CFRangeMake(0, length), (UInt8*)g.ClipboardHandlerData.Data); + g.ClipboardHandlerData[length] = 0; + CFRelease(cf_data); + return g.ClipboardHandlerData.Data; + } + } + } + return NULL; +} + #else -// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers +// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers. static const char* GetClipboardTextFn_DefaultImpl(void*) { ImGuiContext& g = *GImGui; - return g.PrivateClipboard.empty() ? NULL : g.PrivateClipboard.begin(); + return g.ClipboardHandlerData.empty() ? NULL : g.ClipboardHandlerData.begin(); } -// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers static void SetClipboardTextFn_DefaultImpl(void*, const char* text) { ImGuiContext& g = *GImGui; - g.PrivateClipboard.clear(); + g.ClipboardHandlerData.clear(); const char* text_end = text + strlen(text); - g.PrivateClipboard.resize((int)(text_end - text) + 1); - memcpy(&g.PrivateClipboard[0], text, (size_t)(text_end - text)); - g.PrivateClipboard[(int)(text_end - text)] = 0; + g.ClipboardHandlerData.resize((int)(text_end - text) + 1); + memcpy(&g.ClipboardHandlerData[0], text, (size_t)(text_end - text)); + g.ClipboardHandlerData[(int)(text_end - text)] = 0; } #endif // Win32 API IME support (for Asian languages, etc.) -#if defined(_WIN32) && !defined(__GNUC__) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) #include <imm.h> #ifdef _MSC_VER @@ -9550,7 +10699,8 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text) static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y) { // Notify OS Input Method Editor of text input position - if (HWND hwnd = (HWND)GImGui->IO.ImeWindowHandle) + ImGuiIO& io = ImGui::GetIO(); + if (HWND hwnd = (HWND)io.ImeWindowHandle) if (HIMC himc = ::ImmGetContext(hwnd)) { COMPOSITIONFORM cf; @@ -9569,238 +10719,390 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int, int) {} #endif //----------------------------------------------------------------------------- -// [SECTION] METRICS/DEBUG WINDOW +// [SECTION] METRICS/DEBUGGER WINDOW //----------------------------------------------------------------------------- +// - RenderViewportThumbnail() [Internal] +// - RenderViewportsThumbnails() [Internal] +// - MetricsHelpMarker() [Internal] +// - ShowMetricsWindow() +// - DebugNodeColumns() [Internal] +// - DebugNodeDrawList() [Internal] +// - DebugNodeDrawCmdShowMeshAndBoundingBox() [Internal] +// - DebugNodeStorage() [Internal] +// - DebugNodeTabBar() [Internal] +// - DebugNodeViewport() [Internal] +// - DebugNodeWindow() [Internal] +// - DebugNodeWindowSettings() [Internal] +// - DebugNodeWindowsList() [Internal] +//----------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_METRICS_WINDOW + +void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImVec2 scale = bb.GetSize() / viewport->Size; + ImVec2 off = bb.Min - viewport->Pos * scale; + float alpha_mul = 1.0f; + window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* thumb_window = g.Windows[i]; + if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) + continue; + + ImRect thumb_r = thumb_window->Rect(); + ImRect title_r = thumb_window->TitleBarRect(); + thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); + title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height + thumb_r.ClipWithFull(bb); + title_r.ClipWithFull(bb); + const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); + window->DrawList->AddRectFilled(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_WindowBg, alpha_mul)); + window->DrawList->AddRectFilled(title_r.Min, title_r.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg, alpha_mul)); + window->DrawList->AddRect(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); + window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); + } + draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); +} + +static void RenderViewportsThumbnails() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. + float SCALE = 1.0f / 8.0f; + ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + bb_full.Add(g.Viewports[n]->GetMainRect()); + ImVec2 p = window->DC.CursorPos; + ImVec2 off = p - bb_full.Min * SCALE; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); + ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); + } + ImGui::Dummy(bb_full.GetSize() * SCALE); +} + +// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. +static void MetricsHelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} void ImGui::ShowMetricsWindow(bool* p_open) { - if (!ImGui::Begin("ImGui Metrics", p_open)) + if (!Begin("Dear ImGui Metrics/Debugger", p_open)) { - ImGui::End(); + End(); return; } - enum { RT_OuterRect, RT_OuterRectClipped, RT_InnerMainRect, RT_InnerClipRect, RT_ContentsRegionRect, RT_ContentsFullRect }; - static bool show_windows_begin_order = false; - static bool show_windows_rects = false; - static int show_windows_rect_type = RT_ContentsRegionRect; - static bool show_drawcmd_clip_rects = true; + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; - ImGuiIO& io = ImGui::GetIO(); - ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - ImGui::Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); - ImGui::Text("%d active windows (%d visible)", io.MetricsActiveWindows, io.MetricsRenderWindows); - ImGui::Text("%d active allocations", io.MetricsActiveAllocations); - ImGui::Separator(); + // Basic info + Text("Dear ImGui %s", GetVersion()); + Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); + Text("%d active windows (%d visible)", io.MetricsActiveWindows, io.MetricsRenderWindows); + Text("%d active allocations", io.MetricsActiveAllocations); + //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } + + Separator(); + + // Debugging enums + enum { WRT_OuterRect, WRT_OuterRectClipped, WRT_InnerRect, WRT_InnerClipRect, WRT_WorkRect, WRT_Content, WRT_ContentIdeal, WRT_ContentRegionRect, WRT_Count }; // Windows Rect Type + const char* wrt_rects_names[WRT_Count] = { "OuterRect", "OuterRectClipped", "InnerRect", "InnerClipRect", "WorkRect", "Content", "ContentIdeal", "ContentRegionRect" }; + enum { TRT_OuterRect, TRT_InnerRect, TRT_WorkRect, TRT_HostClipRect, TRT_InnerClipRect, TRT_BackgroundClipRect, TRT_ColumnsRect, TRT_ColumnsWorkRect, TRT_ColumnsClipRect, TRT_ColumnsContentHeadersUsed, TRT_ColumnsContentHeadersIdeal, TRT_ColumnsContentFrozen, TRT_ColumnsContentUnfrozen, TRT_Count }; // Tables Rect Type + const char* trt_rects_names[TRT_Count] = { "OuterRect", "InnerRect", "WorkRect", "HostClipRect", "InnerClipRect", "BackgroundClipRect", "ColumnsRect", "ColumnsWorkRect", "ColumnsClipRect", "ColumnsContentHeadersUsed", "ColumnsContentHeadersIdeal", "ColumnsContentFrozen", "ColumnsContentUnfrozen" }; + if (cfg->ShowWindowsRectsType < 0) + cfg->ShowWindowsRectsType = WRT_WorkRect; + if (cfg->ShowTablesRectsType < 0) + cfg->ShowTablesRectsType = TRT_WorkRect; struct Funcs { - static void NodeDrawList(ImGuiWindow* window, ImDrawList* draw_list, const char* label) + static ImRect GetTableRect(ImGuiTable* table, int rect_type, int n) { - bool node_open = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size); - if (draw_list == ImGui::GetWindowDrawList()) - { - ImGui::SameLine(); - ImGui::TextColored(ImVec4(1.0f,0.4f,0.4f,1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) - if (node_open) ImGui::TreePop(); - return; - } - - ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list - if (window && IsItemHovered()) - fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); - if (!node_open) - return; - - int elem_offset = 0; - for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++) - { - if (pcmd->UserCallback == NULL && pcmd->ElemCount == 0) - continue; - if (pcmd->UserCallback) - { - ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); - continue; - } - ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; - bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); - if (show_drawcmd_clip_rects && fg_draw_list && ImGui::IsItemHovered()) - { - ImRect clip_rect = pcmd->ClipRect; - ImRect vtxs_rect; - for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++) - vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos); - clip_rect.Floor(); fg_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,255,0,255)); - vtxs_rect.Floor(); fg_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, IM_COL32(255,0,255,255)); - } - if (!pcmd_node_open) - continue; - - // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. - ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. - while (clipper.Step()) - for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) - { - char buf[300]; - char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf); - ImVec2 triangles_pos[3]; - for (int n = 0; n < 3; n++, idx_i++) - { - int vtx_i = idx_buffer ? idx_buffer[idx_i] : idx_i; - ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; - triangles_pos[n] = v.pos; - buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", - (n == 0) ? "idx" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); - } - ImGui::Selectable(buf, false); - if (fg_draw_list && ImGui::IsItemHovered()) - { - ImDrawListFlags backup_flags = fg_draw_list->Flags; - fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines at is more readable for very large and thin triangles. - fg_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255,255,0,255), true, 1.0f); - fg_draw_list->Flags = backup_flags; - } - } - ImGui::TreePop(); - } - ImGui::TreePop(); + if (rect_type == TRT_OuterRect) { return table->OuterRect; } + else if (rect_type == TRT_InnerRect) { return table->InnerRect; } + else if (rect_type == TRT_WorkRect) { return table->WorkRect; } + else if (rect_type == TRT_HostClipRect) { return table->HostClipRect; } + else if (rect_type == TRT_InnerClipRect) { return table->InnerClipRect; } + else if (rect_type == TRT_BackgroundClipRect) { return table->BgClipRect; } + else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table->LastOuterHeight); } + else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } + else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } + else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table->LastFirstRowHeight); } // Note: y1/y2 not always accurate + else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table->LastFirstRowHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } + IM_ASSERT(0); + return ImRect(); } - static void NodeColumns(const ImGuiColumns* columns) + static ImRect GetWindowRect(ImGuiWindow* window, int rect_type) { - if (!ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) - return; - ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX); - for (int column_n = 0; column_n < columns->Columns.Size; column_n++) - ImGui::BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, OffsetNormToPixels(columns, columns->Columns[column_n].OffsetNorm)); - ImGui::TreePop(); - } - - static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label) - { - if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size)) - return; - for (int i = 0; i < windows.Size; i++) - Funcs::NodeWindow(windows[i], "Window"); - ImGui::TreePop(); - } - - static void NodeWindow(ImGuiWindow* window, const char* label) - { - if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window)) - return; - ImGuiWindowFlags flags = window->Flags; - NodeDrawList(window, window->DrawList, "DrawList"); - ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y); - ImGui::BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, - (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", - (flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", - (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); - ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetWindowScrollMaxX(window), window->Scroll.y, GetWindowScrollMaxY(window)); - ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); - ImGui::BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); - ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask); - ImGui::BulletText("NavLastChildNavWindow: %s", window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); - if (!window->NavRectRel[0].IsInverted()) - ImGui::BulletText("NavRectRel[0]: (%.1f,%.1f)(%.1f,%.1f)", window->NavRectRel[0].Min.x, window->NavRectRel[0].Min.y, window->NavRectRel[0].Max.x, window->NavRectRel[0].Max.y); - else - ImGui::BulletText("NavRectRel[0]: <None>"); - if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow"); - if (window->ParentWindow != NULL) NodeWindow(window->ParentWindow, "ParentWindow"); - if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows"); - if (window->ColumnsStorage.Size > 0 && ImGui::TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) - { - for (int n = 0; n < window->ColumnsStorage.Size; n++) - NodeColumns(&window->ColumnsStorage[n]); - ImGui::TreePop(); - } - ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair)); - ImGui::TreePop(); - } - - static void NodeTabBar(ImGuiTabBar* tab_bar) - { - // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings. - char buf[256]; - char* p = buf; - const char* buf_end = buf + IM_ARRAYSIZE(buf); - ImFormatString(p, buf_end - p, "TabBar (%d tabs)%s", tab_bar->Tabs.Size, (tab_bar->PrevFrameVisible < ImGui::GetFrameCount() - 2) ? " *Inactive*" : ""); - if (ImGui::TreeNode(tab_bar, "%s", buf)) - { - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) - { - const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - ImGui::PushID(tab); - if (ImGui::SmallButton("<")) { TabBarQueueChangeTabOrder(tab_bar, tab, -1); } ImGui::SameLine(0, 2); - if (ImGui::SmallButton(">")) { TabBarQueueChangeTabOrder(tab_bar, tab, +1); } ImGui::SameLine(); - ImGui::Text("%02d%c Tab 0x%08X", tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID); - ImGui::PopID(); - } - ImGui::TreePop(); - } + if (rect_type == WRT_OuterRect) { return window->Rect(); } + else if (rect_type == WRT_OuterRectClipped) { return window->OuterRectClipped; } + else if (rect_type == WRT_InnerRect) { return window->InnerRect; } + else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } + else if (rect_type == WRT_WorkRect) { return window->WorkRect; } + else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } + else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } + else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } + IM_ASSERT(0); + return ImRect(); } }; - // Access private state, we are going to display the draw lists from last frame - ImGuiContext& g = *GImGui; - Funcs::NodeWindows(g.Windows, "Windows"); - if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.DrawDataBuilder.Layers[0].Size)) + // Tools + if (TreeNode("Tools")) { - for (int i = 0; i < g.DrawDataBuilder.Layers[0].Size; i++) - Funcs::NodeDrawList(NULL, g.DrawDataBuilder.Layers[0][i], "DrawList"); - ImGui::TreePop(); + // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. + if (Button("Item Picker..")) + DebugStartItemPicker(); + SameLine(); + MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); + + Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); + Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowWindowsRects |= Combo("##show_windows_rect_type", &cfg->ShowWindowsRectsType, wrt_rects_names, WRT_Count, WRT_Count); + if (cfg->ShowWindowsRects && g.NavWindow != NULL) + { + BulletText("'%s':", g.NavWindow->Name); + Indent(); + for (int rect_n = 0; rect_n < WRT_Count; rect_n++) + { + ImRect r = Funcs::GetWindowRect(g.NavWindow, rect_n); + Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), wrt_rects_names[rect_n]); + } + Unindent(); + } + Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); + Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); + + Checkbox("Show tables rectangles", &cfg->ShowTablesRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowTablesRects |= Combo("##show_table_rects_type", &cfg->ShowTablesRectsType, trt_rects_names, TRT_Count, TRT_Count); + if (cfg->ShowTablesRects && g.NavWindow != NULL) + { + for (int table_n = 0; table_n < g.Tables.GetSize(); table_n++) + { + ImGuiTable* table = g.Tables.GetByIndex(table_n); + if (table->LastFrameActive < g.FrameCount - 1 || (table->OuterWindow != g.NavWindow && table->InnerWindow != g.NavWindow)) + continue; + + BulletText("Table 0x%08X (%d columns, in '%s')", table->ID, table->ColumnsCount, table->OuterWindow->Name); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min - ImVec2(1, 1), table->OuterRect.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + Indent(); + char buf[128]; + for (int rect_n = 0; rect_n < TRT_Count; rect_n++) + { + if (rect_n >= TRT_ColumnsRect) + { + if (rect_n != TRT_ColumnsRect && rect_n != TRT_ColumnsClipRect) + continue; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, rect_n, column_n); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) Col %d %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), column_n, trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, rect_n, -1); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + Unindent(); + } + } + + TreePop(); } - if (ImGui::TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) + // Windows + DebugNodeWindowsList(&g.Windows, "Windows"); + //DebugNodeWindowsList(&g.WindowsFocusOrder, "WindowsFocusOrder"); + + // DrawLists + int drawlist_count = 0; + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); + if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) + { + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + { + ImGuiViewportP* viewport = g.Viewports[viewport_i]; + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + } + TreePop(); + } + + // Viewports + if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) + { + Indent(GetTreeNodeToLabelSpacing()); + RenderViewportsThumbnails(); + Unindent(GetTreeNodeToLabelSpacing()); + for (int i = 0; i < g.Viewports.Size; i++) + DebugNodeViewport(g.Viewports[i]); + TreePop(); + } + + // Details for Popups + if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) { for (int i = 0; i < g.OpenPopupStack.Size; i++) { ImGuiWindow* window = g.OpenPopupStack[i].Window; - ImGui::BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); + BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); } - ImGui::TreePop(); + TreePop(); } - if (ImGui::TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.Data.Size)) + // Details for TabBars + if (TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.GetSize())) { - for (int n = 0; n < g.TabBars.Data.Size; n++) - Funcs::NodeTabBar(g.TabBars.GetByIndex(n)); - ImGui::TreePop(); + for (int n = 0; n < g.TabBars.GetSize(); n++) + DebugNodeTabBar(g.TabBars.GetByIndex(n), "TabBar"); + TreePop(); } - if (ImGui::TreeNode("Internal state")) + // Details for Tables +#ifdef IMGUI_HAS_TABLE + if (TreeNode("Tables", "Tables (%d)", g.Tables.GetSize())) + { + for (int n = 0; n < g.Tables.GetSize(); n++) + DebugNodeTable(g.Tables.GetByIndex(n)); + TreePop(); + } +#endif // #ifdef IMGUI_HAS_TABLE + + // Details for Docking +#ifdef IMGUI_HAS_DOCK + if (TreeNode("Docking")) + { + TreePop(); + } +#endif // #ifdef IMGUI_HAS_DOCK + + // Settings + if (TreeNode("Settings")) + { + if (SmallButton("Clear")) + ClearIniSettings(); + SameLine(); + if (SmallButton("Save to memory")) + SaveIniSettingsToMemory(); + SameLine(); + if (SmallButton("Save to disk")) + SaveIniSettingsToDisk(g.IO.IniFilename); + SameLine(); + if (g.IO.IniFilename) + Text("\"%s\"", g.IO.IniFilename); + else + TextUnformatted("<NULL>"); + Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); + if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) + { + for (int n = 0; n < g.SettingsHandlers.Size; n++) + BulletText("%s", g.SettingsHandlers[n].TypeName); + TreePop(); + } + if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) + { + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + DebugNodeWindowSettings(settings); + TreePop(); + } + +#ifdef IMGUI_HAS_TABLE + if (TreeNode("SettingsTables", "Settings packed data: Tables: %d bytes", g.SettingsTables.size())) + { + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + DebugNodeTableSettings(settings); + TreePop(); + } +#endif // #ifdef IMGUI_HAS_TABLE + +#ifdef IMGUI_HAS_DOCK +#endif // #ifdef IMGUI_HAS_DOCK + + if (TreeNode("SettingsIniData", "Settings unpacked data (.ini): %d bytes", g.SettingsIniData.size())) + { + InputTextMultiline("##Ini", (char*)(void*)g.SettingsIniData.c_str(), g.SettingsIniData.Buf.Size, ImVec2(-FLT_MIN, GetTextLineHeight() * 20), ImGuiInputTextFlags_ReadOnly); + TreePop(); + } + TreePop(); + } + + // Misc Details + if (TreeNode("Internal state")) { const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT); - ImGui::Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); - ImGui::Text("HoveredRootWindow: '%s'", g.HoveredRootWindow ? g.HoveredRootWindow->Name : "NULL"); - ImGui::Text("HoveredId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Data is "in-flight" so depending on when the Metrics window is called we may see current frame information or not - ImGui::Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, input_source_names[g.ActiveIdSource]); - ImGui::Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); - ImGui::Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL"); - ImGui::Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); - ImGui::Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); - ImGui::Text("NavInputSource: %s", input_source_names[g.NavInputSource]); - ImGui::Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); - ImGui::Text("NavActivateId: 0x%08X, NavInputId: 0x%08X", g.NavActivateId, g.NavInputId); - ImGui::Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); - ImGui::Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); - ImGui::Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); - ImGui::TreePop(); + + Text("WINDOWING"); + Indent(); + Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); + Text("HoveredWindow->Root: '%s'", g.HoveredWindow ? g.HoveredWindow->RootWindow->Name : "NULL"); + Text("HoveredWindowUnderMovingWindow: '%s'", g.HoveredWindowUnderMovingWindow ? g.HoveredWindowUnderMovingWindow->Name : "NULL"); + Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL"); + Unindent(); + + Text("ITEMS"); + Indent(); + Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, input_source_names[g.ActiveIdSource]); + Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); + Text("HoveredId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Data is "in-flight" so depending on when the Metrics window is called we may see current frame information or not + Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); + Unindent(); + + Text("NAV,FOCUS"); + Indent(); + Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); + Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); + Text("NavInputSource: %s", input_source_names[g.NavInputSource]); + Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); + Text("NavActivateId: 0x%08X, NavInputId: 0x%08X", g.NavActivateId, g.NavInputId); + Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); + Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); + Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); + Unindent(); + + TreePop(); } - if (ImGui::TreeNode("Tools")) - { - ImGui::Checkbox("Show windows begin order", &show_windows_begin_order); - ImGui::Checkbox("Show windows rectangles", &show_windows_rects); - ImGui::SameLine(); - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 12); - show_windows_rects |= ImGui::Combo("##rects_type", &show_windows_rect_type, "OuterRect\0" "OuterRectClipped\0" "InnerMainRect\0" "InnerClipRect\0" "ContentsRegionRect\0"); - ImGui::Checkbox("Show clipping rectangle when hovering ImDrawCmd node", &show_drawcmd_clip_rects); - ImGui::TreePop(); - } - - if (show_windows_rects || show_windows_begin_order) + // Overlay: Display windows Rectangles and Begin Order + if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) { for (int n = 0; n < g.Windows.Size; n++) { @@ -9808,29 +11110,350 @@ void ImGui::ShowMetricsWindow(bool* p_open) if (!window->WasActive) continue; ImDrawList* draw_list = GetForegroundDrawList(window); - if (show_windows_rects) + if (cfg->ShowWindowsRects) { - ImRect r; - if (show_windows_rect_type == RT_OuterRect) { r = window->Rect(); } - else if (show_windows_rect_type == RT_OuterRectClipped) { r = window->OuterRectClipped; } - else if (show_windows_rect_type == RT_InnerMainRect) { r = window->InnerMainRect; } - else if (show_windows_rect_type == RT_InnerClipRect) { r = window->InnerClipRect; } - else if (show_windows_rect_type == RT_ContentsRegionRect) { r = window->ContentsRegionRect; } + ImRect r = Funcs::GetWindowRect(window, cfg->ShowWindowsRectsType); draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); } - if (show_windows_begin_order && !(window->Flags & ImGuiWindowFlags_ChildWindow)) + if (cfg->ShowWindowsBeginOrder && !(window->Flags & ImGuiWindowFlags_ChildWindow)) { char buf[32]; ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext); - float font_size = ImGui::GetFontSize(); + float font_size = GetFontSize(); draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255)); draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf); } } } - ImGui::End(); + +#ifdef IMGUI_HAS_TABLE + // Overlay: Display Tables Rectangles + if (cfg->ShowTablesRects) + { + for (int table_n = 0; table_n < g.Tables.GetSize(); table_n++) + { + ImGuiTable* table = g.Tables.GetByIndex(table_n); + if (table->LastFrameActive < g.FrameCount - 1) + continue; + ImDrawList* draw_list = GetForegroundDrawList(table->OuterWindow); + if (cfg->ShowTablesRectsType >= TRT_ColumnsRect) + { + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, column_n); + ImU32 col = (table->HoveredColumnBody == column_n) ? IM_COL32(255, 255, 128, 255) : IM_COL32(255, 0, 128, 255); + float thickness = (table->HoveredColumnBody == column_n) ? 3.0f : 1.0f; + draw_list->AddRect(r.Min, r.Max, col, 0.0f, 0, thickness); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, -1); + draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); + } + } + } +#endif // #ifdef IMGUI_HAS_TABLE + +#ifdef IMGUI_HAS_DOCK + // Overlay: Display Docking info + if (show_docking_nodes && g.IO.KeyCtrl) + { + } +#endif // #ifdef IMGUI_HAS_DOCK + + End(); } +// [DEBUG] Display contents of Columns +void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) +{ + if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) + return; + BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); + for (int column_n = 0; column_n < columns->Columns.Size; column_n++) + BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); + TreePop(); +} + +// [DEBUG] Display contents of ImDrawList +void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + int cmd_count = draw_list->CmdBuffer.Size; + if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) + cmd_count--; + bool node_open = TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, cmd_count); + if (draw_list == GetWindowDrawList()) + { + SameLine(); + TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) + if (node_open) + TreePop(); + return; + } + + ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list + if (window && IsItemHovered()) + fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!node_open) + return; + + if (window && !window->WasActive) + TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!"); + + for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.Data; pcmd < draw_list->CmdBuffer.Data + cmd_count; pcmd++) + { + if (pcmd->UserCallback) + { + BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); + continue; + } + + char buf[300]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", + pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, + pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); + bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); + if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); + if (!pcmd_node_open) + continue; + + // Calculate approximate coverage area (touched pixel count) + // This will be in pixels squared as long there's no post-scaling happening to the renderer output. + const ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; + const ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + pcmd->VtxOffset; + float total_area = 0.0f; + for (unsigned int idx_n = pcmd->IdxOffset; idx_n < pcmd->IdxOffset + pcmd->ElemCount; ) + { + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos; + total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]); + } + + // Display vertex information summary. Hover to get all triangles drawn in wire-frame + ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area); + Selectable(buf); + if (IsItemHovered() && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, true, false); + + // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. + ImGuiListClipper clipper; + clipper.Begin(pcmd->ElemCount / 3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. + while (clipper.Step()) + for (int prim = clipper.DisplayStart, idx_i = pcmd->IdxOffset + clipper.DisplayStart * 3; prim < clipper.DisplayEnd; prim++) + { + char* buf_p = buf, * buf_end = buf + IM_ARRAYSIZE(buf); + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_i++) + { + const ImDrawVert& v = vtx_buffer[idx_buffer ? idx_buffer[idx_i] : idx_i]; + triangle[n] = v.pos; + buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", + (n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); + } + + Selectable(buf, false); + if (fg_draw_list && IsItemHovered()) + { + ImDrawListFlags backup_flags = fg_draw_list->Flags; + fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); + fg_draw_list->Flags = backup_flags; + } + } + TreePop(); + } + TreePop(); +} + +// [DEBUG] Display mesh/aabb of a ImDrawCmd +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb) +{ + IM_ASSERT(show_mesh || show_aabb); + ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; + ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + draw_cmd->VtxOffset; + + // Draw wire-frame version of all triangles + ImRect clip_rect = draw_cmd->ClipRect; + ImRect vtxs_rect(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + ImDrawListFlags backup_flags = out_draw_list->Flags; + out_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + for (unsigned int idx_n = draw_cmd->IdxOffset; idx_n < draw_cmd->IdxOffset + draw_cmd->ElemCount; ) + { + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + vtxs_rect.Add((triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos)); + if (show_mesh) + out_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); // In yellow: mesh triangles + } + // Draw bounding boxes + if (show_aabb) + { + out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU + out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles + } + out_draw_list->Flags = backup_flags; +} + +// [DEBUG] Display contents of ImGuiStorage +void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) +{ + if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) + return; + for (int n = 0; n < storage->Data.Size; n++) + { + const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; + BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. + } + TreePop(); +} + +// [DEBUG] Display contents of ImGuiTabBar +void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) +{ + // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings. + char buf[256]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (tab_bar->PrevFrameVisible >= GetFrameCount() - 2); + p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*"); + IM_UNUSED(p); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(tab_bar, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (is_active && IsItemHovered()) + { + ImDrawList* draw_list = GetForegroundDrawList(); + draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + } + if (open) + { + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + PushID(tab); + if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2); + if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine(); + Text("%02d%c Tab 0x%08X '%s' Offset: %.1f, Width: %.1f/%.1f", + tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "", tab->Offset, tab->Width, tab->ContentWidth); + PopID(); + } + TreePop(); + } +} + +void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) +{ + SetNextItemOpen(true, ImGuiCond_Once); + if (TreeNode("viewport0", "Viewport #%d", 0)) + { + ImGuiWindowFlags flags = viewport->Flags; + BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", + viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y, + viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y); + BulletText("Flags: 0x%04X =%s%s%s", viewport->Flags, + (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", + (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", + (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + TreePop(); + } +} + +void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) +{ + if (window == NULL) + { + BulletText("%s: NULL", label); + return; + } + + ImGuiContext& g = *GImGui; + const bool is_active = window->WasActive; + ImGuiTreeNodeFlags tree_node_flags = (window == g.NavWindow) ? ImGuiTreeNodeFlags_Selected : ImGuiTreeNodeFlags_None; + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + const bool open = TreeNodeEx(label, tree_node_flags, "%s '%s'%s", label, window->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered() && is_active) + GetForegroundDrawList(window)->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!open) + return; + + if (window->MemoryCompacted) + TextDisabled("Note: some memory buffers have been compacted/freed."); + + ImGuiWindowFlags flags = window->Flags; + DebugNodeDrawList(window, window->DrawList, "DrawList"); + BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); + BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, + (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", + (flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", + (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); + BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : ""); + BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); + BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); + BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask); + BulletText("NavLastChildNavWindow: %s", window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); + if (!window->NavRectRel[0].IsInverted()) + BulletText("NavRectRel[0]: (%.1f,%.1f)(%.1f,%.1f)", window->NavRectRel[0].Min.x, window->NavRectRel[0].Min.y, window->NavRectRel[0].Max.x, window->NavRectRel[0].Max.y); + else + BulletText("NavRectRel[0]: <None>"); + if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } + if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } + if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } + if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) + { + for (int n = 0; n < window->ColumnsStorage.Size; n++) + DebugNodeColumns(&window->ColumnsStorage[n]); + TreePop(); + } + DebugNodeStorage(&window->StateStorage, "Storage"); + TreePop(); +} + +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings) +{ + Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d", + settings->ID, settings->GetName(), settings->Pos.x, settings->Pos.y, settings->Size.x, settings->Size.y, settings->Collapsed); +} + +void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label) +{ + if (!TreeNode(label, "%s (%d)", label, windows->Size)) + return; + Text("(In front-to-back order:)"); + for (int i = windows->Size - 1; i >= 0; i--) // Iterate front to back + { + PushID((*windows)[i]); + DebugNodeWindow((*windows)[i], "Window"); + PopID(); + } + TreePop(); +} + +#else + +void ImGui::ShowMetricsWindow(bool*) {} +void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} +void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} +void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} +void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {} +void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {} +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings*) {} +void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>*, const char*) {} +void ImGui::DebugNodeViewport(ImGuiViewportP*) {} + +#endif + //----------------------------------------------------------------------------- // Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed. @@ -9840,3 +11463,5 @@ void ImGui::ShowMetricsWindow(bool* p_open) #endif //----------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui.h similarity index 57% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui.h index 8b2ccd0ec9..da70306401 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui.h +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui.h @@ -1,35 +1,44 @@ -// Modifications copyright Amazon.com, Inc. or its affiliates. - -// dear imgui, v1.70 +// dear imgui, v1.82 // (headers) -// See imgui.cpp file for documentation. -// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. -// Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. -// Get latest version at https://github.com/ocornut/imgui +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/3488 (please post your screenshots/video there!) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Wiki https://github.com/ocornut/imgui/wiki +// - Issues & support https://github.com/ocornut/imgui/issues +// - Discussions https://github.com/ocornut/imgui/discussions /* Index of this file: -// Header mess -// Forward declarations and basic types -// ImGui API (Dear ImGui end-user API) -// Flags & Enumerations -// Memory allocations macros -// ImVector<> -// ImGuiStyle -// ImGuiIO -// Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload) -// Obsolete functions -// Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) -// Draw List API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListFlags, ImDrawList, ImDrawData) -// Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) +// [SECTION] Header mess +// [SECTION] Forward declarations and basic types +// [SECTION] Dear ImGui end-user API functions +// [SECTION] Flags & Enumerations +// [SECTION] Helpers: Memory allocations macros, ImVector<> +// [SECTION] ImGuiStyle +// [SECTION] ImGuiIO +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) +// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) +// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport) +// [SECTION] Obsolete functions and types */ #pragma once -// Configuration file with compile-time options (edit imconfig.h or define IMGUI_USER_CONFIG to your own filename) +// Configuration file with compile-time options (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') #ifdef IMGUI_USER_CONFIG #include IMGUI_USER_CONFIG #endif @@ -37,23 +46,28 @@ Index of this file: #include "imconfig.h" #endif +#ifndef IMGUI_DISABLE + //----------------------------------------------------------------------------- -// Header mess +// [SECTION] Header mess //----------------------------------------------------------------------------- -#include <float.h> // FLT_MAX -#include <stdarg.h> // va_list +// Includes +#include <float.h> // FLT_MIN, FLT_MAX +#include <stdarg.h> // va_list, va_start, va_end #include <stddef.h> // ptrdiff_t, NULL #include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp // Version // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) -#define IMGUI_VERSION "1.70" -#define IMGUI_VERSION_NUM 17000 +#define IMGUI_VERSION "1.82" +#define IMGUI_VERSION_NUM 18200 #define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) +#define IMGUI_HAS_TABLE // Define attributes of all API symbols declarations (e.g. for DLL under Windows) -// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default bindings files (imgui_impl_xxx.h) +// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) +// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) #ifndef IMGUI_API #define IMGUI_API #endif @@ -66,16 +80,25 @@ Index of this file: #include <assert.h> #define IM_ASSERT(_EXPR) assert(_EXPR) // You can override the default assert handler by editing imconfig.h #endif -#if defined(__clang__) || defined(__GNUC__) -#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) // Apply printf-style warnings to user functions. +#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! +#define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. +#if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100) +#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 +#else +#define IM_OFFSETOF(_TYPE,_MEMBER) ((size_t)&(((_TYPE*)0)->_MEMBER)) // Offset of _MEMBER within _TYPE. Old style macro. +#endif + +// Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. +#if !defined(IMGUI_USE_STB_SPRINTF) && defined(__clang__) +#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) #define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) +#elif !defined(IMGUI_USE_STB_SPRINTF) && defined(__GNUC__) && defined(__MINGW32__) +#define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) +#define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) #else #define IM_FMTARGS(FMT) #define IM_FMTLIST(FMT) #endif -#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR))) // Size of a static C-style array. Don't use on pointers! -#define IM_OFFSETOF(_TYPE,_MEMBER) ((size_t)&(((_TYPE*)0)->_MEMBER)) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in modern C++. -#define IM_UNUSED(_VAR) ((void)_VAR) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. // Warnings #if defined(__clang__) @@ -84,23 +107,27 @@ Index of this file: #if __has_warning("-Wzero-as-null-pointer-constant") #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #endif -#elif defined(__GNUC__) && __GNUC__ >= 8 +#elif defined(__GNUC__) #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wclass-memaccess" +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead #endif //----------------------------------------------------------------------------- -// Forward declarations and basic types +// [SECTION] Forward declarations and basic types //----------------------------------------------------------------------------- -struct ImDrawChannel; // Temporary storage for ImDrawList ot output draw commands out of order, used by ImDrawList::ChannelsSplit() +// Forward declarations +struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit() struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback) struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix. struct ImDrawList; // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder) struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself) +struct ImDrawListSplitter; // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back. struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT) struct ImFont; // Runtime data for a single font within a parent ImFontAtlas struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader +struct ImFontBuilderIO; // Opaque interface to a font builder (stb_truetype or FreeType). struct ImFontConfig; // Configuration data when adding a font or merging fonts struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset) struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data @@ -114,46 +141,74 @@ struct ImGuiPayload; // User data payload for drag and drop opera struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use) struct ImGuiStorage; // Helper for key->value storage struct ImGuiStyle; // Runtime data for styling/colors +struct ImGuiTableSortSpecs; // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +struct ImGuiTableColumnSortSpecs; // Sorting specification for one column of a table struct ImGuiTextBuffer; // Helper to hold and append into a text buffer (~string builder) -struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbb][,ccccc]") +struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]") +struct ImGuiViewport; // A Platform Window (always only one in 'master' branch), in the future may represent Platform Monitor -// Typedefs and Enums/Flags (declared as int for compatibility with old C++, to allow using as flags and to not pollute the top of this file) -// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. -#ifndef ImTextureID -typedef void* ImTextureID; // User data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp) -#endif -typedef unsigned int ImGuiID; // Unique ID used by widgets (typically hashed from a stack of string) -typedef unsigned short ImWchar; // A single U16 character for keyboard input/display. We encode them as multi bytes UTF-8 when used in strings. +// Enums/Flags (declared as int for compatibility with old C++, to allow using as flags and to not pollute the top of this file) +// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! +// In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling -typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for Set*() +typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction typedef int ImGuiKey; // -> enum ImGuiKey_ // Enum: A key identifier (ImGui-side enum) typedef int ImGuiNavInput; // -> enum ImGuiNavInput_ // Enum: An input identifier for navigation +typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle) typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor identifier +typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending) typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling -typedef int ImDrawCornerFlags; // -> enum ImDrawCornerFlags_ // Flags: for ImDrawList::AddRect*() etc. -typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList -typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas +typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() +typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions +typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance +typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags -typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit*(), ColorPicker*() -typedef int ImGuiColumnsFlags; // -> enum ImGuiColumnsFlags_ // Flags: for Columns(), BeginColumns() +typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() +typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() -typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for *DragDrop*() +typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. -typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText*() +typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() +typedef int ImGuiKeyModFlags; // -> enum ImGuiKeyModFlags_ // Flags: for io.KeyMods (Ctrl/Shift/Alt/Super) +typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() +typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar() typedef int ImGuiTabItemFlags; // -> enum ImGuiTabItemFlags_ // Flags: for BeginTabItem() -typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode*(),CollapsingHeader() -typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin*() -typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData *data); -typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); +typedef int ImGuiTableFlags; // -> enum ImGuiTableFlags_ // Flags: For BeginTable() +typedef int ImGuiTableColumnFlags; // -> enum ImGuiTableColumnFlags_// Flags: For TableSetupColumn() +typedef int ImGuiTableRowFlags; // -> enum ImGuiTableRowFlags_ // Flags: For TableNextRow() +typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() +typedef int ImGuiViewportFlags; // -> enum ImGuiViewportFlags_ // Flags: for ImGuiViewport +typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild() -// Scalar data types -typedef signed char ImS8; // 8-bit signed integer == char +// Other types +#ifndef ImTextureID // ImTextureID [configurable type: override in imconfig.h with '#define ImTextureID xxx'] +typedef void* ImTextureID; // User data for rendering backend to identify a texture. This is whatever to you want it to be! read the FAQ about ImTextureID for details. +#endif +typedef unsigned int ImGuiID; // A unique ID used by widgets, typically hashed from a stack of string. +typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data); // Callback function for ImGui::InputText() +typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Callback function for ImGui::SetNextWindowSizeConstraints() +typedef void* (*ImGuiMemAllocFunc)(size_t sz, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() +typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() + +// Character types +// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) +typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. +typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. +#ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] +typedef ImWchar32 ImWchar; +#else +typedef ImWchar16 ImWchar; +#endif + +// Basic scalar data types +typedef signed char ImS8; // 8-bit signed integer typedef unsigned char ImU8; // 8-bit unsigned integer typedef signed short ImS16; // 16-bit signed integer typedef unsigned short ImU16; // 16-bit unsigned integer @@ -171,14 +226,14 @@ typedef signed long long ImS64; // 64-bit signed integer (post C++11) typedef unsigned long long ImU64; // 64-bit unsigned integer (post C++11) #endif -// 2D vector (often used to store positions, sizes, etc.) +// 2D vector (often used to store positions or sizes) struct ImVec2 { - float x, y; - ImVec2() { x = y = 0.0f; } - ImVec2(float _x, float _y) { x = _x; y = _y; } - float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. - float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. + float x, y; + ImVec2() { x = y = 0.0f; } + ImVec2(float _x, float _y) { x = _x; y = _y; } + float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. + float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. #ifdef IM_VEC2_CLASS_EXTRA IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2. #endif @@ -187,62 +242,64 @@ struct ImVec2 // 4D vector (often used to store floating-point colors) struct ImVec4 { - float x, y, z, w; - ImVec4() { x = y = z = w = 0.0f; } - ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } + float x, y, z, w; + ImVec4() { x = y = z = w = 0.0f; } + ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } #ifdef IM_VEC4_CLASS_EXTRA IM_VEC4_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4. #endif }; //----------------------------------------------------------------------------- -// ImGui: Dear ImGui end-user API -// (Inside a namespace so you can add extra functions in your own separate file. Please don't modify imgui.cpp/.h!) +// [SECTION] Dear ImGui end-user API functions +// (Note that ImGui:: being a namespace, you can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!) //----------------------------------------------------------------------------- namespace ImGui { // Context creation and access - // Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between imgui contexts. - // All those functions are not reliant on the current context. + // - Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between contexts. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for details. IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL); IMGUI_API void DestroyContext(ImGuiContext* ctx = NULL); // NULL = destroy current context IMGUI_API ImGuiContext* GetCurrentContext(); IMGUI_API void SetCurrentContext(ImGuiContext* ctx); - IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // Main IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) - IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame. + IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). - IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(), you likely don't need to call that yourself directly. If you don't need to render data (skipping rendering) you may call EndFrame() but you'll have wasted CPU already! If you don't need to render, better to not create any imgui windows and not call NewFrame() at all! - IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can get call GetDrawData() to obtain it and run your rendering function. (Obsolete: this used to call io.RenderDrawListsFn(). Nowadays, we allow and prefer calling your render function yourself.) + IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! + IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render. // Demo, Debug, Information - IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create demo/test window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! - IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create about window. display Dear ImGui version, credits and build/system information. - IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create metrics/debug window. display Dear ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc. + IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! + IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. + IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. IMGUI_API void ShowFontSelector(const char* label); // add font selector block (not a window), essentially a combo listing the loaded fonts. IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls). - IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.23" (essentially the compiled value for IMGUI_VERSION) + IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.80 WIP" (essentially the value for IMGUI_VERSION from the compiled version of imgui.cpp) // Styles IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default) - IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); // best used with borders and a custom, thicker font + IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style // Windows // - Begin() = push window to the stack and start appending to it. End() = pop window from the stack. - // - You may append multiple times to the same window during the same frame. // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window, // which clicking will set the boolean to false when clicked. + // - You may append multiple times to the same window during the same frame by calling Begin()/End() pairs multiple times. + // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! - // [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. - // where the EndXXX call should only be called if the corresponding BeginXXX function returned true.] + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] // - Note that the bottom of window stack always contains a window called "Debug". IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); IMGUI_API void End(); @@ -251,13 +308,16 @@ namespace ImGui // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. - // Always call a matching EndChild() for each BeginChild() call, regardless of its return value [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true.] - IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags flags = 0); - IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags flags = 0); + // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); IMGUI_API void EndChild(); // Windows Utilities - // - "current window" = the window we are appending into while inside a Begin()/End() block. "next window" = next window we will Begin() into. + // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into. IMGUI_API bool IsWindowAppearing(); IMGUI_API bool IsWindowCollapsed(); IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. @@ -269,80 +329,89 @@ namespace ImGui IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) // Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). - IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0,0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. + IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. - IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ enforce the range of scrollbars). not including window decorations (title bar, menu bar, etc.). set an axis to 0.0f to leave it automatic. call before Begin() + IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() - IMGUI_API void SetNextWindowFocus(); // set next window to be focused / front-most. call before Begin() - IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily modify ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground. + IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() + IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground. IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects. - IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0,0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. + IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0, 0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed(). - IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / front-most. prefer using SetNextWindowFocus(). - IMGUI_API void SetWindowFontScale(float scale); // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows + IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus(). + IMGUI_API void SetWindowFontScale(float scale); // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes(). IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position. IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state - IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / front-most. use NULL to remove focus. + IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus. // Content region - // - Those functions are bound to be redesigned soon (they are confusing, incomplete and return values in local window coordinates which increases confusion) - IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates + // - Retrieve available space from a given point. GetContentRegionAvail() is frequently useful. + // - Those functions are bound to be redesigned (they are confusing, incomplete and the Min/Max return values are in local window coordinates which increases confusion) IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos() + IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min (roughly (0,0)-Scroll), in window coordinates IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates IMGUI_API float GetWindowContentRegionWidth(); // // Windows Scrolling - IMGUI_API float GetScrollX(); // get scrolling amount [0..GetScrollMaxX()] - IMGUI_API float GetScrollY(); // get scrolling amount [0..GetScrollMaxY()] - IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.X - WindowSize.X - IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y - IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0..GetScrollMaxX()] - IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0..GetScrollMaxY()] + IMGUI_API float GetScrollX(); // get scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API float GetScrollY(); // get scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.x - WindowSize.x - DecorationsSize.x + IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.y - WindowSize.y - DecorationsSize.y + IMGUI_API void SetScrollHereX(float center_x_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. + IMGUI_API void SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. // Parameters stacks (shared) IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font IMGUI_API void PopFont(); - IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); + IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); // modify a style color. always use this if you modify the style after NewFrame(). IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col); IMGUI_API void PopStyleColor(int count = 1); - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame(). + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. always use this if you modify the style after NewFrame(). IMGUI_API void PopStyleVar(int count = 1); - IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. - IMGUI_API ImFont* GetFont(); // get current font - IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied - IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API - IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier - IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied - IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied - - // Parameters stacks (current window) - IMGUI_API void PushItemWidth(float item_width); // set width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side). 0.0f = default to ~2/3 of windows width, - IMGUI_API void PopItemWidth(); - IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side) - IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position - IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space - IMGUI_API void PopTextWrapPos(); IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets IMGUI_API void PopAllowKeyboardFocus(); IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame. IMGUI_API void PopButtonRepeat(); + // Parameters stacks (current window) + IMGUI_API void PushItemWidth(float item_width); // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side). + IMGUI_API void PopItemWidth(); + IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side) + IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions. + IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space + IMGUI_API void PopTextWrapPos(); + + // Style read access + IMGUI_API ImFont* GetFont(); // get current font + IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied + IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API + IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. + // Cursor / Layout // - By "cursor" we mean the current output position. // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. + // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. + // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: + // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() + // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in an horizontal-layout context. IMGUI_API void Spacing(); // add vertical spacing. IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into. - IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by style.IndentSpacing or indent_w if != 0 - IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by style.IndentSpacing or indent_w if != 0 + IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by indent_w, or style.IndentSpacing if indent_w <= 0 + IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 IMGUI_API void BeginGroup(); // lock horizontal starting position IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) @@ -352,8 +421,8 @@ namespace ImGui IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) IMGUI_API void SetCursorPosY(float local_y); // IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates - IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API) - IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute screen coordinates [0..io.DisplaySize] + IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. + IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) IMGUI_API float GetTextLineHeight(); // ~ FontSize IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) @@ -377,8 +446,8 @@ namespace ImGui IMGUI_API ImGuiID GetID(const void* ptr_id); // Widgets: Text - IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. - IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // simple formatted text + IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. + IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1); IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); @@ -393,69 +462,80 @@ namespace ImGui // Widgets: Main // - Most widgets return true when the value has been changed or when pressed/selected - IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0,0)); // button + // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. + IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text - IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size); // button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) + IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape - IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); - IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding + IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); + IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding IMGUI_API bool Checkbox(const char* label, bool* v); + IMGUI_API bool CheckboxFlags(const char* label, int* flags, int flags_value); IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); IMGUI_API bool RadioButton(const char* label, bool active); // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; } IMGUI_API bool RadioButton(const char* label, int* v, int v_button); // shortcut to handle the above pattern when value is an integer - IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL); - IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses + IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-FLT_MIN, 0), const char* overlay = NULL); + IMGUI_API void Bullet(); // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses // Widgets: Combo Box - // - The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. - // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. + // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. + // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. This is analogous to how ListBox are created. IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0); IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); - // Widgets: Drags + // Widgets: Drag Sliders // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped and can go off-bounds. // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision). - IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound - IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, float power = 1.0f); - IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); // If v_min >= v_max we have no bound - IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); - IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); - IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); - IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL); - IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f); - IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f); + // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits. + // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum. + // - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. + // - Legacy: Pre-1.78 there are DragXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); - // Widgets: Sliders + // Widgets: Regular Sliders // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds. // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. - IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. Use power!=1.0 for power curve sliders - IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg"); - IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d"); - IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d"); - IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d"); - IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d"); - IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); - IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); - IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); - IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d"); - IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). + // - Legacy: Pre-1.78 there are SliderXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. + IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); // Widgets: Input with Keyboard - // - If you want to use InputText() with a dynamic string type such as std::string or your own, see misc/cpp/imgui_stdlib.h + // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp. // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc. IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0); IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); @@ -466,17 +546,17 @@ namespace ImGui IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* v, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); - // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.) + // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little color square that can be left-clicked to open a picker, and right-clicked to open an option menu.) // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0); IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); IMGUI_API bool ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL); - IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0)); // display a colored square/button, hover for details, return true when pressed. + IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0)); // display a color square/button, hover for details, return true when pressed. IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls. // Widgets: Trees @@ -494,27 +574,30 @@ namespace ImGui IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. IMGUI_API void TreePush(const void* ptr_id = NULL); // " IMGUI_API void TreePop(); // ~ Unindent()+PopId() - IMGUI_API void TreeAdvanceToLabelPos(); // advance cursor x position by GetTreeNodeToLabelSpacing() IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode - IMGUI_API void SetNextTreeNodeOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. - IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have% to call TreePop(). - IMGUI_API bool CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header + IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). + IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. + IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. // Widgets: Selectables // - A selectable highlights when hovered, and can display another color when selected. - // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. - IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height - IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. + // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous. + IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height + IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. // Widgets: List Boxes - // - FIXME: To be consistent with all the newer API, ListBoxHeader/ListBoxFooter should in reality be called BeginListBox/EndListBox. Will rename them. + // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. + // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. + // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. + // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth + // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items + IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region + IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); - IMGUI_API bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0,0)); // use if you want to reimplement ListBox() will custom data or interactions. if the function return true, you can output elements then call ListBoxFooter() afterwards. - IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // " - IMGUI_API void ListBoxFooter(); // terminate the scrolling region. only call ListBoxFooter() if ListBoxHeader() returned true! // Widgets: Data Plotting + // - Consider using ImPlot (https://github.com/epezent/implot) IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); @@ -528,43 +611,122 @@ namespace ImGui IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL); // Widgets: Menus - IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. - IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true! + // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar. + // - Use BeginMainMenuBar() to create a menu bar at the top of the screen and append to it. + // - Use BeginMenu() to create a menu. You can call BeginMenu() multiple time with the same identifier to append more items to it. IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). IMGUI_API void EndMenuBar(); // only call EndMenuBar() if BeginMenuBar() returns true! + IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. + IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true! IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true! IMGUI_API void EndMenu(); // only call EndMenu() if BeginMenu() returns true! IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL // Tooltips + // - Tooltip are windows following the mouse. They do not take focus away. IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). IMGUI_API void EndTooltip(); IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); // Popups, Modals - // The properties of popups windows are: - // - They block normal mouse hovering detection outside them. (*) - // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. - // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls. - // User can manipulate the visibility state by calling OpenPopup(). - // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup. - // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time. - IMGUI_API void OpenPopup(const char* str_id); // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). - IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returns true! - IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! - IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, int mouse_button = 1, bool also_over_items = true); // helper to open and begin popup when clicked on current window. - IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked in void (where there are no imgui windows). - IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // modal dialog (regular window with title bar, block interactions behind the modal window, can't close the modal window by clicking outside) - IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true! - IMGUI_API bool OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1); // helper to open popup when clicked on last item (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors). return true when just opened. - IMGUI_API bool IsPopupOpen(const char* str_id); // return true if the popup is open at the current begin-ed level of the popup stack. - IMGUI_API void CloseCurrentPopup(); // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup. + // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally instead of being held by the programmer as we are used to with regular Begin*() calls. + // - The 3 properties above are related: we need to retain popup visibility state in the library because popups may be closed as any time. + // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). + // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. + // This is sometimes leading to confusing mistakes. May rework this in the future. + // Popups: begin/end functions + // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. + // - BeginPopupModal(): block every interactions behind the window, cannot be closed by user, add a dimming background, has a title bar. + IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. + IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. + IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true! + // Popups: open/close functions + // - OpenPopup(): set popup state to open. ImGuiPopupFlags are available for opening options. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - CloseCurrentPopup(): use inside the BeginPopup()/EndPopup() scope to close manually. + // - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). + // - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). + IMGUI_API void OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0); // call to mark popup as open (don't call every frame!). + IMGUI_API void OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // helper to open popup when clicked on last item. return true when just opened. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) + IMGUI_API void CloseCurrentPopup(); // manually close the popup we have begin-ed into. + // Popups: open+begin combined functions helpers + // - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. + // - They are convenient to easily create context menus, hence the name. + // - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. + // - IMPORTANT: we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. + IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! + IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. + IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked in void (where there are no windows). + // Popups: test function + // - IsPopupOpen(): return true if the popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId: return true if any popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId + ImGuiPopupFlags_AnyPopupLevel: return true if any popup is open. + IMGUI_API bool IsPopupOpen(const char* str_id, ImGuiPopupFlags flags = 0); // return true if the popup is open. - // Columns + // Tables + // [BETA API] API may evolve slightly! If you use this, please update to the next version when it comes out! + // - Full-featured replacement for old Columns API. + // - See Demo->Tables for demo code. + // - See top of imgui_tables.cpp for general commentary. + // - See ImGuiTableFlags_ and ImGuiTableColumnFlags_ enums for a description of available flags. + // The typical call flow is: + // - 1. Call BeginTable(). + // - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults. + // - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows. + // - 4. Optionally call TableHeadersRow() to submit a header row. Names are pulled from TableSetupColumn() data. + // - 5. Populate contents: + // - In most situations you can use TableNextRow() + TableSetColumnIndex(N) to start appending into a column. + // - If you are using tables as a sort of grid, where every columns is holding the same type of contents, + // you may prefer using TableNextColumn() instead of TableNextRow() + TableSetColumnIndex(). + // TableNextColumn() will automatically wrap-around into the next row if needed. + // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! + // - Summary of possible call flow: + // -------------------------------------------------------------------------------------------------------- + // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK + // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK + // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! + // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! + // -------------------------------------------------------------------------------------------------------- + // - 5. Call EndTable() + IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); + IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! + IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. + IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible. + IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return true when column is visible. + // Tables: Headers & Columns declaration + // - Use TableSetupColumn() to specify label, resizing policy, default width/weight, id, various other flags etc. + // - Use TableHeadersRow() to create a header row and automatically submit a TableHeader() for each column. + // Headers are required to perform: reordering, sorting, and opening the context menu. + // The context menu can also be made available in columns body using ImGuiTableFlags_ContextMenuInBody. + // - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in + // some advanced use cases (e.g. adding custom widgets in header row). + // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); + IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu + IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) + // Tables: Sorting + // - Call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. + // - When 'SpecsDirty == true' you should sort your data. It will be true when sorting specs have changed + // since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, else you may + // wastefully sort your data every frame! + // - Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable(). + IMGUI_API ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting). + // Tables: Miscellaneous functions + // - Functions args 'int column_n' treat the default value of -1 as the same as passing the current column index. + IMGUI_API int TableGetColumnCount(); // return number of columns (value passed to BeginTable) + IMGUI_API int TableGetColumnIndex(); // return current column index. + IMGUI_API int TableGetRowIndex(); // return current row index. + IMGUI_API const char* TableGetColumnName(int column_n = -1); // return "" if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column. + IMGUI_API ImGuiTableColumnFlags TableGetColumnFlags(int column_n = -1); // return column flags so you can query their Enabled/Visible/Sorted/Hovered status flags. Pass -1 to use current column. + IMGUI_API void TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n = -1); // change the color of a cell, row, or column. See ImGuiTableBgTarget_ flags for details. + + // Legacy Columns API (2020: prefer using Tables!) // - You can also use SameLine(pos_x) to mimic simplified columns. - // - The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!) IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished IMGUI_API int GetColumnIndex(); // get current column index @@ -575,11 +737,11 @@ namespace ImGui IMGUI_API int GetColumnsCount(); // Tab Bars, Tabs - // [BETA API] API may evolve! IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true! - IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0);// create a Tab. Returns true if the Tab is selected. + IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected. IMGUI_API void EndTabItem(); // only call EndTabItem() if BeginTabItem() returns true! + IMGUI_API bool TabItemButton(const char* label, ImGuiTabItemFlags flags = 0); // create a Tab behaving like a button. return true when clicked. cannot be selected in the tab bar. IMGUI_API void SetTabItemClosed(const char* tab_or_docked_window_label); // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name. // Logging/Capture @@ -590,10 +752,14 @@ namespace ImGui IMGUI_API void LogFinish(); // stop logging (close file, etc.) IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed) + IMGUI_API void LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); // Drag and Drop - // [BETA API] API may evolve! - IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource() + // - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource(). + // - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget(). + // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725) + // - An item can be both drag source and drop target. + IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource() IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true! IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() @@ -602,6 +768,7 @@ namespace ImGui IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. // Clipping + // - Mouse hovering is affected by ImGui::PushClipRect() calls, unlike direct calls to ImDrawList::PushClipRect() which are render only. IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); IMGUI_API void PopClipRect(); @@ -611,17 +778,18 @@ namespace ImGui IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. // Item/Widgets Utilities - // - Most of the functions are referring to the last/previous item we submitted. + // - Most of the functions are referring to the previous Item that has been submitted. // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options. IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false) IMGUI_API bool IsItemFocused(); // is the last item focused for keyboard/gamepad navigation? - IMGUI_API bool IsItemClicked(int mouse_button = 0); // is the last item clicked? (e.g. button/node just clicked on) == IsMouseClicked(mouse_button) && IsItemHovered() + IMGUI_API bool IsItemClicked(ImGuiMouseButton mouse_button = 0); // is the last item hovered and mouse clicked on? (**) == IsMouseClicked(mouse_button) && IsItemHovered()Important. (**) this it NOT equivalent to the behavior of e.g. Button(). Read comments in function definition. IMGUI_API bool IsItemVisible(); // is the last item visible? (items may be out of sight because of clipping/scrolling) IMGUI_API bool IsItemEdited(); // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets. IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive). IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing. IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item). + IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode(). IMGUI_API bool IsAnyItemHovered(); // is any item hovered? IMGUI_API bool IsAnyItemActive(); // is any item active? IMGUI_API bool IsAnyItemFocused(); // is any item focused? @@ -630,6 +798,12 @@ namespace ImGui IMGUI_API ImVec2 GetItemRectSize(); // get size of last item IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. + // Viewports + // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. + // - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. + // - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. + IMGUI_API ImGuiViewport* GetMainViewport(); // return primary/default viewport. + // Miscellaneous Utilities IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped. IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side. @@ -641,41 +815,51 @@ namespace ImGui IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) IMGUI_API ImGuiStorage* GetStateStorage(); - IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can. IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) + // Text Utilities + IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + // Color Utilities IMGUI_API ImVec4 ColorConvertU32ToFloat4(ImU32 in); IMGUI_API ImU32 ColorConvertFloat4ToU32(const ImVec4& in); IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); - // Inputs Utilities + // Inputs Utilities: Keyboard + // - For 'int user_key_index' you can use your own indices/enums according to how your backend/engine stored them in io.KeysDown[]. + // - We don't know the meaning of those value. You can use GetKeyIndex() to map a ImGuiKey_ value into the user index. IMGUI_API int GetKeyIndex(ImGuiKey imgui_key); // map ImGuiKey_* values into user's key index. == io.KeyMap[key] - IMGUI_API bool IsKeyDown(int user_key_index); // is key being held. == io.KeysDown[user_key_index]. note that imgui doesn't know the semantic of each entry of io.KeysDown[]. Use your own indices/enums according to how your backend/engine stored them into io.KeysDown[]! - IMGUI_API bool IsKeyPressed(int user_key_index, bool repeat = true); // was key pressed (went from !Down to Down). if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate - IMGUI_API bool IsKeyReleased(int user_key_index); // was key released (went from Down to !Down).. + IMGUI_API bool IsKeyDown(int user_key_index); // is key being held. == io.KeysDown[user_key_index]. + IMGUI_API bool IsKeyPressed(int user_key_index, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate + IMGUI_API bool IsKeyReleased(int user_key_index); // was key released (went from Down to !Down)? IMGUI_API int GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate - IMGUI_API bool IsMouseDown(int button); // is mouse button held (0=left, 1=right, 2=middle) - IMGUI_API bool IsAnyMouseDown(); // is any mouse button held - IMGUI_API bool IsMouseClicked(int button, bool repeat = false); // did mouse button clicked (went from !Down to Down) (0=left, 1=right, 2=middle) - IMGUI_API bool IsMouseDoubleClicked(int button); // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime. - IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down) - IMGUI_API bool IsMouseDragging(int button = 0, float lock_threshold = -1.0f); // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold - IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true); // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block. - IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse - IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls - IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse position at the time of opening popup we have BeginPopup() into - IMGUI_API ImVec2 GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once. If lock_threshold < -1.0f uses io.MouseDraggingThreshold. - IMGUI_API void ResetMouseDragDelta(int button = 0); // - IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you - IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type IMGUI_API void CaptureKeyboardFromApp(bool want_capture_keyboard_value = true); // attention: misleading name! manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard_value"; after the next NewFrame() call. + + // Inputs Utilities: Mouse + // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. + // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. + // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold') + IMGUI_API bool IsMouseDown(ImGuiMouseButton button); // is mouse button held? + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down) + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down) + IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? (note that a double-click will also report IsMouseClicked() == true) + IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block. + IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available + IMGUI_API bool IsAnyMouseDown(); // is any mouse button held? + IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls + IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) + IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // + IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you + IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired cursor type IMGUI_API void CaptureMouseFromApp(bool want_capture_mouse_value = true); // attention: misleading name! manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse_value;" after the next NewFrame() call. - // Clipboard Utilities (also see the LogToClipboard() function to capture or output text data to the clipboard) + // Clipboard Utilities + // - Also see the LogToClipboard() function to capture GUI into clipboard, or easily output text data to the clipboard. IMGUI_API const char* GetClipboardText(); IMGUI_API void SetClipboardText(const char* text); @@ -687,17 +871,22 @@ namespace ImGui IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename); // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext). IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. + // Debug Utilities + IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. + // Memory Allocators - // - All those functions are not reliant on the current context. - // - If you reload the contents of imgui.cpp at runtime, you may need to call SetCurrentContext() + SetAllocatorFunctions() again because we use global storage for those. - IMGUI_API void SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data = NULL); + // - Those functions are not reliant on the current context. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. + IMGUI_API void SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data = NULL); + IMGUI_API void GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data); IMGUI_API void* MemAlloc(size_t size); IMGUI_API void MemFree(void* ptr); } // namespace ImGui //----------------------------------------------------------------------------- -// Flags & Enumerations +// [SECTION] Flags & Enumerations //----------------------------------------------------------------------------- // Flags for ImGui::Begin() @@ -737,8 +926,7 @@ enum ImGuiWindowFlags_ ImGuiWindowFlags_ChildMenu = 1 << 28 // Don't use! For internal use by BeginMenu() // [Obsolete] - //ImGuiWindowFlags_ShowBorders = 1 << 7, // --> Set style.FrameBorderSize=1.0f / style.WindowBorderSize=1.0f to enable borders around windows and items - //ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // --> Set io.ConfigWindowsResizeFromEdges and make sure mouse cursors are supported by back-end (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) + //ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // --> Set io.ConfigWindowsResizeFromEdges=true and make sure mouse cursors are supported by backend (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) }; // Flags for ImGui::InputText() @@ -758,14 +946,21 @@ enum ImGuiInputTextFlags_ ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally - ImGuiInputTextFlags_AlwaysInsertMode = 1 << 13, // Insert mode + ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) + ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) // [Internal] - ImGuiInputTextFlags_Multiline = 1 << 20 // For internal use by InputTextMultiline() + ImGuiInputTextFlags_Multiline = 1 << 20, // For internal use by InputTextMultiline() + ImGuiInputTextFlags_NoMarkEdited = 1 << 21 // For internal use by functions using InputText() before reformatting data + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior +#endif }; // Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*() @@ -773,7 +968,7 @@ enum ImGuiTreeNodeFlags_ { ImGuiTreeNodeFlags_None = 0, ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected - ImGuiTreeNodeFlags_Framed = 1 << 1, // Full colored frame (e.g. for CollapsingHeader) + ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) @@ -783,15 +978,34 @@ enum ImGuiTreeNodeFlags_ ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). - //ImGuiTreeNodeFlags_SpanAllAvailWidth = 1 << 11, // FIXME: TODO: Extend hit box horizontally even if not framed - //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 12, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible + ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. + ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) + //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog +}; - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiTreeNodeFlags_AllowOverlapMode = ImGuiTreeNodeFlags_AllowItemOverlap -#endif +// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. +// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat +// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. +// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. +// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. +// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter +// and want to another another flag, you need to pass in the ImGuiPopupFlags_MouseButtonRight flag. +// - Multiple buttons currently cannot be combined/or-ed in those functions (we could allow it later). +enum ImGuiPopupFlags_ +{ + ImGuiPopupFlags_None = 0, + ImGuiPopupFlags_MouseButtonLeft = 0, // For BeginPopupContext*(): open on Left Mouse release. Guaranteed to always be == 0 (same as ImGuiMouseButton_Left) + ImGuiPopupFlags_MouseButtonRight = 1, // For BeginPopupContext*(): open on Right Mouse release. Guaranteed to always be == 1 (same as ImGuiMouseButton_Right) + ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) + ImGuiPopupFlags_MouseButtonMask_ = 0x1F, + ImGuiPopupFlags_MouseButtonDefault_ = 1, + ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack + ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space + ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. + ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) + ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel }; // Flags for ImGui::Selectable() @@ -801,7 +1015,8 @@ enum ImGuiSelectableFlags_ ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too - ImGuiSelectableFlags_Disabled = 1 << 3 // Cannot be selected, display greyed out text + ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text + ImGuiSelectableFlags_AllowItemOverlap = 1 << 4 // (WIP) Hit testing to allow subsequent widgets to overlap this one }; // Flags for ImGui::BeginCombo() @@ -824,9 +1039,9 @@ enum ImGuiTabBarFlags_ ImGuiTabBarFlags_None = 0, ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear - ImGuiTabBarFlags_TabListPopupButton = 1 << 2, + ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, + ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit @@ -841,7 +1056,154 @@ enum ImGuiTabItemFlags_ ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. Also: tab is selected on closure and closure is deferred by one frame to allow code to undo it without flicker. ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabItemFlags_NoPushId = 1 << 3 // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab + ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab + ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) + ImGuiTabItemFlags_Trailing = 1 << 7 // Enforce the tab position to the right of the tab bar (before the scrolling buttons) +}; + +// Flags for ImGui::BeginTable() +// [BETA API] API may evolve slightly! If you use this, please update to the next version when it comes out! +// - Important! Sizing policies have complex and subtle side effects, more so than you would expect. +// Read comments/demos carefully + experiment with live demos to get acquainted with them. +// - The DEFAULT sizing policies are: +// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. +// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. +// - When ScrollX is off: +// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. +// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. +// - Fixed Columns will generally obtain their requested width (unless the table cannot fit them all). +// - Stretch Columns will share the remaining width. +// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. +// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). +// - When ScrollX is on: +// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed +// - Columns sizing policy allowed: Fixed/Auto mostly. +// - Fixed Columns can be enlarged as needed. Table will show an horizontal scrollbar if needed. +// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. +// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). +// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. +// - Read on documentation at the top of imgui_tables.cpp for details. +enum ImGuiTableFlags_ +{ + // Features + ImGuiTableFlags_None = 0, + ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. + ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) + ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. + ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. + ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. + ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). + // Decorations + ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) + ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. + ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. + ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. + ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. + ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. + ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. + ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. + ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. + ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. + ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appears in Headers). -> May move to style + ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers). -> May move to style + // Sizing Policy (read above for defaults) + ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. + ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. + ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. + ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). + // Sizing Extra Options + ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. + ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. + ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. + ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. + // Clipping + ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). + // Padding + ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outer-most padding. Generally desirable if you have headers. + ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outer-most padding. + ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). + // Scrolling + ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this create a child window, ScrollY is currently generally recommended when using ScrollX. + ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. + // Sorting + ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). + ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). + + // [Internal] Combinations and masks + ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //, ImGuiTableFlags_ColumnsWidthFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_ColumnsWidthStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2020/12 + //, ImGuiTableFlags_SizingPolicyFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingPolicyStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2021/01 +#endif +}; + +// Flags for ImGui::TableSetupColumn() +enum ImGuiTableColumnFlags_ +{ + // Input configuration flags + ImGuiTableColumnFlags_None = 0, + ImGuiTableColumnFlags_DefaultHide = 1 << 0, // Default as a hidden/disabled column. + ImGuiTableColumnFlags_DefaultSort = 1 << 1, // Default as a sorting column. + ImGuiTableColumnFlags_WidthStretch = 1 << 2, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). + ImGuiTableColumnFlags_WidthFixed = 1 << 3, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). + ImGuiTableColumnFlags_NoResize = 1 << 4, // Disable manual resizing. + ImGuiTableColumnFlags_NoReorder = 1 << 5, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. + ImGuiTableColumnFlags_NoHide = 1 << 6, // Disable ability to hide/disable this column. + ImGuiTableColumnFlags_NoClip = 1 << 7, // Disable clipping for this column (all NoClip columns will render in a same draw command). + ImGuiTableColumnFlags_NoSort = 1 << 8, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). + ImGuiTableColumnFlags_NoSortAscending = 1 << 9, // Disable ability to sort in the ascending direction. + ImGuiTableColumnFlags_NoSortDescending = 1 << 10, // Disable ability to sort in the descending direction. + ImGuiTableColumnFlags_NoHeaderWidth = 1 << 11, // Disable header text width contribution to automatic column width. + ImGuiTableColumnFlags_PreferSortAscending = 1 << 12, // Make the initial sort direction Ascending when first sorting on this column (default). + ImGuiTableColumnFlags_PreferSortDescending = 1 << 13, // Make the initial sort direction Descending when first sorting on this column. + ImGuiTableColumnFlags_IndentEnable = 1 << 14, // Use current Indent value when entering cell (default for column 0). + ImGuiTableColumnFlags_IndentDisable = 1 << 15, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. + + // Output status flags, read-only via TableGetColumnFlags() + ImGuiTableColumnFlags_IsEnabled = 1 << 20, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. + ImGuiTableColumnFlags_IsVisible = 1 << 21, // Status: is visible == is enabled AND not clipped by scrolling. + ImGuiTableColumnFlags_IsSorted = 1 << 22, // Status: is currently part of the sort specs + ImGuiTableColumnFlags_IsHovered = 1 << 23, // Status: is hovered by mouse + + // [Internal] Combinations and masks + ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, + ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, + ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, + ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30 // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //ImGuiTableColumnFlags_WidthAuto = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize, // Column will not stretch and keep resizing based on submitted contents. +#endif +}; + +// Flags for ImGui::TableNextRow() +enum ImGuiTableRowFlags_ +{ + ImGuiTableRowFlags_None = 0, + ImGuiTableRowFlags_Headers = 1 << 0 // Identify header row (set default background color + width of its contents accounted different for auto column width) +}; + +// Enum for ImGui::TableSetBgColor() +// Background colors are rendering in 3 layers: +// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. +// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. +// - Layer 2: draw with CellBg color if set. +// The purpose of the two row/columns layers is to let you decide if a background color changes should override or blend with the existing color. +// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. +// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. +// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. +enum ImGuiTableBgTarget_ +{ + ImGuiTableBgTarget_None = 0, + ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) + ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) + ImGuiTableBgTarget_CellBg = 3 // Set cell background color (top-most color) }; // Flags for ImGui::IsWindowFocused() @@ -850,12 +1212,12 @@ enum ImGuiFocusedFlags_ ImGuiFocusedFlags_None = 0, ImGuiFocusedFlags_ChildWindows = 1 << 0, // IsWindowFocused(): Return true if any children of the window is focused ImGuiFocusedFlags_RootWindow = 1 << 1, // IsWindowFocused(): Test from root window (top most parent of the current hierarchy) - ImGuiFocusedFlags_AnyWindow = 1 << 2, // IsWindowFocused(): Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use ImGui::GetIO().WantCaptureMouse instead. + ImGuiFocusedFlags_AnyWindow = 1 << 2, // IsWindowFocused(): Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use 'io.WantCaptureMouse' instead! Please read the FAQ! ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows }; // Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered() -// Note: if you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that. Please read the FAQ! +// Note: if you are trying to check whether your mouse should be dispatched to Dear ImGui or to your app, you should use 'io.WantCaptureMouse' instead! Please read the FAQ! // Note: windows with the ImGuiWindowFlags_NoInputs flag are ignored by IsWindowHovered() calls. enum ImGuiHoveredFlags_ { @@ -866,7 +1228,7 @@ enum ImGuiHoveredFlags_ ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 3, // Return true even if a popup window is normally blocking access to this item/window //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 4, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 5, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. - ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 6, // Return true even if the position is overlapped by another window + ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 6, // Return true even if the position is obstructed or overlapped by another window ImGuiHoveredFlags_AllowWhenDisabled = 1 << 7, // Return true even if the item is disabled ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows @@ -881,7 +1243,7 @@ enum ImGuiDragDropFlags_ ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item. ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item. ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit. - ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. + ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged) // AcceptDragDropPayload() flags ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered. @@ -897,7 +1259,7 @@ enum ImGuiDragDropFlags_ // A primary data type enum ImGuiDataType_ { - ImGuiDataType_S8, // char + ImGuiDataType_S8, // signed char / char (with sensible compilers) ImGuiDataType_U8, // unsigned char ImGuiDataType_S16, // short ImGuiDataType_U16, // unsigned short @@ -921,6 +1283,14 @@ enum ImGuiDir_ ImGuiDir_COUNT }; +// A sorting direction +enum ImGuiSortDirection_ +{ + ImGuiSortDirection_None = 0, + ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc. + ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. +}; + // User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array enum ImGuiKey_ { @@ -939,27 +1309,38 @@ enum ImGuiKey_ ImGuiKey_Space, ImGuiKey_Enter, ImGuiKey_Escape, - ImGuiKey_A, // for text edit CTRL+A: select all - ImGuiKey_C, // for text edit CTRL+C: copy - ImGuiKey_V, // for text edit CTRL+V: paste - ImGuiKey_X, // for text edit CTRL+X: cut - ImGuiKey_Y, // for text edit CTRL+Y: redo - ImGuiKey_Z, // for text edit CTRL+Z: undo + ImGuiKey_KeyPadEnter, + ImGuiKey_A, // for text edit CTRL+A: select all + ImGuiKey_C, // for text edit CTRL+C: copy + ImGuiKey_V, // for text edit CTRL+V: paste + ImGuiKey_X, // for text edit CTRL+X: cut + ImGuiKey_Y, // for text edit CTRL+Y: redo + ImGuiKey_Z, // for text edit CTRL+Z: undo ImGuiKey_COUNT }; -// Gamepad/Keyboard directional navigation +// To test io.KeyMods (which is a combination of individual fields io.KeyCtrl, io.KeyShift, io.KeyAlt set by user/backend) +enum ImGuiKeyModFlags_ +{ + ImGuiKeyModFlags_None = 0, + ImGuiKeyModFlags_Ctrl = 1 << 0, + ImGuiKeyModFlags_Shift = 1 << 1, + ImGuiKeyModFlags_Alt = 1 << 2, + ImGuiKeyModFlags_Super = 1 << 3 +}; + +// Gamepad/Keyboard navigation // Keyboard: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. NewFrame() will automatically fill io.NavInputs[] based on your io.KeysDown[] + io.KeyMap[] arrays. -// Gamepad: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. Back-end: set ImGuiBackendFlags_HasGamepad and fill the io.NavInputs[] fields before calling NewFrame(). Note that io.NavInputs[] is cleared by EndFrame(). -// Read instructions in imgui.cpp for more details. Download PNG/PSD at http://goo.gl/9LgVZW. +// Gamepad: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. Backend: set ImGuiBackendFlags_HasGamepad and fill the io.NavInputs[] fields before calling NewFrame(). Note that io.NavInputs[] is cleared by EndFrame(). +// Read instructions in imgui.cpp for more details. Download PNG/PSD at http://dearimgui.org/controls_sheets. enum ImGuiNavInput_ { // Gamepad Mapping - ImGuiNavInput_Activate, // activate / open / toggle / tweak value // e.g. Bottom Face Button on all consoles, (Cross(X), A), Space ( Keyboard ) - ImGuiNavInput_Cancel, // cancel / close / exit // e.g. Right Face Button on all consoles, (Circle, B), Escape ( Keyboard ) - ImGuiNavInput_Input, // text input / on-screen keyboard // e.g. Top Face Button on all consoles, (Triangle, B), Return ( Keyboard ) - ImGuiNavInput_Menu, // tap: toggle menu / hold: focus, move, resize // e.g. Left Face Button on all consoles, (Square, B), Alt ( Keyboard ) - ImGuiNavInput_DpadLeft, // move / tweak / resize window (w/ PadMenu) // e.g. D-pad Left/Right/Up/Down (Gamepads), Arrow keys (Keyboard) + ImGuiNavInput_Activate, // activate / open / toggle / tweak value // e.g. Cross (), A (), A (), Space (Keyboard) + ImGuiNavInput_Cancel, // cancel / close / exit // e.g. Circle (), B (), B (), Escape (Keyboard) + ImGuiNavInput_Input, // text input / on-screen keyboard // e.g. Triangle(), Y (), X (), Return (Keyboard) + ImGuiNavInput_Menu, // tap: toggle menu / hold: focus, move, resize // e.g. Square (), X (), Y (), Alt (Keyboard) + ImGuiNavInput_DpadLeft, // move / tweak / resize window (w/ PadMenu) // e.g. D-pad Left/Right/Up/Down (Gamepads), Arrow keys (Keyboard) ImGuiNavInput_DpadRight, // ImGuiNavInput_DpadUp, // ImGuiNavInput_DpadDown, // @@ -967,15 +1348,14 @@ enum ImGuiNavInput_ ImGuiNavInput_LStickRight, // ImGuiNavInput_LStickUp, // ImGuiNavInput_LStickDown, // - ImGuiNavInput_FocusPrev, // next window (w/ PadMenu) // e.g. L1 or L2 (Console) - ImGuiNavInput_FocusNext, // prev window (w/ PadMenu) // e.g. R1 or R2 (Console) - ImGuiNavInput_TweakSlow, // slower tweaks // e.g. L1 or L2 (Console) - ImGuiNavInput_TweakFast, // faster tweaks // e.g. R1 or R2 (Console) + ImGuiNavInput_FocusPrev, // next window (w/ PadMenu) // e.g. L1 or L2 (), LB or LT (), L or ZL () + ImGuiNavInput_FocusNext, // prev window (w/ PadMenu) // e.g. R1 or R2 (), RB or RT (), R or ZL () + ImGuiNavInput_TweakSlow, // slower tweaks // e.g. L1 or L2 (), LB or LT (), L or ZL () + ImGuiNavInput_TweakFast, // faster tweaks // e.g. R1 or R2 (), RB or RT (), R or ZL () // [Internal] Don't use directly! This is used internally to differentiate keyboard from gamepad inputs for behaviors that require to differentiate them. // Keyboard behavior that have no corresponding gamepad mapping (e.g. CTRL+TAB) will be directly reading from io.KeysDown[] instead of io.NavInputs[]. ImGuiNavInput_KeyMenu_, // toggle menu // = io.KeyAlt - ImGuiNavInput_KeyTab_, // tab // = Tab key ImGuiNavInput_KeyLeft_, // move left // = Arrow keys ImGuiNavInput_KeyRight_, // move right ImGuiNavInput_KeyUp_, // move up @@ -989,24 +1369,25 @@ enum ImGuiConfigFlags_ { ImGuiConfigFlags_None = 0, ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. NewFrame() will automatically fill io.NavInputs[] based on io.KeysDown[]. - ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. This is mostly to instruct your imgui back-end to fill io.NavInputs[]. Back-end also needs to set ImGuiBackendFlags_HasGamepad. - ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your binding, otherwise ImGui will react as if the mouse is jumping around back and forth. + ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. This is mostly to instruct your imgui backend to fill io.NavInputs[]. Backend also needs to set ImGuiBackendFlags_HasGamepad. + ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your backend, otherwise ImGui will react as if the mouse is jumping around back and forth. ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set. - ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the back-end. - ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct back-end to not alter mouse cursor shape and visibility. Use if the back-end cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead. + ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the backend. + ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct backend to not alter mouse cursor shape and visibility. Use if the backend cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead. - // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core ImGui) + // User storage (to allow your backend/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core Dear ImGui) ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware. ImGuiConfigFlags_IsTouchScreen = 1 << 21 // Application is using a touch screen instead of a mouse. }; -// Back-end capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom back-end. +// Backend capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom backend. enum ImGuiBackendFlags_ { ImGuiBackendFlags_None = 0, - ImGuiBackendFlags_HasGamepad = 1 << 0, // Back-end supports gamepad and currently has one connected. - ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Back-end supports honoring GetMouseCursor() value to change the OS cursor shape. - ImGuiBackendFlags_HasSetMousePos = 1 << 2 // Back-end supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). + ImGuiBackendFlags_HasGamepad = 1 << 0, // Backend Platform supports gamepad and currently has one connected. + ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape. + ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). + ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3 // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices. }; // Enumeration for PushStyleColor() / PopStyleColor() @@ -1036,7 +1417,7 @@ enum ImGuiCol_ ImGuiCol_Button, ImGuiCol_ButtonHovered, ImGuiCol_ButtonActive, - ImGuiCol_Header, + ImGuiCol_Header, // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem ImGuiCol_HeaderHovered, ImGuiCol_HeaderActive, ImGuiCol_Separator, @@ -1054,6 +1435,11 @@ enum ImGuiCol_ ImGuiCol_PlotLinesHovered, ImGuiCol_PlotHistogram, ImGuiCol_PlotHistogramHovered, + ImGuiCol_TableHeaderBg, // Table header background + ImGuiCol_TableBorderStrong, // Table outer and header borders (prefer using Alpha=1.0 here) + ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here) + ImGuiCol_TableRowBg, // Table row background (even rows) + ImGuiCol_TableRowBgAlt, // Table row background (odd rows) ImGuiCol_TextSelectedBg, ImGuiCol_DragDropTarget, ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item @@ -1061,20 +1447,15 @@ enum ImGuiCol_ ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active ImGuiCol_COUNT - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiCol_ModalWindowDarkening = ImGuiCol_ModalWindowDimBg // [renamed in 1.63] - , ImGuiCol_ChildWindowBg = ImGuiCol_ChildBg // [renamed in 1.53] - , ImGuiCol_Column = ImGuiCol_Separator, ImGuiCol_ColumnHovered = ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive = ImGuiCol_SeparatorActive // [renamed in 1.51] - //ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered, // [unused since 1.60+] the close button now uses regular button colors. - //ImGuiCol_ComboBg, // [unused since 1.53+] ComboBg has been merged with PopupBg, so a redirect isn't accurate. -#endif }; // Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. -// NB: the enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. During initialization, feel free to just poke into ImGuiStyle directly. -// NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. +// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. +// During initialization or between frames, feel free to just poke into ImGuiStyle directly. +// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. +// In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. enum ImGuiStyleVar_ { // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) @@ -1094,6 +1475,7 @@ enum ImGuiStyleVar_ ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing ImGuiStyleVar_IndentSpacing, // float IndentSpacing + ImGuiStyleVar_CellPadding, // ImVec2 CellPadding ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding ImGuiStyleVar_GrabMinSize, // float GrabMinSize @@ -1102,11 +1484,19 @@ enum ImGuiStyleVar_ ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign ImGuiStyleVar_COUNT +}; - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiStyleVar_Count_ = ImGuiStyleVar_COUNT, ImGuiStyleVar_ChildWindowRounding = ImGuiStyleVar_ChildRounding -#endif +// Flags for InvisibleButton() [extended in imgui_internal.h] +enum ImGuiButtonFlags_ +{ + ImGuiButtonFlags_None = 0, + ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default) + ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button + ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button + + // [Internal] + ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, + ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft }; // Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() @@ -1114,14 +1504,15 @@ enum ImGuiColorEditFlags_ { ImGuiColorEditFlags_None = 0, ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer). - ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on colored square. + ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on color square. ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview. - ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs) - ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview colored square). + ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable color square preview next to the inputs. (e.g. to show only the inputs) + ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview color square). ImGuiColorEditFlags_NoTooltip = 1 << 6, // // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview. ImGuiColorEditFlags_NoLabel = 1 << 7, // // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker). - ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead. + ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small color square preview instead. ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source. + ImGuiColorEditFlags_NoBorder = 1 << 10, // // ColorButton: disable border (which is enforced by default) // User Options (right-click on widget to change some of them). ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. @@ -1140,80 +1531,104 @@ enum ImGuiColorEditFlags_ // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup. - ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_DisplayRGB|ImGuiColorEditFlags_InputRGB|ImGuiColorEditFlags_PickerHueBar, + ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, // [Internal] Masks - ImGuiColorEditFlags__DisplayMask = ImGuiColorEditFlags_DisplayRGB|ImGuiColorEditFlags_DisplayHSV|ImGuiColorEditFlags_DisplayHex, - ImGuiColorEditFlags__DataTypeMask = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_Float, - ImGuiColorEditFlags__PickerMask = ImGuiColorEditFlags_PickerHueWheel|ImGuiColorEditFlags_PickerHueBar, - ImGuiColorEditFlags__InputMask = ImGuiColorEditFlags_InputRGB|ImGuiColorEditFlags_InputHSV + ImGuiColorEditFlags__DisplayMask = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, + ImGuiColorEditFlags__DataTypeMask = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, + ImGuiColorEditFlags__PickerMask = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, + ImGuiColorEditFlags__InputMask = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV // Obsolete names (will be removed) #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex + , ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69] #endif }; +// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. +// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. +enum ImGuiSliderFlags_ +{ + ImGuiSliderFlags_None = 0, + ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds. + ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits. + ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits) + ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget + ImGuiSliderFlags_InvalidMask_ = 0x7000000F // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp // [renamed in 1.79] +#endif +}; + +// Identify a mouse button. +// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience. +enum ImGuiMouseButton_ +{ + ImGuiMouseButton_Left = 0, + ImGuiMouseButton_Right = 1, + ImGuiMouseButton_Middle = 2, + ImGuiMouseButton_COUNT = 5 +}; + // Enumeration for GetMouseCursor() -// User code may request binding to display given cursor by calling SetMouseCursor(), which is why we have some cursors that are marked unused here +// User code may request backend to display given cursor by calling SetMouseCursor(), which is why we have some cursors that are marked unused here enum ImGuiMouseCursor_ { ImGuiMouseCursor_None = -1, ImGuiMouseCursor_Arrow = 0, ImGuiMouseCursor_TextInput, // When hovering over InputText, etc. - ImGuiMouseCursor_ResizeAll, // (Unused by imgui functions) + ImGuiMouseCursor_ResizeAll, // (Unused by Dear ImGui functions) ImGuiMouseCursor_ResizeNS, // When hovering over an horizontal border ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window - ImGuiMouseCursor_Hand, // (Unused by imgui functions. Use for e.g. hyperlinks) + ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks) + ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle. ImGuiMouseCursor_COUNT - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiMouseCursor_Count_ = ImGuiMouseCursor_COUNT -#endif }; -// Enumateration for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions +// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions // Represent a condition. // Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. enum ImGuiCond_ { - ImGuiCond_Always = 1 << 0, // Set the variable - ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call with succeed) + ImGuiCond_None = 0, // No condition (always set the variable), same as _Always + ImGuiCond_Always = 1 << 0, // No condition (always set the variable) + ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call will succeed) ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the object/window has no persistently saved data (no entry in .ini file) ImGuiCond_Appearing = 1 << 3 // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - , ImGuiSetCond_Always = ImGuiCond_Always, ImGuiSetCond_Once = ImGuiCond_Once, ImGuiSetCond_FirstUseEver = ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing = ImGuiCond_Appearing -#endif }; //----------------------------------------------------------------------------- -// Helpers: Memory allocations macros -// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() -// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. -// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions. +// [SECTION] Helpers: Memory allocations macros, ImVector<> //----------------------------------------------------------------------------- -struct ImNewDummy {}; -inline void* operator new(size_t, ImNewDummy, void* ptr) { return ptr; } -inline void operator delete(void*, ImNewDummy, void*) {} // This is only required so we can use the symmetrical new() +//----------------------------------------------------------------------------- +// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() +// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. +// Defining a custom placement new() with a custom parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions. +//----------------------------------------------------------------------------- + +struct ImNewWrapper {}; +inline void* operator new(size_t, ImNewWrapper, void* ptr) { return ptr; } +inline void operator delete(void*, ImNewWrapper, void*) {} // This is only required so we can use the symmetrical new() #define IM_ALLOC(_SIZE) ImGui::MemAlloc(_SIZE) #define IM_FREE(_PTR) ImGui::MemFree(_PTR) -#define IM_PLACEMENT_NEW(_PTR) new(ImNewDummy(), _PTR) -#define IM_NEW(_TYPE) new(ImNewDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE +#define IM_PLACEMENT_NEW(_PTR) new(ImNewWrapper(), _PTR) +#define IM_NEW(_TYPE) new(ImNewWrapper(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE template<typename T> void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } } //----------------------------------------------------------------------------- -// Helper: ImVector<> +// ImVector<> // Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug). -// You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our data structures are relying on it. -// Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs. -// Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that, -// do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset. +//----------------------------------------------------------------------------- +// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it. +// - We use std-like naming convention here, which is a little unusual for this codebase. +// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs. +// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that, +// Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset. //----------------------------------------------------------------------------- template<typename T> @@ -1237,9 +1652,10 @@ struct ImVector inline bool empty() const { return Size == 0; } inline int size() const { return Size; } inline int size_in_bytes() const { return Size * (int)sizeof(T); } + inline int max_size() const { return 0x7FFFFFFF / (int)sizeof(T); } inline int capacity() const { return Capacity; } - inline T& operator[](int i) { IM_ASSERT(i < Size); return Data[i]; } - inline const T& operator[](int i) const { IM_ASSERT(i < Size); return Data[i]; } + inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } + inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } inline void clear() { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } } inline T* begin() { return Data; } @@ -1252,25 +1668,31 @@ struct ImVector inline const T& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; } inline void swap(ImVector<T>& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } - inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > sz ? new_capacity : sz; } + inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; } inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } inline void resize(int new_size, const T& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; } + inline void shrink(int new_size) { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation inline void reserve(int new_capacity) { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; } // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden. inline void push_back(const T& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; } inline void pop_back() { IM_ASSERT(Size > 0); Size--; } inline void push_front(const T& v) { if (Size == 0) push_back(v); else insert(Data, v); } - inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; } - inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data+Size && it_last > it && it_last <= Data+Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - count) * sizeof(T)); Size -= (int)count; return Data + off; } - inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; if (it < Data+Size-1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; } - inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; } + inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; } + inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data + Size && it_last > it && it_last <= Data + Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - count) * sizeof(T)); Size -= (int)count; return Data + off; } + inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; if (it < Data + Size - 1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; } + inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; } inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } - inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; return (int)off; } + inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } + inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } }; //----------------------------------------------------------------------------- -// ImGuiStyle +// [SECTION] ImGuiStyle +//----------------------------------------------------------------------------- // You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame(). // During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, // and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors. @@ -1278,12 +1700,13 @@ struct ImVector struct ImGuiStyle { - float Alpha; // Global alpha applies to everything in ImGui. + float Alpha; // Global alpha applies to everything in Dear ImGui. ImVec2 WindowPadding; // Padding within a window. - float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. + float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints(). ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered. + ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left. float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows. float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). float PopupRounding; // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding) @@ -1293,23 +1716,29 @@ struct ImGuiStyle float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). + ImVec2 CellPadding; // Padding within a table cell ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. + float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar. float ScrollbarRounding; // Radius of grab corners for scrollbar. float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar. float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + float LogSliderDeadzone; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. float TabBorderSize; // Thickness of border around tabs. + float TabMinWidthForCloseButton; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). - ImVec2 SelectableTextAlign; // Alignment of selectable text when selectable is larger than text. Defaults to (0.0f, 0.0f) (top-left aligned). - ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. + ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - bool AntiAliasedLines; // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU. - bool AntiAliasedFill; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.) + bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering. Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. ImVec4 Colors[ImGuiCol_COUNT]; IMGUI_API ImGuiStyle(); @@ -1317,7 +1746,8 @@ struct ImGuiStyle }; //----------------------------------------------------------------------------- -// ImGuiIO +// [SECTION] ImGuiIO +//----------------------------------------------------------------------------- // Communicate most settings and inputs/outputs to Dear ImGui using this structure. // Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. //----------------------------------------------------------------------------- @@ -1329,8 +1759,8 @@ struct ImGuiIO //------------------------------------------------------------------ ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc. - ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by back-end (imgui_impl_xxx files or custom back-end) to communicate features supported by the back-end. - ImVec2 DisplaySize; // <unset> // Main display size, in pixels. + ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend. + ImVec2 DisplaySize; // <unset> // Main display size, in pixels (generally == GetMainViewport()->Size) float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. const char* IniFilename; // = "imgui.ini" // Path to .ini file. Set NULL to disable automatic .ini loading/saving, if e.g. you want to manually load/save from memory. @@ -1343,30 +1773,32 @@ struct ImGuiIO float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. void* UserData; // = NULL // Store your own data for retrieval by callbacks. - ImFontAtlas*Fonts; // <auto> // Load, rasterize and pack one or more fonts into a single texture. + ImFontAtlas*Fonts; // <auto> // Font atlas: load, rasterize and pack one or more fonts into a single texture. float FontGlobalScale; // = 1.0f // Global scale all fonts bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel. ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale. // Miscellaneous options - bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by back-end implementations. - bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl (was called io.OptMacOSXBehaviors prior to 1.63) - bool ConfigInputTextCursorBlink; // = true // Set to false to disable blinking cursor, for users who consider it distracting. (was called: io.OptCursorBlink prior to 1.63) + bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. + bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. + bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). + bool ConfigDragClickToInputText; // = false // [BETA] Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). Not desirable on devices without a keyboard. bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag) - bool ConfigWindowsMoveFromTitleBarOnly; // = false // [BETA] Set to true to only allow moving windows when clicked+dragged from the title bar. Windows without a title bar are not affected. + bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. + float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. //------------------------------------------------------------------ // Platform Functions - // (the imgui_impl_xxxx back-end files are setting those up for you) + // (the imgui_impl_xxxx backend files are setting those up for you) //------------------------------------------------------------------ - // Optional: Platform/Renderer back-end name (informational only! will be displayed in About Window) + User data for back-end/wrappers to store their own stuff. + // Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff. const char* BackendPlatformName; // = NULL const char* BackendRendererName; // = NULL - void* BackendPlatformUserData; // = NULL - void* BackendRendererUserData; // = NULL - void* BackendLanguageUserData; // = NULL + void* BackendPlatformUserData; // = NULL // User data for platform backend + void* BackendRendererUserData; // = NULL // User data for renderer backend + void* BackendLanguageUserData; // = NULL // User data for non C++ programming language backend // Optional: Access OS clipboard // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures) @@ -1379,23 +1811,14 @@ struct ImGuiIO void (*ImeSetInputScreenPosFn)(int x, int y); void* ImeWindowHandle; // = NULL // (Windows) Set this to your HWND to get automatic IME cursor positioning. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - // [OBSOLETE since 1.60+] Rendering function, will be automatically called in Render(). Please call your rendering function yourself now! - // You can obtain the ImDrawData* by calling ImGui::GetDrawData() after Render(). See example applications if you are unsure of how to implement this. - void (*RenderDrawListsFn)(ImDrawData* data); -#else - // This is only here to keep ImGuiIO the same size/layout, so that IMGUI_DISABLE_OBSOLETE_FUNCTIONS can exceptionally be used outside of imconfig.h. - void* RenderDrawListsFnUnused; -#endif - //------------------------------------------------------------------ // Input - Fill before calling NewFrame() //------------------------------------------------------------------ - ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.) - bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. + ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.) + bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text. - float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all back-ends. + float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all backends. bool KeyCtrl; // Keyboard modifier pressed: Control bool KeyShift; // Keyboard modifier pressed: Shift bool KeyAlt; // Keyboard modifier pressed: Alt @@ -1404,22 +1827,25 @@ struct ImGuiIO float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame(). // Functions - IMGUI_API void AddInputCharacter(ImWchar c); // Queue new character input + IMGUI_API void AddInputCharacter(unsigned int c); // Queue new character input + IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue new character input from an UTF-16 character, it can be a surrogate IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue new characters input from an UTF-8 string IMGUI_API void ClearInputCharacters(); // Clear the text input buffer manually //------------------------------------------------------------------ - // Output - Retrieve after calling NewFrame() + // Output - Updated by NewFrame() or EndFrame()/Render() + // (when reading from the io.WantCaptureMouse, io.WantCaptureKeyboard flags to dispatch your inputs, it is + // generally easier and more correct to use their state BEFORE calling NewFrame(). See FAQ for details!) //------------------------------------------------------------------ - bool WantCaptureMouse; // When io.WantCaptureMouse is true, imgui will use the mouse inputs, do not dispatch them to your main game/application (in both cases, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). - bool WantCaptureKeyboard; // When io.WantCaptureKeyboard is true, imgui will use the keyboard inputs, do not dispatch them to your main game/application (in both cases, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). - bool WantTextInput; // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). - bool WantSetMousePos; // MousePos has been altered, back-end should reposition mouse on next frame. Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. - bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. IMPORTANT: You need to clear io.WantSaveIniSettings yourself. - bool NavActive; // Directional navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. - bool NavVisible; // Directional navigation is visible and allowed (will handle ImGuiKey_NavXXX events). - float Framerate; // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames + bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). + bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). + bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). + bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. + bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving! + bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. + bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events). + float Framerate; // Application framerate estimate, in frame per second. Solely for convenience. Rolling average estimation based on io.DeltaTime over 120 frames. int MetricsRenderVertices; // Vertices output during last call to Render() int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 int MetricsRenderWindows; // Number of visible windows @@ -1428,16 +1854,17 @@ struct ImGuiIO ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. //------------------------------------------------------------------ - // [Internal] ImGui will maintain those fields. Forward compatibility not guaranteed! + // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! //------------------------------------------------------------------ + ImGuiKeyModFlags KeyMods; // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame() ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) ImVec2 MouseClickedPos[5]; // Position at time of clicking double MouseClickedTime[5]; // Time of last click (used to figure out double-click) bool MouseClicked[5]; // Mouse button went from !Down to Down bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? bool MouseReleased[5]; // Mouse button went from Down to !Down - bool MouseDownOwned[5]; // Track if button was clicked inside an imgui window. We don't request mouse capture from the application if click started outside ImGui bounds. + bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window. We don't request mouse capture from the application if click started outside ImGui bounds. bool MouseDownWasDoubleClick[5]; // Track if button down was a double-click float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) float MouseDownDurationPrev[5]; // Previous time the mouse button has been down @@ -1447,21 +1874,24 @@ struct ImGuiIO float KeysDownDurationPrev[512]; // Previous duration the key has been down float NavInputsDownDuration[ImGuiNavInput_COUNT]; float NavInputsDownDurationPrev[ImGuiNavInput_COUNT]; - ImVector<ImWchar> InputQueueCharacters; // Queue of _characters_ input (obtained by platform back-end). Fill using AddInputCharacter() helper. + float PenPressure; // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui. + ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16 + ImVector<ImWchar> InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. IMGUI_API ImGuiIO(); }; //----------------------------------------------------------------------------- -// Misc data structures +// [SECTION] Misc data structures //----------------------------------------------------------------------------- // Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. // The callback function should return 0 by default. // Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details) +// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) +// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration // - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB // - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows -// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration // - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. // - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. struct ImGuiInputTextCallbackData @@ -1488,7 +1918,9 @@ struct ImGuiInputTextCallbackData IMGUI_API ImGuiInputTextCallbackData(); IMGUI_API void DeleteChars(int pos, int bytes_count); IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL); - bool HasSelection() const { return SelectionStart != SelectionEnd; } + void SelectAll() { SelectionStart = 0; SelectionEnd = BufTextLen; } + void ClearSelection() { SelectionStart = SelectionEnd = BufTextLen; } + bool HasSelection() const { return SelectionStart != SelectionEnd; } }; // Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin(). @@ -1512,7 +1944,7 @@ struct ImGuiPayload ImGuiID SourceId; // Source item id ImGuiID SourceParentId; // Source parent id (if available) int DataFrameCount; // Data timestamp - char DataType[32+1]; // Data type tag (short user-supplied string, 32 characters max) + char DataType[32 + 1]; // Data type tag (short user-supplied string, 32 characters max) bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item. @@ -1523,56 +1955,42 @@ struct ImGuiPayload bool IsDelivery() const { return Delivery; } }; -//----------------------------------------------------------------------------- -// Obsolete functions (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) -// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. -//----------------------------------------------------------------------------- - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -namespace ImGui +// Sorting specification for one column of a table (sizeof == 12 bytes) +struct ImGuiTableColumnSortSpecs { - // OBSOLETED in 1.70 (from May 2019) - static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; } - // OBSOLETED in 1.69 (from Mar 2019) - static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); } - // OBSOLETED in 1.66 (from Sep 2018) - static inline void SetScrollHere(float center_ratio=0.5f){ SetScrollHereY(center_ratio); } - // OBSOLETED in 1.63 (between Aug 2018 and Sept 2018) - static inline bool IsItemDeactivatedAfterChange() { return IsItemDeactivatedAfterEdit(); } - // OBSOLETED in 1.61 (between Apr 2018 and Aug 2018) - IMGUI_API bool InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags flags = 0); // Use the 'const char* format' version instead of 'decimal_precision'! - IMGUI_API bool InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags flags = 0); - // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018) - static inline bool IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); } - static inline bool IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } - static inline ImVec2 CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = 0.f) { IM_UNUSED(on_edge); IM_UNUSED(outward); IM_ASSERT(0); return pos; } - // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) - static inline void ShowTestWindow() { return ShowDemoWindow(); } - static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); } - static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } - static inline void SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); } - static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); } - // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017) - IMGUI_API bool Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override = -1.0f, ImGuiWindowFlags flags = 0); // Use SetNextWindowSize(size, ImGuiCond_FirstUseEver) + SetNextWindowBgAlpha() instead. - static inline bool IsRootWindowOrAnyChildHovered() { return IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); } - static inline void AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); } - static inline void SetNextWindowPosCenter(ImGuiCond c=0) { ImGuiIO& io = GetIO(); SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f), c, ImVec2(0.5f, 0.5f)); } - // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017) - static inline bool IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); } - static inline bool IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // This was misleading and partly broken. You probably want to use the ImGui::GetIO().WantCaptureMouse flag instead. - static inline bool IsMouseHoveringAnyWindow() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } - static inline bool IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); } -} -typedef ImGuiInputTextCallback ImGuiTextEditCallback; // OBSOLETE in 1.63 (from Aug 2018): made the names consistent -typedef ImGuiInputTextCallbackData ImGuiTextEditCallbackData; -#endif + ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) + ImS16 ColumnIndex; // Index of the column + ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) + ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) + + ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +// Obtained by calling TableGetSortSpecs(). +// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. +// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! +struct ImGuiTableSortSpecs +{ + const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. + int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. + bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. + + ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } +}; //----------------------------------------------------------------------------- -// Helpers +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) //----------------------------------------------------------------------------- +// Helper: Unicode defines +#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD // Invalid Unicode code point (standard value). +#ifdef IMGUI_USE_WCHAR32 +#define IM_UNICODE_CODEPOINT_MAX 0x10FFFF // Maximum Unicode code point supported by this build. +#else +#define IM_UNICODE_CODEPOINT_MAX 0xFFFF // Maximum Unicode code point supported by this build. +#endif + // Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame. // Usage: static ImGuiOnceUponAFrame oaf; if (oaf) ImGui::Text("This will be called only once per frame"); struct ImGuiOnceUponAFrame @@ -1582,11 +2000,6 @@ struct ImGuiOnceUponAFrame operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; } }; -// Helper: Macro for ImGuiOnceUponAFrame. Attention: The macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -#define IMGUI_ONCE_UPON_A_FRAME static ImGuiOnceUponAFrame imgui_oaf; if (imgui_oaf) // OBSOLETED in 1.51, will remove! -#endif - // Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" struct ImGuiTextFilter { @@ -1598,21 +2011,19 @@ struct ImGuiTextFilter bool IsActive() const { return !Filters.empty(); } // [Internal] - struct TextRange + struct ImGuiTextRange { - const char* b; - const char* e; + const char* b; + const char* e; - TextRange() { b = e = NULL; } - TextRange(const char* _b, const char* _e) { b = _b; e = _e; } - const char* begin() const { return b; } - const char* end () const { return e; } - bool empty() const { return b == e; } - IMGUI_API void split(char separator, ImVector<TextRange>* out) const; + ImGuiTextRange() { b = e = NULL; } + ImGuiTextRange(const char* _b, const char* _e) { b = _b; e = _e; } + bool empty() const { return b == e; } + IMGUI_API void split(char separator, ImVector<ImGuiTextRange>* out) const; }; - char InputBuf[256]; - ImVector<TextRange> Filters; - int CountGrep; + char InputBuf[256]; + ImVector<ImGuiTextRange>Filters; + int CountGrep; }; // Helper: Growable text buffer for logging/accumulating text @@ -1620,14 +2031,14 @@ struct ImGuiTextFilter struct ImGuiTextBuffer { ImVector<char> Buf; - static char EmptyString[1]; + IMGUI_API static char EmptyString[1]; ImGuiTextBuffer() { } - inline char operator[](int i) { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } + inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; } const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator int size() const { return Buf.Size ? Buf.Size - 1 : 0; } - bool empty() { return Buf.Size <= 1; } + bool empty() const { return Buf.Size <= 1; } void clear() { Buf.clear(); } void reserve(int capacity) { Buf.reserve(capacity); } const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; } @@ -1646,15 +2057,17 @@ struct ImGuiTextBuffer // Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. struct ImGuiStorage { - struct Pair + // [Internal] + struct ImGuiStoragePair { ImGuiID key; union { int val_i; float val_f; void* val_p; }; - Pair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } - Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } - Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } + ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } + ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } + ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } }; - ImVector<Pair> Data; + + ImVector<ImGuiStoragePair> Data; // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) // - Set***() functions find pair, insertion on demand if missing. @@ -1686,36 +2099,49 @@ struct ImGuiStorage }; // Helper: Manually clip large list of items. -// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all. +// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse +// clipping based on visibility to save yourself from processing those items at all. // The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. -// ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null. +// (Dear ImGui already clip items based on their bounds but it needs to measure text size to do so, whereas manual coarse clipping before submission makes this cost and your own data fetching/submission cost almost null) // Usage: -// ImGuiListClipper clipper(1000); // we have 1000 elements, evenly spaced. -// while (clipper.Step()) -// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) -// ImGui::Text("line number %d", i); -// - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor). -// - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element. -// - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.) -// - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop. +// ImGuiListClipper clipper; +// clipper.Begin(1000); // We have 1000 elements, evenly spaced. +// while (clipper.Step()) +// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) +// ImGui::Text("line number %d", i); +// Generally what happens is: +// - Clipper lets you process the first element (DisplayStart = 0, DisplayEnd = 1) regardless of it being visible or not. +// - User code submit one element. +// - Clipper can measure the height of the first element +// - Clipper calculate the actual range of elements to display based on the current clipping rectangle, position the cursor before the first visible element. +// - User code submit visible elements. struct ImGuiListClipper { - float StartPosY; + int DisplayStart; + int DisplayEnd; + + // [Internal] + int ItemsCount; + int StepNo; + int ItemsFrozen; float ItemsHeight; - int ItemsCount, StepNo, DisplayStart, DisplayEnd; + float StartPosY; - // items_count: Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step). + IMGUI_API ImGuiListClipper(); + IMGUI_API ~ImGuiListClipper(); + + // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step) // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing(). - // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step(). - ImGuiListClipper(int items_count = -1, float items_height = -1.0f) { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want). - ~ImGuiListClipper() { IM_ASSERT(ItemsCount == -1); } // Assert if user forgot to call End() or Step() until false. - - IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. IMGUI_API void Begin(int items_count, float items_height = -1.0f); // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1. IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. + IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] +#endif }; -// Helpers macros to generate 32-bits encoded colors +// Helpers macros to generate 32-bit encoded colors #ifdef IMGUI_USE_BGRA_PACKED_COLOR #define IM_COL32_R_SHIFT 16 #define IM_COL32_G_SHIFT 8 @@ -1743,8 +2169,8 @@ struct ImColor ImVec4 Value; ImColor() { Value.x = Value.y = Value.z = Value.w = 0.0f; } - ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f/255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; } - ImColor(ImU32 rgba) { float sc = 1.0f/255.0f; Value.x = (float)((rgba>>IM_COL32_R_SHIFT)&0xFF) * sc; Value.y = (float)((rgba>>IM_COL32_G_SHIFT)&0xFF) * sc; Value.z = (float)((rgba>>IM_COL32_B_SHIFT)&0xFF) * sc; Value.w = (float)((rgba>>IM_COL32_A_SHIFT)&0xFF) * sc; } + ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; } + ImColor(ImU32 rgba) { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } ImColor(float r, float g, float b, float a = 1.0f) { Value.x = r; Value.y = g; Value.z = b; Value.w = a; } ImColor(const ImVec4& col) { Value = col; } inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } @@ -1752,41 +2178,57 @@ struct ImColor // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers. inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; } - static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); } + static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); } }; //----------------------------------------------------------------------------- -// Draw List API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListFlags, ImDrawList, ImDrawData) +// [SECTION] Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData) // Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. //----------------------------------------------------------------------------- -// Draw callbacks for advanced uses. +// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking. +#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX +#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (63) +#endif + +// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] // NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering, -// you can poke into the draw list for that! Draw callback may be useful for example to: +// you can poke into the draw list for that! Draw callback may be useful for example to: // A) Change your GPU render state, // B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc. // The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' +// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering backend accordingly. +#ifndef ImDrawCallback typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); +#endif -// Special Draw Callback value to request renderer back-end to reset the graphics/render state. -// The renderer back-end needs to handle this special value, otherwise it will crash trying to call a function at this address. +// Special Draw callback value to request renderer backend to reset the graphics/render state. +// The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. // This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. // It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). #define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) // Typically, 1 command = 1 GPU draw call (unless command is a callback) +// - VtxOffset/IdxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, +// those fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices. +// Pre-1.71 backends will typically ignore the VtxOffset/IdxOffset fields. +// - The ClipRect/TextureId/VtxOffset fields must be contiguous as we memcmp() them together (this is asserted for). struct ImDrawCmd { - unsigned int ElemCount; // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. - ImVec4 ClipRect; // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates - ImTextureID TextureId; // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. - ImDrawCallback UserCallback; // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. - void* UserCallbackData; // The draw callback code can access this. + ImVec4 ClipRect; // 4*4 // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates + ImTextureID TextureId; // 4-8 // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. + unsigned int VtxOffset; // 4 // Start offset in vertex buffer. ImGuiBackendFlags_RendererHasVtxOffset: always 0, otherwise may be >0 to support meshes larger than 64K vertices with 16-bit indices. + unsigned int IdxOffset; // 4 // Start offset in index buffer. Always equal to sum of ElemCount drawn so far. + unsigned int ElemCount; // 4 // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. + ImDrawCallback UserCallback; // 4-8 // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. + void* UserCallbackData; // 4-8 // The draw callback code can access this. - ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = (ImTextureID)NULL; UserCallback = NULL; UserCallbackData = NULL; } + ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed }; -// Vertex index (override with '#define ImDrawIdx unsigned int' in imconfig.h) +// Vertex index, default to 16-bit +// To allow large meshes with 16-bit indices: set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset in the renderer backend (recommended). +// To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in imconfig.h. #ifndef ImDrawIdx typedef unsigned short ImDrawIdx; #endif @@ -1802,44 +2244,83 @@ struct ImDrawVert #else // You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h // The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine. -// The type has to be described within the macro (you can either declare the struct or use a typedef) +// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared a the time you'd want to set your type up. // NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT; #endif -// Draw channels are used by the Columns API to "split" the render list into different channels while building, so items of each column can be batched together. -// You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered. +// [Internal] For use by ImDrawList +struct ImDrawCmdHeader +{ + ImVec4 ClipRect; + ImTextureID TextureId; + unsigned int VtxOffset; +}; + +// [Internal] For use by ImDrawListSplitter struct ImDrawChannel { - ImVector<ImDrawCmd> CmdBuffer; - ImVector<ImDrawIdx> IdxBuffer; + ImVector<ImDrawCmd> _CmdBuffer; + ImVector<ImDrawIdx> _IdxBuffer; }; -enum ImDrawCornerFlags_ + +// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order. +// This is used by the Columns/Tables API, so items of each column can be batched together in a same draw call. +struct ImDrawListSplitter { - ImDrawCornerFlags_TopLeft = 1 << 0, // 0x1 - ImDrawCornerFlags_TopRight = 1 << 1, // 0x2 - ImDrawCornerFlags_BotLeft = 1 << 2, // 0x4 - ImDrawCornerFlags_BotRight = 1 << 3, // 0x8 - ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, // 0x3 - ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, // 0xC - ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, // 0x5 - ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, // 0xA - ImDrawCornerFlags_All = 0xF // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience + int _Current; // Current channel number (0) + int _Count; // Number of active channels (1+) + ImVector<ImDrawChannel> _Channels; // Draw channels (not resized down so _Count might be < Channels.Size) + + inline ImDrawListSplitter() { memset(this, 0, sizeof(*this)); } + inline ~ImDrawListSplitter() { ClearFreeMemory(); } + inline void Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame + IMGUI_API void ClearFreeMemory(); + IMGUI_API void Split(ImDrawList* draw_list, int count); + IMGUI_API void Merge(ImDrawList* draw_list); + IMGUI_API void SetCurrentChannel(ImDrawList* draw_list, int channel_idx); }; +// Flags for ImDrawList functions +// (Legacy: bit 0 must always correspond to ImDrawFlags_Closed to be backward compatible with old API using a bool. Bits 1..3 must be unused) +enum ImDrawFlags_ +{ + ImDrawFlags_None = 0, + ImDrawFlags_Closed = 1 << 0, // PathStroke(), AddPolyline(): specify that shape should be closed (Important: this is always == 1 for legacy reason) + ImDrawFlags_RoundCornersTopLeft = 1 << 4, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-left corner only (when rounding > 0.0f, we default to all corners). Was 0x01. + ImDrawFlags_RoundCornersTopRight = 1 << 5, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-right corner only (when rounding > 0.0f, we default to all corners). Was 0x02. + ImDrawFlags_RoundCornersBottomLeft = 1 << 6, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-left corner only (when rounding > 0.0f, we default to all corners). Was 0x04. + ImDrawFlags_RoundCornersBottomRight = 1 << 7, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-right corner only (when rounding > 0.0f, we default to all corners). Wax 0x08. + ImDrawFlags_RoundCornersNone = 1 << 8, // AddRect(), AddRectFilled(), PathRect(): disable rounding on all corners (when rounding > 0.0f). This is NOT zero, NOT an implicit flag! + ImDrawFlags_RoundCornersTop = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersBottom = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersLeft = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersTopLeft, + ImDrawFlags_RoundCornersRight = ImDrawFlags_RoundCornersBottomRight | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersAll = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersDefault_ = ImDrawFlags_RoundCornersAll, // Default to ALL corners if none of the _RoundCornersXX flags are specified. + ImDrawFlags_RoundCornersMask_ = ImDrawFlags_RoundCornersAll | ImDrawFlags_RoundCornersNone +}; + +// Flags for ImDrawList instance. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly. +// It is however possible to temporarily alter flags between calls to ImDrawList:: functions. enum ImDrawListFlags_ { - ImDrawListFlags_None = 0, - ImDrawListFlags_AntiAliasedLines = 1 << 0, // Lines are anti-aliased (*2 the number of triangles for 1.0f wide line, otherwise *3 the number of triangles) - ImDrawListFlags_AntiAliasedFill = 1 << 1 // Filled shapes have anti-aliased edges (*2 the number of vertices) + ImDrawListFlags_None = 0, + ImDrawListFlags_AntiAliasedLines = 1 << 0, // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) + ImDrawListFlags_AntiAliasedLinesUseTex = 1 << 1, // Enable anti-aliased lines/borders using textures when possible. Require backend to render with bilinear filtering. + ImDrawListFlags_AntiAliasedFill = 1 << 2, // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). + ImDrawListFlags_AllowVtxOffset = 1 << 3 // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. }; // Draw command list -// This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. -// Each ImGui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to access the current window draw list and draw custom primitives. +// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame, +// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. +// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to +// access the current window draw list and draw custom primitives. // You can interleave normal ImGui:: calls and adding primitives to the current draw list. -// All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), but you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well) +// In single viewport mode, top-left is == GetMainViewport()->Pos (generally 0,0), bottom-right is == GetMainViewport()->Pos+Size (generally io.DisplaySize). +// You are totally free to apply whatever transformation matrix to want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!) // Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. struct ImDrawList { @@ -1850,21 +2331,22 @@ struct ImDrawList ImDrawListFlags Flags; // Flags, you may poke into these to adjust anti-aliasing settings per-primitive. // [Internal, used while building lists] + unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. const ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) const char* _OwnerName; // Pointer to owner window's name for debugging - unsigned int _VtxCurrentIdx; // [Internal] == VtxBuffer.Size ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) ImVector<ImVec4> _ClipRectStack; // [Internal] ImVector<ImTextureID> _TextureIdStack; // [Internal] ImVector<ImVec2> _Path; // [Internal] current path building - int _ChannelsCurrent; // [Internal] current channel number (0) - int _ChannelsCount; // [Internal] number of active channels (1+) - ImVector<ImDrawChannel> _Channels; // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size) + ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). + ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) + float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) - ImDrawList(const ImDrawListSharedData* shared_data) { _Data = shared_data; _OwnerName = NULL; Clear(); } - ~ImDrawList() { ClearFreeMemory(); } + ImDrawList(const ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } + + ~ImDrawList() { _ClearFreeMemory(); } IMGUI_API void PushClipRect(ImVec2 clip_rect_min, ImVec2 clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) IMGUI_API void PushClipRectFullScreen(); IMGUI_API void PopClipRect(); @@ -1874,87 +2356,117 @@ struct ImDrawList inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); } // Primitives - IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size), rounding_corners_flags: 4-bits corresponding to which corner to round - IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All); // a: upper-left, b: lower-right (== upper-left + size) - IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); - IMGUI_API void AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col); - IMGUI_API void AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col); - IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f); - IMGUI_API void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12); + // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners. + // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred). + // In older versions (until Dear ImGui 1.77) the AddCircle functions defaulted to num_segments == 12. + // In future versions we will use textures to provide cheaper and higher-quality circles. + // Use AddNgon() and AddNgonFilled() functions if you need to guaranteed a specific number of sides. + IMGUI_API void AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); + IMGUI_API void AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col); + IMGUI_API void AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col); + IMGUI_API void AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 0, float thickness = 1.0f); + IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); + IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); + IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); - IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = IM_COL32_WHITE); - IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = IM_COL32_WHITE); - IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners = ImDrawCornerFlags_All); - IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, bool closed, float thickness); + IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); // Note: Anti-aliased filling requires points to be in clockwise order. - IMGUI_API void AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0); + IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) + + // Image primitives + // - Read FAQ to understand what ImTextureID is. + // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. + // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture. + IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); // Stateful path API, add points then finish with PathFillConvex() or PathStroke() inline void PathClear() { _Path.Size = 0; } inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } - inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); } + inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } // Note: Anti-aliased filling requires points to be in clockwise order. - inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); _Path.Size = 0; } - IMGUI_API void PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10); - IMGUI_API void PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle - IMGUI_API void PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0); - IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All); - - // Channels - // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives) - // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end) - IMGUI_API void ChannelsSplit(int channels_count); - IMGUI_API void ChannelsMerge(); - IMGUI_API void ChannelsSetCurrent(int channel_index); + inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } + IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); + IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle + IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) + IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); // Advanced IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer. - // Internal helpers - // NB: all primitives needs to be reserved via PrimReserve() beforehand! - IMGUI_API void Clear(); - IMGUI_API void ClearFreeMemory(); + // Advanced: Channels + // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) + // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) + // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! + // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. + // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. + inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } + inline void ChannelsMerge() { _Splitter.Merge(this); } + inline void ChannelsSetCurrent(int n) { _Splitter.SetCurrentChannel(this, n); } + + // Advanced: Primitives allocations + // - We render triangles (three vertices) + // - All primitives needs to be reserved via PrimReserve() beforehand. IMGUI_API void PrimReserve(int idx_count, int vtx_count); + IMGUI_API void PrimUnreserve(int idx_count, int vtx_count); IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); - inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } - inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } - inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } - IMGUI_API void UpdateClipRect(); - IMGUI_API void UpdateTextureID(); + inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } + inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } + inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } + inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } +#endif + + // [Internal helpers] + IMGUI_API void _ResetForNewFrame(); + IMGUI_API void _ClearFreeMemory(); + IMGUI_API void _PopUnusedDrawCmd(); + IMGUI_API void _OnChangedClipRect(); + IMGUI_API void _OnChangedTextureID(); + IMGUI_API void _OnChangedVtxOffset(); + IMGUI_API int _CalcCircleAutoSegmentCount(float radius) const; + IMGUI_API void _PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step); + IMGUI_API void _PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments); }; -// All draw data to render an ImGui frame +// All draw data to render a Dear ImGui frame // (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose, // as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) struct ImDrawData { bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. - ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. int CmdListsCount; // Number of ImDrawList* to render int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size - ImVec2 DisplayPos; // Upper-left position of the viewport to render (== upper-left of the orthogonal projection matrix to use) - ImVec2 DisplaySize; // Size of the viewport to render (== io.DisplaySize for the main viewport) (DisplayPos + DisplaySize == lower-right of the orthogonal projection matrix to use) + ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. + ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) + ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. // Functions - ImDrawData() { Valid = false; Clear(); } - ~ImDrawData() { Clear(); } - void Clear() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.f, 0.f); } // The ImDrawList are owned by ImGuiContext! + ImDrawData() { Clear(); } + void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! - IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. + IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. }; //----------------------------------------------------------------------------- -// Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont) +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont) //----------------------------------------------------------------------------- struct ImFontConfig @@ -1964,8 +2476,8 @@ struct ImFontConfig bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). int FontNo; // 0 // Index of font within TTF/OTF file float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). - int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. - int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis. + int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. + int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input. @@ -1973,8 +2485,9 @@ struct ImFontConfig float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. - unsigned int RasterizerFlags; // 0x00 // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one. + unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. + ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. // [Internal] char Name[40]; // Name (strictly to ease debugging) @@ -1983,9 +2496,13 @@ struct ImFontConfig IMGUI_API ImFontConfig(); }; +// Hold rendering data for one glyph. +// (Note: some language parsers may fail to convert the 31+1 bitfield members, in this case maybe drop store a single u32 or we can rework this) struct ImFontGlyph { - ImWchar Codepoint; // 0x0000..0xFFFF + unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops) + unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering. + unsigned int Codepoint : 30; // 0x0000..0x10FFFF float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in) float X0, Y0, X1, Y1; // Glyph corners float U0, V0, U1, V1; // Texture coordinates @@ -1995,22 +2512,38 @@ struct ImFontGlyph // This is essentially a tightly packed of vector of 64k booleans = 8KB storage. struct ImFontGlyphRangesBuilder { - ImVector<int> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) + ImVector<ImU32> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) - ImFontGlyphRangesBuilder() { UsedChars.resize(0x10000 / sizeof(int)); memset(UsedChars.Data, 0, 0x10000 / sizeof(int)); } - bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array - void SetBit(int n) { int off = (n >> 5); int mask = 1 << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array - void AddChar(ImWchar c) { SetBit(c); } // Add character + ImFontGlyphRangesBuilder() { Clear(); } + inline void Clear() { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX + 1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); } + inline bool GetBit(size_t n) const { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array + inline void SetBit(size_t n) { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array + inline void AddChar(ImWchar c) { SetBit(c); } // Add character IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added) IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges); // Output new ranges }; +// See ImFontAtlas::AddCustomRectXXX functions. +struct ImFontAtlasCustomRect +{ + unsigned short Width, Height; // Input // Desired rectangle dimension + unsigned short X, Y; // Output // Packed position in Atlas + unsigned int GlyphID; // Input // For custom font glyphs only (ID < 0x110000) + float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance + ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset + ImFont* Font; // Input // For custom font glyphs only: target font + ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; } + bool IsPacked() const { return X != 0xFFFF; } +}; + +// Flags for ImFontAtlas build enum ImFontAtlasFlags_ { ImFontAtlasFlags_None = 0, ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0, // Don't round the height to next power of two - ImFontAtlasFlags_NoMouseCursors = 1 << 1 // Don't build software mouse cursors into the atlas + ImFontAtlasFlags_NoMouseCursors = 1 << 1, // Don't build software mouse cursors into the atlas (save a little texture memory) + ImFontAtlasFlags_NoBakedLines = 1 << 2 // Don't build thick line textures into the atlas (save a little texture memory). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU). }; // Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: @@ -2053,7 +2586,7 @@ struct ImFontAtlas IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions. IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel - bool IsBuilt() { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); } + bool IsBuilt() const { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); } void SetTexID(ImTextureID id) { TexID = id; } //------------------------------------------- @@ -2065,51 +2598,45 @@ struct ImFontAtlas // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data. IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters - IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs + IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 2999 Ideographs IMGUI_API const ImWchar* GetGlyphRangesChineseFull(); // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters - IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietname characters + IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters //------------------------------------------- - // Custom Rectangles/Glyphs API + // [BETA] Custom Rectangles/Glyphs API //------------------------------------------- - // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. After calling Build(), you can query the rectangle position and render your pixels. - // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), so you can render e.g. custom colorful icons and use them as regular glyphs. - struct CustomRect - { - unsigned int ID; // Input // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data. - unsigned short Width, Height; // Input // Desired rectangle dimension - unsigned short X, Y; // Output // Packed position in Atlas - float GlyphAdvanceX; // Input // For custom font glyphs only (ID<0x10000): glyph xadvance - ImVec2 GlyphOffset; // Input // For custom font glyphs only (ID<0x10000): glyph display offset - ImFont* Font; // Input // For custom font glyphs only (ID<0x10000): target font - CustomRect() { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; } - bool IsPacked() const { return X != 0xFFFF; } - }; - - IMGUI_API int AddCustomRectRegular(unsigned int id, int width, int height); // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList - IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0)); // Id needs to be < 0x10000 to register a rectangle to map into a specific font. - const CustomRect* GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; } + // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. + // - After calling Build(), you can query the rectangle position and render your pixels. + // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. + // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), + // so you can render e.g. custom colorful icons and use them as regular glyphs. + // - Read docs/FONTS.md for more details about using colorful icons. + // - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings. + IMGUI_API int AddCustomRectRegular(int width, int height); + IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0)); + ImFontAtlasCustomRect* GetCustomRectByIndex(int index) { IM_ASSERT(index >= 0); return &CustomRects[index]; } // [Internal] - IMGUI_API void CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max); - IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); + IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const; + IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); //------------------------------------------- // Members //------------------------------------------- - bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert. ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_) ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure. int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height. int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0. + bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert. // [Internal] // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you. + bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format. unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4 int TexWidth; // Texture width calculated during Build(). @@ -2117,12 +2644,21 @@ struct ImFontAtlas ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight) ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. - ImVector<CustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas. - ImVector<ImFontConfig> ConfigData; // Internal data - int CustomRectIds[1]; // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList + ImVector<ImFontAtlasCustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas. + ImVector<ImFontConfig> ConfigData; // Configuration data + ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines + + // [Internal] Font builder + const ImFontBuilderIO* FontBuilderIO; // Opaque interface to a font builder (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE). + unsigned int FontBuilderFlags; // Shared flags (for all fonts) for custom font builder. THIS IS BUILD IMPLEMENTATION DEPENDENT. Per-font override is also available in ImFontConfig. + + // [Internal] Packing data + int PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors + int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETE 1.67+ + typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+ + typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ #endif }; @@ -2135,21 +2671,22 @@ struct ImFont float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading) - // Members: Hot ~36/48 bytes (for CalcTextSize + render loop) + // Members: Hot ~28/40 bytes (for CalcTextSize + render loop) ImVector<ImWchar> IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point. ImVector<ImFontGlyph> Glyphs; // 12-16 // out // // All glyphs. const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar) - ImVec2 DisplayOffset; // 8 // in // = (0,0) // Offset font rendering by xx pixels // Members: Cold ~32/40 bytes ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. - ImWchar FallbackChar; // 2 // in // = '?' // Replacement glyph if one isn't found. Only set via SetFallbackChar() + ImWchar FallbackChar; // 2 // in // = '?' // Replacement character if a glyph isn't found. Only set via SetFallbackChar() + ImWchar EllipsisChar; // 2 // out // = -1 // Character used for ellipsis rendering. + bool DirtyLookupTables; // 1 // out // float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale() float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs) - bool DirtyLookupTables; // 1 // out // + ImU8 Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints. // Methods IMGUI_API ImFont(); @@ -2171,18 +2708,113 @@ struct ImFont IMGUI_API void BuildLookupTable(); IMGUI_API void ClearOutputData(); IMGUI_API void GrowIndex(int new_size); - IMGUI_API void AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); + IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built. + IMGUI_API void SetGlyphVisible(ImWchar c, bool visible); IMGUI_API void SetFallbackChar(ImWchar c); + IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Viewports +//----------------------------------------------------------------------------- + +// Flags stored in ImGuiViewport::Flags +enum ImGuiViewportFlags_ +{ + ImGuiViewportFlags_None = 0, + ImGuiViewportFlags_IsPlatformWindow = 1 << 0, // Represent a Platform Window + ImGuiViewportFlags_IsPlatformMonitor = 1 << 1, // Represent a Platform Monitor (unused yet) + ImGuiViewportFlags_OwnedByApp = 1 << 2 // Platform Window: is created/managed by the application (rather than a dear imgui backend) +}; + +// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. +// - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. +// - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. +// - About Main Area vs Work Area: +// - Main Area = entire viewport. +// - Work Area = entire viewport minus sections used by main menu bars (for platform windows), or by task bar (for platform monitor). +// - Windows are generally trying to stay within the Work Area of their host viewport. +struct ImGuiViewport +{ + ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ + ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) + ImVec2 Size; // Main Area: Size of the viewport. + ImVec2 WorkPos; // Work Area: Position of the viewport minus task bars, menus bars, status bars (>= Pos) + ImVec2 WorkSize; // Work Area: Size of the viewport minus task bars, menu bars, status bars (<= Size) + + ImGuiViewport() { memset(this, 0, sizeof(*this)); } + + // Helpers + ImVec2 GetCenter() const { return ImVec2(Pos.x + Size.x * 0.5f, Pos.y + Size.y * 0.5f); } + ImVec2 GetWorkCenter() const { return ImVec2(WorkPos.x + WorkSize.x * 0.5f, WorkPos.y + WorkSize.y * 0.5f); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Obsolete functions and types +// (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) +// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. +//----------------------------------------------------------------------------- #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - typedef ImFontGlyph Glyph; // OBSOLETE 1.52+ -#endif +namespace ImGui +{ + // OBSOLETED in 1.81 (from February 2021) + IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // Helper to calculate size from items_count and height_in_items + static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } + static inline void ListBoxFooter() { EndListBox(); } + // OBSOLETED in 1.79 (from August 2020) + static inline void OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry! + // OBSOLETED in 1.78 (from June 2020) + // Old drag/sliders functions that took a 'float power = 1.0' argument instead of flags. + // For shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. + IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power); + IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power); + static inline bool DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); } + IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power); + IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format, float power); + static inline bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power) { return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); } + static inline bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); } + static inline bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); } + static inline bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); } + // OBSOLETED in 1.77 (from June 2020) + static inline bool BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mb, bool over_items) { return BeginPopupContextWindow(str_id, mb | (over_items ? 0 : ImGuiPopupFlags_NoOpenOverItems)); } + // OBSOLETED in 1.72 (from April 2019) + static inline void TreeAdvanceToLabelPos() { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); } + // OBSOLETED in 1.71 (from June 2019) + static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } + // OBSOLETED in 1.70 (from May 2019) + static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; } + // OBSOLETED in 1.69 (from Mar 2019) + static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); } +} + +// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() +typedef ImDrawFlags ImDrawCornerFlags; +enum ImDrawCornerFlags_ +{ + ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit + ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). + ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. + ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. + ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. + ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 + ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, + ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, + ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, + ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight }; +#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +//----------------------------------------------------------------------------- + #if defined(__clang__) #pragma clang diagnostic pop -#elif defined(__GNUC__) && __GNUC__ >= 8 +#elif defined(__GNUC__) #pragma GCC diagnostic pop #endif @@ -2190,3 +2822,5 @@ struct ImFont #ifdef IMGUI_INCLUDE_IMGUI_USER_H #include "imgui_user.h" #endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_demo.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_demo.cpp new file mode 100644 index 0000000000..3af6f6a826 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_demo.cpp @@ -0,0 +1,7663 @@ +// dear imgui, v1.82 +// (demo code) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for more details, documentation and comments. +// Get latest version at https://github.com/ocornut/imgui + +// Message to the person tempted to delete this file when integrating Dear ImGui into their code base: +// Do NOT remove this file from your project! Think again! It is the most useful reference code that you and other +// coders will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available +// debug menu of your game/app! Removing this file from your project is hindering access to documentation for everyone +// in your team, likely leading you to poorer usage of the library. +// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). +// If you want to link core Dear ImGui in your shipped builds but want a thorough guarantee that the demo will not be +// linked, you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty. +// In other situation, whenever you have Dear ImGui available you probably want this to be available for reference. +// Thank you, +// -Your beloved friend, imgui_demo.cpp (which you won't delete) + +// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: +// In this demo code, we frequently we use 'static' variables inside functions. A static variable persist across calls, +// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to +// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller +// in size. It also happens to be a convenient way of storing simple UI related information as long as your function +// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code, +// but most of the real data you would be editing is likely going to be stored outside your functions. + +// The Demo code in this file is designed to be easy to copy-and-paste in into your application! +// Because of this: +// - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace. +// - We try to declare static variables in the local scope, as close as possible to the code using them. +// - We never use any of the helpers/facilities used internally by Dear ImGui, unless available in the public API. +// - We never use maths operators on ImVec2/ImVec4. For our other sources files we use them, and they are provided +// by imgui_internal.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional +// and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h. +// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp. + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +/* + +Index of this file: + +// [SECTION] Forward Declarations, Helpers +// [SECTION] Demo Window / ShowDemoWindow() +// - sub section: ShowDemoWindowWidgets() +// - sub section: ShowDemoWindowLayout() +// - sub section: ShowDemoWindowPopups() +// - sub section: ShowDemoWindowTables() +// - sub section: ShowDemoWindowMisc() +// [SECTION] About Window / ShowAboutWindow() +// [SECTION] Style Editor / ShowStyleEditor() +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +// [SECTION] Example App: Manipulating window titles / ShowExampleAppWindowTitles() +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +// System includes +#include <ctype.h> // toupper +#include <limits.h> // INT_MIN, INT_MAX +#include <math.h> // sqrtf, powf, cosf, sinf, floorf, ceilf +#include <stdio.h> // vsnprintf, sscanf, printf +#include <stdlib.h> // NULL, malloc, free, atoi +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include <stddef.h> // intptr_t +#else +#include <stdint.h> // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning: 'xx' is deprecated: The POSIX name for this.. // for strdup used in demo code (so user can copy & paste the code) +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type +#pragma clang diagnostic ignored "-Wformat-security" // warning: format string is not a string literal +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used. +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size +#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure) +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. +#endif + +// Play it nice with Windows users (Update: May 2018, Notepad now supports Unix-style carriage returns!) +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" +#else +#define IM_NEWLINE "\n" +#endif + +// Helpers +#if defined(_MSC_VER) && !defined(snprintf) +#define snprintf _snprintf +#endif +#if defined(_MSC_VER) && !defined(vsnprintf) +#define vsnprintf _vsnprintf +#endif + +// Format specifiers, printing 64-bit hasn't been decently standardized... +// In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself. +#ifdef _MSC_VER +#define IM_PRId64 "I64d" +#define IM_PRIu64 "I64u" +#else +#define IM_PRId64 "lld" +#define IM_PRIu64 "llu" +#endif + +// Helpers macros +// We normally try to not use many helpers in imgui_demo.cpp in order to make code easier to copy and paste, +// but making an exception here as those are largely simplifying code... +// In other imgui sources we can use nicer internal functions from imgui_internal.h (ImMin/ImMax) but not in the demo. +#define IM_MIN(A, B) (((A) < (B)) ? (A) : (B)) +#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) +#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V)) + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifndef IMGUI_CDECL +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward Declarations, Helpers +//----------------------------------------------------------------------------- + +#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) + +// Forward Declarations +static void ShowExampleAppDocuments(bool* p_open); +static void ShowExampleAppMainMenuBar(); +static void ShowExampleAppConsole(bool* p_open); +static void ShowExampleAppLog(bool* p_open); +static void ShowExampleAppLayout(bool* p_open); +static void ShowExampleAppPropertyEditor(bool* p_open); +static void ShowExampleAppLongText(bool* p_open); +static void ShowExampleAppAutoResize(bool* p_open); +static void ShowExampleAppConstrainedResize(bool* p_open); +static void ShowExampleAppSimpleOverlay(bool* p_open); +static void ShowExampleAppFullscreen(bool* p_open); +static void ShowExampleAppWindowTitles(bool* p_open); +static void ShowExampleAppCustomRendering(bool* p_open); +static void ShowExampleMenuFile(); + +// Helper to display a little (?) mark which shows a tooltip when hovered. +// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.md) +static void HelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// Helper to display basic user controls. +void ImGui::ShowUserGuide() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui::BulletText("Double-click on title bar to collapse window."); + ImGui::BulletText( + "Click and drag on lower corner to resize window\n" + "(double-click to auto fit window to its contents)."); + ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); + ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); + if (io.FontAllowUserScaling) + ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); + ImGui::BulletText("While inputing text:\n"); + ImGui::Indent(); + ImGui::BulletText("CTRL+Left/Right to word jump."); + ImGui::BulletText("CTRL+A or double-click to select all."); + ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste."); + ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); + ImGui::BulletText("ESCAPE to revert."); + ImGui::BulletText("You can apply arithmetic operators +,*,/ on numerical values.\nUse +- to subtract."); + ImGui::Unindent(); + ImGui::BulletText("With keyboard navigation enabled:"); + ImGui::Indent(); + ImGui::BulletText("Arrow keys to navigate."); + ImGui::BulletText("Space to activate a widget."); + ImGui::BulletText("Return to input text into a widget."); + ImGui::BulletText("Escape to deactivate a widget, close popup, exit child window."); + ImGui::BulletText("Alt to jump to the menu layer of a window."); + ImGui::BulletText("CTRL+Tab to select a window."); + ImGui::Unindent(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Demo Window / ShowDemoWindow() +//----------------------------------------------------------------------------- +// - ShowDemoWindowWidgets() +// - ShowDemoWindowLayout() +// - ShowDemoWindowPopups() +// - ShowDemoWindowTables() +// - ShowDemoWindowColumns() +// - ShowDemoWindowMisc() +//----------------------------------------------------------------------------- + +// We split the contents of the big ShowDemoWindow() function into smaller functions +// (because the link time of very large functions grow non-linearly) +static void ShowDemoWindowWidgets(); +static void ShowDemoWindowLayout(); +static void ShowDemoWindowPopups(); +static void ShowDemoWindowTables(); +static void ShowDemoWindowColumns(); +static void ShowDemoWindowMisc(); + +// Demonstrate most Dear ImGui features (this is big function!) +// You may execute this function to experiment with the UI and understand what it does. +// You may then search for keywords in the code when you are interested by a specific feature. +void ImGui::ShowDemoWindow(bool* p_open) +{ + // Exceptionally add an extra assert here for people confused about initial Dear ImGui setup + // Most ImGui functions would normally just crash if the context is missing. + IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); + + // Examples Apps (accessible from the "Examples" menu) + static bool show_app_main_menu_bar = false; + static bool show_app_documents = false; + + static bool show_app_console = false; + static bool show_app_log = false; + static bool show_app_layout = false; + static bool show_app_property_editor = false; + static bool show_app_long_text = false; + static bool show_app_auto_resize = false; + static bool show_app_constrained_resize = false; + static bool show_app_simple_overlay = false; + static bool show_app_fullscreen = false; + static bool show_app_window_titles = false; + static bool show_app_custom_rendering = false; + + if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); + if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); + + if (show_app_console) ShowExampleAppConsole(&show_app_console); + if (show_app_log) ShowExampleAppLog(&show_app_log); + if (show_app_layout) ShowExampleAppLayout(&show_app_layout); + if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); + if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); + if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); + if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); + if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); + if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen); + if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); + if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); + + // Dear ImGui Apps (accessible from the "Tools" menu) + static bool show_app_metrics = false; + static bool show_app_style_editor = false; + static bool show_app_about = false; + + if (show_app_metrics) { ImGui::ShowMetricsWindow(&show_app_metrics); } + if (show_app_about) { ImGui::ShowAboutWindow(&show_app_about); } + if (show_app_style_editor) + { + ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor); + ImGui::ShowStyleEditor(); + ImGui::End(); + } + + // Demonstrate the various window flags. Typically you would just use the default! + static bool no_titlebar = false; + static bool no_scrollbar = false; + static bool no_menu = false; + static bool no_move = false; + static bool no_resize = false; + static bool no_collapse = false; + static bool no_close = false; + static bool no_nav = false; + static bool no_background = false; + static bool no_bring_to_front = false; + + ImGuiWindowFlags window_flags = 0; + if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; + if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; + if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; + if (no_move) window_flags |= ImGuiWindowFlags_NoMove; + if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; + if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; + if (no_nav) window_flags |= ImGuiWindowFlags_NoNav; + if (no_background) window_flags |= ImGuiWindowFlags_NoBackground; + if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; + if (no_close) p_open = NULL; // Don't pass our bool* to Begin + + // We specify a default position/size in case there's no data in the .ini file. + // We only do it to make the demo applications a little more welcoming, but typically this isn't required. + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); + + // Main body of the Demo window starts here. + if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags)) + { + // Early out if the window is collapsed, as an optimization. + ImGui::End(); + return; + } + + // Most "big" widgets share a common width settings by default. See 'Demo->Layout->Widgets Width' for details. + + // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align) + //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); + + // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets. + ImGui::PushItemWidth(ImGui::GetFontSize() * -12); + + // Menu Bar + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Examples")) + { + ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); + ImGui::MenuItem("Console", NULL, &show_app_console); + ImGui::MenuItem("Log", NULL, &show_app_log); + ImGui::MenuItem("Simple layout", NULL, &show_app_layout); + ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); + ImGui::MenuItem("Long text display", NULL, &show_app_long_text); + ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); + ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); + ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); + ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen); + ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); + ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); + ImGui::MenuItem("Documents", NULL, &show_app_documents); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Tools")) + { + ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics); + ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); + ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION); + ImGui::Spacing(); + + if (ImGui::CollapsingHeader("Help")) + { + ImGui::Text("ABOUT THIS DEMO:"); + ImGui::BulletText("Sections below are demonstrating many aspects of the library."); + ImGui::BulletText("The \"Examples\" menu above leads to more demo contents."); + ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n" + "and Metrics/Debugger (general purpose Dear ImGui debugging tool)."); + ImGui::Separator(); + + ImGui::Text("PROGRAMMER GUIDE:"); + ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); + ImGui::BulletText("See comments in imgui.cpp."); + ImGui::BulletText("See example applications in the examples/ folder."); + ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/"); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); + ImGui::Separator(); + + ImGui::Text("USER GUIDE:"); + ImGui::ShowUserGuide(); + } + + if (ImGui::CollapsingHeader("Configuration")) + { + ImGuiIO& io = ImGui::GetIO(); + + if (ImGui::TreeNode("Configuration##2")) + { + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); + ImGui::SameLine(); HelpMarker("Enable keyboard controls."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); + ImGui::SameLine(); HelpMarker("Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", &io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos); + ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos."); + ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) + { + // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it: + if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f) + { + ImGui::SameLine(); + ImGui::Text("<<PRESS SPACE TO DISABLE>>"); + } + if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Space))) + io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse; + } + ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); + ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); + ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink); + ImGui::SameLine(); HelpMarker("Enable blinking cursor (optional as some users consider it to be distracting)"); + ImGui::Checkbox("io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText); + ImGui::SameLine(); HelpMarker("Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving)."); + ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges); + ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); + ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); + ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); + ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); + ImGui::Text("Also see Style->Rendering for rendering options."); + ImGui::TreePop(); + ImGui::Separator(); + } + + if (ImGui::TreeNode("Backend Flags")) + { + HelpMarker( + "Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n" + "Here we expose then as read-only fields to avoid breaking interactions with your backend."); + + // Make a local copy to avoid modifying actual backend flags. + ImGuiBackendFlags backend_flags = io.BackendFlags; + ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &backend_flags, ImGuiBackendFlags_HasGamepad); + ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &backend_flags, ImGuiBackendFlags_HasMouseCursors); + ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &backend_flags, ImGuiBackendFlags_HasSetMousePos); + ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &backend_flags, ImGuiBackendFlags_RendererHasVtxOffset); + ImGui::TreePop(); + ImGui::Separator(); + } + + if (ImGui::TreeNode("Style")) + { + HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function."); + ImGui::ShowStyleEditor(); + ImGui::TreePop(); + ImGui::Separator(); + } + + if (ImGui::TreeNode("Capture/Logging")) + { + HelpMarker( + "The logging API redirects all text output so you can easily capture the content of " + "a window or a block. Tree nodes can be automatically expanded.\n" + "Try opening any of the contents below in this window and then click one of the \"Log To\" button."); + ImGui::LogButtons(); + + HelpMarker("You can also call ImGui::LogText() to output directly to the log without a visual output."); + if (ImGui::Button("Copy \"Hello, world!\" to clipboard")) + { + ImGui::LogToClipboard(); + ImGui::LogText("Hello, world!"); + ImGui::LogFinish(); + } + ImGui::TreePop(); + } + } + + if (ImGui::CollapsingHeader("Window options")) + { + if (ImGui::BeginTable("split", 3)) + { + ImGui::TableNextColumn(); ImGui::Checkbox("No titlebar", &no_titlebar); + ImGui::TableNextColumn(); ImGui::Checkbox("No scrollbar", &no_scrollbar); + ImGui::TableNextColumn(); ImGui::Checkbox("No menu", &no_menu); + ImGui::TableNextColumn(); ImGui::Checkbox("No move", &no_move); + ImGui::TableNextColumn(); ImGui::Checkbox("No resize", &no_resize); + ImGui::TableNextColumn(); ImGui::Checkbox("No collapse", &no_collapse); + ImGui::TableNextColumn(); ImGui::Checkbox("No close", &no_close); + ImGui::TableNextColumn(); ImGui::Checkbox("No nav", &no_nav); + ImGui::TableNextColumn(); ImGui::Checkbox("No background", &no_background); + ImGui::TableNextColumn(); ImGui::Checkbox("No bring to front", &no_bring_to_front); + ImGui::EndTable(); + } + } + + // All demo contents + ShowDemoWindowWidgets(); + ShowDemoWindowLayout(); + ShowDemoWindowPopups(); + ShowDemoWindowTables(); + ShowDemoWindowMisc(); + + // End of ShowDemoWindow() + ImGui::PopItemWidth(); + ImGui::End(); +} + +static void ShowDemoWindowWidgets() +{ + if (!ImGui::CollapsingHeader("Widgets")) + return; + + if (ImGui::TreeNode("Basic")) + { + static int clicked = 0; + if (ImGui::Button("Button")) + clicked++; + if (clicked & 1) + { + ImGui::SameLine(); + ImGui::Text("Thanks for clicking me!"); + } + + static bool check = true; + ImGui::Checkbox("checkbox", &check); + + static int e = 0; + ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); + ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); + ImGui::RadioButton("radio c", &e, 2); + + // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. + for (int i = 0; i < 7; i++) + { + if (i > 0) + ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + ImGui::Button("Click"); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + + // Use AlignTextToFramePadding() to align text baseline to the baseline of framed widgets elements + // (otherwise a Text+SameLine+Button sequence will have the text a little too high by default!) + // See 'Demo->Layout->Text Baseline Alignment' for details. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Hold to repeat:"); + ImGui::SameLine(); + + // Arrow buttons with Repeater + static int counter = 0; + float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::PushButtonRepeat(true); + if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; } + ImGui::SameLine(0.0f, spacing); + if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; } + ImGui::PopButtonRepeat(); + ImGui::SameLine(); + ImGui::Text("%d", counter); + + ImGui::Text("Hover over me"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip"); + + ImGui::SameLine(); + ImGui::Text("- or me"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::Text("I am a fancy tooltip"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); + ImGui::EndTooltip(); + } + + ImGui::Separator(); + + ImGui::LabelText("label", "Value"); + + { + // Using the _simplified_ one-liner Combo() api here + // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api. + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" }; + static int item_current = 0; + ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); + } + + { + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + static char str0[128] = "Hello, world!"; + ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); + ImGui::SameLine(); HelpMarker( + "USER:\n" + "Hold SHIFT or use mouse to select text.\n" + "CTRL+Left/Right to word jump.\n" + "CTRL+A or double-click to select all.\n" + "CTRL+X,CTRL+C,CTRL+V clipboard.\n" + "CTRL+Z,CTRL+Y undo/redo.\n" + "ESCAPE to revert.\n\n" + "PROGRAMMER:\n" + "You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() " + "to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated " + "in imgui_demo.cpp)."); + + static char str1[128] = ""; + ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1)); + + static int i0 = 123; + ImGui::InputInt("input int", &i0); + ImGui::SameLine(); HelpMarker( + "You can apply arithmetic operators +,*,/ on numerical values.\n" + " e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\n" + "Use +- to subtract."); + + static float f0 = 0.001f; + ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f"); + + static double d0 = 999999.00000001; + ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f"); + + static float f1 = 1.e10f; + ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e"); + ImGui::SameLine(); HelpMarker( + "You can input value using the scientific notation,\n" + " e.g. \"1e+8\" becomes \"100000000\"."); + + static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + ImGui::InputFloat3("input float3", vec4a); + } + + { + static int i1 = 50, i2 = 42; + ImGui::DragInt("drag int", &i1, 1); + ImGui::SameLine(); HelpMarker( + "Click and drag to edit value.\n" + "Hold SHIFT/ALT for faster/slower edit.\n" + "Double-click or CTRL+click to input value."); + + ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp); + + static float f1 = 1.00f, f2 = 0.0067f; + ImGui::DragFloat("drag float", &f1, 0.005f); + ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); + } + + { + static int i1 = 0; + ImGui::SliderInt("slider int", &i1, -1, 3); + ImGui::SameLine(); HelpMarker("CTRL+click to input value."); + + static float f1 = 0.123f, f2 = 0.0f; + ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); + ImGui::SliderFloat("slider float (log)", &f2, -10.0f, 10.0f, "%.4f", ImGuiSliderFlags_Logarithmic); + + static float angle = 0.0f; + ImGui::SliderAngle("slider angle", &angle); + + // Using the format string to display a name instead of an integer. + // Here we completely omit '%d' from the format string, so it'll only display a name. + // This technique can also be used with DragInt(). + enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT }; + static int elem = Element_Fire; + const char* elems_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" }; + const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] : "Unknown"; + ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name); + ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer."); + } + + { + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "Click and hold to use drag and drop.\n" + "Right-click on the color square to show options.\n" + "CTRL+click on individual component to input value.\n"); + + ImGui::ColorEdit4("color 2", col2); + } + + { + // Using the _simplified_ one-liner ListBox() api here + // See "List boxes" section for examples of how to use the more flexible BeginListBox()/EndListBox() api. + const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; + static int item_current = 1; + ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); + } + + ImGui::TreePop(); + } + + // Testing ImGuiOnceUponAFrame helper. + //static ImGuiOnceUponAFrame once; + //for (int i = 0; i < 5; i++) + // if (once) + // ImGui::Text("This will be displayed only once."); + + if (ImGui::TreeNode("Trees")) + { + if (ImGui::TreeNode("Basic trees")) + { + for (int i = 0; i < 5; i++) + { + // Use SetNextItemOpen() so set the default state of a node to be open. We could + // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing! + if (i == 0) + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + + if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) + { + ImGui::Text("blah blah"); + ImGui::SameLine(); + if (ImGui::SmallButton("button")) {} + ImGui::TreePop(); + } + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Advanced, with Selectable nodes")) + { + HelpMarker( + "This is a more typical looking tree with selectable nodes.\n" + "Click to select, CTRL+Click to toggle, click on arrows or double-click to open."); + static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth; + static bool align_label_with_current_x_position = false; + static bool test_drag_and_drop = false; + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node."); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); + ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop); + ImGui::Text("Hello!"); + if (align_label_with_current_x_position) + ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); + + // 'selection_mask' is dumb representation of what may be user-side selection state. + // You may retain selection state inside or outside your objects in whatever format you see fit. + // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end + /// of the loop. May be a pointer to your own node type, etc. + static int selection_mask = (1 << 2); + int node_clicked = -1; + for (int i = 0; i < 6; i++) + { + // Disable the default "open on single-click behavior" + set Selected flag according to our selection. + ImGuiTreeNodeFlags node_flags = base_flags; + const bool is_selected = (selection_mask & (1 << i)) != 0; + if (is_selected) + node_flags |= ImGuiTreeNodeFlags_Selected; + if (i < 3) + { + // Items 0..2 are Tree Node + bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); + if (ImGui::IsItemClicked()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + if (node_open) + { + ImGui::BulletText("Blah blah\nBlah Blah"); + ImGui::TreePop(); + } + } + else + { + // Items 3..5 are Tree Leaves + // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can + // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text(). + node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet + ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); + if (ImGui::IsItemClicked()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + } + } + if (node_clicked != -1) + { + // Update selection state + // (process outside of tree loop to avoid visual inconsistencies during the clicking frame) + if (ImGui::GetIO().KeyCtrl) + selection_mask ^= (1 << node_clicked); // CTRL+click to toggle + else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection + selection_mask = (1 << node_clicked); // Click to single-select + } + if (align_label_with_current_x_position) + ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Collapsing Headers")) + { + static bool closable_group = true; + ImGui::Checkbox("Show 2nd header", &closable_group); + if (ImGui::CollapsingHeader("Header", ImGuiTreeNodeFlags_None)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("Some content %d", i); + } + if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("More content %d", i); + } + /* + if (ImGui::CollapsingHeader("Header with a bullet", ImGuiTreeNodeFlags_Bullet)) + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + */ + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Bullets")) + { + ImGui::BulletText("Bullet point 1"); + ImGui::BulletText("Bullet point 2\nOn multiple lines"); + if (ImGui::TreeNode("Tree node")) + { + ImGui::BulletText("Another bullet point"); + ImGui::TreePop(); + } + ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); + ImGui::Bullet(); ImGui::SmallButton("Button"); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Text")) + { + if (ImGui::TreeNode("Colorful Text")) + { + // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. + ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow"); + ImGui::TextDisabled("Disabled"); + ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle."); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Word Wrapping")) + { + // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. + ImGui::TextWrapped( + "This text should automatically wrap on the edge of the window. The current implementation " + "for text wrapping follows simple rules suitable for English and possibly other languages."); + ImGui::Spacing(); + + static float wrap_width = 200.0f; + ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); + + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + for (int n = 0; n < 2; n++) + { + ImGui::Text("Test paragraph %d:", n); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y); + ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); + if (n == 0) + ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); + else + ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); + + // Draw actual text bounding box, following by marker of our expected limit (should not overlap!) + draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255)); + ImGui::PopTextWrapPos(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("UTF-8 Text")) + { + // UTF-8 test with Japanese characters + // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.) + // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 + // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you + // can save your source files as 'UTF-8 without signature'). + // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 + // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants. + // Don't do this in your application! Please use u8"text in any language" in your application! + // Note that characters values are preserved even by InputText() if the font cannot be displayed, + // so you can safely copy & paste garbled characters into another application. + ImGui::TextWrapped( + "CJK text will only appears if the font was loaded with the appropriate CJK character ranges. " + "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. " + "Read docs/FONTS.md for details."); + ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. + ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); + static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; + //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis + ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Images")) + { + ImGuiIO& io = ImGui::GetIO(); + ImGui::TextWrapped( + "Below we are displaying the font texture (which is the only texture we have access to in this demo). " + "Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. " + "Hover the texture for a zoomed view!"); + + // Below we are displaying the font texture because it is the only texture we have access to inside the demo! + // Remember that ImTextureID is just storage for whatever you want it to be. It is essentially a value that + // will be passed to the rendering backend via the ImDrawCmd structure. + // If you use one of the default imgui_impl_XXXX.cpp rendering backend, they all have comments at the top + // of their respective source file to specify what they expect to be stored in ImTextureID, for example: + // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer + // - The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier, etc. + // More: + // - If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers + // to ImGui::Image(), and gather width/height through your own functions, etc. + // - You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer, + // it will help you debug issues if you are confused about it. + // - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). + // - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md + // - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples + ImTextureID my_tex_id = io.Fonts->TexID; + float my_tex_w = (float)io.Fonts->TexWidth; + float my_tex_h = (float)io.Fonts->TexHeight; + { + ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left + ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); // 50% opaque white + ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + float region_sz = 32.0f; + float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; + float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; + float zoom = 4.0f; + if (region_x < 0.0f) { region_x = 0.0f; } + else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; } + if (region_y < 0.0f) { region_y = 0.0f; } + else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; } + ImGui::Text("Min: (%.2f, %.2f)", region_x, region_y); + ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz); + ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); + ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); + ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col); + ImGui::EndTooltip(); + } + } + ImGui::TextWrapped("And now some textured buttons.."); + static int pressed_count = 0; + for (int i = 0; i < 8; i++) + { + ImGui::PushID(i); + int frame_padding = -1 + i; // -1 == uses default padding (style.FramePadding) + ImVec2 size = ImVec2(32.0f, 32.0f); // Size of the image we want to make visible + ImVec2 uv0 = ImVec2(0.0f, 0.0f); // UV coordinates for lower-left + ImVec2 uv1 = ImVec2(32.0f / my_tex_w, 32.0f / my_tex_h);// UV coordinates for (32,32) in our texture + ImVec4 bg_col = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); // Black background + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + if (ImGui::ImageButton(my_tex_id, size, uv0, uv1, frame_padding, bg_col, tint_col)) + pressed_count += 1; + ImGui::PopID(); + ImGui::SameLine(); + } + ImGui::NewLine(); + ImGui::Text("Pressed %d times.", pressed_count); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Combo")) + { + // Expose flags as checkbox for the demo + static ImGuiComboFlags flags = 0; + ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft); + ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton)) + flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview)) + flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both + + // Using the generic BeginCombo() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + const char* combo_label = items[item_current_idx]; // Label to preview before opening the combo (technically it could be anything) + if (ImGui::BeginCombo("combo 1", combo_label, flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + + // Simplified one-liner Combo() API, using values packed in a single constant string + static int item_current_2 = 0; + ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + + // Simplified one-liner Combo() using an array of const char* + static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview + ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); + + // Simplified one-liner Combo() using an accessor function + struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } }; + static int item_current_4 = 0; + ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items)); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("List boxes")) + { + // Using the generic BeginListBox() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + if (ImGui::BeginListBox("listbox 1")) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + // Custom size: use all width, 5 items tall + ImGui::Text("Full-width:"); + if (ImGui::BeginListBox("##listbox 2", ImVec2(-FLT_MIN, 5 * ImGui::GetTextLineHeightWithSpacing()))) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Selectables")) + { + // Selectable() has 2 overloads: + // - The one taking "bool selected" as a read-only selection information. + // When Selectable() has been clicked it returns true and you can alter selection state accordingly. + // - The one taking "bool* p_selected" as a read-write selection information (convenient in some cases) + // The earlier is more flexible, as in real application your selection may be stored in many different ways + // and not necessarily inside a bool value (e.g. in flags within objects, as an external list, etc). + if (ImGui::TreeNode("Basic")) + { + static bool selection[5] = { false, true, false, false, false }; + ImGui::Selectable("1. I am selectable", &selection[0]); + ImGui::Selectable("2. I am selectable", &selection[1]); + ImGui::Text("3. I am not selectable"); + ImGui::Selectable("4. I am selectable", &selection[3]); + if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) + if (ImGui::IsMouseDoubleClicked(0)) + selection[4] = !selection[4]; + ImGui::TreePop(); + } + if (ImGui::TreeNode("Selection State: Single Selection")) + { + static int selected = -1; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selected == n)) + selected = n; + } + ImGui::TreePop(); + } + if (ImGui::TreeNode("Selection State: Multiple Selection")) + { + HelpMarker("Hold CTRL and click to select multiple items."); + static bool selection[5] = { false, false, false, false, false }; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selection[n])) + { + if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held + memset(selection, 0, sizeof(selection)); + selection[n] ^= 1; + } + } + ImGui::TreePop(); + } + if (ImGui::TreeNode("Rendering more text into the same line")) + { + // Using the Selectable() override that takes "bool* p_selected" parameter, + // this function toggle your bool value automatically. + static bool selected[3] = { false, false, false }; + ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); + ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::TreePop(); + } + if (ImGui::TreeNode("In columns")) + { + static bool selected[10] = {}; + + if (ImGui::BeginTable("split1", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i]); // FIXME-TABLE: Selection overlap + } + ImGui::EndTable(); + } + ImGui::Separator(); + if (ImGui::BeginTable("split2", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i], ImGuiSelectableFlags_SpanAllColumns); + ImGui::TableNextColumn(); + ImGui::Text("Some other contents"); + ImGui::TableNextColumn(); + ImGui::Text("123456"); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + if (ImGui::TreeNode("Grid")) + { + static char selected[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; + + // Add in a bit of silly fun... + const float time = (float)ImGui::GetTime(); + const bool winning_state = memchr(selected, 0, sizeof(selected)) == NULL; // If all cells are selected... + if (winning_state) + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f + 0.5f * cosf(time * 2.0f), 0.5f + 0.5f * sinf(time * 3.0f))); + + for (int y = 0; y < 4; y++) + for (int x = 0; x < 4; x++) + { + if (x > 0) + ImGui::SameLine(); + ImGui::PushID(y * 4 + x); + if (ImGui::Selectable("Sailor", selected[y][x] != 0, 0, ImVec2(50, 50))) + { + // Toggle clicked cell + toggle neighbors + selected[y][x] ^= 1; + if (x > 0) { selected[y][x - 1] ^= 1; } + if (x < 3) { selected[y][x + 1] ^= 1; } + if (y > 0) { selected[y - 1][x] ^= 1; } + if (y < 3) { selected[y + 1][x] ^= 1; } + } + ImGui::PopID(); + } + + if (winning_state) + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + if (ImGui::TreeNode("Alignment")) + { + HelpMarker( + "By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item " + "basis using PushStyleVar(). You'll probably want to always keep your default situation to " + "left-align otherwise it becomes difficult to layout multiple items on a same line"); + static bool selected[3 * 3] = { true, false, true, false, true, false, true, false, true }; + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 3; x++) + { + ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f); + char name[32]; + sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y); + if (x > 0) ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); + ImGui::Selectable(name, &selected[3 * y + x], ImGuiSelectableFlags_None, ImVec2(80, 80)); + ImGui::PopStyleVar(); + } + } + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + if (ImGui::TreeNode("Text Input")) + { + if (ImGui::TreeNode("Multi-line Text Input")) + { + // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize + // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings. + static char text[1024 * 16] = + "/*\n" + " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" + " the hexadecimal encoding of one offending instruction,\n" + " more formally, the invalid operand with locked CMPXCHG8B\n" + " instruction bug, is a design flaw in the majority of\n" + " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" + " processors (all in the P5 microarchitecture).\n" + "*/\n\n" + "label:\n" + "\tlock cmpxchg8b eax\n"; + + static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput; + HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)"); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); + ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput); + ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine); + ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Filtered Text Input")) + { + struct TextFilters + { + // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i' + static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) + { + if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) + return 0; + return 1; + } + }; + + static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); + static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); + static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); + static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); + static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); + static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Password Input")) + { + static char password[64] = "password123"; + ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); + ImGui::InputTextWithHint("password (w/ hint)", "<password>", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password)); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Completion, History, Edit Callbacks")) + { + struct Funcs + { + static int MyCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion) + { + data->InsertChars(data->CursorPos, ".."); + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory) + { + if (data->EventKey == ImGuiKey_UpArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Up!"); + data->SelectAll(); + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Down!"); + data->SelectAll(); + } + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) + { + // Toggle casing of first character + char c = data->Buf[0]; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32; + data->BufDirty = true; + + // Increment a counter + int* p_int = (int*)data->UserData; + *p_int = *p_int + 1; + } + return 0; + } + }; + static char buf1[64]; + ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf2[64]; + ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf3[64]; + static int edit_count = 0; + ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count); + ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edits + count edits."); + ImGui::SameLine(); ImGui::Text("(%d)", edit_count); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Resize Callback")) + { + // To wire InputText() with std::string or any other custom string type, + // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper + // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string. + HelpMarker( + "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n" + "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string."); + struct Funcs + { + static int MyResizeCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + ImVector<char>* my_str = (ImVector<char>*)data->UserData; + IM_ASSERT(my_str->begin() == data->Buf); + my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 + data->Buf = my_str->begin(); + } + return 0; + } + + // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace. + // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)' + static bool MyInputTextMultiline(const char* label, ImVector<char>* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) + { + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str); + } + }; + + // For this demo we are using ImVector as a string container. + // Note that because we need to store a terminating zero character, our size/capacity are 1 more + // than usually reported by a typical string class. + static ImVector<char> my_str; + if (my_str.empty()) + my_str.push_back(0); + Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16)); + ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity()); + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + // Tabs + if (ImGui::TreeNode("Tabs")) + { + if (ImGui::TreeNode("Basic")) + { + ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + if (ImGui::BeginTabItem("Avocado")) + { + ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Broccoli")) + { + ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Cucumber")) + { + ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Advanced & Close Button")) + { + // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0). + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; + ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", &tab_bar_flags, ImGuiTabBarFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); + if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) + tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + // Tab Bar + const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" }; + static bool opened[4] = { true, true, true, true }; // Persistent user state + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + { + if (n > 0) { ImGui::SameLine(); } + ImGui::Checkbox(names[n], &opened[n]); + } + + // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): + // the underlying bool will be set to false when the tab is closed. + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", names[n]); + if (n & 1) + ImGui::Text("I am an odd tab."); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("TabItemButton & Leading/Trailing flags")) + { + static ImVector<int> active_tabs; + static int next_tab_id = 0; + if (next_tab_id == 0) // Initialize with some default tabs + for (int i = 0; i < 3; i++) + active_tabs.push_back(next_tab_id++); + + // TabItemButton() and Leading/Trailing flags are distinct features which we will demo together. + // (It is possible to submit regular tabs with Leading/Trailing flags, or TabItemButton tabs without Leading/Trailing flags... + // but they tend to make more sense together) + static bool show_leading_button = true; + static bool show_trailing_button = true; + ImGui::Checkbox("Show Leading TabItemButton()", &show_leading_button); + ImGui::Checkbox("Show Trailing TabItemButton()", &show_trailing_button); + + // Expose some other flags which are useful to showcase how they interact with Leading/Trailing tabs + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown; + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + // Demo a Leading TabItemButton(): click the "?" button to open a menu + if (show_leading_button) + if (ImGui::TabItemButton("?", ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_NoTooltip)) + ImGui::OpenPopup("MyHelpMenu"); + if (ImGui::BeginPopup("MyHelpMenu")) + { + ImGui::Selectable("Hello!"); + ImGui::EndPopup(); + } + + // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+") + // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end. + if (show_trailing_button) + if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip)) + active_tabs.push_back(next_tab_id++); // Add new tab + + // Submit our regular tabs + for (int n = 0; n < active_tabs.Size; ) + { + bool open = true; + char name[16]; + snprintf(name, IM_ARRAYSIZE(name), "%04d", active_tabs[n]); + if (ImGui::BeginTabItem(name, &open, ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", name); + ImGui::EndTabItem(); + } + + if (!open) + active_tabs.erase(active_tabs.Data + n); + else + n++; + } + + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // Plot/Graph widgets are not very good. + // Consider writing your own, or using a third-party one, see: + // - ImPlot https://github.com/epezent/implot + // - others https://github.com/ocornut/imgui/wiki/Useful-Widgets + if (ImGui::TreeNode("Plots Widgets")) + { + static bool animate = true; + ImGui::Checkbox("Animate", &animate); + + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); + + // Fill an array of contiguous float values to plot + // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float + // and the sizeof() of your structure in the "stride" parameter. + static float values[90] = {}; + static int values_offset = 0; + static double refresh_time = 0.0; + if (!animate || refresh_time == 0.0) + refresh_time = ImGui::GetTime(); + while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo + { + static float phase = 0.0f; + values[values_offset] = cosf(phase); + values_offset = (values_offset + 1) % IM_ARRAYSIZE(values); + phase += 0.10f * values_offset; + refresh_time += 1.0f / 60.0f; + } + + // Plots can display overlay texts + // (in this example, we will display an average value) + { + float average = 0.0f; + for (int n = 0; n < IM_ARRAYSIZE(values); n++) + average += values[n]; + average /= (float)IM_ARRAYSIZE(values); + char overlay[32]; + sprintf(overlay, "avg %f", average); + ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f)); + } + ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f)); + + // Use functions to generate output + // FIXME: This is rather awkward because current plot API only pass in indices. + // We probably want an API passing floats and user provide sample rate/count. + struct Funcs + { + static float Sin(void*, int i) { return sinf(i * 0.1f); } + static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } + }; + static int func_type = 0, display_count = 70; + ImGui::Separator(); + ImGui::SetNextItemWidth(100); + ImGui::Combo("func", &func_type, "Sin\0Saw\0"); + ImGui::SameLine(); + ImGui::SliderInt("Sample count", &display_count, 1, 400); + float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; + ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::Separator(); + + // Animate a simple progress bar + static float progress = 0.0f, progress_dir = 1.0f; + if (animate) + { + progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; + if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } + if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } + } + + // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width, + // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. + ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f)); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Text("Progress Bar"); + + float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f); + char buf[32]; + sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753); + ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Color/Picker Widgets")) + { + static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f); + + static bool alpha_preview = true; + static bool alpha_half_preview = false; + static bool drag_and_drop = true; + static bool options_menu = true; + static bool hdr = false; + ImGui::Checkbox("With Alpha Preview", &alpha_preview); + ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); + ImGui::Checkbox("With Drag and Drop", &drag_and_drop); + ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options."); + ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); + ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); + + ImGui::Text("Color widget:"); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "CTRL+click on individual component to input value.\n"); + ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); + + ImGui::Text("Color widget HSV with Alpha:"); + ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags); + + ImGui::Text("Color widget with Float Display:"); + ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); + + ImGui::Text("Color button with Picker:"); + ImGui::SameLine(); HelpMarker( + "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n" + "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only " + "be used for the tooltip and picker popup."); + ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); + + ImGui::Text("Color button with Custom Picker Popup:"); + + // Generate a default palette. The palette will persist and can be edited. + static bool saved_palette_init = true; + static ImVec4 saved_palette[32] = {}; + if (saved_palette_init) + { + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, + saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); + saved_palette[n].w = 1.0f; // Alpha + } + saved_palette_init = false; + } + + static ImVec4 backup_color; + bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); + ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x); + open_popup |= ImGui::Button("Palette"); + if (open_popup) + { + ImGui::OpenPopup("mypicker"); + backup_color = color; + } + if (ImGui::BeginPopup("mypicker")) + { + ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); + ImGui::Separator(); + ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); + ImGui::SameLine(); + + ImGui::BeginGroup(); // Lock X position + ImGui::Text("Current"); + ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)); + ImGui::Text("Previous"); + if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40))) + color = backup_color; + ImGui::Separator(); + ImGui::Text("Palette"); + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::PushID(n); + if ((n % 8) != 0) + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); + + ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip; + if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20))) + color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! + + // Allow user to drop colors into each palette entry. Note that ColorButton() is already a + // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag. + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); + ImGui::EndDragDropTarget(); + } + + ImGui::PopID(); + } + ImGui::EndGroup(); + ImGui::EndPopup(); + } + + ImGui::Text("Color button only:"); + static bool no_border = false; + ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border); + ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80)); + + ImGui::Text("Color picker:"); + static bool alpha = true; + static bool alpha_bar = true; + static bool side_preview = true; + static bool ref_color = false; + static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f); + static int display_mode = 0; + static int picker_mode = 0; + ImGui::Checkbox("With Alpha", &alpha); + ImGui::Checkbox("With Alpha Bar", &alpha_bar); + ImGui::Checkbox("With Side Preview", &side_preview); + if (side_preview) + { + ImGui::SameLine(); + ImGui::Checkbox("With Ref Color", &ref_color); + if (ref_color) + { + ImGui::SameLine(); + ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); + } + } + ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0"); + ImGui::SameLine(); HelpMarker( + "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, " + "but the user can change it with a right-click.\n\nColorPicker defaults to displaying RGB+HSV+Hex " + "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions()."); + ImGui::Combo("Picker Mode", &picker_mode, "Auto/Current\0Hue bar + SV rect\0Hue wheel + SV triangle\0"); + ImGui::SameLine(); HelpMarker("User can right-click the picker to change mode."); + ImGuiColorEditFlags flags = misc_flags; + if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() + if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; + if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; + if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; + if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; + if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays + if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode + if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV; + if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex; + ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); + + ImGui::Text("Set defaults in code:"); + ImGui::SameLine(); HelpMarker( + "SetColorEditOptions() is designed to allow you to set boot-time default.\n" + "We don't have Push/Pop functions because you can force options on a per-widget basis if needed," + "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid" + "encouraging you to persistently save values that aren't forward-compatible."); + if (ImGui::Button("Default: Uint8 + HSV + Hue Bar")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar); + if (ImGui::Button("Default: Float + HDR + Hue Wheel")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); + + // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0) + static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV! + ImGui::Spacing(); + ImGui::Text("HSV encoded colors"); + ImGui::SameLine(); HelpMarker( + "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV" + "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the" + "added benefit that you can manipulate hue values with the picker even when saturation or value are zero."); + ImGui::Text("Color widget with InputHSV:"); + ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Drag/Slider Flags")) + { + // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same! + static ImGuiSliderFlags flags = ImGuiSliderFlags_None; + ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp); + ImGui::SameLine(); HelpMarker("Always clamp value to min/max bounds (if any) when input manually with CTRL+Click."); + ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic); + ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat); + ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput); + ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget."); + + // Drags + static float drag_f = 0.5f; + static int drag_i = 50; + ImGui::Text("Underlying float value: %f", drag_f); + ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags); + ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags); + + // Sliders + static float slider_f = 0.5f; + static int slider_i = 50; + ImGui::Text("Underlying float value: %f", slider_f); + ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags); + ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Range Widgets")) + { + static float begin = 10, end = 90; + static int begin_i = 100, end_i = 1000; + ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp); + ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units"); + ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units"); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Data Types")) + { + // DragScalar/InputScalar/SliderScalar functions allow various data types + // - signed/unsigned + // - 8/16/32/64-bits + // - integer/float/double + // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum + // to pass the type, and passing all arguments by pointer. + // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each types. + // In practice, if you frequently use a given type that is not covered by the normal API entry points, + // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*, + // and then pass their address to the generic function. For example: + // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld") + // { + // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format); + // } + + // Setup limits (as helper variables so we can take their address, as explained above) + // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2. + #ifndef LLONG_MIN + ImS64 LLONG_MIN = -9223372036854775807LL - 1; + ImS64 LLONG_MAX = 9223372036854775807LL; + ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1); + #endif + const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127; + const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255; + const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767; + const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535; + const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2; + const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2; + const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2; + const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2; + const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f; + const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0; + + // State + static char s8_v = 127; + static ImU8 u8_v = 255; + static short s16_v = 32767; + static ImU16 u16_v = 65535; + static ImS32 s32_v = -1; + static ImU32 u32_v = (ImU32)-1; + static ImS64 s64_v = -1; + static ImU64 u64_v = (ImU64)-1; + static float f32_v = 0.123f; + static double f64_v = 90000.01234567890123456789; + + const float drag_speed = 0.2f; + static bool drag_clamp = false; + ImGui::Text("Drags:"); + ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); + ImGui::SameLine(); HelpMarker( + "As with every widgets in dear imgui, we never modify values unless there is a user interaction.\n" + "You can override the clamping limits by using CTRL+Click to input a value."); + ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL); + ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL); + ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL); + ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL); + ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL); + ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f"); + ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic); + ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams"); + ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic); + + ImGui::Text("Sliders"); + ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d"); + ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u"); + ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d"); + ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u"); + ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d"); + ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d"); + ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d"); + ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); + ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); + ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); + ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64); + ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64); + ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); + ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); + ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams"); + ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams"); + + ImGui::Text("Sliders (reverse)"); + ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d"); + ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u"); + ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d"); + ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u"); + ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms"); + + static bool inputs_step = true; + ImGui::Text("Inputs"); + ImGui::Checkbox("Show step buttons", &inputs_step); + ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); + ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%08X", ImGuiInputTextFlags_CharsHexadecimal); + ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); + ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X", ImGuiInputTextFlags_CharsHexadecimal); + ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); + ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); + ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); + ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Multi-component Widgets")) + { + static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + static int vec4i[4] = { 1, 5, 100, 255 }; + + ImGui::InputFloat2("input float2", vec4f); + ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); + ImGui::InputInt2("input int2", vec4i); + ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); + ImGui::SliderInt2("slider int2", vec4i, 0, 255); + ImGui::Spacing(); + + ImGui::InputFloat3("input float3", vec4f); + ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); + ImGui::InputInt3("input int3", vec4i); + ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); + ImGui::SliderInt3("slider int3", vec4i, 0, 255); + ImGui::Spacing(); + + ImGui::InputFloat4("input float4", vec4f); + ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); + ImGui::InputInt4("input int4", vec4i); + ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); + ImGui::SliderInt4("slider int4", vec4i, 0, 255); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Vertical Sliders")) + { + const float spacing = 4; + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); + + static int int_value = 0; + ImGui::VSliderInt("##int", ImVec2(18, 160), &int_value, 0, 5); + ImGui::SameLine(); + + static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; + ImGui::PushID("set1"); + for (int i = 0; i < 7; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i / 7.0f, 0.5f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i / 7.0f, 0.9f, 0.9f)); + ImGui::VSliderFloat("##v", ImVec2(18, 160), &values[i], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values[i]); + ImGui::PopStyleColor(4); + ImGui::PopID(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set2"); + static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; + const int rows = 3; + const ImVec2 small_slider_size(18, (float)(int)((160.0f - (rows - 1) * spacing) / rows)); + for (int nx = 0; nx < 4; nx++) + { + if (nx > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + for (int ny = 0; ny < rows; ny++) + { + ImGui::PushID(nx * rows + ny); + ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values2[nx]); + ImGui::PopID(); + } + ImGui::EndGroup(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set3"); + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); + ImGui::VSliderFloat("##v", ImVec2(40, 160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); + ImGui::PopStyleVar(); + ImGui::PopID(); + } + ImGui::PopID(); + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Drag and Drop")) + { + if (ImGui::TreeNode("Drag and drop in standard widgets")) + { + // ColorEdit widgets automatically act as drag source and drag target. + // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F + // to allow your own widgets to use colors in their drag and drop interaction. + // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo. + HelpMarker("You can drag from the color squares."); + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::ColorEdit4("color 2", col2); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Drag and drop to copy/swap items")) + { + enum Mode + { + Mode_Copy, + Mode_Move, + Mode_Swap + }; + static int mode = 0; + if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine(); + if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine(); + if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; } + static const char* names[9] = + { + "Bobby", "Beatrice", "Betty", + "Brianna", "Barry", "Bernard", + "Bibi", "Blaine", "Bryn" + }; + for (int n = 0; n < IM_ARRAYSIZE(names); n++) + { + ImGui::PushID(n); + if ((n % 3) != 0) + ImGui::SameLine(); + ImGui::Button(names[n], ImVec2(60, 60)); + + // Our buttons are both drag sources and drag targets here! + if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) + { + // Set payload to carry the index of our item (could be anything) + ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); + + // Display preview (could be anything, e.g. when dragging an image we could decide to display + // the filename and a small preview of the image, etc.) + if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } + if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); } + if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); } + ImGui::EndDragDropSource(); + } + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL")) + { + IM_ASSERT(payload->DataSize == sizeof(int)); + int payload_n = *(const int*)payload->Data; + if (mode == Mode_Copy) + { + names[n] = names[payload_n]; + } + if (mode == Mode_Move) + { + names[n] = names[payload_n]; + names[payload_n] = ""; + } + if (mode == Mode_Swap) + { + const char* tmp = names[n]; + names[n] = names[payload_n]; + names[payload_n] = tmp; + } + } + ImGui::EndDragDropTarget(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Drag to reorder items (simple)")) + { + // Simple reordering + HelpMarker( + "We don't use the drag and drop api at all here! " + "Instead we query when the item is held but not hovered, and order items accordingly."); + static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" }; + for (int n = 0; n < IM_ARRAYSIZE(item_names); n++) + { + const char* item = item_names[n]; + ImGui::Selectable(item); + + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) + { + int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1); + if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names)) + { + item_names[n] = item_names[n_next]; + item_names[n_next] = item; + ImGui::ResetMouseDragDelta(); + } + } + } + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Querying Status (Edited/Active/Focused/Hovered etc.)")) + { + // Select an item type + const char* item_names[] = + { + "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputFloat", + "InputFloat3", "ColorEdit4", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox" + }; + static int item_type = 1; + ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); + ImGui::SameLine(); + HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered()."); + + // Submit selected item item so we can query their status in the code following it. + bool ret = false; + static bool b = false; + static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f }; + static char str[16] = {}; + if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction + if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button + if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater) + if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox + if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item + if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing) + if (item_type == 6) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input + if (item_type == 7) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 8) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) + if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node + if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. + if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); } + if (item_type == 13){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } + + // Display the values of IsItemHovered() and other common item state functions. + // Note that the ImGuiHoveredFlags_XXX flags can be combined. + // Because BulletText is an item itself and that would affect the output of IsItemXXX functions, + // we query every state in a single call to avoid storing them and to simplify the code. + ImGui::BulletText( + "Return value = %d\n" + "IsItemFocused() = %d\n" + "IsItemHovered() = %d\n" + "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsItemHovered(_AllowWhenOverlapped) = %d\n" + "IsItemHovered(_RectOnly) = %d\n" + "IsItemActive() = %d\n" + "IsItemEdited() = %d\n" + "IsItemActivated() = %d\n" + "IsItemDeactivated() = %d\n" + "IsItemDeactivatedAfterEdit() = %d\n" + "IsItemVisible() = %d\n" + "IsItemClicked() = %d\n" + "IsItemToggledOpen() = %d\n" + "GetItemRectMin() = (%.1f, %.1f)\n" + "GetItemRectMax() = (%.1f, %.1f)\n" + "GetItemRectSize() = (%.1f, %.1f)", + ret, + ImGui::IsItemFocused(), + ImGui::IsItemHovered(), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), + ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), + ImGui::IsItemActive(), + ImGui::IsItemEdited(), + ImGui::IsItemActivated(), + ImGui::IsItemDeactivated(), + ImGui::IsItemDeactivatedAfterEdit(), + ImGui::IsItemVisible(), + ImGui::IsItemClicked(), + ImGui::IsItemToggledOpen(), + ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y, + ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y, + ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y + ); + + static bool embed_all_inside_a_child_window = false; + ImGui::Checkbox("Embed everything inside a child window (for additional testing)", &embed_all_inside_a_child_window); + if (embed_all_inside_a_child_window) + ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true); + + // Testing IsWindowFocused() function with its various flags. + // Note that the ImGuiFocusedFlags_XXX flags can be combined. + ImGui::BulletText( + "IsWindowFocused() = %d\n" + "IsWindowFocused(_ChildWindows) = %d\n" + "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" + "IsWindowFocused(_RootWindow) = %d\n" + "IsWindowFocused(_AnyWindow) = %d\n", + ImGui::IsWindowFocused(), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)); + + // Testing IsWindowHovered() function with its various flags. + // Note that the ImGuiHoveredFlags_XXX flags can be combined. + ImGui::BulletText( + "IsWindowHovered() = %d\n" + "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsWindowHovered(_ChildWindows) = %d\n" + "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" + "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_RootWindow) = %d\n" + "IsWindowHovered(_AnyWindow) = %d\n", + ImGui::IsWindowHovered(), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); + + ImGui::BeginChild("child", ImVec2(0, 50), true); + ImGui::Text("This is another child window for testing the _ChildWindows flag."); + ImGui::EndChild(); + if (embed_all_inside_a_child_window) + ImGui::EndChild(); + + static char unused_str[] = "This widget is only here to be able to tab-out of the widgets above."; + ImGui::InputText("unused", unused_str, IM_ARRAYSIZE(unused_str), ImGuiInputTextFlags_ReadOnly); + + // Calling IsItemHovered() after begin returns the hovered status of the title bar. + // This is useful in particular if you want to create a context menu associated to the title bar of a window. + static bool test_window = false; + ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window); + if (test_window) + { + ImGui::Begin("Title bar Hovered/Active tests", &test_window); + if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered() + { + if (ImGui::MenuItem("Close")) { test_window = false; } + ImGui::EndPopup(); + } + ImGui::Text( + "IsItemHovered() after begin = %d (== is title bar hovered)\n" + "IsItemActive() after begin = %d (== is window being clicked/moved)\n", + ImGui::IsItemHovered(), ImGui::IsItemActive()); + ImGui::End(); + } + + ImGui::TreePop(); + } +} + +static void ShowDemoWindowLayout() +{ + if (!ImGui::CollapsingHeader("Layout & Scrolling")) + return; + + if (ImGui::TreeNode("Child windows")) + { + HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window."); + static bool disable_mouse_wheel = false; + static bool disable_menu = false; + ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); + ImGui::Checkbox("Disable Menu", &disable_menu); + + // Child 1: no border, enable horizontal scrollbar + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + ImGui::BeginChild("ChildL", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f, 260), false, window_flags); + for (int i = 0; i < 100; i++) + ImGui::Text("%04d: scrollable region", i); + ImGui::EndChild(); + } + + ImGui::SameLine(); + + // Child 2: rounded border + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_None; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + if (!disable_menu) + window_flags |= ImGuiWindowFlags_MenuBar; + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); + ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags); + if (!disable_menu && ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) + { + for (int i = 0; i < 100; i++) + { + char buf[32]; + sprintf(buf, "%03d", i); + ImGui::TableNextColumn(); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + ImGui::EndTable(); + } + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + + ImGui::Separator(); + + // Demonstrate a few extra things + // - Changing ImGuiCol_ChildBg (which is transparent black in default styles) + // - Using SetCursorPos() to position child window (the child window is an item from the POV of parent window) + // You can also call SetNextWindowPos() to position the child window. The parent window will effectively + // layout from this position. + // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from + // the POV of the parent window). See 'Demo->Querying Status (Active/Focused/Hovered etc.)' for details. + { + static int offset_x = 0; + ImGui::SetNextItemWidth(100); + ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000); + + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x); + ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); + ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None); + for (int n = 0; n < 50; n++) + ImGui::Text("Some test %d", n); + ImGui::EndChild(); + bool child_is_hovered = ImGui::IsItemHovered(); + ImVec2 child_rect_min = ImGui::GetItemRectMin(); + ImVec2 child_rect_max = ImGui::GetItemRectMax(); + ImGui::PopStyleColor(); + ImGui::Text("Hovered: %d", child_is_hovered); + ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Widgets Width")) + { + // Use SetNextItemWidth() to set the width of a single upcoming item. + // Use PushItemWidth()/PopItemWidth() to set the width of a group of items. + // In real code use you'll probably want to choose width values that are proportional to your font size + // e.g. Using '20.0f * GetFontSize()' as width instead of '200.0f', etc. + + static float f = 0.0f; + static bool show_indented_items = true; + ImGui::Checkbox("Show indented items", &show_indented_items); + + ImGui::Text("SetNextItemWidth/PushItemWidth(100)"); + ImGui::SameLine(); HelpMarker("Fixed width."); + ImGui::PushItemWidth(100); + ImGui::DragFloat("float##1b", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##1b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-100)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus 100"); + ImGui::PushItemWidth(-100); + ImGui::DragFloat("float##2a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##2b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##3a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##3b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus half"); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##4a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##4b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + // Demonstrate using PushItemWidth to surround three items. + // Calling SetNextItemWidth() before each of them would have the same effect. + ImGui::Text("SetNextItemWidth/PushItemWidth(-FLT_MIN)"); + ImGui::SameLine(); HelpMarker("Align to right edge"); + ImGui::PushItemWidth(-FLT_MIN); + ImGui::DragFloat("##float5a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##5b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Basic Horizontal Layout")) + { + ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); + + // Text + ImGui::Text("Two items: Hello"); ImGui::SameLine(); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Adjust spacing + ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Button + ImGui::AlignTextToFramePadding(); + ImGui::Text("Normal buttons"); ImGui::SameLine(); + ImGui::Button("Banana"); ImGui::SameLine(); + ImGui::Button("Apple"); ImGui::SameLine(); + ImGui::Button("Corniflower"); + + // Button + ImGui::Text("Small buttons"); ImGui::SameLine(); + ImGui::SmallButton("Like this one"); ImGui::SameLine(); + ImGui::Text("can fit within a text block."); + + // Aligned to arbitrary position. Easy/cheap column. + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::Text("x=150"); + ImGui::SameLine(300); ImGui::Text("x=300"); + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::SmallButton("x=150"); + ImGui::SameLine(300); ImGui::SmallButton("x=300"); + + // Checkbox + static bool c1 = false, c2 = false, c3 = false, c4 = false; + ImGui::Checkbox("My", &c1); ImGui::SameLine(); + ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); + ImGui::Checkbox("Is", &c3); ImGui::SameLine(); + ImGui::Checkbox("Rich", &c4); + + // Various + static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f; + ImGui::PushItemWidth(80); + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; + static int item = -1; + ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); + ImGui::SliderFloat("X", &f0, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Y", &f1, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Z", &f2, 0.0f, 5.0f); + ImGui::PopItemWidth(); + + ImGui::PushItemWidth(80); + ImGui::Text("Lists:"); + static int selection[4] = { 0, 1, 2, 3 }; + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); + ImGui::PopID(); + //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); + } + ImGui::PopItemWidth(); + + // Dummy + ImVec2 button_sz(40, 40); + ImGui::Button("A", button_sz); ImGui::SameLine(); + ImGui::Dummy(button_sz); ImGui::SameLine(); + ImGui::Button("B", button_sz); + + // Manually wrapping + // (we should eventually provide this as an automatic layout feature, but for now you can do it manually) + ImGui::Text("Manually wrapping:"); + ImGuiStyle& style = ImGui::GetStyle(); + int buttons_count = 20; + float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x; + for (int n = 0; n < buttons_count; n++) + { + ImGui::PushID(n); + ImGui::Button("Box", button_sz); + float last_button_x2 = ImGui::GetItemRectMax().x; + float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x; // Expected position if next button was on same line + if (n + 1 < buttons_count && next_button_x2 < window_visible_x2) + ImGui::SameLine(); + ImGui::PopID(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Groups")) + { + HelpMarker( + "BeginGroup() basically locks the horizontal position for new line. " + "EndGroup() bundles the whole group so that you can use \"item\" functions such as " + "IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group."); + ImGui::BeginGroup(); + { + ImGui::BeginGroup(); + ImGui::Button("AAA"); + ImGui::SameLine(); + ImGui::Button("BBB"); + ImGui::SameLine(); + ImGui::BeginGroup(); + ImGui::Button("CCC"); + ImGui::Button("DDD"); + ImGui::EndGroup(); + ImGui::SameLine(); + ImGui::Button("EEE"); + ImGui::EndGroup(); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("First group hovered"); + } + // Capture the group size and create widgets using the same size + ImVec2 size = ImGui::GetItemRectSize(); + const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; + ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); + + ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::SameLine(); + ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::EndGroup(); + ImGui::SameLine(); + + ImGui::Button("LEVERAGE\nBUZZWORD", size); + ImGui::SameLine(); + + if (ImGui::BeginListBox("List", size)) + { + ImGui::Selectable("Selected", true); + ImGui::Selectable("Not Selected", false); + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Text Baseline Alignment")) + { + { + ImGui::BulletText("Text baseline:"); + ImGui::SameLine(); HelpMarker( + "This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. " + "Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets."); + ImGui::Indent(); + + ImGui::Text("KO Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("Baseline of button will look misaligned with text.."); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + // (because we don't know what's coming after the Text() statement, we need to move the text baseline + // down by FramePadding.y ahead of time) + ImGui::AlignTextToFramePadding(); + ImGui::Text("OK Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y"); + + // SmallButton() uses the same vertical padding as Text + ImGui::Button("TEST##1"); ImGui::SameLine(); + ImGui::Text("TEST"); ImGui::SameLine(); + ImGui::SmallButton("TEST##2"); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Text aligned to framed item"); ImGui::SameLine(); + ImGui::Button("Item##1"); ImGui::SameLine(); + ImGui::Text("Item"); ImGui::SameLine(); + ImGui::SmallButton("Item##2"); ImGui::SameLine(); + ImGui::Button("Item##3"); + + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Multi-line text:"); + ImGui::Indent(); + ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("One\nTwo\nThree"); + + ImGui::Button("HOP##1"); ImGui::SameLine(); + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Button("HOP##2"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Misc items:"); + ImGui::Indent(); + + // SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button. + ImGui::Button("80x80", ImVec2(80, 80)); + ImGui::SameLine(); + ImGui::Button("50x50", ImVec2(50, 50)); + ImGui::SameLine(); + ImGui::Button("Button()"); + ImGui::SameLine(); + ImGui::SmallButton("SmallButton()"); + + // Tree + const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::Button("Button##1"); + ImGui::SameLine(0.0f, spacing); + if (ImGui::TreeNode("Node##1")) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. + // Otherwise you can use SmallButton() (smaller fit). + ImGui::AlignTextToFramePadding(); + + // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add + // other contents below the node. + bool node_open = ImGui::TreeNode("Node##2"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); + if (node_open) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Bullet + ImGui::Button("Button##3"); + ImGui::SameLine(0.0f, spacing); + ImGui::BulletText("Bullet text"); + + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Node"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); + ImGui::Unindent(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Scrolling")) + { + // Vertical scroll functions + HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position."); + + static int track_item = 50; + static bool enable_track = true; + static bool enable_extra_decorations = false; + static float scroll_to_off_px = 0.0f; + static float scroll_to_pos_px = 200.0f; + + ImGui::Checkbox("Decoration", &enable_extra_decorations); + + ImGui::Checkbox("Track", &enable_track); + ImGui::PushItemWidth(100); + ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d"); + + bool scroll_to_off = ImGui::Button("Scroll Offset"); + ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px"); + + bool scroll_to_pos = ImGui::Button("Scroll To Pos"); + ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px"); + ImGui::PopItemWidth(); + + if (scroll_to_off || scroll_to_pos) + enable_track = false; + + ImGuiStyle& style = ImGui::GetStyle(); + float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5; + if (child_w < 1.0f) + child_w = 1.0f; + ImGui::PushID("##VerticalScrolling"); + for (int i = 0; i < 5; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" }; + ImGui::TextUnformatted(names[i]); + + const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0; + const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags); + if (ImGui::BeginMenuBar()) + { + ImGui::TextUnformatted("abc"); + ImGui::EndMenuBar(); + } + if (scroll_to_off) + ImGui::SetScrollY(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom + } + else + { + ImGui::Text("Item %d", item); + } + } + } + float scroll_y = ImGui::GetScrollY(); + float scroll_max_y = ImGui::GetScrollMaxY(); + ImGui::EndChild(); + ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y); + ImGui::EndGroup(); + } + ImGui::PopID(); + + // Horizontal scroll functions + ImGui::Spacing(); + HelpMarker( + "Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n" + "Because the clipping rectangle of most window hides half worth of WindowPadding on the " + "left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the " + "equivalent SetScrollFromPosY(+1) wouldn't."); + ImGui::PushID("##HorizontalScrolling"); + for (int i = 0; i < 5; i++) + { + float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f; + ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0); + ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags); + if (scroll_to_off) + ImGui::SetScrollX(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right + } + else + { + ImGui::Text("Item %d", item); + } + ImGui::SameLine(); + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::SameLine(); + const char* names[] = { "Left", "25%", "Center", "75%", "Right" }; + ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x); + ImGui::Spacing(); + } + ImGui::PopID(); + + // Miscellaneous Horizontal Scrolling Demo + HelpMarker( + "Horizontal scrolling for a window is enabled via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\n" + "You may want to also explicitly specify content width by using SetNextWindowContentWidth() before Begin()."); + static int lines = 7; + ImGui::SliderInt("Lines", &lines, 1, 15); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); + ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30); + ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar); + for (int line = 0; line < lines; line++) + { + // Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine() + // If you want to create your own time line for a real application you may be better off manipulating + // the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets + // yourself. You may also want to use the lower-level ImDrawList API. + int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); + for (int n = 0; n < num_buttons; n++) + { + if (n > 0) ImGui::SameLine(); + ImGui::PushID(n + line * 1000); + char num_buf[16]; + sprintf(num_buf, "%d", n); + const char* label = (!(n % 15)) ? "FizzBuzz" : (!(n % 3)) ? "Fizz" : (!(n % 5)) ? "Buzz" : num_buf; + float hue = n * 0.05f; + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); + ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::PopStyleVar(2); + float scroll_x_delta = 0.0f; + ImGui::SmallButton("<<"); + if (ImGui::IsItemActive()) + scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("Scroll from code"); ImGui::SameLine(); + ImGui::SmallButton(">>"); + if (ImGui::IsItemActive()) + scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); + if (scroll_x_delta != 0.0f) + { + // Demonstrate a trick: you can use Begin to set yourself in the context of another window + // (here we are already out of your child window) + ImGui::BeginChild("scrolling"); + ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); + ImGui::EndChild(); + } + ImGui::Spacing(); + + static bool show_horizontal_contents_size_demo_window = false; + ImGui::Checkbox("Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window); + + if (show_horizontal_contents_size_demo_window) + { + static bool show_h_scrollbar = true; + static bool show_button = true; + static bool show_tree_nodes = true; + static bool show_text_wrapped = false; + static bool show_columns = true; + static bool show_tab_bar = true; + static bool show_child = false; + static bool explicit_content_size = false; + static float contents_size_x = 300.0f; + if (explicit_content_size) + ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f)); + ImGui::Begin("Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); + HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); + ImGui::Checkbox("H-scrollbar", &show_h_scrollbar); + ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten) + ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width + ImGui::Checkbox("Text wrapped", &show_text_wrapped);// Will grow and use contents size + ImGui::Checkbox("Columns", &show_columns); // Will use contents size + ImGui::Checkbox("Tab bar", &show_tab_bar); // Will use contents size + ImGui::Checkbox("Child", &show_child); // Will grow and use contents size + ImGui::Checkbox("Explicit content size", &explicit_content_size); + ImGui::Text("Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY()); + if (explicit_content_size) + { + ImGui::SameLine(); + ImGui::SetNextItemWidth(100); + ImGui::DragFloat("##csx", &contents_size_x); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE); + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE); + ImGui::Dummy(ImVec2(0, 10)); + } + ImGui::PopStyleVar(2); + ImGui::Separator(); + if (show_button) + { + ImGui::Button("this is a 300-wide button", ImVec2(300, 0)); + } + if (show_tree_nodes) + { + bool open = true; + if (ImGui::TreeNode("this is a tree node")) + { + if (ImGui::TreeNode("another one of those tree node...")) + { + ImGui::Text("Some tree contents"); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + ImGui::CollapsingHeader("CollapsingHeader", &open); + } + if (show_text_wrapped) + { + ImGui::TextWrapped("This text should automatically wrap on the edge of the work rectangle."); + } + if (show_columns) + { + ImGui::Text("Tables:"); + if (ImGui::BeginTable("table", 4, ImGuiTableFlags_Borders)) + { + for (int n = 0; n < 4; n++) + { + ImGui::TableNextColumn(); + ImGui::Text("Width %.2f", ImGui::GetContentRegionAvail().x); + } + ImGui::EndTable(); + } + ImGui::Text("Columns:"); + ImGui::Columns(4); + for (int n = 0; n < 4; n++) + { + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::NextColumn(); + } + ImGui::Columns(1); + } + if (show_tab_bar && ImGui::BeginTabBar("Hello")) + { + if (ImGui::BeginTabItem("OneOneOne")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("TwoTwoTwo")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("ThreeThreeThree")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("FourFourFour")) { ImGui::EndTabItem(); } + ImGui::EndTabBar(); + } + if (show_child) + { + ImGui::BeginChild("child", ImVec2(0, 0), true); + ImGui::EndChild(); + } + ImGui::End(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Clipping")) + { + static ImVec2 size(100.0f, 100.0f); + static ImVec2 offset(30.0f, 30.0f); + ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f"); + ImGui::TextWrapped("(Click and drag to scroll)"); + + for (int n = 0; n < 3; n++) + { + if (n > 0) + ImGui::SameLine(); + ImGui::PushID(n); + ImGui::BeginGroup(); // Lock X position + + ImGui::InvisibleButton("##empty", size); + if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) + { + offset.x += ImGui::GetIO().MouseDelta.x; + offset.y += ImGui::GetIO().MouseDelta.y; + } + const ImVec2 p0 = ImGui::GetItemRectMin(); + const ImVec2 p1 = ImGui::GetItemRectMax(); + const char* text_str = "Line 1 hello\nLine 2 clip me!"; + const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + switch (n) + { + case 0: + HelpMarker( + "Using ImGui::PushClipRect():\n" + "Will alter ImGui hit-testing logic + ImDrawList rendering.\n" + "(use this if you want your clipping rectangle to affect interactions)"); + ImGui::PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + ImGui::PopClipRect(); + break; + case 1: + HelpMarker( + "Using ImDrawList::PushClipRect():\n" + "Will alter ImDrawList rendering only.\n" + "(use this as a shortcut if you are only using ImDrawList calls)"); + draw_list->PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + draw_list->PopClipRect(); + break; + case 2: + HelpMarker( + "Using ImDrawList::AddText() with a fine ClipRect:\n" + "Will alter only this specific ImDrawList::AddText() rendering.\n" + "(this is often used internally to avoid altering the clipping rectangle and minimize draw calls)"); + ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y); // AddText() takes a ImVec4* here so let's convert. + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect); + break; + } + ImGui::EndGroup(); + ImGui::PopID(); + } + + ImGui::TreePop(); + } +} + +static void ShowDemoWindowPopups() +{ + if (!ImGui::CollapsingHeader("Popups & Modal windows")) + return; + + // The properties of popups windows are: + // - They block normal mouse hovering detection outside them. (*) + // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as + // we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(). + // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even + // when normally blocked by a popup. + // Those three properties are connected. The library needs to hold their visibility state BECAUSE it can close + // popups at any time. + + // Typical use for regular windows: + // bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End(); + // Typical use for popups: + // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); } + + // With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state. + // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below. + + if (ImGui::TreeNode("Popups")) + { + ImGui::TextWrapped( + "When a popup is active, it inhibits interacting with windows that are behind the popup. " + "Clicking outside the popup closes it."); + + static int selected_fish = -1; + const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; + static bool toggles[] = { true, false, false, false, false }; + + // Simple selection popup (if you want to show the current selection inside the Button itself, + // you may want to build a string using the "###" operator to preserve a constant ID with a variable label) + if (ImGui::Button("Select..")) + ImGui::OpenPopup("my_select_popup"); + ImGui::SameLine(); + ImGui::TextUnformatted(selected_fish == -1 ? "<None>" : names[selected_fish]); + if (ImGui::BeginPopup("my_select_popup")) + { + ImGui::Text("Aquarium"); + ImGui::Separator(); + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + if (ImGui::Selectable(names[i])) + selected_fish = i; + ImGui::EndPopup(); + } + + // Showing a menu with toggles + if (ImGui::Button("Toggle..")) + ImGui::OpenPopup("my_toggle_popup"); + if (ImGui::BeginPopup("my_toggle_popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + ImGui::EndMenu(); + } + + ImGui::Separator(); + ImGui::Text("Tooltip here"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip over a popup"); + + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + ImGui::Text("I am the last one here."); + ImGui::EndPopup(); + } + ImGui::EndMenu(); + } + ImGui::EndPopup(); + } + ImGui::EndPopup(); + } + + // Call the more complete ShowExampleMenuFile which we use in various places of this demo + if (ImGui::Button("File Menu..")) + ImGui::OpenPopup("my_file_popup"); + if (ImGui::BeginPopup("my_file_popup")) + { + ShowExampleMenuFile(); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Context menus")) + { + // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: + // if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + // OpenPopup(id); + // return BeginPopup(id); + // For more advanced uses you may want to replicate and customize this code. + // See details in BeginPopupContextItem(). + static float value = 0.5f; + ImGui::Text("Value = %.3f (<-- right-click here)", value); + if (ImGui::BeginPopupContextItem("item context menu")) + { + if (ImGui::Selectable("Set to zero")) value = 0.0f; + if (ImGui::Selectable("Set to PI")) value = 3.1415f; + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); + ImGui::EndPopup(); + } + + // We can also use OpenPopupOnItemClick() which is the same as BeginPopupContextItem() but without the + // Begin() call. So here we will make it that clicking on the text field with the right mouse button (1) + // will toggle the visibility of the popup above. + ImGui::Text("(You can also right-click me to open the same popup as above.)"); + ImGui::OpenPopupOnItemClick("item context menu", 1); + + // When used after an item that has an ID (e.g.Button), we can skip providing an ID to BeginPopupContextItem(). + // BeginPopupContextItem() will use the last item ID as the popup ID. + // In addition here, we want to include your editable label inside the button label. + // We use the ### operator to override the ID (read FAQ about ID for details) + static char name[32] = "Label1"; + char buf[64]; + sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label + ImGui::Button(buf); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("Edit name:"); + ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Modals")) + { + ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside."); + + if (ImGui::Button("Delete..")) + ImGui::OpenPopup("Delete?"); + + // Always center this window when appearing + ImVec2 center = ImGui::GetMainViewport()->GetCenter(); + ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + + if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n"); + ImGui::Separator(); + + //static int unused_i = 0; + //ImGui::Combo("Combo", &unused_i, "Delete\0Delete harder\0"); + + static bool dont_ask_me_next_time = false; + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); + ImGui::PopStyleVar(); + + if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::SetItemDefaultFocus(); + ImGui::SameLine(); + if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::EndPopup(); + } + + if (ImGui::Button("Stacked modals..")) + ImGui::OpenPopup("Stacked 1"); + if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Some menu item")) {} + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it."); + + // Testing behavior of widgets stacking their own regular popups over the modal. + static int item = 1; + static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + ImGui::ColorEdit4("color", color); + + if (ImGui::Button("Add another modal..")) + ImGui::OpenPopup("Stacked 2"); + + // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which + // will close the popup. Note that the visibility state of popups is owned by imgui, so the input value + // of the bool actually doesn't matter here. + bool unused_open = true; + if (ImGui::BeginPopupModal("Stacked 2", &unused_open)) + { + ImGui::Text("Hello from Stacked The Second!"); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Menus inside a regular window")) + { + ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); + ImGui::Separator(); + + // Note: As a quirk in this very specific example, we want to differentiate the parent of this menu from the + // parent of the various popup menus above. To do so we are encloding the items in a PushID()/PopID() block + // to make them two different menusets. If we don't, opening any popup above and hovering our menu here would + // open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, + // which is the desired behavior for regular menus. + ImGui::PushID("foo"); + ImGui::MenuItem("Menu item", "CTRL+M"); + if (ImGui::BeginMenu("Menu inside a regular window")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::PopID(); + ImGui::Separator(); + ImGui::TreePop(); + } +} + +// Dummy data structure that we use for the Table demo. +// (pre-C++11 doesn't allow us to instantiate ImVector<MyItem> template if this structure if defined inside the demo function) +namespace +{ +// We are passing our own identifier to TableSetupColumn() to facilitate identifying columns in the sorting code. +// This identifier will be passed down into ImGuiTableSortSpec::ColumnUserID. +// But it is possible to omit the user id parameter of TableSetupColumn() and just use the column index instead! (ImGuiTableSortSpec::ColumnIndex) +// If you don't use sorting, you will generally never care about giving column an ID! +enum MyItemColumnID +{ + MyItemColumnID_ID, + MyItemColumnID_Name, + MyItemColumnID_Action, + MyItemColumnID_Quantity, + MyItemColumnID_Description +}; + +struct MyItem +{ + int ID; + const char* Name; + int Quantity; + + // We have a problem which is affecting _only this demo_ and should not affect your code: + // As we don't rely on std:: or other third-party library to compile dear imgui, we only have reliable access to qsort(), + // however qsort doesn't allow passing user data to comparing function. + // As a workaround, we are storing the sort specs in a static/global for the comparing function to access. + // In your own use case you would probably pass the sort specs to your sorting/comparing functions directly and not use a global. + // We could technically call ImGui::TableGetSortSpecs() in CompareWithSortSpecs(), but considering that this function is called + // very often by the sorting algorithm it would be a little wasteful. + static const ImGuiTableSortSpecs* s_current_sort_specs; + + // Compare function to be used by qsort() + static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs) + { + const MyItem* a = (const MyItem*)lhs; + const MyItem* b = (const MyItem*)rhs; + for (int n = 0; n < s_current_sort_specs->SpecsCount; n++) + { + // Here we identify columns using the ColumnUserID value that we ourselves passed to TableSetupColumn() + // We could also choose to identify columns based on their index (sort_spec->ColumnIndex), which is simpler! + const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n]; + int delta = 0; + switch (sort_spec->ColumnUserID) + { + case MyItemColumnID_ID: delta = (a->ID - b->ID); break; + case MyItemColumnID_Name: delta = (strcmp(a->Name, b->Name)); break; + case MyItemColumnID_Quantity: delta = (a->Quantity - b->Quantity); break; + case MyItemColumnID_Description: delta = (strcmp(a->Name, b->Name)); break; + default: IM_ASSERT(0); break; + } + if (delta > 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1; + if (delta < 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1; + } + + // qsort() is instable so always return a way to differenciate items. + // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs. + return (a->ID - b->ID); + } +}; +const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL; +} + +// Make the UI compact because there are so many fields +static void PushStyleCompact() +{ + ImGuiStyle& style = ImGui::GetStyle(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, (float)(int)(style.FramePadding.y * 0.60f))); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x, (float)(int)(style.ItemSpacing.y * 0.60f))); +} + +static void PopStyleCompact() +{ + ImGui::PopStyleVar(2); +} + +// Show a combo box with a choice of sizing policies +static void EditTableSizingFlags(ImGuiTableFlags* p_flags) +{ + struct EnumDesc { ImGuiTableFlags Value; const char* Name; const char* Tooltip; }; + static const EnumDesc policies[] = + { + { ImGuiTableFlags_None, "Default", "Use default sizing policy:\n- ImGuiTableFlags_SizingFixedFit if ScrollX is on or if host window has ImGuiWindowFlags_AlwaysAutoResize.\n- ImGuiTableFlags_SizingStretchSame otherwise." }, + { ImGuiTableFlags_SizingFixedFit, "ImGuiTableFlags_SizingFixedFit", "Columns default to _WidthFixed (if resizable) or _WidthAuto (if not resizable), matching contents width." }, + { ImGuiTableFlags_SizingFixedSame, "ImGuiTableFlags_SizingFixedSame", "Columns are all the same width, matching the maximum contents width.\nImplicitly disable ImGuiTableFlags_Resizable and enable ImGuiTableFlags_NoKeepColumnsVisible." }, + { ImGuiTableFlags_SizingStretchProp, "ImGuiTableFlags_SizingStretchProp", "Columns default to _WidthStretch with weights proportional to their widths." }, + { ImGuiTableFlags_SizingStretchSame, "ImGuiTableFlags_SizingStretchSame", "Columns default to _WidthStretch with same weights." } + }; + int idx; + for (idx = 0; idx < IM_ARRAYSIZE(policies); idx++) + if (policies[idx].Value == (*p_flags & ImGuiTableFlags_SizingMask_)) + break; + const char* preview_text = (idx < IM_ARRAYSIZE(policies)) ? policies[idx].Name + (idx > 0 ? strlen("ImGuiTableFlags") : 0) : ""; + if (ImGui::BeginCombo("Sizing Policy", preview_text)) + { + for (int n = 0; n < IM_ARRAYSIZE(policies); n++) + if (ImGui::Selectable(policies[n].Name, idx == n)) + *p_flags = (*p_flags & ~ImGuiTableFlags_SizingMask_) | policies[n].Value; + ImGui::EndCombo(); + } + ImGui::SameLine(); + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); + for (int m = 0; m < IM_ARRAYSIZE(policies); m++) + { + ImGui::Separator(); + ImGui::Text("%s:", policies[m].Name); + ImGui::Separator(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().IndentSpacing * 0.5f); + ImGui::TextUnformatted(policies[m].Tooltip); + } + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags) +{ + ImGui::CheckboxFlags("_DefaultHide", p_flags, ImGuiTableColumnFlags_DefaultHide); + ImGui::CheckboxFlags("_DefaultSort", p_flags, ImGuiTableColumnFlags_DefaultSort); + if (ImGui::CheckboxFlags("_WidthStretch", p_flags, ImGuiTableColumnFlags_WidthStretch)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthStretch); + if (ImGui::CheckboxFlags("_WidthFixed", p_flags, ImGuiTableColumnFlags_WidthFixed)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthFixed); + ImGui::CheckboxFlags("_NoResize", p_flags, ImGuiTableColumnFlags_NoResize); + ImGui::CheckboxFlags("_NoReorder", p_flags, ImGuiTableColumnFlags_NoReorder); + ImGui::CheckboxFlags("_NoHide", p_flags, ImGuiTableColumnFlags_NoHide); + ImGui::CheckboxFlags("_NoClip", p_flags, ImGuiTableColumnFlags_NoClip); + ImGui::CheckboxFlags("_NoSort", p_flags, ImGuiTableColumnFlags_NoSort); + ImGui::CheckboxFlags("_NoSortAscending", p_flags, ImGuiTableColumnFlags_NoSortAscending); + ImGui::CheckboxFlags("_NoSortDescending", p_flags, ImGuiTableColumnFlags_NoSortDescending); + ImGui::CheckboxFlags("_NoHeaderWidth", p_flags, ImGuiTableColumnFlags_NoHeaderWidth); + ImGui::CheckboxFlags("_PreferSortAscending", p_flags, ImGuiTableColumnFlags_PreferSortAscending); + ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending); + ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0"); + ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0"); +} + +static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags) +{ + ImGui::CheckboxFlags("_IsEnabled", &flags, ImGuiTableColumnFlags_IsEnabled); + ImGui::CheckboxFlags("_IsVisible", &flags, ImGuiTableColumnFlags_IsVisible); + ImGui::CheckboxFlags("_IsSorted", &flags, ImGuiTableColumnFlags_IsSorted); + ImGui::CheckboxFlags("_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered); +} + +static void ShowDemoWindowTables() +{ + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (!ImGui::CollapsingHeader("Tables & Columns")) + return; + + // Using those as a base value to create width/height that are factor of the size of our font + const float TEXT_BASE_WIDTH = ImGui::CalcTextSize("A").x; + const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); + + ImGui::PushID("Tables"); + + int open_action = -1; + if (ImGui::Button("Open all")) + open_action = 1; + ImGui::SameLine(); + if (ImGui::Button("Close all")) + open_action = 0; + ImGui::SameLine(); + + // Options + static bool disable_indent = false; + ImGui::Checkbox("Disable tree indentation", &disable_indent); + ImGui::SameLine(); + HelpMarker("Disable the indenting of tree nodes so demo tables can use the full window width."); + ImGui::Separator(); + if (disable_indent) + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); + + // About Styling of tables + // Most settings are configured on a per-table basis via the flags passed to BeginTable() and TableSetupColumns APIs. + // There are however a few settings that a shared and part of the ImGuiStyle structure: + // style.CellPadding // Padding within each cell + // style.Colors[ImGuiCol_TableHeaderBg] // Table header background + // style.Colors[ImGuiCol_TableBorderStrong] // Table outer and header borders + // style.Colors[ImGuiCol_TableBorderLight] // Table inner borders + // style.Colors[ImGuiCol_TableRowBg] // Table row background when ImGuiTableFlags_RowBg is enabled (even rows) + // style.Colors[ImGuiCol_TableRowBgAlt] // Table row background when ImGuiTableFlags_RowBg is enabled (odds rows) + + // Demos + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Basic")) + { + // Here we will showcase three different ways to output a table. + // They are very simple variations of a same thing! + + // [Method 1] Using TableNextRow() to create a new row, and TableSetColumnIndex() to select the column. + // In many situations, this is the most flexible and easy to use pattern. + HelpMarker("Using TableNextRow() + calling TableSetColumnIndex() _before_ each cell, in a loop."); + if (ImGui::BeginTable("table1", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Row %d Column %d", row, column); + } + } + ImGui::EndTable(); + } + + // [Method 2] Using TableNextColumn() called multiple times, instead of using a for loop + TableSetColumnIndex(). + // This is generally more convenient when you have code manually submitting the contents of each columns. + HelpMarker("Using TableNextRow() + calling TableNextColumn() _before_ each cell, manually."); + if (ImGui::BeginTable("table2", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Row %d", row); + ImGui::TableNextColumn(); + ImGui::Text("Some contents"); + ImGui::TableNextColumn(); + ImGui::Text("123.456"); + } + ImGui::EndTable(); + } + + // [Method 3] We call TableNextColumn() _before_ each cell. We never call TableNextRow(), + // as TableNextColumn() will automatically wrap around and create new roes as needed. + // This is generally more convenient when your cells all contains the same type of data. + HelpMarker( + "Only using TableNextColumn(), which tends to be convenient for tables where every cells contains the same type of contents.\n" + "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition."); + if (ImGui::BeginTable("table3", 3)) + { + for (int item = 0; item < 14; item++) + { + ImGui::TableNextColumn(); + ImGui::Text("Item %d", item); + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Borders, background")) + { + // Expose a few Borders related flags interactively + enum ContentsType { CT_Text, CT_FillButton }; + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static bool display_headers = false; + static int contents_type = CT_Text; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterH"); + ImGui::Indent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags, ImGuiTableFlags_BordersInner); + ImGui::Unindent(); + + ImGui::AlignTextToFramePadding(); ImGui::Text("Cell contents:"); + ImGui::SameLine(); ImGui::RadioButton("Text", &contents_type, CT_Text); + ImGui::SameLine(); ImGui::RadioButton("FillButton", &contents_type, CT_FillButton); + ImGui::Checkbox("Display headers", &display_headers); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Display headers so we can inspect their interaction with borders. + // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details) + if (display_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + if (contents_type == CT_Text) + ImGui::TextUnformatted(buf); + else if (contents_type) + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Resizable, stretch")) + { + // By default, if we don't enable ScrollX the sizing policy for each columns is "Stretch" + // Each columns maintain a sizing weight, and they will occupy all available width. + static ImGuiTableFlags flags = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this."); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Resizable, fixed")) + { + // Here we use ImGuiTableFlags_SizingFixedFit (even though _ScrollX is not set) + // So columns will adopt the "Fixed" policy and will maintain a fixed width regardless of the whole available width (unless table is small) + // If there is not enough available width to fit all columns, they will however be resized down. + // FIXME-TABLE: Providing a stretch-on-init would make sense especially for tables which don't have saved settings + HelpMarker( + "Using _Resizable + _SizingFixedFit flags.\n" + "Fixed-width columns generally makes more sense if you want to use horizontal scrolling.\n\n" + "Double-click a column border to auto-fit the column to its contents."); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Resizable, mixed")) + { + HelpMarker( + "Using TableSetupColumn() to alter resizing policy on a per-column basis.\n\n" + "When combining Fixed and Stretch columns, generally you only want one, maybe two trailing columns to use _WidthStretch."); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + if (ImGui::BeginTable("table1", 3, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column == 2) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 6, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 6; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column >= 3) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Reorderable, hideable, with headers")) + { + HelpMarker( + "Click and drag column headers to reorder columns.\n\n" + "Right-click on a header to open a context menu."); + static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Submit columns name with TableSetupColumn() and call TableHeadersRow() to create a row with a header in each column. + // (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.) + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column) + if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f))) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Fixed %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Padding")) + { + // First example: showcase use of padding flags and effect of BorderOuterV/BorderInnerV on X padding. + // We don't expose BorderOuterH/BorderInnerH here because they have no effect on X padding. + HelpMarker( + "We often want outer padding activated when any using features which makes the edges of a column visible:\n" + "e.g.:\n" + "- BorderOuterV\n" + "- any form of row selection\n" + "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n" + "Actual padding values are using style.CellPadding.\n\n" + "In this demo we don't show horizontal borders to emphasis how they don't affect default horizontal padding."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags1, ImGuiTableFlags_PadOuterX); + ImGui::SameLine(); HelpMarker("Enable outer-most padding (default if ImGuiTableFlags_BordersOuterV is set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags1, ImGuiTableFlags_NoPadOuterX); + ImGui::SameLine(); HelpMarker("Disable outer-most padding (default if ImGuiTableFlags_BordersOuterV is not set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags1, ImGuiTableFlags_NoPadInnerX); + ImGui::SameLine(); HelpMarker("Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off)"); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags1, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags1, ImGuiTableFlags_BordersInnerV); + static bool show_headers = false; + ImGui::Checkbox("show_headers", &show_headers); + PopStyleCompact(); + + if (ImGui::BeginTable("table_padding", 3, flags1)) + { + if (show_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + { + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + } + else + { + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + //if (ImGui::TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) + // ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(0, 100, 0, 255)); + } + } + ImGui::EndTable(); + } + + // Second example: set style.CellPadding to (0.0) or a custom value. + // FIXME-TABLE: Vertical border effectively not displayed the same way as horizontal one... + HelpMarker("Setting style.CellPadding to (0,0) or a custom value."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static ImVec2 cell_padding(0.0f, 0.0f); + static bool show_widget_frame_bg = true; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags2, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags2, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags2, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags2, ImGuiTableFlags_BordersInner); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags2, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags2, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags2, ImGuiTableFlags_Resizable); + ImGui::Checkbox("show_widget_frame_bg", &show_widget_frame_bg); + ImGui::SliderFloat2("CellPadding", &cell_padding.x, 0.0f, 10.0f, "%.0f"); + PopStyleCompact(); + + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cell_padding); + if (ImGui::BeginTable("table_padding_2", 3, flags2)) + { + static char text_bufs[3 * 5][16]; // Mini text storage for 3x5 cells + static bool init = true; + if (!show_widget_frame_bg) + ImGui::PushStyleColor(ImGuiCol_FrameBg, 0); + for (int cell = 0; cell < 3 * 5; cell++) + { + ImGui::TableNextColumn(); + if (init) + strcpy(text_bufs[cell], "edit me"); + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::PushID(cell); + ImGui::InputText("##cell", text_bufs[cell], IM_ARRAYSIZE(text_bufs[cell])); + ImGui::PopID(); + } + if (!show_widget_frame_bg) + ImGui::PopStyleColor(); + init = false; + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Sizing policies")) + { + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags1, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + static ImGuiTableFlags sizing_policy_flags[4] = { ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp, ImGuiTableFlags_SizingStretchSame }; + for (int table_n = 0; table_n < 4; table_n++) + { + ImGui::PushID(table_n); + ImGui::SetNextItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&sizing_policy_flags[table_n]); + + // To make it easier to understand the different sizing policy, + // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width. + if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("AAAA"); + ImGui::TableNextColumn(); ImGui::Text("BBBBBBBB"); + ImGui::TableNextColumn(); ImGui::Text("CCCCCCCCCCCC"); + } + ImGui::EndTable(); + } + ImGui::PopID(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Advanced"); + ImGui::SameLine(); + HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns."); + + enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText }; + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable; + static int contents_type = CT_ShowWidth; + static int column_count = 3; + + PushStyleCompact(); + ImGui::PushID("Advanced"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&flags); + ImGui::Combo("Contents", &contents_type, "Show width\0Short Text\0Long Text\0Button\0Fill Button\0InputText\0"); + if (contents_type == CT_FillButton) + { + ImGui::SameLine(); + HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width."); + } + ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + + if (ImGui::BeginTable("table2", column_count, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 7))) + { + for (int cell = 0; cell < 10 * column_count; cell++) + { + ImGui::TableNextColumn(); + int column = ImGui::TableGetColumnIndex(); + int row = ImGui::TableGetRowIndex(); + + ImGui::PushID(cell); + char label[32]; + static char text_buf[32] = ""; + sprintf(label, "Hello %d,%d", column, row); + switch (contents_type) + { + case CT_ShortText: ImGui::TextUnformatted(label); break; + case CT_LongText: ImGui::Text("Some %s text %d,%d\nOver two lines..", column == 0 ? "long" : "longeeer", column, row); break; + case CT_ShowWidth: ImGui::Text("W: %.1f", ImGui::GetContentRegionAvail().x); break; + case CT_Button: ImGui::Button(label); break; + case CT_FillButton: ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); break; + case CT_InputText: ImGui::SetNextItemWidth(-FLT_MIN); ImGui::InputText("##", text_buf, IM_ARRAYSIZE(text_buf)); break; + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Vertical scrolling, with clipping")) + { + HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrolly", 3, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(0, 1); // Make top row always visible + ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None); + ImGui::TableHeadersRow(); + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(1000); + while (clipper.Step()) + { + for (int row = clipper.DisplayStart; row < clipper.DisplayEnd; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Horizontal scrolling")) + { + HelpMarker( + "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, " + "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n" + "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX," + "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions)."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + static int freeze_cols = 1; + static int freeze_rows = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrollx", 7, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of TableSetupScrollFreeze() + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableSetupColumn("Four"); + ImGui::TableSetupColumn("Five"); + ImGui::TableSetupColumn("Six"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 20; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 7; column++) + { + // Both TableNextColumn() and TableSetColumnIndex() return true when a column is visible or performing width measurement. + // Because here we know that: + // - A) all our columns are contributing the same to row height + // - B) column 0 is always visible, + // We only always submit this one column and can skip others. + // More advanced per-column clipping behaviors may benefit from polling the status flags via TableGetColumnFlags(). + if (!ImGui::TableSetColumnIndex(column) && column > 0) + continue; + if (column == 0) + ImGui::Text("Line %d", row); + else + ImGui::Text("Hello world %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Stretch + ScrollX"); + ImGui::SameLine(); + HelpMarker( + "Showcase using Stretch columns + ScrollX together: " + "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n" + "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + static float inner_width = 1000.0f; + PushStyleCompact(); + ImGui::PushID("flags3"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags2, ImGuiTableFlags_ScrollX); + ImGui::DragFloat("inner_width", &inner_width, 1.0f, 0.0f, FLT_MAX, "%.1f"); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 7, flags2, outer_size, inner_width)) + { + for (int cell = 0; cell < 20 * 7; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("Hello world %d,%d", ImGui::TableGetColumnIndex(), ImGui::TableGetRowIndex()); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Columns flags")) + { + // Create a first table just to show all the options/flags we want to make visible in our example! + const int column_count = 3; + const char* column_names[column_count] = { "One", "Two", "Three" }; + static ImGuiTableColumnFlags column_flags[column_count] = { ImGuiTableColumnFlags_DefaultSort, ImGuiTableColumnFlags_None, ImGuiTableColumnFlags_DefaultHide }; + static ImGuiTableColumnFlags column_flags_out[column_count] = { 0, 0, 0 }; // Output from TableGetColumnFlags() + + if (ImGui::BeginTable("table_columns_flags_checkboxes", column_count, ImGuiTableFlags_None)) + { + PushStyleCompact(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableNextColumn(); + ImGui::PushID(column); + ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation + ImGui::Text("'%s'", column_names[column]); + ImGui::Spacing(); + ImGui::Text("Input flags:"); + EditTableColumnsFlags(&column_flags[column]); + ImGui::Spacing(); + ImGui::Text("Output flags:"); + ShowTableColumnsStatusFlags(column_flags_out[column]); + ImGui::PopID(); + } + PopStyleCompact(); + ImGui::EndTable(); + } + + // Create the real table we care about for the example! + // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in + // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down) + const ImGuiTableFlags flags + = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV + | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable; + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9); + if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size)) + { + for (int column = 0; column < column_count; column++) + ImGui::TableSetupColumn(column_names[column], column_flags[column]); + ImGui::TableHeadersRow(); + for (int column = 0; column < column_count; column++) + column_flags_out[column] = ImGui::TableGetColumnFlags(column); + float indent_step = (float)((int)TEXT_BASE_WIDTH / 2); + for (int row = 0; row < 8; row++) + { + ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. + ImGui::TableNextRow(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %s", (column == 0) ? "Indented" : "Hello", ImGui::TableGetColumnName(column)); + } + } + ImGui::Unindent(indent_step * 8.0f); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Columns widths")) + { + HelpMarker("Using TableSetupColumn() to setup default width."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBodyUntilResize; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags1, ImGuiTableFlags_NoBordersInBodyUntilResize); + PopStyleCompact(); + if (ImGui::BeginTable("table1", 3, flags1)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("one", ImGuiTableColumnFlags_WidthFixed, 100.0f); // Default to 100.0f + ImGui::TableSetupColumn("two", ImGuiTableColumnFlags_WidthFixed, 200.0f); // Default to 200.0f + ImGui::TableSetupColumn("three", ImGuiTableColumnFlags_WidthFixed); // Default to auto + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host."); + + static ImGuiTableFlags flags2 = ImGuiTableFlags_None; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags2, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags2, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags2, ImGuiTableFlags_BordersOuterV); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 4, flags2)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 4; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Nested tables")) + { + HelpMarker("This demonstrate embedding a table into another table cell."); + + if (ImGui::BeginTable("table_nested1", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("A0"); + ImGui::TableSetupColumn("A1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextColumn(); + ImGui::Text("A0 Row 0"); + { + float rows_height = TEXT_BASE_HEIGHT * 2; + if (ImGui::BeginTable("table_nested2", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("B0"); + ImGui::TableSetupColumn("B1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 0"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 0"); + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 1"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 1"); + + ImGui::EndTable(); + } + } + ImGui::TableNextColumn(); ImGui::Text("A1 Row 0"); + ImGui::TableNextColumn(); ImGui::Text("A0 Row 1"); + ImGui::TableNextColumn(); ImGui::Text("A1 Row 1"); + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Row height")) + { + HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would requires a unique clipping rectangle per row."); + if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV)) + { + for (int row = 0; row < 10; row++) + { + float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row); + ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height); + ImGui::TableNextColumn(); + ImGui::Text("min_row_height = %.2f", min_row_height); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Outer size")) + { + // Showcasing use of ImGuiTableFlags_NoHostExtendX and ImGuiTableFlags_NoHostExtendY + // Important to that note how the two flags have slightly different behaviors! + ImGui::Text("Using NoHostExtendX and NoHostExtendY:"); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + PopStyleCompact(); + + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 5.5f); + if (ImGui::BeginTable("table1", 3, flags, outer_size)) + { + for (int row = 0; row < 10; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + ImGui::Text("Hello!"); + + ImGui::Spacing(); + + ImGui::Text("Using explicit size:"); + if (ImGui::BeginTable("table2", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + if (ImGui::BeginTable("table3", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(0, TEXT_BASE_HEIGHT * 1.5f); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Background color")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_RowBg; + static int row_bg_type = 1; + static int row_bg_target = 1; + static int cell_bg_type = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_RowBg automatically sets RowBg0 to alternative colors pulled from the Style."); + ImGui::Combo("row bg type", (int*)&row_bg_type, "None\0Red\0Gradient\0"); + ImGui::Combo("row bg target", (int*)&row_bg_target, "RowBg0\0RowBg1\0"); ImGui::SameLine(); HelpMarker("Target RowBg0 to override the alternating odd/even colors,\nTarget RowBg1 to blend with them."); + ImGui::Combo("cell bg type", (int*)&cell_bg_type, "None\0Blue\0"); ImGui::SameLine(); HelpMarker("We are colorizing cells to B1->C2 here."); + IM_ASSERT(row_bg_type >= 0 && row_bg_type <= 2); + IM_ASSERT(row_bg_target >= 0 && row_bg_target <= 1); + IM_ASSERT(cell_bg_type >= 0 && cell_bg_type <= 1); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 5, flags)) + { + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + + // Demonstrate setting a row background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBgX, ...)' + // We use a transparent color so we can see the one behind in case our target is RowBg1 and RowBg0 was already targeted by the ImGuiTableFlags_RowBg flag. + if (row_bg_type != 0) + { + ImU32 row_bg_color = ImGui::GetColorU32(row_bg_type == 1 ? ImVec4(0.7f, 0.3f, 0.3f, 0.65f) : ImVec4(0.2f + row * 0.1f, 0.2f, 0.2f, 0.65f)); // Flat or Gradient? + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0 + row_bg_target, row_bg_color); + } + + // Fill cells + for (int column = 0; column < 5; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%c%c", 'A' + row, '0' + column); + + // Change background of Cells B1->C2 + // Demonstrate setting a cell background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ...)' + // (the CellBg color will be blended over the RowBg and ColumnBg colors) + // We can also pass a column number as a third parameter to TableSetBgColor() and do this outside the column loop. + if (row >= 1 && row <= 2 && column >= 1 && column <= 2 && cell_bg_type == 1) + { + ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f)); + ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Tree view")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; + + if (ImGui::BeginTable("3ways", 3, flags)) + { + // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + + // Simple storage to output a dummy file-system. + struct MyTreeNode + { + const char* Name; + const char* Type; + int Size; + int ChildIdx; + int ChildCount; + static void DisplayNode(const MyTreeNode* node, const MyTreeNode* all_nodes) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + const bool is_folder = (node->ChildCount > 0); + if (is_folder) + { + bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::TextDisabled("--"); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + if (open) + { + for (int child_n = 0; child_n < node->ChildCount; child_n++) + DisplayNode(&all_nodes[node->ChildIdx + child_n], all_nodes); + ImGui::TreePop(); + } + } + else + { + ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::Text("%d", node->Size); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + } + } + }; + static const MyTreeNode nodes[] = + { + { "Root", "Folder", -1, 1, 3 }, // 0 + { "Music", "Folder", -1, 4, 2 }, // 1 + { "Textures", "Folder", -1, 6, 3 }, // 2 + { "desktop.ini", "System file", 1024, -1,-1 }, // 3 + { "File1_a.wav", "Audio file", 123000, -1,-1 }, // 4 + { "File1_b.wav", "Audio file", 456000, -1,-1 }, // 5 + { "Image001.png", "Image file", 203128, -1,-1 }, // 6 + { "Copy of Image001.png", "Image file", 203256, -1,-1 }, // 7 + { "Copy of Image001 (Final2).png","Image file", 203512, -1,-1 }, // 8 + }; + + MyTreeNode::DisplayNode(&nodes[0], nodes); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Item width")) + { + HelpMarker( + "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n" + "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense."); + if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders)) + { + ImGui::TableSetupColumn("small"); + ImGui::TableSetupColumn("half"); + ImGui::TableSetupColumn("right-align"); + ImGui::TableHeadersRow(); + + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + if (row == 0) + { + // Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient) + ImGui::TableSetColumnIndex(0); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 3.0f); // Small + ImGui::TableSetColumnIndex(1); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::TableSetColumnIndex(2); + ImGui::PushItemWidth(-FLT_MIN); // Right-aligned + } + + // Draw our contents + static float dummy_f = 0.0f; + ImGui::PushID(row); + ImGui::TableSetColumnIndex(0); + ImGui::SliderFloat("float0", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(1); + ImGui::SliderFloat("float1", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(2); + ImGui::SliderFloat("float2", &dummy_f, 0.0f, 1.0f); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate using TableHeader() calls instead of TableHeadersRow() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Custom headers")) + { + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_custom_headers", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("Apricot"); + ImGui::TableSetupColumn("Banana"); + ImGui::TableSetupColumn("Cherry"); + + // Dummy entire-column selection storage + // FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox. + static bool column_selected[3] = {}; + + // Instead of calling TableHeadersRow() we'll submit custom headers ourselves + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + const char* column_name = ImGui::TableGetColumnName(column); // Retrieve name passed to TableSetupColumn() + ImGui::PushID(column); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("##checkall", &column_selected[column]); + ImGui::PopStyleVar(); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::TableHeader(column_name); + ImGui::PopID(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + char buf[32]; + sprintf(buf, "Cell %d,%d", column, row); + ImGui::TableSetColumnIndex(column); + ImGui::Selectable(buf, column_selected[column]); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Context menus")) + { + HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); + static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags1, ImGuiTableFlags_ContextMenuInBody); + PopStyleCompact(); + + // Context Menus: first example + // [1.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [1.2] Right-click in columns also open the default table context menu (if ImGuiTableFlags_ContextMenuInBody is set) + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_context_menu", COLUMNS_COUNT, flags1)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [1.1]] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + + // Submit dummy contents + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Context Menus: second example + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [2.2] Right-click on the ".." to open a custom popup + // [2.3] Right-click in columns to open another custom popup + HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body)."); + ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; + if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + // Submit dummy contents + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + ImGui::SameLine(); + + // [2.2] Right-click on the ".." to open a custom popup + ImGui::PushID(row * COLUMNS_COUNT + column); + ImGui::SmallButton(".."); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("This is the popup for Button(\"..\") in Cell %d,%d", column, row); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + } + + // [2.3] Right-click anywhere in columns to open another custom popup + // (instead of testing for !IsAnyItemHovered() we could also call OpenPopup() with ImGuiPopupFlags_NoOpenOverExistingPopup + // to manage popup priority as the popups triggers, here "are we hovering a column" are overlapping) + int hovered_column = -1; + for (int column = 0; column < COLUMNS_COUNT + 1; column++) + { + ImGui::PushID(column); + if (ImGui::TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered) + hovered_column = column; + if (hovered_column == column && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(1)) + ImGui::OpenPopup("MyPopup"); + if (ImGui::BeginPopup("MyPopup")) + { + if (column == COLUMNS_COUNT) + ImGui::Text("This is a custom popup for unused space after the last column."); + else + ImGui::Text("This is a custom popup for Column %d", column); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + + ImGui::EndTable(); + ImGui::Text("Hovered column: %d", hovered_column); + } + ImGui::TreePop(); + } + + // Demonstrate creating multiple tables with the same ID + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Synced instances")) + { + HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc."); + for (int n = 0; n < 3; n++) + { + char buf[32]; + sprintf(buf, "Synced Table %d", n); + bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen); + if (open && ImGui::BeginTable("Table", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int cell = 0; cell < 9; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("this cell %d", cell); + } + ImGui::EndTable(); + } + } + ImGui::TreePop(); + } + + // Demonstrate using Sorting facilities + // This is a simplified version of the "Advanced" example, where we mostly focus on the code necessary to handle sorting. + // Note that the "Advanced" example also showcase manually triggering a sort (e.g. if item quantities have been modified) + static const char* template_items_names[] = + { + "Banana", "Apple", "Cherry", "Watermelon", "Grapefruit", "Strawberry", "Mango", + "Kiwi", "Orange", "Pineapple", "Blueberry", "Plum", "Coconut", "Pear", "Apricot" + }; + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Sorting")) + { + // Create item list + static ImVector<MyItem> items; + if (items.Size == 0) + { + items.resize(50, MyItem()); + for (int n = 0; n < items.Size; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (n * n - n) % 20; // Assign default quantities + } + } + + // Options + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollY; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + PopStyleCompact(); + + if (ImGui::BeginTable("table_sorting", 4, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 15), 0.0f)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + // Demonstrate using a mixture of flags among available sort-related flags: + // - ImGuiTableColumnFlags_DefaultSort + // - ImGuiTableColumnFlags_NoSort / ImGuiTableColumnFlags_NoSortAscending / ImGuiTableColumnFlags_NoSortDescending + // - ImGuiTableColumnFlags_PreferSortAscending / ImGuiTableColumnFlags_PreferSortDescending + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupScrollFreeze(0, 1); // Make row always visible + ImGui::TableHeadersRow(); + + // Sort our data if sort specs have been changed! + if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs()) + if (sorts_specs->SpecsDirty) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + if (items.Size > 1) + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) + { + // Display a data item + MyItem* item = &items[row_n]; + ImGui::PushID(item->ID); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%04d", item->ID); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(item->Name); + ImGui::TableNextColumn(); + ImGui::SmallButton("None"); + ImGui::TableNextColumn(); + ImGui::Text("%d", item->Quantity); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // In this example we'll expose most table flags and settings. + // For specific flags and settings refer to the corresponding section for more detailed explanation. + // This section is mostly useful to experiment with combining certain flags or settings with each others. + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // [DEBUG] + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + if (ImGui::TreeNode("Advanced")) + { + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable + | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_SizingFixedFit; + + enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow }; + static int contents_type = CT_SelectableSpanRow; + const char* contents_type_names[] = { "Text", "Button", "SmallButton", "FillButton", "Selectable", "Selectable (span row)" }; + static int freeze_cols = 1; + static int freeze_rows = 1; + static int items_count = IM_ARRAYSIZE(template_items_names) * 2; + static ImVec2 outer_size_value = ImVec2(0.0f, TEXT_BASE_HEIGHT * 12); + static float row_min_height = 0.0f; // Auto + static float inner_width_with_scroll = 0.0f; // Auto-extend + static bool outer_size_enabled = true; + static bool show_headers = true; + static bool show_wrapped_text = false; + //static ImGuiTextFilter filter; + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // FIXME-TABLE: Enabling this results in initial clipped first pass on table which tend to affects column sizing + if (ImGui::TreeNode("Options")) + { + // Make the UI compact because there are so many fields + PushStyleCompact(); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 28.0f); + + if (ImGui::TreeNodeEx("Features:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_Sortable", &flags, ImGuiTableFlags_Sortable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoSavedSettings", &flags, ImGuiTableFlags_NoSavedSettings); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags, ImGuiTableFlags_ContextMenuInBody); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Decorations:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sizing:", ImGuiTreeNodeFlags_DefaultOpen)) + { + EditTableSizingFlags(&flags); + ImGui::SameLine(); HelpMarker("In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::SameLine(); HelpMarker("Only available if ScrollX is disabled."); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::SameLine(); HelpMarker("Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with ScrollFreeze options."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Padding:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags, ImGuiTableFlags_PadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags, ImGuiTableFlags_NoPadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags, ImGuiTableFlags_NoPadInnerX); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Scrolling:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sorting:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::Checkbox("show_headers", &show_headers); + ImGui::Checkbox("show_wrapped_text", &show_wrapped_text); + + ImGui::DragFloat2("##OuterSize", &outer_size_value.x); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Checkbox("outer_size", &outer_size_enabled); + ImGui::SameLine(); + HelpMarker("If scrolling is disabled (ScrollX and ScrollY not set):\n" + "- The table is output directly in the parent window.\n" + "- OuterSize.x < 0.0f will right-align the table.\n" + "- OuterSize.x = 0.0f will narrow fit the table unless there are any Stretch column.\n" + "- OuterSize.y then becomes the minimum size for the table, which will extend vertically if there are more rows (unless NoHostExtendY is set)."); + + // From a user point of view we will tend to use 'inner_width' differently depending on whether our table is embedding scrolling. + // To facilitate toying with this demo we will actually pass 0.0f to the BeginTable() when ScrollX is disabled. + ImGui::DragFloat("inner_width (when ScrollX active)", &inner_width_with_scroll, 1.0f, 0.0f, FLT_MAX); + + ImGui::DragFloat("row_min_height", &row_min_height, 1.0f, 0.0f, FLT_MAX); + ImGui::SameLine(); HelpMarker("Specify height of the Selectable item."); + + ImGui::DragInt("items_count", &items_count, 0.1f, 0, 9999); + ImGui::Combo("items_type (first column)", &contents_type, contents_type_names, IM_ARRAYSIZE(contents_type_names)); + //filter.Draw("filter"); + ImGui::TreePop(); + } + + ImGui::PopItemWidth(); + PopStyleCompact(); + ImGui::Spacing(); + ImGui::TreePop(); + } + + // Update item list if we changed the number of items + static ImVector<MyItem> items; + static ImVector<int> selection; + static bool items_need_sort = false; + if (items.Size != items_count) + { + items.resize(items_count, MyItem()); + for (int n = 0; n < items_count; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (template_n == 3) ? 10 : (template_n == 4) ? 20 : 0; // Assign default quantities + } + } + + const ImDrawList* parent_draw_list = ImGui::GetWindowDrawList(); + const int parent_draw_list_draw_cmd_count = parent_draw_list->CmdBuffer.Size; + ImVec2 table_scroll_cur, table_scroll_max; // For debug display + const ImDrawList* table_draw_list = NULL; // " + + // Submit table + const float inner_width_to_use = (flags & ImGuiTableFlags_ScrollX) ? inner_width_with_scroll : 0.0f; + if (ImGui::BeginTable("table_advanced", 6, flags, outer_size_enabled ? outer_size_value : ImVec2(0, 0), inner_width_to_use)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description); + ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + + // Sort our data if sort specs have been changed! + ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs(); + if (sorts_specs && sorts_specs->SpecsDirty) + items_need_sort = true; + if (sorts_specs && items_need_sort && items.Size > 1) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + items_need_sort = false; + + // Take note of whether we are currently sorting based on the Quantity field, + // we will use this to trigger sorting when we know the data of this column has been modified. + const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0; + + // Show headers + if (show_headers) + ImGui::TableHeadersRow(); + + // Show data + // FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here? + ImGui::PushButtonRepeat(true); +#if 1 + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + { + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) +#else + // Without clipper + { + for (int row_n = 0; row_n < items.Size; row_n++) +#endif + { + MyItem* item = &items[row_n]; + //if (!filter.PassFilter(item->Name)) + // continue; + + const bool item_is_selected = selection.contains(item->ID); + ImGui::PushID(item->ID); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_min_height); + + // For the demo purpose we can select among different type of items submitted in the first column + ImGui::TableSetColumnIndex(0); + char label[32]; + sprintf(label, "%04d", item->ID); + if (contents_type == CT_Text) + ImGui::TextUnformatted(label); + else if (contents_type == CT_Button) + ImGui::Button(label); + else if (contents_type == CT_SmallButton) + ImGui::SmallButton(label); + else if (contents_type == CT_FillButton) + ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); + else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow) + { + ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None; + if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height))) + { + if (ImGui::GetIO().KeyCtrl) + { + if (item_is_selected) + selection.find_erase_unsorted(item->ID); + else + selection.push_back(item->ID); + } + else + { + selection.clear(); + selection.push_back(item->ID); + } + } + } + + if (ImGui::TableSetColumnIndex(1)) + ImGui::TextUnformatted(item->Name); + + // Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity, + // and we are currently sorting on the column showing the Quantity. + // To avoid triggering a sort while holding the button, we only trigger it when the button has been released. + // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes. + if (ImGui::TableSetColumnIndex(2)) + { + if (ImGui::SmallButton("Chop")) { item->Quantity += 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + ImGui::SameLine(); + if (ImGui::SmallButton("Eat")) { item->Quantity -= 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + } + + if (ImGui::TableSetColumnIndex(3)) + ImGui::Text("%d", item->Quantity); + + ImGui::TableSetColumnIndex(4); + if (show_wrapped_text) + ImGui::TextWrapped("Lorem ipsum dolor sit amet"); + else + ImGui::Text("Lorem ipsum dolor sit amet"); + + if (ImGui::TableSetColumnIndex(5)) + ImGui::Text("1234"); + + ImGui::PopID(); + } + } + ImGui::PopButtonRepeat(); + + // Store some info to display debug details below + table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY()); + table_scroll_max = ImVec2(ImGui::GetScrollMaxX(), ImGui::GetScrollMaxY()); + table_draw_list = ImGui::GetWindowDrawList(); + ImGui::EndTable(); + } + static bool show_debug_details = false; + ImGui::Checkbox("Debug details", &show_debug_details); + if (show_debug_details && table_draw_list) + { + ImGui::SameLine(0.0f, 0.0f); + const int table_draw_list_draw_cmd_count = table_draw_list->CmdBuffer.Size; + if (table_draw_list == parent_draw_list) + ImGui::Text(": DrawCmd: +%d (in same window)", + table_draw_list_draw_cmd_count - parent_draw_list_draw_cmd_count); + else + ImGui::Text(": DrawCmd: +%d (in child window), Scroll: (%.f/%.f) (%.f/%.f)", + table_draw_list_draw_cmd_count - 1, table_scroll_cur.x, table_scroll_max.x, table_scroll_cur.y, table_scroll_max.y); + } + ImGui::TreePop(); + } + + ImGui::PopID(); + + ShowDemoWindowColumns(); + + if (disable_indent) + ImGui::PopStyleVar(); +} + +// Demonstrate old/legacy Columns API! +// [2020: Columns are under-featured and not maintained. Prefer using the more flexible and powerful BeginTable() API!] +static void ShowDemoWindowColumns() +{ + bool open = ImGui::TreeNode("Legacy Columns API"); + ImGui::SameLine(); + HelpMarker("Columns() is an old API! Prefer using the more flexible and powerful BeginTable() API!"); + if (!open) + return; + + // Basic columns + if (ImGui::TreeNode("Basic")) + { + ImGui::Text("Without border:"); + ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border + ImGui::Separator(); + for (int n = 0; n < 14; n++) + { + char label[32]; + sprintf(label, "Item %d", n); + if (ImGui::Selectable(label)) {} + //if (ImGui::Button(label, ImVec2(-FLT_MIN,0.0f))) {} + ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + + ImGui::Text("With border:"); + ImGui::Columns(4, "mycolumns"); // 4-ways, with border + ImGui::Separator(); + ImGui::Text("ID"); ImGui::NextColumn(); + ImGui::Text("Name"); ImGui::NextColumn(); + ImGui::Text("Path"); ImGui::NextColumn(); + ImGui::Text("Hovered"); ImGui::NextColumn(); + ImGui::Separator(); + const char* names[3] = { "One", "Two", "Three" }; + const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; + static int selected = -1; + for (int i = 0; i < 3; i++) + { + char label[32]; + sprintf(label, "%04d", i); + if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) + selected = i; + bool hovered = ImGui::IsItemHovered(); + ImGui::NextColumn(); + ImGui::Text(names[i]); ImGui::NextColumn(); + ImGui::Text(paths[i]); ImGui::NextColumn(); + ImGui::Text("%d", hovered); ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Borders")) + { + // NB: Future columns API should allow automatic horizontal borders. + static bool h_borders = true; + static bool v_borders = true; + static int columns_count = 4; + const int lines_count = 3; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("##columns_count", &columns_count, 0.1f, 2, 10, "%d columns"); + if (columns_count < 2) + columns_count = 2; + ImGui::SameLine(); + ImGui::Checkbox("horizontal", &h_borders); + ImGui::SameLine(); + ImGui::Checkbox("vertical", &v_borders); + ImGui::Columns(columns_count, NULL, v_borders); + for (int i = 0; i < columns_count * lines_count; i++) + { + if (h_borders && ImGui::GetColumnIndex() == 0) + ImGui::Separator(); + ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i); + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); + ImGui::Text("Long text that is likely to clip"); + ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f)); + ImGui::NextColumn(); + } + ImGui::Columns(1); + if (h_borders) + ImGui::Separator(); + ImGui::TreePop(); + } + + // Create multiple items in a same cell before switching to next column + if (ImGui::TreeNode("Mixed items")) + { + ImGui::Columns(3, "mixed"); + ImGui::Separator(); + + ImGui::Text("Hello"); + ImGui::Button("Banana"); + ImGui::NextColumn(); + + ImGui::Text("ImGui"); + ImGui::Button("Apple"); + static float foo = 1.0f; + ImGui::InputFloat("red", &foo, 0.05f, 0, "%.3f"); + ImGui::Text("An extra line here."); + ImGui::NextColumn(); + + ImGui::Text("Sailor"); + ImGui::Button("Corniflower"); + static float bar = 1.0f; + ImGui::InputFloat("blue", &bar, 0.05f, 0, "%.3f"); + ImGui::NextColumn(); + + if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + // Word wrapping + if (ImGui::TreeNode("Word-wrapping")) + { + ImGui::Columns(2, "word-wrapping"); + ImGui::Separator(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Left"); + ImGui::NextColumn(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Right"); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Horizontal Scrolling")) + { + ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); + ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f); + ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::Columns(10); + + // Also demonstrate using clipper for large vertical lists + int ITEMS_COUNT = 2000; + ImGuiListClipper clipper; + clipper.Begin(ITEMS_COUNT); + while (clipper.Step()) + { + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + for (int j = 0; j < 10; j++) + { + ImGui::Text("Line %d Column %d...", i, j); + ImGui::NextColumn(); + } + } + ImGui::Columns(1); + ImGui::EndChild(); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Tree")) + { + ImGui::Columns(2, "tree", true); + for (int x = 0; x < 3; x++) + { + bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + ImGui::NextColumn(); + if (open1) + { + for (int y = 0; y < 3; y++) + { + bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + if (open2) + { + ImGui::Text("Even more contents"); + if (ImGui::TreeNode("Tree in column")) + { + ImGui::Text("The quick brown fox jumps over the lazy dog"); + ImGui::TreePop(); + } + } + ImGui::NextColumn(); + if (open2) + ImGui::TreePop(); + } + ImGui::TreePop(); + } + } + ImGui::Columns(1); + ImGui::TreePop(); + } + + ImGui::TreePop(); +} + +static void ShowDemoWindowMisc() +{ + if (ImGui::CollapsingHeader("Filtering")) + { + // Helper class to easy setup a text filter. + // You may want to implement a more feature-full filtering scheme in your own application. + static ImGuiTextFilter filter; + ImGui::Text("Filter usage:\n" + " \"\" display all lines\n" + " \"xxx\" display lines containing \"xxx\"\n" + " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" + " \"-xxx\" hide lines containing \"xxx\""); + filter.Draw(); + const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; + for (int i = 0; i < IM_ARRAYSIZE(lines); i++) + if (filter.PassFilter(lines[i])) + ImGui::BulletText("%s", lines[i]); + } + + if (ImGui::CollapsingHeader("Inputs, Navigation & Focus")) + { + ImGuiIO& io = ImGui::GetIO(); + + // Display ImGuiIO output flags + ImGui::Text("WantCaptureMouse: %d", io.WantCaptureMouse); + ImGui::Text("WantCaptureKeyboard: %d", io.WantCaptureKeyboard); + ImGui::Text("WantTextInput: %d", io.WantTextInput); + ImGui::Text("WantSetMousePos: %d", io.WantSetMousePos); + ImGui::Text("NavActive: %d, NavVisible: %d", io.NavActive, io.NavVisible); + + // Display Mouse state + if (ImGui::TreeNode("Mouse State")) + { + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse pos: <INVALID>"); + ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); + ImGui::Text("Mouse down:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } + ImGui::Text("Mouse clicked:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } + ImGui::Text("Mouse dblclick:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDoubleClicked(i)){ ImGui::SameLine(); ImGui::Text("b%d", i); } + ImGui::Text("Mouse released:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } + ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); + ImGui::Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused + ImGui::TreePop(); + } + + // Display Keyboard/Mouse state + if (ImGui::TreeNode("Keyboard & Navigation State")) + { + ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyDown(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X) (%.02f secs)", i, i, io.KeysDownDuration[i]); } + ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); } + ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); } + ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); + ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. + + ImGui::Text("NavInputs down:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputs[i] > 0.0f) { ImGui::SameLine(); ImGui::Text("[%d] %.2f (%.02f secs)", i, io.NavInputs[i], io.NavInputsDownDuration[i]); } + ImGui::Text("NavInputs pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputsDownDuration[i] == 0.0f) { ImGui::SameLine(); ImGui::Text("[%d]", i); } + + ImGui::Button("Hovering me sets the\nkeyboard capture flag"); + if (ImGui::IsItemHovered()) + ImGui::CaptureKeyboardFromApp(true); + ImGui::SameLine(); + ImGui::Button("Holding me clears the\nthe keyboard capture flag"); + if (ImGui::IsItemActive()) + ImGui::CaptureKeyboardFromApp(false); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Tabbing")) + { + ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); + static char buf[32] = "hello"; + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); + ImGui::PushAllowKeyboardFocus(false); + ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); + //ImGui::SameLine(); HelpMarker("Use ImGui::PushAllowKeyboardFocus(bool) to disable tabbing through certain widgets."); + ImGui::PopAllowKeyboardFocus(); + ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Focus from code")) + { + bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); + bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); + bool focus_3 = ImGui::Button("Focus on 3"); + int has_focus = 0; + static char buf[128] = "click on a button to set focus"; + + if (focus_1) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 1; + + if (focus_2) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 2; + + ImGui::PushAllowKeyboardFocus(false); + if (focus_3) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 3; + ImGui::PopAllowKeyboardFocus(); + + if (has_focus) + ImGui::Text("Item with focus: %d", has_focus); + else + ImGui::Text("Item with focus: <none>"); + + // Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item + static float f3[3] = { 0.0f, 0.0f, 0.0f }; + int focus_ahead = -1; + if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine(); + if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine(); + if (ImGui::Button("Focus on Z")) { focus_ahead = 2; } + if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead); + ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f); + + ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code."); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Dragging")) + { + ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); + for (int button = 0; button < 3; button++) + { + ImGui::Text("IsMouseDragging(%d):", button); + ImGui::Text(" w/ default threshold: %d,", ImGui::IsMouseDragging(button)); + ImGui::Text(" w/ zero threshold: %d,", ImGui::IsMouseDragging(button, 0.0f)); + ImGui::Text(" w/ large threshold: %d,", ImGui::IsMouseDragging(button, 20.0f)); + } + + ImGui::Button("Drag Me"); + if (ImGui::IsItemActive()) + ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor + + // Drag operations gets "unlocked" when the mouse has moved past a certain threshold + // (the default threshold is stored in io.MouseDragThreshold). You can request a lower or higher + // threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta(). + ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); + ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); + ImVec2 mouse_delta = io.MouseDelta; + ImGui::Text("GetMouseDragDelta(0):"); + ImGui::Text(" w/ default threshold: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y); + ImGui::Text(" w/ zero threshold: (%.1f, %.1f)", value_raw.x, value_raw.y); + ImGui::Text("io.MouseDelta: (%.1f, %.1f)", mouse_delta.x, mouse_delta.y); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Mouse cursors")) + { + const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" }; + IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT); + + ImGuiMouseCursor current = ImGui::GetMouseCursor(); + ImGui::Text("Current mouse cursor = %d: %s", current, mouse_cursors_names[current]); + ImGui::Text("Hover to see mouse cursors:"); + ImGui::SameLine(); HelpMarker( + "Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. " + "If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, " + "otherwise your backend needs to handle it."); + for (int i = 0; i < ImGuiMouseCursor_COUNT; i++) + { + char label[32]; + sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); + ImGui::Bullet(); ImGui::Selectable(label, false); + if (ImGui::IsItemHovered()) + ImGui::SetMouseCursor(i); + } + ImGui::TreePop(); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] About Window / ShowAboutWindow() +// Access from Dear ImGui Demo -> Tools -> About +//----------------------------------------------------------------------------- + +void ImGui::ShowAboutWindow(bool* p_open) +{ + if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); + ImGui::Separator(); + ImGui::Text("By Omar Cornut and all Dear ImGui contributors."); + ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); + + static bool show_config_info = false; + ImGui::Checkbox("Config/Build Information", &show_config_info); + if (show_config_info) + { + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + + bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); + ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18); + ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove); + if (copy_to_clipboard) + { + ImGui::LogToClipboard(); + ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub + } + + ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); + ImGui::Separator(); + ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert)); + ImGui::Text("define: __cplusplus=%d", (int)__cplusplus); +#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS"); +#endif +#ifdef IMGUI_USE_BGRA_PACKED_COLOR + ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR"); +#endif +#ifdef _WIN32 + ImGui::Text("define: _WIN32"); +#endif +#ifdef _WIN64 + ImGui::Text("define: _WIN64"); +#endif +#ifdef __linux__ + ImGui::Text("define: __linux__"); +#endif +#ifdef __APPLE__ + ImGui::Text("define: __APPLE__"); +#endif +#ifdef _MSC_VER + ImGui::Text("define: _MSC_VER=%d", _MSC_VER); +#endif +#ifdef _MSVC_LANG + ImGui::Text("define: _MSVC_LANG=%d", (int)_MSVC_LANG); +#endif +#ifdef __MINGW32__ + ImGui::Text("define: __MINGW32__"); +#endif +#ifdef __MINGW64__ + ImGui::Text("define: __MINGW64__"); +#endif +#ifdef __GNUC__ + ImGui::Text("define: __GNUC__=%d", (int)__GNUC__); +#endif +#ifdef __clang_version__ + ImGui::Text("define: __clang_version__=%s", __clang_version__); +#endif + ImGui::Separator(); + ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL"); + ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL"); + ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos"); + if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange"); + if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor"); + if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors"); + if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink"); + if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges"); + if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly"); + if (io.ConfigMemoryCompactTimer >= 0.0f) ImGui::Text("io.ConfigMemoryCompactTimer = %.1f", io.ConfigMemoryCompactTimer); + ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags); + if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad"); + if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors"); + if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos"); + if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset"); + ImGui::Separator(); + ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); + ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); + ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + ImGui::Separator(); + ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y); + ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize); + ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y); + ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding); + ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize); + ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y); + ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y); + + if (copy_to_clipboard) + { + ImGui::LogText("\n```\n"); + ImGui::LogFinish(); + } + ImGui::EndChildFrame(); + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Style Editor / ShowStyleEditor() +//----------------------------------------------------------------------------- +// - ShowStyleSelector() +// - ShowFontSelector() +// - ShowStyleEditor() +//----------------------------------------------------------------------------- + +// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. +// Here we use the simplified Combo() api that packs items into a single literal string. +// Useful for quick combo boxes where the choices are known locally. +bool ImGui::ShowStyleSelector(const char* label) +{ + static int style_idx = -1; + if (ImGui::Combo(label, &style_idx, "Dark\0Light\0Classic\0")) + { + switch (style_idx) + { + case 0: ImGui::StyleColorsDark(); break; + case 1: ImGui::StyleColorsLight(); break; + case 2: ImGui::StyleColorsClassic(); break; + } + return true; + } + return false; +} + +// Demo helper function to select among loaded fonts. +// Here we use the regular BeginCombo()/EndCombo() api which is more the more flexible one. +void ImGui::ShowFontSelector(const char* label) +{ + ImGuiIO& io = ImGui::GetIO(); + ImFont* font_current = ImGui::GetFont(); + if (ImGui::BeginCombo(label, font_current->GetDebugName())) + { + for (int n = 0; n < io.Fonts->Fonts.Size; n++) + { + ImFont* font = io.Fonts->Fonts[n]; + ImGui::PushID((void*)font); + if (ImGui::Selectable(font->GetDebugName(), font == font_current)) + io.FontDefault = font; + ImGui::PopID(); + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + HelpMarker( + "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" + "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" + "- Read FAQ and docs/FONTS.md for more details.\n" + "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); +} + +// [Internal] Display details for a single font, called by ShowStyleEditor(). +static void NodeFont(ImFont* font) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + bool font_details_opened = ImGui::TreeNode(font, "Font: \"%s\"\n%.2f px, %d glyphs, %d file(s)", + font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount); + ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) { io.FontDefault = font; } + if (!font_details_opened) + return; + + ImGui::PushFont(font); + ImGui::Text("The quick brown fox jumps over the lazy dog"); + ImGui::PopFont(); + ImGui::DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); // Scale only this font + ImGui::SameLine(); HelpMarker( + "Note than the default embedded font is NOT meant to be scaled.\n\n" + "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " + "You may oversample them to get some flexibility with scaling. " + "You can also render at multiple sizes and select which one to use at runtime.\n\n" + "(Glimmer of hope: the atlas system will be rewritten in the future to make scaling more flexible.)"); + ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); + ImGui::Text("Fallback character: '%c' (U+%04X)", font->FallbackChar, font->FallbackChar); + ImGui::Text("Ellipsis character: '%c' (U+%04X)", font->EllipsisChar, font->EllipsisChar); + const int surface_sqrt = (int)sqrtf((float)font->MetricsTotalSurface); + ImGui::Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt); + for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) + if (font->ConfigData) + if (const ImFontConfig* cfg = &font->ConfigData[config_i]) + ImGui::BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)", + config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y); + if (ImGui::TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) + { + // Display all glyphs of the fonts in separate pages of 256 characters + const ImU32 glyph_col = ImGui::GetColorU32(ImGuiCol_Text); + for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256) + { + // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k) + // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT + // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here) + if (!(base & 4095) && font->IsGlyphRangeUnused(base, base + 4095)) + { + base += 4096 - 256; + continue; + } + + int count = 0; + for (unsigned int n = 0; n < 256; n++) + if (font->FindGlyphNoFallback((ImWchar)(base + n))) + count++; + if (count <= 0) + continue; + if (!ImGui::TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph")) + continue; + float cell_size = font->FontSize * 1; + float cell_spacing = style.ItemSpacing.y; + ImVec2 base_pos = ImGui::GetCursorScreenPos(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + for (unsigned int n = 0; n < 256; n++) + { + // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions + // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string. + ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing)); + ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size); + const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n)); + draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50)); + if (glyph) + font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n)); + if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2)) + { + ImGui::BeginTooltip(); + ImGui::Text("Codepoint: U+%04X", base + n); + ImGui::Separator(); + ImGui::Text("Visible: %d", glyph->Visible); + ImGui::Text("AdvanceX: %.1f", glyph->AdvanceX); + ImGui::Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); + ImGui::Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); + ImGui::EndTooltip(); + } + } + ImGui::Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16)); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + ImGui::TreePop(); +} + +void ImGui::ShowStyleEditor(ImGuiStyle* ref) +{ + // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to + // (without a reference style pointer, we will use one compared locally as a reference) + ImGuiStyle& style = ImGui::GetStyle(); + static ImGuiStyle ref_saved_style; + + // Default to using internal storage as reference + static bool init = true; + if (init && ref == NULL) + ref_saved_style = style; + init = false; + if (ref == NULL) + ref = &ref_saved_style; + + ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); + + if (ImGui::ShowStyleSelector("Colors##Selector")) + ref_saved_style = style; + ImGui::ShowFontSelector("Fonts##Selector"); + + // Simplified Settings (expose floating-pointer border sizes as boolean representing 0.0f or 1.0f) + if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) + style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding + { bool border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &border)) { style.WindowBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &border)) { style.FrameBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &border)) { style.PopupBorderSize = border ? 1.0f : 0.0f; } } + + // Save/Revert button + if (ImGui::Button("Save Ref")) + *ref = ref_saved_style = style; + ImGui::SameLine(); + if (ImGui::Button("Revert Ref")) + style = *ref; + ImGui::SameLine(); + HelpMarker( + "Save/Revert in local non-persistent storage. Default Colors definition are not affected. " + "Use \"Export\" below to save them somewhere."); + + ImGui::Separator(); + + if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Sizes")) + { + ImGui::Text("Main"); + ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); + ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); + ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); + ImGui::Text("Borders"); + ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::Text("Rounding"); + ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::Text("Alignment"); + ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); + int window_menu_button_position = style.WindowMenuButtonPosition + 1; + if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0")) + style.WindowMenuButtonPosition = window_menu_button_position - 1; + ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); + ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); + ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); + ImGui::Text("Safe Area Padding"); + ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); + ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Colors")) + { + static int output_dest = 0; + static bool output_only_modified = true; + if (ImGui::Button("Export")) + { + if (output_dest == 0) + ImGui::LogToClipboard(); + else + ImGui::LogToTTY(); + ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const ImVec4& col = style.Colors[i]; + const char* name = ImGui::GetStyleColorName(i); + if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) + ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, + name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w); + } + ImGui::LogFinish(); + } + ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); + ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); + + static ImGuiTextFilter filter; + filter.Draw("Filter colors", ImGui::GetFontSize() * 16); + + static ImGuiColorEditFlags alpha_flags = 0; + if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine(); + if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine(); + if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine(); + HelpMarker( + "In the color list:\n" + "Left-click on color square to open color picker,\n" + "Right-click to open edit options menu."); + + ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); + ImGui::PushItemWidth(-160); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName(i); + if (!filter.PassFilter(name)) + continue; + ImGui::PushID(i); + ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); + if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) + { + // Tips: in a real user application, you may want to merge and use an icon font into the main font, + // so instead of "Save"/"Revert" you'd use icons! + // Read the FAQ and docs/FONTS.md about using icon fonts. It's really easy and super convenient! + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) { ref->Colors[i] = style.Colors[i]; } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) { style.Colors[i] = ref->Colors[i]; } + } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); + ImGui::TextUnformatted(name); + ImGui::PopID(); + } + ImGui::PopItemWidth(); + ImGui::EndChild(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Fonts")) + { + ImGuiIO& io = ImGui::GetIO(); + ImFontAtlas* atlas = io.Fonts; + HelpMarker("Read FAQ and docs/FONTS.md for details on font loading."); + ImGui::PushItemWidth(120); + for (int i = 0; i < atlas->Fonts.Size; i++) + { + ImFont* font = atlas->Fonts[i]; + ImGui::PushID(font); + NodeFont(font); + ImGui::PopID(); + } + if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) + { + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); + ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0, 0), ImVec2(1, 1), tint_col, border_col); + ImGui::TreePop(); + } + + // Post-baking font scaling. Note that this is NOT the nice way of scaling fonts, read below. + // (we enforce hard clamping manually as by default DragFloat/SliderFloat allows CTRL+Click text to get out of bounds). + const float MIN_SCALE = 0.3f; + const float MAX_SCALE = 2.0f; + HelpMarker( + "Those are old settings provided for convenience.\n" + "However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, " + "rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n" + "Using those settings here will give you poor quality results."); + static float window_scale = 1.0f; + if (ImGui::DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window + ImGui::SetWindowFontScale(window_scale); + ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Rendering")) + { + ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); + ImGui::SameLine(); + HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); + + ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); + ImGui::SameLine(); + HelpMarker("Faster lines using texture data. Require backend to render with bilinear filtering (not point/nearest filtering)."); + + ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); + ImGui::PushItemWidth(100); + ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); + if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; + + // When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles. + ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp); + if (ImGui::IsItemActive()) + { + ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos()); + ImGui::BeginTooltip(); + ImGui::TextUnformatted("(R = radius, N = number of segments)"); + ImGui::Spacing(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const float min_widget_width = ImGui::CalcTextSize("N: MMM\nR: MMM").x; + for (int n = 0; n < 8; n++) + { + const float RAD_MIN = 5.0f; + const float RAD_MAX = 70.0f; + const float rad = RAD_MIN + (RAD_MAX - RAD_MIN) * (float)n / (8.0f - 1.0f); + + ImGui::BeginGroup(); + + ImGui::Text("R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad)); + + const float canvas_width = IM_MAX(min_widget_width, rad * 2.0f); + const float offset_x = floorf(canvas_width * 0.5f); + const float offset_y = floorf(RAD_MAX); + + const ImVec2 p1 = ImGui::GetCursorScreenPos(); + draw_list->AddCircle(ImVec2(p1.x + offset_x, p1.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + + /* + const ImVec2 p2 = ImGui::GetCursorScreenPos(); + draw_list->AddCircleFilled(ImVec2(p2.x + offset_x, p2.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + */ + + ImGui::EndGroup(); + ImGui::SameLine(); + } + ImGui::EndTooltip(); + } + ImGui::SameLine(); + HelpMarker("When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically."); + + ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::PopItemWidth(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +//----------------------------------------------------------------------------- +// - ShowExampleAppMainMenuBar() +// - ShowExampleMenuFile() +//----------------------------------------------------------------------------- + +// Demonstrate creating a "main" fullscreen menu bar and populating it. +// Note the difference between BeginMainMenuBar() and BeginMenuBar(): +// - BeginMenuBar() = menu-bar inside current window (which needs the ImGuiWindowFlags_MenuBar flag!) +// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it. +static void ShowExampleAppMainMenuBar() +{ + if (ImGui::BeginMainMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Edit")) + { + if (ImGui::MenuItem("Undo", "CTRL+Z")) {} + if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item + ImGui::Separator(); + if (ImGui::MenuItem("Cut", "CTRL+X")) {} + if (ImGui::MenuItem("Copy", "CTRL+C")) {} + if (ImGui::MenuItem("Paste", "CTRL+V")) {} + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } +} + +// Note that shortcuts are currently provided for display only +// (future version will add explicit flags to BeginMenu() to request processing shortcuts) +static void ShowExampleMenuFile() +{ + ImGui::MenuItem("(demo menu)", NULL, false, false); + if (ImGui::MenuItem("New")) {} + if (ImGui::MenuItem("Open", "Ctrl+O")) {} + if (ImGui::BeginMenu("Open Recent")) + { + ImGui::MenuItem("fish_hat.c"); + ImGui::MenuItem("fish_hat.inl"); + ImGui::MenuItem("fish_hat.h"); + if (ImGui::BeginMenu("More..")) + { + ImGui::MenuItem("Hello"); + ImGui::MenuItem("Sailor"); + if (ImGui::BeginMenu("Recurse..")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Save", "Ctrl+S")) {} + if (ImGui::MenuItem("Save As..")) {} + + ImGui::Separator(); + if (ImGui::BeginMenu("Options")) + { + static bool enabled = true; + ImGui::MenuItem("Enabled", "", &enabled); + ImGui::BeginChild("child", ImVec2(0, 60), true); + for (int i = 0; i < 10; i++) + ImGui::Text("Scrolling Text %d", i); + ImGui::EndChild(); + static float f = 0.5f; + static int n = 0; + ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); + ImGui::InputFloat("Input", &f, 0.1f); + ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Colors")) + { + float sz = ImGui::GetTextLineHeight(); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName((ImGuiCol)i); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32((ImGuiCol)i)); + ImGui::Dummy(ImVec2(sz, sz)); + ImGui::SameLine(); + ImGui::MenuItem(name); + } + ImGui::EndMenu(); + } + + // Here we demonstrate appending again to the "Options" menu (which we already created above) + // Of course in this demo it is a little bit silly that this function calls BeginMenu("Options") twice. + // In a real code-base using it would make senses to use this feature from very different code locations. + if (ImGui::BeginMenu("Options")) // <-- Append! + { + static bool b = true; + ImGui::Checkbox("SomeOption", &b); + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Disabled", false)) // Disabled + { + IM_ASSERT(0); + } + if (ImGui::MenuItem("Checked", NULL, true)) {} + if (ImGui::MenuItem("Quit", "Alt+F4")) {} +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple console window, with scrolling, filtering, completion and history. +// For the console example, we are using a more C++ like approach of declaring a class to hold both data and functions. +struct ExampleAppConsole +{ + char InputBuf[256]; + ImVector<char*> Items; + ImVector<const char*> Commands; + ImVector<char*> History; + int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. + ImGuiTextFilter Filter; + bool AutoScroll; + bool ScrollToBottom; + + ExampleAppConsole() + { + ClearLog(); + memset(InputBuf, 0, sizeof(InputBuf)); + HistoryPos = -1; + + // "CLASSIFY" is here to provide the test case where "C"+[tab] completes to "CL" and display multiple matches. + Commands.push_back("HELP"); + Commands.push_back("HISTORY"); + Commands.push_back("CLEAR"); + Commands.push_back("CLASSIFY"); + AutoScroll = true; + ScrollToBottom = false; + AddLog("Welcome to Dear ImGui!"); + } + ~ExampleAppConsole() + { + ClearLog(); + for (int i = 0; i < History.Size; i++) + free(History[i]); + } + + // Portable helpers + static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } + static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } + static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } + static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } + + void ClearLog() + { + for (int i = 0; i < Items.Size; i++) + free(Items[i]); + Items.clear(); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + // FIXME-OPT + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf)-1] = 0; + va_end(args); + Items.push_back(Strdup(buf)); + } + + void Draw(const char* title, bool* p_open) + { + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. + // So e.g. IsItemHovered() will return true when hovering the title bar. + // Here we create a context menu only available from the title bar. + if (ImGui::BeginPopupContextItem()) + { + if (ImGui::MenuItem("Close Console")) + *p_open = false; + ImGui::EndPopup(); + } + + ImGui::TextWrapped( + "This example implements a console with basic coloring, completion (TAB key) and history (Up/Down keys). A more elaborate " + "implementation may want to store entries along with extra data such as timestamp, emitter, etc."); + ImGui::TextWrapped("Enter 'HELP' for help."); + + // TODO: display items starting from the bottom + + if (ImGui::SmallButton("Add Debug Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Add Debug Error")) { AddLog("[error] something went wrong"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Clear")) { ClearLog(); } + ImGui::SameLine(); + bool copy_to_clipboard = ImGui::SmallButton("Copy"); + //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } + + ImGui::Separator(); + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Options, Filter + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); + ImGui::Separator(); + + // Reserve enough left-over height for 1 separator + 1 input text + const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); + ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::Selectable("Clear")) ClearLog(); + ImGui::EndPopup(); + } + + // Display every line as a separate entry so we can change their color or add custom widgets. + // If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); + // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping + // to only process visible items. The clipper will automatically measure the height of your first item and then + // "seek" to display only items in the visible area. + // To use the clipper we can replace your standard loop: + // for (int i = 0; i < Items.Size; i++) + // With: + // ImGuiListClipper clipper; + // clipper.Begin(Items.Size); + // while (clipper.Step()) + // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + // - That your items are evenly spaced (same height) + // - That you have cheap random access to your elements (you can access them given their index, + // without processing all the ones before) + // You cannot this code as-is if a filter is active because it breaks the 'cheap random-access' property. + // We would need random-access on the post-filtered list. + // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices + // or offsets of items that passed the filtering test, recomputing this array when user changes the filter, + // and appending newly elements as they are inserted. This is left as a task to the user until we can manage + // to improve this example code! + // If your items are of variable height: + // - Split them into same height items would be simpler and facilitate random-seeking into your list. + // - Consider using manual call to IsRectVisible() and skipping extraneous decoration from your items. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing + if (copy_to_clipboard) + ImGui::LogToClipboard(); + for (int i = 0; i < Items.Size; i++) + { + const char* item = Items[i]; + if (!Filter.PassFilter(item)) + continue; + + // Normally you would store more information in your item than just a string. + // (e.g. make Items[] an array of structure, store color/type etc.) + ImVec4 color; + bool has_color = false; + if (strstr(item, "[error]")) { color = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); has_color = true; } + else if (strncmp(item, "# ", 2) == 0) { color = ImVec4(1.0f, 0.8f, 0.6f, 1.0f); has_color = true; } + if (has_color) + ImGui::PushStyleColor(ImGuiCol_Text, color); + ImGui::TextUnformatted(item); + if (has_color) + ImGui::PopStyleColor(); + } + if (copy_to_clipboard) + ImGui::LogFinish(); + + if (ScrollToBottom || (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())) + ImGui::SetScrollHereY(1.0f); + ScrollToBottom = false; + + ImGui::PopStyleVar(); + ImGui::EndChild(); + ImGui::Separator(); + + // Command-line + bool reclaim_focus = false; + ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; + if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) + { + char* s = InputBuf; + Strtrim(s); + if (s[0]) + ExecCommand(s); + strcpy(s, ""); + reclaim_focus = true; + } + + // Auto-focus on window apparition + ImGui::SetItemDefaultFocus(); + if (reclaim_focus) + ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget + + ImGui::End(); + } + + void ExecCommand(const char* command_line) + { + AddLog("# %s\n", command_line); + + // Insert into history. First find match and delete it so it can be pushed to the back. + // This isn't trying to be smart or optimal. + HistoryPos = -1; + for (int i = History.Size - 1; i >= 0; i--) + if (Stricmp(History[i], command_line) == 0) + { + free(History[i]); + History.erase(History.begin() + i); + break; + } + History.push_back(Strdup(command_line)); + + // Process command + if (Stricmp(command_line, "CLEAR") == 0) + { + ClearLog(); + } + else if (Stricmp(command_line, "HELP") == 0) + { + AddLog("Commands:"); + for (int i = 0; i < Commands.Size; i++) + AddLog("- %s", Commands[i]); + } + else if (Stricmp(command_line, "HISTORY") == 0) + { + int first = History.Size - 10; + for (int i = first > 0 ? first : 0; i < History.Size; i++) + AddLog("%3d: %s\n", i, History[i]); + } + else + { + AddLog("Unknown command: '%s'\n", command_line); + } + + // On command input, we scroll to bottom even if AutoScroll==false + ScrollToBottom = true; + } + + // In C++11 you'd be better off using lambdas for this sort of forwarding callbacks + static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) + { + ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; + return console->TextEditCallback(data); + } + + int TextEditCallback(ImGuiInputTextCallbackData* data) + { + //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); + switch (data->EventFlag) + { + case ImGuiInputTextFlags_CallbackCompletion: + { + // Example of TEXT COMPLETION + + // Locate beginning of current word + const char* word_end = data->Buf + data->CursorPos; + const char* word_start = word_end; + while (word_start > data->Buf) + { + const char c = word_start[-1]; + if (c == ' ' || c == '\t' || c == ',' || c == ';') + break; + word_start--; + } + + // Build a list of candidates + ImVector<const char*> candidates; + for (int i = 0; i < Commands.Size; i++) + if (Strnicmp(Commands[i], word_start, (int)(word_end - word_start)) == 0) + candidates.push_back(Commands[i]); + + if (candidates.Size == 0) + { + // No match + AddLog("No match for \"%.*s\"!\n", (int)(word_end - word_start), word_start); + } + else if (candidates.Size == 1) + { + // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing. + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0]); + data->InsertChars(data->CursorPos, " "); + } + else + { + // Multiple matches. Complete as much as we can.. + // So inputing "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches. + int match_len = (int)(word_end - word_start); + for (;;) + { + int c = 0; + bool all_candidates_matches = true; + for (int i = 0; i < candidates.Size && all_candidates_matches; i++) + if (i == 0) + c = toupper(candidates[i][match_len]); + else if (c == 0 || c != toupper(candidates[i][match_len])) + all_candidates_matches = false; + if (!all_candidates_matches) + break; + match_len++; + } + + if (match_len > 0) + { + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); + } + + // List matches + AddLog("Possible matches:\n"); + for (int i = 0; i < candidates.Size; i++) + AddLog("- %s\n", candidates[i]); + } + + break; + } + case ImGuiInputTextFlags_CallbackHistory: + { + // Example of HISTORY + const int prev_history_pos = HistoryPos; + if (data->EventKey == ImGuiKey_UpArrow) + { + if (HistoryPos == -1) + HistoryPos = History.Size - 1; + else if (HistoryPos > 0) + HistoryPos--; + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + if (HistoryPos != -1) + if (++HistoryPos >= History.Size) + HistoryPos = -1; + } + + // A better implementation would preserve the data on the current input line along with cursor position. + if (prev_history_pos != HistoryPos) + { + const char* history_str = (HistoryPos >= 0) ? History[HistoryPos] : ""; + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, history_str); + } + } + } + return 0; + } +}; + +static void ShowExampleAppConsole(bool* p_open) +{ + static ExampleAppConsole console; + console.Draw("Example: Console", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +//----------------------------------------------------------------------------- + +// Usage: +// static ExampleAppLog my_log; +// my_log.AddLog("Hello %d world\n", 123); +// my_log.Draw("title"); +struct ExampleAppLog +{ + ImGuiTextBuffer Buf; + ImGuiTextFilter Filter; + ImVector<int> LineOffsets; // Index to lines offset. We maintain this with AddLog() calls. + bool AutoScroll; // Keep scrolling if already at the bottom. + + ExampleAppLog() + { + AutoScroll = true; + Clear(); + } + + void Clear() + { + Buf.clear(); + LineOffsets.clear(); + LineOffsets.push_back(0); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + int old_size = Buf.size(); + va_list args; + va_start(args, fmt); + Buf.appendfv(fmt, args); + va_end(args); + for (int new_size = Buf.size(); old_size < new_size; old_size++) + if (Buf[old_size] == '\n') + LineOffsets.push_back(old_size + 1); + } + + void Draw(const char* title, bool* p_open = NULL) + { + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Main window + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + bool clear = ImGui::Button("Clear"); + ImGui::SameLine(); + bool copy = ImGui::Button("Copy"); + ImGui::SameLine(); + Filter.Draw("Filter", -100.0f); + + ImGui::Separator(); + ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar); + + if (clear) + Clear(); + if (copy) + ImGui::LogToClipboard(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + const char* buf = Buf.begin(); + const char* buf_end = Buf.end(); + if (Filter.IsActive()) + { + // In this example we don't use the clipper when Filter is enabled. + // This is because we don't have a random access on the result on our filter. + // A real application processing logs with ten of thousands of entries may want to store the result of + // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp). + for (int line_no = 0; line_no < LineOffsets.Size; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + if (Filter.PassFilter(line_start, line_end)) + ImGui::TextUnformatted(line_start, line_end); + } + } + else + { + // The simplest and easy way to display the entire buffer: + // ImGui::TextUnformatted(buf_begin, buf_end); + // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward + // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are + // within the visible area. + // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them + // on your side is recommended. Using ImGuiListClipper requires + // - A) random access into your data + // - B) items all being the same height, + // both of which we can handle since we an array pointing to the beginning of each line of text. + // When using the filter (in the block of code above) we don't have random access into the data to display + // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make + // it possible (and would be recommended if you want to search through tens of thousands of entries). + ImGuiListClipper clipper; + clipper.Begin(LineOffsets.Size); + while (clipper.Step()) + { + for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + ImGui::TextUnformatted(line_start, line_end); + } + } + clipper.End(); + } + ImGui::PopStyleVar(); + + if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) + ImGui::SetScrollHereY(1.0f); + + ImGui::EndChild(); + ImGui::End(); + } +}; + +// Demonstrate creating a simple log window with basic filtering. +static void ShowExampleAppLog(bool* p_open) +{ + static ExampleAppLog log; + + // For the demo: add a debug button _BEFORE_ the normal log window contents + // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window. + // Most of the contents of the window will be added by the log.Draw() call. + ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver); + ImGui::Begin("Example: Log", p_open); + if (ImGui::SmallButton("[Debug] Add 5 entries")) + { + static int counter = 0; + const char* categories[3] = { "info", "warn", "error" }; + const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" }; + for (int n = 0; n < 5; n++) + { + const char* category = categories[counter % IM_ARRAYSIZE(categories)]; + const char* word = words[counter % IM_ARRAYSIZE(words)]; + log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n", + ImGui::GetFrameCount(), category, ImGui::GetTime(), word); + counter++; + } + } + ImGui::End(); + + // Actually call in the regular Log helper (which will Begin() into the same window as we just did) + log.Draw("Example: Log", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +//----------------------------------------------------------------------------- + +// Demonstrate create a window with multiple child windows. +static void ShowExampleAppLayout(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // Left + static int selected = 0; + { + ImGui::BeginChild("left pane", ImVec2(150, 0), true); + for (int i = 0; i < 100; i++) + { + char label[128]; + sprintf(label, "MyObject %d", i); + if (ImGui::Selectable(label, selected == i)) + selected = i; + } + ImGui::EndChild(); + } + ImGui::SameLine(); + + // Right + { + ImGui::BeginGroup(); + ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us + ImGui::Text("MyObject: %d", selected); + ImGui::Separator(); + if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Description")) + { + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Details")) + { + ImGui::Text("ID: 0123456789"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::EndChild(); + if (ImGui::Button("Revert")) {} + ImGui::SameLine(); + if (ImGui::Button("Save")) {} + ImGui::EndGroup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +//----------------------------------------------------------------------------- + +static void ShowPlaceholderObject(const char* prefix, int uid) +{ + // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. + ImGui::PushID(uid); + + // Text and Tree nodes are less high than framed widgets, using AlignTextToFramePadding() we add vertical spacing to make the tree lines equal high. + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); + ImGui::TableSetColumnIndex(1); + ImGui::Text("my sailor is rich"); + + if (node_open) + { + static float placeholder_members[8] = { 0.0f, 0.0f, 1.0f, 3.1416f, 100.0f, 999.0f }; + for (int i = 0; i < 8; i++) + { + ImGui::PushID(i); // Use field index as identifier. + if (i < 2) + { + ShowPlaceholderObject("Child", 424242); + } + else + { + // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well) + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet; + ImGui::TreeNodeEx("Field", flags, "Field_%d", i); + + ImGui::TableSetColumnIndex(1); + ImGui::SetNextItemWidth(-FLT_MIN); + if (i >= 5) + ImGui::InputFloat("##value", &placeholder_members[i], 1.0f); + else + ImGui::DragFloat("##value", &placeholder_members[i], 0.01f); + ImGui::NextColumn(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + ImGui::PopID(); +} + +// Demonstrate create a simple property editor. +static void ShowExampleAppPropertyEditor(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Property editor", p_open)) + { + ImGui::End(); + return; + } + + HelpMarker( + "This example shows how you may implement a property editor using two columns.\n" + "All objects/fields data are dummies here.\n" + "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n" + "your cursor horizontally instead of using the Columns() API."); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2)); + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable)) + { + // Iterate placeholder objects (all the same data) + for (int obj_i = 0; obj_i < 4; obj_i++) + { + ShowPlaceholderObject("Object", obj_i); + //ImGui::Separator(); + } + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +//----------------------------------------------------------------------------- + +// Demonstrate/test rendering huge amount of text, and the incidence of clipping. +static void ShowExampleAppLongText(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Long text display", p_open)) + { + ImGui::End(); + return; + } + + static int test_type = 0; + static ImGuiTextBuffer log; + static int lines = 0; + ImGui::Text("Printing unusually long amount of text."); + ImGui::Combo("Test type", &test_type, + "Single call to TextUnformatted()\0" + "Multiple calls to Text(), clipped\0" + "Multiple calls to Text(), not clipped (slow)\0"); + ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); + if (ImGui::Button("Clear")) { log.clear(); lines = 0; } + ImGui::SameLine(); + if (ImGui::Button("Add 1000 lines")) + { + for (int i = 0; i < 1000; i++) + log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines + i); + lines += 1000; + } + ImGui::BeginChild("Log"); + switch (test_type) + { + case 0: + // Single call to TextUnformatted() with a big buffer + ImGui::TextUnformatted(log.begin(), log.end()); + break; + case 1: + { + // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + ImGuiListClipper clipper; + clipper.Begin(lines); + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + case 2: + // Multiple calls to Text(), not clipped (slow) + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + for (int i = 0; i < lines; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + ImGui::EndChild(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window which gets auto-resized according to its content. +static void ShowExampleAppAutoResize(bool* p_open) +{ + if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + + static int lines = 10; + ImGui::TextUnformatted( + "Window will resize every-frame to the size of its content.\n" + "Note that you probably don't want to query the window size to\n" + "output your content because that would create a feedback loop."); + ImGui::SliderInt("Number of lines", &lines, 1, 20); + for (int i = 0; i < lines; i++) + ImGui::Text("%*sThis is line %d", i * 4, "", i); // Pad with space to extend size horizontally + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window with custom resize constraints. +static void ShowExampleAppConstrainedResize(bool* p_open) +{ + struct CustomConstraints + { + // Helper functions to demonstrate programmatic constraints + static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y); } + static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); } + }; + + const char* test_desc[] = + { + "Resize vertical only", + "Resize horizontal only", + "Width > 100, Height > 100", + "Width 400-500", + "Height 400-500", + "Custom: Always Square", + "Custom: Fixed Steps (100)", + }; + + static bool auto_resize = false; + static int type = 0; + static int display_lines = 10; + if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only + if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only + if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 + if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500 + if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500 + if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square + if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step + + ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; + if (ImGui::Begin("Example: Constrained Resize", p_open, flags)) + { + if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); + if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); + if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } + ImGui::SetNextItemWidth(200); + ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc)); + ImGui::SetNextItemWidth(200); + ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); + ImGui::Checkbox("Auto-resize", &auto_resize); + for (int i = 0; i < display_lines; i++) + ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple static window with no decoration +// + a context-menu to choose which corner of the screen to use. +static void ShowExampleAppSimpleOverlay(bool* p_open) +{ + const float PAD = 10.0f; + static int corner = 0; + ImGuiIO& io = ImGui::GetIO(); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; + if (corner != -1) + { + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImVec2 work_pos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any! + ImVec2 work_size = viewport->WorkSize; + ImVec2 window_pos, window_pos_pivot; + window_pos.x = (corner & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD); + window_pos.y = (corner & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD); + window_pos_pivot.x = (corner & 1) ? 1.0f : 0.0f; + window_pos_pivot.y = (corner & 2) ? 1.0f : 0.0f; + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + window_flags |= ImGuiWindowFlags_NoMove; + } + ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background + if (ImGui::Begin("Example: Simple overlay", p_open, window_flags)) + { + ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)"); + ImGui::Separator(); + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse Position: <invalid>"); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::MenuItem("Custom", NULL, corner == -1)) corner = -1; + if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; + if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; + if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; + if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; + if (p_open && ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndPopup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window covering the entire screen/viewport +static void ShowExampleAppFullscreen(bool* p_open) +{ + static bool use_work_area = true; + static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; + + // We demonstrate using the full viewport area or the work area (without menu-bars, task-bars etc.) + // Based on your use case you may want one of the other. + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos); + ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size); + + if (ImGui::Begin("Example: Fullscreen window", p_open, flags)) + { + ImGui::Checkbox("Use work area instead of main area", &use_work_area); + ImGui::SameLine(); + HelpMarker("Main Area = entire viewport,\nWork Area = entire viewport minus sections used by the main menu bars, task bars etc.\n\nEnable the main-menu bar in Examples menu to see the difference."); + + ImGui::CheckboxFlags("ImGuiWindowFlags_NoBackground", &flags, ImGuiWindowFlags_NoBackground); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoDecoration", &flags, ImGuiWindowFlags_NoDecoration); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoTitleBar", &flags, ImGuiWindowFlags_NoTitleBar); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoCollapse", &flags, ImGuiWindowFlags_NoCollapse); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoScrollbar", &flags, ImGuiWindowFlags_NoScrollbar); + ImGui::Unindent(); + + if (p_open && ImGui::Button("Close this window")) + *p_open = false; + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() +//----------------------------------------------------------------------------- + +// Demonstrate using "##" and "###" in identifiers to manipulate ID generation. +// This apply to all regular items as well. +// Read FAQ section "How can I have multiple widgets with the same label?" for details. +static void ShowExampleAppWindowTitles(bool*) +{ + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + const ImVec2 base_pos = viewport->Pos; + + // By default, Windows are uniquely identified by their title. + // You can use the "##" and "###" markers to manipulate the display/ID. + + // Using "##" to display same title but have unique identifier. + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 100), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##1"); + ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); + ImGui::End(); + + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 200), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##2"); + ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); + ImGui::End(); + + // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" + char buf[128]; + sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount()); + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 300), ImGuiCond_FirstUseEver); + ImGui::Begin(buf); + ImGui::Text("This window has a changing title."); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +//----------------------------------------------------------------------------- + +// Demonstrate using the low-level ImDrawList to draw custom shapes. +static void ShowExampleAppCustomRendering(bool* p_open) +{ + if (!ImGui::Begin("Example: Custom rendering", p_open)) + { + ImGui::End(); + return; + } + + // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of + // overloaded operators, etc. Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your + // types and ImVec2/ImVec4. Dear ImGui defines overloaded operators but they are internal to imgui.cpp and not + // exposed outside (to avoid messing with your types) In this example we are not using the maths operators! + + if (ImGui::BeginTabBar("##TabBar")) + { + if (ImGui::BeginTabItem("Primitives")) + { + ImGui::PushItemWidth(-ImGui::GetFontSize() * 15); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + // Draw gradients + // (note that those are currently exacerbating our sRGB/Linear issues) + // Calling ImGui::GetColorU32() multiplies the given colors by the current Style Alpha, but you may pass the IM_COL32() directly as well.. + ImGui::Text("Gradients"); + ImVec2 gradient_size = ImVec2(ImGui::CalcItemWidth(), ImGui::GetFrameHeight()); + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 0, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 255, 255, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient1", gradient_size); + } + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 255, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 0, 0, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient2", gradient_size); + } + + // Draw a bunch of primitives + ImGui::Text("All primitives"); + static float sz = 36.0f; + static float thickness = 3.0f; + static int ngon_sides = 6; + static bool circle_segments_override = false; + static int circle_segments_override_v = 12; + static bool curve_segments_override = false; + static int curve_segments_override_v = 8; + static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f); + ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 100.0f, "%.0f"); + ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f"); + ImGui::SliderInt("N-gon sides", &ngon_sides, 3, 12); + ImGui::Checkbox("##circlesegmentoverride", &circle_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + circle_segments_override |= ImGui::SliderInt("Circle segments override", &circle_segments_override_v, 3, 40); + ImGui::Checkbox("##curvessegmentoverride", &curve_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + curve_segments_override |= ImGui::SliderInt("Curves segments override", &curve_segments_override_v, 3, 40); + ImGui::ColorEdit4("Color", &colf.x); + + const ImVec2 p = ImGui::GetCursorScreenPos(); + const ImU32 col = ImColor(colf); + const float spacing = 10.0f; + const ImDrawFlags corners_tl_br = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomRight; + const float rounding = sz / 5.0f; + const int circle_segments = circle_segments_override ? circle_segments_override_v : 0; + const int curve_segments = curve_segments_override ? curve_segments_override_v : 0; + float x = p.x + 4.0f; + float y = p.y + 4.0f; + for (int n = 0; n < 2; n++) + { + // First line uses a thickness of 1.0f, second line uses the configurable thickness + float th = (n == 0) ? 1.0f : thickness; + draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon + draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle + //draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line + + // Quadratic Bezier Curve (3 control points) + ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing; + + // Cubic Bezier Curve (4 control points) + ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments); + + x = p.x + 4; + y += sz + spacing; + } + draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon + draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle + //draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) + draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); + + ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f)); + ImGui::PopItemWidth(); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Canvas")) + { + static ImVector<ImVec2> points; + static ImVec2 scrolling(0.0f, 0.0f); + static bool opt_enable_grid = true; + static bool opt_enable_context_menu = true; + static bool adding_line = false; + + ImGui::Checkbox("Enable grid", &opt_enable_grid); + ImGui::Checkbox("Enable context menu", &opt_enable_context_menu); + ImGui::Text("Mouse Left: drag to add lines,\nMouse Right: drag to scroll, click for context menu."); + + // Typically you would use a BeginChild()/EndChild() pair to benefit from a clipping region + own scrolling. + // Here we demonstrate that this can be replaced by simple offsetting + custom drawing + PushClipRect/PopClipRect() calls. + // To use a child window instead we could use, e.g: + // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding + // ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color + // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove); + // ImGui::PopStyleColor(); + // ImGui::PopStyleVar(); + // [...] + // ImGui::EndChild(); + + // Using InvisibleButton() as a convenience 1) it will advance the layout cursor and 2) allows us to use IsItemHovered()/IsItemActive() + ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! + ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); // Resize canvas to what's available + if (canvas_sz.x < 50.0f) canvas_sz.x = 50.0f; + if (canvas_sz.y < 50.0f) canvas_sz.y = 50.0f; + ImVec2 canvas_p1 = ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); + + // Draw border and background color + ImGuiIO& io = ImGui::GetIO(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(50, 50, 50, 255)); + draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); + + // This will catch our interactions + ImGui::InvisibleButton("canvas", canvas_sz, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool is_hovered = ImGui::IsItemHovered(); // Hovered + const bool is_active = ImGui::IsItemActive(); // Held + const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y); // Lock scrolled origin + const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, io.MousePos.y - origin.y); + + // Add first and second point + if (is_hovered && !adding_line && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + { + points.push_back(mouse_pos_in_canvas); + points.push_back(mouse_pos_in_canvas); + adding_line = true; + } + if (adding_line) + { + points.back() = mouse_pos_in_canvas; + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) + adding_line = false; + } + + // Pan (we use a zero mouse threshold when there's no context menu) + // You may decide to make that threshold dynamic based on whether the mouse is hovering something etc. + const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f; + if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan)) + { + scrolling.x += io.MouseDelta.x; + scrolling.y += io.MouseDelta.y; + } + + // Context menu (under default mouse threshold) + ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); + if (opt_enable_context_menu && ImGui::IsMouseReleased(ImGuiMouseButton_Right) && drag_delta.x == 0.0f && drag_delta.y == 0.0f) + ImGui::OpenPopupOnItemClick("context"); + if (ImGui::BeginPopup("context")) + { + if (adding_line) + points.resize(points.size() - 2); + adding_line = false; + if (ImGui::MenuItem("Remove one", NULL, false, points.Size > 0)) { points.resize(points.size() - 2); } + if (ImGui::MenuItem("Remove all", NULL, false, points.Size > 0)) { points.clear(); } + ImGui::EndPopup(); + } + + // Draw grid + all lines in the canvas + draw_list->PushClipRect(canvas_p0, canvas_p1, true); + if (opt_enable_grid) + { + const float GRID_STEP = 64.0f; + for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; x += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), ImVec2(canvas_p0.x + x, canvas_p1.y), IM_COL32(200, 200, 200, 40)); + for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; y += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), ImVec2(canvas_p1.x, canvas_p0.y + y), IM_COL32(200, 200, 200, 40)); + } + for (int n = 0; n < points.Size; n += 2) + draw_list->AddLine(ImVec2(origin.x + points[n].x, origin.y + points[n].y), ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), IM_COL32(255, 255, 0, 255), 2.0f); + draw_list->PopClipRect(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("BG/FG draw lists")) + { + static bool draw_bg = true; + static bool draw_fg = true; + ImGui::Checkbox("Draw in Background draw list", &draw_bg); + ImGui::SameLine(); HelpMarker("The Background draw list will be rendered below every Dear ImGui windows."); + ImGui::Checkbox("Draw in Foreground draw list", &draw_fg); + ImGui::SameLine(); HelpMarker("The Foreground draw list will be rendered over every Dear ImGui windows."); + ImVec2 window_pos = ImGui::GetWindowPos(); + ImVec2 window_size = ImGui::GetWindowSize(); + ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f); + if (draw_bg) + ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 0, 10 + 4); + if (draw_fg) + ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 0, 10); + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() +//----------------------------------------------------------------------------- + +// Simplified structure to mimic a Document model +struct MyDocument +{ + const char* Name; // Document title + bool Open; // Set when open (we keep an array of all available documents to simplify demo code!) + bool OpenPrev; // Copy of Open from last update. + bool Dirty; // Set when the document has been modified + bool WantClose; // Set when the document + ImVec4 Color; // An arbitrary variable associated to the document + + MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) + { + Name = name; + Open = OpenPrev = open; + Dirty = false; + WantClose = false; + Color = color; + } + void DoOpen() { Open = true; } + void DoQueueClose() { WantClose = true; } + void DoForceClose() { Open = false; Dirty = false; } + void DoSave() { Dirty = false; } + + // Display placeholder contents for the Document + static void DisplayContents(MyDocument* doc) + { + ImGui::PushID(doc); + ImGui::Text("Document \"%s\"", doc->Name); + ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); + ImGui::PopStyleColor(); + if (ImGui::Button("Modify", ImVec2(100, 0))) + doc->Dirty = true; + ImGui::SameLine(); + if (ImGui::Button("Save", ImVec2(100, 0))) + doc->DoSave(); + ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. + ImGui::PopID(); + } + + // Display context menu for the Document + static void DisplayContextMenu(MyDocument* doc) + { + if (!ImGui::BeginPopupContextItem()) + return; + + char buf[256]; + sprintf(buf, "Save %s", doc->Name); + if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) + doc->DoSave(); + if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) + doc->DoQueueClose(); + ImGui::EndPopup(); + } +}; + +struct ExampleAppDocuments +{ + ImVector<MyDocument> Documents; + + ExampleAppDocuments() + { + Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); + Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); + Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("A Rather Long Title", false)); + Documents.push_back(MyDocument("Some Document", false)); + } +}; + +// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. +// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, +// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for +// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has +// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively +// give the impression of a flicker for one frame. +// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. +// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. +static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) +{ + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open && doc->OpenPrev) + ImGui::SetTabItemClosed(doc->Name); + doc->OpenPrev = doc->Open; + } +} + +void ShowExampleAppDocuments(bool* p_open) +{ + static ExampleAppDocuments app; + + // Options + static bool opt_reorderable = true; + static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_; + + bool window_contents_visible = ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar); + if (!window_contents_visible) + { + ImGui::End(); + return; + } + + // Menu + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + int open_count = 0; + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + open_count += app.Documents[doc_n].Open ? 1 : 0; + + if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) + { + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + if (ImGui::MenuItem(doc->Name)) + doc->DoOpen(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + app.Documents[doc_n].DoQueueClose(); + if (ImGui::MenuItem("Exit", "Alt+F4")) {} + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // [Debug] List documents with one checkbox for each + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc_n > 0) + ImGui::SameLine(); + ImGui::PushID(doc); + if (ImGui::Checkbox(doc->Name, &doc->Open)) + if (!doc->Open) + doc->DoForceClose(); + ImGui::PopID(); + } + + ImGui::Separator(); + + // Submit Tab Bar and Tabs + { + ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0); + if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) + { + if (opt_reorderable) + NotifyOfDocumentsClosedElsewhere(app); + + // [DEBUG] Stress tests + //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. + //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. + + // Submit Tabs + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + continue; + + ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); + bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); + + // Cancel attempt to close when unsaved add to save queue so we can display a popup. + if (!doc->Open && doc->Dirty) + { + doc->Open = true; + doc->DoQueueClose(); + } + + MyDocument::DisplayContextMenu(doc); + if (visible) + { + MyDocument::DisplayContents(doc); + ImGui::EndTabItem(); + } + } + + ImGui::EndTabBar(); + } + } + + // Update closing queue + static ImVector<MyDocument*> close_queue; + if (close_queue.empty()) + { + // Close queue is locked once we started a popup + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc->WantClose) + { + doc->WantClose = false; + close_queue.push_back(doc); + } + } + } + + // Display closing confirmation UI + if (!close_queue.empty()) + { + int close_queue_unsaved_documents = 0; + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + close_queue_unsaved_documents++; + + if (close_queue_unsaved_documents == 0) + { + // Close documents when all are unsaved + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + } + else + { + if (!ImGui::IsPopupOpen("Save?")) + ImGui::OpenPopup("Save?"); + if (ImGui::BeginPopupModal("Save?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("Save change to the following items?"); + float item_height = ImGui::GetTextLineHeightWithSpacing(); + if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height))) + { + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + ImGui::Text("%s", close_queue[n]->Name); + ImGui::EndChildFrame(); + } + + ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f); + if (ImGui::Button("Yes", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + { + if (close_queue[n]->Dirty) + close_queue[n]->DoSave(); + close_queue[n]->DoForceClose(); + } + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("No", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel", button_size)) + { + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + } + + ImGui::End(); +} + +// End of Demo code +#else + +void ImGui::ShowAboutWindow(bool*) {} +void ImGui::ShowDemoWindow(bool*) {} +void ImGui::ShowUserGuide() {} +void ImGui::ShowStyleEditor(ImGuiStyle*) {} + +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_draw.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_draw.cpp similarity index 58% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui_draw.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui_draw.cpp index 63d99a297b..c41a1ba0b2 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_draw.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_draw.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.70 +// dear imgui, v1.82 // (drawing and font code) /* @@ -8,6 +8,7 @@ Index of this file: // [SECTION] STB libraries implementation // [SECTION] Style functions // [SECTION] ImDrawList +// [SECTION] ImDrawListSplitter // [SECTION] ImDrawData // [SECTION] Helpers ShadeVertsXXX functions // [SECTION] ImFontConfig @@ -15,7 +16,7 @@ Index of this file: // [SECTION] ImFontAtlas glyph ranges helpers // [SECTION] ImFontGlyphRangesBuilder // [SECTION] ImFont -// [SECTION] Internal Render Helpers +// [SECTION] ImGui Internal Render Helpers // [SECTION] Decompression code // [SECTION] Default font data (ProggyClean.ttf) @@ -26,14 +27,20 @@ Index of this file: #endif #include "imgui.h" +#ifndef IMGUI_DISABLE + #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS #endif + #include "imgui_internal.h" +#ifdef IMGUI_ENABLE_FREETYPE +#include "misc/freetype/imgui_freetype.h" +#endif #include <stdio.h> // vsnprintf, sscanf, printf #if !defined(alloca) -#if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__) || defined(__APPLE__) +#if defined(__GLIBC__) || defined(__sun) || defined(__APPLE__) || defined(__NEWLIB__) #include <alloca.h> // alloca (glibc uses <alloca.h>. Note that Cygwin may have _WIN32 defined, so the order matters here) #elif defined(_WIN32) #include <malloc.h> // alloca @@ -47,36 +54,36 @@ Index of this file: // Visual Studio warnings #ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant #pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) #pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen #endif // Clang/GCC warnings with -Weverything -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference is. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0 +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! #endif -#if __has_warning("-Wcomma") -#pragma clang diagnostic ignored "-Wcomma" // warning : possible misuse of comma operator here // -#endif -#if __has_warning("-Wreserved-id-macro") -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier // -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#if __has_warning("-Walloca") +#pragma clang diagnostic ignored "-Walloca" // warning: use of function '__builtin_alloca' is discouraged #endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wcomma" // warning: possible misuse of comma operator here +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision #elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used #pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function #pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value #pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer -#if __GNUC__ >= 8 -#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead #endif //------------------------------------------------------------------------- @@ -100,24 +107,24 @@ namespace IMGUI_STB_NAMESPACE #pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration #endif -#ifdef __clang__ +#if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wmissing-prototypes" #pragma clang diagnostic ignored "-Wimplicit-fallthrough" -#pragma clang diagnostic ignored "-Wcast-qual" // warning : cast from 'const xxxx *' to 'xxx *' drops const qualifier // +#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier #endif -#ifdef __GNUC__ +#if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits] #pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers #endif #ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) -#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION +#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in another compilation unit #define STBRP_STATIC -#define STBRP_ASSERT(x) IM_ASSERT(x) +#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0) #define STBRP_SORT ImQsort #define STB_RECT_PACK_IMPLEMENTATION #endif @@ -128,11 +135,12 @@ namespace IMGUI_STB_NAMESPACE #endif #endif +#ifdef IMGUI_ENABLE_STB_TRUETYPE #ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) -#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in another compilation unit #define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x)) #define STBTT_free(x,u) ((void)(u), IM_FREE(x)) -#define STBTT_assert(x) IM_ASSERT(x) +#define STBTT_assert(x) do { IM_ASSERT(x); } while(0) #define STBTT_fmod(x,y) ImFmod(x,y) #define STBTT_sqrt(x) ImSqrt(x) #define STBTT_pow(x,y) ImPow(x,y) @@ -150,16 +158,17 @@ namespace IMGUI_STB_NAMESPACE #include "imstb_truetype.h" #endif #endif +#endif // IMGUI_ENABLE_STB_TRUETYPE -#ifdef __GNUC__ +#if defined(__GNUC__) #pragma GCC diagnostic pop #endif -#ifdef __clang__ +#if defined(__clang__) #pragma clang diagnostic pop #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) #pragma warning (pop) #endif @@ -207,7 +216,7 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst) colors[ImGuiCol_Separator] = colors[ImGuiCol_Border]; colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.78f); colors[ImGuiCol_SeparatorActive] = ImVec4(0.10f, 0.40f, 0.75f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.25f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.20f); colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); @@ -219,6 +228,11 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst) colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); @@ -234,7 +248,7 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst) colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.70f); + colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.85f); colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); colors[ImGuiCol_Border] = ImVec4(0.50f, 0.50f, 0.50f, 0.50f); @@ -259,10 +273,10 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst) colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f); colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f); colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f); - colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); + colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f); colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.16f); + colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f); colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); @@ -274,6 +288,11 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst) colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.27f, 0.27f, 0.38f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.45f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; @@ -315,10 +334,10 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst) colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); + colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f); colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f); colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.80f, 0.80f, 0.80f, 0.56f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.35f, 0.35f, 0.35f, 0.17f); colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f); @@ -330,6 +349,11 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst) colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.78f, 0.87f, 0.98f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.57f, 0.57f, 0.64f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.68f, 0.68f, 0.74f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(0.30f, 0.30f, 0.30f, 0.09f); colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; @@ -339,66 +363,78 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst) } //----------------------------------------------------------------------------- -// ImDrawList +// [SECTION] ImDrawList //----------------------------------------------------------------------------- ImDrawListSharedData::ImDrawListSharedData() { - Font = NULL; - FontSize = 0.0f; - CurveTessellationTol = 0.0f; - ClipRectFullscreen = ImVec4(-8192.0f, -8192.0f, +8192.0f, +8192.0f); - - // Const data - for (int i = 0; i < IM_ARRAYSIZE(CircleVtx12); i++) + memset(this, 0, sizeof(*this)); + for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++) { - const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(CircleVtx12); - CircleVtx12[i] = ImVec2(ImCos(a), ImSin(a)); + const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx); + ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); } -void ImDrawList::Clear() +void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) { + if (CircleSegmentMaxError == max_error) + return; + + IM_ASSERT(max_error > 0.0f); + CircleSegmentMaxError = max_error; + for (int i = 0; i < IM_ARRAYSIZE(CircleSegmentCounts); i++) + { + const float radius = (float)i; + CircleSegmentCounts[i] = (ImU8)((i > 0) ? IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, CircleSegmentMaxError) : 0); + } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); +} + +// Initialize before use in a new frame. We always have a command ready in the buffer. +void ImDrawList::_ResetForNewFrame() +{ + // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. + // (those should be IM_STATIC_ASSERT() in theory but with our pre C++11 setup the whole check doesn't compile with GCC) + IM_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); + IM_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); + IM_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); + CmdBuffer.resize(0); IdxBuffer.resize(0); VtxBuffer.resize(0); - Flags = ImDrawListFlags_AntiAliasedLines | ImDrawListFlags_AntiAliasedFill; + Flags = _Data->InitialFlags; + memset(&_CmdHeader, 0, sizeof(_CmdHeader)); _VtxCurrentIdx = 0; _VtxWritePtr = NULL; _IdxWritePtr = NULL; _ClipRectStack.resize(0); _TextureIdStack.resize(0); _Path.resize(0); - _ChannelsCurrent = 0; - _ChannelsCount = 1; - // NB: Do not clear channels so our allocations are re-used after the first frame. + _Splitter.Clear(); + CmdBuffer.push_back(ImDrawCmd()); + _FringeScale = 1.0f; } -void ImDrawList::ClearFreeMemory() +void ImDrawList::_ClearFreeMemory() { CmdBuffer.clear(); IdxBuffer.clear(); VtxBuffer.clear(); + Flags = ImDrawListFlags_None; _VtxCurrentIdx = 0; _VtxWritePtr = NULL; _IdxWritePtr = NULL; _ClipRectStack.clear(); _TextureIdStack.clear(); _Path.clear(); - _ChannelsCurrent = 0; - _ChannelsCount = 1; - for (int i = 0; i < _Channels.Size; i++) - { - if (i == 0) memset(&_Channels[0], 0, sizeof(_Channels[0])); // channel 0 is a copy of CmdBuffer/IdxBuffer, don't destruct again - _Channels[i].CmdBuffer.clear(); - _Channels[i].IdxBuffer.clear(); - } - _Channels.clear(); + _Splitter.ClearFreeMemory(); } ImDrawList* ImDrawList::CloneOutput() const { - ImDrawList* dst = IM_NEW(ImDrawList(NULL)); + ImDrawList* dst = IM_NEW(ImDrawList(_Data)); dst->CmdBuffer = CmdBuffer; dst->IdxBuffer = IdxBuffer; dst->VtxBuffer = VtxBuffer; @@ -406,84 +442,127 @@ ImDrawList* ImDrawList::CloneOutput() const return dst; } -// Using macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug builds -#define GetCurrentClipRect() (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1] : _Data->ClipRectFullscreen) -#define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : (ImTextureID)NULL) - void ImDrawList::AddDrawCmd() { ImDrawCmd draw_cmd; - draw_cmd.ClipRect = GetCurrentClipRect(); - draw_cmd.TextureId = GetCurrentTextureId(); + draw_cmd.ClipRect = _CmdHeader.ClipRect; // Same as calling ImDrawCmd_HeaderCopy() + draw_cmd.TextureId = _CmdHeader.TextureId; + draw_cmd.VtxOffset = _CmdHeader.VtxOffset; + draw_cmd.IdxOffset = IdxBuffer.Size; IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); CmdBuffer.push_back(draw_cmd); } +// Pop trailing draw command (used before merging or presenting to user) +// Note that this leaves the ImDrawList in a state unfit for further commands, as most code assume that CmdBuffer.Size > 0 && CmdBuffer.back().UserCallback == NULL +void ImDrawList::_PopUnusedDrawCmd() +{ + if (CmdBuffer.Size == 0) + return; + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount == 0 && curr_cmd->UserCallback == NULL) + CmdBuffer.pop_back(); +} + void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) { - ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL; - if (!current_cmd || current_cmd->ElemCount != 0 || current_cmd->UserCallback != NULL) + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + IM_ASSERT(curr_cmd->UserCallback == NULL); + if (curr_cmd->ElemCount != 0) { AddDrawCmd(); - current_cmd = &CmdBuffer.back(); + curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; } - current_cmd->UserCallback = callback; - current_cmd->UserCallbackData = callback_data; + curr_cmd->UserCallback = callback; + curr_cmd->UserCallbackData = callback_data; AddDrawCmd(); // Force a new command after us (see comment below) } +// Compare ClipRect, TextureId and VtxOffset with a single memcmp() +#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) +#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset +#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset + // Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack. // The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only. -void ImDrawList::UpdateClipRect() +void ImDrawList::_OnChangedClipRect() { // If current command is used with different settings we need to add a new command - const ImVec4 curr_clip_rect = GetCurrentClipRect(); - ImDrawCmd* curr_cmd = CmdBuffer.Size > 0 ? &CmdBuffer.Data[CmdBuffer.Size-1] : NULL; - if (!curr_cmd || (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) != 0) || curr_cmd->UserCallback != NULL) + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &_CmdHeader.ClipRect, sizeof(ImVec4)) != 0) { AddDrawCmd(); return; } + IM_ASSERT(curr_cmd->UserCallback == NULL); // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL; - if (curr_cmd->ElemCount == 0 && prev_cmd && memcmp(&prev_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) == 0 && prev_cmd->TextureId == GetCurrentTextureId() && prev_cmd->UserCallback == NULL) + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && prev_cmd->UserCallback == NULL) + { CmdBuffer.pop_back(); - else - curr_cmd->ClipRect = curr_clip_rect; + return; + } + + curr_cmd->ClipRect = _CmdHeader.ClipRect; } -void ImDrawList::UpdateTextureID() +void ImDrawList::_OnChangedTextureID() { // If current command is used with different settings we need to add a new command - const ImTextureID curr_texture_id = GetCurrentTextureId(); - ImDrawCmd* curr_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL; - if (!curr_cmd || (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != curr_texture_id) || curr_cmd->UserCallback != NULL) + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != _CmdHeader.TextureId) { AddDrawCmd(); return; } + IM_ASSERT(curr_cmd->UserCallback == NULL); // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL; - if (curr_cmd->ElemCount == 0 && prev_cmd && prev_cmd->TextureId == curr_texture_id && memcmp(&prev_cmd->ClipRect, &GetCurrentClipRect(), sizeof(ImVec4)) == 0 && prev_cmd->UserCallback == NULL) + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && prev_cmd->UserCallback == NULL) + { CmdBuffer.pop_back(); - else - curr_cmd->TextureId = curr_texture_id; + return; + } + + curr_cmd->TextureId = _CmdHeader.TextureId; } -#undef GetCurrentClipRect -#undef GetCurrentTextureId +void ImDrawList::_OnChangedVtxOffset() +{ + // We don't need to compare curr_cmd->VtxOffset != _CmdHeader.VtxOffset because we know it'll be different at the time we call this. + _VtxCurrentIdx = 0; + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + //IM_ASSERT(curr_cmd->VtxOffset != _CmdHeader.VtxOffset); // See #3349 + if (curr_cmd->ElemCount != 0) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + curr_cmd->VtxOffset = _CmdHeader.VtxOffset; +} + +int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const +{ + // Automatic segment count + const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy + if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) + return _Data->CircleSegmentCounts[radius_idx]; // Use cached value + else + return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); +} // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) void ImDrawList::PushClipRect(ImVec2 cr_min, ImVec2 cr_max, bool intersect_with_current_clip_rect) { ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y); - if (intersect_with_current_clip_rect && _ClipRectStack.Size) + if (intersect_with_current_clip_rect) { - ImVec4 current = _ClipRectStack.Data[_ClipRectStack.Size-1]; + ImVec4 current = _CmdHeader.ClipRect; if (cr.x < current.x) cr.x = current.x; if (cr.y < current.y) cr.y = current.y; if (cr.z > current.z) cr.z = current.z; @@ -493,7 +572,8 @@ void ImDrawList::PushClipRect(ImVec2 cr_min, ImVec2 cr_max, bool intersect_with_ cr.w = ImMax(cr.y, cr.w); _ClipRectStack.push_back(cr); - UpdateClipRect(); + _CmdHeader.ClipRect = cr; + _OnChangedClipRect(); } void ImDrawList::PushClipRectFullScreen() @@ -503,108 +583,43 @@ void ImDrawList::PushClipRectFullScreen() void ImDrawList::PopClipRect() { - IM_ASSERT(_ClipRectStack.Size > 0); _ClipRectStack.pop_back(); - UpdateClipRect(); + _CmdHeader.ClipRect = (_ClipRectStack.Size == 0) ? _Data->ClipRectFullscreen : _ClipRectStack.Data[_ClipRectStack.Size - 1]; + _OnChangedClipRect(); } void ImDrawList::PushTextureID(ImTextureID texture_id) { _TextureIdStack.push_back(texture_id); - UpdateTextureID(); + _CmdHeader.TextureId = texture_id; + _OnChangedTextureID(); } void ImDrawList::PopTextureID() { - IM_ASSERT(_TextureIdStack.Size > 0); _TextureIdStack.pop_back(); - UpdateTextureID(); + _CmdHeader.TextureId = (_TextureIdStack.Size == 0) ? (ImTextureID)NULL : _TextureIdStack.Data[_TextureIdStack.Size - 1]; + _OnChangedTextureID(); } -void ImDrawList::ChannelsSplit(int channels_count) -{ - IM_ASSERT(_ChannelsCurrent == 0 && _ChannelsCount == 1); - int old_channels_count = _Channels.Size; - if (old_channels_count < channels_count) - _Channels.resize(channels_count); - _ChannelsCount = channels_count; - - // _Channels[] (24/32 bytes each) hold storage that we'll swap with this->_CmdBuffer/_IdxBuffer - // The content of _Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. - // When we switch to the next channel, we'll copy _CmdBuffer/_IdxBuffer into _Channels[0] and then _Channels[1] into _CmdBuffer/_IdxBuffer - memset(&_Channels[0], 0, sizeof(ImDrawChannel)); - for (int i = 1; i < channels_count; i++) - { - if (i >= old_channels_count) - { - IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); - } - else - { - _Channels[i].CmdBuffer.resize(0); - _Channels[i].IdxBuffer.resize(0); - } - if (_Channels[i].CmdBuffer.Size == 0) - { - ImDrawCmd draw_cmd; - draw_cmd.ClipRect = _ClipRectStack.back(); - draw_cmd.TextureId = _TextureIdStack.back(); - _Channels[i].CmdBuffer.push_back(draw_cmd); - } - } -} - -void ImDrawList::ChannelsMerge() -{ - // Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. - if (_ChannelsCount <= 1) - return; - - ChannelsSetCurrent(0); - if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0) - CmdBuffer.pop_back(); - - int new_cmd_buffer_count = 0, new_idx_buffer_count = 0; - for (int i = 1; i < _ChannelsCount; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (ch.CmdBuffer.Size && ch.CmdBuffer.back().ElemCount == 0) - ch.CmdBuffer.pop_back(); - new_cmd_buffer_count += ch.CmdBuffer.Size; - new_idx_buffer_count += ch.IdxBuffer.Size; - } - CmdBuffer.resize(CmdBuffer.Size + new_cmd_buffer_count); - IdxBuffer.resize(IdxBuffer.Size + new_idx_buffer_count); - - ImDrawCmd* cmd_write = CmdBuffer.Data + CmdBuffer.Size - new_cmd_buffer_count; - _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size - new_idx_buffer_count; - for (int i = 1; i < _ChannelsCount; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (int sz = ch.CmdBuffer.Size) { memcpy(cmd_write, ch.CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } - if (int sz = ch.IdxBuffer.Size) { memcpy(_IdxWritePtr, ch.IdxBuffer.Data, sz * sizeof(ImDrawIdx)); _IdxWritePtr += sz; } - } - UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call. - _ChannelsCount = 1; -} - -void ImDrawList::ChannelsSetCurrent(int idx) -{ - IM_ASSERT(idx < _ChannelsCount); - if (_ChannelsCurrent == idx) return; - memcpy(&_Channels.Data[_ChannelsCurrent].CmdBuffer, &CmdBuffer, sizeof(CmdBuffer)); // copy 12 bytes, four times - memcpy(&_Channels.Data[_ChannelsCurrent].IdxBuffer, &IdxBuffer, sizeof(IdxBuffer)); - _ChannelsCurrent = idx; - memcpy(&CmdBuffer, &_Channels.Data[_ChannelsCurrent].CmdBuffer, sizeof(CmdBuffer)); - memcpy(&IdxBuffer, &_Channels.Data[_ChannelsCurrent].IdxBuffer, sizeof(IdxBuffer)); - _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size; -} - -// NB: this can be called with negative count for removing primitives (as long as the result does not underflow) +// Reserve space for a number of vertices and indices. +// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or +// submit the intermediate results. PrimUnreserve() can be used to release unused allocations. void ImDrawList::PrimReserve(int idx_count, int vtx_count) { - ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1]; - draw_cmd.ElemCount += idx_count; + // Large mesh support (when enabled) + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) + { + // FIXME: In theory we should be testing that vtx_count <64k here. + // In practice, RenderText() relies on reserving ahead for a worst case scenario so it is currently useful for us + // to not make that check until we rework the text functions to handle clipping and large horizontal lines better. + _CmdHeader.VtxOffset = VtxBuffer.Size; + _OnChangedVtxOffset(); + } + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount += idx_count; int vtx_buffer_old_size = VtxBuffer.Size; VtxBuffer.resize(vtx_buffer_old_size + vtx_count); @@ -615,6 +630,17 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count) _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; } +// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). +void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) +{ + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount -= idx_count; + VtxBuffer.shrink(VtxBuffer.Size - vtx_count); + IdxBuffer.shrink(IdxBuffer.Size - idx_count); +} + // Fully unrolled with inline call to keep our debug builds decently fast. void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col) { @@ -660,42 +686,55 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c _IdxWritePtr += 6; } -// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superflous function calls to optimize debug/non-inlined builds. +// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superfluous function calls to optimize debug/non-inlined builds. // Those macros expects l-values. -#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = 1.0f / ImSqrt(d2); VX *= inv_len; VY *= inv_len; } } -#define IM_FIXNORMAL2F(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 < 0.5f) d2 = 0.5f; float inv_lensq = 1.0f / d2; VX *= inv_lensq; VY *= inv_lensq; } +#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) do { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = 1.0f / ImSqrt(d2); VX *= inv_len; VY *= inv_len; } } while (0) +#define IM_FIXNORMAL2F(VX,VY) do { float d2 = VX*VX + VY*VY; if (d2 < 0.5f) d2 = 0.5f; float inv_lensq = 1.0f / d2; VX *= inv_lensq; VY *= inv_lensq; } while (0) // TODO: Thickness anti-aliased lines cap are missing their AA fringe. // We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds. -void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, bool closed, float thickness) +void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, ImDrawFlags flags, float thickness) { if (points_count < 2) return; - const ImVec2 uv = _Data->TexUvWhitePixel; + const bool closed = (flags & ImDrawFlags_Closed) != 0; + const ImVec2 opaque_uv = _Data->TexUvWhitePixel; + const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw + const bool thick_line = (thickness > _FringeScale); - int count = points_count; - if (!closed) - count = points_count-1; - - const bool thick_line = thickness > 1.0f; if (Flags & ImDrawListFlags_AntiAliasedLines) { // Anti-aliased stroke - const float AA_SIZE = 1.0f; + const float AA_SIZE = _FringeScale; const ImU32 col_trans = col & ~IM_COL32_A_MASK; - const int idx_count = thick_line ? count*18 : count*12; - const int vtx_count = thick_line ? points_count*4 : points_count*3; + // Thicknesses <1.0 should behave like thickness 1.0 + thickness = ImMax(thickness, 1.0f); + const int integer_thickness = (int)thickness; + const float fractional_thickness = thickness - integer_thickness; + + // Do we want to draw this line using a texture? + // - For now, only draw integer-width lines using textures to avoid issues with the way scaling occurs, could be improved. + // - If AA_SIZE is not 1.0f we cannot use the texture path. + const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f) && (AA_SIZE == 1.0f); + + // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines is off + IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)); + + const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); + const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); PrimReserve(idx_count, vtx_count); // Temporary buffer - ImVec2* temp_normals = (ImVec2*)alloca(points_count * (thick_line ? 5 : 3) * sizeof(ImVec2)); //-V630 + // The first <points_count> items are normals at each line point, then after that there are either 2 or 4 temp points for each line point + ImVec2* temp_normals = (ImVec2*)alloca(points_count * ((use_texture || !thick_line) ? 3 : 5) * sizeof(ImVec2)); //-V630 ImVec2* temp_points = temp_normals + points_count; + // Calculate normals (tangents) for each line segment for (int i1 = 0; i1 < count; i1++) { - const int i2 = (i1+1) == points_count ? 0 : i1+1; + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; float dx = points[i2].x - points[i1].x; float dy = points[i2].y - points[i1].y; IM_NORMALIZE2F_OVER_ZERO(dx, dy); @@ -703,79 +742,134 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 temp_normals[i1].y = -dx; } if (!closed) - temp_normals[points_count-1] = temp_normals[points_count-2]; + temp_normals[points_count - 1] = temp_normals[points_count - 2]; - if (!thick_line) + // If we are drawing a one-pixel-wide line without a texture, or a textured line of any width, we only need 2 or 3 vertices per point + if (use_texture || !thick_line) { + // [PATH 1] Texture-based lines (thick or non-thick) + // [PATH 2] Non texture-based lines (non-thick) + + // The width of the geometry we need to draw - this is essentially <thickness> pixels for the line itself, plus "one pixel" for AA. + // - In the texture-based path, we don't use AA_SIZE here because the +1 is tied to the generated texture + // (see ImFontAtlasBuildRenderLinesTexData() function), and so alternate values won't work without changes to that code. + // - In the non texture-based paths, we would allow AA_SIZE to potentially be != 1.0f with a patch (e.g. fringe_scale patch to + // allow scaling geometry while preserving one-screen-pixel AA fringe). + const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : AA_SIZE; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend if (!closed) { - temp_points[0] = points[0] + temp_normals[0] * AA_SIZE; - temp_points[1] = points[0] - temp_normals[0] * AA_SIZE; - temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * AA_SIZE; - temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * AA_SIZE; + temp_points[0] = points[0] + temp_normals[0] * half_draw_size; + temp_points[1] = points[0] - temp_normals[0] * half_draw_size; + temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * half_draw_size; + temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * half_draw_size; } + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; - for (int i1 = 0; i1 < count; i1++) + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+3; + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; // i2 is the second point of the line segment + const unsigned int idx2 = ((i1 + 1) == points_count) ? _VtxCurrentIdx : (idx1 + (use_texture ? 2 : 3)); // Vertex index for end of segment // Average normals float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; - IM_FIXNORMAL2F(dm_x, dm_y) - dm_x *= AA_SIZE; - dm_y *= AA_SIZE; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= half_draw_size; // dm_x, dm_y are offset to the outer edge of the AA area + dm_y *= half_draw_size; - // Add temporary vertexes - ImVec2* out_vtx = &temp_points[i2*2]; + // Add temporary vertexes for the outer edges + ImVec2* out_vtx = &temp_points[i2 * 2]; out_vtx[0].x = points[i2].x + dm_x; out_vtx[0].y = points[i2].y + dm_y; out_vtx[1].x = points[i2].x - dm_x; out_vtx[1].y = points[i2].y - dm_y; - // Add indexes - _IdxWritePtr[0] = (ImDrawIdx)(idx2+0); _IdxWritePtr[1] = (ImDrawIdx)(idx1+0); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2); - _IdxWritePtr[3] = (ImDrawIdx)(idx1+2); _IdxWritePtr[4] = (ImDrawIdx)(idx2+2); _IdxWritePtr[5] = (ImDrawIdx)(idx2+0); - _IdxWritePtr[6] = (ImDrawIdx)(idx2+1); _IdxWritePtr[7] = (ImDrawIdx)(idx1+1); _IdxWritePtr[8] = (ImDrawIdx)(idx1+0); - _IdxWritePtr[9] = (ImDrawIdx)(idx1+0); _IdxWritePtr[10]= (ImDrawIdx)(idx2+0); _IdxWritePtr[11]= (ImDrawIdx)(idx2+1); - _IdxWritePtr += 12; + if (use_texture) + { + // Add indices for two triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 1); // Right tri + _IdxWritePtr[3] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[4] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Left tri + _IdxWritePtr += 6; + } + else + { + // Add indexes for four triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); // Right tri 1 + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Right tri 2 + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); // Left tri 1 + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); // Left tri 2 + _IdxWritePtr += 12; + } idx1 = idx2; } - // Add vertexes - for (int i = 0; i < points_count; i++) + // Add vertexes for each point on the line + if (use_texture) { - _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = temp_points[i*2+0]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; - _VtxWritePtr[2].pos = temp_points[i*2+1]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col_trans; - _VtxWritePtr += 3; + // If we're using textures we only need to emit the left/right edge vertices + ImVec4 tex_uvs = _Data->TexUvLines[integer_thickness]; + /*if (fractional_thickness != 0.0f) // Currently always zero when use_texture==false! + { + const ImVec4 tex_uvs_1 = _Data->TexUvLines[integer_thickness + 1]; + tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() + tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; + tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; + tex_uvs.w = tex_uvs.w + (tex_uvs_1.w - tex_uvs.w) * fractional_thickness; + }*/ + ImVec2 tex_uv0(tex_uvs.x, tex_uvs.y); + ImVec2 tex_uv1(tex_uvs.z, tex_uvs.w); + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = temp_points[i * 2 + 0]; _VtxWritePtr[0].uv = tex_uv0; _VtxWritePtr[0].col = col; // Left-side outer edge + _VtxWritePtr[1].pos = temp_points[i * 2 + 1]; _VtxWritePtr[1].uv = tex_uv1; _VtxWritePtr[1].col = col; // Right-side outer edge + _VtxWritePtr += 2; + } + } + else + { + // If we're not using a texture, we need the center vertex as well + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; // Center of line + _VtxWritePtr[1].pos = temp_points[i * 2 + 0]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col_trans; // Left-side outer edge + _VtxWritePtr[2].pos = temp_points[i * 2 + 1]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col_trans; // Right-side outer edge + _VtxWritePtr += 3; + } } } else { + // [PATH 2] Non texture-based lines (thick): we need to draw the solid line core and thus require four vertices per point const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend if (!closed) { + const int points_last = points_count - 1; temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE); temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness); temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness); temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE); - temp_points[(points_count-1)*4+0] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE); - temp_points[(points_count-1)*4+1] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness); - temp_points[(points_count-1)*4+2] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness); - temp_points[(points_count-1)*4+3] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 0] = points[points_last] + temp_normals[points_last] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 1] = points[points_last] + temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 2] = points[points_last] - temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 3] = points[points_last] - temp_normals[points_last] * (half_inner_thickness + AA_SIZE); } + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; - for (int i1 = 0; i1 < count; i1++) + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment { - const int i2 = (i1+1) == points_count ? 0 : i1+1; - unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4; + const int i2 = (i1 + 1) == points_count ? 0 : (i1 + 1); // i2 is the second point of the line segment + const unsigned int idx2 = (i1 + 1) == points_count ? _VtxCurrentIdx : (idx1 + 4); // Vertex index for end of segment // Average normals float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; @@ -786,8 +880,8 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 float dm_in_x = dm_x * half_inner_thickness; float dm_in_y = dm_y * half_inner_thickness; - // Add temporary vertexes - ImVec2* out_vtx = &temp_points[i2*4]; + // Add temporary vertices + ImVec2* out_vtx = &temp_points[i2 * 4]; out_vtx[0].x = points[i2].x + dm_out_x; out_vtx[0].y = points[i2].y + dm_out_y; out_vtx[1].x = points[i2].x + dm_in_x; @@ -798,24 +892,24 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 out_vtx[3].y = points[i2].y - dm_out_y; // Add indexes - _IdxWritePtr[0] = (ImDrawIdx)(idx2+1); _IdxWritePtr[1] = (ImDrawIdx)(idx1+1); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2); - _IdxWritePtr[3] = (ImDrawIdx)(idx1+2); _IdxWritePtr[4] = (ImDrawIdx)(idx2+2); _IdxWritePtr[5] = (ImDrawIdx)(idx2+1); - _IdxWritePtr[6] = (ImDrawIdx)(idx2+1); _IdxWritePtr[7] = (ImDrawIdx)(idx1+1); _IdxWritePtr[8] = (ImDrawIdx)(idx1+0); - _IdxWritePtr[9] = (ImDrawIdx)(idx1+0); _IdxWritePtr[10] = (ImDrawIdx)(idx2+0); _IdxWritePtr[11] = (ImDrawIdx)(idx2+1); - _IdxWritePtr[12] = (ImDrawIdx)(idx2+2); _IdxWritePtr[13] = (ImDrawIdx)(idx1+2); _IdxWritePtr[14] = (ImDrawIdx)(idx1+3); - _IdxWritePtr[15] = (ImDrawIdx)(idx1+3); _IdxWritePtr[16] = (ImDrawIdx)(idx2+3); _IdxWritePtr[17] = (ImDrawIdx)(idx2+2); + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[12] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[13] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[14] = (ImDrawIdx)(idx1 + 3); + _IdxWritePtr[15] = (ImDrawIdx)(idx1 + 3); _IdxWritePtr[16] = (ImDrawIdx)(idx2 + 3); _IdxWritePtr[17] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr += 18; idx1 = idx2; } - // Add vertexes + // Add vertices for (int i = 0; i < points_count; i++) { - _VtxWritePtr[0].pos = temp_points[i*4+0]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col_trans; - _VtxWritePtr[1].pos = temp_points[i*4+1]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = temp_points[i*4+2]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = temp_points[i*4+3]; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col_trans; + _VtxWritePtr[0].pos = temp_points[i * 4 + 0]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col_trans; + _VtxWritePtr[1].pos = temp_points[i * 4 + 1]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = temp_points[i * 4 + 2]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = temp_points[i * 4 + 3]; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col_trans; _VtxWritePtr += 4; } } @@ -823,14 +917,14 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 } else { - // Non Anti-aliased Stroke - const int idx_count = count*6; - const int vtx_count = count*4; // FIXME-OPT: Not sharing edges + // [PATH 4] Non texture-based, Non anti-aliased lines + const int idx_count = count * 6; + const int vtx_count = count * 4; // FIXME-OPT: Not sharing edges PrimReserve(idx_count, vtx_count); for (int i1 = 0; i1 < count; i1++) { - const int i2 = (i1+1) == points_count ? 0 : i1+1; + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; const ImVec2& p1 = points[i1]; const ImVec2& p2 = points[i2]; @@ -840,14 +934,14 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 dx *= (thickness * 0.5f); dy *= (thickness * 0.5f); - _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; + _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col; _VtxWritePtr += 4; - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2); - _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3); + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + 2); + _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx + 2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx + 3); _IdxWritePtr += 6; _VtxCurrentIdx += 4; } @@ -865,24 +959,24 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun if (Flags & ImDrawListFlags_AntiAliasedFill) { // Anti-aliased Fill - const float AA_SIZE = 1.0f; + const float AA_SIZE = _FringeScale; const ImU32 col_trans = col & ~IM_COL32_A_MASK; - const int idx_count = (points_count-2)*3 + points_count*6; - const int vtx_count = (points_count*2); + const int idx_count = (points_count - 2)*3 + points_count * 6; + const int vtx_count = (points_count * 2); PrimReserve(idx_count, vtx_count); // Add indexes for fill unsigned int vtx_inner_idx = _VtxCurrentIdx; - unsigned int vtx_outer_idx = _VtxCurrentIdx+1; + unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; for (int i = 2; i < points_count; i++) { - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+((i-1)<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx+(i<<1)); + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + ((i - 1) << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (i << 1)); _IdxWritePtr += 3; } // Compute normals ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2)); //-V630 - for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) { const ImVec2& p0 = points[i0]; const ImVec2& p1 = points[i1]; @@ -893,7 +987,7 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun temp_normals[i0].y = -dx; } - for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) { // Average normals const ImVec2& n0 = temp_normals[i0]; @@ -910,8 +1004,8 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun _VtxWritePtr += 2; // Add indexes for fringes - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx+(i1<<1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+(i0<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx+(i0<<1)); - _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx+(i0<<1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx+(i1<<1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx+(i1<<1)); + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); + _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr += 6; } _VtxCurrentIdx += (ImDrawIdx)vtx_count; @@ -919,7 +1013,7 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun else { // Non Anti-aliased Fill - const int idx_count = (points_count-2)*3; + const int idx_count = (points_count - 2)*3; const int vtx_count = points_count; PrimReserve(idx_count, vtx_count); for (int i = 0; i < vtx_count; i++) @@ -929,35 +1023,100 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun } for (int i = 2; i < points_count; i++) { - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+i-1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+i); + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + i - 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + i); _IdxWritePtr += 3; } _VtxCurrentIdx += (ImDrawIdx)vtx_count; } } -void ImDrawList::PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12) +void ImDrawList::_PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step) { - if (radius == 0.0f || a_min_of_12 > a_max_of_12) + if (radius <= 0.0f) { - _Path.push_back(centre); + _Path.push_back(center); return; } - _Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1)); - for (int a = a_min_of_12; a <= a_max_of_12; a++) + IM_ASSERT(a_min_sample <= a_max_sample); + + // Calculate arc auto segment step size + if (a_step <= 0) + a_step = IM_DRAWLIST_ARCFAST_SAMPLE_MAX / _CalcCircleAutoSegmentCount(radius); + + // Make sure we never do steps larger than one quarter of the circle + a_step = ImClamp(a_step, 1, IM_DRAWLIST_ARCFAST_TABLE_SIZE / 4); + + // Normalize a_min_sample to always start lie in [0..IM_DRAWLIST_ARCFAST_SAMPLE_MAX] range. + if (a_min_sample < 0) { - const ImVec2& c = _Data->CircleVtx12[a % IM_ARRAYSIZE(_Data->CircleVtx12)]; - _Path.push_back(ImVec2(centre.x + c.x * radius, centre.y + c.y * radius)); + int normalized_sample = a_min_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (normalized_sample < 0) + normalized_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + a_max_sample += (normalized_sample - a_min_sample); + a_min_sample = normalized_sample; } + + const int sample_range = a_max_sample - a_min_sample; + const int a_next_step = a_step; + + int samples = sample_range + 1; + bool extra_max_sample = false; + if (a_step > 1) + { + samples = sample_range / a_step + 1; + const int overstep = sample_range % a_step; + + if (overstep > 0) + { + extra_max_sample = true; + samples++; + + // When we have overstep to avoid awkwardly looking one long line and one tiny one at the end, + // distribute first step range evenly between them by reducing first step size. + if (sample_range > 0) + a_step -= (a_step - overstep) / 2; + } + } + + _Path.resize(_Path.Size + samples); + ImVec2* out_ptr = _Path.Data + (_Path.Size - samples); + + int sample_index = a_min_sample; + for (int a = a_min_sample; a <= a_max_sample; a += a_step, sample_index += a_step, a_step = a_next_step) + { + // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more + if (sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) + sample_index -= IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[sample_index]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + + if (extra_max_sample) + { + int normalized_max_sample = a_max_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (normalized_max_sample < 0) + normalized_max_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[normalized_max_sample]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + + IM_ASSERT_PARANOID(_Path.Data + _Path.Size == out_ptr); } -void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments) +void ImDrawList::_PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) { - if (radius == 0.0f) + if (radius <= 0.0f) { - _Path.push_back(centre); + _Path.push_back(center); return; } + IM_ASSERT(a_min <= a_max); // Note that we are adding a point at both a_min and a_max. // If you are trying to draw a full closed circle you don't want the overlapping points! @@ -965,66 +1124,202 @@ void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, floa for (int i = 0; i <= num_segments; i++) { const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); - _Path.push_back(ImVec2(centre.x + ImCos(a) * radius, centre.y + ImSin(a) * radius)); + _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius)); } } -static void PathBezierToCasteljau(ImVector<ImVec2>* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +// 0: East, 3: South, 6: West, 9: North, 12: East +void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12) +{ + if (radius <= 0.0f) + { + _Path.push_back(center); + return; + } + IM_ASSERT(a_min_of_12 <= a_max_of_12); + _PathArcToFastEx(center, radius, a_min_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, a_max_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, 0); +} + +void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) +{ + if (radius <= 0.0f) + { + _Path.push_back(center); + return; + } + IM_ASSERT(a_min <= a_max); + + if (num_segments > 0) + { + _PathArcToN(center, radius, a_min, a_max, num_segments); + return; + } + + // Automatic segment count + if (radius <= _Data->ArcFastRadiusCutoff) + { + // We are going to use precomputed values for mid samples. + // Determine first and last sample in lookup table that belong to the arc. + const int a_min_sample = (int)ImCeil(IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f)); + const int a_max_sample = (int)( IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f)); + const int a_mid_samples = ImMax(a_max_sample - a_min_sample, 0); + + const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const float a_max_segment_angle = a_max_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const bool a_emit_start = (a_min_segment_angle - a_min) > 0.0f; + const bool a_emit_end = (a_max - a_max_segment_angle) > 0.0f; + + _Path.reserve(_Path.Size + (a_mid_samples + 1 + (a_emit_start ? 1 : 0) + (a_emit_end ? 1 : 0))); + if (a_emit_start) + _Path.push_back(ImVec2(center.x + ImCos(a_min) * radius, center.y + ImSin(a_min) * radius)); + if (a_max_sample >= a_min_sample) + _PathArcToFastEx(center, radius, a_min_sample, a_max_sample, 0); + if (a_emit_end) + _Path.push_back(ImVec2(center.x + ImCos(a_max) * radius, center.y + ImSin(a_max) * radius)); + } + else + { + const float arc_length = a_max - a_min; + const int circle_segment_count = _CalcCircleAutoSegmentCount(radius); + const int arc_segment_count = ImMax((int)ImCeil(circle_segment_count * arc_length / (IM_PI * 2.0f)), (int)(2.0f * IM_PI / arc_length)); + _PathArcToN(center, radius, a_min, a_max, arc_segment_count); + } +} + +ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) +{ + float u = 1.0f - t; + float w1 = u * u * u; + float w2 = 3 * u * u * t; + float w3 = 3 * u * t * t; + float w4 = t * t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x, w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y); +} + +ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t) +{ + float u = 1.0f - t; + float w1 = u * u; + float w2 = 2 * u * t; + float w3 = t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x, w1 * p1.y + w2 * p2.y + w3 * p3.y); +} + +// Closely mimics ImBezierCubicClosestPointCasteljau() in imgui.cpp +static void PathBezierCubicCurveToCasteljau(ImVector<ImVec2>* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) { float dx = x4 - x1; float dy = y4 - y1; - float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); - float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); + float d2 = (x2 - x4) * dy - (y2 - y4) * dx; + float d3 = (x3 - x4) * dy - (y3 - y4) * dx; d2 = (d2 >= 0) ? d2 : -d2; d3 = (d3 >= 0) ? d3 : -d3; - if ((d2+d3) * (d2+d3) < tess_tol * (dx*dx + dy*dy)) + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) { path->push_back(ImVec2(x4, y4)); } else if (level < 10) { - float x12 = (x1+x2)*0.5f, y12 = (y1+y2)*0.5f; - float x23 = (x2+x3)*0.5f, y23 = (y2+y3)*0.5f; - float x34 = (x3+x4)*0.5f, y34 = (y3+y4)*0.5f; - float x123 = (x12+x23)*0.5f, y123 = (y12+y23)*0.5f; - float x234 = (x23+x34)*0.5f, y234 = (y23+y34)*0.5f; - float x1234 = (x123+x234)*0.5f, y1234 = (y123+y234)*0.5f; - - PathBezierToCasteljau(path, x1,y1, x12,y12, x123,y123, x1234,y1234, tess_tol, level+1); - PathBezierToCasteljau(path, x1234,y1234, x234,y234, x34,y34, x4,y4, tess_tol, level+1); + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x34 = (x3 + x4) * 0.5f, y34 = (y3 + y4) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + float x234 = (x23 + x34) * 0.5f, y234 = (y23 + y34) * 0.5f; + float x1234 = (x123 + x234) * 0.5f, y1234 = (y123 + y234) * 0.5f; + PathBezierCubicCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + PathBezierCubicCurveToCasteljau(path, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); } } -void ImDrawList::PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) +static void PathBezierQuadraticCurveToCasteljau(ImVector<ImVec2>* path, float x1, float y1, float x2, float y2, float x3, float y3, float tess_tol, int level) +{ + float dx = x3 - x1, dy = y3 - y1; + float det = (x2 - x3) * dy - (y2 - y3) * dx; + if (det * det * 4.0f < tess_tol * (dx * dx + dy * dy)) + { + path->push_back(ImVec2(x3, y3)); + } + else if (level < 10) + { + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + PathBezierQuadraticCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, tess_tol, level + 1); + PathBezierQuadraticCurveToCasteljau(path, x123, y123, x23, y23, x3, y3, tess_tol, level + 1); + } +} + +void ImDrawList::PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) { ImVec2 p1 = _Path.back(); if (num_segments == 0) { - // Auto-tessellated - PathBezierToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); + PathBezierCubicCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); // Auto-tessellated } else { float t_step = 1.0f / (float)num_segments; for (int i_step = 1; i_step <= num_segments; i_step++) - { - float t = t_step * i_step; - float u = 1.0f - t; - float w1 = u*u*u; - float w2 = 3*u*u*t; - float w3 = 3*u*t*t; - float w4 = t*t*t; - _Path.push_back(ImVec2(w1*p1.x + w2*p2.x + w3*p3.x + w4*p4.x, w1*p1.y + w2*p2.y + w3*p3.y + w4*p4.y)); - } + _Path.push_back(ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step)); } } -void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int rounding_corners) +void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments) { - rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((rounding_corners & ImDrawCornerFlags_Top) == ImDrawCornerFlags_Top) || ((rounding_corners & ImDrawCornerFlags_Bot) == ImDrawCornerFlags_Bot) ? 0.5f : 1.0f ) - 1.0f); - rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((rounding_corners & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((rounding_corners & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f ) - 1.0f); + ImVec2 p1 = _Path.back(); + if (num_segments == 0) + { + PathBezierQuadraticCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, _Data->CurveTessellationTol, 0);// Auto-tessellated + } + else + { + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + _Path.push_back(ImBezierQuadraticCalc(p1, p2, p3, t_step * i_step)); + } +} - if (rounding <= 0.0f || rounding_corners == 0) +IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); +static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) +{ +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) + // ~0 --> ImDrawFlags_RoundCornersAll or 0 + if (flags == ~0) + return ImDrawFlags_RoundCornersAll; + + // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) + // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) + // 0x02 --> ImDrawFlags_RoundCornersTopRight + // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight + // 0x04 --> ImDrawFlags_RoundCornersBotLeft + // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft + // ... + // 0x0F --> ImDrawFlags_RoundCornersAll or 0 + // (See all values in ImDrawCornerFlags_) + if (flags >= 0x01 && flags <= 0x0F) + return (flags << 4); + + // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' +#endif + + // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. + // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... + IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); + + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags |= ImDrawFlags_RoundCornersAll; + + return flags; +} + +void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) +{ + flags = FixRectCornerFlags(flags); + rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); + rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); + + if (rounding <= 0.0f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) { PathLineTo(a); PathLineTo(ImVec2(b.x, a.y)); @@ -1033,10 +1328,10 @@ void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int } else { - const float rounding_tl = (rounding_corners & ImDrawCornerFlags_TopLeft) ? rounding : 0.0f; - const float rounding_tr = (rounding_corners & ImDrawCornerFlags_TopRight) ? rounding : 0.0f; - const float rounding_br = (rounding_corners & ImDrawCornerFlags_BotRight) ? rounding : 0.0f; - const float rounding_bl = (rounding_corners & ImDrawCornerFlags_BotLeft) ? rounding : 0.0f; + const float rounding_tl = (flags & ImDrawFlags_RoundCornersTopLeft) ? rounding : 0.0f; + const float rounding_tr = (flags & ImDrawFlags_RoundCornersTopRight) ? rounding : 0.0f; + const float rounding_br = (flags & ImDrawFlags_RoundCornersBottomRight) ? rounding : 0.0f; + const float rounding_bl = (flags & ImDrawFlags_RoundCornersBottomLeft) ? rounding : 0.0f; PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9); PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12); PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3); @@ -1044,134 +1339,202 @@ void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int } } -void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness) +void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(a + ImVec2(0.5f,0.5f)); - PathLineTo(b + ImVec2(0.5f,0.5f)); - PathStroke(col, false, thickness); + PathLineTo(p1 + ImVec2(0.5f, 0.5f)); + PathLineTo(p2 + ImVec2(0.5f, 0.5f)); + PathStroke(col, 0, thickness); } -// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly. -void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags, float thickness) +// p_min = upper-left, p_max = lower-right +// Note we don't render 1 pixels sized rectangles properly. +void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags, float thickness) { if ((col & IM_COL32_A_MASK) == 0) return; if (Flags & ImDrawListFlags_AntiAliasedLines) - PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.50f,0.50f), rounding, rounding_corners_flags); + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.50f, 0.50f), rounding, flags); else - PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.49f,0.49f), rounding, rounding_corners_flags); // Better looking lower-right corner and rounded non-AA shapes. - PathStroke(col, true, thickness); + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.49f, 0.49f), rounding, flags); // Better looking lower-right corner and rounded non-AA shapes. + PathStroke(col, ImDrawFlags_Closed, thickness); } -void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags) +void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags) { if ((col & IM_COL32_A_MASK) == 0) return; - if (rounding > 0.0f) + if (rounding <= 0.0f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) { - PathRect(a, b, rounding, rounding_corners_flags); - PathFillConvex(col); + PrimReserve(6, 4); + PrimRect(p_min, p_max, col); } else { - PrimReserve(6, 4); - PrimRect(a, b, col); + PathRect(p_min, p_max, rounding, flags); + PathFillConvex(col); } } -void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) +// p_min = upper-left, p_max = lower-right +void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) { if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0) return; const ImVec2 uv = _Data->TexUvWhitePixel; PrimReserve(6, 4); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+3)); - PrimWriteVtx(a, uv, col_upr_left); - PrimWriteVtx(ImVec2(c.x, a.y), uv, col_upr_right); - PrimWriteVtx(c, uv, col_bot_right); - PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 3)); + PrimWriteVtx(p_min, uv, col_upr_left); + PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right); + PrimWriteVtx(p_max, uv, col_bot_right); + PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left); } -void ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness) +void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathLineTo(d); - PathStroke(col, true, thickness); + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); + PathStroke(col, ImDrawFlags_Closed, thickness); } -void ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col) +void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathLineTo(d); + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); PathFillConvex(col); } -void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness) +void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); - PathStroke(col, true, thickness); + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathStroke(col, ImDrawFlags_Closed, thickness); } -void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col) +void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(a); - PathLineTo(b); - PathLineTo(c); + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); PathFillConvex(col); } -void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness) +void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius <= 0.0f) + return; + + // Obtain segment count + if (num_segments <= 0) + { + // Automatic segment count + num_segments = _CalcCircleAutoSegmentCount(radius); + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + } + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + if (num_segments == 12) + PathArcToFast(center, radius - 0.5f, 0, 12 - 1); + else + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius <= 0.0f) + return; + + // Obtain segment count + if (num_segments <= 0) + { + // Automatic segment count + num_segments = _CalcCircleAutoSegmentCount(radius); + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + } + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + if (num_segments == 12) + PathArcToFast(center, radius, 0, 12 - 1); + else + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); + PathFillConvex(col); +} + +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) { if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) return; // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments - 1); - PathStroke(col, true, thickness); + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + PathStroke(col, ImDrawFlags_Closed, thickness); } -void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments) +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) { if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) return; // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(centre, radius, 0.0f, a_max, num_segments - 1); + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); PathFillConvex(col); } -void ImDrawList::AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments) +// Cubic Bezier takes 4 controls points +void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) { if ((col & IM_COL32_A_MASK) == 0) return; - PathLineTo(pos0); - PathBezierCurveTo(cp0, cp1, pos1, num_segments); - PathStroke(col, false, thickness); + PathLineTo(p1); + PathBezierCubicCurveTo(p2, p3, p4, num_segments); + PathStroke(col, 0, thickness); +} + +// Quadratic Bezier takes 3 controls points +void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathBezierQuadraticCurveTo(p2, p3, num_segments); + PathStroke(col, 0, thickness); } void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect) @@ -1190,9 +1553,9 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, if (font_size == 0.0f) font_size = _Data->FontSize; - IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. + IM_ASSERT(font->ContainerAtlas->TexID == _CmdHeader.TextureId); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. - ImVec4 clip_rect = _ClipRectStack.back(); + ImVec4 clip_rect = _CmdHeader.ClipRect; if (cpu_fine_clip_rect) { clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x); @@ -1208,63 +1571,210 @@ void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, c AddText(NULL, 0.0f, pos, col, text_begin, text_end); } -void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col) +void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col) { if ((col & IM_COL32_A_MASK) == 0) return; - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; if (push_texture_id) PushTextureID(user_texture_id); PrimReserve(6, 4); - PrimRectUV(a, b, uv_a, uv_b, col); + PrimRectUV(p_min, p_max, uv_min, uv_max, col); if (push_texture_id) PopTextureID(); } -void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) +void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col) { if ((col & IM_COL32_A_MASK) == 0) return; - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; if (push_texture_id) PushTextureID(user_texture_id); PrimReserve(6, 4); - PrimQuadUV(a, b, c, d, uv_a, uv_b, uv_c, uv_d, col); + PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col); if (push_texture_id) PopTextureID(); } -void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners) +void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags) { if ((col & IM_COL32_A_MASK) == 0) return; - if (rounding <= 0.0f || (rounding_corners & ImDrawCornerFlags_All) == 0) + flags = FixRectCornerFlags(flags); + if (rounding <= 0.0f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) { - AddImage(user_texture_id, a, b, uv_a, uv_b, col); + AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col); return; } - const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; if (push_texture_id) PushTextureID(user_texture_id); int vert_start_idx = VtxBuffer.Size; - PathRect(a, b, rounding, rounding_corners); + PathRect(p_min, p_max, rounding, flags); PathFillConvex(col); int vert_end_idx = VtxBuffer.Size; - ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, a, b, uv_a, uv_b, true); + ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true); if (push_texture_id) PopTextureID(); } + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawListSplitter +//----------------------------------------------------------------------------- +// FIXME: This may be a little confusing, trying to be a little too low-level/optimal instead of just doing vector swap.. +//----------------------------------------------------------------------------- + +void ImDrawListSplitter::ClearFreeMemory() +{ + for (int i = 0; i < _Channels.Size; i++) + { + if (i == _Current) + memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again + _Channels[i]._CmdBuffer.clear(); + _Channels[i]._IdxBuffer.clear(); + } + _Current = 0; + _Count = 1; + _Channels.clear(); +} + +void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count) +{ + IM_UNUSED(draw_list); + IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter."); + int old_channels_count = _Channels.Size; + if (old_channels_count < channels_count) + { + _Channels.reserve(channels_count); // Avoid over reserving since this is likely to stay stable + _Channels.resize(channels_count); + } + _Count = channels_count; + + // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer + // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. + // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer + memset(&_Channels[0], 0, sizeof(ImDrawChannel)); + for (int i = 1; i < channels_count; i++) + { + if (i >= old_channels_count) + { + IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); + } + else + { + _Channels[i]._CmdBuffer.resize(0); + _Channels[i]._IdxBuffer.resize(0); + } + } +} + +void ImDrawListSplitter::Merge(ImDrawList* draw_list) +{ + // Note that we never use or rely on _Channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. + if (_Count <= 1) + return; + + SetCurrentChannel(draw_list, 0); + draw_list->_PopUnusedDrawCmd(); + + // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command. + int new_cmd_buffer_count = 0; + int new_idx_buffer_count = 0; + ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL; + int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + + // Equivalent of PopUnusedDrawCmd() for this channel's cmdbuffer and except we don't need to test for UserCallback. + if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0) + ch._CmdBuffer.pop_back(); + + if (ch._CmdBuffer.Size > 0 && last_cmd != NULL) + { + ImDrawCmd* next_cmd = &ch._CmdBuffer[0]; + if (ImDrawCmd_HeaderCompare(last_cmd, next_cmd) == 0 && last_cmd->UserCallback == NULL && next_cmd->UserCallback == NULL) + { + // Merge previous channel last draw command with current channel first draw command if matching. + last_cmd->ElemCount += next_cmd->ElemCount; + idx_offset += next_cmd->ElemCount; + ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges. + } + } + if (ch._CmdBuffer.Size > 0) + last_cmd = &ch._CmdBuffer.back(); + new_cmd_buffer_count += ch._CmdBuffer.Size; + new_idx_buffer_count += ch._IdxBuffer.Size; + for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++) + { + ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset; + idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount; + } + } + draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count); + draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count); + + // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices) + ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count; + ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } + if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; } + } + draw_list->_IdxWritePtr = idx_write; + + // Ensure there's always a non-callback draw command trailing the command-buffer + if (draw_list->CmdBuffer.Size == 0 || draw_list->CmdBuffer.back().UserCallback != NULL) + draw_list->AddDrawCmd(); + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); + + _Count = 1; +} + +void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) +{ + IM_ASSERT(idx >= 0 && idx < _Count); + if (_Current == idx) + return; + + // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap() + memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer)); + _Current = idx; + memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer)); + draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size; + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = (draw_list->CmdBuffer.Size == 0) ? NULL : &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd == NULL) + draw_list->AddDrawCmd(); + else if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); +} + //----------------------------------------------------------------------------- // [SECTION] ImDrawData //----------------------------------------------------------------------------- @@ -1315,13 +1825,19 @@ void ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int ve float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent); ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + const int col0_r = (int)(col0 >> IM_COL32_R_SHIFT) & 0xFF; + const int col0_g = (int)(col0 >> IM_COL32_G_SHIFT) & 0xFF; + const int col0_b = (int)(col0 >> IM_COL32_B_SHIFT) & 0xFF; + const int col_delta_r = ((int)(col1 >> IM_COL32_R_SHIFT) & 0xFF) - col0_r; + const int col_delta_g = ((int)(col1 >> IM_COL32_G_SHIFT) & 0xFF) - col0_g; + const int col_delta_b = ((int)(col1 >> IM_COL32_B_SHIFT) & 0xFF) - col0_b; for (ImDrawVert* vert = vert_start; vert < vert_end; vert++) { float d = ImDot(vert->pos - gradient_p0, gradient_extent); float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); - int r = ImLerp((int)(col0 >> IM_COL32_R_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_R_SHIFT) & 0xFF, t); - int g = ImLerp((int)(col0 >> IM_COL32_G_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_G_SHIFT) & 0xFF, t); - int b = ImLerp((int)(col0 >> IM_COL32_B_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_B_SHIFT) & 0xFF, t); + int r = (int)(col0_r + col_delta_r * t); + int g = (int)(col0_g + col_delta_g * t); + int b = (int)(col0_b + col_delta_b * t); vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK); } } @@ -1357,24 +1873,13 @@ void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int ve ImFontConfig::ImFontConfig() { - FontData = NULL; - FontDataSize = 0; + memset(this, 0, sizeof(*this)); FontDataOwnedByAtlas = true; - FontNo = 0; - SizePixels = 0.0f; OversampleH = 3; // FIXME: 2 may be a better default? OversampleV = 1; - PixelSnapH = false; - GlyphExtraSpacing = ImVec2(0.0f, 0.0f); - GlyphOffset = ImVec2(0.0f, 0.0f); - GlyphRanges = NULL; - GlyphMinAdvanceX = 0.0f; GlyphMaxAdvanceX = FLT_MAX; - MergeMode = false; - RasterizerFlags = 0x00; RasterizerMultiply = 1.0f; - memset(Name, 0, sizeof(Name)); - DstFont = NULL; + EllipsisChar = (ImWchar)-1; } //----------------------------------------------------------------------------- @@ -1382,11 +1887,10 @@ ImFontConfig::ImFontConfig() //----------------------------------------------------------------------------- // A work of art lies ahead! (. = white layer, X = black layer, others are blank) -// The white texels on the top left are the ones we'll use everywhere in ImGui to render filled shapes. -const int FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF = 108; -const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; -const unsigned int FONT_ATLAS_DEFAULT_TEX_DATA_ID = 0x80000000; -static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = +// The 2x2 white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes. +const int FONT_ATLAS_DEFAULT_TEX_DATA_W = 108; // Actual texture will be 2 times that + 1 spacing. +const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; +static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = { "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX " "..- -X.....X- X.X - X.X -X.....X - X.....X- X..X " @@ -1432,19 +1936,9 @@ static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_COUNT][3 ImFontAtlas::ImFontAtlas() { - Locked = false; - Flags = ImFontAtlasFlags_None; - TexID = (ImTextureID)NULL; - TexDesiredWidth = 0; + memset(this, 0, sizeof(*this)); TexGlyphPadding = 1; - - TexPixelsAlpha8 = NULL; - TexPixelsRGBA32 = NULL; - TexWidth = TexHeight = 0; - TexUvScale = ImVec2(0.0f, 0.0f); - TexUvWhitePixel = ImVec2(0.0f, 0.0f); - for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++) - CustomRectIds[n] = -1; + PackIdMouseCursors = PackIdLines = -1; } ImFontAtlas::~ImFontAtlas() @@ -1472,8 +1966,7 @@ void ImFontAtlas::ClearInputData() } ConfigData.clear(); CustomRects.clear(); - for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++) - CustomRectIds[n] = -1; + PackIdMouseCursors = PackIdLines = -1; } void ImFontAtlas::ClearTexData() @@ -1485,6 +1978,7 @@ void ImFontAtlas::ClearTexData() IM_FREE(TexPixelsRGBA32); TexPixelsAlpha8 = NULL; TexPixelsRGBA32 = NULL; + TexPixelsUseColors = false; } void ImFontAtlas::ClearFonts() @@ -1565,21 +2059,24 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize); } + if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) + new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; + // Invalidate texture ClearTexData(); return new_font_cfg.DstFont; } // Default font TTF is compressed with stb_compress then base85 encoded (see misc/fonts/binary_to_compressed_c.cpp for encoder) -static unsigned int stb_decompress_length(const unsigned char *input); -static unsigned int stb_decompress(unsigned char *output, const unsigned char *input, unsigned int length); +static unsigned int stb_decompress_length(const unsigned char* input); +static unsigned int stb_decompress(unsigned char* output, const unsigned char* input, unsigned int length); static const char* GetDefaultCompressedFontDataTTFBase85(); static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; } static void Decode85(const unsigned char* src, unsigned char* dst) { while (*src) { - unsigned int tmp = Decode85Byte(src[0]) + 85*(Decode85Byte(src[1]) + 85*(Decode85Byte(src[2]) + 85*(Decode85Byte(src[3]) + 85*Decode85Byte(src[4])))); + unsigned int tmp = Decode85Byte(src[0]) + 85 * (Decode85Byte(src[1]) + 85 * (Decode85Byte(src[2]) + 85 * (Decode85Byte(src[3]) + 85 * Decode85Byte(src[4])))); dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF); // We can't assume little-endianness. src += 5; dst += 4; @@ -1599,11 +2096,12 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) font_cfg.SizePixels = 13.0f * 1.0f; if (font_cfg.Name[0] == '\0') ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); + font_cfg.EllipsisChar = (ImWchar)0x0085; + font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, glyph_ranges); - font->DisplayOffset.y = 1.0f; return font; } @@ -1614,7 +2112,7 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0); if (!data) { - IM_ASSERT(0); // Could not load file. + IM_ASSERT_USER_ERROR(0, "Could not load font file!"); return NULL; } ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); @@ -1645,7 +2143,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float si ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) { const unsigned int buf_decompressed_size = stb_decompress_length((const unsigned char*)compressed_ttf_data); - unsigned char* buf_decompressed_data = (unsigned char *)IM_ALLOC(buf_decompressed_size); + unsigned char* buf_decompressed_data = (unsigned char*)IM_ALLOC(buf_decompressed_size); stb_decompress(buf_decompressed_data, (const unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size); ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); @@ -1664,13 +2162,11 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed return font; } -int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height) +int ImFontAtlas::AddCustomRectRegular(int width, int height) { - IM_ASSERT(id >= 0x10000); IM_ASSERT(width > 0 && width <= 0xFFFF); IM_ASSERT(height > 0 && height <= 0xFFFF); - CustomRect r; - r.ID = id; + ImFontAtlasCustomRect r; r.Width = (unsigned short)width; r.Height = (unsigned short)height; CustomRects.push_back(r); @@ -1679,13 +2175,16 @@ int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height) int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset) { +#ifdef IMGUI_USE_WCHAR32 + IM_ASSERT(id <= IM_UNICODE_CODEPOINT_MAX); +#endif IM_ASSERT(font != NULL); IM_ASSERT(width > 0 && width <= 0xFFFF); IM_ASSERT(height > 0 && height <= 0xFFFF); - CustomRect r; - r.ID = id; + ImFontAtlasCustomRect r; r.Width = (unsigned short)width; r.Height = (unsigned short)height; + r.GlyphID = id; r.GlyphAdvanceX = advance_x; r.GlyphOffset = offset; r.Font = font; @@ -1693,7 +2192,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int return CustomRects.Size - 1; // Return index } -void ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) +void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const { IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed @@ -1708,16 +2207,15 @@ bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* ou if (Flags & ImFontAtlasFlags_NoMouseCursors) return false; - IM_ASSERT(CustomRectIds[0] != -1); - ImFontAtlas::CustomRect& r = CustomRects[CustomRectIds[0]]; - IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID); - ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r.X, (float)r.Y); + IM_ASSERT(PackIdMouseCursors != -1); + ImFontAtlasCustomRect* r = GetCustomRectByIndex(PackIdMouseCursors); + ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r->X, (float)r->Y); ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1]; *out_size = size; *out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][2]; out_uv_border[0] = (pos) * TexUvScale; out_uv_border[1] = (pos + size) * TexUvScale; - pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1; + pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; out_uv_fill[0] = (pos) * TexUvScale; out_uv_fill[1] = (pos + size) * TexUvScale; return true; @@ -1726,7 +2224,26 @@ bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* ou bool ImFontAtlas::Build() { IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - return ImFontAtlasBuildWithStbTruetype(this); + + // Select builder + // - Note that we do not reassign to atlas->FontBuilderIO, since it is likely to point to static data which + // may mess with some hot-reloading schemes. If you need to assign to this (for dynamic selection) AND are + // using a hot-reloading scheme that messes up static data, store your own instance of ImFontBuilderIO somewhere + // and point to it instead of pointing directly to return value of the GetBuilderXXX functions. + const ImFontBuilderIO* builder_io = FontBuilderIO; + if (builder_io == NULL) + { +#ifdef IMGUI_ENABLE_FREETYPE + builder_io = ImGuiFreeType::GetBuilderForFreeType(); +#elif defined(IMGUI_ENABLE_STB_TRUETYPE) + builder_io = ImFontAtlasGetBuilderForStbTruetype(); +#else + IM_ASSERT(0); // Invalid Build function +#endif + } + + // Build + return builder_io->FontBuilder_Build(this); } void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor) @@ -1746,6 +2263,7 @@ void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsig data[i] = table[data[i]]; } +#ifdef IMGUI_ENABLE_STB_TRUETYPE // Temporary data for one source font (multiple source fonts can be merged into one destination ImFont) // (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.) struct ImFontBuildSrcData @@ -1758,7 +2276,7 @@ struct ImFontBuildSrcData int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[] int GlyphsHighest; // Highest requested codepoint int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font) - ImBoolVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) + ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) ImVector<int> GlyphsList; // Glyph codepoints list (flattened version of GlyphsMap) }; @@ -1768,26 +2286,26 @@ struct ImFontBuildDstData int SrcCount; // Number of source fonts targeting this destination font. int GlyphsHighest; int GlyphsCount; - ImBoolVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. + ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. }; -static void UnpackBoolVectorToFlatIndexList(const ImBoolVector* in, ImVector<int>* out) +static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector<int>* out) { IM_ASSERT(sizeof(in->Storage.Data[0]) == sizeof(int)); - const int* it_begin = in->Storage.begin(); - const int* it_end = in->Storage.end(); - for (const int* it = it_begin; it < it_end; it++) - if (int entries_32 = *it) - for (int bit_n = 0; bit_n < 32; bit_n++) - if (entries_32 & (1 << bit_n)) - out->push_back((int)((it - it_begin) << 5) + bit_n); + const ImU32* it_begin = in->Storage.begin(); + const ImU32* it_end = in->Storage.end(); + for (const ImU32* it = it_begin; it < it_end; it++) + if (ImU32 entries_32 = *it) + for (ImU32 bit_n = 0; bit_n < 32; bit_n++) + if (entries_32 & ((ImU32)1 << bit_n)) + out->push_back((int)(((it - it_begin) << 5) + bit_n)); } -bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) +static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) { IM_ASSERT(atlas->ConfigData.Size > 0); - ImFontAtlasBuildRegisterDefaultCustomRects(atlas); + ImFontAtlasBuildInit(atlas); // Clear atlas atlas->TexID = (ImTextureID)NULL; @@ -1816,10 +2334,11 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) if (cfg.DstFont == atlas->Fonts[output_i]) src_tmp.DstIndex = output_i; - IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? if (src_tmp.DstIndex == -1) + { + IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? return false; - + } // Initialize helper structure for font loading and verify that the TTF/OTF data is correct const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); @@ -1841,14 +2360,14 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) { ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; - src_tmp.GlyphsSet.Resize(src_tmp.GlyphsHighest + 1); + src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); if (dst_tmp.GlyphsSet.Storage.empty()) - dst_tmp.GlyphsSet.Resize(dst_tmp.GlyphsHighest + 1); + dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1); for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) - for (int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) + for (unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) { - if (dst_tmp.GlyphsSet.GetBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true) + if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true) continue; if (!stbtt_FindGlyphIndex(&src_tmp.FontInfo, codepoint)) // It is actually in the font? continue; @@ -1856,8 +2375,8 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) // Add to avail set/counters src_tmp.GlyphsCount++; dst_tmp.GlyphsCount++; - src_tmp.GlyphsSet.SetBit(codepoint, true); - dst_tmp.GlyphsSet.SetBit(codepoint, true); + src_tmp.GlyphsSet.SetBit(codepoint); + dst_tmp.GlyphsSet.SetBit(codepoint); total_glyphs_count++; } } @@ -1867,7 +2386,7 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) { ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); - UnpackBoolVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); + UnpackBitVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); src_tmp.GlyphsSet.Clear(); IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount); } @@ -1932,7 +2451,7 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) if (atlas->TexDesiredWidth > 0) atlas->TexWidth = atlas->TexDesiredWidth; else - atlas->TexWidth = (surface_sqrt >= 4096*0.7f) ? 4096 : (surface_sqrt >= 2048*0.7f) ? 2048 : (surface_sqrt >= 1024*0.7f) ? 1024 : 512; + atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; // 5. Start packing // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). @@ -1999,8 +2518,11 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) if (src_tmp.GlyphsCount == 0) continue; + // When merging fonts with MergeMode=true: + // - We can have multiple input fonts writing into a same destination font. + // - dst_font->ConfigData is != from cfg which is our source configuration. ImFontConfig& cfg = atlas->ConfigData[src_i]; - ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true) + ImFont* dst_font = cfg.DstFont; const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels); int unscaled_ascent, unscaled_descent, unscaled_line_gap; @@ -2010,24 +2532,17 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); const float font_off_x = cfg.GlyphOffset.x; - const float font_off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f); + const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) { + // Register glyph const int codepoint = src_tmp.GlyphsList[glyph_i]; const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i]; - - const float char_advance_x_org = pc.xadvance; - const float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX); - float char_off_x = font_off_x; - if (char_advance_x_org != char_advance_x_mod) - char_off_x += cfg.PixelSnapH ? (float)(int)((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f; - - // Register glyph stbtt_aligned_quad q; - float dummy_x = 0.0f, dummy_y = 0.0f; - stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &dummy_x, &dummy_y, &q, 0); - dst_font->AddGlyph((ImWchar)codepoint, q.x0 + char_off_x, q.y0 + font_off_y, q.x1 + char_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, char_advance_x_mod); + float unused_x = 0.0f, unused_y = 0.0f; + stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); + dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); } } @@ -2039,16 +2554,15 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) return true; } -void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas) +const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() { - if (atlas->CustomRectIds[0] >= 0) - return; - if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) - atlas->CustomRectIds[0] = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H); - else - atlas->CustomRectIds[0] = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_ID, 2, 2); + static ImFontBuilderIO io; + io.FontBuilder_Build = ImFontAtlasBuildWithStbTruetype; + return &io; } +#endif // IMGUI_ENABLE_STB_TRUETYPE + void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) { if (!font_config->MergeMode) @@ -2056,6 +2570,7 @@ void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* f font->ClearOutputData(); font->FontSize = font_config->SizePixels; font->ConfigData = font_config; + font->ConfigDataCount = 0; font->ContainerAtlas = atlas; font->Ascent = ascent; font->Descent = descent; @@ -2068,7 +2583,7 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque; IM_ASSERT(pack_context != NULL); - ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects; + ImVector<ImFontAtlasCustomRect>& user_rects = atlas->CustomRects; IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. ImVector<stbrp_rect> pack_rects; @@ -2090,59 +2605,181 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa } } +void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned char* out_pixel = atlas->TexPixelsAlpha8 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : 0x00; +} + +void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned int* out_pixel = atlas->TexPixelsRGBA32 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : IM_COL32_BLACK_TRANS; +} + static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) { - IM_ASSERT(atlas->CustomRectIds[0] >= 0); - IM_ASSERT(atlas->TexPixelsAlpha8 != NULL); - ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]]; - IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID); - IM_ASSERT(r.IsPacked()); + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdMouseCursors); + IM_ASSERT(r->IsPacked()); const int w = atlas->TexWidth; if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) { // Render/copy pixels - IM_ASSERT(r.Width == FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF * 2 + 1 && r.Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); - for (int y = 0, n = 0; y < FONT_ATLAS_DEFAULT_TEX_DATA_H; y++) - for (int x = 0; x < FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF; x++, n++) - { - const int offset0 = (int)(r.X + x) + (int)(r.Y + y) * w; - const int offset1 = offset0 + FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1; - atlas->TexPixelsAlpha8[offset0] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == '.' ? 0xFF : 0x00; - atlas->TexPixelsAlpha8[offset1] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == 'X' ? 0xFF : 0x00; - } + IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); + const int x_for_white = r->X; + const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; + if (atlas->TexPixelsAlpha8 != NULL) + { + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF); + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF); + } + else + { + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE); + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE); + } } else { - IM_ASSERT(r.Width == 2 && r.Height == 2); - const int offset = (int)(r.X) + (int)(r.Y) * w; - atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF; + // Render 4 white pixels + IM_ASSERT(r->Width == 2 && r->Height == 2); + const int offset = (int)r->X + (int)r->Y * w; + if (atlas->TexPixelsAlpha8 != NULL) + { + atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF; + } + else + { + atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE; + } } - atlas->TexUvWhitePixel = ImVec2((r.X + 0.5f) * atlas->TexUvScale.x, (r.Y + 0.5f) * atlas->TexUvScale.y); + atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); } +static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) +{ + if (atlas->Flags & ImFontAtlasFlags_NoBakedLines) + return; + + // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines); + IM_ASSERT(r->IsPacked()); + for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row + { + // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle + unsigned int y = n; + unsigned int line_width = n; + unsigned int pad_left = (r->Width - line_width) / 2; + unsigned int pad_right = r->Width - (pad_left + line_width); + + // Write each slice + IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels + if (atlas->TexPixelsAlpha8 != NULL) + { + unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = 0x00; + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = 0xFF; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = 0x00; + } + else + { + unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = IM_COL32_BLACK_TRANS; + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = IM_COL32_WHITE; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = IM_COL32_BLACK_TRANS; + } + + // Calculate UVs for this line + ImVec2 uv0 = ImVec2((float)(r->X + pad_left - 1), (float)(r->Y + y)) * atlas->TexUvScale; + ImVec2 uv1 = ImVec2((float)(r->X + pad_left + line_width + 1), (float)(r->Y + y + 1)) * atlas->TexUvScale; + float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts + atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); + } +} + +// Note: this is called / shared by both the stb_truetype and the FreeType builder +void ImFontAtlasBuildInit(ImFontAtlas* atlas) +{ + // Register texture region for mouse cursors or standard white pixels + if (atlas->PackIdMouseCursors < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H); + else + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); + } + + // Register texture region for thick lines + // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row + if (atlas->PackIdLines < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoBakedLines)) + atlas->PackIdLines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1); + } +} + +// This is called/shared by both the stb_truetype and the FreeType builder. void ImFontAtlasBuildFinish(ImFontAtlas* atlas) { - // Render into our custom data block + // Render into our custom data blocks + IM_ASSERT(atlas->TexPixelsAlpha8 != NULL || atlas->TexPixelsRGBA32 != NULL); ImFontAtlasBuildRenderDefaultTexData(atlas); + ImFontAtlasBuildRenderLinesTexData(atlas); // Register custom rectangle glyphs for (int i = 0; i < atlas->CustomRects.Size; i++) { - const ImFontAtlas::CustomRect& r = atlas->CustomRects[i]; - if (r.Font == NULL || r.ID > 0x10000) + const ImFontAtlasCustomRect* r = &atlas->CustomRects[i]; + if (r->Font == NULL || r->GlyphID == 0) continue; - IM_ASSERT(r.Font->ContainerAtlas == atlas); + // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH + IM_ASSERT(r->Font->ContainerAtlas == atlas); ImVec2 uv0, uv1; - atlas->CalcCustomRectUV(&r, &uv0, &uv1); - r.Font->AddGlyph((ImWchar)r.ID, r.GlyphOffset.x, r.GlyphOffset.y, r.GlyphOffset.x + r.Width, r.GlyphOffset.y + r.Height, uv0.x, uv0.y, uv1.x, uv1.y, r.GlyphAdvanceX); + atlas->CalcCustomRectUV(r, &uv0, &uv1); + r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX); } // Build all fonts lookup tables for (int i = 0; i < atlas->Fonts.Size; i++) if (atlas->Fonts[i]->DirtyLookupTables) atlas->Fonts[i]->BuildLookupTable(); + + // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis). + // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character. + // FIXME: Also note that 0x2026 is currently seldom included in our font ranges. Because of this we are more likely to use three individual dots. + for (int i = 0; i < atlas->Fonts.size(); i++) + { + ImFont* font = atlas->Fonts[i]; + if (font->EllipsisChar != (ImWchar)-1) + continue; + const ImWchar ellipsis_variants[] = { (ImWchar)0x2026, (ImWchar)0x0085 }; + for (int j = 0; j < IM_ARRAYSIZE(ellipsis_variants); j++) + if (font->FindGlyphNoFallback(ellipsis_variants[j]) != NULL) // Verify glyph exists + { + font->EllipsisChar = ellipsis_variants[j]; + break; + } + } } // Retrieve list of range (2 int per range, values are inclusive) @@ -2162,7 +2799,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesKorean() { 0x0020, 0x00FF, // Basic Latin + Latin Supplement 0x3131, 0x3163, // Korean alphabets - 0xAC00, 0xD79D, // Korean characters + 0xAC00, 0xD7A3, // Korean characters 0, }; return &ranges[0]; @@ -2266,45 +2903,76 @@ const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon() const ImWchar* ImFontAtlas::GetGlyphRangesJapanese() { - // 1946 common ideograms code points for Japanese - // Sourced from http://theinstructionlimit.com/common-kanji-character-ranges-for-xna-spritefont-rendering - // FIXME: Source a list of the revised 2136 Joyo Kanji list from 2010 and rebuild this. + // 2999 ideograms code points for Japanese + // - 2136 Joyo (meaning "for regular use" or "for common use") Kanji code points + // - 863 Jinmeiyo (meaning "for personal name") Kanji code points + // - Sourced from the character information database of the Information-technology Promotion Agency, Japan + // - https://mojikiban.ipa.go.jp/mji/ + // - Available under the terms of the Creative Commons Attribution-ShareAlike 2.1 Japan (CC BY-SA 2.1 JP). + // - https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en + // - https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode + // - You can generate this code by the script at: + // - https://github.com/vaiorabbit/everyday_use_kanji + // - References: + // - List of Joyo Kanji + // - (Official list by the Agency for Cultural Affairs) https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/14/tosin02/index.html + // - (Wikipedia) https://en.wikipedia.org/wiki/List_of_j%C5%8Dy%C5%8D_kanji + // - List of Jinmeiyo Kanji + // - (Official list by the Ministry of Justice) http://www.moj.go.jp/MINJI/minji86.html + // - (Wikipedia) https://en.wikipedia.org/wiki/Jinmeiy%C5%8D_kanji + // - Missing 1 Joyo Kanji: U+20B9F (Kun'yomi: Shikaru, On'yomi: Shitsu,shichi), see https://github.com/ocornut/imgui/pull/3627 for details. // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) static const short accumulative_offsets_from_0x4E00[] = { - 0,1,2,4,1,1,1,1,2,1,6,2,2,1,8,5,7,11,1,2,10,10,8,2,4,20,2,11,8,2,1,2,1,6,2,1,7,5,3,7,1,1,13,7,9,1,4,6,1,2,1,10,1,1,9,2,2,4,5,6,14,1,1,9,3,18, - 5,4,2,2,10,7,1,1,1,3,2,4,3,23,2,10,12,2,14,2,4,13,1,6,10,3,1,7,13,6,4,13,5,2,3,17,2,2,5,7,6,4,1,7,14,16,6,13,9,15,1,1,7,16,4,7,1,19,9,2,7,15, - 2,6,5,13,25,4,14,13,11,25,1,1,1,2,1,2,2,3,10,11,3,3,1,1,4,4,2,1,4,9,1,4,3,5,5,2,7,12,11,15,7,16,4,5,16,2,1,1,6,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1, - 2,1,12,3,3,9,5,8,1,11,1,2,3,18,20,4,1,3,6,1,7,3,5,5,7,2,2,12,3,1,4,2,3,2,3,11,8,7,4,17,1,9,25,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,6,16,1,2,1,1,3,12, - 20,2,5,20,8,7,6,2,1,1,1,1,6,2,1,2,10,1,1,6,1,3,1,2,1,4,1,12,4,1,3,1,1,1,1,1,10,4,7,5,13,1,15,1,1,30,11,9,1,15,38,14,1,32,17,20,1,9,31,2,21,9, - 4,49,22,2,1,13,1,11,45,35,43,55,12,19,83,1,3,2,3,13,2,1,7,3,18,3,13,8,1,8,18,5,3,7,25,24,9,24,40,3,17,24,2,1,6,2,3,16,15,6,7,3,12,1,9,7,3,3, - 3,15,21,5,16,4,5,12,11,11,3,6,3,2,31,3,2,1,1,23,6,6,1,4,2,6,5,2,1,1,3,3,22,2,6,2,3,17,3,2,4,5,1,9,5,1,1,6,15,12,3,17,2,14,2,8,1,23,16,4,2,23, - 8,15,23,20,12,25,19,47,11,21,65,46,4,3,1,5,6,1,2,5,26,2,1,1,3,11,1,1,1,2,1,2,3,1,1,10,2,3,1,1,1,3,6,3,2,2,6,6,9,2,2,2,6,2,5,10,2,4,1,2,1,2,2, - 3,1,1,3,1,2,9,23,9,2,1,1,1,1,5,3,2,1,10,9,6,1,10,2,31,25,3,7,5,40,1,15,6,17,7,27,180,1,3,2,2,1,1,1,6,3,10,7,1,3,6,17,8,6,2,2,1,3,5,5,8,16,14, - 15,1,1,4,1,2,1,1,1,3,2,7,5,6,2,5,10,1,4,2,9,1,1,11,6,1,44,1,3,7,9,5,1,3,1,1,10,7,1,10,4,2,7,21,15,7,2,5,1,8,3,4,1,3,1,6,1,4,2,1,4,10,8,1,4,5, - 1,5,10,2,7,1,10,1,1,3,4,11,10,29,4,7,3,5,2,3,33,5,2,19,3,1,4,2,6,31,11,1,3,3,3,1,8,10,9,12,11,12,8,3,14,8,6,11,1,4,41,3,1,2,7,13,1,5,6,2,6,12, - 12,22,5,9,4,8,9,9,34,6,24,1,1,20,9,9,3,4,1,7,2,2,2,6,2,28,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,8,8,3,2,1,5,1,2,2,3,1,11,11,7,3,6,10,8,6,16,16, - 22,7,12,6,21,5,4,6,6,3,6,1,3,2,1,2,8,29,1,10,1,6,13,6,6,19,31,1,13,4,4,22,17,26,33,10,4,15,12,25,6,67,10,2,3,1,6,10,2,6,2,9,1,9,4,4,1,2,16,2, - 5,9,2,3,8,1,8,3,9,4,8,6,4,8,11,3,2,1,1,3,26,1,7,5,1,11,1,5,3,5,2,13,6,39,5,1,5,2,11,6,10,5,1,15,5,3,6,19,21,22,2,4,1,6,1,8,1,4,8,2,4,2,2,9,2, - 1,1,1,4,3,6,3,12,7,1,14,2,4,10,2,13,1,17,7,3,2,1,3,2,13,7,14,12,3,1,29,2,8,9,15,14,9,14,1,3,1,6,5,9,11,3,38,43,20,7,7,8,5,15,12,19,15,81,8,7, - 1,5,73,13,37,28,8,8,1,15,18,20,165,28,1,6,11,8,4,14,7,15,1,3,3,6,4,1,7,14,1,1,11,30,1,5,1,4,14,1,4,2,7,52,2,6,29,3,1,9,1,21,3,5,1,26,3,11,14, - 11,1,17,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,7,7,5,17,3,3,3,1,23,10,4,4,6,3,1,16,17,22,3,10,21,16,16,6,4,10,2,1,1,2,8,8,6,5,3,3,3,39,25, - 15,1,1,16,6,7,25,15,6,6,12,1,22,13,1,4,9,5,12,2,9,1,12,28,8,3,5,10,22,60,1,2,40,4,61,63,4,1,13,12,1,4,31,12,1,14,89,5,16,6,29,14,2,5,49,18,18, - 5,29,33,47,1,17,1,19,12,2,9,7,39,12,3,7,12,39,3,1,46,4,12,3,8,9,5,31,15,18,3,2,2,66,19,13,17,5,3,46,124,13,57,34,2,5,4,5,8,1,1,1,4,3,1,17,5, - 3,5,3,1,8,5,6,3,27,3,26,7,12,7,2,17,3,7,18,78,16,4,36,1,2,1,6,2,1,39,17,7,4,13,4,4,4,1,10,4,2,4,6,3,10,1,19,1,26,2,4,33,2,73,47,7,3,8,2,4,15, - 18,1,29,2,41,14,1,21,16,41,7,39,25,13,44,2,2,10,1,13,7,1,7,3,5,20,4,8,2,49,1,10,6,1,6,7,10,7,11,16,3,12,20,4,10,3,1,2,11,2,28,9,2,4,7,2,15,1, - 27,1,28,17,4,5,10,7,3,24,10,11,6,26,3,2,7,2,2,49,16,10,16,15,4,5,27,61,30,14,38,22,2,7,5,1,3,12,23,24,17,17,3,3,2,4,1,6,2,7,5,1,1,5,1,1,9,4, - 1,3,6,1,8,2,8,4,14,3,5,11,4,1,3,32,1,19,4,1,13,11,5,2,1,8,6,8,1,6,5,13,3,23,11,5,3,16,3,9,10,1,24,3,198,52,4,2,2,5,14,5,4,22,5,20,4,11,6,41, - 1,5,2,2,11,5,2,28,35,8,22,3,18,3,10,7,5,3,4,1,5,3,8,9,3,6,2,16,22,4,5,5,3,3,18,23,2,6,23,5,27,8,1,33,2,12,43,16,5,2,3,6,1,20,4,2,9,7,1,11,2, - 10,3,14,31,9,3,25,18,20,2,5,5,26,14,1,11,17,12,40,19,9,6,31,83,2,7,9,19,78,12,14,21,76,12,113,79,34,4,1,1,61,18,85,10,2,2,13,31,11,50,6,33,159, - 179,6,6,7,4,4,2,4,2,5,8,7,20,32,22,1,3,10,6,7,28,5,10,9,2,77,19,13,2,5,1,4,4,7,4,13,3,9,31,17,3,26,2,6,6,5,4,1,7,11,3,4,2,1,6,2,20,4,1,9,2,6, - 3,7,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,5,13,8,4,11,23,1,10,6,2,1,3,21,2,2,4,24,31,4,10,10,2,5,192,15,4,16,7,9,51,1,2,1,1,5,1,1,2,1,3,5,3,1,3,4,1, - 3,1,3,3,9,8,1,2,2,2,4,4,18,12,92,2,10,4,3,14,5,25,16,42,4,14,4,2,21,5,126,30,31,2,1,5,13,3,22,5,6,6,20,12,1,14,12,87,3,19,1,8,2,9,9,3,3,23,2, - 3,7,6,3,1,2,3,9,1,3,1,6,3,2,1,3,11,3,1,6,10,3,2,3,1,2,1,5,1,1,11,3,6,4,1,7,2,1,2,5,5,34,4,14,18,4,19,7,5,8,2,6,79,1,5,2,14,8,2,9,2,1,36,28,16, - 4,1,1,1,2,12,6,42,39,16,23,7,15,15,3,2,12,7,21,64,6,9,28,8,12,3,3,41,59,24,51,55,57,294,9,9,2,6,2,15,1,2,13,38,90,9,9,9,3,11,7,1,1,1,5,6,3,2, - 1,2,2,3,8,1,4,4,1,5,7,1,4,3,20,4,9,1,1,1,5,5,17,1,5,2,6,2,4,1,4,5,7,3,18,11,11,32,7,5,4,7,11,127,8,4,3,3,1,10,1,1,6,21,14,1,16,1,7,1,3,6,9,65, - 51,4,3,13,3,10,1,1,12,9,21,110,3,19,24,1,1,10,62,4,1,29,42,78,28,20,18,82,6,3,15,6,84,58,253,15,155,264,15,21,9,14,7,58,40,39, + 0,1,2,4,1,1,1,1,2,1,3,3,2,2,1,5,3,5,7,5,6,1,2,1,7,2,6,3,1,8,1,1,4,1,1,18,2,11,2,6,2,1,2,1,5,1,2,1,3,1,2,1,2,3,3,1,1,2,3,1,1,1,12,7,9,1,4,5,1, + 1,2,1,10,1,1,9,2,2,4,5,6,9,3,1,1,1,1,9,3,18,5,2,2,2,2,1,6,3,7,1,1,1,1,2,2,4,2,1,23,2,10,4,3,5,2,4,10,2,4,13,1,6,1,9,3,1,1,6,6,7,6,3,1,2,11,3, + 2,2,3,2,15,2,2,5,4,3,6,4,1,2,5,2,12,16,6,13,9,13,2,1,1,7,16,4,7,1,19,1,5,1,2,2,7,7,8,2,6,5,4,9,18,7,4,5,9,13,11,8,15,2,1,1,1,2,1,2,2,1,2,2,8, + 2,9,3,3,1,1,4,4,1,1,1,4,9,1,4,3,5,5,2,7,5,3,4,8,2,1,13,2,3,3,1,14,1,1,4,5,1,3,6,1,5,2,1,1,3,3,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1,1,1,1,12,3,3,9,5, + 2,6,1,5,6,1,2,3,18,2,4,14,4,1,3,6,1,1,6,3,5,5,3,2,2,2,2,12,3,1,4,2,3,2,3,11,1,7,4,1,2,1,3,17,1,9,1,24,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,2,4,15,1, + 1,2,1,1,2,1,5,2,5,20,2,5,9,1,10,8,7,6,1,1,1,1,1,1,6,2,1,2,8,1,1,1,1,5,1,1,3,1,1,1,1,3,1,1,12,4,1,3,1,1,1,1,1,10,3,1,7,5,13,1,2,3,4,6,1,1,30, + 2,9,9,1,15,38,11,3,1,8,24,7,1,9,8,10,2,1,9,31,2,13,6,2,9,4,49,5,2,15,2,1,10,2,1,1,1,2,2,6,15,30,35,3,14,18,8,1,16,10,28,12,19,45,38,1,3,2,3, + 13,2,1,7,3,6,5,3,4,3,1,5,7,8,1,5,3,18,5,3,6,1,21,4,24,9,24,40,3,14,3,21,3,2,1,2,4,2,3,1,15,15,6,5,1,1,3,1,5,6,1,9,7,3,3,2,1,4,3,8,21,5,16,4, + 5,2,10,11,11,3,6,3,2,9,3,6,13,1,2,1,1,1,1,11,12,6,6,1,4,2,6,5,2,1,1,3,3,6,13,3,1,1,5,1,2,3,3,14,2,1,2,2,2,5,1,9,5,1,1,6,12,3,12,3,4,13,2,14, + 2,8,1,17,5,1,16,4,2,2,21,8,9,6,23,20,12,25,19,9,38,8,3,21,40,25,33,13,4,3,1,4,1,2,4,1,2,5,26,2,1,1,2,1,3,6,2,1,1,1,1,1,1,2,3,1,1,1,9,2,3,1,1, + 1,3,6,3,2,1,1,6,6,1,8,2,2,2,1,4,1,2,3,2,7,3,2,4,1,2,1,2,2,1,1,1,1,1,3,1,2,5,4,10,9,4,9,1,1,1,1,1,1,5,3,2,1,6,4,9,6,1,10,2,31,17,8,3,7,5,40,1, + 7,7,1,6,5,2,10,7,8,4,15,39,25,6,28,47,18,10,7,1,3,1,1,2,1,1,1,3,3,3,1,1,1,3,4,2,1,4,1,3,6,10,7,8,6,2,2,1,3,3,2,5,8,7,9,12,2,15,1,1,4,1,2,1,1, + 1,3,2,1,3,3,5,6,2,3,2,10,1,4,2,8,1,1,1,11,6,1,21,4,16,3,1,3,1,4,2,3,6,5,1,3,1,1,3,3,4,6,1,1,10,4,2,7,10,4,7,4,2,9,4,3,1,1,1,4,1,8,3,4,1,3,1, + 6,1,4,2,1,4,7,2,1,8,1,4,5,1,1,2,2,4,6,2,7,1,10,1,1,3,4,11,10,8,21,4,6,1,3,5,2,1,2,28,5,5,2,3,13,1,2,3,1,4,2,1,5,20,3,8,11,1,3,3,3,1,8,10,9,2, + 10,9,2,3,1,1,2,4,1,8,3,6,1,7,8,6,11,1,4,29,8,4,3,1,2,7,13,1,4,1,6,2,6,12,12,2,20,3,2,3,6,4,8,9,2,7,34,5,1,18,6,1,1,4,4,5,7,9,1,2,2,4,3,4,1,7, + 2,2,2,6,2,3,25,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,5,3,4,4,3,2,1,1,4,1,2,1,1,3,1,11,1,6,3,1,7,3,6,2,8,8,6,9,3,4,11,3,2,10,12,2,5,11,1,6,4,5, + 3,1,8,5,4,6,6,3,5,1,1,3,2,1,2,2,6,17,12,1,10,1,6,12,1,6,6,19,9,6,16,1,13,4,4,15,7,17,6,11,9,15,12,6,7,2,1,2,2,15,9,3,21,4,6,49,18,7,3,2,3,1, + 6,8,2,2,6,2,9,1,3,6,4,4,1,2,16,2,5,2,1,6,2,3,5,3,1,2,5,1,2,1,9,3,1,8,6,4,8,11,3,1,1,1,1,3,1,13,8,4,1,3,2,2,1,4,1,11,1,5,2,1,5,2,5,8,6,1,1,7, + 4,3,8,3,2,7,2,1,5,1,5,2,4,7,6,2,8,5,1,11,4,5,3,6,18,1,2,13,3,3,1,21,1,1,4,1,4,1,1,1,8,1,2,2,7,1,2,4,2,2,9,2,1,1,1,4,3,6,3,12,5,1,1,1,5,6,3,2, + 4,8,2,2,4,2,7,1,8,9,5,2,3,2,1,3,2,13,7,14,6,5,1,1,2,1,4,2,23,2,1,1,6,3,1,4,1,15,3,1,7,3,9,14,1,3,1,4,1,1,5,8,1,3,8,3,8,15,11,4,14,4,4,2,5,5, + 1,7,1,6,14,7,7,8,5,15,4,8,6,5,6,2,1,13,1,20,15,11,9,2,5,6,2,11,2,6,2,5,1,5,8,4,13,19,25,4,1,1,11,1,34,2,5,9,14,6,2,2,6,1,1,14,1,3,14,13,1,6, + 12,21,14,14,6,32,17,8,32,9,28,1,2,4,11,8,3,1,14,2,5,15,1,1,1,1,3,6,4,1,3,4,11,3,1,1,11,30,1,5,1,4,1,5,8,1,1,3,2,4,3,17,35,2,6,12,17,3,1,6,2, + 1,1,12,2,7,3,3,2,1,16,2,8,3,6,5,4,7,3,3,8,1,9,8,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,4,3,7,5,8,3,3,3,3,3,3,1,23,10,3,1,2,2,6,3,1,16,1,16, + 22,3,10,4,11,6,9,7,7,3,6,2,2,2,4,10,2,1,1,2,8,7,1,6,4,1,3,3,3,5,10,12,12,2,3,12,8,15,1,1,16,6,6,1,5,9,11,4,11,4,2,6,12,1,17,5,13,1,4,9,5,1,11, + 2,1,8,1,5,7,28,8,3,5,10,2,17,3,38,22,1,2,18,12,10,4,38,18,1,4,44,19,4,1,8,4,1,12,1,4,31,12,1,14,7,75,7,5,10,6,6,13,3,2,11,11,3,2,5,28,15,6,18, + 18,5,6,4,3,16,1,7,18,7,36,3,5,3,1,7,1,9,1,10,7,2,4,2,6,2,9,7,4,3,32,12,3,7,10,2,23,16,3,1,12,3,31,4,11,1,3,8,9,5,1,30,15,6,12,3,2,2,11,19,9, + 14,2,6,2,3,19,13,17,5,3,3,25,3,14,1,1,1,36,1,3,2,19,3,13,36,9,13,31,6,4,16,34,2,5,4,2,3,3,5,1,1,1,4,3,1,17,3,2,3,5,3,1,3,2,3,5,6,3,12,11,1,3, + 1,2,26,7,12,7,2,14,3,3,7,7,11,25,25,28,16,4,36,1,2,1,6,2,1,9,3,27,17,4,3,4,13,4,1,3,2,2,1,10,4,2,4,6,3,8,2,1,18,1,1,24,2,2,4,33,2,3,63,7,1,6, + 40,7,3,4,4,2,4,15,18,1,16,1,1,11,2,41,14,1,3,18,13,3,2,4,16,2,17,7,15,24,7,18,13,44,2,2,3,6,1,1,7,5,1,7,1,4,3,3,5,10,8,2,3,1,8,1,1,27,4,2,1, + 12,1,2,1,10,6,1,6,7,5,2,3,7,11,5,11,3,6,6,2,3,15,4,9,1,1,2,1,2,11,2,8,12,8,5,4,2,3,1,5,2,2,1,14,1,12,11,4,1,11,17,17,4,3,2,5,5,7,3,1,5,9,9,8, + 2,5,6,6,13,13,2,1,2,6,1,2,2,49,4,9,1,2,10,16,7,8,4,3,2,23,4,58,3,29,1,14,19,19,11,11,2,7,5,1,3,4,6,2,18,5,12,12,17,17,3,3,2,4,1,6,2,3,4,3,1, + 1,1,1,5,1,1,9,1,3,1,3,6,1,8,1,1,2,6,4,14,3,1,4,11,4,1,3,32,1,2,4,13,4,1,2,4,2,1,3,1,11,1,4,2,1,4,4,6,3,5,1,6,5,7,6,3,23,3,5,3,5,3,3,13,3,9,10, + 1,12,10,2,3,18,13,7,160,52,4,2,2,3,2,14,5,4,12,4,6,4,1,20,4,11,6,2,12,27,1,4,1,2,2,7,4,5,2,28,3,7,25,8,3,19,3,6,10,2,2,1,10,2,5,4,1,3,4,1,5, + 3,2,6,9,3,6,2,16,3,3,16,4,5,5,3,2,1,2,16,15,8,2,6,21,2,4,1,22,5,8,1,1,21,11,2,1,11,11,19,13,12,4,2,3,2,3,6,1,8,11,1,4,2,9,5,2,1,11,2,9,1,1,2, + 14,31,9,3,4,21,14,4,8,1,7,2,2,2,5,1,4,20,3,3,4,10,1,11,9,8,2,1,4,5,14,12,14,2,17,9,6,31,4,14,1,20,13,26,5,2,7,3,6,13,2,4,2,19,6,2,2,18,9,3,5, + 12,12,14,4,6,2,3,6,9,5,22,4,5,25,6,4,8,5,2,6,27,2,35,2,16,3,7,8,8,6,6,5,9,17,2,20,6,19,2,13,3,1,1,1,4,17,12,2,14,7,1,4,18,12,38,33,2,10,1,1, + 2,13,14,17,11,50,6,33,20,26,74,16,23,45,50,13,38,33,6,6,7,4,4,2,1,3,2,5,8,7,8,9,3,11,21,9,13,1,3,10,6,7,1,2,2,18,5,5,1,9,9,2,68,9,19,13,2,5, + 1,4,4,7,4,13,3,9,10,21,17,3,26,2,1,5,2,4,5,4,1,7,4,7,3,4,2,1,6,1,1,20,4,1,9,2,2,1,3,3,2,3,2,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,3,2,10,3,5,3,4,4, + 3,4,16,1,6,1,10,2,4,2,1,1,2,10,11,2,2,3,1,24,31,4,10,10,2,5,12,16,164,15,4,16,7,9,15,19,17,1,2,1,1,5,1,1,1,1,1,3,1,4,3,1,3,1,3,1,2,1,1,3,3,7, + 2,8,1,2,2,2,1,3,4,3,7,8,12,92,2,10,3,1,3,14,5,25,16,42,4,7,7,4,2,21,5,27,26,27,21,25,30,31,2,1,5,13,3,22,5,6,6,11,9,12,1,5,9,7,5,5,22,60,3,5, + 13,1,1,8,1,1,3,3,2,1,9,3,3,18,4,1,2,3,7,6,3,1,2,3,9,1,3,1,3,2,1,3,1,1,1,2,1,11,3,1,6,9,1,3,2,3,1,2,1,5,1,1,4,3,4,1,2,2,4,4,1,7,2,1,2,2,3,5,13, + 18,3,4,14,9,9,4,16,3,7,5,8,2,6,48,28,3,1,1,4,2,14,8,2,9,2,1,15,2,4,3,2,10,16,12,8,7,1,1,3,1,1,1,2,7,4,1,6,4,38,39,16,23,7,15,15,3,2,12,7,21, + 37,27,6,5,4,8,2,10,8,8,6,5,1,2,1,3,24,1,16,17,9,23,10,17,6,1,51,55,44,13,294,9,3,6,2,4,2,2,15,1,1,1,13,21,17,68,14,8,9,4,1,4,9,3,11,7,1,1,1, + 5,6,3,2,1,1,1,2,3,8,1,2,2,4,1,5,5,2,1,4,3,7,13,4,1,4,1,3,1,1,1,5,5,10,1,6,1,5,2,1,5,2,4,1,4,5,7,3,18,2,9,11,32,4,3,3,2,4,7,11,16,9,11,8,13,38, + 32,8,4,2,1,1,2,1,2,4,4,1,1,1,4,1,21,3,11,1,16,1,1,6,1,3,2,4,9,8,57,7,44,1,3,3,13,3,10,1,1,7,5,2,7,21,47,63,3,15,4,7,1,16,1,1,2,8,2,3,42,15,4, + 1,29,7,22,10,3,78,16,12,20,18,4,67,11,5,1,3,15,6,21,31,32,27,18,13,71,35,5,142,4,10,1,2,50,19,33,16,35,37,16,19,27,7,1,133,19,1,4,8,7,20,1,4, + 4,1,10,3,1,6,1,2,51,5,40,15,24,43,22928,11,1,13,154,70,3,1,1,7,4,10,1,2,1,1,2,1,2,1,2,2,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 3,2,1,1,1,1,2,1,1, }; static ImWchar base_ranges[] = // not zero-terminated { @@ -2377,8 +3045,7 @@ void ImFontGlyphRangesBuilder::AddText(const char* text, const char* text_end) text += c_len; if (c_len == 0) break; - if (c < 0x10000) - AddChar((ImWchar)c); + AddChar((ImWchar)c); } } @@ -2391,11 +3058,12 @@ void ImFontGlyphRangesBuilder::AddRanges(const ImWchar* ranges) void ImFontGlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges) { - for (int n = 0; n < 0x10000; n++) + const int max_codepoint = IM_UNICODE_CODEPOINT_MAX; + for (int n = 0; n <= max_codepoint; n++) if (GetBit(n)) { out_ranges->push_back((ImWchar)n); - while (n < 0x10000 && GetBit(n + 1)) + while (n < max_codepoint && GetBit(n + 1)) n++; out_ranges->push_back((ImWchar)n); } @@ -2411,7 +3079,7 @@ ImFont::ImFont() FontSize = 0.0f; FallbackAdvanceX = 0.0f; FallbackChar = (ImWchar)'?'; - DisplayOffset = ImVec2(0.0f, 0.0f); + EllipsisChar = (ImWchar)-1; FallbackGlyph = NULL; ContainerAtlas = NULL; ConfigData = NULL; @@ -2420,6 +3088,7 @@ ImFont::ImFont() Scale = 1.0f; Ascent = Descent = 0.0f; MetricsTotalSurface = 0; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); } ImFont::~ImFont() @@ -2447,32 +3116,43 @@ void ImFont::BuildLookupTable() for (int i = 0; i != Glyphs.Size; i++) max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); + // Build lookup table IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved IndexAdvanceX.clear(); IndexLookup.clear(); DirtyLookupTables = false; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); GrowIndex(max_codepoint + 1); for (int i = 0; i < Glyphs.Size; i++) { int codepoint = (int)Glyphs[i].Codepoint; IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX; IndexLookup[codepoint] = (ImWchar)i; + + // Mark 4K page as used + const int page_n = codepoint / 4096; + Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7); } // Create a glyph to handle TAB // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at "column 0" ?) if (FindGlyph((ImWchar)' ')) { - if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times + if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times (FIXME: Flaky) Glyphs.resize(Glyphs.Size + 1); ImFontGlyph& tab_glyph = Glyphs.back(); tab_glyph = *FindGlyph((ImWchar)' '); tab_glyph.Codepoint = '\t'; tab_glyph.AdvanceX *= IM_TABSIZE; IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX; - IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size-1); + IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size - 1); } + // Mark special glyphs as not visible (note that AddGlyph already mark as non-visible glyphs with zero-size polygons) + SetGlyphVisible((ImWchar)' ', false); + SetGlyphVisible((ImWchar)'\t', false); + + // Setup fall-backs FallbackGlyph = FindGlyphNoFallback(FallbackChar); FallbackAdvanceX = FallbackGlyph ? FallbackGlyph->AdvanceX : 0.0f; for (int i = 0; i < max_codepoint + 1; i++) @@ -2480,6 +3160,25 @@ void ImFont::BuildLookupTable() IndexAdvanceX[i] = FallbackAdvanceX; } +// API is designed this way to avoid exposing the 4K page size +// e.g. use with IsGlyphRangeUnused(0, 255) +bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last) +{ + unsigned int page_begin = (c_begin / 4096); + unsigned int page_last = (c_last / 4096); + for (unsigned int page_n = page_begin; page_n <= page_last; page_n++) + if ((page_n >> 3) < sizeof(Used4kPagesMap)) + if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7))) + return false; + return true; +} + +void ImFont::SetGlyphVisible(ImWchar c, bool visible) +{ + if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c)) + glyph->Visible = visible ? 1 : 0; +} + void ImFont::SetFallbackChar(ImWchar c) { FallbackChar = c; @@ -2497,11 +3196,34 @@ void ImFont::GrowIndex(int new_size) // x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero. // Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis). -void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) +// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font. +void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) { + if (cfg != NULL) + { + // Clamp & recenter if needed + const float advance_x_original = advance_x; + advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); + if (advance_x != advance_x_original) + { + float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; + x0 += char_off_x; + x1 += char_off_x; + } + + // Snap to pixel + if (cfg->PixelSnapH) + advance_x = IM_ROUND(advance_x); + + // Bake spacing + advance_x += cfg->GlyphExtraSpacing.x; + } + Glyphs.resize(Glyphs.Size + 1); ImFontGlyph& glyph = Glyphs.back(); - glyph.Codepoint = (ImWchar)codepoint; + glyph.Codepoint = (unsigned int)codepoint; + glyph.Visible = (x0 != x1) && (y0 != y1); + glyph.Colored = false; glyph.X0 = x0; glyph.Y0 = y0; glyph.X1 = x1; @@ -2510,20 +3232,19 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, glyph.V0 = v0; glyph.U1 = u1; glyph.V1 = v1; - glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x; // Bake spacing into AdvanceX - - if (ConfigData->PixelSnapH) - glyph.AdvanceX = (float)(int)(glyph.AdvanceX + 0.5f); + glyph.AdvanceX = advance_x; // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) + // We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling. + float pad = ContainerAtlas->TexGlyphPadding + 0.99f; DirtyLookupTables = true; - MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + 1.99f); + MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + pad) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + pad); } void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) { IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function. - int index_size = IndexLookup.Size; + unsigned int index_size = (unsigned int)IndexLookup.Size; if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists return; @@ -2537,7 +3258,7 @@ void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const { - if (c >= IndexLookup.Size) + if (c >= (size_t)IndexLookup.Size) return FallbackGlyph; const ImWchar i = IndexLookup.Data[c]; if (i == (ImWchar)-1) @@ -2547,7 +3268,7 @@ const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const { - if (c >= IndexLookup.Size) + if (c >= (size_t)IndexLookup.Size) return NULL; const ImWchar i = IndexLookup.Data[c]; if (i == (ImWchar)-1) @@ -2636,11 +3357,11 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c } // Allow wrapping after punctuation. - inside_word = !(c == '.' || c == ',' || c == ';' || c == '!' || c == '?' || c == '\"'); + inside_word = (c != '.' && c != ',' && c != ';' && c != '!' && c != '?' && c != '\"'); } // We ignore blank width at the end of the line (they can be skipped) - if (line_width + word_width >= wrap_width) + if (line_width + word_width > wrap_width) { // Words that cannot possibly fit within an entire line will be cut anywhere. if (word_width < wrap_width) @@ -2662,7 +3383,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons const float line_height = size; const float scale = size / FontSize; - ImVec2 text_size = ImVec2(0,0); + ImVec2 text_size = ImVec2(0, 0); float line_width = 0.0f; const bool word_wrap_enabled = (wrap_width > 0.0f); @@ -2750,26 +3471,26 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, ImWchar c) const { - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') // Match behavior of RenderText(), those 4 codepoints are hard-coded. + const ImFontGlyph* glyph = FindGlyph(c); + if (!glyph || !glyph->Visible) return; - if (const ImFontGlyph* glyph = FindGlyph(c)) - { - float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; - pos.x = (float)(int)pos.x + DisplayOffset.x; - pos.y = (float)(int)pos.y + DisplayOffset.y; - draw_list->PrimReserve(6, 4); - draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); - } + if (glyph->Colored) + col |= ~IM_COL32_A_MASK; + float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; + pos.x = IM_FLOOR(pos.x); + pos.y = IM_FLOOR(pos.y); + draw_list->PrimReserve(6, 4); + draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); } void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const { if (!text_end) - text_end = text_begin + strlen(text_begin); // ImGui functions generally already provides a valid text_end, so this is merely to handle direct calls. + text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. // Align to be pixel perfect - pos.x = (float)(int)pos.x + DisplayOffset.x; - pos.y = (float)(int)pos.y + DisplayOffset.y; + pos.x = IM_FLOOR(pos.x); + pos.y = IM_FLOOR(pos.y); float x = pos.x; float y = pos.y; if (y > clip_rect.w) @@ -2817,6 +3538,8 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col ImDrawIdx* idx_write = draw_list->_IdxWritePtr; unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; + const ImU32 col_untinted = col | ~IM_COL32_A_MASK; + while (s < text_end) { if (word_wrap_enabled) @@ -2872,105 +3595,158 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col continue; } - float char_width = 0.0f; - if (const ImFontGlyph* glyph = FindGlyph((ImWchar)c)) + const ImFontGlyph* glyph = FindGlyph((ImWchar)c); + if (glyph == NULL) + continue; + + float char_width = glyph->AdvanceX * scale; + if (glyph->Visible) { - char_width = glyph->AdvanceX * scale; - - // Arbitrarily assume that both space and tabs are empty glyphs as an optimization - if (c != ' ' && c != '\t') + // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w + float x1 = x + glyph->X0 * scale; + float x2 = x + glyph->X1 * scale; + float y1 = y + glyph->Y0 * scale; + float y2 = y + glyph->Y1 * scale; + if (x1 <= clip_rect.z && x2 >= clip_rect.x) { - // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w - float x1 = x + glyph->X0 * scale; - float x2 = x + glyph->X1 * scale; - float y1 = y + glyph->Y0 * scale; - float y2 = y + glyph->Y1 * scale; - if (x1 <= clip_rect.z && x2 >= clip_rect.x) + // Render a character + float u1 = glyph->U0; + float v1 = glyph->V0; + float u2 = glyph->U1; + float v2 = glyph->V1; + + // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. + if (cpu_fine_clip) { - // Render a character - float u1 = glyph->U0; - float v1 = glyph->V0; - float u2 = glyph->U1; - float v2 = glyph->V1; - - // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. - if (cpu_fine_clip) + if (x1 < clip_rect.x) { - if (x1 < clip_rect.x) - { - u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); - x1 = clip_rect.x; - } - if (y1 < clip_rect.y) - { - v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); - y1 = clip_rect.y; - } - if (x2 > clip_rect.z) - { - u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); - x2 = clip_rect.z; - } - if (y2 > clip_rect.w) - { - v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); - y2 = clip_rect.w; - } - if (y1 >= y2) - { - x += char_width; - continue; - } + u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); + x1 = clip_rect.x; } - - // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: + if (y1 < clip_rect.y) { - idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2); - idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3); - vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; - vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; - vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; - vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; - vtx_write += 4; - vtx_current_idx += 4; - idx_write += 6; + v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); + y1 = clip_rect.y; } + if (x2 > clip_rect.z) + { + u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); + x2 = clip_rect.z; + } + if (y2 > clip_rect.w) + { + v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); + y2 = clip_rect.w; + } + if (y1 >= y2) + { + x += char_width; + continue; + } + } + + // Support for untinted glyphs + ImU32 glyph_col = glyph->Colored ? col_untinted : col; + + // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: + { + idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2); + idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3); + vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = glyph_col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; + vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = glyph_col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; + vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = glyph_col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; + vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = glyph_col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; + vtx_write += 4; + vtx_current_idx += 4; + idx_write += 6; } } } - x += char_width; } - // Give back unused vertices - draw_list->VtxBuffer.resize((int)(vtx_write - draw_list->VtxBuffer.Data)); - draw_list->IdxBuffer.resize((int)(idx_write - draw_list->IdxBuffer.Data)); - draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); + // Give back unused vertices (clipped ones, blanks) ~ this is essentially a PrimUnreserve() action. + draw_list->VtxBuffer.Size = (int)(vtx_write - draw_list->VtxBuffer.Data); // Same as calling shrink() + draw_list->IdxBuffer.Size = (int)(idx_write - draw_list->IdxBuffer.Data); + draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); draw_list->_VtxWritePtr = vtx_write; draw_list->_IdxWritePtr = idx_write; - draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size; + draw_list->_VtxCurrentIdx = vtx_current_idx; } //----------------------------------------------------------------------------- -// [SECTION] Internal Render Helpers -// (progressively moved from imgui.cpp to here when they are redesigned to stop accessing ImGui global state) +// [SECTION] ImGui Internal Render Helpers //----------------------------------------------------------------------------- +// Vaguely redesigned to stop accessing ImGui global state: +// - RenderArrow() +// - RenderBullet() +// - RenderCheckMark() // - RenderMouseCursor() // - RenderArrowPointingAt() // - RenderRectFilledRangeH() -// - RenderPixelEllipsis() +//----------------------------------------------------------------------------- +// Function in need of a redesign (legacy mess) +// - RenderColorRectWithAlphaCheckerboard() //----------------------------------------------------------------------------- -void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor) +// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state +void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale) +{ + const float h = draw_list->_Data->FontSize * 1.00f; + float r = h * 0.40f * scale; + ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale); + + ImVec2 a, b, c; + switch (dir) + { + case ImGuiDir_Up: + case ImGuiDir_Down: + if (dir == ImGuiDir_Up) r = -r; + a = ImVec2(+0.000f, +0.750f) * r; + b = ImVec2(-0.866f, -0.750f) * r; + c = ImVec2(+0.866f, -0.750f) * r; + break; + case ImGuiDir_Left: + case ImGuiDir_Right: + if (dir == ImGuiDir_Left) r = -r; + a = ImVec2(+0.750f, +0.000f) * r; + b = ImVec2(-0.750f, +0.866f) * r; + c = ImVec2(-0.750f, -0.866f) * r; + break; + case ImGuiDir_None: + case ImGuiDir_COUNT: + IM_ASSERT(0); + break; + } + draw_list->AddTriangleFilled(center + a, center + b, center + c, col); +} + +void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col) +{ + draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8); +} + +void ImGui::RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) +{ + float thickness = ImMax(sz / 5.0f, 1.0f); + sz -= thickness * 0.5f; + pos += ImVec2(thickness * 0.25f, thickness * 0.25f); + + float third = sz / 3.0f; + float bx = pos.x + third; + float by = pos.y + sz - third * 0.5f; + draw_list->PathLineTo(ImVec2(bx - third, by - third)); + draw_list->PathLineTo(ImVec2(bx, by)); + draw_list->PathLineTo(ImVec2(bx + third * 2.0f, by - third * 2.0f)); + draw_list->PathStroke(col, 0, thickness); +} + +void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) { if (mouse_cursor == ImGuiMouseCursor_None) return; IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); - const ImU32 col_shadow = IM_COL32(0, 0, 0, 48); - const ImU32 col_border = IM_COL32(0, 0, 0, 255); // Black - const ImU32 col_fill = IM_COL32(255, 255, 255, 255); // White - ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas; ImVec2 offset, size, uv[4]; if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) @@ -2978,10 +3754,10 @@ void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, Im pos -= offset; const ImTextureID tex_id = font_atlas->TexID; draw_list->PushTextureID(tex_id); - draw_list->AddImage(tex_id, pos + ImVec2(1,0)*scale, pos + ImVec2(1,0)*scale + size*scale, uv[2], uv[3], col_shadow); - draw_list->AddImage(tex_id, pos + ImVec2(2,0)*scale, pos + ImVec2(2,0)*scale + size*scale, uv[2], uv[3], col_shadow); - draw_list->AddImage(tex_id, pos, pos + size*scale, uv[2], uv[3], col_border); - draw_list->AddImage(tex_id, pos, pos + size*scale, uv[0], uv[1], col_fill); + draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill); draw_list->PopTextureID(); } } @@ -3068,16 +3844,61 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im draw_list->PathFillConvex(col); } -// FIXME: Rendering an ellipsis "..." is a surprisingly tricky problem for us... we cannot rely on font glyph having it, -// and regular dot are typically too wide. If we render a dot/shape ourselves it comes with the risk that it wouldn't match -// the boldness or positioning of what the font uses... -void ImGui::RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col) +void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect inner, ImU32 col, float rounding) { - ImFont* font = draw_list->_Data->Font; - const float font_scale = draw_list->_Data->FontSize / font->FontSize; - pos.y += (float)(int)(font->DisplayOffset.y + font->Ascent * font_scale + 0.5f - 1.0f); - for (int dot_n = 0; dot_n < count; dot_n++) - draw_list->AddRectFilled(ImVec2(pos.x + dot_n * 2.0f, pos.y), ImVec2(pos.x + dot_n * 2.0f + 1.0f, pos.y + 1.0f), col); + const bool fill_L = (inner.Min.x > outer.Min.x); + const bool fill_R = (inner.Max.x < outer.Max.x); + const bool fill_U = (inner.Min.y > outer.Min.y); + const bool fill_D = (inner.Max.y < outer.Max.y); + if (fill_L) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Min.y), ImVec2(inner.Min.x, inner.Max.y), col, rounding, (fill_U ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomLeft)); + if (fill_R) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Min.y), ImVec2(outer.Max.x, inner.Max.y), col, rounding, (fill_U ? 0 : ImDrawFlags_RoundCornersTopRight) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_U) draw_list->AddRectFilled(ImVec2(inner.Min.x, outer.Min.y), ImVec2(inner.Max.x, inner.Min.y), col, rounding, (fill_L ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersTopRight)); + if (fill_D) draw_list->AddRectFilled(ImVec2(inner.Min.x, inner.Max.y), ImVec2(inner.Max.x, outer.Max.y), col, rounding, (fill_L ? 0 : ImDrawFlags_RoundCornersBottomLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_L && fill_U) draw_list->AddRectFilled(ImVec2(outer.Min.x, outer.Min.y), ImVec2(inner.Min.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopLeft); + if (fill_R && fill_U) draw_list->AddRectFilled(ImVec2(inner.Max.x, outer.Min.y), ImVec2(outer.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopRight); + if (fill_L && fill_D) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Max.y), ImVec2(inner.Min.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomLeft); + if (fill_R && fill_D) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Max.y), ImVec2(outer.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomRight); +} + +// Helper for ColorPicker4() +// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. +// Spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding altogether. +// FIXME: uses ImGui::GetColorU32 +void ImGui::RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, ImDrawFlags flags) +{ + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags = ImDrawFlags_RoundCornersDefault_; + if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) + { + ImU32 col_bg1 = GetColorU32(ImAlphaBlendColors(IM_COL32(204, 204, 204, 255), col)); + ImU32 col_bg2 = GetColorU32(ImAlphaBlendColors(IM_COL32(128, 128, 128, 255), col)); + draw_list->AddRectFilled(p_min, p_max, col_bg1, rounding, flags); + + int yi = 0; + for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) + { + float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); + if (y2 <= y1) + continue; + for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) + { + float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); + if (x2 <= x1) + continue; + ImDrawFlags cell_flags = ImDrawFlags_RoundCornersNone; + if (y1 <= p_min.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersTopLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersTopRight; } + if (y2 >= p_max.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersBottomLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersBottomRight; } + + // Combine flags + cell_flags = (flags == ImDrawFlags_RoundCornersNone || cell_flags == ImDrawFlags_RoundCornersNone) ? ImDrawFlags_RoundCornersNone : (cell_flags & flags); + draw_list->AddRectFilled(ImVec2(x1, y1), ImVec2(x2, y2), col_bg2, rounding, cell_flags); + } + } + } + else + { + draw_list->AddRectFilled(p_min, p_max, col, rounding, flags); + } } //----------------------------------------------------------------------------- @@ -3140,9 +3961,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns { const unsigned long ADLER_MOD = 65521; unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; - unsigned long blocklen, i; + unsigned long blocklen = buflen % 5552; - blocklen = buflen % 5552; + unsigned long i; while (buflen) { for (i=0; i + 7 < blocklen; i += 8) { s1 += buffer[0], s2 += s1; @@ -3169,10 +3990,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) { - unsigned int olen; if (stb__in4(0) != 0x57bC0000) return 0; if (stb__in4(4) != 0) return 0; // error! stream is > 4GB - olen = stb_decompress_length(i); + const unsigned int olen = stb_decompress_length(i); stb__barrier_in_b = i; stb__barrier_out_e = output + olen; stb__barrier_out_b = output; @@ -3212,7 +4032,7 @@ static unsigned int stb_decompress(unsigned char *output, const unsigned char *i // Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). // The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. //----------------------------------------------------------------------------- -static const char proggy_clean_ttf_compressed_data_base85[11980+1] = +static const char proggy_clean_ttf_compressed_data_base85[11980 + 1] = "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" "2*>]b(MC;$jPfY.;h^`IWM9<Lh2TlS+f-s$o6Q<BWH`YiU.xfLq$N;$0iR/GX:U(jcW2p/W*q?-qmnUCI;jHSAiFWM.R*kU@C=GH?a9wp8f$e.-4^Qg1)Q-GL(lf(r/7GrRgwV%MS=C#" "`8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#0X@U.a<r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL" @@ -3304,3 +4124,5 @@ static const char* GetDefaultCompressedFontDataTTFBase85() { return proggy_clean_ttf_compressed_data_base85; } + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_internal.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_internal.h new file mode 100644 index 0000000000..ea50a49cd7 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_internal.h @@ -0,0 +1,2597 @@ +// dear imgui, v1.82 +// (internal structures/api) + +// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! +// Set: +// #define IMGUI_DEFINE_MATH_OPERATORS +// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators) + +/* + +Index of this file: + +// [SECTION] Header mess +// [SECTION] Forward declarations +// [SECTION] Context pointer +// [SECTION] STB libraries includes +// [SECTION] Macros +// [SECTION] Generic helpers +// [SECTION] ImDrawList support +// [SECTION] Widgets support: flags, enums, data structures +// [SECTION] Columns support +// [SECTION] Multi-select support +// [SECTION] Docking support +// [SECTION] Viewport support +// [SECTION] Settings support +// [SECTION] Metrics, Debug +// [SECTION] Generic context hooks +// [SECTION] ImGuiContext (main imgui context) +// [SECTION] ImGuiWindowTempData, ImGuiWindow +// [SECTION] Tab bar, Tab item support +// [SECTION] Table support +// [SECTION] ImGui internal API +// [SECTION] ImFontAtlas internal API +// [SECTION] Test Engine specific hooks (imgui_test_engine) + +*/ + +#pragma once +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#ifndef IMGUI_VERSION +#error Must include imgui.h before imgui_internal.h +#endif + +#include <stdio.h> // FILE*, sscanf +#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof +#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf +#include <limits.h> // INT_MIN, INT_MAX + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport) +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#pragma clang diagnostic ignored "-Wdouble-promotion" +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +// Legacy defines +#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +#endif +#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#endif + +// Enable stb_truetype by default unless FreeType is enabled. +// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together. +#ifndef IMGUI_ENABLE_FREETYPE +#define IMGUI_ENABLE_STB_TRUETYPE +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward declarations +//----------------------------------------------------------------------------- + +struct ImBitVector; // Store 1-bit per value +struct ImRect; // An axis-aligned rectangle (2 points) +struct ImDrawDataBuilder; // Helper to build a ImDrawData instance +struct ImDrawListSharedData; // Data shared between all ImDrawList instances +struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it +struct ImGuiContext; // Main Dear ImGui context +struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine +struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum +struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() +struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box +struct ImGuiLastItemDataBackup; // Backup and restore IsItemHovered() internal data +struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only +struct ImGuiNavMoveResult; // Result of a gamepad/keyboard directional navigation move query result +struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions +struct ImGuiNextWindowData; // Storage for SetNextWindow** functions +struct ImGuiNextItemData; // Storage for SetNextItem** functions +struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api +struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api +struct ImGuiPopupData; // Storage for current popup stack +struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file +struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting +struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it +struct ImGuiTabBar; // Storage for a tab bar +struct ImGuiTabItem; // Storage for a tab item (within a tab bar) +struct ImGuiTable; // Storage for a table +struct ImGuiTableColumn; // Storage for one column of a table +struct ImGuiTableSettings; // Storage for a table .ini settings +struct ImGuiTableColumnsSettings; // Storage for a column .ini settings +struct ImGuiWindow; // Storage for one window +struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame) +struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) + +// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. +typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical +typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() +typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags +typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() +typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() +typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d() +typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests +typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions +typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions +typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() +typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() +typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() + +typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); + +//----------------------------------------------------------------------------- +// [SECTION] Context pointer +// See implementation of this variable in imgui.cpp for comments and details. +//----------------------------------------------------------------------------- + +#ifndef GImGui +extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer +#endif + +//------------------------------------------------------------------------- +// [SECTION] STB libraries includes +//------------------------------------------------------------------------- + +namespace ImStb +{ + +#undef STB_TEXTEDIT_STRING +#undef STB_TEXTEDIT_CHARTYPE +#define STB_TEXTEDIT_STRING ImGuiInputTextState +#define STB_TEXTEDIT_CHARTYPE ImWchar +#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) +#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#include "imstb_textedit.h" + +} // namespace ImStb + +//----------------------------------------------------------------------------- +// [SECTION] Macros +//----------------------------------------------------------------------------- + +// Debug Logging +#ifndef IMGUI_DEBUG_LOG +#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__) +#endif + +// Debug Logging for selected systems. Remove the '((void)0) //' to enable. +//#define IMGUI_DEBUG_LOG_POPUP IMGUI_DEBUG_LOG // Enable log +//#define IMGUI_DEBUG_LOG_NAV IMGUI_DEBUG_LOG // Enable log +#define IMGUI_DEBUG_LOG_POPUP(...) ((void)0) // Disable log +#define IMGUI_DEBUG_LOG_NAV(...) ((void)0) // Disable log + +// Static Asserts +#if (__cplusplus >= 201100) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201100) +#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") +#else +#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1] +#endif + +// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. +// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code. +//#define IMGUI_DEBUG_PARANOID +#ifdef IMGUI_DEBUG_PARANOID +#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) +#else +#define IM_ASSERT_PARANOID(_EXPR) +#endif + +// Error handling +// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults. +#ifndef IM_ASSERT_USER_ERROR +#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error +#endif + +// Misc Macros +#define IM_PI 3.14159265358979323846f +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) +#else +#define IM_NEWLINE "\n" +#endif +#define IM_TABSIZE (4) +#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + (_ALIGN - 1)) & ~(_ALIGN - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 +#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose +#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 +#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds +#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif + +// Debug Tools +// Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item. +#ifndef IM_DEBUG_BREAK +#if defined(__clang__) +#define IM_DEBUG_BREAK() __builtin_debugtrap() +#elif defined (_MSC_VER) +#define IM_DEBUG_BREAK() __debugbreak() +#else +#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! +#endif +#endif // #ifndef IM_DEBUG_BREAK + +//----------------------------------------------------------------------------- +// [SECTION] Generic helpers +// Note that the ImXXX helpers functions are lower-level than ImGui functions. +// ImGui functions or the ImGui context are never called/used from other ImXXX functions. +//----------------------------------------------------------------------------- +// - Helpers: Hashing +// - Helpers: Sorting +// - Helpers: Bit manipulation +// - Helpers: String, Formatting +// - Helpers: UTF-8 <> wchar conversions +// - Helpers: ImVec2/ImVec4 operators +// - Helpers: Maths +// - Helpers: Geometry +// - Helper: ImVec1 +// - Helper: ImVec2ih +// - Helper: ImRect +// - Helper: ImBitArray +// - Helper: ImBitVector +// - Helper: ImSpan<>, ImSpanAllocator<> +// - Helper: ImPool<> +// - Helper: ImChunkStream<> +//----------------------------------------------------------------------------- + +// Helpers: Hashing +IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0); +IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +static inline ImGuiID ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68] +#endif + +// Helpers: Sorting +#define ImQsort qsort + +// Helpers: Color Blending +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); + +// Helpers: Bit manipulation +static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } +static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; } +static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } + +// Helpers: String, Formatting +IMGUI_API int ImStricmp(const char* str1, const char* str2); +IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); +IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); +IMGUI_API char* ImStrdup(const char* str); +IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); +IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); +IMGUI_API int ImStrlenW(const ImWchar* str); +IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line +IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line +IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); +IMGUI_API void ImStrTrimBlanks(char* str); +IMGUI_API const char* ImStrSkipBlank(const char* str); +IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); +IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); +IMGUI_API const char* ImParseFormatFindStart(const char* format); +IMGUI_API const char* ImParseFormatFindEnd(const char* format); +IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); +IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); +static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } +static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } + +// Helpers: UTF-8 <> wchar conversions +IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count +IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count +IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count +IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) +IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 +IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 + +// Helpers: ImVec2/ImVec4 operators +// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.) +// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. +#ifdef IMGUI_DEFINE_MATH_OPERATORS +static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); } +static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); } +static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); } +static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); } +static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } +static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); } +static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } +static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } +static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } +static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } +static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } +static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } +static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } +#endif + +// Helpers: File System +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS +#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef void* ImFileHandle; +static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } +static inline bool ImFileClose(ImFileHandle) { return false; } +static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } +static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } +static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } +#endif +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef FILE* ImFileHandle; +IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); +IMGUI_API bool ImFileClose(ImFileHandle file); +IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); +IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); +IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); +#else +#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions +#endif +IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); + +// Helpers: Maths +// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) +#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#define ImFabs(X) fabsf(X) +#define ImSqrt(X) sqrtf(X) +#define ImFmod(X, Y) fmodf((X), (Y)) +#define ImCos(X) cosf(X) +#define ImSin(X) sinf(X) +#define ImAcos(X) acosf(X) +#define ImAtan2(Y, X) atan2f((Y), (X)) +#define ImAtof(STR) atof(STR) +#define ImFloorStd(X) floorf(X) // We already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by e.g. stb_truetype) +#define ImCeil(X) ceilf(X) +static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision +static inline double ImPow(double x, double y) { return pow(x, y); } +static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision +static inline double ImLog(double x) { return log(x); } +static inline float ImAbs(float x) { return fabsf(x); } +static inline double ImAbs(double x) { return fabs(x); } +static inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : ((x > 0.0f) ? 1.0f : 0.0f); } // Sign operator - returns -1, 0 or 1 based on sign of argument +static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : ((x > 0.0) ? 1.0 : 0.0); } +#endif +// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double +// (Exceptionally using templates here but we could also redefine them for those types) +template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } +template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } +template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } +template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } +template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } +template<typename T> static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } +template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } +// - Misc maths helpers +static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } +static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } +static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } +static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } +static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } +static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; } +static inline float ImFloor(float f) { return (float)(int)(f); } +static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } +static inline int ImModPositive(int a, int b) { return (a + b) % b; } +static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } +static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } +static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } +static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } + +// Helpers: Geometry +IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); +IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments +IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol +IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); +IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); +IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); +inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); + +// Helper: ImVec1 (1D vector) +// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) +struct ImVec1 +{ + float x; + ImVec1() { x = 0.0f; } + ImVec1(float _x) { x = _x; } +}; + +// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) +struct ImVec2ih +{ + short x, y; + ImVec2ih() { x = y = 0; } + ImVec2ih(short _x, short _y) { x = _x; y = _y; } + explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; } +}; + +// Helper: ImRect (2D axis aligned bounding-box) +// NB: we can't rely on ImVec2 math operators being available here! +struct IMGUI_API ImRect +{ + ImVec2 Min; // Upper-left + ImVec2 Max; // Lower-right + + ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} + ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} + ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} + ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} + + ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } + ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } + float GetWidth() const { return Max.x - Min.x; } + float GetHeight() const { return Max.y - Min.y; } + float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); } + ImVec2 GetTL() const { return Min; } // Top-left + ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right + ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left + ImVec2 GetBR() const { return Max; } // Bottom-right + bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } + bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } + bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } + void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } + void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } + void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } + void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } + void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } + void TranslateX(float dx) { Min.x += dx; Max.x += dx; } + void TranslateY(float dy) { Min.y += dy; Max.y += dy; } + void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. + void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. + void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } + bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } + ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } +}; + +// Helper: ImBitArray +inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } +inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } +inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } +inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2) +{ + n2--; + while (n <= n2) + { + int a_mod = (n & 31); + int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; + ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); + arr[n >> 5] |= mask; + n = (n + 32) & ~31; + } +} + +// Helper: ImBitArray class (wrapper over ImBitArray functions) +// Store 1-bit per value. NOT CLEARED by constructor. +template<int BITCOUNT> +struct IMGUI_API ImBitArray +{ + ImU32 Storage[(BITCOUNT + 31) >> 5]; + ImBitArray() { } + void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); } + void SetAllBits() { memset(Storage, 255, sizeof(Storage)); } + bool TestBit(int n) const { IM_ASSERT(n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } + void SetBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArraySetBit(Storage, n); } + void ClearBit(int n) { IM_ASSERT(n < BITCOUNT); ImBitArrayClearBit(Storage, n); } + void SetBitRange(int n, int n2) { ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) +}; + +// Helper: ImBitVector +// Store 1-bit per value. +struct IMGUI_API ImBitVector +{ + ImVector<ImU32> Storage; + void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } + void Clear() { Storage.clear(); } + bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); } + void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } + void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } +}; + +// Helper: ImSpan<> +// Pointing to a span of data we don't own. +template<typename T> +struct ImSpan +{ + T* Data; + T* DataEnd; + + // Constructors, destructor + inline ImSpan() { Data = DataEnd = NULL; } + inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } + inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } + + inline void set(T* data, int size) { Data = data; DataEnd = data + size; } + inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } + inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } + inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } + inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + + inline T* begin() { return Data; } + inline const T* begin() const { return Data; } + inline T* end() { return DataEnd; } + inline const T* end() const { return DataEnd; } + + // Utilities + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } +}; + +// Helper: ImSpanAllocator<> +// Facilitate storing multiple chunks into a single large block (the "arena") +// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges. +template<int CHUNKS> +struct ImSpanAllocator +{ + char* BasePtr; + int CurrOff; + int CurrIdx; + int Offsets[CHUNKS]; + int Sizes[CHUNKS]; + + ImSpanAllocator() { memset(this, 0, sizeof(*this)); } + inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; } + inline int GetArenaSizeInBytes() { return CurrOff; } + inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } + inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); } + inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); } + template<typename T> + inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } +}; + +// Helper: ImPool<> +// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, +// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. +typedef int ImPoolIdx; +template<typename T> +struct IMGUI_API ImPool +{ + ImVector<T> Buf; // Contiguous data + ImGuiStorage Map; // ID->Index + ImPoolIdx FreeIdx; // Next free idx to use + + ImPool() { FreeIdx = 0; } + ~ImPool() { Clear(); } + T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } + T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } + ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } + T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } + bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } + void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = 0; } + T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); return &Buf[idx]; } + void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } + void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); } + void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } + int GetSize() const { return Buf.Size; } +}; + +// Helper: ImChunkStream<> +// Build and iterate a contiguous stream of variable-sized structures. +// This is used by Settings to store persistent data while reducing allocation count. +// We store the chunk size first, and align the final size on 4 bytes boundaries. +// The tedious/zealous amount of casting is to avoid -Wcast-align warnings. +template<typename T> +struct IMGUI_API ImChunkStream +{ + ImVector<char> Buf; + + void clear() { Buf.clear(); } + bool empty() const { return Buf.Size == 0; } + int size() const { return Buf.Size; } + T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); } + T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } + T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; } + int chunk_size(const T* p) { return ((const int*)p)[-1]; } + T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } + int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } + T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } + void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); } + +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawList support +//----------------------------------------------------------------------------- + +// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. +// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693 +// Number of segments (N) is calculated using equation: +// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r +// Our equation is significantly simpler that one in the post thanks for choosing segment that is +// perpendicular to X axis. Follow steps in the article from this starting condition and you will +// will get this result. +// +// Rendering circles with an odd number of segments, while mathematically correct will produce +// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.) +// +#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) + +// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'. +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI)))) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD)) + +// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle. +#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE +#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table. +#endif +#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle. + +// Data shared between all ImDrawList instances +// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure. +struct IMGUI_API ImDrawListSharedData +{ + ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas + ImFont* Font; // Current/default font (optional, for simplified AddText overload) + float FontSize; // Current/default font size (optional, for simplified AddText overload) + float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() + float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc + ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() + ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) + + // [Internal] Lookup tables + ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle. + float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo() + ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead) + const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas + + ImDrawListSharedData(); + void SetCircleTessellationMaxError(float max_error); +}; + +struct ImDrawDataBuilder +{ + ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip + + void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } + void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } + int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } + IMGUI_API void FlattenIntoSingleLayer(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Widgets support: flags, enums, data structures +//----------------------------------------------------------------------------- + +// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). +// This is going to be exposed in imgui.h when stabilized enough. +enum ImGuiItemFlags_ +{ + ImGuiItemFlags_None = 0, + ImGuiItemFlags_NoTabStop = 1 << 0, // false + ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. + ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211 + ImGuiItemFlags_NoNav = 1 << 3, // false + ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false + ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window + ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) + ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. + ImGuiItemFlags_Default_ = 0 +}; + +// Storage for LastItem data +enum ImGuiItemStatusFlags_ +{ + ImGuiItemStatusFlags_None = 0, + ImGuiItemStatusFlags_HoveredRect = 1 << 0, + ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // LastItemDisplayRect is valid + ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) + ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues. + ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. + ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. + ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. + ImGuiItemStatusFlags_HoveredWindow = 1 << 7 // Override the HoveredWindow test to allow cross-window hover testing. + +#ifdef IMGUI_ENABLE_TEST_ENGINE + , // [imgui_tests only] + ImGuiItemStatusFlags_Openable = 1 << 10, // + ImGuiItemStatusFlags_Opened = 1 << 11, // + ImGuiItemStatusFlags_Checkable = 1 << 12, // + ImGuiItemStatusFlags_Checked = 1 << 13 // +#endif +}; + +// Extend ImGuiButtonFlags_ +enum ImGuiButtonFlagsPrivate_ +{ + ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) + ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using + ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item + ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) + ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) + ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) + ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat + ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping + ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() + ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] + ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions + ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine + ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held + ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) + ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated + ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item + ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, + ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease +}; + +// Extend ImGuiSliderFlags_ +enum ImGuiSliderFlagsPrivate_ +{ + ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? + ImGuiSliderFlags_ReadOnly = 1 << 21 +}; + +// Extend ImGuiSelectableFlags_ +enum ImGuiSelectableFlagsPrivate_ +{ + // NB: need to be in sync with last value of ImGuiSelectableFlags_ + ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, + ImGuiSelectableFlags_SelectOnClick = 1 << 21, // Override button behavior to react on Click (default is Click+Release) + ImGuiSelectableFlags_SelectOnRelease = 1 << 22, // Override button behavior to react on Release (default is Click+Release) + ImGuiSelectableFlags_SpanAvailWidth = 1 << 23, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) + ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 24, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow. + ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem) + ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26 // Disable padding each side with ItemSpacing * 0.5f +}; + +// Extend ImGuiTreeNodeFlags_ +enum ImGuiTreeNodeFlagsPrivate_ +{ + ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20 +}; + +enum ImGuiSeparatorFlags_ +{ + ImGuiSeparatorFlags_None = 0, + ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar + ImGuiSeparatorFlags_Vertical = 1 << 1, + ImGuiSeparatorFlags_SpanAllColumns = 1 << 2 +}; + +enum ImGuiTextFlags_ +{ + ImGuiTextFlags_None = 0, + ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0 +}; + +enum ImGuiTooltipFlags_ +{ + ImGuiTooltipFlags_None = 0, + ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append) +}; + +// FIXME: this is in development, not exposed/functional as a generic feature yet. +// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiLayoutType_ +{ + ImGuiLayoutType_Horizontal = 0, + ImGuiLayoutType_Vertical = 1 +}; + +enum ImGuiLogType +{ + ImGuiLogType_None = 0, + ImGuiLogType_TTY, + ImGuiLogType_File, + ImGuiLogType_Buffer, + ImGuiLogType_Clipboard +}; + +// X/Y enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiAxis +{ + ImGuiAxis_None = -1, + ImGuiAxis_X = 0, + ImGuiAxis_Y = 1 +}; + +enum ImGuiPlotType +{ + ImGuiPlotType_Lines, + ImGuiPlotType_Histogram +}; + +enum ImGuiInputSource +{ + ImGuiInputSource_None = 0, + ImGuiInputSource_Mouse, + ImGuiInputSource_Keyboard, + ImGuiInputSource_Gamepad, + ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only + ImGuiInputSource_COUNT +}; + +// FIXME-NAV: Clarify/expose various repeat delay/rate +enum ImGuiInputReadMode +{ + ImGuiInputReadMode_Down, + ImGuiInputReadMode_Pressed, + ImGuiInputReadMode_Released, + ImGuiInputReadMode_Repeat, + ImGuiInputReadMode_RepeatSlow, + ImGuiInputReadMode_RepeatFast +}; + +enum ImGuiNavHighlightFlags_ +{ + ImGuiNavHighlightFlags_None = 0, + ImGuiNavHighlightFlags_TypeDefault = 1 << 0, + ImGuiNavHighlightFlags_TypeThin = 1 << 1, + ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. + ImGuiNavHighlightFlags_NoRounding = 1 << 3 +}; + +enum ImGuiNavDirSourceFlags_ +{ + ImGuiNavDirSourceFlags_None = 0, + ImGuiNavDirSourceFlags_Keyboard = 1 << 0, + ImGuiNavDirSourceFlags_PadDPad = 1 << 1, + ImGuiNavDirSourceFlags_PadLStick = 1 << 2 +}; + +enum ImGuiNavMoveFlags_ +{ + ImGuiNavMoveFlags_None = 0, + ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side + ImGuiNavMoveFlags_LoopY = 1 << 1, + ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) + ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness + ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) + ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible. + ImGuiNavMoveFlags_ScrollToEdge = 1 << 6 +}; + +enum ImGuiNavForward +{ + ImGuiNavForward_None, + ImGuiNavForward_ForwardQueued, + ImGuiNavForward_ForwardActive +}; + +enum ImGuiNavLayer +{ + ImGuiNavLayer_Main = 0, // Main scrolling layer + ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu) + ImGuiNavLayer_COUNT +}; + +enum ImGuiPopupPositionPolicy +{ + ImGuiPopupPositionPolicy_Default, + ImGuiPopupPositionPolicy_ComboBox, + ImGuiPopupPositionPolicy_Tooltip +}; + +struct ImGuiDataTypeTempStorage +{ + ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT +}; + +// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). +struct ImGuiDataTypeInfo +{ + size_t Size; // Size in bytes + const char* Name; // Short descriptive name for the type, for debugging + const char* PrintFmt; // Default printf format for the type + const char* ScanFmt; // Default scanf format for the type +}; + +// Extend ImGuiDataType_ +enum ImGuiDataTypePrivate_ +{ + ImGuiDataType_String = ImGuiDataType_COUNT + 1, + ImGuiDataType_Pointer, + ImGuiDataType_ID +}; + +// Stacked color modifier, backup of modified data so we can restore it +struct ImGuiColorMod +{ + ImGuiCol Col; + ImVec4 BackupValue; +}; + +// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. +struct ImGuiStyleMod +{ + ImGuiStyleVar VarIdx; + union { int BackupInt[2]; float BackupFloat[2]; }; + ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } +}; + +// Stacked storage data for BeginGroup()/EndGroup() +struct IMGUI_API ImGuiGroupData +{ + ImGuiID WindowID; + ImVec2 BackupCursorPos; + ImVec2 BackupCursorMaxPos; + ImVec1 BackupIndent; + ImVec1 BackupGroupOffset; + ImVec2 BackupCurrLineSize; + float BackupCurrLineTextBaseOffset; + ImGuiID BackupActiveIdIsAlive; + bool BackupActiveIdPreviousFrameIsAlive; + bool BackupHoveredIdIsAlive; + bool EmitItem; +}; + +// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. +struct IMGUI_API ImGuiMenuColumns +{ + float Spacing; + float Width, NextWidth; + float Pos[3], NextWidths[3]; + + ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } + void Update(int count, float spacing, bool clear); + float DeclColumns(float w0, float w1, float w2); + float CalcExtraSpace(float avail_w) const; +}; + +// Internal state of the currently focused/edited text input box +// For a given item ID, access with ImGui::GetInputTextState() +struct IMGUI_API ImGuiInputTextState +{ + ImGuiID ID; // widget id owning the text state + int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. + ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. + ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. + ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) + bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) + int BufCapacityA; // end-user buffer capacity + float ScrollX; // horizontal scrolling/offset + ImStb::STB_TexteditState Stb; // state for stb_textedit.h + float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately + bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) + bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection + bool Edited; // edited this frame + ImGuiInputTextFlags UserFlags; // Temporarily set while we call user's callback + ImGuiInputTextCallback UserCallback; // " + void* UserCallbackData; // " + + ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } + void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } + void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } + int GetUndoAvailCount() const { return Stb.undostate.undo_point; } + int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } + void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation + + // Cursor & Selection + void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking + void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } + bool HasSelection() const { return Stb.select_start != Stb.select_end; } + void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } + void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } +}; + +// Storage for current popup stack +struct ImGuiPopupData +{ + ImGuiID PopupId; // Set on OpenPopup() + ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() + ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup + int OpenFrameCount; // Set on OpenPopup() + ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) + ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) + ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup + + ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; } +}; + +struct ImGuiNavMoveResult +{ + ImGuiWindow* Window; // Best candidate window + ImGuiID ID; // Best candidate ID + ImGuiID FocusScopeId; // Best candidate focus scope ID + float DistBox; // Best candidate box distance to current NavId + float DistCenter; // Best candidate center distance to current NavId + float DistAxial; + ImRect RectRel; // Best candidate bounding box in window relative space + + ImGuiNavMoveResult() { Clear(); } + void Clear() { Window = NULL; ID = FocusScopeId = 0; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); } +}; + +enum ImGuiNextWindowDataFlags_ +{ + ImGuiNextWindowDataFlags_None = 0, + ImGuiNextWindowDataFlags_HasPos = 1 << 0, + ImGuiNextWindowDataFlags_HasSize = 1 << 1, + ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, + ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, + ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, + ImGuiNextWindowDataFlags_HasFocus = 1 << 5, + ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, + ImGuiNextWindowDataFlags_HasScroll = 1 << 7 +}; + +// Storage for SetNexWindow** functions +struct ImGuiNextWindowData +{ + ImGuiNextWindowDataFlags Flags; + ImGuiCond PosCond; + ImGuiCond SizeCond; + ImGuiCond CollapsedCond; + ImVec2 PosVal; + ImVec2 PosPivotVal; + ImVec2 SizeVal; + ImVec2 ContentSizeVal; + ImVec2 ScrollVal; + bool CollapsedVal; + ImRect SizeConstraintRect; + ImGuiSizeCallback SizeCallback; + void* SizeCallbackUserData; + float BgAlphaVal; // Override background alpha + ImVec2 MenuBarOffsetMinVal; // *Always on* This is not exposed publicly, so we don't clear it. + + ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } +}; + +enum ImGuiNextItemDataFlags_ +{ + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1 +}; + +struct ImGuiNextItemData +{ + ImGuiNextItemDataFlags Flags; + float Width; // Set by SetNextItemWidth() + ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) + ImGuiCond OpenCond; + bool OpenVal; // Set by SetNextItemOpen() + + ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! +}; + +struct ImGuiShrinkWidthItem +{ + int Index; + float Width; +}; + +struct ImGuiPtrOrIndex +{ + void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. + int Index; // Usually index in a main pool. + + ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } + ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Columns support +//----------------------------------------------------------------------------- + +// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! +enum ImGuiOldColumnFlags_ +{ + ImGuiOldColumnFlags_None = 0, + ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers + ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers + ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns + ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window + ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, + ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, + ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, + ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, + ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, + ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize +#endif +}; + +struct ImGuiOldColumnData +{ + float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) + float OffsetNormBeforeResize; + ImGuiOldColumnFlags Flags; // Not exposed + ImRect ClipRect; + + ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } +}; + +struct ImGuiOldColumns +{ + ImGuiID ID; + ImGuiOldColumnFlags Flags; + bool IsFirstFrame; + bool IsBeingResized; + int Current; + int Count; + float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x + float LineMinY, LineMaxY; + float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() + float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() + ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() + ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() + ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() + ImVector<ImGuiOldColumnData> Columns; + ImDrawListSplitter Splitter; + + ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Multi-select support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_MULTI_SELECT +// <this is filled in 'range_select' branch> +#endif // #ifdef IMGUI_HAS_MULTI_SELECT + +//----------------------------------------------------------------------------- +// [SECTION] Docking support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_DOCK +// <this is filled in 'docking' branch> +#endif // #ifdef IMGUI_HAS_DOCK + +//----------------------------------------------------------------------------- +// [SECTION] Viewport support +//----------------------------------------------------------------------------- + +// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!) +// Every instance of ImGuiViewport is in fact a ImGuiViewportP. +struct ImGuiViewportP : public ImGuiViewport +{ + int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used + ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. + ImDrawData DrawDataP; + ImDrawDataBuilder DrawDataBuilder; + + ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) + ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). + ImVec2 CurrWorkOffsetMin; // Work Area: Offset being built/increased during current frame + ImVec2 CurrWorkOffsetMax; // Work Area: Offset being built/decreased during current frame + + ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } + ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } + ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); } + void UpdateWorkRect() { WorkPos = ImVec2(Pos.x + WorkOffsetMin.x, Pos.y + WorkOffsetMin.y); WorkSize = ImVec2(ImMax(0.0f, Size.x - WorkOffsetMin.x + WorkOffsetMax.x), ImMax(0.0f, Size.y - WorkOffsetMin.y + WorkOffsetMax.y)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Settings support +//----------------------------------------------------------------------------- + +// Windows data saved in imgui.ini file +// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. +// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) +struct ImGuiWindowSettings +{ + ImGuiID ID; + ImVec2ih Pos; + ImVec2ih Size; + bool Collapsed; + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + + ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } + char* GetName() { return (char*)(this + 1); } +}; + +struct ImGuiSettingsHandler +{ + const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' + ImGuiID TypeHash; // == ImHashStr(TypeName) + void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data + void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) + void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" + void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry + void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) + void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' + void* UserData; + + ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Metrics, Debug +//----------------------------------------------------------------------------- + +struct ImGuiMetricsConfig +{ + bool ShowWindowsRects; + bool ShowWindowsBeginOrder; + bool ShowTablesRects; + bool ShowDrawCmdMesh; + bool ShowDrawCmdBoundingBoxes; + int ShowWindowsRectsType; + int ShowTablesRectsType; + + ImGuiMetricsConfig() + { + ShowWindowsRects = false; + ShowWindowsBeginOrder = false; + ShowTablesRects = false; + ShowDrawCmdMesh = true; + ShowDrawCmdBoundingBoxes = true; + ShowWindowsRectsType = -1; + ShowTablesRectsType = -1; + } +}; + +struct IMGUI_API ImGuiStackSizes +{ + short SizeOfIDStack; + short SizeOfColorStack; + short SizeOfStyleVarStack; + short SizeOfFontStack; + short SizeOfFocusScopeStack; + short SizeOfGroupStack; + short SizeOfBeginPopupStack; + + ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } + void SetToCurrentState(); + void CompareWithCurrentState(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Generic context hooks +//----------------------------------------------------------------------------- + +typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); +enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ }; + +struct ImGuiContextHook +{ + ImGuiID HookId; // A unique ID assigned by AddContextHook() + ImGuiContextHookType Type; + ImGuiID Owner; + ImGuiContextHookCallback Callback; + void* UserData; + + ImGuiContextHook() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiContext (main imgui context) +//----------------------------------------------------------------------------- + +struct ImGuiContext +{ + bool Initialized; + bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. + ImGuiIO IO; + ImGuiStyle Style; + ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() + float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. + float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. + ImDrawListSharedData DrawListSharedData; + double Time; + int FrameCount; + int FrameCountEnded; + int FrameCountRendered; + bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() + bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed + bool WithinEndChild; // Set within EndChild() + bool GcCompactAll; // Request full GC + bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() + ImGuiID TestEngineHookIdInfo; // Will call test engine hooks: ImGuiTestEngineHook_IdInfo() from GetID() + void* TestEngine; // Test engine user data + + // Windows state + ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front + ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front. (FIXME: We could only store root windows here! Need to sort out the Docking equivalent which is RootWindowDockStop and is unfortunately a little more dynamic) + ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child + ImVector<ImGuiWindow*> CurrentWindowStack; + ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* + int WindowsActiveCount; // Number of unique windows submitted by frame + ImGuiWindow* CurrentWindow; // Window being drawn into + ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. + ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. + ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. + ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. + ImVec2 WheelingWindowRefMousePos; + float WheelingWindowTimer; + + // Item/widgets state and tracking information + ImGuiID HoveredId; // Hovered widget, filled during the frame + ImGuiID HoveredIdPreviousFrame; + bool HoveredIdAllowOverlap; + bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window. + bool HoveredIdPreviousFrameUsingMouseWheel; + bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. + float HoveredIdTimer; // Measure contiguous hovering time + float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active + ImGuiID ActiveId; // Active widget + ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) + float ActiveIdTimer; + bool ActiveIdIsJustActivated; // Set at the time of activation for one frame + bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) + bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. + bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. + bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. + bool ActiveIdHasBeenEditedThisFrame; + bool ActiveIdUsingMouseWheel; // Active widget will want to read mouse wheel. Blocks scrolling the underlying window. + ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) + ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs. + ImU64 ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array. + ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) + ImGuiWindow* ActiveIdWindow; + ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) + int ActiveIdMouseButton; + ImGuiID ActiveIdPreviousFrame; + bool ActiveIdPreviousFrameIsAlive; + bool ActiveIdPreviousFrameHasBeenEditedBefore; + ImGuiWindow* ActiveIdPreviousFrameWindow; + ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. + float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. + + // Next window/item data + ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions + + // Shared stacks + ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() + ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() + ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() + ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window + ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() + ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() + ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent) + ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) + + // Viewports + ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. + + // Gamepad/keyboard Navigation + ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow' + ImGuiID NavId; // Focused item for navigation + ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) + ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem() + ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0 + ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 + ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 + ImGuiID NavJustTabbedId; // Just tabbed to this id. + ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). + ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). + ImGuiKeyModFlags NavJustMovedToKeyMods; + ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. + ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. + ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. + int NavScoringCount; // Metrics for debugging + ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. + int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing + bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid + bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) + bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) + bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. + bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest + bool NavInitRequest; // Init request for appearing window to select first item + bool NavInitRequestFromMove; + ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) + ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) + bool NavMoveRequest; // Move request for this frame + ImGuiNavMoveFlags NavMoveRequestFlags; + ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu) + ImGuiKeyModFlags NavMoveRequestKeyMods; + ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request + ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? + ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow + ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) + ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) + ImGuiWindow* NavWrapRequestWindow; // Window which requested trying nav wrap-around. + ImGuiNavMoveFlags NavWrapRequestFlags; // Wrap-around operation flags. + + // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) + ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! + ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. + ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents + float NavWindowingTimer; + float NavWindowingHighlightAlpha; + bool NavWindowingToggleLayer; + + // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!) + ImGuiWindow* TabFocusRequestCurrWindow; // + ImGuiWindow* TabFocusRequestNextWindow; // + int TabFocusRequestCurrCounterRegular; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch) + int TabFocusRequestCurrCounterTabStop; // Tab item being requested for focus, stored as an index + int TabFocusRequestNextCounterRegular; // Stored for next frame + int TabFocusRequestNextCounterTabStop; // " + bool TabFocusPressed; // + + // Render + float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) + ImGuiMouseCursor MouseCursor; + + // Drag and Drop + bool DragDropActive; + bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. + bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. + ImGuiDragDropFlags DragDropSourceFlags; + int DragDropSourceFrameCount; + int DragDropMouseButton; + ImGuiPayload DragDropPayload; + ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) + ImGuiID DragDropTargetId; + ImGuiDragDropFlags DragDropAcceptFlags; + float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) + ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) + ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) + int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source + ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. + ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size + unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads + + // Table + ImGuiTable* CurrentTable; + ImPool<ImGuiTable> Tables; + ImVector<ImGuiPtrOrIndex> CurrentTableStack; + ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) + ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer; + + // Tab bars + ImGuiTabBar* CurrentTabBar; + ImPool<ImGuiTabBar> TabBars; + ImVector<ImGuiPtrOrIndex> CurrentTabBarStack; + ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer; + + // Widget state + ImVec2 LastValidMousePos; + ImGuiInputTextState InputTextState; + ImFont InputTextPasswordFont; + ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. + ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets + float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips + float ColorEditLastSat; // Backup of last Saturation associated to LastColor[3], so we can restore Saturation in lossy RGB<>HSV round trips + float ColorEditLastColor[3]; + ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. + float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. + bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? + bool DragCurrentAccumDirty; + float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings + float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio + float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? + int TooltipOverrideCount; + float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) + ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined + ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once + + // Platform support + ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor + ImVec2 PlatformImeLastPos; + char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point + + // Settings + bool SettingsLoaded; + float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero + ImGuiTextBuffer SettingsIniData; // In memory .ini settings + ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers + ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries + ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries + ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine) + ImGuiID HookIdNext; // Next available HookId + + // Capture/Logging + bool LogEnabled; // Currently capturing + ImGuiLogType LogType; // Capture target + ImFileHandle LogFile; // If != NULL log to stdout/ file + ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. + const char* LogNextPrefix; + const char* LogNextSuffix; + float LogLinePosY; + bool LogLineFirstItem; + int LogDepthRef; + int LogDepthToExpand; + int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. + + // Debug Tools + bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) + ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this id + ImGuiMetricsConfig DebugMetricsConfig; + + // Misc + float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds. + int FramerateSecPerFrameIdx; + float FramerateSecPerFrameAccum; + int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags + int WantCaptureKeyboardNextFrame; + int WantTextInputNextFrame; + char TempBuffer[1024 * 3 + 1]; // Temporary text buffer + + ImGuiContext(ImFontAtlas* shared_font_atlas) + { + Initialized = false; + FontAtlasOwnedByContext = shared_font_atlas ? false : true; + Font = NULL; + FontSize = FontBaseSize = 0.0f; + IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); + Time = 0.0f; + FrameCount = 0; + FrameCountEnded = FrameCountRendered = -1; + WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; + GcCompactAll = false; + TestEngineHookItems = false; + TestEngineHookIdInfo = 0; + TestEngine = NULL; + + WindowsActiveCount = 0; + CurrentWindow = NULL; + HoveredWindow = NULL; + HoveredWindowUnderMovingWindow = NULL; + MovingWindow = NULL; + WheelingWindow = NULL; + WheelingWindowTimer = 0.0f; + + HoveredId = HoveredIdPreviousFrame = 0; + HoveredIdAllowOverlap = false; + HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false; + HoveredIdDisabled = false; + HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; + ActiveId = 0; + ActiveIdIsAlive = 0; + ActiveIdTimer = 0.0f; + ActiveIdIsJustActivated = false; + ActiveIdAllowOverlap = false; + ActiveIdNoClearOnFocusLoss = false; + ActiveIdHasBeenPressedBefore = false; + ActiveIdHasBeenEditedBefore = false; + ActiveIdHasBeenEditedThisFrame = false; + ActiveIdUsingMouseWheel = false; + ActiveIdUsingNavDirMask = 0x00; + ActiveIdUsingNavInputMask = 0x00; + ActiveIdUsingKeyInputMask = 0x00; + ActiveIdClickOffset = ImVec2(-1, -1); + ActiveIdWindow = NULL; + ActiveIdSource = ImGuiInputSource_None; + ActiveIdMouseButton = -1; + ActiveIdPreviousFrame = 0; + ActiveIdPreviousFrameIsAlive = false; + ActiveIdPreviousFrameHasBeenEditedBefore = false; + ActiveIdPreviousFrameWindow = NULL; + LastActiveId = 0; + LastActiveIdTimer = 0.0f; + + NavWindow = NULL; + NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; + NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; + NavJustMovedToKeyMods = ImGuiKeyModFlags_None; + NavInputSource = ImGuiInputSource_None; + NavScoringRect = ImRect(); + NavScoringCount = 0; + NavLayer = ImGuiNavLayer_Main; + NavIdTabCounter = INT_MAX; + NavIdIsAlive = false; + NavMousePosDirty = false; + NavDisableHighlight = true; + NavDisableMouseHover = false; + NavAnyRequest = false; + NavInitRequest = false; + NavInitRequestFromMove = false; + NavInitResultId = 0; + NavMoveRequest = false; + NavMoveRequestFlags = ImGuiNavMoveFlags_None; + NavMoveRequestForward = ImGuiNavForward_None; + NavMoveRequestKeyMods = ImGuiKeyModFlags_None; + NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None; + NavWrapRequestWindow = NULL; + NavWrapRequestFlags = ImGuiNavMoveFlags_None; + + NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; + NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; + NavWindowingToggleLayer = false; + + TabFocusRequestCurrWindow = TabFocusRequestNextWindow = NULL; + TabFocusRequestCurrCounterRegular = TabFocusRequestCurrCounterTabStop = INT_MAX; + TabFocusRequestNextCounterRegular = TabFocusRequestNextCounterTabStop = INT_MAX; + TabFocusPressed = false; + + DimBgRatio = 0.0f; + MouseCursor = ImGuiMouseCursor_Arrow; + + DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; + DragDropSourceFlags = ImGuiDragDropFlags_None; + DragDropSourceFrameCount = -1; + DragDropMouseButton = -1; + DragDropTargetId = 0; + DragDropAcceptFlags = ImGuiDragDropFlags_None; + DragDropAcceptIdCurrRectSurface = 0.0f; + DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; + DragDropAcceptFrameCount = -1; + DragDropHoldJustPressedId = 0; + memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); + + CurrentTable = NULL; + CurrentTabBar = NULL; + + LastValidMousePos = ImVec2(0.0f, 0.0f); + TempInputId = 0; + ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; + ColorEditLastHue = ColorEditLastSat = 0.0f; + ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX; + SliderCurrentAccum = 0.0f; + SliderCurrentAccumDirty = false; + DragCurrentAccumDirty = false; + DragCurrentAccum = 0.0f; + DragSpeedDefaultRatio = 1.0f / 100.0f; + ScrollbarClickDeltaToGrabCenter = 0.0f; + TooltipOverrideCount = 0; + TooltipSlowDelay = 0.50f; + + PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX); + PlatformLocaleDecimalPoint = '.'; + + SettingsLoaded = false; + SettingsDirtyTimer = 0.0f; + HookIdNext = 0; + + LogEnabled = false; + LogType = ImGuiLogType_None; + LogNextPrefix = LogNextSuffix = NULL; + LogFile = NULL; + LogLinePosY = FLT_MAX; + LogLineFirstItem = false; + LogDepthRef = 0; + LogDepthToExpand = LogDepthToExpandDefault = 2; + + DebugItemPickerActive = false; + DebugItemPickerBreakId = 0; + + memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); + FramerateSecPerFrameIdx = 0; + FramerateSecPerFrameAccum = 0.0f; + WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; + memset(TempBuffer, 0, sizeof(TempBuffer)); + } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiWindowTempData, ImGuiWindow +//----------------------------------------------------------------------------- + +// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. +// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) +// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) +struct IMGUI_API ImGuiWindowTempData +{ + // Layout + ImVec2 CursorPos; // Current emitting position, in absolute coordinates. + ImVec2 CursorPosPrevLine; + ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. + ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame. + ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame. + ImVec2 CurrLineSize; + ImVec2 PrevLineSize; + float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). + float PrevLineTextBaseOffset; + ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) + ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API. + ImVec1 GroupOffset; + + // Last item status + ImGuiID LastItemId; // ID for last item + ImGuiItemStatusFlags LastItemStatusFlags; // Status flags for last item (see ImGuiItemStatusFlags_) + ImRect LastItemRect; // Interaction rect for last item + ImRect LastItemDisplayRect; // End-user display rect for last item (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect) + + // Keyboard/Gamepad navigation + ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) + int NavLayerActiveMask; // Which layers have been written to (result from previous frame) + int NavLayerActiveMaskNext; // Which layers have been written to (accumulator for current frame) + ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending + bool NavHideHighlightOneFrame; + bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) + + // Miscellaneous + bool MenuBarAppending; // FIXME: Remove this + ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs. + ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement + int TreeDepth; // Current tree depth. + ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. + ImVector<ImGuiWindow*> ChildWindows; + ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) + ImGuiOldColumns* CurrentColumns; // Current columns set + int CurrentTableIdx; // Current table index (into g.Tables) + ImGuiLayoutType LayoutType; + ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() + int FocusCounterRegular; // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign) + int FocusCounterTabStop; // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through. + + // Local parameters stacks + // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. + ImGuiItemFlags ItemFlags; // == g.ItemFlagsStack.back() + float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window). + float TextWrapPos; // Current text wrap pos. + ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth) + ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos) + ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting +}; + +// Storage for one window +struct IMGUI_API ImGuiWindow +{ + char* Name; // Window name, owned by the window. + ImGuiID ID; // == ImHashStr(Name) + ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + ImVec2 Pos; // Position (always rounded-up to nearest pixel) + ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) + ImVec2 SizeFull; // Size when non collapsed + ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding. + ImVec2 ContentSizeIdeal; + ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). + ImVec2 WindowPadding; // Window padding at the time of Begin(). + float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. + float WindowBorderSize; // Window border size at the time of Begin(). + int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! + ImGuiID MoveId; // == window->GetID("#MOVE") + ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) + ImVec2 Scroll; + ImVec2 ScrollMax; + ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) + ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered + ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold + ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar. + bool ScrollbarX, ScrollbarY; // Are scrollbars visible? + bool Active; // Set to true on Begin(), unless Collapsed + bool WasActive; + bool WriteAccessed; // Set to true when any widget access the current window + bool Collapsed; // Set when collapsing window to become only title-bar + bool WantCollapseToggle; + bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) + bool Appearing; // Set during the frame where the window is appearing (or re-appearing) + bool Hidden; // Do not display (== HiddenFrames*** > 0) + bool IsFallbackWindow; // Set on the "Debug##Default" window. + bool HasCloseButton; // Set when the window has a close button (p_open != NULL) + signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) + short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) + short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0. + short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues. + ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) + ImS8 AutoFitFramesX, AutoFitFramesY; + ImS8 AutoFitChildAxises; + bool AutoFitOnlyGrows; + ImGuiDir AutoPosLastDirection; + ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames + ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size + ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only + ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. + ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. + ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. + ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) + ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right. + + ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure) + ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. + + // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. + // The main 'OuterRect', omitted as a field, is window->Rect(). + ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. + ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) + ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. + ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward). + ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack? + ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). + ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on. + ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. + ImVec2ih HitTestHoleOffset; + + int LastFrameActive; // Last frame number the window was Active. + float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) + float ItemWidthDefault; + ImGuiStorage StateStorage; + ImVector<ImGuiOldColumns> ColumnsStorage; + float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() + int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) + + ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) + ImDrawList DrawListInst; + ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL. + ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window == Top-level window. + ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. + ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. + + ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) + ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) + ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space + + int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy + int MemoryDrawListVtxCapacity; + bool MemoryCompacted; // Set when window extraneous data have been garbage collected + +public: + ImGuiWindow(ImGuiContext* context, const char* name); + ~ImGuiWindow(); + + ImGuiID GetID(const char* str, const char* str_end = NULL); + ImGuiID GetID(const void* ptr); + ImGuiID GetID(int n); + ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL); + ImGuiID GetIDNoKeepAlive(const void* ptr); + ImGuiID GetIDNoKeepAlive(int n); + ImGuiID GetIDFromRectangle(const ImRect& r_abs); + + // We don't use g.FontSize because the window may be != g.CurrentWidow. + ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } + float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } + ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } + float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } + ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } +}; + +// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data. +struct ImGuiLastItemDataBackup +{ + ImGuiID LastItemId; + ImGuiItemStatusFlags LastItemStatusFlags; + ImRect LastItemRect; + ImRect LastItemDisplayRect; + + ImGuiLastItemDataBackup() { Backup(); } + void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemStatusFlags = window->DC.LastItemStatusFlags; LastItemRect = window->DC.LastItemRect; LastItemDisplayRect = window->DC.LastItemDisplayRect; } + void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Tab bar, Tab item support +//----------------------------------------------------------------------------- + +// Extend ImGuiTabBarFlags_ +enum ImGuiTabBarFlagsPrivate_ +{ + ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] + ImGuiTabBarFlags_IsFocused = 1 << 21, + ImGuiTabBarFlags_SaveSettings = 1 << 22 // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs +}; + +// Extend ImGuiTabItemFlags_ +enum ImGuiTabItemFlagsPrivate_ +{ + ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) + ImGuiTabItemFlags_Button = 1 << 21 // Used by TabItemButton, change the tab item behavior to mimic a button +}; + +// Storage for one active tab item (sizeof() 28~32 bytes) +struct ImGuiTabItem +{ + ImGuiID ID; + ImGuiTabItemFlags Flags; + int LastFrameVisible; + int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance + float Offset; // Position relative to beginning of tab + float Width; // Width currently displayed + float ContentWidth; // Width of label, stored during BeginTabItem() call + ImS16 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames + ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable + ImS16 IndexDuringLayout; // Index only used during TabBarLayout() + bool WantClose; // Marked as closed by SetTabItemClosed() + + ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = BeginOrder = IndexDuringLayout = -1; } +}; + +// Storage for a tab bar (sizeof() 152 bytes) +struct ImGuiTabBar +{ + ImVector<ImGuiTabItem> Tabs; + ImGuiTabBarFlags Flags; + ImGuiID ID; // Zero for tab-bars used by docking + ImGuiID SelectedTabId; // Selected tab/window + ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation + ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) + int CurrFrameVisible; + int PrevFrameVisible; + ImRect BarRect; + float CurrTabsContentsHeight; + float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar + float WidthAllTabs; // Actual width of all tabs (locked during layout) + float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped + float ScrollingAnim; + float ScrollingTarget; + float ScrollingTargetDistToVisibility; + float ScrollingSpeed; + float ScrollingRectMinX; + float ScrollingRectMaxX; + ImGuiID ReorderRequestTabId; + ImS8 ReorderRequestDir; + ImS8 BeginCount; + bool WantLayout; + bool VisibleTabWasSubmitted; + bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame + ImS16 TabsActiveCount; // Number of tabs submitted this frame. + ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() + float ItemSpacingY; + ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() + ImVec2 BackupCursorPos; + ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. + + ImGuiTabBar(); + int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } + const char* GetTabName(const ImGuiTabItem* tab) const + { + IM_ASSERT(tab->NameOffset != -1 && (int)tab->NameOffset < TabsNames.Buf.Size); + return TabsNames.Buf.Data + tab->NameOffset; + } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Table support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_TABLE + +#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. +#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64. +#define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels() + +// Our current column maximum is 64 but we may raise that in the future. +typedef ImS8 ImGuiTableColumnIdx; +typedef ImU8 ImGuiTableDrawChannelIdx; + +// [Internal] sizeof() ~ 104 +// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. +// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. +// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". +struct ImGuiTableColumn +{ + ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ + float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space. + float MinX; // Absolute positions + float MaxX; + float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() + float WidthAuto; // Automatic width + float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. + float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). + ImRect ClipRect; // Clipping rectangle for the column + ImGuiID UserID; // Optional, value passed to TableSetupColumn() + float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column + float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) + float ItemWidth; // Current item width for the column, preserved across rows + float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. + float ContentMaxXUnfrozen; + float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls + float ContentMaxXHeadersIdeal; + ImS16 NameOffset; // Offset into parent ColumnsNames[] + ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) + ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) + ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column + ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column + ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort + ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx DrawChannelFrozen; + ImGuiTableDrawChannelIdx DrawChannelUnfrozen; + bool IsEnabled; // Is the column not marked Hidden by the user? (even if off view, e.g. clipped by scrolling). + bool IsEnabledNextFrame; + bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). + bool IsVisibleY; + bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. + bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). + bool IsPreserveWidthAuto; + ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte + ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit + ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem + ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending + ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) + ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) + ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) + + ImGuiTableColumn() + { + memset(this, 0, sizeof(*this)); + StretchWeight = WidthRequest = -1.0f; + NameOffset = -1; + DisplayOrder = IndexWithinEnabledSet = -1; + PrevEnabledColumn = NextEnabledColumn = -1; + SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; + } +}; + +// Transient cell data stored per row. +// sizeof() ~ 6 +struct ImGuiTableCellData +{ + ImU32 BgColor; // Actual color + ImGuiTableColumnIdx Column; // Column number +}; + +// FIXME-TABLE: transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData +struct ImGuiTable +{ + ImGuiID ID; + ImGuiTableFlags Flags; + void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] + ImSpan<ImGuiTableColumn> Columns; // Point within RawData[] + ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) + ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row. + ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map + ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data + ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) + ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items) + ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) + int SettingsOffset; // Offset in g.SettingsTables + int LastFrameActive; + int ColumnsCount; // Number of columns declared in BeginTable() + int CurrentRow; + int CurrentColumn; + ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. + ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with + float RowPosY1; + float RowPosY2; + float RowMinHeight; // Height submitted to TableNextRow() + float RowTextBaseline; + float RowIndentOffsetX; + ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ + ImGuiTableRowFlags LastRowFlags : 16; + int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this. + ImU32 RowBgColor[2]; // Background color override for current row. + ImU32 BorderColorStrong; + ImU32 BorderColorLight; + float BorderX1; + float BorderX2; + float HostIndentX; + float MinColumnWidth; + float OuterPaddingX; + float CellPaddingX; // Padding from each borders + float CellPaddingY; + float CellSpacingX1; // Spacing between non-bordered cells + float CellSpacingX2; + float LastOuterHeight; // Outer height from last frame + float LastFirstRowHeight; // Height of first row from last frame + float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. + float ColumnsGivenWidth; // Sum of current column width + float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window + float ResizedColumnNextWidth; + float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). + ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is + ImRect WorkRect; + ImRect InnerClipRect; + ImRect BgClipRect; // We use this to cpu-clip cell background color fill + ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped + ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect. + ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. + ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() + ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() + ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() + ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() + ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() + ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() + ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() + ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() + float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() + int HostBackupItemWidthStackSize;// Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() + ImGuiWindow* OuterWindow; // Parent window for the table + ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) + ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names + ImDrawListSplitter DrawSplitter; // We carry our own ImDrawList splitter to allow recursion (FIXME: could be stored outside, worst case we need 1 splitter per recursing table) + ImGuiTableColumnSortSpecs SortSpecsSingle; + ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would work be good. + ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() + ImGuiTableColumnIdx SortSpecsCount; + ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() + ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! + ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). + ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. + ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. + ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. + ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. + ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) + ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 + ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column. + ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. + ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. + ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. + ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot + ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count + ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count + ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row + ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. + ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; + bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. + bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). + bool IsInitializing; + bool IsSortSpecsDirty; + bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. + bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). + bool IsSettingsRequestLoad; + bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. + bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) + bool IsResetAllRequest; + bool IsResetDisplayOrderRequest; + bool IsUnfrozenRows; // Set when we got past the frozen row. + bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() + bool MemoryCompacted; + bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis + + IMGUI_API ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } + IMGUI_API ~ImGuiTable() { IM_FREE(RawData); } +}; + +// sizeof() ~ 12 +struct ImGuiTableColumnSettings +{ + float WidthOrWeight; + ImGuiID UserID; + ImGuiTableColumnIdx Index; + ImGuiTableColumnIdx DisplayOrder; + ImGuiTableColumnIdx SortOrder; + ImU8 SortDirection : 2; + ImU8 IsEnabled : 1; // "Visible" in ini file + ImU8 IsStretch : 1; + + ImGuiTableColumnSettings() + { + WidthOrWeight = 0.0f; + UserID = 0; + Index = -1; + DisplayOrder = SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + IsEnabled = 1; + IsStretch = 0; + } +}; + +// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) +struct ImGuiTableSettings +{ + ImGuiID ID; // Set to 0 to invalidate/delete the setting + ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImGuiTableColumnIdx ColumnsCount; + ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + + ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } + ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } +}; + +#endif // #ifdef IMGUI_HAS_TABLE + +//----------------------------------------------------------------------------- +// [SECTION] ImGui internal API +// No guarantee of forward compatibility here! +//----------------------------------------------------------------------------- + +namespace ImGui +{ + // Windows + // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) + // If this ever crash because g.CurrentWindow is NULL it means that either + // - ImGui::NewFrame() has never been called, which is illegal. + // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. + inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } + inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } + IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); + IMGUI_API ImGuiWindow* FindWindowByName(const char* name); + IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); + IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); + IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); + IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); + IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); + IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window); + IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); + IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); + IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); + IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); + + // Windows: Display Order and Focus Order + IMGUI_API void FocusWindow(ImGuiWindow* window); + IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); + IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); + + // Fonts, drawing + IMGUI_API void SetCurrentFont(ImFont* font); + inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } + inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. + IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. + IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + + // Init + IMGUI_API void Initialize(ImGuiContext* context); + IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). + + // NewFrame + IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); + IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); + IMGUI_API void UpdateMouseMovingWindowNewFrame(); + IMGUI_API void UpdateMouseMovingWindowEndFrame(); + + // Generic context hooks + IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); + IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove); + IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); + + // Settings + IMGUI_API void MarkIniSettingsDirty(); + IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); + IMGUI_API void ClearIniSettings(); + IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); + IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); + IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); + IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); + + // Scrolling + IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is + IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); + IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); + IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); + IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); + IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect); + + // Basic Accessors + inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) + inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemStatusFlags; } + inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } + inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } + inline ImGuiItemFlags GetItemsFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.ItemFlags; } + IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void ClearActiveID(); + IMGUI_API ImGuiID GetHoveredID(); + IMGUI_API void SetHoveredID(ImGuiID id); + IMGUI_API void KeepAliveID(ImGuiID id); + IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. + IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) + IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); + + // Basic Helpers for widget code + IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); + IMGUI_API void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f); + IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL); + IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); + IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); + IMGUI_API void SetLastItemData(ImGuiWindow* window, ImGuiID item_id, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); + IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id); // Return true if focus is requested + IMGUI_API void FocusableItemUnregister(ImGuiWindow* window); + IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); + IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); + IMGUI_API void PushMultiItemsWidths(int components, float width_full); + IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); + IMGUI_API void PopItemFlag(); + IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) + IMGUI_API ImVec2 GetContentRegionMaxAbs(); + IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess); + + // Logging/Capture + IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. + IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer + IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); + IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); + + // Popups, Modals, Tooltips + IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); + IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); + IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); + IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); + IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); + IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); + IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags); + IMGUI_API ImGuiWindow* GetTopMostPopupModal(); + IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); + IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy); + + // Gamepad/Keyboard Navigation + IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); + IMGUI_API bool NavMoveRequestButNoResultYet(); + IMGUI_API void NavMoveRequestCancel(); + IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const ImRect& bb_rel, ImGuiNavMoveFlags move_flags); + IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); + IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode); + IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f); + IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); + IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. + IMGUI_API void SetNavID(ImGuiID id, int nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); + + // Focus Scope (WIP) + // This is generally used to identify a selection set (multiple of which may be in the same window), as selection + // patterns generally need to react (e.g. clear selection) when landing on an item of the set. + IMGUI_API void PushFocusScope(ImGuiID id); + IMGUI_API void PopFocusScope(); + inline ImGuiID GetFocusedFocusScope() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; } // Focus scope which is actually active + inline ImGuiID GetFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; } // Focus scope we are outputting into, set by PushFocusScope() + + // Inputs + // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. + IMGUI_API void SetItemUsingMouseWheel(); + inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } + inline bool IsActiveIdUsingNavInput(ImGuiNavInput input) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; } + inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; } + IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); + inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; } + inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; } + inline bool IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); } + IMGUI_API ImGuiKeyModFlags GetMergedKeyModFlags(); + + // Drag and Drop + IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); + IMGUI_API void ClearDragDrop(); + IMGUI_API bool IsDragDropPayloadBeingAccepted(); + + // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) + IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); + IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). + IMGUI_API void EndColumns(); // close columns + IMGUI_API void PushColumnClipRect(int column_index); + IMGUI_API void PushColumnsBackground(); + IMGUI_API void PopColumnsBackground(); + IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); + IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); + IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); + IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); + + // Tables: Candidates for public API + IMGUI_API void TableOpenContextMenu(int column_n = -1); + IMGUI_API void TableSetColumnEnabled(int column_n, bool enabled); + IMGUI_API void TableSetColumnWidth(int column_n, float width); + IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); + IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API float TableGetHeaderRowHeight(); + IMGUI_API void TablePushBackgroundChannel(); + IMGUI_API void TablePopBackgroundChannel(); + + // Tables: Internals + inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } + IMGUI_API ImGuiTable* TableFindByID(ImGuiID id); + IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); + IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count); + IMGUI_API void TableBeginApplyRequests(ImGuiTable* table); + IMGUI_API void TableSetupDrawChannels(ImGuiTable* table); + IMGUI_API void TableUpdateLayout(ImGuiTable* table); + IMGUI_API void TableUpdateBorders(ImGuiTable* table); + IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); + IMGUI_API void TableDrawBorders(ImGuiTable* table); + IMGUI_API void TableDrawContextMenu(ImGuiTable* table); + IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); + IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table); + IMGUI_API void TableSortSpecsBuild(ImGuiTable* table); + IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column); + IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API void TableBeginRow(ImGuiTable* table); + IMGUI_API void TableEndRow(ImGuiTable* table); + IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n); + IMGUI_API void TableEndCell(ImGuiTable* table); + IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n); + IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n); + IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0); + IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table); + IMGUI_API void TableRemove(ImGuiTable* table); + IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table); + IMGUI_API void TableGcCompactSettings(); + + // Tables: Settings + IMGUI_API void TableLoadSettings(ImGuiTable* table); + IMGUI_API void TableSaveSettings(ImGuiTable* table); + IMGUI_API void TableResetSettings(ImGuiTable* table); + IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table); + IMGUI_API void TableSettingsInstallHandler(ImGuiContext* context); + IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count); + IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id); + + // Tab Bars + IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); + IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir); + IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar); + IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); + IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button); + IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); + IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped); + + // Render helpers + // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. + // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) + IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); + IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); + IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known); + IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); + IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); + IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); + IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight + IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. + + // Render helpers (those functions don't access any ImGui state!) + IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f); + IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col); + IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); + IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); + IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); + IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); + IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect inner, ImU32 col, float rounding); + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + // [1.71: 2019/06/07: Updating prototypes of some of the internal functions. Leaving those for reference for a short while] + inline void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale=1.0f) { ImGuiWindow* window = GetCurrentWindow(); RenderArrow(window->DrawList, pos, GetColorU32(ImGuiCol_Text), dir, scale); } + inline void RenderBullet(ImVec2 pos) { ImGuiWindow* window = GetCurrentWindow(); RenderBullet(window->DrawList, pos, GetColorU32(ImGuiCol_Text)); } +#endif + + // Widgets + IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); + IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); + IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); + IMGUI_API void Scrollbar(ImGuiAxis axis); + IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float avail_v, float contents_v, ImDrawFlags flags); + IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col); + IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowResizeID(ImGuiWindow* window, int n); // 0..3: corners, 4..7: borders + IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags); + IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); + IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value); + + // Widgets low-level behaviors + IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); + IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags); + IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); + IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); + IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextItemOpen() data, if any. May return true when logging + IMGUI_API void TreePushOverrideID(ImGuiID id); + + // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. + // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). + // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); " + template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags); + template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); + template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value); + + // Data type helpers + IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); + IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); + IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format); + IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); + + // InputText + IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags); + IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); + inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } + inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active + + // Color + IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); + + // Plot + IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); + + // Shade functions (write over already created vertices) + IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); + IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); + + // Garbage collection + IMGUI_API void GcCompactTransientMiscBuffers(); + IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window); + IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window); + + // Debug Tools + IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); + inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(window->DC.LastItemRect.Min, window->DC.LastItemRect.Max, col); } + inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } + + IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); + IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); + IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); + IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label); + IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); + IMGUI_API void DebugNodeTable(ImGuiTable* table); + IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); + IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); + IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); + IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label); + IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport); + IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); + +} // namespace ImGui + + +//----------------------------------------------------------------------------- +// [SECTION] ImFontAtlas internal API +//----------------------------------------------------------------------------- + +// This structure is likely to evolve as we add support for incremental atlas updates +struct ImFontBuilderIO +{ + bool (*FontBuilder_Build)(ImFontAtlas* atlas); +}; + +// Helper for font builder +IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); +IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); +IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); +IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); +IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); + +//----------------------------------------------------------------------------- +// [SECTION] Test Engine specific hooks (imgui_test_engine) +//----------------------------------------------------------------------------- + +#ifdef IMGUI_ENABLE_TEST_ENGINE +extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); +extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); +extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id); +extern void ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id, const void* data_id_end); +extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...); +#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional) +#define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log +#define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA)); +#define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) if (g.TestEngineHookIdInfo == id) ImGuiTestEngineHook_IdInfo(&g, _TYPE, _ID, (const void*)(_DATA), (const void*)(_DATA2)); +#else +#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) do { } while (0) +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) do { } while (0) +#define IMGUI_TEST_ENGINE_LOG(_FMT,...) do { } while (0) +#define IMGUI_TEST_ENGINE_ID_INFO(_ID,_TYPE,_DATA) do { } while (0) +#define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2) do { } while (0) +#endif + +//----------------------------------------------------------------------------- + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_tables.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_tables.cpp new file mode 100644 index 0000000000..edeef738ab --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_tables.cpp @@ -0,0 +1,3953 @@ +// dear imgui, v1.82 +// (tables and columns code) + +/* + +Index of this file: + +// [SECTION] Commentary +// [SECTION] Header mess +// [SECTION] Tables: Main code +// [SECTION] Tables: Row changes +// [SECTION] Tables: Columns changes +// [SECTION] Tables: Columns width management +// [SECTION] Tables: Drawing +// [SECTION] Tables: Sorting +// [SECTION] Tables: Headers +// [SECTION] Tables: Context Menu +// [SECTION] Tables: Settings (.ini data) +// [SECTION] Tables: Garbage Collection +// [SECTION] Tables: Debugging +// [SECTION] Columns, BeginColumns, EndColumns, etc. + +*/ + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +//----------------------------------------------------------------------------- +// [SECTION] Commentary +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Typical tables call flow: (root level is generally public API): +//----------------------------------------------------------------------------- +// - BeginTable() user begin into a table +// | BeginChild() - (if ScrollX/ScrollY is set) +// | TableBeginInitMemory() - first time table is used +// | TableResetSettings() - on settings reset +// | TableLoadSettings() - on settings load +// | TableBeginApplyRequests() - apply queued resizing/reordering/hiding requests +// | - TableSetColumnWidth() - apply resizing width (for mouse resize, often requested by previous frame) +// | - TableUpdateColumnsWeightFromWidth()- recompute columns weights (of stretch columns) from their respective width +// - TableSetupColumn() user submit columns details (optional) +// - TableSetupScrollFreeze() user submit scroll freeze information (optional) +//----------------------------------------------------------------------------- +// - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). +// | TableSetupDrawChannels() - setup ImDrawList channels +// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission +// | TableDrawContextMenu() - draw right-click context menu +//----------------------------------------------------------------------------- +// - TableHeadersRow() or TableHeader() user submit a headers row (optional) +// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction +// | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu +// - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers) +// - TableNextRow() user begin into a new row (also automatically called by TableHeadersRow()) +// | TableEndRow() - finish existing row +// | TableBeginRow() - add a new row +// - TableSetColumnIndex() / TableNextColumn() user begin into a cell +// | TableEndCell() - close existing column/cell +// | TableBeginCell() - enter into current column/cell +// - [...] user emit contents +//----------------------------------------------------------------------------- +// - EndTable() user ends the table +// | TableDrawBorders() - draw outer borders, inner vertical borders +// | TableMergeDrawChannels() - merge draw channels if clipping isn't required +// | EndChild() - (if ScrollX/ScrollY is set) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// TABLE SIZING +//----------------------------------------------------------------------------- +// (Read carefully because this is subtle but it does make sense!) +//----------------------------------------------------------------------------- +// About 'outer_size': +// Its meaning needs to differ slightly depending of if we are using ScrollX/ScrollY flags. +// Default value is ImVec2(0.0f, 0.0f). +// X +// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge. +// - outer_size.x > 0.0f -> Set Fixed width. +// Y with ScrollX/ScrollY disabled: we output table directly in current window +// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) +// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) +// Y with ScrollX/ScrollY enabled: using a child window for scrolling +// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. +// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis. +//----------------------------------------------------------------------------- +// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags. +// Important to that note how the two flags have slightly different behaviors! +// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. +// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. +// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height. +// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable) +//----------------------------------------------------------------------------- +// About 'inner_width': +// With ScrollX disabled: +// - inner_width -> *ignored* +// With ScrollX enabled: +// - inner_width < 0.0f -> *illegal* fit in known width (right align from outer_size.x) <-- weird +// - inner_width = 0.0f -> fit in outer_width: Fixed size columns will take space they need (if avail, otherwise shrink down), Stretch columns becomes Fixed columns. +// - inner_width > 0.0f -> override scrolling width, generally to be larger than outer_size.x. Fixed column take space they need (if avail, otherwise shrink down), Stretch columns share remaining space! +//----------------------------------------------------------------------------- +// Details: +// - If you want to use Stretch columns with ScrollX, you generally need to specify 'inner_width' otherwise the concept +// of "available space" doesn't make sense. +// - Even if not really useful, we allow 'inner_width < outer_size.x' for consistency and to facilitate understanding +// of what the value does. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// COLUMNS SIZING POLICIES +//----------------------------------------------------------------------------- +// About overriding column sizing policy and width/weight with TableSetupColumn(): +// We use a default parameter of 'init_width_or_weight == -1'. +// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic +// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom +// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f +// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom +// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f) +// and you can fit a 100.0f wide item in it without clipping and with full padding. +//----------------------------------------------------------------------------- +// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag) +// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width +// - with Table policy ImGuiTableFlags_SizingFixedSame --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is max of all contents width +// - with Table policy ImGuiTableFlags_SizingStretchSame --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is 1.0f +// - with Table policy ImGuiTableFlags_SizingStretchWeight --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is proportional to contents +// Default Width and default Weight can be overridden when calling TableSetupColumn(). +//----------------------------------------------------------------------------- +// About mixing Fixed/Auto and Stretch columns together: +// - the typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place! +// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in. +// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the maximum contents width. +// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths. +//----------------------------------------------------------------------------- +// About using column width: +// If a column is manual resizable or has a width specified with TableSetupColumn(): +// - you may use GetContentRegionAvail().x to query the width available in a given column. +// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width. +// If the column is not resizable and has no width specified with TableSetupColumn(): +// - its width will be automatic and be the set to the max of items submitted. +// - therefore you generally cannot have ALL items of the columns use e.g. SetNextItemWidth(-FLT_MIN). +// - but if the column has one or more item of known/fixed size, this will become the reference width used by SetNextItemWidth(-FLT_MIN). +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// TABLES CLIPPING/CULLING +//----------------------------------------------------------------------------- +// About clipping/culling of Rows in Tables: +// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows. +// ImGuiListClipper is reliant on the fact that rows are of equal height. +// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper. +// - Note that auto-resizing columns don't play well with using the clipper. +// By default a table with _ScrollX but without _Resizable will have column auto-resize. +// So, if you want to use the clipper, make sure to either enable _Resizable, either setup columns width explicitly with _WidthFixed. +//----------------------------------------------------------------------------- +// About clipping/culling of Columns in Tables: +// - Both TableSetColumnIndex() and TableNextColumn() return true when the column is visible or performing +// width measurements. Otherwise, you may skip submitting the contents of a cell/column, BUT ONLY if you know +// it is not going to contribute to row height. +// In many situations, you may skip submitting contents for every columns but one (e.g. the first one). +// - Case A: column is not hidden by user, and at least partially in sight (most common case). +// - Case B: column is clipped / out of sight (because of scrolling or parent ClipRect): TableNextColumn() return false as a hint but we still allow layout output. +// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.). +// +// [A] [B] [C] +// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height. +// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output. +// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way. +// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway). +// +// - We need distinguish those cases because non-hidden columns that are clipped outside of scrolling bounds should still contribute their height to the row. +// However, in the majority of cases, the contribution to row height is the same for all columns, or the tallest cells are known by the programmer. +//----------------------------------------------------------------------------- +// About clipping/culling of whole Tables: +// - Scrolling tables with a known outer size can be clipped earlier as BeginTable() will return false. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include "imgui_internal.h" + +// System includes +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include <stddef.h> // intptr_t +#else +#include <stdint.h> // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Tables: Main code +//----------------------------------------------------------------------------- + +// Configuration +static const int TABLE_DRAW_CHANNEL_BG0 = 0; +static const int TABLE_DRAW_CHANNEL_BG2_FROZEN = 1; +static const int TABLE_DRAW_CHANNEL_NOCLIP = 2; // When using ImGuiTableFlags_NoClip (this becomes the last visible channel) +static const float TABLE_BORDER_SIZE = 1.0f; // FIXME-TABLE: Currently hard-coded because of clipping assumptions with outer borders rendering. +static const float TABLE_RESIZE_SEPARATOR_HALF_THICKNESS = 4.0f; // Extend outside inner borders. +static const float TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER = 0.06f; // Delay/timer before making the hover feedback (color+cursor) visible because tables/columns tends to be more cramped. + +// Helper +inline ImGuiTableFlags TableFixFlags(ImGuiTableFlags flags, ImGuiWindow* outer_window) +{ + // Adjust flags: set default sizing policy + if ((flags & ImGuiTableFlags_SizingMask_) == 0) + flags |= ((flags & ImGuiTableFlags_ScrollX) || (outer_window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) ? ImGuiTableFlags_SizingFixedFit : ImGuiTableFlags_SizingStretchSame; + + // Adjust flags: enable NoKeepColumnsVisible when using ImGuiTableFlags_SizingFixedSame + if ((flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableFlags_NoKeepColumnsVisible; + + // Adjust flags: enforce borders when resizable + if (flags & ImGuiTableFlags_Resizable) + flags |= ImGuiTableFlags_BordersInnerV; + + // Adjust flags: disable NoHostExtendX/NoHostExtendY if we have any scrolling going on + if (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) + flags &= ~(ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_NoHostExtendY); + + // Adjust flags: NoBordersInBodyUntilResize takes priority over NoBordersInBody + if (flags & ImGuiTableFlags_NoBordersInBodyUntilResize) + flags &= ~ImGuiTableFlags_NoBordersInBody; + + // Adjust flags: disable saved settings if there's nothing to save + if ((flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Sortable)) == 0) + flags |= ImGuiTableFlags_NoSavedSettings; + + // Inherit _NoSavedSettings from top-level window (child windows always have _NoSavedSettings set) +#ifdef IMGUI_HAS_DOCK + ImGuiWindow* window_for_settings = outer_window->RootWindowDockStop; +#else + ImGuiWindow* window_for_settings = outer_window->RootWindow; +#endif + if (window_for_settings->Flags & ImGuiWindowFlags_NoSavedSettings) + flags |= ImGuiTableFlags_NoSavedSettings; + + return flags; +} + +ImGuiTable* ImGui::TableFindByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + return g.Tables.GetByKey(id); +} + +// Read about "TABLE SIZING" at the top of this file. +bool ImGui::BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiID id = GetID(str_id); + return BeginTableEx(str_id, id, columns_count, flags, outer_size, inner_width); +} + +bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* outer_window = GetCurrentWindow(); + if (outer_window->SkipItems) // Consistent with other tables + beneficial side effect that assert on miscalling EndTable() will be more visible. + return false; + + // Sanity checks + IM_ASSERT(columns_count > 0 && columns_count <= IMGUI_TABLE_MAX_COLUMNS && "Only 1..64 columns allowed!"); + if (flags & ImGuiTableFlags_ScrollX) + IM_ASSERT(inner_width >= 0.0f); + + // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping rules may evolve. + const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; + const ImVec2 avail_size = GetContentRegionAvail(); + ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); + ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); + if (use_child_window && IsClippedEx(outer_rect, 0, false)) + { + ItemSize(outer_rect); + return false; + } + + // Acquire storage for the table + ImGuiTable* table = g.Tables.GetOrAddByKey(id); + const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const ImGuiID instance_id = id + instance_no; + const ImGuiTableFlags table_last_flags = table->Flags; + if (instance_no > 0) + IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID"); + + // Fix flags + table->IsDefaultSizingPolicy = (flags & ImGuiTableFlags_SizingMask_) == 0; + flags = TableFixFlags(flags, outer_window); + + // Initialize + table->ID = id; + table->Flags = flags; + table->InstanceCurrent = (ImS16)instance_no; + table->LastFrameActive = g.FrameCount; + table->OuterWindow = table->InnerWindow = outer_window; + table->ColumnsCount = columns_count; + table->IsLayoutLocked = false; + table->InnerWidth = inner_width; + table->UserOuterSize = outer_size; + + // When not using a child window, WorkRect.Max will grow as we append contents. + if (use_child_window) + { + // Ensure no vertical scrollbar appears if we only want horizontal one, to make flag consistent + // (we have no other way to disable vertical scrollbar of a window while keeping the horizontal one showing) + ImVec2 override_content_size(FLT_MAX, FLT_MAX); + if ((flags & ImGuiTableFlags_ScrollX) && !(flags & ImGuiTableFlags_ScrollY)) + override_content_size.y = FLT_MIN; + + // Ensure specified width (when not specified, Stretched columns will act as if the width == OuterWidth and + // never lead to any scrolling). We don't handle inner_width < 0.0f, we could potentially use it to right-align + // based on the right side of the child window work rect, which would require knowing ahead if we are going to + // have decoration taking horizontal spaces (typically a vertical scrollbar). + if ((flags & ImGuiTableFlags_ScrollX) && inner_width > 0.0f) + override_content_size.x = inner_width; + + if (override_content_size.x != FLT_MAX || override_content_size.y != FLT_MAX) + SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); + + // Reset scroll if we are reactivating it + if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) + SetNextWindowScroll(ImVec2(0.0f, 0.0f)); + + // Create scrolling region (without border and zero window padding) + ImGuiWindowFlags child_flags = (flags & ImGuiTableFlags_ScrollX) ? ImGuiWindowFlags_HorizontalScrollbar : ImGuiWindowFlags_None; + BeginChildEx(name, instance_id, outer_rect.GetSize(), false, child_flags); + table->InnerWindow = g.CurrentWindow; + table->WorkRect = table->InnerWindow->WorkRect; + table->OuterRect = table->InnerWindow->Rect(); + table->InnerRect = table->InnerWindow->InnerRect; + IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); + } + else + { + // For non-scrolling tables, WorkRect == OuterRect == InnerRect. + // But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable(). + table->WorkRect = table->OuterRect = table->InnerRect = outer_rect; + } + + // Push a standardized ID for both child-using and not-child-using tables + PushOverrideID(instance_id); + + // Backup a copy of host window members we will modify + ImGuiWindow* inner_window = table->InnerWindow; + table->HostIndentX = inner_window->DC.Indent.x; + table->HostClipRect = inner_window->ClipRect; + table->HostSkipItems = inner_window->SkipItems; + table->HostBackupWorkRect = inner_window->WorkRect; + table->HostBackupParentWorkRect = inner_window->ParentWorkRect; + table->HostBackupColumnsOffset = outer_window->DC.ColumnsOffset; + table->HostBackupPrevLineSize = inner_window->DC.PrevLineSize; + table->HostBackupCurrLineSize = inner_window->DC.CurrLineSize; + table->HostBackupCursorMaxPos = inner_window->DC.CursorMaxPos; + table->HostBackupItemWidth = outer_window->DC.ItemWidth; + table->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; + inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + + // Padding and Spacing + // - None ........Content..... Pad .....Content........ + // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | + // - PadInner ........Content.. Pad | Pad ..Content........ + // - PadOuter+PadInner | Pad ..Content.. Pad | Pad ..Content.. Pad | + const bool pad_outer_x = (flags & ImGuiTableFlags_NoPadOuterX) ? false : (flags & ImGuiTableFlags_PadOuterX) ? true : (flags & ImGuiTableFlags_BordersOuterV) != 0; + const bool pad_inner_x = (flags & ImGuiTableFlags_NoPadInnerX) ? false : true; + const float inner_spacing_for_border = (flags & ImGuiTableFlags_BordersInnerV) ? TABLE_BORDER_SIZE : 0.0f; + const float inner_spacing_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) == 0) ? g.Style.CellPadding.x : 0.0f; + const float inner_padding_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) != 0) ? g.Style.CellPadding.x : 0.0f; + table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; + table->CellSpacingX2 = inner_spacing_explicit; + table->CellPaddingX = inner_padding_explicit; + table->CellPaddingY = g.Style.CellPadding.y; + + const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; + table->OuterPaddingX = (outer_padding_for_border + outer_padding_explicit) - table->CellPaddingX; + + table->CurrentColumn = -1; + table->CurrentRow = -1; + table->RowBgColorCounter = 0; + table->LastRowFlags = ImGuiTableRowFlags_None; + table->InnerClipRect = (inner_window == outer_window) ? table->WorkRect : inner_window->ClipRect; + table->InnerClipRect.ClipWith(table->WorkRect); // We need this to honor inner_width + table->InnerClipRect.ClipWithFull(table->HostClipRect); + table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : inner_window->ClipRect.Max.y; + + table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow + table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() + table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any + table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; + table->IsUnfrozenRows = true; + table->DeclColumnsCount = 0; + + // Using opaque colors facilitate overlapping elements of the grid + table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); + table->BorderColorLight = GetColorU32(ImGuiCol_TableBorderLight); + + // Make table current + const int table_idx = g.Tables.GetIndex(table); + g.CurrentTableStack.push_back(ImGuiPtrOrIndex(table_idx)); + g.CurrentTable = table; + outer_window->DC.CurrentTableIdx = table_idx; + if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. + inner_window->DC.CurrentTableIdx = table_idx; + + if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) + table->IsResetDisplayOrderRequest = true; + + // Mark as used + if (table_idx >= g.TablesLastTimeActive.Size) + g.TablesLastTimeActive.resize(table_idx + 1, -1.0f); + g.TablesLastTimeActive[table_idx] = (float)g.Time; + table->MemoryCompacted = false; + + // Setup memory buffer (clear data if columns count changed) + const int stored_size = table->Columns.size(); + if (stored_size != 0 && stored_size != columns_count) + { + IM_FREE(table->RawData); + table->RawData = NULL; + } + if (table->RawData == NULL) + { + TableBeginInitMemory(table, columns_count); + table->IsInitializing = table->IsSettingsRequestLoad = true; + } + if (table->IsResetAllRequest) + TableResetSettings(table); + if (table->IsInitializing) + { + // Initialize + table->SettingsOffset = -1; + table->IsSortSpecsDirty = true; + table->InstanceInteracted = -1; + table->ContextPopupColumn = -1; + table->ReorderColumn = table->ResizedColumn = table->LastResizedColumn = -1; + table->AutoFitSingleColumn = -1; + table->HoveredColumnBody = table->HoveredColumnBorder = -1; + for (int n = 0; n < columns_count; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + float width_auto = column->WidthAuto; + *column = ImGuiTableColumn(); + column->WidthAuto = width_auto; + column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker + column->DisplayOrder = table->DisplayOrderToIndex[n] = (ImGuiTableColumnIdx)n; + column->IsEnabled = column->IsEnabledNextFrame = true; + } + } + + // Load settings + if (table->IsSettingsRequestLoad) + TableLoadSettings(table); + + // Handle DPI/font resize + // This is designed to facilitate DPI changes with the assumption that e.g. style.CellPadding has been scaled as well. + // It will also react to changing fonts with mixed results. It doesn't need to be perfect but merely provide a decent transition. + // FIXME-DPI: Provide consistent standards for reference size. Perhaps using g.CurrentDpiScale would be more self explanatory. + // This is will lead us to non-rounded WidthRequest in columns, which should work but is a poorly tested path. + const float new_ref_scale_unit = g.FontSize; // g.Font->GetCharAdvance('A') ? + if (table->RefScale != 0.0f && table->RefScale != new_ref_scale_unit) + { + const float scale_factor = new_ref_scale_unit / table->RefScale; + //IMGUI_DEBUG_LOG("[table] %08X RefScaleUnit %.3f -> %.3f, scaling width by %.3f\n", table->ID, table->RefScaleUnit, new_ref_scale_unit, scale_factor); + for (int n = 0; n < columns_count; n++) + table->Columns[n].WidthRequest = table->Columns[n].WidthRequest * scale_factor; + } + table->RefScale = new_ref_scale_unit; + + // Disable output until user calls TableNextRow() or TableNextColumn() leading to the TableUpdateLayout() call.. + // This is not strictly necessary but will reduce cases were "out of table" output will be misleading to the user. + // Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option. + inner_window->SkipItems = true; + + // Clear names + // At this point the ->NameOffset field of each column will be invalid until TableUpdateLayout() or the first call to TableSetupColumn() + if (table->ColumnsNames.Buf.Size > 0) + table->ColumnsNames.Buf.resize(0); + + // Apply queued resizing/reordering/hiding requests + TableBeginApplyRequests(table); + + return true; +} + +// For reference, the average total _allocation count_ for a table is: +// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables) +// + 1 (for table->RawData allocated below) +// + 1 (for table->ColumnsNames, if names are used) +// + 1 (for table->Splitter._Channels) +// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels) +// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details. +// Unused channels don't perform their +2 allocations. +void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count) +{ + // Allocate single buffer for our arrays + ImSpanAllocator<3> span_allocator; + span_allocator.Reserve(0, columns_count * sizeof(ImGuiTableColumn)); + span_allocator.Reserve(1, columns_count * sizeof(ImGuiTableColumnIdx)); + span_allocator.Reserve(2, columns_count * sizeof(ImGuiTableCellData), 4); + table->RawData = IM_ALLOC(span_allocator.GetArenaSizeInBytes()); + memset(table->RawData, 0, span_allocator.GetArenaSizeInBytes()); + span_allocator.SetArenaBasePtr(table->RawData); + span_allocator.GetSpan(0, &table->Columns); + span_allocator.GetSpan(1, &table->DisplayOrderToIndex); + span_allocator.GetSpan(2, &table->RowCellData); +} + +// Apply queued resizing/reordering/hiding requests +void ImGui::TableBeginApplyRequests(ImGuiTable* table) +{ + // Handle resizing request + // (We process this at the first TableBegin of the frame) + // FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling? + if (table->InstanceCurrent == 0) + { + if (table->ResizedColumn != -1 && table->ResizedColumnNextWidth != FLT_MAX) + TableSetColumnWidth(table->ResizedColumn, table->ResizedColumnNextWidth); + table->LastResizedColumn = table->ResizedColumn; + table->ResizedColumnNextWidth = FLT_MAX; + table->ResizedColumn = -1; + + // Process auto-fit for single column, which is a special case for stretch columns and fixed columns with FixedSame policy. + // FIXME-TABLE: Would be nice to redistribute available stretch space accordingly to other weights, instead of giving it all to siblings. + if (table->AutoFitSingleColumn != -1) + { + TableSetColumnWidth(table->AutoFitSingleColumn, table->Columns[table->AutoFitSingleColumn].WidthAuto); + table->AutoFitSingleColumn = -1; + } + } + + // Handle reordering request + // Note: we don't clear ReorderColumn after handling the request. + if (table->InstanceCurrent == 0) + { + if (table->HeldHeaderColumn == -1 && table->ReorderColumn != -1) + table->ReorderColumn = -1; + table->HeldHeaderColumn = -1; + if (table->ReorderColumn != -1 && table->ReorderColumnDir != 0) + { + // We need to handle reordering across hidden columns. + // In the configuration below, moving C to the right of E will lead to: + // ... C [D] E ---> ... [D] E C (Column name/index) + // ... 2 3 4 ... 2 3 4 (Display order) + const int reorder_dir = table->ReorderColumnDir; + IM_ASSERT(reorder_dir == -1 || reorder_dir == +1); + IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable); + ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn]; + ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevEnabledColumn : src_column->NextEnabledColumn]; + IM_UNUSED(dst_column); + const int src_order = src_column->DisplayOrder; + const int dst_order = dst_column->DisplayOrder; + src_column->DisplayOrder = (ImGuiTableColumnIdx)dst_order; + for (int order_n = src_order + reorder_dir; order_n != dst_order + reorder_dir; order_n += reorder_dir) + table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder -= (ImGuiTableColumnIdx)reorder_dir; + IM_ASSERT(dst_column->DisplayOrder == dst_order - reorder_dir); + + // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[], + // rebuild the later from the former. + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; + table->ReorderColumnDir = 0; + table->IsSettingsDirty = true; + } + } + + // Handle display order reset request + if (table->IsResetDisplayOrderRequest) + { + for (int n = 0; n < table->ColumnsCount; n++) + table->DisplayOrderToIndex[n] = table->Columns[n].DisplayOrder = (ImGuiTableColumnIdx)n; + table->IsResetDisplayOrderRequest = false; + table->IsSettingsDirty = true; + } +} + +// Adjust flags: default width mode + stretch columns are not allowed when auto extending +static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, ImGuiTableColumnFlags flags_in) +{ + ImGuiTableColumnFlags flags = flags_in; + + // Sizing Policy + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0) + { + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + if (table_sizing_policy == ImGuiTableFlags_SizingFixedFit || table_sizing_policy == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + else + flags |= ImGuiTableColumnFlags_WidthStretch; + } + else + { + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_WidthMask_)); // Check that only 1 of each set is used. + } + + // Resize + if ((table->Flags & ImGuiTableFlags_Resizable) == 0) + flags |= ImGuiTableColumnFlags_NoResize; + + // Sorting + if ((flags & ImGuiTableColumnFlags_NoSortAscending) && (flags & ImGuiTableColumnFlags_NoSortDescending)) + flags |= ImGuiTableColumnFlags_NoSort; + + // Indentation + if ((flags & ImGuiTableColumnFlags_IndentMask_) == 0) + flags |= (table->Columns.index_from_ptr(column) == 0) ? ImGuiTableColumnFlags_IndentEnable : ImGuiTableColumnFlags_IndentDisable; + + // Alignment + //if ((flags & ImGuiTableColumnFlags_AlignMask_) == 0) + // flags |= ImGuiTableColumnFlags_AlignCenter; + //IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_AlignMask_)); // Check that only 1 of each set is used. + + // Preserve status flags + column->Flags = flags | (column->Flags & ImGuiTableColumnFlags_StatusMask_); + + // Build an ordered list of available sort directions + column->SortDirectionsAvailCount = column->SortDirectionsAvailMask = column->SortDirectionsAvailList = 0; + if (table->Flags & ImGuiTableFlags_Sortable) + { + int count = 0, mask = 0, list = 0; + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) != 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) != 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) == 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) == 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((table->Flags & ImGuiTableFlags_SortTristate) || count == 0) { mask |= 1 << ImGuiSortDirection_None; count++; } + column->SortDirectionsAvailList = (ImU8)list; + column->SortDirectionsAvailMask = (ImU8)mask; + column->SortDirectionsAvailCount = (ImU8)count; + ImGui::TableFixColumnSortDirection(table, column); + } +} + +// Layout columns for the frame. This is in essence the followup to BeginTable(). +// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first. +// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns. +// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns? +void ImGui::TableUpdateLayout(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->IsLayoutLocked == false); + + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + table->IsDefaultDisplayOrder = true; + table->ColumnsEnabledCount = 0; + table->EnabledMaskByIndex = 0x00; + table->EnabledMaskByDisplayOrder = 0x00; + table->LeftMostEnabledColumn = -1; + table->MinColumnWidth = ImMax(1.0f, g.Style.FramePadding.x * 1.0f); // g.Style.ColumnsMinSpacing; // FIXME-TABLE + + // [Part 1] Apply/lock Enabled and Order states. Calculate auto/ideal width for columns. Count fixed/stretch columns. + // Process columns in their visible orders as we are building the Prev/Next indices. + int count_fixed = 0; // Number of columns that have fixed sizing policies + int count_stretch = 0; // Number of columns that have stretch sizing policies + int prev_visible_column_idx = -1; + bool has_auto_fit_request = false; + bool has_resizable = false; + float stretch_sum_width_auto = 0.0f; + float fixed_max_width_auto = 0.0f; + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + if (column_n != order_n) + table->IsDefaultDisplayOrder = false; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Clear column setup if not submitted by user. Currently we make it mandatory to call TableSetupColumn() every frame. + // It would easily work without but we're not ready to guarantee it since e.g. names need resubmission anyway. + // We take a slight shortcut but in theory we could be calling TableSetupColumn() here with dummy values, it should yield the same effect. + if (table->DeclColumnsCount <= column_n) + { + TableSetupColumnFlags(table, column, ImGuiTableColumnFlags_None); + column->NameOffset = -1; + column->UserID = 0; + column->InitStretchWeightOrWidth = -1.0f; + } + + // Update Enabled state, mark settings/sortspecs dirty + if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide)) + column->IsEnabledNextFrame = true; + if (column->IsEnabled != column->IsEnabledNextFrame) + { + column->IsEnabled = column->IsEnabledNextFrame; + table->IsSettingsDirty = true; + if (!column->IsEnabled && column->SortOrder != -1) + table->IsSortSpecsDirty = true; + } + if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_SortMulti)) + table->IsSortSpecsDirty = true; + + // Auto-fit unsized columns + const bool start_auto_fit = (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? (column->WidthRequest < 0.0f) : (column->StretchWeight < 0.0f); + if (start_auto_fit) + column->AutoFitQueue = column->CannotSkipItemsQueue = (1 << 3) - 1; // Fit for three frames + + if (!column->IsEnabled) + { + column->IndexWithinEnabledSet = -1; + continue; + } + + // Mark as enabled and link to previous/next enabled column + column->PrevEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + column->NextEnabledColumn = -1; + if (prev_visible_column_idx != -1) + table->Columns[prev_visible_column_idx].NextEnabledColumn = (ImGuiTableColumnIdx)column_n; + else + table->LeftMostEnabledColumn = (ImGuiTableColumnIdx)column_n; + column->IndexWithinEnabledSet = table->ColumnsEnabledCount++; + table->EnabledMaskByIndex |= (ImU64)1 << column_n; + table->EnabledMaskByDisplayOrder |= (ImU64)1 << column->DisplayOrder; + prev_visible_column_idx = column_n; + IM_ASSERT(column->IndexWithinEnabledSet <= column->DisplayOrder); + + // Calculate ideal/auto column width (that's the width required for all contents to be visible without clipping) + // Combine width from regular rows + width from headers unless requested not to. + if (!column->IsPreserveWidthAuto) + column->WidthAuto = TableGetColumnWidthAuto(table, column); + + // Non-resizable columns keep their requested width (apply user value regardless of IsPreserveWidthAuto) + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column_is_resizable) + has_resizable = true; + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f && !column_is_resizable) + column->WidthAuto = column->InitStretchWeightOrWidth; + + if (column->AutoFitQueue != 0x00) + has_auto_fit_request = true; + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + stretch_sum_width_auto += column->WidthAuto; + count_stretch++; + } + else + { + fixed_max_width_auto = ImMax(fixed_max_width_auto, column->WidthAuto); + count_fixed++; + } + } + if ((table->Flags & ImGuiTableFlags_Sortable) && table->SortSpecsCount == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + table->IsSortSpecsDirty = true; + table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); + + // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible + // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). + // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. + if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) + table->InnerWindow->SkipItems = false; + if (has_auto_fit_request) + table->IsSettingsDirty = true; + + // [Part 3] Fix column flags and record a few extra information. + float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding. + float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns. + table->LeftMostStretchedColumn = table->RightMostStretchedColumn = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column->Flags & ImGuiTableColumnFlags_WidthFixed) + { + // Apply same widths policy + float width_auto = column->WidthAuto; + if (table_sizing_policy == ImGuiTableFlags_SizingFixedSame && (column->AutoFitQueue != 0x00 || !column_is_resizable)) + width_auto = fixed_max_width_auto; + + // Apply automatic width + // Latch initial size for fixed columns and update it constantly for auto-resizing column (unless clipped!) + if (column->AutoFitQueue != 0x00) + column->WidthRequest = width_auto; + else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n))) + column->WidthRequest = width_auto; + + // FIXME-TABLE: Increase minimum size during init frame to avoid biasing auto-fitting widgets + // (e.g. TextWrapped) too much. Otherwise what tends to happen is that TextWrapped would output a very + // large height (= first frame scrollbar display very off + clipper would skip lots of items). + // This is merely making the side-effect less extreme, but doesn't properly fixes it. + // FIXME: Move this to ->WidthGiven to avoid temporary lossyless? + // FIXME: This break IsPreserveWidthAuto from not flickering if the stored WidthAuto was smaller. + if (column->AutoFitQueue > 0x01 && table->IsInitializing && !column->IsPreserveWidthAuto) + column->WidthRequest = ImMax(column->WidthRequest, table->MinColumnWidth * 4.0f); // FIXME-TABLE: Another constant/scale? + sum_width_requests += column->WidthRequest; + } + else + { + // Initialize stretch weight + if (column->AutoFitQueue != 0x00 || column->StretchWeight < 0.0f || !column_is_resizable) + { + if (column->InitStretchWeightOrWidth > 0.0f) + column->StretchWeight = column->InitStretchWeightOrWidth; + else if (table_sizing_policy == ImGuiTableFlags_SizingStretchProp) + column->StretchWeight = (column->WidthAuto / stretch_sum_width_auto) * count_stretch; + else + column->StretchWeight = 1.0f; + } + + stretch_sum_weights += column->StretchWeight; + if (table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder > column->DisplayOrder) + table->LeftMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + if (table->RightMostStretchedColumn == -1 || table->Columns[table->RightMostStretchedColumn].DisplayOrder < column->DisplayOrder) + table->RightMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + } + column->IsPreserveWidthAuto = false; + sum_width_requests += table->CellPaddingX * 2.0f; + } + table->ColumnsEnabledFixedCount = (ImGuiTableColumnIdx)count_fixed; + + // [Part 4] Apply final widths based on requested widths + const ImRect work_rect = table->WorkRect; + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + const float width_avail = ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth(); + const float width_avail_for_stretched_columns = width_avail - width_spacings - sum_width_requests; + float width_remaining_for_stretched_columns = width_avail_for_stretched_columns; + table->ColumnsGivenWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Allocate width for stretched/weighted columns (StretchWeight gets converted into WidthRequest) + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + float weight_ratio = column->StretchWeight / stretch_sum_weights; + column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); + width_remaining_for_stretched_columns -= column->WidthRequest; + } + + // [Resize Rule 1] The right-most Visible column is not resizable if there is at least one Stretch column + // See additional comments in TableSetColumnWidth(). + if (column->NextEnabledColumn == -1 && table->LeftMostStretchedColumn != -1) + column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; + + // Assign final width, record width in case we will need to shrink + column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); + table->ColumnsGivenWidth += column->WidthGiven; + } + + // [Part 5] Redistribute stretch remainder width due to rounding (remainder width is < 1.0f * number of Stretch column). + // Using right-to-left distribution (more likely to match resizing cursor). + if (width_remaining_for_stretched_columns >= 1.0f && !(table->Flags & ImGuiTableFlags_PreciseWidths)) + for (int order_n = table->ColumnsCount - 1; stretch_sum_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; + if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->WidthRequest += 1.0f; + column->WidthGiven += 1.0f; + width_remaining_for_stretched_columns -= 1.0f; + } + + table->HoveredColumnBody = -1; + table->HoveredColumnBorder = -1; + const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table->LastOuterHeight)); + const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); + + // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column + // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. + int visible_n = 0; + bool offset_x_frozen = (table->FreezeColumnsCount > 0); + float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; + ImRect host_clip_rect = table->InnerClipRect; + //host_clip_rect.Max.x += table->CellPaddingX + table->CellSpacingX2; + table->VisibleMaskByIndex = 0x00; + table->RequestOutputMaskByIndex = 0x00; + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + + column->NavLayerCurrent = (ImS8)((table->FreezeRowsCount > 0 || column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); + + if (offset_x_frozen && table->FreezeColumnsCount == visible_n) + { + offset_x += work_rect.Min.x - table->OuterRect.Min.x; + offset_x_frozen = false; + } + + // Clear status flags + column->Flags &= ~ImGuiTableColumnFlags_StatusMask_; + + if ((table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0) + { + // Hidden column: clear a few fields and we are done with it for the remainder of the function. + // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper. + column->MinX = column->MaxX = column->WorkMinX = column->ClipRect.Min.x = column->ClipRect.Max.x = offset_x; + column->WidthGiven = 0.0f; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + column->IsVisibleX = column->IsVisibleY = column->IsRequestOutput = false; + column->IsSkipItems = true; + column->ItemWidth = 1.0f; + continue; + } + + // Detect hovered column + if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) + table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; + + // Lock start position + column->MinX = offset_x; + + // Lock width based on start position and minimum/maximum width for this position + float max_width = TableGetMaxColumnWidth(table, column_n); + column->WidthGiven = ImMin(column->WidthGiven, max_width); + column->WidthGiven = ImMax(column->WidthGiven, ImMin(column->WidthRequest, table->MinColumnWidth)); + column->MaxX = offset_x + column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + + // Lock other positions + // - ClipRect.Min.x: Because merging draw commands doesn't compare min boundaries, we make ClipRect.Min.x match left bounds to be consistent regardless of merging. + // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. + // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. + // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. + column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; + column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max + column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); + column->ClipRect.Min.x = column->MinX; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + + // Mark column as Clipped (not in sight) + // Note that scrolling tables (where inner_window != outer_window) handle Y clipped earlier in BeginTable() so IsVisibleY really only applies to non-scrolling tables. + // FIXME-TABLE: Because InnerClipRect.Max.y is conservatively ==outer_window->ClipRect.Max.y, we never can mark columns _Above_ the scroll line as not IsVisibleY. + // Taking advantage of LastOuterHeight would yield good results there... + // FIXME-TABLE: Y clipping is disabled because it effectively means not submitting will reduce contents width which is fed to outer_window->DC.CursorMaxPos.x, + // and this may be used (e.g. typically by outer_window using AlwaysAutoResize or outer_window's horizontal scrollbar, but could be something else). + // Possible solution to preserve last known content width for clipped column. Test 'table_reported_size' fails when enabling Y clipping and window is resized small. + column->IsVisibleX = (column->ClipRect.Max.x > column->ClipRect.Min.x); + column->IsVisibleY = true; // (column->ClipRect.Max.y > column->ClipRect.Min.y); + const bool is_visible = column->IsVisibleX; //&& column->IsVisibleY; + if (is_visible) + table->VisibleMaskByIndex |= ((ImU64)1 << column_n); + + // Mark column as requesting output from user. Note that fixed + non-resizable sets are auto-fitting at all times and therefore always request output. + column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; + if (column->IsRequestOutput) + table->RequestOutputMaskByIndex |= ((ImU64)1 << column_n); + + // Mark column as SkipItems (ignoring all items/layout) + column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; + if (column->IsSkipItems) + IM_ASSERT(!is_visible); + + // Update status flags + column->Flags |= ImGuiTableColumnFlags_IsEnabled; + if (is_visible) + column->Flags |= ImGuiTableColumnFlags_IsVisible; + if (column->SortOrder != -1) + column->Flags |= ImGuiTableColumnFlags_IsSorted; + if (table->HoveredColumnBody == column_n) + column->Flags |= ImGuiTableColumnFlags_IsHovered; + + // Alignment + // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in + // many cases (to be able to honor this we might be able to store a log of cells width, per row, for + // visible rows, but nav/programmatic scroll would have visible artifacts.) + //if (column->Flags & ImGuiTableColumnFlags_AlignRight) + // column->WorkMinX = ImMax(column->WorkMinX, column->MaxX - column->ContentWidthRowsUnfrozen); + //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) + // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); + + // Reset content width variables + column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; + column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; + + // Don't decrement auto-fit counters until container window got a chance to submit its items + if (table->HostSkipItems == false) + { + column->AutoFitQueue >>= 1; + column->CannotSkipItemsQueue >>= 1; + } + + if (visible_n < table->FreezeColumnsCount) + host_clip_rect.Min.x = ImClamp(column->MaxX + TABLE_BORDER_SIZE, host_clip_rect.Min.x, host_clip_rect.Max.x); + + offset_x += column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + visible_n++; + } + + // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) + // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either + // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. + const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); + if (is_hovering_table && table->HoveredColumnBody == -1) + { + if (g.IO.MousePos.x >= unused_x1) + table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; + } + if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) + table->Flags &= ~ImGuiTableFlags_Resizable; + + // [Part 8] Lock actual OuterRect/WorkRect right-most position. + // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. + // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. + if (table->RightMostStretchedColumn != -1) + table->Flags &= ~ImGuiTableFlags_NoHostExtendX; + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + table->OuterRect.Max.x = table->WorkRect.Max.x = unused_x1; + table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); + } + table->InnerWindow->ParentWorkRect = table->WorkRect; + table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); + table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); + + // [Part 9] Allocate draw channels and setup background cliprect + TableSetupDrawChannels(table); + + // [Part 10] Hit testing on borders + if (table->Flags & ImGuiTableFlags_Resizable) + TableUpdateBorders(table); + table->LastFirstRowHeight = 0.0f; + table->IsLayoutLocked = true; + table->IsUsingHeaders = false; + + // [Part 11] Context menu + if (table->IsContextPopupOpen && table->InstanceCurrent == table->InstanceInteracted) + { + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + if (BeginPopupEx(context_menu_id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) + { + TableDrawContextMenu(table); + EndPopup(); + } + else + { + table->IsContextPopupOpen = false; + } + } + + // [Part 13] Sanitize and build sort specs before we have a change to use them for display. + // This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change) + if (table->IsSortSpecsDirty && (table->Flags & ImGuiTableFlags_Sortable)) + TableSortSpecsBuild(table); + + // Initial state + ImGuiWindow* inner_window = table->InnerWindow; + if (table->Flags & ImGuiTableFlags_NoClip) + table->DrawSplitter.SetCurrentChannel(inner_window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + else + inner_window->DrawList->PushClipRect(inner_window->ClipRect.Min, inner_window->ClipRect.Max, false); +} + +// Process hit-testing on resizing borders. Actual size change will be applied in EndTable() +// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise +// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets +// overlapping the same area. +void ImGui::TableUpdateBorders(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->Flags & ImGuiTableFlags_Resizable); + + // At this point OuterRect height may be zero or under actual final height, so we rely on temporal coherency and + // use the final height from last frame. Because this is only affecting _interaction_ with columns, it is not + // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). + // Actual columns highlight/render will be performed in EndTable() and not be affected. + const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; + const float hit_y1 = table->OuterRect.Min.y; + const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table->LastOuterHeight); + const float hit_y2_head = hit_y1 + table->LastFirstRowHeight; + + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) + continue; + + // ImGuiTableFlags_NoBordersInBodyUntilResize will be honored in TableDrawBorders() + const float border_y2_hit = (table->Flags & ImGuiTableFlags_NoBordersInBody) ? hit_y2_head : hit_y2_body; + if ((table->Flags & ImGuiTableFlags_NoBordersInBody) && table->IsUsingHeaders == false) + continue; + + if (table->FreezeColumnsCount > 0) + if (column->MaxX < table->Columns[table->DisplayOrderToIndex[table->FreezeColumnsCount - 1]].MaxX) + continue; + + ImGuiID column_id = TableGetColumnResizeID(table, column_n, table->InstanceCurrent); + ImRect hit_rect(column->MaxX - hit_half_width, hit_y1, column->MaxX + hit_half_width, border_y2_hit); + //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); + KeepAliveID(column_id); + + bool hovered = false, held = false; + bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick); + if (pressed && IsMouseDoubleClicked(0)) + { + TableSetColumnWidthAutoSingle(table, column_n); + ClearActiveID(); + held = hovered = false; + } + if (held) + { + if (table->LastResizedColumn == -1) + table->ResizeLockMinContentsX2 = table->RightMostEnabledColumn != -1 ? table->Columns[table->RightMostEnabledColumn].MaxX : -FLT_MAX; + table->ResizedColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + } + if ((hovered && g.HoveredIdTimer > TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER) || held) + { + table->HoveredColumnBorder = (ImGuiTableColumnIdx)column_n; + SetMouseCursor(ImGuiMouseCursor_ResizeEW); + } + } +} + +void ImGui::EndTable() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Only call EndTable() if BeginTable() returns true!"); + + // This assert would be very useful to catch a common error... unfortunately it would probably trigger in some + // cases, and for consistency user may sometimes output empty tables (and still benefit from e.g. outer border) + //IM_ASSERT(table->IsLayoutLocked && "Table unused: never called TableNextRow(), is that the intent?"); + + // If the user never got to call TableNextRow() or TableNextColumn(), we call layout ourselves to ensure all our + // code paths are consistent (instead of just hoping that TableBegin/TableEnd will work), get borders drawn, etc. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + const ImGuiTableFlags flags = table->Flags; + ImGuiWindow* inner_window = table->InnerWindow; + ImGuiWindow* outer_window = table->OuterWindow; + IM_ASSERT(inner_window == g.CurrentWindow); + IM_ASSERT(outer_window == inner_window || outer_window == inner_window->ParentWindow); + + if (table->IsInsideRow) + TableEndRow(table); + + // Context menu in columns body + if (flags & ImGuiTableFlags_ContextMenuInBody) + if (table->HoveredColumnBody != -1 && !IsAnyItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + TableOpenContextMenu((int)table->HoveredColumnBody); + + // Finalize table height + inner_window->DC.PrevLineSize = table->HostBackupPrevLineSize; + inner_window->DC.CurrLineSize = table->HostBackupCurrLineSize; + inner_window->DC.CursorMaxPos = table->HostBackupCursorMaxPos; + const float inner_content_max_y = table->RowPosY2; + IM_ASSERT(table->RowPosY2 == inner_window->DC.CursorPos.y); + if (inner_window != outer_window) + inner_window->DC.CursorMaxPos.y = inner_content_max_y; + else if (!(flags & ImGuiTableFlags_NoHostExtendY)) + table->OuterRect.Max.y = table->InnerRect.Max.y = ImMax(table->OuterRect.Max.y, inner_content_max_y); // Patch OuterRect/InnerRect height + table->WorkRect.Max.y = ImMax(table->WorkRect.Max.y, table->OuterRect.Max.y); + table->LastOuterHeight = table->OuterRect.GetHeight(); + + // Setup inner scrolling range + // FIXME: This ideally should be done earlier, in BeginTable() SetNextWindowContentSize call, just like writing to inner_window->DC.CursorMaxPos.y, + // but since the later is likely to be impossible to do we'd rather update both axises together. + if (table->Flags & ImGuiTableFlags_ScrollX) + { + const float outer_padding_for_border = (table->Flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + float max_pos_x = table->InnerWindow->DC.CursorMaxPos.x; + if (table->RightMostEnabledColumn != -1) + max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); + if (table->ResizedColumn != -1) + max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); + table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; + } + + // Pop clipping rect + if (!(flags & ImGuiTableFlags_NoClip)) + inner_window->DrawList->PopClipRect(); + inner_window->ClipRect = inner_window->DrawList->_ClipRectStack.back(); + + // Draw borders + if ((flags & ImGuiTableFlags_Borders) != 0) + TableDrawBorders(table); + +#if 0 + // Strip out dummy channel draw calls + // We have no way to prevent user submitting direct ImDrawList calls into a hidden column (but ImGui:: calls will be clipped out) + // Pros: remove draw calls which will have no effect. since they'll have zero-size cliprect they may be early out anyway. + // Cons: making it harder for users watching metrics/debugger to spot the wasted vertices. + if (table->DummyDrawChannel != (ImGuiTableColumnIdx)-1) + { + ImDrawChannel* dummy_channel = &table->DrawSplitter._Channels[table->DummyDrawChannel]; + dummy_channel->_CmdBuffer.resize(0); + dummy_channel->_IdxBuffer.resize(0); + } +#endif + + // Flatten channels and merge draw calls + table->DrawSplitter.SetCurrentChannel(inner_window->DrawList, 0); + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + TableMergeDrawChannels(table); + table->DrawSplitter.Merge(inner_window->DrawList); + + // Update ColumnsAutoFitWidth to get us ahead for host using our size to auto-resize without waiting for next BeginTable() + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + table->ColumnsAutoFitWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (table->EnabledMaskByIndex & ((ImU64)1 << column_n)) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !(column->Flags & ImGuiTableColumnFlags_NoResize)) + table->ColumnsAutoFitWidth += column->WidthRequest; + else + table->ColumnsAutoFitWidth += TableGetColumnWidthAuto(table, column); + } + + // Update scroll + if ((table->Flags & ImGuiTableFlags_ScrollX) == 0 && inner_window != outer_window) + { + inner_window->Scroll.x = 0.0f; + } + else if (table->LastResizedColumn != -1 && table->ResizedColumn == -1 && inner_window->ScrollbarX && table->InstanceInteracted == table->InstanceCurrent) + { + // When releasing a column being resized, scroll to keep the resulting column in sight + const float neighbor_width_to_keep_visible = table->MinColumnWidth + table->CellPaddingX * 2.0f; + ImGuiTableColumn* column = &table->Columns[table->LastResizedColumn]; + if (column->MaxX < table->InnerClipRect.Min.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x - neighbor_width_to_keep_visible, 1.0f); + else if (column->MaxX > table->InnerClipRect.Max.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x + neighbor_width_to_keep_visible, 1.0f); + } + + // Apply resizing/dragging at the end of the frame + if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) + { + ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; + const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); + const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); + table->ResizedColumnNextWidth = new_width; + } + + // Pop from id stack + IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table->ID + table->InstanceCurrent, "Mismatching PushID/PopID!"); + IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= table->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); + PopID(); + + // Restore window data that we modified + const ImVec2 backup_outer_max_pos = outer_window->DC.CursorMaxPos; + inner_window->WorkRect = table->HostBackupWorkRect; + inner_window->ParentWorkRect = table->HostBackupParentWorkRect; + inner_window->SkipItems = table->HostSkipItems; + outer_window->DC.CursorPos = table->OuterRect.Min; + outer_window->DC.ItemWidth = table->HostBackupItemWidth; + outer_window->DC.ItemWidthStack.Size = table->HostBackupItemWidthStackSize; + outer_window->DC.ColumnsOffset = table->HostBackupColumnsOffset; + + // Layout in outer window + // (FIXME: To allow auto-fit and allow desirable effect of SameLine() we dissociate 'used' vs 'ideal' size by overriding + // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) + if (inner_window != outer_window) + { + EndChild(); + } + else + { + ItemSize(table->OuterRect.GetSize()); + ItemAdd(table->OuterRect, 0); + } + + // Override declared contents width/height to enable auto-resize while not needlessly adding a scrollbar + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + // FIXME-TABLE: Could we remove this section? + // ColumnsAutoFitWidth may be one frame ahead here since for Fixed+NoResize is calculated from latest contents + IM_ASSERT((table->Flags & ImGuiTableFlags_ScrollX) == 0); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth); + } + else if (table->UserOuterSize.x <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; + outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - table->UserOuterSize.x); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); + } + else + { + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Max.x); + } + if (table->UserOuterSize.y <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f; + outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - table->UserOuterSize.y); + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y)); + } + else + { + // OuterRect.Max.y may already have been pushed downward from the initial value (unless ImGuiTableFlags_NoHostExtendY is set) + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, table->OuterRect.Max.y); + } + + // Save settings + if (table->IsSettingsDirty) + TableSaveSettings(table); + table->IsInitializing = false; + + // Clear or restore current table, if any + IM_ASSERT(g.CurrentWindow == outer_window && g.CurrentTable == table); + g.CurrentTableStack.pop_back(); + g.CurrentTable = g.CurrentTableStack.Size ? g.Tables.GetByIndex(g.CurrentTableStack.back().Index) : NULL; + outer_window->DC.CurrentTableIdx = g.CurrentTable ? g.Tables.GetIndex(g.CurrentTable) : -1; +} + +// See "COLUMN SIZING POLICIES" comments at the top of this file +// If (init_width_or_weight <= 0.0f) it is ignored +void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call call TableSetupColumn() before first row!"); + IM_ASSERT((flags & ImGuiTableColumnFlags_StatusMask_) == 0 && "Illegal to pass StatusMask values to TableSetupColumn()"); + if (table->DeclColumnsCount >= table->ColumnsCount) + { + IM_ASSERT_USER_ERROR(table->DeclColumnsCount < table->ColumnsCount, "Called TableSetupColumn() too many times!"); + return; + } + + ImGuiTableColumn* column = &table->Columns[table->DeclColumnsCount]; + table->DeclColumnsCount++; + + // Assert when passing a width or weight if policy is entirely left to default, to avoid storing width into weight and vice-versa. + // Give a grace to users of ImGuiTableFlags_ScrollX. + if (table->IsDefaultSizingPolicy && (flags & ImGuiTableColumnFlags_WidthMask_) == 0 && (flags & ImGuiTableFlags_ScrollX) == 0) + IM_ASSERT(init_width_or_weight <= 0.0f && "Can only specify width/weight if sizing policy is set explicitly in either Table or Column."); + + // When passing a width automatically enforce WidthFixed policy + // (whereas TableSetupColumnFlags would default to WidthAuto if table is not Resizable) + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) + if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + + TableSetupColumnFlags(table, column, flags); + column->UserID = user_id; + flags = column->Flags; + + // Initialize defaults + column->InitStretchWeightOrWidth = init_width_or_weight; + if (table->IsInitializing) + { + // Init width or weight + if (column->WidthRequest < 0.0f && column->StretchWeight < 0.0f) + { + if ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f) + column->WidthRequest = init_width_or_weight; + if (flags & ImGuiTableColumnFlags_WidthStretch) + column->StretchWeight = (init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f; + + // Disable auto-fit if an explicit width/weight has been specified + if (init_width_or_weight > 0.0f) + column->AutoFitQueue = 0x00; + } + + // Init default visibility/sort state + if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0) + column->IsEnabled = column->IsEnabledNextFrame = false; + if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0) + { + column->SortOrder = 0; // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs. + column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending); + } + } + + // Store name (append with zero-terminator in contiguous buffer) + column->NameOffset = -1; + if (label != NULL && label[0] != 0) + { + column->NameOffset = (ImS16)table->ColumnsNames.size(); + table->ColumnsNames.append(label, label + strlen(label) + 1); + } +} + +// [Public] +void ImGui::TableSetupScrollFreeze(int columns, int rows) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!"); + IM_ASSERT(columns >= 0 && columns < IMGUI_TABLE_MAX_COLUMNS); + IM_ASSERT(rows >= 0 && rows < 128); // Arbitrary limit + + table->FreezeColumnsRequest = (table->Flags & ImGuiTableFlags_ScrollX) ? (ImGuiTableColumnIdx)columns : 0; + table->FreezeColumnsCount = (table->InnerWindow->Scroll.x != 0.0f) ? table->FreezeColumnsRequest : 0; + table->FreezeRowsRequest = (table->Flags & ImGuiTableFlags_ScrollY) ? (ImGuiTableColumnIdx)rows : 0; + table->FreezeRowsCount = (table->InnerWindow->Scroll.y != 0.0f) ? table->FreezeRowsRequest : 0; + table->IsUnfrozenRows = (table->FreezeRowsCount == 0); // Make sure this is set before TableUpdateLayout() so ImGuiListClipper can benefit from it.b +} + +int ImGui::TableGetColumnCount() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + return table ? table->ColumnsCount : 0; +} + +const char* ImGui::TableGetColumnName(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return NULL; + if (column_n < 0) + column_n = table->CurrentColumn; + return TableGetColumnName(table, column_n); +} + +const char* ImGui::TableGetColumnName(const ImGuiTable* table, int column_n) +{ + if (table->IsLayoutLocked == false && column_n >= table->DeclColumnsCount) + return ""; // NameOffset is invalid at this point + const ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->NameOffset == -1) + return ""; + return &table->ColumnsNames.Buf[column->NameOffset]; +} + +// For the getter you can use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsEnabled) +void ImGui::TableSetColumnEnabled(int column_n, bool enabled) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + if (!table) + return; + if (column_n < 0) + column_n = table->CurrentColumn; + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column = &table->Columns[column_n]; + column->IsEnabledNextFrame = enabled; +} + +// We allow querying for an extra column in order to poll the IsHovered state of the right-most section +ImGuiTableColumnFlags ImGui::TableGetColumnFlags(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return ImGuiTableColumnFlags_None; + if (column_n < 0) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) + return (table->HoveredColumnBody == column_n) ? ImGuiTableColumnFlags_IsHovered : ImGuiTableColumnFlags_None; + return table->Columns[column_n].Flags; +} + +// Return the cell rectangle based on currently known height. +// - Important: we generally don't know our row height until the end of the row, so Max.y will be incorrect in many situations. +// The only case where this is correct is if we provided a min_row_height to TableNextRow() and don't go below it. +// - Important: if ImGuiTableFlags_PadOuterX is set but ImGuiTableFlags_PadInnerX is not set, the outer-most left and right +// columns report a small offset so their CellBgRect can extend up to the outer border. +ImRect ImGui::TableGetCellBgRect(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float x1 = column->MinX; + float x2 = column->MaxX; + if (column->PrevEnabledColumn == -1) + x1 -= table->CellSpacingX1; + if (column->NextEnabledColumn == -1) + x2 += table->CellSpacingX2; + return ImRect(x1, table->RowPosY1, x2, table->RowPosY2); +} + +// Return the resizing ID for the right-side of the given column. +ImGuiID ImGui::TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no) +{ + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiID id = table->ID + 1 + (instance_no * table->ColumnsCount) + column_n; + return id; +} + +// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. +int ImGui::TableGetHoveredColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return -1; + return (int)table->HoveredColumnBody; +} + +void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(target != ImGuiTableBgTarget_None); + + if (color == IM_COL32_DISABLE) + color = 0; + + // We cannot draw neither the cell or row background immediately as we don't know the row height at this point in time. + switch (target) + { + case ImGuiTableBgTarget_CellBg: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + if (column_n == -1) + column_n = table->CurrentColumn; + if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) + return; + if (table->RowCellDataCurrent < 0 || table->RowCellData[table->RowCellDataCurrent].Column != column_n) + table->RowCellDataCurrent++; + ImGuiTableCellData* cell_data = &table->RowCellData[table->RowCellDataCurrent]; + cell_data->BgColor = color; + cell_data->Column = (ImGuiTableColumnIdx)column_n; + break; + } + case ImGuiTableBgTarget_RowBg0: + case ImGuiTableBgTarget_RowBg1: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + IM_ASSERT(column_n == -1); + int bg_idx = (target == ImGuiTableBgTarget_RowBg1) ? 1 : 0; + table->RowBgColor[bg_idx] = color; + break; + } + default: + IM_ASSERT(0); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Row changes +//------------------------------------------------------------------------- +// - TableGetRowIndex() +// - TableNextRow() +// - TableBeginRow() [Internal] +// - TableEndRow() [Internal] +//------------------------------------------------------------------------- + +// [Public] Note: for row coloring we use ->RowBgColorCounter which is the same value without counting header rows +int ImGui::TableGetRowIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentRow; +} + +// [Public] Starts into the first cell of a new row +void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + if (table->IsInsideRow) + TableEndRow(table); + + table->LastRowFlags = table->RowFlags; + table->RowFlags = row_flags; + table->RowMinHeight = row_min_height; + TableBeginRow(table); + + // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, + // because that would essentially require a unique clipping rectangle per-cell. + table->RowPosY2 += table->CellPaddingY * 2.0f; + table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); + + // Disable output until user calls TableNextColumn() + table->InnerWindow->SkipItems = true; +} + +// [Internal] Called by TableNextRow() +void ImGui::TableBeginRow(ImGuiTable* table) +{ + ImGuiWindow* window = table->InnerWindow; + IM_ASSERT(!table->IsInsideRow); + + // New row + table->CurrentRow++; + table->CurrentColumn = -1; + table->RowBgColor[0] = table->RowBgColor[1] = IM_COL32_DISABLE; + table->RowCellDataCurrent = -1; + table->IsInsideRow = true; + + // Begin frozen rows + float next_y1 = table->RowPosY2; + if (table->CurrentRow == 0 && table->FreezeRowsCount > 0) + next_y1 = window->DC.CursorPos.y = table->OuterRect.Min.y; + + table->RowPosY1 = table->RowPosY2 = next_y1; + table->RowTextBaseline = 0.0f; + table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent + window->DC.PrevLineTextBaseOffset = 0.0f; + window->DC.CursorMaxPos.y = next_y1; + + // Making the header BG color non-transparent will allow us to overlay it multiple times when handling smooth dragging. + if (table->RowFlags & ImGuiTableRowFlags_Headers) + { + TableSetBgColor(ImGuiTableBgTarget_RowBg0, GetColorU32(ImGuiCol_TableHeaderBg)); + if (table->CurrentRow == 0) + table->IsUsingHeaders = true; + } +} + +// [Internal] Called by TableNextRow() +void ImGui::TableEndRow(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window == table->InnerWindow); + IM_ASSERT(table->IsInsideRow); + + if (table->CurrentColumn != -1) + TableEndCell(table); + + // Logging + if (g.LogEnabled) + LogRenderedText(NULL, "|"); + + // Position cursor at the bottom of our row so it can be used for e.g. clipping calculation. However it is + // likely that the next call to TableBeginCell() will reposition the cursor to take account of vertical padding. + window->DC.CursorPos.y = table->RowPosY2; + + // Row background fill + const float bg_y1 = table->RowPosY1; + const float bg_y2 = table->RowPosY2; + const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); + const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); + if (table->CurrentRow == 0) + table->LastFirstRowHeight = bg_y2 - bg_y1; + + const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); + if (is_visible) + { + // Decide of background color for the row + ImU32 bg_col0 = 0; + ImU32 bg_col1 = 0; + if (table->RowBgColor[0] != IM_COL32_DISABLE) + bg_col0 = table->RowBgColor[0]; + else if (table->Flags & ImGuiTableFlags_RowBg) + bg_col0 = GetColorU32((table->RowBgColorCounter & 1) ? ImGuiCol_TableRowBgAlt : ImGuiCol_TableRowBg); + if (table->RowBgColor[1] != IM_COL32_DISABLE) + bg_col1 = table->RowBgColor[1]; + + // Decide of top border color + ImU32 border_col = 0; + const float border_size = TABLE_BORDER_SIZE; + if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) + if (table->Flags & ImGuiTableFlags_BordersInnerH) + border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; + + const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; + const bool draw_strong_bottom_border = unfreeze_rows_actual; + if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) + { + // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is + // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + window->DrawList->_CmdHeader.ClipRect = table->Bg0ClipRectForDrawCmd.ToVec4(); + table->DrawSplitter.SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_BG0); + } + + // Draw row background + // We soft/cpu clip this so all backgrounds and borders can share the same clipping rectangle + if (bg_col0 || bg_col1) + { + ImRect row_rect(table->WorkRect.Min.x, bg_y1, table->WorkRect.Max.x, bg_y2); + row_rect.ClipWith(table->BgClipRect); + if (bg_col0 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col0); + if (bg_col1 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col1); + } + + // Draw cell background color + if (draw_cell_bg_color) + { + ImGuiTableCellData* cell_data_end = &table->RowCellData[table->RowCellDataCurrent]; + for (ImGuiTableCellData* cell_data = &table->RowCellData[0]; cell_data <= cell_data_end; cell_data++) + { + const ImGuiTableColumn* column = &table->Columns[cell_data->Column]; + ImRect cell_bg_rect = TableGetCellBgRect(table, cell_data->Column); + cell_bg_rect.ClipWith(table->BgClipRect); + cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped + cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); + window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); + } + } + + // Draw top border + if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); + + // Draw bottom border at the row unfreezing mark (always strong) + if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y2), ImVec2(table->BorderX2, bg_y2), table->BorderColorStrong, border_size); + } + + // End frozen rows (when we are past the last frozen row line, teleport cursor and alter clipping rectangle) + // We need to do that in TableEndRow() instead of TableBeginRow() so the list clipper can mark end of row and + // get the new cursor position. + if (unfreeze_rows_request) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + column->NavLayerCurrent = (ImS8)((column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); + } + if (unfreeze_rows_actual) + { + IM_ASSERT(table->IsUnfrozenRows == false); + table->IsUnfrozenRows = true; + + // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect + float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); + table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); + table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = window->InnerClipRect.Max.y; + table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen; + IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y); + + float row_height = table->RowPosY2 - table->RowPosY1; + table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y; + table->RowPosY1 = table->RowPosY2 - row_height; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + column->DrawChannelCurrent = column->DrawChannelUnfrozen; + column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y; + } + + // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y + SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect); + table->DrawSplitter.SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent); + } + + if (!(table->RowFlags & ImGuiTableRowFlags_Headers)) + table->RowBgColorCounter++; + table->IsInsideRow = false; +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns changes +//------------------------------------------------------------------------- +// - TableGetColumnIndex() +// - TableSetColumnIndex() +// - TableNextColumn() +// - TableBeginCell() [Internal] +// - TableEndCell() [Internal] +//------------------------------------------------------------------------- + +int ImGui::TableGetColumnIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentColumn; +} + +// [Public] Append into a specific column +bool ImGui::TableSetColumnIndex(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->CurrentColumn != column_n) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + IM_ASSERT(column_n >= 0 && table->ColumnsCount); + TableBeginCell(table, column_n); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; +} + +// [Public] Append into the next column, wrap and create a new row when already on last column +bool ImGui::TableNextColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->IsInsideRow && table->CurrentColumn + 1 < table->ColumnsCount) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + TableBeginCell(table, table->CurrentColumn + 1); + } + else + { + TableNextRow(); + TableBeginCell(table, 0); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + int column_n = table->CurrentColumn; + return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; +} + + +// [Internal] Called by TableSetColumnIndex()/TableNextColumn() +// This is called very frequently, so we need to be mindful of unnecessary overhead. +// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns. +void ImGui::TableBeginCell(ImGuiTable* table, int column_n) +{ + ImGuiTableColumn* column = &table->Columns[column_n]; + ImGuiWindow* window = table->InnerWindow; + table->CurrentColumn = column_n; + + // Start position is roughly ~~ CellRect.Min + CellPadding + Indent + float start_x = column->WorkMinX; + if (column->Flags & ImGuiTableColumnFlags_IndentEnable) + start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. + + window->DC.CursorPos.x = start_x; + window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; + window->DC.CursorMaxPos.x = window->DC.CursorPos.x; + window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT + window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; + window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; + + window->WorkRect.Min.y = window->DC.CursorPos.y; + window->WorkRect.Min.x = column->WorkMinX; + window->WorkRect.Max.x = column->WorkMaxX; + window->DC.ItemWidth = column->ItemWidth; + + // To allow ImGuiListClipper to function we propagate our row height + if (!column->IsEnabled) + window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2); + + window->SkipItems = column->IsSkipItems; + if (column->IsSkipItems) + { + window->DC.LastItemId = 0; + window->DC.LastItemStatusFlags = 0; + } + + if (table->Flags & ImGuiTableFlags_NoClip) + { + // FIXME: if we end up drawing all borders/bg in EndTable, could remove this and just assert that channel hasn't changed. + table->DrawSplitter.SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + //IM_ASSERT(table->DrawSplitter._Current == TABLE_DRAW_CHANNEL_NOCLIP); + } + else + { + // FIXME-TABLE: Could avoid this if draw channel is dummy channel? + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + table->DrawSplitter.SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); + } + + // Logging + ImGuiContext& g = *GImGui; + if (g.LogEnabled && !column->IsSkipItems) + { + LogRenderedText(&window->DC.CursorPos, "|"); + g.LogLinePosY = FLT_MAX; + } +} + +// [Internal] Called by TableNextRow()/TableSetColumnIndex()/TableNextColumn() +void ImGui::TableEndCell(ImGuiTable* table) +{ + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + ImGuiWindow* window = table->InnerWindow; + + // Report maximum position so we can infer content size per column. + float* p_max_pos_x; + if (table->RowFlags & ImGuiTableRowFlags_Headers) + p_max_pos_x = &column->ContentMaxXHeadersUsed; // Useful in case user submit contents in header row that is not a TableHeader() call + else + p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; + *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); + table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); + column->ItemWidth = window->DC.ItemWidth; + + // Propagate text baseline for the entire row + // FIXME-TABLE: Here we propagate text baseline from the last line of the cell.. instead of the first one. + table->RowTextBaseline = ImMax(table->RowTextBaseline, window->DC.PrevLineTextBaseOffset); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns width management +//------------------------------------------------------------------------- +// - TableGetMaxColumnWidth() [Internal] +// - TableGetColumnWidthAuto() [Internal] +// - TableSetColumnWidth() +// - TableSetColumnWidthAutoSingle() [Internal] +// - TableSetColumnWidthAutoAll() [Internal] +// - TableUpdateColumnsWeightFromWidth() [Internal] +//------------------------------------------------------------------------- + +// Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. +float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float max_width = FLT_MAX; + const float min_column_distance = table->MinColumnWidth + table->CellPaddingX * 2.0f + table->CellSpacingX1 + table->CellSpacingX2; + if (table->Flags & ImGuiTableFlags_ScrollX) + { + // Frozen columns can't reach beyond visible width else scrolling will naturally break. + if (column->DisplayOrder < table->FreezeColumnsRequest) + { + max_width = (table->InnerClipRect.Max.x - (table->FreezeColumnsRequest - column->DisplayOrder) * min_column_distance) - column->MinX; + max_width = max_width - table->OuterPaddingX - table->CellPaddingX - table->CellSpacingX2; + } + } + else if ((table->Flags & ImGuiTableFlags_NoKeepColumnsVisible) == 0) + { + // If horizontal scrolling if disabled, we apply a final lossless shrinking of columns in order to make + // sure they are all visible. Because of this we also know that all of the columns will always fit in + // table->WorkRect and therefore in table->InnerRect (because ScrollX is off) + // FIXME-TABLE: This is solved incorrectly but also quite a difficult problem to fix as we also want ClipRect width to match. + // See "table_width_distrib" and "table_width_keep_visible" tests + max_width = table->WorkRect.Max.x - (table->ColumnsEnabledCount - column->IndexWithinEnabledSet - 1) * min_column_distance - column->MinX; + //max_width -= table->CellSpacingX1; + max_width -= table->CellSpacingX2; + max_width -= table->CellPaddingX * 2.0f; + max_width -= table->OuterPaddingX; + } + return max_width; +} + +// Note this is meant to be stored in column->WidthAuto, please generally use the WidthAuto field +float ImGui::TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column) +{ + const float content_width_body = ImMax(column->ContentMaxXFrozen, column->ContentMaxXUnfrozen) - column->WorkMinX; + const float content_width_headers = column->ContentMaxXHeadersIdeal - column->WorkMinX; + float width_auto = content_width_body; + if (!(column->Flags & ImGuiTableColumnFlags_NoHeaderWidth)) + width_auto = ImMax(width_auto, content_width_headers); + + // Non-resizable fixed columns preserve their requested width + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f) + if (!(table->Flags & ImGuiTableFlags_Resizable) || (column->Flags & ImGuiTableColumnFlags_NoResize)) + width_auto = column->InitStretchWeightOrWidth; + + return ImMax(width_auto, table->MinColumnWidth); +} + +// 'width' = inner column width, without padding +void ImGui::TableSetColumnWidth(int column_n, float width) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && table->IsLayoutLocked == false); + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column_0 = &table->Columns[column_n]; + float column_0_width = width; + + // Apply constraints early + // Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded) + IM_ASSERT(table->MinColumnWidth > 0.0f); + const float min_width = table->MinColumnWidth; + const float max_width = ImMax(min_width, TableGetMaxColumnWidth(table, column_n)); + column_0_width = ImClamp(column_0_width, min_width, max_width); + if (column_0->WidthGiven == column_0_width || column_0->WidthRequest == column_0_width) + return; + + //IMGUI_DEBUG_LOG("TableSetColumnWidth(%d, %.1f->%.1f)\n", column_0_idx, column_0->WidthGiven, column_0_width); + ImGuiTableColumn* column_1 = (column_0->NextEnabledColumn != -1) ? &table->Columns[column_0->NextEnabledColumn] : NULL; + + // In this surprisingly not simple because of how we support mixing Fixed and multiple Stretch columns. + // - All fixed: easy. + // - All stretch: easy. + // - One or more fixed + one stretch: easy. + // - One or more fixed + more than one stretch: tricky. + // Qt when manual resize is enabled only support a single _trailing_ stretch column. + + // When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1. + // FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user. + // Scenarios: + // - F1 F2 F3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. Subsequent columns will be offset. + // - F1 F2 F3 resize from F3| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered. + // - F1 F2 W3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered, but it doesn't make much sense as the Stretch column will always be minimal size. + // - F1 F2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 W3 resize from W1| or W2| --> ok + // - W1 W2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 F3 resize from F3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 resize from F2| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 F3 resize from W1| or W2| --> ok + // - W1 F2 W3 resize from W1| or F2| --> ok + // - F1 W2 F3 resize from W2| --> ok + // - F1 W3 F2 resize from W3| --> ok + // - W1 F2 F3 resize from W1| --> ok: equivalent to resizing |F2. F3 will not move. + // - W1 F2 F3 resize from F2| --> ok + // All resizes from a Wx columns are locking other columns. + + // Possible improvements: + // - W1 W2 W3 resize W1| --> to not be stuck, both W2 and W3 would stretch down. Seems possible to fix. Would be most beneficial to simplify resize of all-weighted columns. + // - W3 F1 F2 resize W3| --> to not be stuck past F1|, both F1 and F2 would need to stretch down, which would be lossy or ambiguous. Seems hard to fix. + + // [Resize Rule 1] Can't resize from right of right-most visible column if there is any Stretch column. Implemented in TableUpdateLayout(). + + // If we have all Fixed columns OR resizing a Fixed column that doesn't come after a Stretch one, we can do an offsetting resize. + // This is the preferred resize path + if (column_0->Flags & ImGuiTableColumnFlags_WidthFixed) + if (!column_1 || table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder >= column_0->DisplayOrder) + { + column_0->WidthRequest = column_0_width; + table->IsSettingsDirty = true; + return; + } + + // We can also use previous column if there's no next one (this is used when doing an auto-fit on the right-most stretch column) + if (column_1 == NULL) + column_1 = (column_0->PrevEnabledColumn != -1) ? &table->Columns[column_0->PrevEnabledColumn] : NULL; + if (column_1 == NULL) + return; + + // Resizing from right-side of a Stretch column before a Fixed column forward sizing to left-side of fixed column. + // (old_a + old_b == new_a + new_b) --> (new_a == old_a + old_b - new_b) + float column_1_width = ImMax(column_1->WidthRequest - (column_0_width - column_0->WidthRequest), min_width); + column_0_width = column_0->WidthRequest + column_1->WidthRequest - column_1_width; + IM_ASSERT(column_0_width > 0.0f && column_1_width > 0.0f); + column_0->WidthRequest = column_0_width; + column_1->WidthRequest = column_1_width; + if ((column_0->Flags | column_1->Flags) & ImGuiTableColumnFlags_WidthStretch) + TableUpdateColumnsWeightFromWidth(table); + table->IsSettingsDirty = true; +} + +// Disable clipping then auto-fit, will take 2 frames +// (we don't take a shortcut for unclipped columns to reduce inconsistencies when e.g. resizing multiple columns) +void ImGui::TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n) +{ + // Single auto width uses auto-fit + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled) + return; + column->CannotSkipItemsQueue = (1 << 0); + table->AutoFitSingleColumn = (ImGuiTableColumnIdx)column_n; +} + +void ImGui::TableSetColumnWidthAutoAll(ImGuiTable* table) +{ + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) // Cannot reset weight of hidden stretch column + continue; + column->CannotSkipItemsQueue = (1 << 0); + column->AutoFitQueue = (1 << 1); + } +} + +void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) +{ + IM_ASSERT(table->LeftMostStretchedColumn != -1 && table->RightMostStretchedColumn != -1); + + // Measure existing quantity + float visible_weight = 0.0f; + float visible_width = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + IM_ASSERT(column->StretchWeight > 0.0f); + visible_weight += column->StretchWeight; + visible_width += column->WidthRequest; + } + IM_ASSERT(visible_weight > 0.0f && visible_width > 0.0f); + + // Apply new weights + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->StretchWeight = (column->WidthRequest / visible_width) * visible_weight; + IM_ASSERT(column->StretchWeight > 0.0f); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Drawing +//------------------------------------------------------------------------- +// - TablePushBackgroundChannel() [Internal] +// - TablePopBackgroundChannel() [Internal] +// - TableSetupDrawChannels() [Internal] +// - TableMergeDrawChannels() [Internal] +// - TableDrawBorders() [Internal] +//------------------------------------------------------------------------- + +// Bg2 is used by Selectable (and possibly other widgets) to render to the background. +// Unlike our Bg0/1 channel which we uses for RowBg/CellBg/Borders and where we guarantee all shapes to be CPU-clipped, the Bg2 channel being widgets-facing will rely on regular ClipRect. +void ImGui::TablePushBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + table->HostBackupInnerClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, table->Bg2ClipRectForDrawCmd); + table->DrawSplitter.SetCurrentChannel(window->DrawList, table->Bg2DrawChannelCurrent); +} + +void ImGui::TablePopBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, table->HostBackupInnerClipRect); + table->DrawSplitter.SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); +} + +// Allocate draw channels. Called by TableUpdateLayout() +// - We allocate them following storage order instead of display order so reordering columns won't needlessly +// increase overall dormant memory cost. +// - We isolate headers draw commands in their own channels instead of just altering clip rects. +// This is in order to facilitate merging of draw commands. +// - After crossing FreezeRowsCount, all columns see their current draw channel changed to a second set of channels. +// - We only use the dummy draw channel so we can push a null clipping rectangle into it without affecting other +// channels, while simplifying per-row/per-cell overhead. It will be empty and discarded when merged. +// - We allocate 1 or 2 background draw channels. This is because we know TablePushBackgroundChannel() is only used for +// horizontal spanning. If we allowed vertical spanning we'd need one background draw channel per merge group (1-4). +// Draw channel allocation (before merging): +// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == always 1 draw call) +// - Clip --> 2+D+N channels +// - FreezeRows --> 2+D+N*2 (unless scrolling value is zero) +// - FreezeRows || FreezeColunns --> 3+D+N*2 (unless scrolling value is zero) +// Where D is 1 if any column is clipped or hidden (dummy channel) otherwise 0. +void ImGui::TableSetupDrawChannels(ImGuiTable* table) +{ + const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1; + const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClip) ? 1 : table->ColumnsEnabledCount; + const int channels_for_bg = 1 + 1 * freeze_row_multiplier; + const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || table->VisibleMaskByIndex != table->EnabledMaskByIndex) ? +1 : 0; + const int channels_total = channels_for_bg + (channels_for_row * freeze_row_multiplier) + channels_for_dummy; + table->DrawSplitter.Split(table->InnerWindow->DrawList, channels_total); + table->DummyDrawChannel = (ImGuiTableDrawChannelIdx)((channels_for_dummy > 0) ? channels_total - 1 : -1); + table->Bg2DrawChannelCurrent = TABLE_DRAW_CHANNEL_BG2_FROZEN; + table->Bg2DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)((table->FreezeRowsCount > 0) ? 2 + channels_for_row : TABLE_DRAW_CHANNEL_BG2_FROZEN); + + int draw_channel_current = 2; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsVisibleX && column->IsVisibleY) + { + column->DrawChannelFrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current); + column->DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current + (table->FreezeRowsCount > 0 ? channels_for_row + 1 : 0)); + if (!(table->Flags & ImGuiTableFlags_NoClip)) + draw_channel_current++; + } + else + { + column->DrawChannelFrozen = column->DrawChannelUnfrozen = table->DummyDrawChannel; + } + column->DrawChannelCurrent = column->DrawChannelFrozen; + } + + // Initial draw cmd starts with a BgClipRect that matches the one of its host, to facilitate merge draw commands by default. + // All our cell highlight are manually clipped with BgClipRect. When unfreezing it will be made smaller to fit scrolling rect. + // (This technically isn't part of setting up draw channels, but is reasonably related to be done here) + table->BgClipRect = table->InnerClipRect; + table->Bg0ClipRectForDrawCmd = table->OuterWindow->ClipRect; + table->Bg2ClipRectForDrawCmd = table->HostClipRect; + IM_ASSERT(table->BgClipRect.Min.y <= table->BgClipRect.Max.y); +} + +// This function reorder draw channels based on matching clip rectangle, to facilitate merging them. Called by EndTable(). +// For simplicity we call it TableMergeDrawChannels() but in fact it only reorder channels + overwrite ClipRect, +// actual merging is done by table->DrawSplitter.Merge() which is called right after TableMergeDrawChannels(). +// +// Columns where the contents didn't stray off their local clip rectangle can be merged. To achieve +// this we merge their clip rect and make them contiguous in the channel list, so they can be merged +// by the call to DrawSplitter.Merge() following to the call to this function. +// We reorder draw commands by arranging them into a maximum of 4 distinct groups: +// +// 1 group: 2 groups: 2 groups: 4 groups: +// [ 0. ] no freeze [ 0. ] row freeze [ 01 ] col freeze [ 01 ] row+col freeze +// [ .. ] or no scroll [ 2. ] and v-scroll [ .. ] and h-scroll [ 23 ] and v+h-scroll +// +// Each column itself can use 1 channel (row freeze disabled) or 2 channels (row freeze enabled). +// When the contents of a column didn't stray off its limit, we move its channels into the corresponding group +// based on its position (within frozen rows/columns groups or not). +// At the end of the operation our 1-4 groups will each have a ImDrawCmd using the same ClipRect. +// This function assume that each column are pointing to a distinct draw channel, +// otherwise merge_group->ChannelsCount will not match set bit count of merge_group->ChannelsMask. +// +// Column channels will not be merged into one of the 1-4 groups in the following cases: +// - The contents stray off its clipping rectangle (we only compare the MaxX value, not the MinX value). +// Direct ImDrawList calls won't be taken into account by default, if you use them make sure the ImGui:: bounds +// matches, by e.g. calling SetCursorScreenPos(). +// - The channel uses more than one draw command itself. We drop all our attempt at merging stuff here.. +// we could do better but it's going to be rare and probably not worth the hassle. +// Columns for which the draw channel(s) haven't been merged with other will use their own ImDrawCmd. +// +// This function is particularly tricky to understand.. take a breath. +void ImGui::TableMergeDrawChannels(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImDrawListSplitter* splitter = &table->DrawSplitter; + const bool has_freeze_v = (table->FreezeRowsCount > 0); + const bool has_freeze_h = (table->FreezeColumnsCount > 0); + IM_ASSERT(splitter->_Current == 0); + + // Track which groups we are going to attempt to merge, and which channels goes into each group. + struct MergeGroup + { + ImRect ClipRect; + int ChannelsCount; + ImBitArray<IMGUI_TABLE_MAX_DRAW_CHANNELS> ChannelsMask; + }; + int merge_group_mask = 0x00; + MergeGroup merge_groups[4]; + memset(merge_groups, 0, sizeof(merge_groups)); + + // 1. Scan channels and take note of those which can be merged + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const int merge_group_sub_count = has_freeze_v ? 2 : 1; + for (int merge_group_sub_n = 0; merge_group_sub_n < merge_group_sub_count; merge_group_sub_n++) + { + const int channel_no = (merge_group_sub_n == 0) ? column->DrawChannelFrozen : column->DrawChannelUnfrozen; + + // Don't attempt to merge if there are multiple draw calls within the column + ImDrawChannel* src_channel = &splitter->_Channels[channel_no]; + if (src_channel->_CmdBuffer.Size > 0 && src_channel->_CmdBuffer.back().ElemCount == 0) + src_channel->_CmdBuffer.pop_back(); + if (src_channel->_CmdBuffer.Size != 1) + continue; + + // Find out the width of this merge group and check if it will fit in our column + // (note that we assume that rendering didn't stray on the left direction. we should need a CursorMinPos to detect it) + if (!(column->Flags & ImGuiTableColumnFlags_NoClip)) + { + float content_max_x; + if (!has_freeze_v) + content_max_x = ImMax(column->ContentMaxXUnfrozen, column->ContentMaxXHeadersUsed); // No row freeze + else if (merge_group_sub_n == 0) + content_max_x = ImMax(column->ContentMaxXFrozen, column->ContentMaxXHeadersUsed); // Row freeze: use width before freeze + else + content_max_x = column->ContentMaxXUnfrozen; // Row freeze: use width after freeze + if (content_max_x > column->ClipRect.Max.x) + continue; + } + + const int merge_group_n = (has_freeze_h && column_n < table->FreezeColumnsCount ? 0 : 1) + (has_freeze_v && merge_group_sub_n == 0 ? 0 : 2); + IM_ASSERT(channel_no < IMGUI_TABLE_MAX_DRAW_CHANNELS); + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + merge_group->ClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); + merge_group->ChannelsMask.SetBit(channel_no); + merge_group->ChannelsCount++; + merge_group->ClipRect.Add(src_channel->_CmdBuffer[0].ClipRect); + merge_group_mask |= (1 << merge_group_n); + } + + // Invalidate current draw channel + // (we don't clear DrawChannelFrozen/DrawChannelUnfrozen solely to facilitate debugging/later inspection of data) + column->DrawChannelCurrent = (ImGuiTableDrawChannelIdx)-1; + } + + // [DEBUG] Display merge groups +#if 0 + if (g.IO.KeyShift) + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + continue; + char buf[32]; + ImFormatString(buf, 32, "MG%d:%d", merge_group_n, merge_group->ChannelsCount); + ImVec2 text_pos = merge_group->ClipRect.Min + ImVec2(4, 4); + ImVec2 text_size = CalcTextSize(buf, NULL); + GetForegroundDrawList()->AddRectFilled(text_pos, text_pos + text_size, IM_COL32(0, 0, 0, 255)); + GetForegroundDrawList()->AddText(text_pos, IM_COL32(255, 255, 0, 255), buf, NULL); + GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 255, 0, 255)); + } +#endif + + // 2. Rewrite channel list in our preferred order + if (merge_group_mask != 0) + { + // We skip channel 0 (Bg0/Bg1) and 1 (Bg2 frozen) from the shuffling since they won't move - see channels allocation in TableSetupDrawChannels(). + const int LEADING_DRAW_CHANNELS = 2; + g.DrawChannelsTempMergeBuffer.resize(splitter->_Count - LEADING_DRAW_CHANNELS); // Use shared temporary storage so the allocation gets amortized + ImDrawChannel* dst_tmp = g.DrawChannelsTempMergeBuffer.Data; + ImBitArray<IMGUI_TABLE_MAX_DRAW_CHANNELS> remaining_mask; // We need 132-bit of storage + remaining_mask.ClearAllBits(); + remaining_mask.SetBitRange(LEADING_DRAW_CHANNELS, splitter->_Count); + remaining_mask.ClearBit(table->Bg2DrawChannelUnfrozen); + IM_ASSERT(has_freeze_v == false || table->Bg2DrawChannelUnfrozen != TABLE_DRAW_CHANNEL_BG2_FROZEN); + int remaining_count = splitter->_Count - (has_freeze_v ? LEADING_DRAW_CHANNELS + 1 : LEADING_DRAW_CHANNELS); + //ImRect host_rect = (table->InnerWindow == table->OuterWindow) ? table->InnerClipRect : table->HostClipRect; + ImRect host_rect = table->HostClipRect; + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + if (int merge_channels_count = merge_groups[merge_group_n].ChannelsCount) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + ImRect merge_clip_rect = merge_group->ClipRect; + + // Extend outer-most clip limits to match those of host, so draw calls can be merged even if + // outer-most columns have some outer padding offsetting them from their parent ClipRect. + // The principal cases this is dealing with are: + // - On a same-window table (not scrolling = single group), all fitting columns ClipRect -> will extend and match host ClipRect -> will merge + // - Columns can use padding and have left-most ClipRect.Min.x and right-most ClipRect.Max.x != from host ClipRect -> will extend and match host ClipRect -> will merge + // FIXME-TABLE FIXME-WORKRECT: We are wasting a merge opportunity on tables without scrolling if column doesn't fit + // within host clip rect, solely because of the half-padding difference between window->WorkRect and window->InnerClipRect. + if ((merge_group_n & 1) == 0 || !has_freeze_h) + merge_clip_rect.Min.x = ImMin(merge_clip_rect.Min.x, host_rect.Min.x); + if ((merge_group_n & 2) == 0 || !has_freeze_v) + merge_clip_rect.Min.y = ImMin(merge_clip_rect.Min.y, host_rect.Min.y); + if ((merge_group_n & 1) != 0) + merge_clip_rect.Max.x = ImMax(merge_clip_rect.Max.x, host_rect.Max.x); + if ((merge_group_n & 2) != 0 && (table->Flags & ImGuiTableFlags_NoHostExtendY) == 0) + merge_clip_rect.Max.y = ImMax(merge_clip_rect.Max.y, host_rect.Max.y); +#if 0 + GetOverlayDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200)); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200)); +#endif + remaining_count -= merge_group->ChannelsCount; + for (int n = 0; n < IM_ARRAYSIZE(remaining_mask.Storage); n++) + remaining_mask.Storage[n] &= ~merge_group->ChannelsMask.Storage[n]; + for (int n = 0; n < splitter->_Count && merge_channels_count != 0; n++) + { + // Copy + overwrite new clip rect + if (!merge_group->ChannelsMask.TestBit(n)) + continue; + merge_group->ChannelsMask.ClearBit(n); + merge_channels_count--; + + ImDrawChannel* channel = &splitter->_Channels[n]; + IM_ASSERT(channel->_CmdBuffer.Size == 1 && merge_clip_rect.Contains(ImRect(channel->_CmdBuffer[0].ClipRect))); + channel->_CmdBuffer[0].ClipRect = merge_clip_rect.ToVec4(); + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + } + } + + // Make sure Bg2DrawChannelUnfrozen appears in the middle of our groups (whereas Bg0/Bg1 and Bg2 frozen are fixed to 0 and 1) + if (merge_group_n == 1 && has_freeze_v) + memcpy(dst_tmp++, &splitter->_Channels[table->Bg2DrawChannelUnfrozen], sizeof(ImDrawChannel)); + } + + // Append unmergeable channels that we didn't reorder at the end of the list + for (int n = 0; n < splitter->_Count && remaining_count != 0; n++) + { + if (!remaining_mask.TestBit(n)) + continue; + ImDrawChannel* channel = &splitter->_Channels[n]; + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + remaining_count--; + } + IM_ASSERT(dst_tmp == g.DrawChannelsTempMergeBuffer.Data + g.DrawChannelsTempMergeBuffer.Size); + memcpy(splitter->_Channels.Data + LEADING_DRAW_CHANNELS, g.DrawChannelsTempMergeBuffer.Data, (splitter->_Count - LEADING_DRAW_CHANNELS) * sizeof(ImDrawChannel)); + } +} + +// FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) +void ImGui::TableDrawBorders(ImGuiTable* table) +{ + ImGuiWindow* inner_window = table->InnerWindow; + if (!table->OuterWindow->ClipRect.Overlaps(table->OuterRect)) + return; + + ImDrawList* inner_drawlist = inner_window->DrawList; + table->DrawSplitter.SetCurrentChannel(inner_drawlist, TABLE_DRAW_CHANNEL_BG0); + inner_drawlist->PushClipRect(table->Bg0ClipRectForDrawCmd.Min, table->Bg0ClipRectForDrawCmd.Max, false); + + // Draw inner border and resizing feedback + const float border_size = TABLE_BORDER_SIZE; + const float draw_y1 = table->InnerRect.Min.y; + const float draw_y2_body = table->InnerRect.Max.y; + const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table->LastFirstRowHeight) : draw_y1; + if (table->Flags & ImGuiTableFlags_BordersInnerV) + { + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + const bool is_hovered = (table->HoveredColumnBorder == column_n); + const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); + const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0; + const bool is_frozen_separator = (table->FreezeColumnsCount != -1 && table->FreezeColumnsCount == order_n + 1); + if (column->MaxX > table->InnerClipRect.Max.x && !is_resized) + continue; + + // Decide whether right-most column is visible + if (column->NextEnabledColumn == -1 && !is_resizable) + if ((table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame || (table->Flags & ImGuiTableFlags_NoHostExtendX)) + continue; + if (column->MaxX <= column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size.. + continue; + + // Draw in outer window so right-most column won't be clipped + // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. + ImU32 col; + float draw_y2; + if (is_hovered || is_resized || is_frozen_separator) + { + draw_y2 = draw_y2_body; + col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; + } + else + { + draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; + col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; + } + + if (draw_y2 > draw_y1) + inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); + } + } + + // Draw outer border + // FIXME: could use AddRect or explicit VLine/HLine helper? + if (table->Flags & ImGuiTableFlags_BordersOuter) + { + // Display outer border offset by 1 which is a simple way to display it without adding an extra draw call + // (Without the offset, in outer_window it would be rendered behind cells, because child windows are above their + // parent. In inner_window, it won't reach out over scrollbars. Another weird solution would be to display part + // of it in inner window, and the part that's over scrollbars in the outer window..) + // Either solution currently won't allow us to use a larger border size: the border would clipped. + const ImRect outer_border = table->OuterRect; + const ImU32 outer_col = table->BorderColorStrong; + if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) + { + inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterV) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Min.x, outer_border.Max.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Max.x, outer_border.Min.y), outer_border.Max, outer_col, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterH) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Max.x, outer_border.Min.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Min.x, outer_border.Max.y), outer_border.Max, outer_col, border_size); + } + } + if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) + { + // Draw bottom-most row border + const float border_y = table->RowPosY2; + if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) + inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); + } + + inner_drawlist->PopClipRect(); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Sorting +//------------------------------------------------------------------------- +// - TableGetSortSpecs() +// - TableFixColumnSortDirection() [Internal] +// - TableGetColumnNextSortDirection() [Internal] +// - TableSetColumnSortDirection() [Internal] +// - TableSortSpecsSanitize() [Internal] +// - TableSortSpecsBuild() [Internal] +//------------------------------------------------------------------------- + +// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) +// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since +// last call, or the first time. +// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! +ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + + if (!(table->Flags & ImGuiTableFlags_Sortable)) + return NULL; + + // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + if (table->IsSortSpecsDirty) + TableSortSpecsBuild(table); + + return &table->SortSpecs; +} + +static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n) +{ + IM_ASSERT(n < column->SortDirectionsAvailCount); + return (column->SortDirectionsAvailList >> (n << 1)) & 0x03; +} + +// Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending) +void ImGui::TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column) +{ + if (column->SortOrder == -1 || (column->SortDirectionsAvailMask & (1 << column->SortDirection)) != 0) + return; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + table->IsSortSpecsDirty = true; +} + +// Calculate next sort direction that would be set after clicking the column +// - If the PreferSortDescending flag is set, we will default to a Descending direction on the first click. +// - Note that the PreferSortAscending flag is never checked, it is essentially the default and therefore a no-op. +IM_STATIC_ASSERT(ImGuiSortDirection_None == 0 && ImGuiSortDirection_Ascending == 1 && ImGuiSortDirection_Descending == 2); +ImGuiSortDirection ImGui::TableGetColumnNextSortDirection(ImGuiTableColumn* column) +{ + IM_ASSERT(column->SortDirectionsAvailCount > 0); + if (column->SortOrder == -1) + return TableGetColumnAvailSortDirection(column, 0); + for (int n = 0; n < 3; n++) + if (column->SortDirection == TableGetColumnAvailSortDirection(column, n)) + return TableGetColumnAvailSortDirection(column, (n + 1) % column->SortDirectionsAvailCount); + IM_ASSERT(0); + return ImGuiSortDirection_None; +} + +// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert +// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code. +void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!(table->Flags & ImGuiTableFlags_SortMulti)) + append_to_sort_specs = false; + if (!(table->Flags & ImGuiTableFlags_SortTristate)) + IM_ASSERT(sort_direction != ImGuiSortDirection_None); + + ImGuiTableColumnIdx sort_order_max = 0; + if (append_to_sort_specs) + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder); + + ImGuiTableColumn* column = &table->Columns[column_n]; + column->SortDirection = (ImU8)sort_direction; + if (column->SortDirection == ImGuiSortDirection_None) + column->SortOrder = -1; + else if (column->SortOrder == -1 || !append_to_sort_specs) + column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0; + + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + if (other_column != column && !append_to_sort_specs) + other_column->SortOrder = -1; + TableFixColumnSortDirection(table, other_column); + } + table->IsSettingsDirty = true; + table->IsSortSpecsDirty = true; +} + +void ImGui::TableSortSpecsSanitize(ImGuiTable* table) +{ + IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable); + + // Clear SortOrder from hidden column and verify that there's no gap or duplicate. + int sort_order_count = 0; + ImU64 sort_order_mask = 0x00; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder != -1 && !column->IsEnabled) + column->SortOrder = -1; + if (column->SortOrder == -1) + continue; + sort_order_count++; + sort_order_mask |= ((ImU64)1 << column->SortOrder); + IM_ASSERT(sort_order_count < (int)sizeof(sort_order_mask) * 8); + } + + const bool need_fix_linearize = ((ImU64)1 << sort_order_count) != (sort_order_mask + 1); + const bool need_fix_single_sort_order = (sort_order_count > 1) && !(table->Flags & ImGuiTableFlags_SortMulti); + if (need_fix_linearize || need_fix_single_sort_order) + { + ImU64 fixed_mask = 0x00; + for (int sort_n = 0; sort_n < sort_order_count; sort_n++) + { + // Fix: Rewrite sort order fields if needed so they have no gap or duplicate. + // (e.g. SortOrder 0 disappeared, SortOrder 1..2 exists --> rewrite then as SortOrder 0..1) + int column_with_smallest_sort_order = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if ((fixed_mask & ((ImU64)1 << (ImU64)column_n)) == 0 && table->Columns[column_n].SortOrder != -1) + if (column_with_smallest_sort_order == -1 || table->Columns[column_n].SortOrder < table->Columns[column_with_smallest_sort_order].SortOrder) + column_with_smallest_sort_order = column_n; + IM_ASSERT(column_with_smallest_sort_order != -1); + fixed_mask |= ((ImU64)1 << column_with_smallest_sort_order); + table->Columns[column_with_smallest_sort_order].SortOrder = (ImGuiTableColumnIdx)sort_n; + + // Fix: Make sure only one column has a SortOrder if ImGuiTableFlags_MultiSortable is not set. + if (need_fix_single_sort_order) + { + sort_order_count = 1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (column_n != column_with_smallest_sort_order) + table->Columns[column_n].SortOrder = -1; + break; + } + } + } + + // Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag) + if (sort_order_count == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + sort_order_count = 1; + column->SortOrder = 0; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + break; + } + } + + table->SortSpecsCount = (ImGuiTableColumnIdx)sort_order_count; +} + +void ImGui::TableSortSpecsBuild(ImGuiTable* table) +{ + IM_ASSERT(table->IsSortSpecsDirty); + TableSortSpecsSanitize(table); + + // Write output + table->SortSpecsMulti.resize(table->SortSpecsCount <= 1 ? 0 : table->SortSpecsCount); + ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder == -1) + continue; + IM_ASSERT(column->SortOrder < table->SortSpecsCount); + ImGuiTableColumnSortSpecs* sort_spec = &sort_specs[column->SortOrder]; + sort_spec->ColumnUserID = column->UserID; + sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n; + sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder; + sort_spec->SortDirection = column->SortDirection; + } + table->SortSpecs.Specs = sort_specs; + table->SortSpecs.SpecsCount = table->SortSpecsCount; + table->SortSpecs.SpecsDirty = true; // Mark as dirty for user + table->IsSortSpecsDirty = false; // Mark as not dirty for us +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Headers +//------------------------------------------------------------------------- +// - TableGetHeaderRowHeight() [Internal] +// - TableHeadersRow() +// - TableHeader() +//------------------------------------------------------------------------- + +float ImGui::TableGetHeaderRowHeight() +{ + // Caring for a minor edge case: + // Calculate row height, for the unlikely case that some labels may be taller than others. + // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. + // In your custom header row you may omit this all together and just call TableNextRow() without a height... + float row_height = GetTextLineHeight(); + int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + if (TableGetColumnFlags(column_n) & ImGuiTableColumnFlags_IsEnabled) + row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); + row_height += GetStyle().CellPadding.y * 2.0f; + return row_height; +} + +// [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). +// The intent is that advanced users willing to create customized headers would not need to use this helper +// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. +// See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. +// This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. +// FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. +void ImGui::TableHeadersRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); + + // Layout if not already done (this is automatically done by TableNextRow, we do it here solely to facilitate stepping in debugger as it is frequent to step in TableUpdateLayout) + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + // Open row + const float row_y1 = GetCursorScreenPos().y; + const float row_height = TableGetHeaderRowHeight(); + TableNextRow(ImGuiTableRowFlags_Headers, row_height); + if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. + return; + + const int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + { + if (!TableSetColumnIndex(column_n)) + continue; + + // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them) + // - in your own code you may omit the PushID/PopID all-together, provided you know they won't collide + // - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier. + const char* name = TableGetColumnName(column_n); + PushID(table->InstanceCurrent * table->ColumnsCount + column_n); + TableHeader(name); + PopID(); + } + + // Allow opening popup from the right-most section after the last column. + ImVec2 mouse_pos = ImGui::GetMousePos(); + if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) + if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) + TableOpenContextMenu(-1); // Will open a non-column-specific popup. +} + +// Emit a column header (text + optional sort order) +// We cpu-clip text here so that all columns headers can be merged into a same draw call. +// Note that because of how we cpu-clip and display sorting indicators, you _cannot_ use SameLine() after a TableHeader() +void ImGui::TableHeader(const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!"); + IM_ASSERT(table->CurrentColumn != -1); + const int column_n = table->CurrentColumn; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Label + if (label == NULL) + label = ""; + const char* label_end = FindRenderedTextEnd(label); + ImVec2 label_size = CalcTextSize(label, label_end, true); + ImVec2 label_pos = window->DC.CursorPos; + + // If we already got a row height, there's use that. + // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? + ImRect cell_r = TableGetCellBgRect(table, column_n); + float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); + + // Calculate ideal size for sort order arrow + float w_arrow = 0.0f; + float w_sort_text = 0.0f; + char sort_order_suf[4] = ""; + const float ARROW_SCALE = 0.65f; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + if (column->SortOrder > 0) + { + ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); + w_sort_text = g.Style.ItemInnerSpacing.x + CalcTextSize(sort_order_suf).x; + } + } + + // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. + float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; + column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); + column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); + + // Keep header highlighted when context menu is open. + const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); + ImGuiID id = window->GetID(label); + ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); + ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal + if (!ItemAdd(bb, id)) + return; + + //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + + // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); + if (g.ActiveId != id) + SetItemAllowOverlap(); + if (held || hovered || selected) + { + const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); + TableSetBgColor(ImGuiTableBgTarget_CellBg, col, table->CurrentColumn); + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + } + else + { + // Submit single cell bg color in the case we didn't submit a full header row + if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) + TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); + } + if (held) + table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; + window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; + + // Drag and drop to re-order columns. + // FIXME-TABLE: Scroll request while reordering a column and it lands out of the scrolling zone. + if (held && (table->Flags & ImGuiTableFlags_Reorderable) && IsMouseDragging(0) && !g.DragDropActive) + { + // While moving a column it will jump on the other side of the mouse, so we also test for MouseDelta.x + table->ReorderColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + + // We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder. + if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x) + if (ImGuiTableColumn* prev_column = (column->PrevEnabledColumn != -1) ? &table->Columns[column->PrevEnabledColumn] : NULL) + if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = -1; + if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x) + if (ImGuiTableColumn* next_column = (column->NextEnabledColumn != -1) ? &table->Columns[column->NextEnabledColumn] : NULL) + if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (next_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = +1; + } + + // Sort order arrow + const float ellipsis_max = cell_r.Max.x - w_arrow - w_sort_text; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + if (column->SortOrder != -1) + { + float x = ImMax(cell_r.Min.x, cell_r.Max.x - w_arrow - w_sort_text); + float y = label_pos.y; + if (column->SortOrder > 0) + { + PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_Text, 0.70f)); + RenderText(ImVec2(x + g.Style.ItemInnerSpacing.x, y), sort_order_suf); + PopStyleColor(); + x += w_sort_text; + } + RenderArrow(window->DrawList, ImVec2(x, y), GetColorU32(ImGuiCol_Text), column->SortDirection == ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down, ARROW_SCALE); + } + + // Handle clicking on column header to adjust Sort Order + if (pressed && table->ReorderColumn != column_n) + { + ImGuiSortDirection sort_direction = TableGetColumnNextSortDirection(column); + TableSetColumnSortDirection(column_n, sort_direction, g.IO.KeyShift); + } + } + + // Render clipped label. Clipping here ensure that in the majority of situations, all our header cells will + // be merged into a single draw call. + //window->DrawList->AddCircleFilled(ImVec2(ellipsis_max, label_pos.y), 40, IM_COL32_WHITE); + RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); + + const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); + if (text_clipped && hovered && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay) + SetTooltip("%.*s", (int)(label_end - label), label); + + // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden + if (IsMouseReleased(1) && IsItemHovered()) + TableOpenContextMenu(column_n); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Context Menu +//------------------------------------------------------------------------- +// - TableOpenContextMenu() [Internal] +// - TableDrawContextMenu() [Internal] +//------------------------------------------------------------------------- + +// Use -1 to open menu not specific to a given column. +void ImGui::TableOpenContextMenu(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (column_n == -1 && table->CurrentColumn != -1) // When called within a column automatically use this one (for consistency) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) // To facilitate using with TableGetHoveredColumn() + column_n = -1; + IM_ASSERT(column_n >= -1 && column_n < table->ColumnsCount); + if (table->Flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + table->IsContextPopupOpen = true; + table->ContextPopupColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + OpenPopupEx(context_menu_id, ImGuiPopupFlags_None); + } +} + +// Output context menu into current window (generally a popup) +// FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? +void ImGui::TableDrawContextMenu(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + bool want_separator = false; + const int column_n = (table->ContextPopupColumn >= 0 && table->ContextPopupColumn < table->ColumnsCount) ? table->ContextPopupColumn : -1; + ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; + + // Sizing + if (table->Flags & ImGuiTableFlags_Resizable) + { + if (column != NULL) + { + const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled; + if (MenuItem("Size column to fit###SizeOne", NULL, false, can_resize)) + TableSetColumnWidthAutoSingle(table, column_n); + } + + const char* size_all_desc; + if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame) + size_all_desc = "Size all columns to fit###SizeAll"; // All fixed + else + size_all_desc = "Size all columns to default###SizeAll"; // All stretch or mixed + if (MenuItem(size_all_desc, NULL)) + TableSetColumnWidthAutoAll(table); + want_separator = true; + } + + // Ordering + if (table->Flags & ImGuiTableFlags_Reorderable) + { + if (MenuItem("Reset order", NULL, false, !table->IsDefaultDisplayOrder)) + table->IsResetDisplayOrderRequest = true; + want_separator = true; + } + + // Reset all (should work but seems unnecessary/noisy to expose?) + //if (MenuItem("Reset all")) + // table->IsResetAllRequest = true; + + // Sorting + // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) +#if 0 + if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) + { + if (want_separator) + Separator(); + want_separator = true; + + bool append_to_sort_specs = g.IO.KeyShift; + if (MenuItem("Sort in Ascending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Ascending, (column->Flags & ImGuiTableColumnFlags_NoSortAscending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Ascending, append_to_sort_specs); + if (MenuItem("Sort in Descending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Descending, (column->Flags & ImGuiTableColumnFlags_NoSortDescending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Descending, append_to_sort_specs); + } +#endif + + // Hiding / Visibility + if (table->Flags & ImGuiTableFlags_Hideable) + { + if (want_separator) + Separator(); + want_separator = true; + + PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true); + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + const char* name = TableGetColumnName(table, other_column_n); + if (name == NULL || name[0] == 0) + name = "<Unknown>"; + + // Make sure we can't hide the last active column + bool menu_item_active = (other_column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true; + if (other_column->IsEnabled && table->ColumnsEnabledCount <= 1) + menu_item_active = false; + if (MenuItem(name, NULL, other_column->IsEnabled, menu_item_active)) + other_column->IsEnabledNextFrame = !other_column->IsEnabled; + } + PopItemFlag(); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Settings (.ini data) +//------------------------------------------------------------------------- +// FIXME: The binding/finding/creating flow are too confusing. +//------------------------------------------------------------------------- +// - TableSettingsInit() [Internal] +// - TableSettingsCalcChunkSize() [Internal] +// - TableSettingsCreate() [Internal] +// - TableSettingsFindByID() [Internal] +// - TableGetBoundSettings() [Internal] +// - TableResetSettings() +// - TableSaveSettings() [Internal] +// - TableLoadSettings() [Internal] +// - TableSettingsHandler_ClearAll() [Internal] +// - TableSettingsHandler_ApplyAll() [Internal] +// - TableSettingsHandler_ReadOpen() [Internal] +// - TableSettingsHandler_ReadLine() [Internal] +// - TableSettingsHandler_WriteAll() [Internal] +// - TableSettingsInstallHandler() [Internal] +//------------------------------------------------------------------------- +// [Init] 1: TableSettingsHandler_ReadXXXX() Load and parse .ini file into TableSettings. +// [Main] 2: TableLoadSettings() When table is created, bind Table to TableSettings, serialize TableSettings data into Table. +// [Main] 3: TableSaveSettings() When table properties are modified, serialize Table data into bound or new TableSettings, mark .ini as dirty. +// [Main] 4: TableSettingsHandler_WriteAll() When .ini file is dirty (which can come from other source), save TableSettings into .ini file. +//------------------------------------------------------------------------- + +// Clear and initialize empty settings instance +static void TableSettingsInit(ImGuiTableSettings* settings, ImGuiID id, int columns_count, int columns_count_max) +{ + IM_PLACEMENT_NEW(settings) ImGuiTableSettings(); + ImGuiTableColumnSettings* settings_column = settings->GetColumnSettings(); + for (int n = 0; n < columns_count_max; n++, settings_column++) + IM_PLACEMENT_NEW(settings_column) ImGuiTableColumnSettings(); + settings->ID = id; + settings->ColumnsCount = (ImGuiTableColumnIdx)columns_count; + settings->ColumnsCountMax = (ImGuiTableColumnIdx)columns_count_max; + settings->WantApply = true; +} + +static size_t TableSettingsCalcChunkSize(int columns_count) +{ + return sizeof(ImGuiTableSettings) + (size_t)columns_count * sizeof(ImGuiTableColumnSettings); +} + +ImGuiTableSettings* ImGui::TableSettingsCreate(ImGuiID id, int columns_count) +{ + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.alloc_chunk(TableSettingsCalcChunkSize(columns_count)); + TableSettingsInit(settings, id, columns_count, columns_count); + return settings; +} + +// Find existing settings +ImGuiTableSettings* ImGui::TableSettingsFindByID(ImGuiID id) +{ + // FIXME-OPT: Might want to store a lookup map for this? + ImGuiContext& g = *GImGui; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID == id) + return settings; + return NULL; +} + +// Get settings for a given table, NULL if none +ImGuiTableSettings* ImGui::TableGetBoundSettings(ImGuiTable* table) +{ + if (table->SettingsOffset != -1) + { + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.ptr_from_offset(table->SettingsOffset); + IM_ASSERT(settings->ID == table->ID); + if (settings->ColumnsCountMax >= table->ColumnsCount) + return settings; // OK + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return NULL; +} + +// Restore initial state of table (with or without saved settings) +void ImGui::TableResetSettings(ImGuiTable* table) +{ + table->IsInitializing = table->IsSettingsDirty = true; + table->IsResetAllRequest = false; + table->IsSettingsRequestLoad = false; // Don't reload from ini + table->SettingsLoadedFlags = ImGuiTableFlags_None; // Mark as nothing loaded so our initialized data becomes authoritative +} + +void ImGui::TableSaveSettings(ImGuiTable* table) +{ + table->IsSettingsDirty = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind or create settings data + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = TableGetBoundSettings(table); + if (settings == NULL) + { + settings = TableSettingsCreate(table->ID, table->ColumnsCount); + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + settings->ColumnsCount = (ImGuiTableColumnIdx)table->ColumnsCount; + + // Serialize ImGuiTable/ImGuiTableColumn into ImGuiTableSettings/ImGuiTableColumnSettings + IM_ASSERT(settings->ID == table->ID); + IM_ASSERT(settings->ColumnsCount == table->ColumnsCount && settings->ColumnsCountMax >= settings->ColumnsCount); + ImGuiTableColumn* column = table->Columns.Data; + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + + bool save_ref_scale = false; + settings->SaveFlags = ImGuiTableFlags_None; + for (int n = 0; n < table->ColumnsCount; n++, column++, column_settings++) + { + const float width_or_weight = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? column->StretchWeight : column->WidthRequest; + column_settings->WidthOrWeight = width_or_weight; + column_settings->Index = (ImGuiTableColumnIdx)n; + column_settings->DisplayOrder = column->DisplayOrder; + column_settings->SortOrder = column->SortOrder; + column_settings->SortDirection = column->SortDirection; + column_settings->IsEnabled = column->IsEnabled; + column_settings->IsStretch = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? 1 : 0; + if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) == 0) + save_ref_scale = true; + + // We skip saving some data in the .ini file when they are unnecessary to restore our state. + // Note that fixed width where initial width was derived from auto-fit will always be saved as InitStretchWeightOrWidth will be 0.0f. + // FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present. + if (width_or_weight != column->InitStretchWeightOrWidth) + settings->SaveFlags |= ImGuiTableFlags_Resizable; + if (column->DisplayOrder != n) + settings->SaveFlags |= ImGuiTableFlags_Reorderable; + if (column->SortOrder != -1) + settings->SaveFlags |= ImGuiTableFlags_Sortable; + if (column->IsEnabled != ((column->Flags & ImGuiTableColumnFlags_DefaultHide) == 0)) + settings->SaveFlags |= ImGuiTableFlags_Hideable; + } + settings->SaveFlags &= table->Flags; + settings->RefScale = save_ref_scale ? table->RefScale : 0.0f; + + MarkIniSettingsDirty(); +} + +void ImGui::TableLoadSettings(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + table->IsSettingsRequestLoad = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind settings + ImGuiTableSettings* settings; + if (table->SettingsOffset == -1) + { + settings = TableSettingsFindByID(table->ID); + if (settings == NULL) + return; + if (settings->ColumnsCount != table->ColumnsCount) // Allow settings if columns count changed. We could otherwise decide to return... + table->IsSettingsDirty = true; + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + else + { + settings = TableGetBoundSettings(table); + } + + table->SettingsLoadedFlags = settings->SaveFlags; + table->RefScale = settings->RefScale; + + // Serialize ImGuiTableSettings/ImGuiTableColumnSettings into ImGuiTable/ImGuiTableColumn + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + ImU64 display_order_mask = 0; + for (int data_n = 0; data_n < settings->ColumnsCount; data_n++, column_settings++) + { + int column_n = column_settings->Index; + if (column_n < 0 || column_n >= table->ColumnsCount) + continue; + + ImGuiTableColumn* column = &table->Columns[column_n]; + if (settings->SaveFlags & ImGuiTableFlags_Resizable) + { + if (column_settings->IsStretch) + column->StretchWeight = column_settings->WidthOrWeight; + else + column->WidthRequest = column_settings->WidthOrWeight; + column->AutoFitQueue = 0x00; + } + if (settings->SaveFlags & ImGuiTableFlags_Reorderable) + column->DisplayOrder = column_settings->DisplayOrder; + else + column->DisplayOrder = (ImGuiTableColumnIdx)column_n; + display_order_mask |= (ImU64)1 << column->DisplayOrder; + column->IsEnabled = column->IsEnabledNextFrame = column_settings->IsEnabled; + column->SortOrder = column_settings->SortOrder; + column->SortDirection = column_settings->SortDirection; + } + + // Validate and fix invalid display order data + const ImU64 expected_display_order_mask = (settings->ColumnsCount == 64) ? ~0 : ((ImU64)1 << settings->ColumnsCount) - 1; + if (display_order_mask != expected_display_order_mask) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->Columns[column_n].DisplayOrder = (ImGuiTableColumnIdx)column_n; + + // Rebuild index + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; +} + +static void TableSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetSize(); i++) + g.Tables.GetByIndex(i)->SettingsOffset = -1; + g.SettingsTables.clear(); +} + +// Apply to existing windows (if any) +static void TableSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetSize(); i++) + { + ImGuiTable* table = g.Tables.GetByIndex(i); + table->IsSettingsRequestLoad = true; + table->SettingsOffset = -1; + } +} + +static void* TableSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiID id = 0; + int columns_count = 0; + if (sscanf(name, "0x%08X,%d", &id, &columns_count) < 2) + return NULL; + + if (ImGuiTableSettings* settings = ImGui::TableSettingsFindByID(id)) + { + if (settings->ColumnsCountMax >= columns_count) + { + TableSettingsInit(settings, id, columns_count, settings->ColumnsCountMax); // Recycle + return settings; + } + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return ImGui::TableSettingsCreate(id, columns_count); +} + +static void TableSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) +{ + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + ImGuiTableSettings* settings = (ImGuiTableSettings*)entry; + float f = 0.0f; + int column_n = 0, r = 0, n = 0; + + if (sscanf(line, "RefScale=%f", &f) == 1) { settings->RefScale = f; return; } + + if (sscanf(line, "Column %d%n", &column_n, &r) == 1) + { + if (column_n < 0 || column_n >= settings->ColumnsCount) + return; + line = ImStrSkipBlank(line + r); + char c = 0; + ImGuiTableColumnSettings* column = settings->GetColumnSettings() + column_n; + column->Index = (ImGuiTableColumnIdx)column_n; + if (sscanf(line, "UserID=0x%08X%n", (ImU32*)&n, &r)==1) { line = ImStrSkipBlank(line + r); column->UserID = (ImGuiID)n; } + if (sscanf(line, "Width=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = (float)n; column->IsStretch = 0; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Weight=%f%n", &f, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = f; column->IsStretch = 1; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Visible=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->IsEnabled = (ImU8)n; settings->SaveFlags |= ImGuiTableFlags_Hideable; } + if (sscanf(line, "Order=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->DisplayOrder = (ImGuiTableColumnIdx)n; settings->SaveFlags |= ImGuiTableFlags_Reorderable; } + if (sscanf(line, "Sort=%d%c%n", &n, &c, &r) == 2) { line = ImStrSkipBlank(line + r); column->SortOrder = (ImGuiTableColumnIdx)n; column->SortDirection = (c == '^') ? ImGuiSortDirection_Descending : ImGuiSortDirection_Ascending; settings->SaveFlags |= ImGuiTableFlags_Sortable; } + } +} + +static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +{ + ImGuiContext& g = *ctx; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + { + if (settings->ID == 0) // Skip ditched settings + continue; + + // TableSaveSettings() may clear some of those flags when we establish that the data can be stripped + // (e.g. Order was unchanged) + const bool save_size = (settings->SaveFlags & ImGuiTableFlags_Resizable) != 0; + const bool save_visible = (settings->SaveFlags & ImGuiTableFlags_Hideable) != 0; + const bool save_order = (settings->SaveFlags & ImGuiTableFlags_Reorderable) != 0; + const bool save_sort = (settings->SaveFlags & ImGuiTableFlags_Sortable) != 0; + if (!save_size && !save_visible && !save_order && !save_sort) + continue; + + buf->reserve(buf->size() + 30 + settings->ColumnsCount * 50); // ballpark reserve + buf->appendf("[%s][0x%08X,%d]\n", handler->TypeName, settings->ID, settings->ColumnsCount); + if (settings->RefScale != 0.0f) + buf->appendf("RefScale=%g\n", settings->RefScale); + ImGuiTableColumnSettings* column = settings->GetColumnSettings(); + for (int column_n = 0; column_n < settings->ColumnsCount; column_n++, column++) + { + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + buf->appendf("Column %-2d", column_n); + if (column->UserID != 0) buf->appendf(" UserID=%08X", column->UserID); + if (save_size && column->IsStretch) buf->appendf(" Weight=%.4f", column->WidthOrWeight); + if (save_size && !column->IsStretch) buf->appendf(" Width=%d", (int)column->WidthOrWeight); + if (save_visible) buf->appendf(" Visible=%d", column->IsEnabled); + if (save_order) buf->appendf(" Order=%d", column->DisplayOrder); + if (save_sort && column->SortOrder != -1) buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^'); + buf->append("\n"); + } + buf->append("\n"); + } +} + +void ImGui::TableSettingsInstallHandler(ImGuiContext* context) +{ + ImGuiContext& g = *context; + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Table"; + ini_handler.TypeHash = ImHashStr("Table"); + ini_handler.ClearAllFn = TableSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = TableSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = TableSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = TableSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = TableSettingsHandler_WriteAll; + g.SettingsHandlers.push_back(ini_handler); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Garbage Collection +//------------------------------------------------------------------------- +// - TableRemove() [Internal] +// - TableGcCompactTransientBuffers() [Internal] +// - TableGcCompactSettings() [Internal] +//------------------------------------------------------------------------- + +// Remove Table (currently only used by TestEngine) +void ImGui::TableRemove(ImGuiTable* table) +{ + //IMGUI_DEBUG_LOG("TableRemove() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + int table_idx = g.Tables.GetIndex(table); + //memset(table->RawData.Data, 0, table->RawData.size_in_bytes()); + //memset(table, 0, sizeof(ImGuiTable)); + g.Tables.Remove(table->ID, table); + g.TablesLastTimeActive[table_idx] = -1.0f; +} + +// Free up/compact internal Table buffers for when it gets unused +void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table) +{ + //IMGUI_DEBUG_LOG("TableGcCompactTransientBuffers() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + IM_ASSERT(table->MemoryCompacted == false); + table->DrawSplitter.ClearFreeMemory(); + table->SortSpecsMulti.clear(); + table->SortSpecs.Specs = NULL; + table->IsSortSpecsDirty = true; + table->ColumnsNames.clear(); + table->MemoryCompacted = true; + for (int n = 0; n < table->ColumnsCount; n++) + table->Columns[n].NameOffset = -1; + g.TablesLastTimeActive[g.Tables.GetIndex(table)] = -1.0f; +} + +// Compact and remove unused settings data (currently only used by TestEngine) +void ImGui::TableGcCompactSettings() +{ + ImGuiContext& g = *GImGui; + int required_memory = 0; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + required_memory += (int)TableSettingsCalcChunkSize(settings->ColumnsCount); + if (required_memory == g.SettingsTables.Buf.Size) + return; + ImChunkStream<ImGuiTableSettings> new_chunk_stream; + new_chunk_stream.Buf.reserve(required_memory); + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + memcpy(new_chunk_stream.alloc_chunk(TableSettingsCalcChunkSize(settings->ColumnsCount)), settings, TableSettingsCalcChunkSize(settings->ColumnsCount)); + g.SettingsTables.swap(new_chunk_stream); +} + + +//------------------------------------------------------------------------- +// [SECTION] Tables: Debugging +//------------------------------------------------------------------------- +// - DebugNodeTable() [Internal] +//------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_METRICS_WINDOW + +static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_policy) +{ + sizing_policy &= ImGuiTableFlags_SizingMask_; + if (sizing_policy == ImGuiTableFlags_SizingFixedFit) { return "FixedFit"; } + if (sizing_policy == ImGuiTableFlags_SizingFixedSame) { return "FixedSame"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchProp) { return "StretchProp"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchSame) { return "StretchSame"; } + return "N/A"; +} + +void ImGui::DebugNodeTable(ImGuiTable* table) +{ + char buf[512]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (table->LastFrameActive >= ImGui::GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. + ImFormatString(p, buf_end - p, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(table, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min, table->OuterRect.Max, IM_COL32(255, 255, 0, 255)); + if (IsItemVisible() && table->HoveredColumnBody != -1) + GetForegroundDrawList()->AddRect(GetItemRectMin(), GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + if (!open) + return; + bool clear_settings = SmallButton("Clear settings"); + BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); + BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); + BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); + BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); + BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); + //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); + float sum_weights = 0.0f; + for (int n = 0; n < table->ColumnsCount; n++) + if (table->Columns[n].Flags & ImGuiTableColumnFlags_WidthStretch) + sum_weights += table->Columns[n].StretchWeight; + for (int n = 0; n < table->ColumnsCount; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + const char* name = TableGetColumnName(table, n); + ImFormatString(buf, IM_ARRAYSIZE(buf), + "Column %d order %d '%s': offset %+.2f to %+.2f%s\n" + "Enabled: %d, VisibleX/Y: %d/%d, RequestOutput: %d, SkipItems: %d, DrawChannels: %d,%d\n" + "WidthGiven: %.1f, Request/Auto: %.1f/%.1f, StretchWeight: %.3f (%.1f%%)\n" + "MinX: %.1f, MaxX: %.1f (%+.1f), ClipRect: %.1f to %.1f (+%.1f)\n" + "ContentWidth: %.1f,%.1f, HeadersUsed/Ideal %.1f/%.1f\n" + "Sort: %d%s, UserID: 0x%08X, Flags: 0x%04X: %s%s%s..", + n, column->DisplayOrder, name, column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, (n < table->FreezeColumnsRequest) ? " (Frozen)" : "", + column->IsEnabled, column->IsVisibleX, column->IsVisibleY, column->IsRequestOutput, column->IsSkipItems, column->DrawChannelFrozen, column->DrawChannelUnfrozen, + column->WidthGiven, column->WidthRequest, column->WidthAuto, column->StretchWeight, column->StretchWeight > 0.0f ? (column->StretchWeight / sum_weights) * 100.0f : 0.0f, + column->MinX, column->MaxX, column->MaxX - column->MinX, column->ClipRect.Min.x, column->ClipRect.Max.x, column->ClipRect.Max.x - column->ClipRect.Min.x, + column->ContentMaxXFrozen - column->WorkMinX, column->ContentMaxXUnfrozen - column->WorkMinX, column->ContentMaxXHeadersUsed - column->WorkMinX, column->ContentMaxXHeadersIdeal - column->WorkMinX, + column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? " (Asc)" : (column->SortDirection == ImGuiSortDirection_Descending) ? " (Des)" : "", column->UserID, column->Flags, + (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? "WidthStretch " : "", + (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? "WidthFixed " : "", + (column->Flags & ImGuiTableColumnFlags_NoResize) ? "NoResize " : ""); + Bullet(); + Selectable(buf); + if (IsItemHovered()) + { + ImRect r(column->MinX, table->OuterRect.Min.y, column->MaxX, table->OuterRect.Max.y); + GetForegroundDrawList()->AddRect(r.Min, r.Max, IM_COL32(255, 255, 0, 255)); + } + } + if (ImGuiTableSettings* settings = TableGetBoundSettings(table)) + DebugNodeTableSettings(settings); + if (clear_settings) + table->IsResetAllRequest = true; + TreePop(); +} + +void ImGui::DebugNodeTableSettings(ImGuiTableSettings* settings) +{ + if (!TreeNode((void*)(intptr_t)settings->ID, "Settings 0x%08X (%d columns)", settings->ID, settings->ColumnsCount)) + return; + BulletText("SaveFlags: 0x%08X", settings->SaveFlags); + BulletText("ColumnsCount: %d (max %d)", settings->ColumnsCount, settings->ColumnsCountMax); + for (int n = 0; n < settings->ColumnsCount; n++) + { + ImGuiTableColumnSettings* column_settings = &settings->GetColumnSettings()[n]; + ImGuiSortDirection sort_dir = (column_settings->SortOrder != -1) ? (ImGuiSortDirection)column_settings->SortDirection : ImGuiSortDirection_None; + BulletText("Column %d Order %d SortOrder %d %s Vis %d %s %7.3f UserID 0x%08X", + n, column_settings->DisplayOrder, column_settings->SortOrder, + (sort_dir == ImGuiSortDirection_Ascending) ? "Asc" : (sort_dir == ImGuiSortDirection_Descending) ? "Des" : "---", + column_settings->IsEnabled, column_settings->IsStretch ? "Weight" : "Width ", column_settings->WidthOrWeight, column_settings->UserID); + } + TreePop(); +} + +#else // #ifndef IMGUI_DISABLE_METRICS_WINDOW + +void ImGui::DebugNodeTable(ImGuiTable*) {} +void ImGui::DebugNodeTableSettings(ImGuiTableSettings*) {} + +#endif + + +//------------------------------------------------------------------------- +// [SECTION] Columns, BeginColumns, EndColumns, etc. +// (This is a legacy API, prefer using BeginTable/EndTable!) +//------------------------------------------------------------------------- +// FIXME: sizing is lossy when columns width is very small (default width may turn negative etc.) +//------------------------------------------------------------------------- +// - SetWindowClipRectBeforeSetChannel() [Internal] +// - GetColumnIndex() +// - GetColumnsCount() +// - GetColumnOffset() +// - GetColumnWidth() +// - SetColumnOffset() +// - SetColumnWidth() +// - PushColumnClipRect() [Internal] +// - PushColumnsBackground() [Internal] +// - PopColumnsBackground() [Internal] +// - FindOrCreateColumns() [Internal] +// - GetColumnsID() [Internal] +// - BeginColumns() +// - NextColumn() +// - EndColumns() +// - Columns() +//------------------------------------------------------------------------- + +// [Internal] Small optimization to avoid calls to PopClipRect/SetCurrentChannel/PushClipRect in sequences, +// they would meddle many times with the underlying ImDrawCmd. +// Instead, we do a preemptive overwrite of clipping rectangle _without_ altering the command-buffer and let +// the subsequent single call to SetCurrentChannel() does it things once. +void ImGui::SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect) +{ + ImVec4 clip_rect_vec4 = clip_rect.ToVec4(); + window->ClipRect = clip_rect; + window->DrawList->_CmdHeader.ClipRect = clip_rect_vec4; + window->DrawList->_ClipRectStack.Data[window->DrawList->_ClipRectStack.Size - 1] = clip_rect_vec4; +} + +int ImGui::GetColumnIndex() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0; +} + +int ImGui::GetColumnsCount() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1; +} + +float ImGui::GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm) +{ + return offset_norm * (columns->OffMaxX - columns->OffMinX); +} + +float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset) +{ + return offset / (columns->OffMaxX - columns->OffMinX); +} + +static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; + +static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) +{ + // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing + // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. + IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); + + float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; + x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); + if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) + x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); + + return x; +} + +float ImGui::GetColumnOffset(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return 0.0f; + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const float t = columns->Columns[column_index].OffsetNorm; + const float x_offset = ImLerp(columns->OffMinX, columns->OffMaxX, t); + return x_offset; +} + +static float GetColumnWidthEx(ImGuiOldColumns* columns, int column_index, bool before_resize = false) +{ + if (column_index < 0) + column_index = columns->Current; + + float offset_norm; + if (before_resize) + offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; + else + offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; + return ImGui::GetColumnOffsetFromNorm(columns, offset_norm); +} + +float ImGui::GetColumnWidth(int column_index) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return GetContentRegionAvail().x; + + if (column_index < 0) + column_index = columns->Current; + return GetColumnOffsetFromNorm(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); +} + +void ImGui::SetColumnOffset(int column_index, float offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const bool preserve_width = !(columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths) && (column_index < columns->Count - 1); + const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; + + if (!(columns->Flags & ImGuiOldColumnFlags_NoForceWithinWindow)) + offset = ImMin(offset, columns->OffMaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); + columns->Columns[column_index].OffsetNorm = GetColumnNormFromOffset(columns, offset - columns->OffMinX); + + if (preserve_width) + SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); +} + +void ImGui::SetColumnWidth(int column_index, float width) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); +} + +void ImGui::PushColumnClipRect(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (column_index < 0) + column_index = columns->Current; + + ImGuiOldColumnData* column = &columns->Columns[column_index]; + PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false); +} + +// Get into the columns background draw command (which is generally the same draw command as before we called BeginColumns) +void ImGui::PushColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + columns->HostBackupClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, columns->HostInitialClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, 0); +} + +void ImGui::PopColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, columns->HostBackupClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); +} + +ImGuiOldColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id) +{ + // We have few columns per window so for now we don't need bother much with turning this into a faster lookup. + for (int n = 0; n < window->ColumnsStorage.Size; n++) + if (window->ColumnsStorage[n].ID == id) + return &window->ColumnsStorage[n]; + + window->ColumnsStorage.push_back(ImGuiOldColumns()); + ImGuiOldColumns* columns = &window->ColumnsStorage.back(); + columns->ID = id; + return columns; +} + +ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count) +{ + ImGuiWindow* window = GetCurrentWindow(); + + // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. + // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. + PushID(0x11223347 + (str_id ? 0 : columns_count)); + ImGuiID id = window->GetID(str_id ? str_id : "columns"); + PopID(); + + return id; +} + +void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + IM_ASSERT(columns_count >= 1); + IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported + + // Acquire storage for the columns set + ImGuiID id = GetColumnsID(str_id, columns_count); + ImGuiOldColumns* columns = FindOrCreateColumns(window, id); + IM_ASSERT(columns->ID == id); + columns->Current = 0; + columns->Count = columns_count; + columns->Flags = flags; + window->DC.CurrentColumns = columns; + + columns->HostCursorPosY = window->DC.CursorPos.y; + columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x; + columns->HostInitialClipRect = window->ClipRect; + columns->HostBackupParentWorkRect = window->ParentWorkRect; + window->ParentWorkRect = window->WorkRect; + + // Set state for first column + // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect + const float column_padding = g.Style.ItemSpacing.x; + const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); + const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); + const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; + columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); + columns->OffMaxX = ImMax(ImMin(max_1, max_2) - window->Pos.x, columns->OffMinX + 1.0f); + columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y; + + // Clear data if columns count changed + if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1) + columns->Columns.resize(0); + + // Initialize default widths + columns->IsFirstFrame = (columns->Columns.Size == 0); + if (columns->Columns.Size == 0) + { + columns->Columns.reserve(columns_count + 1); + for (int n = 0; n < columns_count + 1; n++) + { + ImGuiOldColumnData column; + column.OffsetNorm = n / (float)columns_count; + columns->Columns.push_back(column); + } + } + + for (int n = 0; n < columns_count; n++) + { + // Compute clipping rectangle + ImGuiOldColumnData* column = &columns->Columns[n]; + float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n)); + float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f); + column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); + column->ClipRect.ClipWithFull(window->ClipRect); + } + + if (columns->Count > 1) + { + columns->Splitter.Split(window->DrawList, 1 + columns->Count); + columns->Splitter.SetCurrentChannel(window->DrawList, 1); + PushColumnClipRect(0); + } + + // We don't generally store Indent.x inside ColumnsOffset because it may be manipulated by the user. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::NextColumn() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems || window->DC.CurrentColumns == NULL) + return; + + ImGuiContext& g = *GImGui; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + + if (columns->Count == 1) + { + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + IM_ASSERT(columns->Current == 0); + return; + } + + // Next column + if (++columns->Current == columns->Count) + columns->Current = 0; + + PopItemWidth(); + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + PushClipRect() + // (which would needlessly attempt to update commands in the wrong channel, then pop or overwrite them), + ImGuiOldColumnData* column = &columns->Columns[columns->Current]; + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); + + const float column_padding = g.Style.ItemSpacing.x; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + if (columns->Current > 0) + { + // Columns 1+ ignore IndentX (by canceling it out) + // FIXME-COLUMNS: Unnecessary, could be locked? + window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + column_padding; + } + else + { + // New row/line: column 0 honor IndentX. + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + columns->LineMinY = columns->LineMaxY; + } + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.y = columns->LineMinY; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = 0.0f; + + // FIXME-COLUMNS: Share code with BeginColumns() - move code on columns setup. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::EndColumns() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + PopItemWidth(); + if (columns->Count > 1) + { + PopClipRect(); + columns->Splitter.Merge(window->DrawList); + } + + const ImGuiOldColumnFlags flags = columns->Flags; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + window->DC.CursorPos.y = columns->LineMaxY; + if (!(flags & ImGuiOldColumnFlags_GrowParentContentsSize)) + window->DC.CursorMaxPos.x = columns->HostCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent + + // Draw columns borders and handle resize + // The IsBeingResized flag ensure we preserve pre-resize columns width so back-and-forth are not lossy + bool is_being_resized = false; + if (!(flags & ImGuiOldColumnFlags_NoBorder) && !window->SkipItems) + { + // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. + const float y1 = ImMax(columns->HostCursorPosY, window->ClipRect.Min.y); + const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y); + int dragging_column = -1; + for (int n = 1; n < columns->Count; n++) + { + ImGuiOldColumnData* column = &columns->Columns[n]; + float x = window->Pos.x + GetColumnOffset(n); + const ImGuiID column_id = columns->ID + ImGuiID(n); + const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; + const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); + KeepAliveID(column_id); + if (IsClippedEx(column_hit_rect, column_id, false)) + continue; + + bool hovered = false, held = false; + if (!(flags & ImGuiOldColumnFlags_NoResize)) + { + ButtonBehavior(column_hit_rect, column_id, &hovered, &held); + if (hovered || held) + g.MouseCursor = ImGuiMouseCursor_ResizeEW; + if (held && !(column->Flags & ImGuiOldColumnFlags_NoResize)) + dragging_column = n; + } + + // Draw column + const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); + const float xi = IM_FLOOR(x); + window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); + } + + // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. + if (dragging_column != -1) + { + if (!columns->IsBeingResized) + for (int n = 0; n < columns->Count + 1; n++) + columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; + columns->IsBeingResized = is_being_resized = true; + float x = GetDraggedColumnOffset(columns, dragging_column); + SetColumnOffset(dragging_column, x); + } + } + columns->IsBeingResized = is_being_resized; + + window->WorkRect = window->ParentWorkRect; + window->ParentWorkRect = columns->HostBackupParentWorkRect; + window->DC.CurrentColumns = NULL; + window->DC.ColumnsOffset.x = 0.0f; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); +} + +void ImGui::Columns(int columns_count, const char* id, bool border) +{ + ImGuiWindow* window = GetCurrentWindow(); + IM_ASSERT(columns_count >= 1); + + ImGuiOldColumnFlags flags = (border ? 0 : ImGuiOldColumnFlags_NoBorder); + //flags |= ImGuiOldColumnFlags_NoPreserveWidths; // NB: Legacy behavior + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns != NULL && columns->Count == columns_count && columns->Flags == flags) + return; + + if (columns != NULL) + EndColumns(); + + if (columns_count != 1) + BeginColumns(id, columns_count, flags); +} + +//------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_user.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_user.h similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui_user.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui_user.h diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_user.inl b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_user.inl similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui_user.inl rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui_user.inl diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_widgets.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp similarity index 63% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imgui_widgets.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp index 5b3ea5815a..86381358fa 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imgui_widgets.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.70 +// dear imgui, v1.82 // (widgets code) /* @@ -24,6 +24,7 @@ Index of this file: // [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc. // [SECTION] Widgets: BeginTabBar, EndTabBar, etc. // [SECTION] Widgets: BeginTabItem, EndTabItem, etc. +// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc. */ @@ -32,11 +33,14 @@ Index of this file: #endif #include "imgui.h" +#ifndef IMGUI_DISABLE + #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS #endif #include "imgui_internal.h" +// System includes #include <ctype.h> // toupper #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier #include <stddef.h> // intptr_t @@ -44,35 +48,48 @@ Index of this file: #include <stdint.h> // intptr_t #endif +//------------------------------------------------------------------------- +// Warnings +//------------------------------------------------------------------------- + // Visual Studio warnings #ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif #endif // Clang/GCC warnings with -Weverything -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0 -#endif -#if __has_warning("-Wdouble-promotion") -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! #endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision #elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked -#if __GNUC__ >= 8 -#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead #endif //------------------------------------------------------------------------- // Data //------------------------------------------------------------------------- +// Widgets +static const float DRAGDROP_HOLD_TO_OPEN_TIMER = 0.70f; // Time for drag-hold to activate items accepting the ImGuiButtonFlags_PressedOnDragDropHold button behavior. +static const float DRAG_MOUSE_THRESHOLD_FACTOR = 0.50f; // Multiplier for the default value of io.MouseDragThreshold to make DragFloat/DragInt react faster to mouse drags. + // Those MIN/MAX values are not define because we need to point to them static const signed char IM_S8_MIN = -128; static const signed char IM_S8_MAX = 127; @@ -112,6 +129,7 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const //------------------------------------------------------------------------- // [SECTION] Widgets: Text, etc. //------------------------------------------------------------------------- +// - TextEx() [Internal] // - TextUnformatted() // - Text() // - TextV() @@ -139,7 +157,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) if (text_end == NULL) text_end = text + strlen(text); // FIXME-OPT - const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrentLineTextBaseOffset); + const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); const float wrap_pos_x = window->DC.TextWrapPos; const bool wrap_enabled = (wrap_pos_x >= 0.0f); if (text_end - text > 2000 && !wrap_enabled) @@ -151,7 +169,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) // - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop. const char* line = text; const float line_height = GetTextLineHeight(); - ImVec2 text_size(0,0); + ImVec2 text_size(0, 0); // Lines to skip (can't skip when logging text) ImVec2 pos = text_pos; @@ -212,7 +230,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) text_size.y = (pos - text_pos).y; ImRect bb(text_pos, text_pos + text_size); - ItemSize(text_size); + ItemSize(text_size, 0.0f); ItemAdd(bb, 0); } else @@ -221,7 +239,7 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); ImRect bb(text_pos, text_pos + text_size); - ItemSize(text_size); + ItemSize(text_size, 0.0f); if (!ItemAdd(bb, 0)) return; @@ -265,7 +283,10 @@ void ImGui::TextColored(const ImVec4& col, const char* fmt, ...) void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args) { PushStyleColor(ImGuiCol_Text, col); - TextV(fmt, args); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); PopStyleColor(); } @@ -279,8 +300,12 @@ void ImGui::TextDisabled(const char* fmt, ...) void ImGui::TextDisabledV(const char* fmt, va_list args) { - PushStyleColor(ImGuiCol_Text, GImGui->Style.Colors[ImGuiCol_TextDisabled]); - TextV(fmt, args); + ImGuiContext& g = *GImGui; + PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); PopStyleColor(); } @@ -294,11 +319,14 @@ void ImGui::TextWrapped(const char* fmt, ...) void ImGui::TextWrappedV(const char* fmt, va_list args) { - ImGuiWindow* window = GetCurrentWindow(); - bool need_backup = (window->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set + ImGuiContext& g = *GImGui; + bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set if (need_backup) PushTextWrapPos(0.0f); - TextV(fmt, args); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); if (need_backup) PopTextWrapPos(); } @@ -320,11 +348,11 @@ void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; - const float w = GetNextItemWidth(); + const float w = CalcItemWidth(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2)); - const ImRect total_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), style.FramePadding.y*2) + label_size); + const ImRect value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2)); + const ImRect total_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), style.FramePadding.y * 2) + label_size); ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, 0)) return; @@ -332,7 +360,7 @@ void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) // Render const char* value_text_begin = &g.TempBuffer[0]; const char* value_text_end = value_text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - RenderTextClipped(value_bb.Min, value_bb.Max, value_text_begin, value_text_end, NULL, ImVec2(0.0f,0.5f)); + RenderTextClipped(value_bb.Min, value_bb.Max, value_text_begin, value_text_end, NULL, ImVec2(0.0f, 0.5f)); if (label_size.x > 0.0f) RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label); } @@ -358,16 +386,18 @@ void ImGui::BulletTextV(const char* fmt, va_list args) const char* text_begin = g.TempBuffer; const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); const ImVec2 label_size = CalcTextSize(text_begin, text_end, false); - const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it - const float line_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding - ItemSize(bb); + const ImVec2 total_size = ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x * 2) : 0.0f), label_size.y); // Empty text doesn't add padding + ImVec2 pos = window->DC.CursorPos; + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(total_size, 0.0f); + const ImRect bb(pos, pos + total_size); if (!ItemAdd(bb, 0)) return; // Render - RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f)); - RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end, false); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, g.FontSize * 0.5f), text_col); + RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false); } //------------------------------------------------------------------------- @@ -380,10 +410,14 @@ void ImGui::BulletTextV(const char* fmt, va_list args) // - ArrowButton() // - CloseButton() [Internal] // - CollapseButton() [Internal] +// - GetWindowScrollbarID() [Internal] +// - GetWindowScrollbarRect() [Internal] // - Scrollbar() [Internal] +// - ScrollbarEx() [Internal] // - Image() // - ImageButton() // - Checkbox() +// - CheckboxFlagsT() [Internal] // - CheckboxFlags() // - RadioButton() // - ProgressBar() @@ -397,37 +431,37 @@ void ImGui::BulletTextV(const char* fmt, va_list args) // See the series of events below and the corresponding state reported by dear imgui: //------------------------------------------------------------------------------------------------------------------------------------------------ // with PressedOnClickRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() -// Frame N+0 (mouse is outside bb) - - - - - - -// Frame N+1 (mouse moves inside bb) - true - - - - +// Frame N+0 (mouse is outside bb) - - - - - - +// Frame N+1 (mouse moves inside bb) - true - - - - // Frame N+2 (mouse button is down) - true true true - true -// Frame N+3 (mouse button is down) - true true - - - +// Frame N+3 (mouse button is down) - true true - - - // Frame N+4 (mouse moves outside bb) - - true - - - // Frame N+5 (mouse moves inside bb) - true true - - - -// Frame N+6 (mouse button is released) true true - - true - -// Frame N+7 (mouse button is released) - true - - - - -// Frame N+8 (mouse moves outside bb) - - - - - - +// Frame N+6 (mouse button is released) true true - - true - +// Frame N+7 (mouse button is released) - true - - - - +// Frame N+8 (mouse moves outside bb) - - - - - - //------------------------------------------------------------------------------------------------------------------------------------------------ // with PressedOnClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() // Frame N+2 (mouse button is down) true true true true - true -// Frame N+3 (mouse button is down) - true true - - - -// Frame N+6 (mouse button is released) - true - - true - -// Frame N+7 (mouse button is released) - true - - - - +// Frame N+3 (mouse button is down) - true true - - - +// Frame N+6 (mouse button is released) - true - - true - +// Frame N+7 (mouse button is released) - true - - - - //------------------------------------------------------------------------------------------------------------------------------------------------ // with PressedOnRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() // Frame N+2 (mouse button is down) - true - - - true -// Frame N+3 (mouse button is down) - true - - - - +// Frame N+3 (mouse button is down) - true - - - - // Frame N+6 (mouse button is released) true true - - - - -// Frame N+7 (mouse button is released) - true - - - - +// Frame N+7 (mouse button is released) - true - - - - //------------------------------------------------------------------------------------------------------------------------------------------------ // with PressedOnDoubleClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() // Frame N+0 (mouse button is down) - true - - - true -// Frame N+1 (mouse button is down) - true - - - - +// Frame N+1 (mouse button is down) - true - - - - // Frame N+2 (mouse button is released) - true - - - - -// Frame N+3 (mouse button is released) - true - - - - +// Frame N+3 (mouse button is released) - true - - - - // Frame N+4 (mouse button is down) true true true true - true -// Frame N+5 (mouse button is down) - true true - - - +// Frame N+5 (mouse button is down) - true true - - - // Frame N+6 (mouse button is released) - true - - true - -// Frame N+7 (mouse button is released) - true - - - - +// Frame N+7 (mouse button is released) - true - - - - //------------------------------------------------------------------------------------------------------------------------------------------------ // Note that some combinations are supported, // - PressedOnDragDropHold can generally be associated with any flag. @@ -437,7 +471,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args) // Repeat+ Repeat+ Repeat+ Repeat+ // PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick //------------------------------------------------------------------------------------------------------------------------------------------------- -// Frame N+0 (mouse button is down) - true - true +// Frame N+0 (mouse button is down) - true - true // ... - - - - // Frame N + RepeatDelay true true - true // ... - - - - @@ -457,17 +491,22 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool return false; } - // Default behavior requires click+release on same spot - if ((flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick)) == 0) - flags |= ImGuiButtonFlags_PressedOnClickRelease; + // Default only reacts to left mouse button + if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0) + flags |= ImGuiButtonFlags_MouseButtonDefault_; + + // Default behavior requires click + release inside bounding box + if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) + flags |= ImGuiButtonFlags_PressedOnDefault_; ImGuiWindow* backup_hovered_window = g.HoveredWindow; - if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window) + const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; + if (flatten_hovered_children) g.HoveredWindow = window; #ifdef IMGUI_ENABLE_TEST_ENGINE if (id != 0 && window->DC.LastItemId != id) - ImGuiTestEngineHook_ItemAdd(&g, bb, id); + IMGUI_TEST_ENGINE_ITEM_ADD(bb, id); #endif bool pressed = false; @@ -483,52 +522,71 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool { hovered = true; SetHoveredID(id); - if (CalcTypematicPressedRepeatAmount(g.HoveredIdTimer + 0.0001f, g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, 0.01f, 0.70f)) // FIXME: Our formula for CalcTypematicPressedRepeatAmount() is fishy + if (CalcTypematicRepeatAmount(g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, g.HoveredIdTimer + 0.0001f, DRAGDROP_HOLD_TO_OPEN_TIMER, 0.00f)) { pressed = true; + g.DragDropHoldJustPressedId = id; FocusWindow(window); } } - if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window) + if (flatten_hovered_children) g.HoveredWindow = backup_hovered_window; // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) hovered = false; - // Mouse + // Mouse handling if (hovered) { if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) { - if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[0]) + // Poll buttons + int mouse_button_clicked = -1; + int mouse_button_released = -1; + if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseClicked[0]) { mouse_button_clicked = 0; } + else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseClicked[1]) { mouse_button_clicked = 1; } + else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseClicked[2]) { mouse_button_clicked = 2; } + if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseReleased[0]) { mouse_button_released = 0; } + else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseReleased[1]) { mouse_button_released = 1; } + else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseReleased[2]) { mouse_button_released = 2; } + + if (mouse_button_clicked != -1 && g.ActiveId != id) { - SetActiveID(id, window); - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - FocusWindow(window); + if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere)) + { + SetActiveID(id, window); + g.ActiveIdMouseButton = mouse_button_clicked; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + FocusWindow(window); + } + if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[mouse_button_clicked])) + { + pressed = true; + if (flags & ImGuiButtonFlags_NoHoldingActiveId) + ClearActiveID(); + else + SetActiveID(id, window); // Hold on ID + g.ActiveIdMouseButton = mouse_button_clicked; + FocusWindow(window); + } } - if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0])) + if ((flags & ImGuiButtonFlags_PressedOnRelease) && mouse_button_released != -1) { - pressed = true; - if (flags & ImGuiButtonFlags_NoHoldingActiveID) - ClearActiveID(); - else - SetActiveID(id, window); // Hold on ID - FocusWindow(window); - } - if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0]) - { - if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps <on release> + // Repeat mode trumps on release behavior + const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; + if (!has_repeated_at_least_once) pressed = true; ClearActiveID(); } // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. - if ((flags & ImGuiButtonFlags_Repeat) && g.ActiveId == id && g.IO.MouseDownDuration[0] > 0.0f && IsMouseClicked(0, true)) - pressed = true; + if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) + if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, true)) + pressed = true; } if (pressed) @@ -538,13 +596,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // Gamepad/Keyboard navigation // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) - if (!(flags & ImGuiButtonFlags_NoHoveredOnNav)) + if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) hovered = true; - if (g.NavActivateDownId == id) { bool nav_activated_by_code = (g.NavActivateId == id); - bool nav_activated_by_inputs = IsNavInputPressed(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed); + bool nav_activated_by_inputs = IsNavInputTest(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed); if (nav_activated_by_code || nav_activated_by_inputs) pressed = true; if (nav_activated_by_code || nav_activated_by_inputs || g.ActiveId == id) @@ -554,29 +611,33 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool SetActiveID(id, window); if ((nav_activated_by_code || nav_activated_by_inputs) && !(flags & ImGuiButtonFlags_NoNavFocus)) SetFocusID(id, window); - g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right) | (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); } } + // Process while held bool held = false; if (g.ActiveId == id) { - if (pressed) - g.ActiveIdHasBeenPressed = true; if (g.ActiveIdSource == ImGuiInputSource_Mouse) { if (g.ActiveIdIsJustActivated) g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; - if (g.IO.MouseDown[0]) + + const int mouse_button = g.ActiveIdMouseButton; + IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); + if (g.IO.MouseDown[mouse_button]) { held = true; } else { - if (hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) && !g.DragDropActive) + bool release_in = hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) != 0; + bool release_anywhere = (flags & ImGuiButtonFlags_PressedOnClickReleaseAnywhere) != 0; + if ((release_in || release_anywhere) && !g.DragDropActive) { - bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDownWasDoubleClick[0]; - bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay; // Repeat mode trumps <on release> + // Report as pressed when releasing the mouse (this is the most common path) + bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDownWasDoubleClick[mouse_button]; + bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps <on release> if (!is_double_click_release && !is_repeating_already) pressed = true; } @@ -587,9 +648,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool } else if (g.ActiveIdSource == ImGuiInputSource_Nav) { + // When activated using Nav, we hold on the ActiveID until activation button is released if (g.NavActivateDownId != id) ClearActiveID(); } + if (pressed) + g.ActiveIdHasBeenPressedBefore = true; } if (out_hovered) *out_hovered = hovered; @@ -610,8 +674,8 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags const ImVec2 label_size = CalcTextSize(label, NULL, true); ImVec2 pos = window->DC.CursorPos; - if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrentLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) - pos.y += window->DC.CurrentLineTextBaseOffset - style.FramePadding.y; + if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) + pos.y += window->DC.CurrLineTextBaseOffset - style.FramePadding.y; ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f); const ImRect bb(pos, pos + size); @@ -623,13 +687,14 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags |= ImGuiButtonFlags_Repeat; bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - if (pressed) - MarkItemEdited(id); // Render const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); RenderNavHighlight(bb, id); RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); + + if (g.LogEnabled) + LogSetNextTextDecoration("[", "]"); RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); // Automatically close popups @@ -642,7 +707,7 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags bool ImGui::Button(const char* label, const ImVec2& size_arg) { - return ButtonEx(label, size_arg, 0); + return ButtonEx(label, size_arg, ImGuiButtonFlags_None); } // Small buttons fits within text without additional vertical spacing. @@ -658,7 +723,7 @@ bool ImGui::SmallButton(const char* label) // Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack. // Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id) -bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg) +bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg, ImGuiButtonFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -675,7 +740,7 @@ bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg) return false; bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); return pressed; } @@ -690,7 +755,7 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu const ImGuiID id = window->GetID(str_id); const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); const float default_size = GetFrameHeight(); - ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f); + ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); if (!ItemAdd(bb, id)) return false; @@ -701,10 +766,11 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + const ImU32 text_col = GetColorU32(ImGuiCol_Text); RenderNavHighlight(bb, id); - RenderFrame(bb.Min, bb.Max, col, true, g.Style.FrameRounding); - RenderArrow(bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), dir); + RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); + RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir); return pressed; } @@ -712,35 +778,44 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu bool ImGui::ArrowButton(const char* str_id, ImGuiDir dir) { float sz = GetFrameHeight(); - return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), 0); + return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), ImGuiButtonFlags_None); } // Button to close a window -bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius) +bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - // We intentionally allow interaction when clipped so that a mechanical Alt,Right,Validate sequence close a window. + // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) + // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? + const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + ImRect bb_interact = bb; + const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); + if (area_to_visible_ratio < 1.5f) + bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); + + // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). - const ImRect bb(pos - ImVec2(radius,radius), pos + ImVec2(radius,radius)); - bool is_clipped = !ItemAdd(bb, id); + bool is_clipped = !ItemAdd(bb_interact, id); bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); + bool pressed = ButtonBehavior(bb_interact, id, &hovered, &held); if (is_clipped) return pressed; // Render + // FIXME: Clarify this mess + ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered); ImVec2 center = bb.GetCenter(); if (hovered) - window->DrawList->AddCircleFilled(center, ImMax(2.0f, radius), GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered), 9); + window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12); - float cross_extent = (radius * 0.7071f) - 1.0f; + float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f; ImU32 cross_col = GetColorU32(ImGuiCol_Text); center -= ImVec2(0.5f, 0.5f); - window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), cross_col, 1.0f); - window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), cross_col, 1.0f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, +cross_extent), center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, -cross_extent), center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f); return pressed; } @@ -755,147 +830,164 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); - ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + // Render + ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + ImVec2 center = bb.GetCenter(); if (hovered || held) - window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0.0f, -0.5f), g.FontSize * 0.5f + 1.0f, col, 9); - RenderArrow(bb.Min + g.Style.FramePadding, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); + window->DrawList->AddCircleFilled(center/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12); + RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); // Switch to moving the window after mouse is moved beyond the initial drag threshold - if (IsItemActive() && IsMouseDragging()) + if (IsItemActive() && IsMouseDragging(0)) StartMouseMovingWindow(window); return pressed; } -ImGuiID ImGui::GetScrollbarID(ImGuiWindow* window, ImGuiAxis axis) +ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis) { return window->GetIDNoKeepAlive(axis == ImGuiAxis_X ? "#SCROLLX" : "#SCROLLY"); } +// Return scrollbar rectangle, must only be called for corresponding axis if window->ScrollbarX/Y is set. +ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) +{ + const ImRect outer_rect = window->Rect(); + const ImRect inner_rect = window->InnerRect; + const float border_size = window->WindowBorderSize; + const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) + IM_ASSERT(scrollbar_size > 0.0f); + if (axis == ImGuiAxis_X) + return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); + else + return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); +} + +void ImGui::Scrollbar(ImGuiAxis axis) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const ImGuiID id = GetWindowScrollbarID(window, axis); + KeepAliveID(id); + + // Calculate scrollbar bounding box + ImRect bb = GetWindowScrollbarRect(window, axis); + ImDrawFlags rounding_corners = ImDrawFlags_RoundCornersNone; + if (axis == ImGuiAxis_X) + { + rounding_corners |= ImDrawFlags_RoundCornersBottomLeft; + if (!window->ScrollbarY) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + else + { + if ((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) + rounding_corners |= ImDrawFlags_RoundCornersTopRight; + if (!window->ScrollbarX) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; + float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f; + ScrollbarEx(bb, id, axis, &window->Scroll[axis], size_avail, size_contents, rounding_corners); +} + // Vertical/Horizontal scrollbar // The entire piece of code below is rather confusing because: // - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab) // - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar // - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. -void ImGui::Scrollbar(ImGuiAxis axis) +// Still, the code should probably be made simpler.. +bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float size_avail_v, float size_contents_v, ImDrawFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; - const bool horizontal = (axis == ImGuiAxis_X); - const ImGuiStyle& style = g.Style; - const ImGuiID id = GetScrollbarID(window, axis); - KeepAliveID(id); + const float bb_frame_width = bb_frame.GetWidth(); + const float bb_frame_height = bb_frame.GetHeight(); + if (bb_frame_width <= 0.0f || bb_frame_height <= 0.0f) + return false; - // Render background - bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX); - float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f; - const ImRect host_rect = window->Rect(); - const float border_size = window->WindowBorderSize; - ImRect bb = horizontal - ? ImRect(host_rect.Min.x + border_size, host_rect.Max.y - style.ScrollbarSize, host_rect.Max.x - other_scrollbar_size_w - border_size, host_rect.Max.y - border_size) - : ImRect(host_rect.Max.x - style.ScrollbarSize, host_rect.Min.y + border_size, host_rect.Max.x - border_size, host_rect.Max.y - other_scrollbar_size_w - border_size); - bb.Min.x = ImMax(host_rect.Min.x, bb.Min.x); // Handle case where the host rectangle is smaller than the scrollbar - bb.Min.y = ImMax(host_rect.Min.y, bb.Min.y); - if (!horizontal) - bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f); // FIXME: InnerRect? - - const float bb_width = bb.GetWidth(); - const float bb_height = bb.GetHeight(); - if (bb_width <= 0.0f || bb_height <= 0.0f) - return; - - // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the resize grab) + // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the window resize grab) float alpha = 1.0f; - if ((axis == ImGuiAxis_Y) && bb_height < g.FontSize + g.Style.FramePadding.y * 2.0f) - { - alpha = ImSaturate((bb_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f)); - if (alpha <= 0.0f) - return; - } + if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f) + alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f)); + if (alpha <= 0.0f) + return false; + + const ImGuiStyle& style = g.Style; const bool allow_interaction = (alpha >= 1.0f); - int window_rounding_corners; - if (horizontal) - window_rounding_corners = ImDrawCornerFlags_BotLeft | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight); - else - window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0) | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight); - window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, window_rounding_corners); - bb.Expand(ImVec2(-ImClamp((float)(int)((bb_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb_height - 2.0f) * 0.5f), 0.0f, 3.0f))); + ImRect bb = bb_frame; + bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) - float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight(); - float scroll_v = horizontal ? window->Scroll.x : window->Scroll.y; - float win_size_avail_v = (horizontal ? window->SizeFull.x : window->SizeFull.y) - other_scrollbar_size_w; - float win_size_contents_v = horizontal ? window->SizeContents.x : window->SizeContents.y; + const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) // But we maintain a minimum size in pixel to allow for the user to still aim inside. - IM_ASSERT(ImMax(win_size_contents_v, win_size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. - const float win_size_v = ImMax(ImMax(win_size_contents_v, win_size_avail_v), 1.0f); - const float grab_h_pixels = ImClamp(scrollbar_size_v * (win_size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v); + IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. + const float win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), 1.0f); + const float grab_h_pixels = ImClamp(scrollbar_size_v * (size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v); const float grab_h_norm = grab_h_pixels / scrollbar_size_v; // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). bool held = false; bool hovered = false; - const bool previously_held = (g.ActiveId == id); ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); - float scroll_max = ImMax(1.0f, win_size_contents_v - win_size_avail_v); - float scroll_ratio = ImSaturate(scroll_v / scroll_max); - float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; + float scroll_max = ImMax(1.0f, size_contents_v - size_avail_v); + float scroll_ratio = ImSaturate(*p_scroll_v / scroll_max); + float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space if (held && allow_interaction && grab_h_norm < 1.0f) { - float scrollbar_pos_v = horizontal ? bb.Min.x : bb.Min.y; - float mouse_pos_v = horizontal ? g.IO.MousePos.x : g.IO.MousePos.y; - float* click_delta_to_grab_center_v = horizontal ? &g.ScrollbarClickDeltaToGrabCenter.x : &g.ScrollbarClickDeltaToGrabCenter.y; + float scrollbar_pos_v = bb.Min[axis]; + float mouse_pos_v = g.IO.MousePos[axis]; // Click position in scrollbar normalized space (0.0f->1.0f) const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); SetHoveredID(id); bool seek_absolute = false; - if (!previously_held) + if (g.ActiveIdIsJustActivated) { // On initial click calculate the distance between mouse and the center of the grab - if (clicked_v_norm >= grab_v_norm && clicked_v_norm <= grab_v_norm + grab_h_norm) - { - *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f; - } + seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm); + if (seek_absolute) + g.ScrollbarClickDeltaToGrabCenter = 0.0f; else - { - seek_absolute = true; - *click_delta_to_grab_center_v = 0.0f; - } + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; } - // Apply scroll - // It is ok to modify Scroll here because we are being called in Begin() after the calculation of SizeContents and before setting up our starting position - const float scroll_v_norm = ImSaturate((clicked_v_norm - *click_delta_to_grab_center_v - grab_h_norm*0.5f) / (1.0f - grab_h_norm)); - scroll_v = (float)(int)(0.5f + scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v)); - if (horizontal) - window->Scroll.x = scroll_v; - else - window->Scroll.y = scroll_v; + // Apply scroll (p_scroll_v will generally point on one member of window->Scroll) + // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position + const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); + *p_scroll_v = IM_ROUND(scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v)); // Update values for rendering - scroll_ratio = ImSaturate(scroll_v / scroll_max); + scroll_ratio = ImSaturate(*p_scroll_v / scroll_max); grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Update distance to grab now that we have seeked and saturated if (seek_absolute) - *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f; + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; } - // Render grab + // Render + const ImU32 bg_col = GetColorU32(ImGuiCol_ScrollbarBg); const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha); + window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, flags); ImRect grab_rect; - if (horizontal) - grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, host_rect.Max.x), bb.Max.y); + if (axis == ImGuiAxis_X) + grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y); else - grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, host_rect.Max.y)); + grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels); window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding); + + return held; } void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) @@ -922,28 +1014,16 @@ void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& } } -// frame_padding < 0: uses FramePadding from style (default) -// frame_padding = 0: no framing -// frame_padding > 0: set framing size -// The color used are the button colors. -bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) +// ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) +// We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. +bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col) { + ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return false; - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - // Default to using texture ID as ID. User can still push string/integer prefixes. - // We could hash the size/uv to create a unique ID but that would prevent the user from animating UV. - PushID((void*)(intptr_t)user_texture_id); - const ImGuiID id = window->GetID("#image"); - PopID(); - - const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : style.FramePadding; const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2); - const ImRect image_bb(window->DC.CursorPos + padding, window->DC.CursorPos + padding + size); ItemSize(bb); if (!ItemAdd(bb, id)) return false; @@ -954,14 +1034,33 @@ bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const I // Render const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); RenderNavHighlight(bb, id); - RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, style.FrameRounding)); + RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); if (bg_col.w > 0.0f) - window->DrawList->AddRectFilled(image_bb.Min, image_bb.Max, GetColorU32(bg_col)); - window->DrawList->AddImage(user_texture_id, image_bb.Min, image_bb.Max, uv0, uv1, GetColorU32(tint_col)); + window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col)); + window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); return pressed; } +// frame_padding < 0: uses FramePadding from style (default) +// frame_padding = 0: no framing +// frame_padding > 0: set framing size +bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + // Default to using texture ID as ID. User can still push string/integer prefixes. + PushID((void*)(intptr_t)user_texture_id); + const ImGuiID id = window->GetID("#image"); + PopID(); + + const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : g.Style.FramePadding; + return ImageButtonEx(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col); +} + bool ImGui::Checkbox(const char* label, bool* v) { ImGuiWindow* window = GetCurrentWindow(); @@ -978,7 +1077,10 @@ bool ImGui::Checkbox(const char* label, bool* v) const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, id)) + { + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); return false; + } bool hovered, held; bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); @@ -991,36 +1093,80 @@ bool ImGui::Checkbox(const char* label, bool* v) const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); RenderNavHighlight(total_bb, id); RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); - if (*v) + ImU32 check_col = GetColorU32(ImGuiCol_CheckMark); + bool mixed_value = (window->DC.ItemFlags & ImGuiItemFlags_MixedValue) != 0; + if (mixed_value) { - const float pad = ImMax(1.0f, (float)(int)(square_sz / 6.0f)); - RenderCheckMark(check_bb.Min + ImVec2(pad, pad), GetColorU32(ImGuiCol_CheckMark), square_sz - pad*2.0f); + // Undocumented tristate/mixed/indeterminate checkbox (#2644) + // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) + ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); + } + else if (*v) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); } + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); if (g.LogEnabled) - LogRenderedText(&total_bb.Min, *v ? "[x]" : "[ ]"); + LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); if (label_size.x > 0.0f) - RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label); + RenderText(label_pos, label); IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); return pressed; } -bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) +template<typename T> +bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) { - bool v = ((*flags & flags_value) == flags_value); - bool pressed = Checkbox(label, &v); + bool all_on = (*flags & flags_value) == flags_value; + bool any_on = (*flags & flags_value) != 0; + bool pressed; + if (!all_on && any_on) + { + ImGuiWindow* window = GetCurrentWindow(); + ImGuiItemFlags backup_item_flags = window->DC.ItemFlags; + window->DC.ItemFlags |= ImGuiItemFlags_MixedValue; + pressed = Checkbox(label, &all_on); + window->DC.ItemFlags = backup_item_flags; + } + else + { + pressed = Checkbox(label, &all_on); + + } if (pressed) { - if (v) + if (all_on) *flags |= flags_value; else *flags &= ~flags_value; } - return pressed; } +bool ImGui::CheckboxFlags(const char* label, int* flags, int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + bool ImGui::RadioButton(const char* label, bool active) { ImGuiWindow* window = GetCurrentWindow(); @@ -1041,8 +1187,8 @@ bool ImGui::RadioButton(const char* label, bool active) return false; ImVec2 center = check_bb.GetCenter(); - center.x = (float)(int)center.x + 0.5f; - center.y = (float)(int)center.y + 0.5f; + center.x = IM_ROUND(center.x); + center.y = IM_ROUND(center.y); const float radius = (square_sz - 1.0f) * 0.5f; bool hovered, held; @@ -1054,24 +1200,27 @@ bool ImGui::RadioButton(const char* label, bool active) window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16); if (active) { - const float pad = ImMax(1.0f, (float)(int)(square_sz / 6.0f)); + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16); } if (style.FrameBorderSize > 0.0f) { - window->DrawList->AddCircle(center + ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); + window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize); } + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); if (g.LogEnabled) - LogRenderedText(&total_bb.Min, active ? "(x)" : "( )"); + LogRenderedText(&label_pos, active ? "(x)" : "( )"); if (label_size.x > 0.0f) - RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label); + RenderText(label_pos, label); + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags); return pressed; } +// FIXME: This would work nicely if it was a public template, e.g. 'template<T> RadioButton(const char* label, T* v, T v_button)', but I'm not sure how we would expose it.. bool ImGui::RadioButton(const char* label, int* v, int v_button) { const bool pressed = RadioButton(label, *v == v_button); @@ -1091,7 +1240,7 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over const ImGuiStyle& style = g.Style; ImVec2 pos = window->DC.CursorPos; - ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), g.FontSize + style.FramePadding.y*2.0f); + ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y * 2.0f); ImRect bb(pos, pos + size); ItemSize(size, style.FramePadding.y); if (!ItemAdd(bb, 0)) @@ -1108,13 +1257,13 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over char overlay_buf[32]; if (!overlay) { - ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction*100+0.01f); + ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); overlay = overlay_buf; } ImVec2 overlay_size = CalcTextSize(overlay, NULL); if (overlay_size.x > 0.0f) - RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f,0.5f), &bb); + RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); } void ImGui::Bullet() @@ -1125,18 +1274,19 @@ void ImGui::Bullet() ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; - const float line_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); + const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2), g.FontSize); const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); ItemSize(bb); if (!ItemAdd(bb, 0)) { - SameLine(0, style.FramePadding.x*2); + SameLine(0, style.FramePadding.x * 2); return; } // Render and stay on same line - RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f)); - SameLine(0, style.FramePadding.x*2); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, line_height * 0.5f), text_col); + SameLine(0, style.FramePadding.x * 2.0f); } //------------------------------------------------------------------------- @@ -1146,9 +1296,10 @@ void ImGui::Bullet() // - Dummy() // - NewLine() // - AlignTextToFramePadding() +// - SeparatorEx() [Internal] // - Separator() -// - VerticalSeparator() [Internal] // - SplitterBehavior() [Internal] +// - ShrinkWidths() [Internal] //------------------------------------------------------------------------- void ImGui::Spacing() @@ -1156,7 +1307,7 @@ void ImGui::Spacing() ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return; - ItemSize(ImVec2(0,0)); + ItemSize(ImVec2(0, 0)); } void ImGui::Dummy(const ImVec2& size) @@ -1179,8 +1330,8 @@ void ImGui::NewLine() ImGuiContext& g = *GImGui; const ImGuiLayoutType backup_layout_type = window->DC.LayoutType; window->DC.LayoutType = ImGuiLayoutType_Vertical; - if (window->DC.CurrentLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. - ItemSize(ImVec2(0,0)); + if (window->DC.CurrLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. + ItemSize(ImVec2(0, 0)); else ItemSize(ImVec2(0.0f, g.FontSize)); window->DC.LayoutType = backup_layout_type; @@ -1193,74 +1344,82 @@ void ImGui::AlignTextToFramePadding() return; ImGuiContext& g = *GImGui; - window->DC.CurrentLineSize.y = ImMax(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y * 2); - window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.CurrentLineTextBaseOffset, g.Style.FramePadding.y); + window->DC.CurrLineSize.y = ImMax(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2); + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y); } // Horizontal/vertical separating line -void ImGui::Separator() +void ImGui::SeparatorEx(ImGuiSeparatorFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return; - ImGuiContext& g = *GImGui; - // Those flags should eventually be overrideable by the user - ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; + ImGuiContext& g = *GImGui; IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected + + float thickness_draw = 1.0f; + float thickness_layout = 0.0f; if (flags & ImGuiSeparatorFlags_Vertical) { - VerticalSeparator(); - return; + // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout. + float y1 = window->DC.CursorPos.y; + float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y; + const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness_draw, y2)); + ItemSize(ImVec2(thickness_layout, 0.0f)); + if (!ItemAdd(bb, 0)) + return; + + // Draw + window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogText(" |"); } - - // Horizontal Separator - if (window->DC.CurrentColumns) - PopClipRect(); - - float x1 = window->Pos.x; - float x2 = window->Pos.x + window->Size.x; - if (!window->DC.GroupStack.empty()) - x1 += window->DC.Indent.x; - - const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y+1.0f)); - ItemSize(ImVec2(0.0f, 1.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit - if (!ItemAdd(bb, 0)) + else if (flags & ImGuiSeparatorFlags_Horizontal) { - if (window->DC.CurrentColumns) - PushColumnClipRect(); - return; - } + // Horizontal Separator + float x1 = window->Pos.x; + float x2 = window->Pos.x + window->Size.x; - window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x,bb.Min.y), GetColorU32(ImGuiCol_Separator)); + // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator + if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) + x1 += window->DC.Indent.x; - if (g.LogEnabled) - LogRenderedText(&bb.Min, "--------------------------------"); + ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; + if (columns) + PushColumnsBackground(); - if (window->DC.CurrentColumns) - { - PushColumnClipRect(); - window->DC.CurrentColumns->LineMinY = window->DC.CursorPos.y; + // We don't provide our width to the layout so that it doesn't get feed back into AutoFit + const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness_draw)); + ItemSize(ImVec2(0.0f, thickness_layout)); + const bool item_visible = ItemAdd(bb, 0); + if (item_visible) + { + // Draw + window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogRenderedText(&bb.Min, "--------------------------------\n"); + + } + if (columns) + { + PopColumnsBackground(); + columns->LineMinY = window->DC.CursorPos.y; + } } } -void ImGui::VerticalSeparator() +void ImGui::Separator() { - ImGuiWindow* window = GetCurrentWindow(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; if (window->SkipItems) return; - ImGuiContext& g = *GImGui; - float y1 = window->DC.CursorPos.y; - float y2 = window->DC.CursorPos.y + window->DC.CurrentLineSize.y; - const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2)); - ItemSize(ImVec2(1.0f, 0.0f)); - if (!ItemAdd(bb, 0)) - return; - - window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator)); - if (g.LogEnabled) - LogText(" |"); + // Those flags should eventually be overridable by the user + ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; + flags |= ImGuiSeparatorFlags_SpanAllColumns; + SeparatorEx(flags); } // Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise. @@ -1316,11 +1475,60 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float // Render const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, g.Style.FrameRounding); + window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f); return held; } +static int IMGUI_CDECL ShrinkWidthItemComparer(const void* lhs, const void* rhs) +{ + const ImGuiShrinkWidthItem* a = (const ImGuiShrinkWidthItem*)lhs; + const ImGuiShrinkWidthItem* b = (const ImGuiShrinkWidthItem*)rhs; + if (int d = (int)(b->Width - a->Width)) + return d; + return (b->Index - a->Index); +} + +// Shrink excess width from a set of item, by removing width from the larger items first. +// Set items Width to -1.0f to disable shrinking this item. +void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess) +{ + if (count == 1) + { + if (items[0].Width >= 0.0f) + items[0].Width = ImMax(items[0].Width - width_excess, 1.0f); + return; + } + ImQsort(items, (size_t)count, sizeof(ImGuiShrinkWidthItem), ShrinkWidthItemComparer); + int count_same_width = 1; + while (width_excess > 0.0f && count_same_width < count) + { + while (count_same_width < count && items[0].Width <= items[count_same_width].Width) + count_same_width++; + float max_width_to_remove_per_item = (count_same_width < count && items[count_same_width].Width >= 0.0f) ? (items[0].Width - items[count_same_width].Width) : (items[0].Width - 1.0f); + if (max_width_to_remove_per_item <= 0.0f) + break; + float width_to_remove_per_item = ImMin(width_excess / count_same_width, max_width_to_remove_per_item); + for (int item_n = 0; item_n < count_same_width; item_n++) + items[item_n].Width -= width_to_remove_per_item; + width_excess -= width_to_remove_per_item * count_same_width; + } + + // Round width and redistribute remainder left-to-right (could make it an option of the function?) + // Ensure that e.g. the right-most tab of a shrunk tab-bar always reaches exactly at the same distance from the right-most edge of the tab bar separator. + width_excess = 0.0f; + for (int n = 0; n < count; n++) + { + float width_rounded = ImFloor(items[n].Width); + width_excess += items[n].Width - width_rounded; + items[n].Width = width_rounded; + } + if (width_excess > 0.0f) + for (int n = 0; n < count; n++) + if (items[n].Index < (int)(width_excess + 0.01f)) + items[n].Width += 1.0f; +} + //------------------------------------------------------------------------- // [SECTION] Widgets: ComboBox //------------------------------------------------------------------------- @@ -1341,8 +1549,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF { // Always consume the SetNextWindowSizeConstraint() call in our early return paths ImGuiContext& g = *GImGui; - ImGuiCond backup_next_window_size_constraint = g.NextWindowData.SizeConstraintCond; - g.NextWindowData.SizeConstraintCond = 0; + bool has_window_size_constraint = (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) != 0; + g.NextWindowData.Flags &= ~ImGuiNextWindowDataFlags_HasSizeConstraint; ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -1355,9 +1563,9 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const float expected_w = GetNextItemWidth(); + const float expected_w = CalcItemWidth(); const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : expected_w; - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, id, &frame_bb)) @@ -1365,21 +1573,29 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF bool hovered, held; bool pressed = ButtonBehavior(frame_bb, id, &hovered, &held); - bool popup_open = IsPopupOpen(id); + bool popup_open = IsPopupOpen(id, ImGuiPopupFlags_None); const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); const float value_x2 = ImMax(frame_bb.Min.x, frame_bb.Max.x - arrow_size); RenderNavHighlight(frame_bb, id); if (!(flags & ImGuiComboFlags_NoPreview)) - window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(value_x2, frame_bb.Max.y), frame_col, style.FrameRounding, ImDrawCornerFlags_Left); + window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(value_x2, frame_bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersLeft); if (!(flags & ImGuiComboFlags_NoArrowButton)) { - window->DrawList->AddRectFilled(ImVec2(value_x2, frame_bb.Min.y), frame_bb.Max, GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button), style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right); - RenderArrow(ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down); + ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + window->DrawList->AddRectFilled(ImVec2(value_x2, frame_bb.Min.y), frame_bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersRight); + if (value_x2 + arrow_size - style.FramePadding.x <= frame_bb.Max.x) + RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f); } RenderFrameBorder(frame_bb.Min, frame_bb.Max, style.FrameRounding); if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview)) - RenderTextClipped(frame_bb.Min + style.FramePadding, ImVec2(value_x2, frame_bb.Max.y), preview_value, NULL, NULL, ImVec2(0.0f,0.0f)); + { + ImVec2 preview_pos = frame_bb.Min + style.FramePadding; + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(preview_pos, ImVec2(value_x2, frame_bb.Max.y), preview_value, NULL, NULL, ImVec2(0.0f, 0.0f)); + } if (label_size.x > 0) RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); @@ -1387,16 +1603,16 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF { if (window->DC.NavLayerCurrent == 0) window->NavLastIds[0] = id; - OpenPopupEx(id); + OpenPopupEx(id, ImGuiPopupFlags_None); popup_open = true; } if (!popup_open) return false; - if (backup_next_window_size_constraint) + if (has_window_size_constraint) { - g.NextWindowData.SizeConstraintCond = backup_next_window_size_constraint; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint; g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w); } else @@ -1414,20 +1630,26 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF char name[16]; ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth - // Peak into expected window size so we can position it + // Position the window given a custom constraint (peak into expected window size so we can position it) + // This might be easier to express with an hypothetical SetNextWindowPosConstraints() function. if (ImGuiWindow* popup_window = FindWindowByName(name)) if (popup_window->WasActive) { - ImVec2 size_expected = CalcWindowExpectedSize(popup_window); + // Always override 'AutoPosLastDirection' to not leave a chance for a past value to affect us. + ImVec2 size_expected = CalcWindowNextAutoFitSize(popup_window); if (flags & ImGuiComboFlags_PopupAlignLeft) - popup_window->AutoPosLastDirection = ImGuiDir_Left; + popup_window->AutoPosLastDirection = ImGuiDir_Left; // "Below, Toward Left" + else + popup_window->AutoPosLastDirection = ImGuiDir_Down; // "Below, Toward Right (default)" ImRect r_outer = GetWindowAllowedExtentRect(popup_window); ImVec2 pos = FindBestWindowPosForPopupEx(frame_bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, r_outer, frame_bb, ImGuiPopupPositionPolicy_ComboBox); SetNextWindowPos(pos); } + // We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx() + ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove; + // Horizontally align ourselves with the framed text - ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(style.FramePadding.x, style.WindowPadding.y)); bool ret = Begin(name, NULL, window_flags); PopStyleVar(); @@ -1486,8 +1708,8 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi items_getter(data, *current_item, &preview_value); // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. - if (popup_max_height_in_items != -1 && !g.NextWindowData.SizeConstraintCond) - SetNextWindowSizeConstraints(ImVec2(0,0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); + if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) + SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); if (!BeginCombo(label, preview_value, ImGuiComboFlags_None)) return false; @@ -1513,6 +1735,9 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi } EndCombo(); + if (value_changed) + MarkItemEdited(g.CurrentWindow->DC.LastItemId); + return value_changed; } @@ -1545,27 +1770,28 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa // - DataTypeFormatString() // - DataTypeApplyOp() // - DataTypeApplyOpFromText() +// - DataTypeClamp() // - GetMinimumStepAtDecimalPrecision // - RoundScalarWithFormat<>() //------------------------------------------------------------------------- static const ImGuiDataTypeInfo GDataTypeInfo[] = { - { sizeof(char), "%d", "%d" }, // ImGuiDataType_S8 - { sizeof(unsigned char), "%u", "%u" }, - { sizeof(short), "%d", "%d" }, // ImGuiDataType_S16 - { sizeof(unsigned short), "%u", "%u" }, - { sizeof(int), "%d", "%d" }, // ImGuiDataType_S32 - { sizeof(unsigned int), "%u", "%u" }, + { sizeof(char), "S8", "%d", "%d" }, // ImGuiDataType_S8 + { sizeof(unsigned char), "U8", "%u", "%u" }, + { sizeof(short), "S16", "%d", "%d" }, // ImGuiDataType_S16 + { sizeof(unsigned short), "U16", "%u", "%u" }, + { sizeof(int), "S32", "%d", "%d" }, // ImGuiDataType_S32 + { sizeof(unsigned int), "U32", "%u", "%u" }, #ifdef _MSC_VER - { sizeof(ImS64), "%I64d","%I64d" }, // ImGuiDataType_S64 - { sizeof(ImU64), "%I64u","%I64u" }, + { sizeof(ImS64), "S64", "%I64d","%I64d" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%I64u","%I64u" }, #else - { sizeof(ImS64), "%lld", "%lld" }, // ImGuiDataType_S64 - { sizeof(ImU64), "%llu", "%llu" }, + { sizeof(ImS64), "S64", "%lld", "%lld" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%llu", "%llu" }, #endif - { sizeof(float), "%f", "%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg) - { sizeof(double), "%f", "%lf" }, // ImGuiDataType_Double + { sizeof(float), "float", "%f", "%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg) + { sizeof(double), "double","%f", "%lf" }, // ImGuiDataType_Double }; IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT); @@ -1599,30 +1825,30 @@ const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type) return &GDataTypeInfo[data_type]; } -int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format) +int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format) { // Signedness doesn't matter when pushing integer arguments if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) - return ImFormatString(buf, buf_size, format, *(const ImU32*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data); if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) - return ImFormatString(buf, buf_size, format, *(const ImU64*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data); if (data_type == ImGuiDataType_Float) - return ImFormatString(buf, buf_size, format, *(const float*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const float*)p_data); if (data_type == ImGuiDataType_Double) - return ImFormatString(buf, buf_size, format, *(const double*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const double*)p_data); if (data_type == ImGuiDataType_S8) - return ImFormatString(buf, buf_size, format, *(const ImS8*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data); if (data_type == ImGuiDataType_U8) - return ImFormatString(buf, buf_size, format, *(const ImU8*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data); if (data_type == ImGuiDataType_S16) - return ImFormatString(buf, buf_size, format, *(const ImS16*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data); if (data_type == ImGuiDataType_U16) - return ImFormatString(buf, buf_size, format, *(const ImU16*)data_ptr); + return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data); IM_ASSERT(0); return 0; } -void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2) +void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg1, const void* arg2) { IM_ASSERT(op == '+' || op == '-'); switch (data_type) @@ -1674,7 +1900,7 @@ void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* // User can input math operators (e.g. +100) to edit a numerical values. // NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. -bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format) +bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format) { while (ImCharIsBlankA(*buf)) buf++; @@ -1696,11 +1922,9 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b return false; // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. - IM_ASSERT(data_type < ImGuiDataType_COUNT); - int data_backup[2]; - const ImGuiDataTypeInfo* type_info = ImGui::DataTypeGetInfo(data_type); - IM_ASSERT(type_info->Size <= sizeof(data_backup)); - memcpy(data_backup, data_ptr, type_info->Size); + const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, type_info->Size); if (format == NULL) format = type_info->ScanFmt; @@ -1709,7 +1933,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b int arg1i = 0; if (data_type == ImGuiDataType_S32) { - int* v = (int*)data_ptr; + int* v = (int*)p_data; int arg0i = *v; float arg1f = 0.0f; if (op && sscanf(initial_value_buf, format, &arg0i) < 1) @@ -1724,7 +1948,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b { // For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in format = "%f"; - float* v = (float*)data_ptr; + float* v = (float*)p_data; float arg0f = *v, arg1f = 0.0f; if (op && sscanf(initial_value_buf, format, &arg0f) < 1) return false; @@ -1738,7 +1962,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b else if (data_type == ImGuiDataType_Double) { format = "%lf"; // scanf differentiate float/double unlike printf which forces everything to double because of ellipsis - double* v = (double*)data_ptr; + double* v = (double*)p_data; double arg0f = *v, arg1f = 0.0; if (op && sscanf(initial_value_buf, format, &arg0f) < 1) return false; @@ -1753,7 +1977,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b { // All other types assign constant // We don't bother handling support for legacy operators since they are a little too crappy. Instead we will later implement a proper expression evaluator in the future. - sscanf(buf, format, data_ptr); + sscanf(buf, format, p_data); } else { @@ -1761,18 +1985,75 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b int v32; sscanf(buf, format, &v32); if (data_type == ImGuiDataType_S8) - *(ImS8*)data_ptr = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); + *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); else if (data_type == ImGuiDataType_U8) - *(ImU8*)data_ptr = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); + *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); else if (data_type == ImGuiDataType_S16) - *(ImS16*)data_ptr = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); + *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); else if (data_type == ImGuiDataType_U16) - *(ImU16*)data_ptr = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); + *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); else IM_ASSERT(0); } - return memcmp(data_backup, data_ptr, type_info->Size) != 0; + return memcmp(&data_backup, p_data, type_info->Size) != 0; +} + +template<typename T> +static int DataTypeCompareT(const T* lhs, const T* rhs) +{ + if (*lhs < *rhs) return -1; + if (*lhs > *rhs) return +1; + return 0; +} + +int ImGui::DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeCompareT<ImS8 >((const ImS8* )arg_1, (const ImS8* )arg_2); + case ImGuiDataType_U8: return DataTypeCompareT<ImU8 >((const ImU8* )arg_1, (const ImU8* )arg_2); + case ImGuiDataType_S16: return DataTypeCompareT<ImS16 >((const ImS16* )arg_1, (const ImS16* )arg_2); + case ImGuiDataType_U16: return DataTypeCompareT<ImU16 >((const ImU16* )arg_1, (const ImU16* )arg_2); + case ImGuiDataType_S32: return DataTypeCompareT<ImS32 >((const ImS32* )arg_1, (const ImS32* )arg_2); + case ImGuiDataType_U32: return DataTypeCompareT<ImU32 >((const ImU32* )arg_1, (const ImU32* )arg_2); + case ImGuiDataType_S64: return DataTypeCompareT<ImS64 >((const ImS64* )arg_1, (const ImS64* )arg_2); + case ImGuiDataType_U64: return DataTypeCompareT<ImU64 >((const ImU64* )arg_1, (const ImU64* )arg_2); + case ImGuiDataType_Float: return DataTypeCompareT<float >((const float* )arg_1, (const float* )arg_2); + case ImGuiDataType_Double: return DataTypeCompareT<double>((const double*)arg_1, (const double*)arg_2); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return 0; +} + +template<typename T> +static bool DataTypeClampT(T* v, const T* v_min, const T* v_max) +{ + // Clamp, both sides are optional, return true if modified + if (v_min && *v < *v_min) { *v = *v_min; return true; } + if (v_max && *v > *v_max) { *v = *v_max; return true; } + return false; +} + +bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeClampT<ImS8 >((ImS8* )p_data, (const ImS8* )p_min, (const ImS8* )p_max); + case ImGuiDataType_U8: return DataTypeClampT<ImU8 >((ImU8* )p_data, (const ImU8* )p_min, (const ImU8* )p_max); + case ImGuiDataType_S16: return DataTypeClampT<ImS16 >((ImS16* )p_data, (const ImS16* )p_min, (const ImS16* )p_max); + case ImGuiDataType_U16: return DataTypeClampT<ImU16 >((ImU16* )p_data, (const ImU16* )p_min, (const ImU16* )p_max); + case ImGuiDataType_S32: return DataTypeClampT<ImS32 >((ImS32* )p_data, (const ImS32* )p_min, (const ImS32* )p_max); + case ImGuiDataType_U32: return DataTypeClampT<ImU32 >((ImU32* )p_data, (const ImU32* )p_min, (const ImU32* )p_max); + case ImGuiDataType_S64: return DataTypeClampT<ImS64 >((ImS64* )p_data, (const ImS64* )p_min, (const ImS64* )p_max); + case ImGuiDataType_U64: return DataTypeClampT<ImU64 >((ImU64* )p_data, (const ImU64* )p_min, (const ImU64* )p_max); + case ImGuiDataType_Float: return DataTypeClampT<float >((float* )p_data, (const float* )p_min, (const float* )p_max); + case ImGuiDataType_Double: return DataTypeClampT<double>((double*)p_data, (const double*)p_min, (const double*)p_max); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; } static float GetMinimumStepAtDecimalPrecision(int decimal_precision) @@ -1796,12 +2077,36 @@ static const char* ImAtoi(const char* src, TYPE* output) return src; } +// Sanitize format +// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi +// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi. +static void SanitizeFormatString(const char* fmt, char* fmt_out, size_t fmt_out_size) +{ + IM_UNUSED(fmt_out_size); + const char* fmt_end = ImParseFormatFindEnd(fmt); + IM_ASSERT((size_t)(fmt_end - fmt + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! + while (fmt < fmt_end) + { + char c = *(fmt++); + if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. + *(fmt_out++) = c; + } + *fmt_out = 0; // Zero-terminate +} + template<typename TYPE, typename SIGNEDTYPE> TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v) { const char* fmt_start = ImParseFormatFindStart(format); if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string return v; + + // Sanitize format + char fmt_sanitized[32]; + SanitizeFormatString(fmt_start, fmt_sanitized, IM_ARRAYSIZE(fmt_sanitized)); + fmt_start = fmt_sanitized; + + // Format value with our rounding, and read back char v_str[64]; ImFormatString(v_str, IM_ARRAYSIZE(v_str), fmt_start, v); const char* p = v_str; @@ -1835,21 +2140,21 @@ TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, // This is called by DragBehavior() when the widget is active (held by mouse or being manipulated with Nav controls) template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE> -bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, float power, ImGuiDragFlags flags) +bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags) { ImGuiContext& g = *GImGui; - const ImGuiAxis axis = (flags & ImGuiDragFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; - const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const bool has_min_max = (v_min != v_max); - const bool is_power = (power != 1.0f && is_decimal && has_min_max && (v_max - v_min < FLT_MAX)); + const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; + const bool is_clamped = (v_min < v_max); + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); // Default tweak speed - if (v_speed == 0.0f && has_min_max && (v_max - v_min < FLT_MAX)) + if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX)) v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio); // Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings float adjust_delta = 0.0f; - if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && g.IO.MouseDragMaxDistanceSqr[0] > 1.0f*1.0f) + if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) { adjust_delta = g.IO.MouseDelta[axis]; if (g.IO.KeyAlt) @@ -1859,7 +2164,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const } else if (g.ActiveIdSource == ImGuiInputSource_Nav) { - int decimal_precision = is_decimal ? ImParseFormatPrecision(format, 3) : 0; + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f / 10.0f, 10.0f)[axis]; v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); } @@ -1869,12 +2174,15 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const if (axis == ImGuiAxis_Y) adjust_delta = -adjust_delta; + // For logarithmic use our range is effectively 0..1 so scale the delta into that range + if (is_logarithmic && (v_max - v_min < FLT_MAX) && ((v_max - v_min) > 0.000001f)) // Epsilon to avoid /0 + adjust_delta /= (float)(v_max - v_min); + // Clear current value on activation // Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300. bool is_just_activated = g.ActiveIdIsJustActivated; - bool is_already_past_limits_and_pushing_outward = has_min_max && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f)); - bool is_drag_direction_change_with_power = is_power && ((adjust_delta < 0 && g.DragCurrentAccum > 0) || (adjust_delta > 0 && g.DragCurrentAccum < 0)); - if (is_just_activated || is_already_past_limits_and_pushing_outward || is_drag_direction_change_with_power) + bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f)); + if (is_just_activated || is_already_past_limits_and_pushing_outward) { g.DragCurrentAccum = 0.0f; g.DragCurrentAccumDirty = false; @@ -1891,28 +2199,36 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_cur = *v; FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f; - if (is_power) + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + const float zero_deadzone_halfsize = 0.0f; // Drag widgets have no deadzone (as it doesn't make sense) + if (is_logarithmic) { - // Offset + round to user desired precision, with a curve on the v_min..v_max range to get more precision on one side of the range - FLOATTYPE v_old_norm_curved = ImPow((FLOATTYPE)(v_cur - v_min) / (FLOATTYPE)(v_max - v_min), (FLOATTYPE)1.0f / power); - FLOATTYPE v_new_norm_curved = v_old_norm_curved + (g.DragCurrentAccum / (v_max - v_min)); - v_cur = v_min + (TYPE)ImPow(ImSaturate((float)v_new_norm_curved), power) * (v_max - v_min); - v_old_ref_for_accum_remainder = v_old_norm_curved; + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + + // Convert to parametric space, apply delta, convert back + float v_old_parametric = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + float v_new_parametric = v_old_parametric + g.DragCurrentAccum; + v_cur = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_new_parametric, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + v_old_ref_for_accum_remainder = v_old_parametric; } else { - v_cur += (TYPE)g.DragCurrentAccum; + v_cur += (SIGNEDTYPE)g.DragCurrentAccum; } // Round to user desired precision based on format string - v_cur = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_cur); + if (!(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_cur = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_cur); // Preserve remainder after rounding has been applied. This also allow slow tweaking of values. g.DragCurrentAccumDirty = false; - if (is_power) + if (is_logarithmic) { - FLOATTYPE v_cur_norm_curved = ImPow((FLOATTYPE)(v_cur - v_min) / (FLOATTYPE)(v_max - v_min), (FLOATTYPE)1.0f / power); - g.DragCurrentAccum -= (float)(v_cur_norm_curved - v_old_ref_for_accum_remainder); + // Convert to parametric space, apply delta, convert back + float v_new_parametric = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + g.DragCurrentAccum -= (float)(v_new_parametric - v_old_ref_for_accum_remainder); } else { @@ -1924,11 +2240,11 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const v_cur = (TYPE)0; // Clamp values (+ handle overflow/wrap-around for integer types) - if (*v != v_cur && has_min_max) + if (*v != v_cur && is_clamped) { - if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_decimal)) + if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point)) v_cur = v_min; - if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_decimal)) + if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point)) v_cur = v_max; } @@ -1939,8 +2255,11 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const return true; } -bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags) +bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) { + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + ImGuiContext& g = *GImGui; if (g.ActiveId == id) { @@ -1951,41 +2270,41 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_s } if (g.ActiveId != id) return false; + if ((g.CurrentWindow->DC.ItemFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; switch (data_type) { - case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)v; bool r = DragBehaviorT<ImS32, ImS32, float >(ImGuiDataType_S32, &v32, v_speed, v_min ? *(const ImS8*) v_min : IM_S8_MIN, v_max ? *(const ImS8*)v_max : IM_S8_MAX, format, power, flags); if (r) *(ImS8*)v = (ImS8)v32; return r; } - case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)v; bool r = DragBehaviorT<ImU32, ImS32, float >(ImGuiDataType_U32, &v32, v_speed, v_min ? *(const ImU8*) v_min : IM_U8_MIN, v_max ? *(const ImU8*)v_max : IM_U8_MAX, format, power, flags); if (r) *(ImU8*)v = (ImU8)v32; return r; } - case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)v; bool r = DragBehaviorT<ImS32, ImS32, float >(ImGuiDataType_S32, &v32, v_speed, v_min ? *(const ImS16*)v_min : IM_S16_MIN, v_max ? *(const ImS16*)v_max : IM_S16_MAX, format, power, flags); if (r) *(ImS16*)v = (ImS16)v32; return r; } - case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)v; bool r = DragBehaviorT<ImU32, ImS32, float >(ImGuiDataType_U32, &v32, v_speed, v_min ? *(const ImU16*)v_min : IM_U16_MIN, v_max ? *(const ImU16*)v_max : IM_U16_MAX, format, power, flags); if (r) *(ImU16*)v = (ImU16)v32; return r; } - case ImGuiDataType_S32: return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)v, v_speed, v_min ? *(const ImS32* )v_min : IM_S32_MIN, v_max ? *(const ImS32* )v_max : IM_S32_MAX, format, power, flags); - case ImGuiDataType_U32: return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)v, v_speed, v_min ? *(const ImU32* )v_min : IM_U32_MIN, v_max ? *(const ImU32* )v_max : IM_U32_MAX, format, power, flags); - case ImGuiDataType_S64: return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)v, v_speed, v_min ? *(const ImS64* )v_min : IM_S64_MIN, v_max ? *(const ImS64* )v_max : IM_S64_MAX, format, power, flags); - case ImGuiDataType_U64: return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)v, v_speed, v_min ? *(const ImU64* )v_min : IM_U64_MIN, v_max ? *(const ImU64* )v_max : IM_U64_MAX, format, power, flags); - case ImGuiDataType_Float: return DragBehaviorT<float, float, float >(data_type, (float*)v, v_speed, v_min ? *(const float* )v_min : -FLT_MAX, v_max ? *(const float* )v_max : FLT_MAX, format, power, flags); - case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)v, v_speed, v_min ? *(const double*)v_min : -DBL_MAX, v_max ? *(const double*)v_max : DBL_MAX, format, power, flags); + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN, p_max ? *(const ImS8*)p_max : IM_S8_MAX, format, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN, p_max ? *(const ImU8*)p_max : IM_U8_MAX, format, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } + case ImGuiDataType_S32: return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)p_v, v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, flags); + case ImGuiDataType_U32: return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)p_v, v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, flags); + case ImGuiDataType_S64: return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)p_v, v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, flags); + case ImGuiDataType_U64: return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)p_v, v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, flags); + case ImGuiDataType_Float: return DragBehaviorT<float, float, float >(data_type, (float*)p_v, v_speed, p_min ? *(const float* )p_min : -FLT_MAX, p_max ? *(const float* )p_max : FLT_MAX, format, flags); + case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX, p_max ? *(const double*)p_max : DBL_MAX, format, flags); case ImGuiDataType_COUNT: break; } IM_ASSERT(0); return false; } -bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power) +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional. +// Read code of e.g. DragFloat(), DragInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return false; - if (power != 1.0f) - IM_ASSERT(v_min != NULL && v_max != NULL); // When using a power curve the drag needs to have known bounds - ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); - const float w = GetNextItemWidth(); - + const float w = CalcItemWidth(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); ItemSize(total_bb, style.FramePadding.y); @@ -1998,13 +2317,13 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) format = PatchFormatStringFloatToInt(format); - // Tabbing or CTRL-clicking on Drag turns it into an input box + // Tabbing or CTRL-clicking on Drag turns it into an InputText const bool hovered = ItemHoverable(frame_bb, id); - bool temp_input_is_active = TempInputTextIsActive(id); - bool temp_input_start = false; + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { - const bool focus_requested = FocusableItemRegister(window, id); + const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id); const bool clicked = (hovered && g.IO.MouseClicked[0]); const bool double_clicked = (hovered && g.IO.MouseDoubleClicked[0]); if (focus_requested || clicked || double_clicked || g.NavActivateId == id || g.NavInputId == id) @@ -2012,16 +2331,30 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa SetActiveID(id, window); SetFocusID(id, window); FocusWindow(window); - g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); - if (focus_requested || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavInputId == id) + g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavInputId == id)) { - temp_input_start = true; + temp_input_is_active = true; FocusableItemUnregister(window); } } + // Experimental: simple click (without moving) turns Drag into an InputText + // FIXME: Currently polling ImGuiConfigFlags_IsTouchScreen, may either poll an hypothetical ImGuiBackendFlags_HasKeyboard and/or an explicit drag settings. + if (g.IO.ConfigDragClickToInputText && temp_input_allowed && !temp_input_is_active) + if (g.ActiveId == id && hovered && g.IO.MouseReleased[0] && !IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) + { + g.NavInputId = id; + temp_input_is_active = true; + FocusableItemUnregister(window); + } + } + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0 && (p_min == NULL || p_max == NULL || DataTypeCompare(data_type, p_min, p_max) < 0); + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); } - if (temp_input_is_active || temp_input_start) - return TempInputTextScalar(frame_bb, id, label, data_type, v, format); // Draw frame const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); @@ -2029,13 +2362,15 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); // Drag behavior - const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None); + const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, flags); if (value_changed) MarkItemEdited(id); // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); if (label_size.x > 0.0f) @@ -2045,7 +2380,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa return value_changed; } -bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min, const void* v_max, const char* format, float power) +bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2055,45 +2390,53 @@ bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int bool value_changed = false; BeginGroup(); PushID(label); - PushMultiItemsWidths(components, GetNextItemWidth()); + PushMultiItemsWidths(components, CalcItemWidth()); size_t type_size = GDataTypeInfo[data_type].Size; for (int i = 0; i < components; i++) { PushID(i); - value_changed |= DragScalar("", data_type, v, v_speed, v_min, v_max, format, power); - SameLine(0, g.Style.ItemInnerSpacing.x); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, flags); PopID(); PopItemWidth(); - v = (void*)((char*)v + type_size); + p_data = (void*)((char*)p_data + type_size); } PopID(); - TextEx(label, FindRenderedTextEnd(label)); + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + EndGroup(); return value_changed; } -bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power) +bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); + return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power) +bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); + return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power) +bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); + return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power) +bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); + return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* format, const char* format_max, float power) +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2102,12 +2445,19 @@ bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_cu ImGuiContext& g = *GImGui; PushID(label); BeginGroup(); - PushMultiItemsWidths(2, GetNextItemWidth()); + PushMultiItemsWidths(2, CalcItemWidth()); - bool value_changed = DragFloat("##min", v_current_min, v_speed, (v_min >= v_max) ? -FLT_MAX : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format, power); + float min_min = (v_min >= v_max) ? -FLT_MAX : v_min; + float min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragScalar("##min", ImGuiDataType_Float, v_current_min, v_speed, &min_min, &min_max, format, min_flags); PopItemWidth(); SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= DragFloat("##max", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? FLT_MAX : v_max, format_max ? format_max : format, power); + + float max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + float max_max = (v_min >= v_max) ? FLT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragScalar("##max", ImGuiDataType_Float, v_current_max, v_speed, &max_min, &max_max, format_max ? format_max : format, max_flags); PopItemWidth(); SameLine(0, g.Style.ItemInnerSpacing.x); @@ -2118,27 +2468,28 @@ bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_cu } // NB: v_speed is float to allow adjusting the drag speed with more precision -bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* format) +bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalar(label, ImGuiDataType_S32, v, v_speed, &v_min, &v_max, format); + return DragScalar(label, ImGuiDataType_S32, v, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* format) +bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_S32, v, 2, v_speed, &v_min, &v_max, format); + return DragScalarN(label, ImGuiDataType_S32, v, 2, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* format) +bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_S32, v, 3, v_speed, &v_min, &v_max, format); + return DragScalarN(label, ImGuiDataType_S32, v, 3, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* format) +bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return DragScalarN(label, ImGuiDataType_S32, v, 4, v_speed, &v_min, &v_max, format); + return DragScalarN(label, ImGuiDataType_S32, v, 4, v_speed, &v_min, &v_max, format, flags); } -bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* format, const char* format_max) +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2147,12 +2498,19 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_ ImGuiContext& g = *GImGui; PushID(label); BeginGroup(); - PushMultiItemsWidths(2, GetNextItemWidth()); + PushMultiItemsWidths(2, CalcItemWidth()); - bool value_changed = DragInt("##min", v_current_min, v_speed, (v_min >= v_max) ? INT_MIN : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format); + int min_min = (v_min >= v_max) ? INT_MIN : v_min; + int min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragInt("##min", v_current_min, v_speed, min_min, min_max, format, min_flags); PopItemWidth(); SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= DragInt("##max", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? INT_MAX : v_max, format_max ? format_max : format); + + int max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + int max_max = (v_min >= v_max) ? INT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragInt("##max", v_current_max, v_speed, max_min, max_max, format_max ? format_max : format, max_flags); PopItemWidth(); SameLine(0, g.Style.ItemInnerSpacing.x); @@ -2163,9 +2521,40 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_ return value_changed; } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. +bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds + drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return DragScalar(label, data_type, p_data, v_speed, p_min, p_max, format, drag_flags); +} + +bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds + drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return DragScalarN(label, data_type, p_data, components, v_speed, p_min, p_max, format, drag_flags); +} + +#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //------------------------------------------------------------------------- // [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. //------------------------------------------------------------------------- +// - ScaleRatioFromValueT<> [Internal] +// - ScaleValueFromRatioT<> [Internal] // - SliderBehaviorT<>() [Internal] // - SliderBehavior() [Internal] // - SliderScalar() @@ -2184,67 +2573,171 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_ // - VSliderInt() //------------------------------------------------------------------------- -template<typename TYPE, typename FLOATTYPE> -float ImGui::SliderCalcRatioFromValueT(ImGuiDataType data_type, TYPE v, TYPE v_min, TYPE v_max, float power, float linear_zero_pos) +// Convert a value v in the output space of a slider into a parametric position on the slider itself (the logical opposite of ScaleValueFromRatioT) +template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE> +float ImGui::ScaleRatioFromValueT(ImGuiDataType data_type, TYPE v, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) { if (v_min == v_max) return 0.0f; + IM_UNUSED(data_type); - const bool is_power = (power != 1.0f) && (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double); const TYPE v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min); - if (is_power) + if (is_logarithmic) { - if (v_clamped < 0.0f) + bool flipped = v_max < v_min; + + if (flipped) // Handle the case where the range is backwards + ImSwap(v_min, v_max); + + // Fudge min/max to avoid getting close to log(0) + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + // Awkward special cases - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_min == 0.0f) && (v_max < 0.0f)) + v_min_fudged = -logarithmic_zero_epsilon; + else if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float result; + + if (v_clamped <= v_min_fudged) + result = 0.0f; // Workaround for values that are in-range but below our fudge + else if (v_clamped >= v_max_fudged) + result = 1.0f; // Workaround for values that are in-range but above our fudge + else if ((v_min * v_max) < 0.0f) // Range crosses zero, so split into two portions { - const float f = 1.0f - (float)((v_clamped - v_min) / (ImMin((TYPE)0, v_max) - v_min)); - return (1.0f - ImPow(f, 1.0f/power)) * linear_zero_pos; + float zero_point_center = (-(float)v_min) / ((float)v_max - (float)v_min); // The zero point in parametric space. There's an argument we should take the logarithmic nature into account when calculating this, but for now this should do (and the most common case of a symmetrical range works fine) + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (v == 0.0f) + result = zero_point_center; // Special case for exactly zero + else if (v < 0.0f) + result = (1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(-v_min_fudged / logarithmic_zero_epsilon))) * zero_point_snap_L; + else + result = zero_point_snap_R + ((float)(ImLog((FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(v_max_fudged / logarithmic_zero_epsilon)) * (1.0f - zero_point_snap_R)); } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = 1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / -v_max_fudged) / ImLog(-v_min_fudged / -v_max_fudged)); else - { - const float f = (float)((v_clamped - ImMax((TYPE)0, v_min)) / (v_max - ImMax((TYPE)0, v_min))); - return linear_zero_pos + ImPow(f, 1.0f/power) * (1.0f - linear_zero_pos); - } + result = (float)(ImLog((FLOATTYPE)v_clamped / v_min_fudged) / ImLog(v_max_fudged / v_min_fudged)); + + return flipped ? (1.0f - result) : result; } // Linear slider - return (float)((FLOATTYPE)(v_clamped - v_min) / (FLOATTYPE)(v_max - v_min)); + return (float)((FLOATTYPE)(SIGNEDTYPE)(v_clamped - v_min) / (FLOATTYPE)(SIGNEDTYPE)(v_max - v_min)); } -// FIXME: Move some of the code into SliderBehavior(). Current responsability is larger than what the equivalent DragBehaviorT<> does, we also do some rendering, etc. +// Convert a parametric position on a slider into a value v in the output space (the logical opposite of ScaleRatioFromValueT) template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE> -bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, TYPE* v, const TYPE v_min, const TYPE v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb) +TYPE ImGui::ScaleValueFromRatioT(ImGuiDataType data_type, float t, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) +{ + if (v_min == v_max) + return v_min; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + + TYPE result; + if (is_logarithmic) + { + // We special-case the extents because otherwise our fudging can lead to "mathematically correct" but non-intuitive behaviors like a fully-left slider not actually reaching the minimum value + if (t <= 0.0f) + result = v_min; + else if (t >= 1.0f) + result = v_max; + else + { + bool flipped = v_max < v_min; // Check if range is "backwards" + + // Fudge min/max to avoid getting silly results close to zero + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + if (flipped) + ImSwap(v_min_fudged, v_max_fudged); + + // Awkward special case - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float t_with_flip = flipped ? (1.0f - t) : t; // t, but flipped if necessary to account for us flipping the range + + if ((v_min * v_max) < 0.0f) // Range crosses zero, so we have to do this in two parts + { + float zero_point_center = (-(float)ImMin(v_min, v_max)) / ImAbs((float)v_max - (float)v_min); // The zero point in parametric space + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (t_with_flip >= zero_point_snap_L && t_with_flip <= zero_point_snap_R) + result = (TYPE)0.0f; // Special case to make getting exactly zero possible (the epsilon prevents it otherwise) + else if (t_with_flip < zero_point_center) + result = (TYPE)-(logarithmic_zero_epsilon * ImPow(-v_min_fudged / logarithmic_zero_epsilon, (FLOATTYPE)(1.0f - (t_with_flip / zero_point_snap_L)))); + else + result = (TYPE)(logarithmic_zero_epsilon * ImPow(v_max_fudged / logarithmic_zero_epsilon, (FLOATTYPE)((t_with_flip - zero_point_snap_R) / (1.0f - zero_point_snap_R)))); + } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = (TYPE)-(-v_max_fudged * ImPow(-v_min_fudged / -v_max_fudged, (FLOATTYPE)(1.0f - t_with_flip))); + else + result = (TYPE)(v_min_fudged * ImPow(v_max_fudged / v_min_fudged, (FLOATTYPE)t_with_flip)); + } + } + else + { + // Linear slider + if (is_floating_point) + { + result = ImLerp(v_min, v_max, t); + } + else + { + // - For integer values we want the clicking position to match the grab box so we round above + // This code is carefully tuned to work with large values (e.g. high ranges of U64) while preserving this property.. + // - Not doing a *1.0 multiply at the end of a range as it tends to be lossy. While absolute aiming at a large s64/u64 + // range is going to be imprecise anyway, with this check we at least make the edge values matches expected limits. + if (t < 1.0) + { + FLOATTYPE v_new_off_f = (SIGNEDTYPE)(v_max - v_min) * t; + result = (TYPE)((SIGNEDTYPE)v_min + (SIGNEDTYPE)(v_new_off_f + (FLOATTYPE)(v_min > v_max ? -0.5 : 0.5))); + } + else + { + result = v_max; + } + } + } + + return result; +} + +// FIXME: Move more of the code into SliderBehavior() +template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE> +bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, TYPE* v, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) { ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; - const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const bool is_power = (power != 1.0f) && is_decimal; + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); const float grab_padding = 2.0f; const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; float grab_sz = style.GrabMinSize; SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); - if (!is_decimal && v_range >= 0) // v_range < 0 may happen on integer overflows + if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit grab_sz = ImMin(grab_sz, slider_sz); const float slider_usable_sz = slider_sz - grab_sz; const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f; - // For power curve sliders that cross over sign boundary we want the curve to be symmetric around 0.0f - float linear_zero_pos; // 0.0->1.0f - if (is_power && v_min * v_max < 0.0f) + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + float zero_deadzone_halfsize = 0.0f; // Only valid when is_logarithmic is true + if (is_logarithmic) { - // Different sign - const FLOATTYPE linear_dist_min_to_0 = ImPow(v_min >= 0 ? (FLOATTYPE)v_min : -(FLOATTYPE)v_min, (FLOATTYPE)1.0f / power); - const FLOATTYPE linear_dist_max_to_0 = ImPow(v_max >= 0 ? (FLOATTYPE)v_max : -(FLOATTYPE)v_max, (FLOATTYPE)1.0f / power); - linear_zero_pos = (float)(linear_dist_min_to_0 / (linear_dist_min_to_0 + linear_dist_max_to_0)); - } - else - { - // Same sign - linear_zero_pos = v_min < 0.0f ? 1.0f : 0.0f; + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + zero_deadzone_halfsize = (style.LogSliderDeadzone * 0.5f) / ImMax(slider_usable_sz, 1.0f); } // Process interacting with the slider @@ -2270,87 +2763,80 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ } else if (g.ActiveIdSource == ImGuiInputSource_Nav) { - const ImVec2 delta2 = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 0.0f, 0.0f); - float delta = (axis == ImGuiAxis_X) ? delta2.x : -delta2.y; - if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + if (g.ActiveIdIsJustActivated) { - ClearActiveID(); + g.SliderCurrentAccum = 0.0f; // Reset any stored nav delta upon activation + g.SliderCurrentAccumDirty = false; } - else if (delta != 0.0f) + + const ImVec2 input_delta2 = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 0.0f, 0.0f); + float input_delta = (axis == ImGuiAxis_X) ? input_delta2.x : -input_delta2.y; + if (input_delta != 0.0f) { - clicked_t = SliderCalcRatioFromValueT<TYPE,FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos); - const int decimal_precision = is_decimal ? ImParseFormatPrecision(format, 3) : 0; - if ((decimal_precision > 0) || is_power) + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; + if (decimal_precision > 0) { - delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds + input_delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds if (IsNavInputDown(ImGuiNavInput_TweakSlow)) - delta /= 10.0f; + input_delta /= 10.0f; } else { if ((v_range >= -100.0f && v_range <= 100.0f) || IsNavInputDown(ImGuiNavInput_TweakSlow)) - delta = ((delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps else - delta /= 100.0f; + input_delta /= 100.0f; } if (IsNavInputDown(ImGuiNavInput_TweakFast)) - delta *= 10.0f; - set_new_value = true; + input_delta *= 10.0f; + + g.SliderCurrentAccum += input_delta; + g.SliderCurrentAccumDirty = true; + } + + float delta = g.SliderCurrentAccum; + if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + { + ClearActiveID(); + } + else if (g.SliderCurrentAccumDirty) + { + clicked_t = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if ((clicked_t >= 1.0f && delta > 0.0f) || (clicked_t <= 0.0f && delta < 0.0f)) // This is to avoid applying the saturation when already past the limits + { set_new_value = false; + g.SliderCurrentAccum = 0.0f; // If pushing up against the limits, don't continue to accumulate + } else + { + set_new_value = true; + float old_clicked_t = clicked_t; clicked_t = ImSaturate(clicked_t + delta); + + // Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator + TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (!(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_new); + float new_clicked_t = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + if (delta > 0) + g.SliderCurrentAccum -= ImMin(new_clicked_t - old_clicked_t, delta); + else + g.SliderCurrentAccum -= ImMax(new_clicked_t - old_clicked_t, delta); + } + + g.SliderCurrentAccumDirty = false; } } if (set_new_value) { - TYPE v_new; - if (is_power) - { - // Account for power curve scale on both sides of the zero - if (clicked_t < linear_zero_pos) - { - // Negative: rescale to the negative range before powering - float a = 1.0f - (clicked_t / linear_zero_pos); - a = ImPow(a, power); - v_new = ImLerp(ImMin(v_max, (TYPE)0), v_min, a); - } - else - { - // Positive: rescale to the positive range before powering - float a; - if (ImFabs(linear_zero_pos - 1.0f) > 1.e-6f) - a = (clicked_t - linear_zero_pos) / (1.0f - linear_zero_pos); - else - a = clicked_t; - a = ImPow(a, power); - v_new = ImLerp(ImMax(v_min, (TYPE)0), v_max, a); - } - } - else - { - // Linear slider - if (is_decimal) - { - v_new = ImLerp(v_min, v_max, clicked_t); - } - else - { - // For integer values we want the clicking position to match the grab box so we round above - // This code is carefully tuned to work with large values (e.g. high ranges of U64) while preserving this property.. - FLOATTYPE v_new_off_f = (v_max - v_min) * clicked_t; - TYPE v_new_off_floor = (TYPE)(v_new_off_f); - TYPE v_new_off_round = (TYPE)(v_new_off_f + (FLOATTYPE)0.5); - if (!is_decimal && v_new_off_floor < v_new_off_round) - v_new = v_min + v_new_off_round; - else - v_new = v_min + v_new_off_floor; - } - } + TYPE v_new = ScaleValueFromRatioT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); // Round to user desired precision based on format string - v_new = RoundScalarWithFormatT<TYPE,SIGNEDTYPE>(format, data_type, v_new); + if (!(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT<TYPE, SIGNEDTYPE>(format, data_type, v_new); // Apply result if (*v != v_new) @@ -2368,7 +2854,7 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ else { // Output grab position so it can be displayed by the caller - float grab_t = SliderCalcRatioFromValueT<TYPE, FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos); + float grab_t = ScaleRatioFromValueT<TYPE, SIGNEDTYPE, FLOATTYPE>(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); if (axis == ImGuiAxis_Y) grab_t = 1.0f - grab_t; const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); @@ -2381,42 +2867,51 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ return value_changed; } -// For 32-bits and larger types, slider bounds are limited to half the natural type range. +// For 32-bit and larger types, slider bounds are limited to half the natural type range. // So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. // It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. -bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb) +bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) { + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + + ImGuiContext& g = *GImGui; + if ((g.CurrentWindow->DC.ItemFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; + switch (data_type) { - case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)v; bool r = SliderBehaviorT<ImS32, ImS32, float >(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)v_min, *(const ImS8*)v_max, format, power, flags, out_grab_bb); if (r) *(ImS8*)v = (ImS8)v32; return r; } - case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)v; bool r = SliderBehaviorT<ImU32, ImS32, float >(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)v_min, *(const ImU8*)v_max, format, power, flags, out_grab_bb); if (r) *(ImU8*)v = (ImU8)v32; return r; } - case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)v; bool r = SliderBehaviorT<ImS32, ImS32, float >(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)v_min, *(const ImS16*)v_max, format, power, flags, out_grab_bb); if (r) *(ImS16*)v = (ImS16)v32; return r; } - case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)v; bool r = SliderBehaviorT<ImU32, ImS32, float >(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)v_min, *(const ImU16*)v_max, format, power, flags, out_grab_bb); if (r) *(ImU16*)v = (ImU16)v32; return r; } + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min, *(const ImU8*)p_max, format, flags, out_grab_bb); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } case ImGuiDataType_S32: - IM_ASSERT(*(const ImS32*)v_min >= IM_S32_MIN/2 && *(const ImS32*)v_max <= IM_S32_MAX/2); - return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)v, *(const ImS32*)v_min, *(const ImS32*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN / 2 && *(const ImS32*)p_max <= IM_S32_MAX / 2); + return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)p_v, *(const ImS32*)p_min, *(const ImS32*)p_max, format, flags, out_grab_bb); case ImGuiDataType_U32: - IM_ASSERT(*(const ImU32*)v_min <= IM_U32_MAX/2); - return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)v, *(const ImU32*)v_min, *(const ImU32*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX / 2); + return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)p_v, *(const ImU32*)p_min, *(const ImU32*)p_max, format, flags, out_grab_bb); case ImGuiDataType_S64: - IM_ASSERT(*(const ImS64*)v_min >= IM_S64_MIN/2 && *(const ImS64*)v_max <= IM_S64_MAX/2); - return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)v, *(const ImS64*)v_min, *(const ImS64*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN / 2 && *(const ImS64*)p_max <= IM_S64_MAX / 2); + return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)p_v, *(const ImS64*)p_min, *(const ImS64*)p_max, format, flags, out_grab_bb); case ImGuiDataType_U64: - IM_ASSERT(*(const ImU64*)v_min <= IM_U64_MAX/2); - return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)v, *(const ImU64*)v_min, *(const ImU64*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX / 2); + return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)p_v, *(const ImU64*)p_min, *(const ImU64*)p_max, format, flags, out_grab_bb); case ImGuiDataType_Float: - IM_ASSERT(*(const float*)v_min >= -FLT_MAX/2.0f && *(const float*)v_max <= FLT_MAX/2.0f); - return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)v, *(const float*)v_min, *(const float*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const float*)p_min >= -FLT_MAX / 2.0f && *(const float*)p_max <= FLT_MAX / 2.0f); + return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)p_v, *(const float*)p_min, *(const float*)p_max, format, flags, out_grab_bb); case ImGuiDataType_Double: - IM_ASSERT(*(const double*)v_min >= -DBL_MAX/2.0f && *(const double*)v_max <= DBL_MAX/2.0f); - return SliderBehaviorT<double,double,double>(bb, id, data_type, (double*)v, *(const double*)v_min, *(const double*)v_max, format, power, flags, out_grab_bb); + IM_ASSERT(*(const double*)p_min >= -DBL_MAX / 2.0f && *(const double*)p_max <= DBL_MAX / 2.0f); + return SliderBehaviorT<double, double, double>(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, flags, out_grab_bb); case ImGuiDataType_COUNT: break; } IM_ASSERT(0); return false; } -bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power) +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required. +// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2425,10 +2920,10 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); - const float w = GetNextItemWidth(); + const float w = CalcItemWidth(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f)); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); ItemSize(total_bb, style.FramePadding.y); @@ -2443,27 +2938,32 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co // Tabbing or CTRL-clicking on Slider turns it into an input box const bool hovered = ItemHoverable(frame_bb, id); - bool temp_input_is_active = TempInputTextIsActive(id); - bool temp_input_start = false; + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { - const bool focus_requested = FocusableItemRegister(window, id); + const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id); const bool clicked = (hovered && g.IO.MouseClicked[0]); if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id) { SetActiveID(id, window); SetFocusID(id, window); FocusWindow(window); - g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); - if (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id) + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id)) { - temp_input_start = true; + temp_input_is_active = true; FocusableItemUnregister(window); } } } - if (temp_input_is_active || temp_input_start) - return TempInputTextScalar(frame_bb, id, label, data_type, v, format); + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0; + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); + } // Draw frame const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); @@ -2472,7 +2972,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co // Slider behavior ImRect grab_bb; - const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_None, &grab_bb); + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bb); if (value_changed) MarkItemEdited(id); @@ -2482,8 +2982,10 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); - RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f)); + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); if (label_size.x > 0.0f) RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); @@ -2493,7 +2995,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co } // Add multiple sliders on 1 line for compact edition of multiple components -bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power) +bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2503,75 +3005,82 @@ bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, i bool value_changed = false; BeginGroup(); PushID(label); - PushMultiItemsWidths(components, GetNextItemWidth()); + PushMultiItemsWidths(components, CalcItemWidth()); size_t type_size = GDataTypeInfo[data_type].Size; for (int i = 0; i < components; i++) { PushID(i); - value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, power); - SameLine(0, g.Style.ItemInnerSpacing.x); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, flags); PopID(); PopItemWidth(); v = (void*)((char*)v + type_size); } PopID(); - TextEx(label, FindRenderedTextEnd(label)); + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + EndGroup(); return value_changed; } -bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power) +bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); + return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); } -bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power) +bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); + return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, flags); } -bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power) +bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); + return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, flags); } -bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power) +bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); + return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, flags); } -bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max, const char* format) +bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max, const char* format, ImGuiSliderFlags flags) { if (format == NULL) format = "%.0f deg"; - float v_deg = (*v_rad) * 360.0f / (2*IM_PI); - bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, 1.0f); - *v_rad = v_deg * (2*IM_PI) / 360.0f; + float v_deg = (*v_rad) * 360.0f / (2 * IM_PI); + bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, flags); + *v_rad = v_deg * (2 * IM_PI) / 360.0f; return value_changed; } -bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* format) +bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalar(label, ImGuiDataType_S32, v, &v_min, &v_max, format); + return SliderScalar(label, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); } -bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format) +bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_S32, v, 2, &v_min, &v_max, format); + return SliderScalarN(label, ImGuiDataType_S32, v, 2, &v_min, &v_max, format, flags); } -bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format) +bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_S32, v, 3, &v_min, &v_max, format); + return SliderScalarN(label, ImGuiDataType_S32, v, 3, &v_min, &v_max, format, flags); } -bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format) +bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format); + return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format, flags); } -bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power) +bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2601,7 +3110,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d SetActiveID(id, window); SetFocusID(id, window); FocusWindow(window); - g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); } // Draw frame @@ -2611,7 +3120,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d // Slider behavior ImRect grab_bb; - const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_Vertical, &grab_bb); + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags | ImGuiSliderFlags_Vertical, &grab_bb); if (value_changed) MarkItemEdited(id); @@ -2622,24 +3131,51 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. // For the vertical slider we allow centered text to overlap the frame padding char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f)); + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.0f)); if (label_size.x > 0.0f) RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); return value_changed; } -bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format, float power) +bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) { - return VSliderScalar(label, size, ImGuiDataType_Float, v, &v_min, &v_max, format, power); + return VSliderScalar(label, size, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); } -bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format) +bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) { - return VSliderScalar(label, size, ImGuiDataType_S32, v, &v_min, &v_max, format); + return VSliderScalar(label, size, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. +bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return SliderScalar(label, data_type, p_data, p_min, p_max, format, slider_flags); +} + +bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power) +{ + ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return SliderScalarN(label, data_type, v, components, v_min, v_max, format, slider_flags); +} + +#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //------------------------------------------------------------------------- // [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. //------------------------------------------------------------------------- @@ -2735,37 +3271,69 @@ int ImParseFormatPrecision(const char* fmt, int default_precision) // Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) // FIXME: Facilitate using this in variety of other situations. -bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format) +bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags) { - ImGuiContext& g = *GImGui; - // On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id. // We clear ActiveID on the first frame to allow the InputText() taking it back. - const bool init = (g.TempInputTextId != id); + ImGuiContext& g = *GImGui; + const bool init = (g.TempInputId != id); if (init) ClearActiveID(); - char fmt_buf[32]; - char data_buf[32]; - format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); - DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format); - ImStrTrimBlanks(data_buf); - g.CurrentWindow->DC.CursorPos = bb.Min; - ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal); - bool value_changed = InputTextEx(label, NULL, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags); + bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags); if (init) { // First frame we started displaying the InputText widget, we expect it to take the active id. IM_ASSERT(g.ActiveId == id); - g.TempInputTextId = g.ActiveId; + g.TempInputId = g.ActiveId; } - if (value_changed) - return DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, NULL); - return false; + return value_changed; } -bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_ptr, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags flags) +// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! +// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. +// However this may not be ideal for all uses, as some user code may break on out of bound values. +bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max) +{ + ImGuiContext& g = *GImGui; + + char fmt_buf[32]; + char data_buf[32]; + format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); + DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); + ImStrTrimBlanks(data_buf); + + ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; + flags |= ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal); + bool value_changed = false; + if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) + { + // Backup old value + size_t data_type_size = DataTypeGetInfo(data_type)->Size; + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, data_type_size); + + // Apply new value (or operations) then clamp + DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, p_data, NULL); + if (p_clamp_min || p_clamp_max) + { + if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0) + ImSwap(p_clamp_min, p_clamp_max); + DataTypeClamp(data_type, p_data, p_clamp_min, p_clamp_max); + } + + // Only mark as edited if new value is different + value_changed = memcmp(&data_backup, p_data, data_type_size) != 0; + if (value_changed) + MarkItemEdited(id); + } + return value_changed; +} + +// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. +// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2778,22 +3346,23 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p format = DataTypeGetInfo(data_type)->PrintFmt; char buf[64]; - DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, format); + DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); bool value_changed = false; if ((flags & (ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) flags |= ImGuiInputTextFlags_CharsDecimal; flags |= ImGuiInputTextFlags_AutoSelectAll; + flags |= ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. - if (step != NULL) + if (p_step != NULL) { const float button_size = GetFrameHeight(); BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive() PushID(label); - SetNextItemWidth(ImMax(1.0f, GetNextItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); + SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view - value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, format); + value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format); // Step buttons const ImVec2 backup_frame_padding = style.FramePadding; @@ -2804,17 +3373,22 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p SameLine(0, style.ItemInnerSpacing.x); if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) { - DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step); + DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); value_changed = true; } SameLine(0, style.ItemInnerSpacing.x); if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) { - DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step); + DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); value_changed = true; } - SameLine(0, style.ItemInnerSpacing.x); - TextEx(label, FindRenderedTextEnd(label)); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, style.ItemInnerSpacing.x); + TextEx(label, label_end); + } style.FramePadding = backup_frame_padding; PopID(); @@ -2823,13 +3397,15 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p else { if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) - value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, format); + value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format); } + if (value_changed) + MarkItemEdited(window->DC.LastItemId); return value_changed; } -bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags flags) +bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) @@ -2839,20 +3415,27 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in bool value_changed = false; BeginGroup(); PushID(label); - PushMultiItemsWidths(components, GetNextItemWidth()); + PushMultiItemsWidths(components, CalcItemWidth()); size_t type_size = GDataTypeInfo[data_type].Size; for (int i = 0; i < components; i++) { PushID(i); - value_changed |= InputScalar("", data_type, v, step, step_fast, format, flags); - SameLine(0, g.Style.ItemInnerSpacing.x); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags); PopID(); PopItemWidth(); - v = (void*)((char*)v + type_size); + p_data = (void*)((char*)p_data + type_size); } PopID(); - TextEx(label, FindRenderedTextEnd(label)); + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0.0f, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + EndGroup(); return value_changed; } @@ -2860,7 +3443,7 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) { flags |= ImGuiInputTextFlags_CharsScientific; - return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), format, flags); + return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); } bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags flags) @@ -2878,46 +3461,11 @@ bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGui return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags); } -// Prefer using "const char* format" directly, which is more flexible and consistent with other API. -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags flags) -{ - char format[16] = "%f"; - if (decimal_precision >= 0) - ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision); - return InputFloat(label, v, step, step_fast, format, flags); -} - -bool ImGui::InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags flags) -{ - char format[16] = "%f"; - if (decimal_precision >= 0) - ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision); - return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags); -} - -bool ImGui::InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags flags) -{ - char format[16] = "%f"; - if (decimal_precision >= 0) - ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision); - return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags); -} - -bool ImGui::InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags flags) -{ - char format[16] = "%f"; - if (decimal_precision >= 0) - ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision); - return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags); -} -#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS - bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags flags) { // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes. const char* format = (flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d"; - return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, flags); + return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step > 0 ? &step : NULL), (void*)(step_fast > 0 ? &step_fast : NULL), format, flags); } bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags) @@ -2938,7 +3486,7 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) { flags |= ImGuiInputTextFlags_CharsScientific; - return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step>0.0 ? &step : NULL), (void*)(step_fast>0.0 ? &step_fast : NULL), format, flags); + return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); } //------------------------------------------------------------------------- @@ -2953,7 +3501,7 @@ bool ImGui::InputDouble(const char* label, double* v, double step, double step_f bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) { IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() - return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0,0), flags, callback, user_data); + return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); } bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) @@ -2988,7 +3536,7 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* t const float line_height = g.FontSize; const float scale = line_height / font->FontSize; - ImVec2 text_size = ImVec2(0,0); + ImVec2 text_size = ImVec2(0, 0); float line_width = 0.0f; const ImWchar* s = text_begin; @@ -3032,8 +3580,8 @@ namespace ImStb static int STB_TEXTEDIT_STRINGLEN(const STB_TEXTEDIT_STRING* obj) { return obj->CurLenW; } static ImWchar STB_TEXTEDIT_GETCHAR(const STB_TEXTEDIT_STRING* obj, int idx) { return obj->TextW[idx]; } -static float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx+char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; return GImGui->Font->GetCharAdvance(c) * (GImGui->FontSize / GImGui->Font->FontSize); } -static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x10000 ? 0 : key; } +static float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *GImGui; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } +static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx) { @@ -3049,10 +3597,10 @@ static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* ob } static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|'; } -static int is_word_boundary_from_right(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (is_separator( obj->TextW[idx-1] ) && !is_separator( obj->TextW[idx] ) ) : 1; } +static int is_word_boundary_from_right(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; } static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } #ifdef __APPLE__ // FIXME: Move setting to IO structure -static int is_word_boundary_from_left(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (!is_separator( obj->TextW[idx-1] ) && is_separator( obj->TextW[idx] ) ) : 1; } +static int is_word_boundary_from_left(STB_TEXTEDIT_STRING* obj, int idx) { return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx]) ) : 1; } static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } #else static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } @@ -3065,6 +3613,7 @@ static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n) ImWchar* dst = obj->TextW.Data + pos; // We maintain our buffer length in both UTF-8 and wchar formats + obj->Edited = true; obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); obj->CurLenW -= n; @@ -3099,6 +3648,7 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); + obj->Edited = true; obj->CurLenW += new_text_len; obj->CurLenA += new_text_len_utf8; obj->TextW[obj->CurLenW] = '\0'; @@ -3107,27 +3657,46 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im } // We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) -#define STB_TEXTEDIT_K_LEFT 0x10000 // keyboard input to move cursor left -#define STB_TEXTEDIT_K_RIGHT 0x10001 // keyboard input to move cursor right -#define STB_TEXTEDIT_K_UP 0x10002 // keyboard input to move cursor up -#define STB_TEXTEDIT_K_DOWN 0x10003 // keyboard input to move cursor down -#define STB_TEXTEDIT_K_LINESTART 0x10004 // keyboard input to move cursor to start of line -#define STB_TEXTEDIT_K_LINEEND 0x10005 // keyboard input to move cursor to end of line -#define STB_TEXTEDIT_K_TEXTSTART 0x10006 // keyboard input to move cursor to start of text -#define STB_TEXTEDIT_K_TEXTEND 0x10007 // keyboard input to move cursor to end of text -#define STB_TEXTEDIT_K_DELETE 0x10008 // keyboard input to delete selection or character under cursor -#define STB_TEXTEDIT_K_BACKSPACE 0x10009 // keyboard input to delete selection or character left of cursor -#define STB_TEXTEDIT_K_UNDO 0x1000A // keyboard input to perform undo -#define STB_TEXTEDIT_K_REDO 0x1000B // keyboard input to perform redo -#define STB_TEXTEDIT_K_WORDLEFT 0x1000C // keyboard input to move cursor left one word -#define STB_TEXTEDIT_K_WORDRIGHT 0x1000D // keyboard input to move cursor right one word -#define STB_TEXTEDIT_K_SHIFT 0x20000 +#define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left +#define STB_TEXTEDIT_K_RIGHT 0x200001 // keyboard input to move cursor right +#define STB_TEXTEDIT_K_UP 0x200002 // keyboard input to move cursor up +#define STB_TEXTEDIT_K_DOWN 0x200003 // keyboard input to move cursor down +#define STB_TEXTEDIT_K_LINESTART 0x200004 // keyboard input to move cursor to start of line +#define STB_TEXTEDIT_K_LINEEND 0x200005 // keyboard input to move cursor to end of line +#define STB_TEXTEDIT_K_TEXTSTART 0x200006 // keyboard input to move cursor to start of text +#define STB_TEXTEDIT_K_TEXTEND 0x200007 // keyboard input to move cursor to end of text +#define STB_TEXTEDIT_K_DELETE 0x200008 // keyboard input to delete selection or character under cursor +#define STB_TEXTEDIT_K_BACKSPACE 0x200009 // keyboard input to delete selection or character left of cursor +#define STB_TEXTEDIT_K_UNDO 0x20000A // keyboard input to perform undo +#define STB_TEXTEDIT_K_REDO 0x20000B // keyboard input to perform redo +#define STB_TEXTEDIT_K_WORDLEFT 0x20000C // keyboard input to move cursor left one word +#define STB_TEXTEDIT_K_WORDRIGHT 0x20000D // keyboard input to move cursor right one word +#define STB_TEXTEDIT_K_PGUP 0x20000E // keyboard input to move cursor up a page +#define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page +#define STB_TEXTEDIT_K_SHIFT 0x400000 #define STB_TEXTEDIT_IMPLEMENTATION #include "imstb_textedit.h" +// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling +// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) +static void stb_textedit_replace(STB_TEXTEDIT_STRING* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) +{ + stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); + ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); + if (text_len <= 0) + return; + if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len)) + { + state->cursor = text_len; + state->has_preferred_x = 0; + return; + } + IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace() } +} // namespace ImStb + void ImGuiInputTextState::OnKeyPressed(int key) { stb_textedit_key(this, &Stb, key); @@ -3152,7 +3721,7 @@ void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) *dst++ = c; *dst = '\0'; - if (CursorPos + bytes_count >= pos) + if (CursorPos >= pos + bytes_count) CursorPos -= bytes_count; else if (CursorPos >= pos) CursorPos = pos; @@ -3170,7 +3739,7 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons if (!is_resizable) return; - // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the midly similar code (until we remove the U16 buffer alltogether!) + // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the mildly similar code (until we remove the U16 buffer altogether!) ImGuiContext& g = *GImGui; ImGuiInputTextState* edit_state = &g.InputTextState; IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID); @@ -3208,28 +3777,48 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f return false; } + // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) + if (c == 127) + return false; + // Filter private Unicode range. GLFW on OSX seems to send private characters for special keys like arrow keys (FIXME) if (c >= 0xE000 && c <= 0xF8FF) return false; + // Filter Unicode ranges we are not handling in this build. + if (c > IM_UNICODE_CODEPOINT_MAX) + return false; + // Generic named filters if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific)) { + // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf. + // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. + // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. + // Change the default decimal_point with: + // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; + ImGuiContext& g = *GImGui; + const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; + + // Allow 0-9 . - + * / if (flags & ImGuiInputTextFlags_CharsDecimal) - if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/')) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/')) return false; + // Allow 0-9 . - + * / e E if (flags & ImGuiInputTextFlags_CharsScientific) - if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/') && (c != 'e') && (c != 'E')) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/') && (c != 'e') && (c != 'E')) return false; + // Allow 0-9 a-F A-F if (flags & ImGuiInputTextFlags_CharsHexadecimal) if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) return false; + // Turn a-z into A-Z if (flags & ImGuiInputTextFlags_CharsUppercase) if (c >= 'a' && c <= 'z') - *p_char = (c += (unsigned int)('A'-'a')); + *p_char = (c += (unsigned int)('A' - 'a')); if (flags & ImGuiInputTextFlags_CharsNoBlank) if (ImCharIsBlankW(c)) @@ -3269,6 +3858,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (window->SkipItems) return false; + IM_ASSERT(buf != NULL && buf_size >= 0); IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys) IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key) @@ -3289,11 +3879,14 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ BeginGroup(); const ImGuiID id = window->GetID(label); const ImVec2 label_size = CalcTextSize(label, NULL, true); - ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? (style.ItemInnerSpacing.x + label_size.x) : 0.0f, 0.0f)); + const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? g.FontSize * 8.0f : label_size.y) + style.FramePadding.y * 2.0f); // Arbitrary default of 8 lines high for multi-line + const ImVec2 total_size = ImVec2(frame_size.x + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), frame_size.y); + + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size); ImGuiWindow* draw_window = window; + ImVec2 inner_size = frame_size; if (is_multiline) { if (!ItemAdd(total_bb, id, &frame_bb)) @@ -3302,15 +3895,24 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ EndGroup(); return false; } - if (!BeginChildFrame(id, frame_bb.GetSize())) + + // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. + PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); + PopStyleVar(2); + PopStyleColor(); + if (!child_visible) { - EndChildFrame(); + EndChild(); EndGroup(); return false; } - draw_window = GetCurrentWindow(); - draw_window->DC.NavLayerActiveMaskNext |= draw_window->DC.NavLayerCurrentMask; // This is to ensure that EndChild() will display a navigation highlight - size.x -= draw_window->ScrollbarSizes.x; + draw_window = g.CurrentWindow; // Child window + draw_window->DC.NavLayerActiveMaskNext |= (1 << draw_window->DC.NavLayerCurrent); // This is to ensure that EndChild() will display a navigation highlight so we can "enter" into it. + draw_window->DC.CursorPos += style.FramePadding; + inner_size.x -= draw_window->ScrollbarSizes.x; } else { @@ -3322,26 +3924,27 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (hovered) g.MouseCursor = ImGuiMouseCursor_TextInput; - // NB: we are only allowed to access 'edit_state' if we are the active widget. - ImGuiInputTextState* state = NULL; - if (g.InputTextState.ID == id) - state = &g.InputTextState; + // We are only allowed to access the state if we are already the active widget. + ImGuiInputTextState* state = GetInputTextState(id); const bool focus_requested = FocusableItemRegister(window, id); - const bool focus_requested_by_code = focus_requested && (g.FocusRequestCurrWindow == window && g.FocusRequestCurrCounterAll == window->DC.FocusCounterAll); + const bool focus_requested_by_code = focus_requested && (g.TabFocusRequestCurrWindow == window && g.TabFocusRequestCurrCounterRegular == window->DC.FocusCounterRegular); const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code; const bool user_clicked = hovered && io.MouseClicked[0]; - const bool user_nav_input_start = (g.ActiveId != id) && ((g.NavInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_NavKeyboard)); - const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetScrollbarID(draw_window, ImGuiAxis_Y); - const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetScrollbarID(draw_window, ImGuiAxis_Y); + const bool user_nav_input_start = (g.ActiveId != id) && ((g.NavInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_Keyboard)); + const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); + const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); bool clear_active_id = false; bool select_all = (g.ActiveId != id) && ((flags & ImGuiInputTextFlags_AutoSelectAll) != 0 || user_nav_input_start) && (!is_multiline); + float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; + + const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); const bool init_make_active = (focus_requested || user_clicked || user_scroll_finish || user_nav_input_start); const bool init_state = (init_make_active || user_scroll_active); - if (init_state && g.ActiveId != id) + if ((init_state && g.ActiveId != id) || init_changed_specs) { // Access state even if we don't own it yet. state = &g.InputTextState; @@ -3363,7 +3966,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Preserve cursor position and undo/redo stack if we come back to same widget // FIXME: For non-readonly widgets we might be able to require that TextAIsValid && TextA == buf ? (untested) and discard undo stack if user buffer has changed. - const bool recycle_state = (state->ID == id); + const bool recycle_state = (state->ID == id && !init_changed_specs); if (recycle_state) { // Recycle existing cursor/selection/undo stack but clamp position @@ -3378,8 +3981,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (!is_multiline && focus_requested_by_code) select_all = true; } - if (flags & ImGuiInputTextFlags_AlwaysInsertMode) - state->Stb.insert_mode = 1; + if (flags & ImGuiInputTextFlags_AlwaysOverwrite) + state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863) if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl))) select_all = true; } @@ -3390,12 +3993,18 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ SetActiveID(id, window); SetFocusID(id, window); FocusWindow(window); + + // Declare our inputs IM_ASSERT(ImGuiNavInput_COUNT < 32); - g.ActiveIdBlockNavInputFlags = (1 << ImGuiNavInput_Cancel); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel); + g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_Home) | ((ImU64)1 << ImGuiKey_End); + if (is_multiline) + g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_PageUp) | ((ImU64)1 << ImGuiKey_PageDown); if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. - g.ActiveIdBlockNavInputFlags |= (1 << ImGuiNavInput_KeyTab_); - if (!is_multiline && !(flags & ImGuiInputTextFlags_CallbackHistory)) - g.ActiveIdAllowNavDirFlags = ((1 << ImGuiDir_Up) | (1 << ImGuiDir_Down)); + g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_Tab); } // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) @@ -3435,7 +4044,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ ImFont* password_font = &g.InputTextPasswordFont; password_font->FontSize = g.Font->FontSize; password_font->Scale = g.Font->Scale; - password_font->DisplayOffset = g.Font->DisplayOffset; password_font->Ascent = g.Font->Ascent; password_font->Descent = g.Font->Descent; password_font->ContainerAtlas = g.Font->ContainerAtlas; @@ -3451,6 +4059,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { IM_ASSERT(state != NULL); backup_current_text_length = state->CurLenA; + state->Edited = false; state->BufCapacityA = buf_size; state->UserFlags = flags; state->UserCallback = callback; @@ -3463,7 +4072,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Edit in progress const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX; - const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y - style.FramePadding.y) : (g.FontSize*0.5f)); + const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y) : (g.FontSize * 0.5f)); const bool is_osx = io.ConfigMacOSXBehaviors; if (select_all || (hovered && !is_osx && io.MouseDoubleClicked[0])) @@ -3494,7 +4103,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (state->SelectedAllMouseLock && !io.MouseDown[0]) state->SelectedAllMouseLock = false; - // It is ill-defined whether the back-end needs to send a \t character when pressing the TAB keys. + // It is ill-defined whether the backend needs to send a \t character when pressing the TAB keys. // Win32 and GLFW naturally do it but not SDL. const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressedMap(ImGuiKey_Tab) && !ignore_char_inputs && !io.KeyShift && !is_readonly) @@ -3530,14 +4139,19 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id) { IM_ASSERT(state != NULL); + IM_ASSERT(io.KeyMods == GetMergedKeyModFlags() && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods"); // We rarely do this check, but if anything let's do it here. + + const int row_count_per_page = ImMax((int)((inner_size.y - style.FramePadding.y) / g.FontSize), 1); + state->Stb.row_count_per_page = row_count_per_page; + const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); const bool is_osx = io.ConfigMacOSXBehaviors; - const bool is_shortcut_key = (is_osx ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl - const bool is_osx_shift_shortcut = is_osx && io.KeySuper && io.KeyShift && !io.KeyCtrl && !io.KeyAlt; + const bool is_osx_shift_shortcut = is_osx && (io.KeyMods == (ImGuiKeyModFlags_Super | ImGuiKeyModFlags_Shift)); const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End - const bool is_ctrl_key_only = io.KeyCtrl && !io.KeyShift && !io.KeyAlt && !io.KeySuper; - const bool is_shift_key_only = io.KeyShift && !io.KeyCtrl && !io.KeyAlt && !io.KeySuper; + const bool is_ctrl_key_only = (io.KeyMods == ImGuiKeyModFlags_Ctrl); + const bool is_shift_key_only = (io.KeyMods == ImGuiKeyModFlags_Shift); + const bool is_shortcut_key = g.IO.ConfigMacOSXBehaviors ? (io.KeyMods == ImGuiKeyModFlags_Super) : (io.KeyMods == ImGuiKeyModFlags_Ctrl); const bool is_cut = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_X)) || (is_shift_key_only && IsKeyPressedMap(ImGuiKey_Delete))) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); const bool is_copy = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_C)) || (is_ctrl_key_only && IsKeyPressedMap(ImGuiKey_Insert))) && !is_password && (!is_multiline || state->HasSelection()); @@ -3547,8 +4161,10 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (IsKeyPressedMap(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } else if (IsKeyPressedMap(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } + else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } + else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } + else if (IsKeyPressedMap(ImGuiKey_PageUp) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGUP | k_mask); scroll_y -= row_count_per_page * g.FontSize; } + else if (IsKeyPressedMap(ImGuiKey_PageDown) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGDOWN | k_mask); scroll_y += row_count_per_page * g.FontSize; } else if (IsKeyPressedMap(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); } else if (IsKeyPressedMap(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); } else if (IsKeyPressedMap(ImGuiKey_Delete) && !is_readonly) { state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); } @@ -3557,13 +4173,13 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (!state->HasSelection()) { if (is_wordmove_key_down) - state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT); + state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) - state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT); + state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); } state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); } - else if (IsKeyPressedMap(ImGuiKey_Enter)) + else if (IsKeyPressedMap(ImGuiKey_Enter) || IsKeyPressedMap(ImGuiKey_KeyPadEnter)) { bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0; if (!is_multiline || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl)) @@ -3618,7 +4234,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { // Filter pasted buffer const int clipboard_len = (int)strlen(clipboard); - ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len+1) * sizeof(ImWchar)); + ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len + 1) * sizeof(ImWchar)); int clipboard_filtered_len = 0; for (const char* s = clipboard; *s; ) { @@ -3626,7 +4242,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ s += ImTextCharFromUtf8(&c, s, NULL); if (c == 0) break; - if (c >= 0x10000 || !InputTextFilterCharacter(&c, flags, callback, callback_user_data)) + if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data)) continue; clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; } @@ -3655,13 +4271,22 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents. if (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0) { + // Push records into the undo stack so we can CTRL+Z the revert operation itself apply_new_text = state->InitialTextA.Data; apply_new_text_length = state->InitialTextA.Size - 1; + ImVector<ImWchar> w_text; + if (apply_new_text_length > 0) + { + w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1); + ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length); + } + stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0); } } // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. - // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. Also this allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage. + // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. + // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). bool apply_edit_back_to_user_buffer = !cancel_edit || (enter_pressed && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); if (apply_edit_back_to_user_buffer) { @@ -3677,7 +4302,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ } // User callback - if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways)) != 0) + if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackEdit | ImGuiInputTextFlags_CallbackAlways)) != 0) { IM_ASSERT(callback != NULL); @@ -3699,8 +4324,14 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ event_flag = ImGuiInputTextFlags_CallbackHistory; event_key = ImGuiKey_DownArrow; } + else if ((flags & ImGuiInputTextFlags_CallbackEdit) && state->Edited) + { + event_flag = ImGuiInputTextFlags_CallbackEdit; + } else if (flags & ImGuiInputTextFlags_CallbackAlways) + { event_flag = ImGuiInputTextFlags_CallbackAlways; + } if (event_flag) { @@ -3729,10 +4360,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ IM_ASSERT(callback_data.Buf == state->TextA.Data); // Invalid to modify those fields IM_ASSERT(callback_data.BufSize == state->BufCapacityA); IM_ASSERT(callback_data.Flags == flags); - if (callback_data.CursorPos != utf8_cursor_pos) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; } - if (callback_data.SelectionStart != utf8_selection_start) { state->Stb.select_start = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); } - if (callback_data.SelectionEnd != utf8_selection_end) { state->Stb.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } - if (callback_data.BufDirty) + const bool buf_dirty = callback_data.BufDirty; + if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; } + if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb.select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb.cursor : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); } + if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } + if (buf_dirty) { IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! if (callback_data.BufTextLen > backup_current_text_length && is_resizable) @@ -3755,8 +4387,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Copy result to user buffer if (apply_new_text) { + // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size + // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used + // without any storage on user's side. IM_ASSERT(apply_new_text_length >= 0); - if (backup_current_text_length != apply_new_text_length && is_resizable) + if (is_resizable) { ImGuiInputTextCallbackData callback_data; callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize; @@ -3771,6 +4406,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ apply_new_text_length = ImMin(callback_data.BufTextLen, buf_size - 1); IM_ASSERT(apply_new_text_length <= buf_size); } + //IMGUI_DEBUG_LOG("InputText(\"%s\"): apply_new_text length %d\n", label, apply_new_text_length); // If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size. ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size)); @@ -3794,7 +4430,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); } - const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x, frame_bb.Min.y + size.y); // Not using frame_bb.Max because we have adjusted size + const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding; ImVec2 text_size(0.0f, 0.0f); @@ -3850,7 +4486,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter. searches_remaining += is_multiline ? 1 : 0; int line_count = 0; - //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bits + //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit for (const ImWchar* s = text_begin; *s != 0; s++) if (*s == '\n') { @@ -3875,7 +4511,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224) if (is_multiline) - text_size = ImVec2(size.x, line_count * g.FontSize); + text_size = ImVec2(inner_size.x, line_count * g.FontSize); } // Scroll @@ -3884,11 +4520,12 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Horizontal scroll in chunks of quarter width if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll)) { - const float scroll_increment_x = size.x * 0.25f; + const float scroll_increment_x = inner_size.x * 0.25f; + const float visible_width = inner_size.x - style.FramePadding.x; if (cursor_offset.x < state->ScrollX) - state->ScrollX = (float)(int)ImMax(0.0f, cursor_offset.x - scroll_increment_x); - else if (cursor_offset.x - size.x >= state->ScrollX) - state->ScrollX = (float)(int)(cursor_offset.x - size.x + scroll_increment_x); + state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); + else if (cursor_offset.x - visible_width >= state->ScrollX) + state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); } else { @@ -3898,14 +4535,15 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Vertical scroll if (is_multiline) { - float scroll_y = draw_window->Scroll.y; + // Test if cursor is vertically visible if (cursor_offset.y - g.FontSize < scroll_y) scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); - else if (cursor_offset.y - size.y >= scroll_y) - scroll_y = cursor_offset.y - size.y; - draw_window->DC.CursorPos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag + else if (cursor_offset.y - inner_size.y >= scroll_y) + scroll_y = cursor_offset.y - inner_size.y + style.FramePadding.y * 2.0f; + const float scroll_max_y = ImMax((text_size.y + style.FramePadding.y * 2.0f) - inner_size.y, 0.0f); + scroll_y = ImClamp(scroll_y, 0.0f, scroll_max_y); + draw_pos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag draw_window->Scroll.y = scroll_y; - draw_pos.y = draw_window->DC.CursorPos.y; } state->CursorFollow = false; @@ -3928,7 +4566,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ break; if (rect_pos.y < clip_rect.y) { - //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bits + //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit //p = p ? p + 1 : text_selected_end; while (p < text_selected_end) if (*p++ == '\n') @@ -3937,8 +4575,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ else { ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true); - if (rect_size.x <= 0.0f) rect_size.x = (float)(int)(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines - ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos +ImVec2(rect_size.x, bg_offy_dn)); + if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines + ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); rect.ClipWith(clip_rect); if (rect.Overlaps(clip_rect)) draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color); @@ -3974,7 +4612,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { // Render text only (no selection, no cursor) if (is_multiline) - text_size = ImVec2(size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width + text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width else if (!is_displaying_hint && g.ActiveId == id) buf_display_end = buf_display + state->CurLenA; else if (!is_displaying_hint) @@ -3987,24 +4625,27 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ } } - if (is_multiline) - { - Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line - EndChildFrame(); - EndGroup(); - } - if (is_password && !is_displaying_hint) PopFont(); + if (is_multiline) + { + Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); + EndChild(); + EndGroup(); + } + // Log as text - if (g.LogEnabled && !(is_password && !is_displaying_hint)) + if (g.LogEnabled && (!is_password || is_displaying_hint)) + { + LogSetNextTextDecoration("{", "}"); LogRenderedText(&draw_pos, buf_display, buf_display_end); + } if (label_size.x > 0) RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - if (value_changed) + if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited)) MarkItemEdited(id); IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags); @@ -4036,7 +4677,7 @@ bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flag // Edit colors components (each component in 0.0f..1.0f range). // See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -// With typical options: Left-click on colored square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. +// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) { ImGuiWindow* window = GetCurrentWindow(); @@ -4046,9 +4687,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const float square_sz = GetFrameHeight(); - const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); - const float w_items_all = GetNextItemWidth() - w_extra; + const float w_full = CalcItemWidth(); + const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); + const float w_inputs = w_full - w_button; const char* label_display_end = FindRenderedTextEnd(label); + g.NextItemData.ClearFlags(); BeginGroup(); PushID(label); @@ -4084,17 +4727,31 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag if ((flags & ImGuiColorEditFlags_InputHSV) && (flags & ImGuiColorEditFlags_DisplayRGB)) ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV)) + { + // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) + { + if (f[1] == 0) + f[0] = g.ColorEditLastHue; + if (f[2] == 0) + f[1] = g.ColorEditLastSat; + } + } int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; bool value_changed = false; bool value_changed_as_float = false; + const ImVec2 pos = window->DC.CursorPos; + const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f; + window->DC.CursorPos.x = pos.x + inputs_offset_x; + if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) { // RGB/HSV 0..255 Sliders - const float w_item_one = ImMax(1.0f, (float)(int)((w_items_all - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); - const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; @@ -4117,9 +4774,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag if (n > 0) SameLine(0, style.ItemInnerSpacing.x); SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); + + // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. if (flags & ImGuiColorEditFlags_Float) { - value_changed |= DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); + value_changed |= DragFloat(ids[n], &f[n], 1.0f / 255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); value_changed_as_float |= value_changed; } else @@ -4135,10 +4794,10 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag // RGB Hexadecimal Input char buf[64]; if (alpha) - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255)); + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255), ImClamp(i[3], 0, 255)); else - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255)); - SetNextItemWidth(w_items_all); + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); + SetNextItemWidth(w_inputs); if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) { value_changed = true; @@ -4158,8 +4817,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag ImGuiWindow* picker_active_window = NULL; if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) { - if (!(flags & ImGuiColorEditFlags_NoInputs)) - SameLine(0, style.ItemInnerSpacing.x); + const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x; + window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y); const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); if (ColorButton("##ColorButton", col_v4, flags)) @@ -4169,7 +4828,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag // Store current color and open a picker g.ColorPickerRef = col_v4; OpenPopup("picker"); - SetNextWindowPos(window->DC.LastItemRect.GetBL() + ImVec2(-1,style.ItemSpacing.y)); + SetNextWindowPos(window->DC.LastItemRect.GetBL() + ImVec2(-1, style.ItemSpacing.y)); } } if (!(flags & ImGuiColorEditFlags_NoOptions)) @@ -4184,7 +4843,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag Spacing(); } ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; - ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; + ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__DisplayMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); EndPopup(); @@ -4193,7 +4852,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) { - SameLine(0, style.ItemInnerSpacing.x); + const float text_offset_x = (flags & ImGuiColorEditFlags_NoInputs) ? w_button : w_full + style.ItemInnerSpacing.x; + window->DC.CursorPos = ImVec2(pos.x + text_offset_x, pos.y + style.FramePadding.y); TextEx(label, label_display_end); } @@ -4204,7 +4864,12 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag for (int n = 0; n < 4; n++) f[n] = i[n] / 255.0f; if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB)) + { + g.ColorEditLastHue = f[0]; + g.ColorEditLastSat = f[1]; ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); + memcpy(g.ColorEditLastColor, f, sizeof(float) * 3); + } if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV)) ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); @@ -4259,64 +4924,20 @@ bool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags fl return true; } -static inline ImU32 ImAlphaBlendColor(ImU32 col_a, ImU32 col_b) -{ - float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; - int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); - int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); - int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); - return IM_COL32(r, g, b, 0xFF); -} - // Helper for ColorPicker4() -// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. -// I spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding alltogether. -void ImGui::RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, int rounding_corners_flags) +static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w, float alpha) { - ImGuiWindow* window = GetCurrentWindow(); - if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) - { - ImU32 col_bg1 = GetColorU32(ImAlphaBlendColor(IM_COL32(204,204,204,255), col)); - ImU32 col_bg2 = GetColorU32(ImAlphaBlendColor(IM_COL32(128,128,128,255), col)); - window->DrawList->AddRectFilled(p_min, p_max, col_bg1, rounding, rounding_corners_flags); - - int yi = 0; - for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) - { - float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); - if (y2 <= y1) - continue; - for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) - { - float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); - if (x2 <= x1) - continue; - int rounding_corners_flags_cell = 0; - if (y1 <= p_min.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopRight; } - if (y2 >= p_max.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotRight; } - rounding_corners_flags_cell &= rounding_corners_flags; - window->DrawList->AddRectFilled(ImVec2(x1,y1), ImVec2(x2,y2), col_bg2, rounding_corners_flags_cell ? rounding : 0.0f, rounding_corners_flags_cell); - } - } - } - else - { - window->DrawList->AddRectFilled(p_min, p_max, col, rounding, rounding_corners_flags); - } -} - -// Helper for ColorPicker4() -static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w) -{ - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32_BLACK); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32_WHITE); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32_BLACK); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32_WHITE); + ImU32 alpha8 = IM_F32_TO_INT8_SAT(alpha); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32(255,255,255,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32(255,255,255,alpha8)); } // Note: ColorPicker4() only accesses 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. // (In C++ the 'float col[4]' notation for a function argument is equivalent to 'float* col', we only specify a size to facilitate understanding of the code.) // FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) +// FIXME: this is trying to be aware of style.Alpha but not fully correct. Also, the color wheel will have overlapping glitches with (style.Alpha < 1.0) bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) { ImGuiContext& g = *GImGui; @@ -4328,6 +4949,9 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl ImGuiStyle& style = g.Style; ImGuiIO& io = g.IO; + const float width = CalcItemWidth(); + g.NextItemData.ClearFlags(); + PushID(label); BeginGroup(); @@ -4354,10 +4978,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl ImVec2 picker_pos = window->DC.CursorPos; float square_sz = GetFrameHeight(); float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars - float sv_picker_size = ImMax(bars_width * 1, GetNextItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box + float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; - float bars_triangles_half_sz = (float)(int)(bars_width * 0.20f); + float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); float backup_initial_col[4]; memcpy(backup_initial_col, col, components * sizeof(float)); @@ -4365,7 +4989,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl float wheel_thickness = sv_picker_size * 0.08f; float wheel_r_outer = sv_picker_size * 0.50f; float wheel_r_inner = wheel_r_outer - wheel_thickness; - ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size*0.5f); + ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size * 0.5f); // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic. float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f); @@ -4376,9 +5000,21 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl float H = col[0], S = col[1], V = col[2]; float R = col[0], G = col[1], B = col[2]; if (flags & ImGuiColorEditFlags_InputRGB) + { + // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. ColorConvertRGBtoHSV(R, G, B, H, S, V); + if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) + { + if (S == 0) + H = g.ColorEditLastHue; + if (V == 0) + S = g.ColorEditLastSat; + } + } else if (flags & ImGuiColorEditFlags_InputHSV) + { ColorConvertHSVtoRGB(H, S, V, R, G, B); + } bool value_changed = false, value_changed_h = false, value_changed_sv = false; @@ -4392,10 +5028,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; ImVec2 current_off = g.IO.MousePos - wheel_center; float initial_dist2 = ImLengthSqr(initial_off); - if (initial_dist2 >= (wheel_r_inner-1)*(wheel_r_inner-1) && initial_dist2 <= (wheel_r_outer+1)*(wheel_r_outer+1)) + if (initial_dist2 >= (wheel_r_inner - 1) * (wheel_r_inner - 1) && initial_dist2 <= (wheel_r_outer + 1) * (wheel_r_outer + 1)) { // Interactive with Hue wheel - H = ImAtan2(current_off.y, current_off.x) / IM_PI*0.5f; + H = ImAtan2(current_off.y, current_off.x) / IM_PI * 0.5f; if (H < 0.0f) H += 1.0f; value_changed = value_changed_h = true; @@ -4424,8 +5060,8 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); if (IsItemActive()) { - S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size-1)); - V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); + S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); + V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); value_changed = value_changed_sv = true; } if (!(flags & ImGuiColorEditFlags_NoOptions)) @@ -4436,7 +5072,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); if (IsItemActive()) { - H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); + H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); value_changed = value_changed_h = true; } } @@ -4448,7 +5084,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl InvisibleButton("alpha", ImVec2(bars_width, sv_picker_size)); if (IsItemActive()) { - col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1)); + col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); value_changed = true; } } @@ -4499,7 +5135,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { if (flags & ImGuiColorEditFlags_InputRGB) { - ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]); + ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10 * 1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]); + g.ColorEditLastHue = H; + g.ColorEditLastSat = S; + memcpy(g.ColorEditLastColor, col, sizeof(float) * 3); } else if (flags & ImGuiColorEditFlags_InputHSV) { @@ -4519,7 +5158,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags__DisplayMask) == 0) if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) { - // FIXME: Hackily differenciating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. + // FIXME: Hackily differentiating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. // For the later we don't want to run the hue-wrap canceling code. If you are well versed in HSV picker please provide your input! (See #2050) value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap); value_changed = true; @@ -4553,6 +5192,13 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl G = col[1]; B = col[2]; ColorConvertRGBtoHSV(R, G, B, H, S, V); + if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) // Fix local Hue as display below will use it immediately. + { + if (S == 0) + H = g.ColorEditLastHue; + if (V == 0) + S = g.ColorEditLastSat; + } } else if (flags & ImGuiColorEditFlags_InputHSV) { @@ -4563,17 +5209,22 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl } } - ImVec4 hue_color_f(1, 1, 1, 1); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); - ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); - ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, 1.0f)); + const int style_alpha8 = IM_F32_TO_INT8_SAT(style.Alpha); + const ImU32 col_black = IM_COL32(0,0,0,style_alpha8); + const ImU32 col_white = IM_COL32(255,255,255,style_alpha8); + const ImU32 col_midgrey = IM_COL32(128,128,128,style_alpha8); + const ImU32 col_hues[6 + 1] = { IM_COL32(255,0,0,style_alpha8), IM_COL32(255,255,0,style_alpha8), IM_COL32(0,255,0,style_alpha8), IM_COL32(0,255,255,style_alpha8), IM_COL32(0,0,255,style_alpha8), IM_COL32(255,0,255,style_alpha8), IM_COL32(255,0,0,style_alpha8) }; + + ImVec4 hue_color_f(1, 1, 1, style.Alpha); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); + ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); + ImU32 user_col32_striped_of_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, style.Alpha)); // Important: this is still including the main rendering/style alpha!! - const ImU32 hue_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) }; ImVec2 sv_cursor_pos; if (flags & ImGuiColorEditFlags_PickerHueWheel) { // Render Hue Wheel - const float aeps = 1.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). + const float aeps = 0.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12); for (int n = 0; n < 6; n++) { @@ -4581,24 +5232,24 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps; const int vert_start_idx = draw_list->VtxBuffer.Size; draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc); - draw_list->PathStroke(IM_COL32_WHITE, false, wheel_thickness); + draw_list->PathStroke(col_white, 0, wheel_thickness); const int vert_end_idx = draw_list->VtxBuffer.Size; // Paint colors over existing vertices ImVec2 gradient_p0(wheel_center.x + ImCos(a0) * wheel_r_inner, wheel_center.y + ImSin(a0) * wheel_r_inner); ImVec2 gradient_p1(wheel_center.x + ImCos(a1) * wheel_r_inner, wheel_center.y + ImSin(a1) * wheel_r_inner); - ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, hue_colors[n], hue_colors[n+1]); + ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]); } // Render Cursor + preview on Hue Wheel float cos_hue_angle = ImCos(H * 2.0f * IM_PI); float sin_hue_angle = ImSin(H * 2.0f * IM_PI); - ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f); + ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f); float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f; int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32); draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad+1, IM_COL32(128,128,128,255), hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, IM_COL32_WHITE, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad + 1, col_midgrey, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments); // Render SV triangle (rotated according to hue) ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle); @@ -4608,46 +5259,46 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl draw_list->PrimReserve(6, 6); draw_list->PrimVtx(tra, uv_white, hue_color32); draw_list->PrimVtx(trb, uv_white, hue_color32); - draw_list->PrimVtx(trc, uv_white, IM_COL32_WHITE); - draw_list->PrimVtx(tra, uv_white, IM_COL32_BLACK_TRANS); - draw_list->PrimVtx(trb, uv_white, IM_COL32_BLACK); - draw_list->PrimVtx(trc, uv_white, IM_COL32_BLACK_TRANS); - draw_list->AddTriangle(tra, trb, trc, IM_COL32(128,128,128,255), 1.5f); + draw_list->PrimVtx(trc, uv_white, col_white); + draw_list->PrimVtx(tra, uv_white, 0); + draw_list->PrimVtx(trb, uv_white, col_black); + draw_list->PrimVtx(trc, uv_white, 0); + draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f); sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V)); } else if (flags & ImGuiColorEditFlags_PickerHueBar) { // Render SV Square - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE); - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK); - RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f); - sv_cursor_pos.x = ImClamp((float)(int)(picker_pos.x + ImSaturate(S) * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much - sv_cursor_pos.y = ImClamp((float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white); + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black); + RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f); + sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S) * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much + sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); // Render Hue Bar for (int i = 0; i < 6; ++i) - draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_colors[i], hue_colors[i], hue_colors[i + 1], hue_colors[i + 1]); - float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f); + draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]); + float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size); RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); } // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; - draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, col32_no_alpha, 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, IM_COL32(128,128,128,255), 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, IM_COL32_WHITE, 12); + draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12); // Render alpha bar if (alpha_bar) { float alpha = ImSaturate(col[3]); ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); - RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, IM_COL32(0,0,0,0), bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); - draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, col32_no_alpha, col32_no_alpha, col32_no_alpha & ~IM_COL32_A_MASK, col32_no_alpha & ~IM_COL32_A_MASK); - float bar1_line_y = (float)(int)(picker_pos.y + (1.0f - alpha) * sv_picker_size + 0.5f); + RenderColorRectWithAlphaCheckerboard(draw_list, bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); + draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK); + float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size); RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); } EndGroup(); @@ -4662,7 +5313,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl return value_changed; } -// A little colored square. Return true when clicked. +// A little color square. Return true when clicked. // FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip. // 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip. // Note that 'col' may be encoded in HSV if ImGuiColorEditFlags_InputHSV is set. @@ -4698,28 +5349,35 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl float grid_step = ImMin(size.x, size.y) / 2.99f; float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f); ImRect bb_inner = bb; - float off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. - bb_inner.Expand(off); + float off = 0.0f; + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. + bb_inner.Expand(off); + } if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f) { - float mid_x = (float)(int)((bb_inner.Min.x + bb_inner.Max.x) * 0.5f + 0.5f); - RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight); - window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft); + float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f); + RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight); + window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawFlags_RoundCornersLeft); } else { // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha; if (col_source.w < 1.0f) - RenderColorRectWithAlphaCheckerboard(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); + RenderColorRectWithAlphaCheckerboard(window->DrawList, bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); else - window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding, ImDrawCornerFlags_All); + window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding); } RenderNavHighlight(bb, id); - if (g.Style.FrameBorderSize > 0.0f) - RenderFrameBorder(bb.Min, bb.Max, rounding); - else - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + if (g.Style.FrameBorderSize > 0.0f) + RenderFrameBorder(bb.Min, bb.Max, rounding); + else + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border + } // Drag and Drop Source // NB: The ActiveId test is merely an optional micro-optimization, BeginDragDropSource() does the same test. @@ -4739,9 +5397,6 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); - if (pressed) - MarkItemEdited(id); - return pressed; } @@ -4769,7 +5424,7 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags { ImGuiContext& g = *GImGui; - BeginTooltipEx(0, true); + BeginTooltipEx(0, ImGuiTooltipFlags_OverridePreviousTooltip); const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; if (text_end > text) { @@ -4822,7 +5477,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) if (allow_opt_inputs || allow_opt_datatype) Separator(); - if (Button("Copy as..", ImVec2(-1,0))) + if (Button("Copy as..", ImVec2(-1, 0))) OpenPopup("Copy"); if (BeginPopup("Copy")) { @@ -4834,12 +5489,15 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca); if (Selectable(buf)) SetClipboardText(buf); - if (flags & ImGuiColorEditFlags_NoAlpha) - ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X", cr, cg, cb); - else - ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X%02X", cr, cg, cb, ca); + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", cr, cg, cb); if (Selectable(buf)) SetClipboardText(buf); + if (!(flags & ImGuiColorEditFlags_NoAlpha)) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", cr, cg, cb, ca); + if (Selectable(buf)) + SetClipboardText(buf); + } EndPopup(); } @@ -4863,16 +5521,16 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl // Draw small/thumbnail version of each picker type (over an invisible button for selection) if (picker_type > 0) Separator(); PushID(picker_type); - ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs|ImGuiColorEditFlags_NoOptions|ImGuiColorEditFlags_NoLabel|ImGuiColorEditFlags_NoSidePreview|(flags & ImGuiColorEditFlags_NoAlpha); + ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoSidePreview | (flags & ImGuiColorEditFlags_NoAlpha); if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar; if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; ImVec2 backup_pos = GetCursorScreenPos(); if (Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags__PickerMask) | (picker_flags & ImGuiColorEditFlags__PickerMask); SetCursorScreenPos(backup_pos); - ImVec4 dummy_ref_col; - memcpy(&dummy_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); - ColorPicker4("##dummypicker", &dummy_ref_col.x, picker_flags); + ImVec4 previewing_ref_col; + memcpy(&previewing_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); + ColorPicker4("##previewing_picker", &previewing_ref_col.x, picker_flags); PopID(); } PopItemWidth(); @@ -4880,7 +5538,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl if (allow_opt_alpha_bar) { if (allow_opt_picker) Separator(); - CheckboxFlags("Alpha Bar", (unsigned int*)&g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); + CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); } EndPopup(); } @@ -4895,9 +5553,8 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl // - TreeNodeBehavior() [Internal] // - TreePush() // - TreePop() -// - TreeAdvanceToLabelPos() // - GetTreeNodeToLabelSpacing() -// - SetNextTreeNodeOpen() +// - SetNextItemOpen() // - CollapsingHeader() //------------------------------------------------------------------------- @@ -4991,17 +5648,17 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags) if (flags & ImGuiTreeNodeFlags_Leaf) return true; - // We only write to the tree storage if the user clicks (or explicitly use SetNextTreeNode*** functions) + // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; ImGuiStorage* storage = window->DC.StateStorage; bool is_open; - if (g.NextTreeNodeOpenCond != 0) + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) { - if (g.NextTreeNodeOpenCond & ImGuiCond_Always) + if (g.NextItemData.OpenCond & ImGuiCond_Always) { - is_open = g.NextTreeNodeOpenVal; + is_open = g.NextItemData.OpenVal; storage->SetInt(id, is_open); } else @@ -5010,7 +5667,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags) const int stored_value = storage->GetInt(id, -1); if (stored_value == -1) { - is_open = g.NextTreeNodeOpenVal; + is_open = g.NextItemData.OpenVal; storage->SetInt(id, is_open); } else @@ -5018,7 +5675,6 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags) is_open = stored_value != 0; } } - g.NextTreeNodeOpenCond = 0; } else { @@ -5042,38 +5698,45 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0; - const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, 0.0f); + const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y)); if (!label_end) label_end = FindRenderedTextEnd(label); const ImVec2 label_size = CalcTextSize(label, label_end, false); // We vertically grow up to current line height up the typical widget height. - const float text_base_offset_y = ImMax(padding.y, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it - const float frame_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2); - ImRect frame_bb = ImRect(window->DC.CursorPos, ImVec2(GetWorkRectMax().x, window->DC.CursorPos.y + frame_height)); + const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); + ImRect frame_bb; + frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; + frame_bb.Min.y = window->DC.CursorPos.y; + frame_bb.Max.x = window->WorkRect.Max.x; + frame_bb.Max.y = window->DC.CursorPos.y + frame_height; if (display_frame) { - // Framed header expand a little outside the default padding - frame_bb.Min.x -= (float)(int)(window->WindowPadding.x*0.5f) - 1; - frame_bb.Max.x += (float)(int)(window->WindowPadding.x*0.5f) - 1; + // Framed header expand a little outside the default padding, to the edge of InnerClipRect + // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) + frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); + frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); } - const float text_offset_x = (g.FontSize + (display_frame ? padding.x*3 : padding.x*2)); // Collapser arrow width + Spacing - const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f); // Include collapser - ItemSize(ImVec2(text_width, frame_height), text_base_offset_y); + const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing + const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it + const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser + ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); + ItemSize(ImVec2(text_width, frame_height), padding.y); // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing - // (Ideally we'd want to add a flag for the user to specify if we want the hit test to be done up to the right side of the content or not) - const ImRect interact_bb = display_frame ? frame_bb : ImRect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + text_width + style.ItemSpacing.x*2, frame_bb.Max.y); - bool is_open = TreeNodeBehaviorIsOpen(id, flags); - bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; + ImRect interact_bb = frame_bb; + if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) + interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. + const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; + bool is_open = TreeNodeBehaviorIsOpen(id, flags); if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - window->DC.TreeStoreMayJumpToParentOnPop |= (1 << window->DC.TreeDepth); + window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); bool item_add = ItemAdd(interact_bb, id); window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; @@ -5087,19 +5750,37 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l return is_open; } - // Flags that affects opening behavior: - // - 0 (default) .................... single-click anywhere to open - // - OpenOnDoubleClick .............. double-click anywhere to open - // - OpenOnArrow .................... single-click on arrow to open - // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open - ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers; + ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) button_flags |= ImGuiButtonFlags_AllowItemOverlap; - if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) - button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0); if (!is_leaf) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; + // We allow clicking on the arrow section with keyboard modifiers held, in order to easily + // allow browsing a tree while preserving selection with code implementing multi-selection patterns. + // When clicking on the rest of the tree node we always disallow keyboard modifiers. + const float arrow_hit_x1 = (text_pos.x - text_offset_x) - style.TouchExtraPadding.x; + const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + style.TouchExtraPadding.x; + const bool is_mouse_x_over_arrow = (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2); + if (window != g.HoveredWindow || !is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_NoKeyModifiers; + + // Open behaviors can be altered with the _OpenOnArrow and _OnOnDoubleClick flags. + // Some alteration have subtle effects (e.g. toggle on MouseUp vs MouseDown events) due to requirements for multi-selection and drag and drop support. + // - Single-click on label = Toggle on MouseUp (default, when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=1) + // - Double-click on label = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1) + // - Double-click on arrow = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1 and _OpenOnArrow=0) + // It is rather standard that arrow click react on Down rather than Up. + // We set ImGuiButtonFlags_PressedOnClickRelease on OpenOnDoubleClick because we want the item to be active on the initial MouseDown in order for drag and drop to work. + if (is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_PressedOnClick; + else if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) + button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; + else + button_flags |= ImGuiButtonFlags_PressedOnClickRelease; + bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; const bool was_selected = selected; @@ -5108,15 +5789,20 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l bool toggled = false; if (!is_leaf) { - if (pressed) + if (pressed && g.DragDropHoldJustPressedId != id) { - toggled = !(flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) || (g.NavActivateId == id); + if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id)) + toggled = true; if (flags & ImGuiTreeNodeFlags_OpenOnArrow) - toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y)) && (!g.NavDisableMouseHover); - if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) - toggled |= g.IO.MouseDoubleClicked[0]; - if (g.DragDropActive && is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. - toggled = false; + toggled |= is_mouse_x_over_arrow && !g.NavDisableMouseHover; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job + if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseDoubleClicked[0]) + toggled = true; + } + else if (pressed && g.DragDropHoldJustPressedId == id) + { + IM_ASSERT(button_flags & ImGuiButtonFlags_PressedOnDragDropHold); + if (!is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. + toggled = true; } if (g.NavId == id && g.NavMoveRequest && g.NavMoveDir == ImGuiDir_Left && is_open) @@ -5134,6 +5820,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l { is_open = !is_open; window->DC.StateStorage->SetInt(id, is_open); + window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledOpen; } } if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) @@ -5144,44 +5831,42 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection; // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - const ImVec2 text_pos = frame_bb.Min + ImVec2(text_offset_x, text_base_offset_y); + const ImU32 text_col = GetColorU32(ImGuiCol_Text); ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; if (display_frame) { // Framed type - RenderFrame(frame_bb.Min, frame_bb.Max, col, true, style.FrameRounding); + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding); RenderNavHighlight(frame_bb, id, nav_highlight_flags); - RenderArrow(frame_bb.Min + ImVec2(padding.x, text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + if (flags & ImGuiTreeNodeFlags_Bullet) + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); + else if (!is_leaf) + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + else // Leaf without bullet, left-adjusted text + text_pos.x -= text_offset_x; + if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) + frame_bb.Max.x -= g.FontSize + style.FramePadding.x; + if (g.LogEnabled) - { - // NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here. - const char log_prefix[] = "\n##"; - const char log_suffix[] = "##"; - LogRenderedText(&text_pos, log_prefix, log_prefix+3); - RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); - LogRenderedText(&text_pos, log_suffix, log_suffix+2); - } - else - { - RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); - } + LogSetNextTextDecoration("###", "###"); + RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); } else { // Unframed typed for tree nodes if (hovered || selected) { - RenderFrame(frame_bb.Min, frame_bb.Max, col, false); + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false); RenderNavHighlight(frame_bb, id, nav_highlight_flags); } - if (flags & ImGuiTreeNodeFlags_Bullet) - RenderBullet(frame_bb.Min + ImVec2(text_offset_x * 0.5f, g.FontSize*0.50f + text_base_offset_y)); + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); else if (!is_leaf) - RenderArrow(frame_bb.Min + ImVec2(padding.x, g.FontSize*0.15f + text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); if (g.LogEnabled) - LogRenderedText(&text_pos, ">"); + LogSetNextTextDecoration(">", NULL); RenderText(text_pos, label, label_end, false); } @@ -5209,7 +5894,8 @@ void ImGui::TreePush(const void* ptr_id) void ImGui::TreePushOverrideID(ImGuiID id) { - ImGuiWindow* window = GetCurrentWindow(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; Indent(); window->DC.TreeDepth++; window->IDStack.push_back(id); @@ -5222,24 +5908,21 @@ void ImGui::TreePop() Unindent(); window->DC.TreeDepth--; + ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); + + // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) - if (g.NavIdIsAlive && (window->DC.TreeStoreMayJumpToParentOnPop & (1 << window->DC.TreeDepth))) + if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) { - SetNavID(window->IDStack.back(), g.NavLayer); + SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); NavMoveRequestCancel(); } - window->DC.TreeStoreMayJumpToParentOnPop &= (1 << window->DC.TreeDepth) - 1; + window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. PopID(); } -void ImGui::TreeAdvanceToLabelPos() -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow->DC.CursorPos.x += GetTreeNodeToLabelSpacing(); -} - // Horizontal distance preceding label when using TreeNode() or Bullet() float ImGui::GetTreeNodeToLabelSpacing() { @@ -5247,13 +5930,15 @@ float ImGui::GetTreeNodeToLabelSpacing() return g.FontSize + (g.Style.FramePadding.x * 2.0f); } -void ImGui::SetNextTreeNodeOpen(bool is_open, ImGuiCond cond) +// Set next TreeNode/CollapsingHeader open state. +void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond) { ImGuiContext& g = *GImGui; if (g.CurrentWindow->SkipItems) return; - g.NextTreeNodeOpenVal = is_open; - g.NextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen; + g.NextItemData.OpenVal = is_open; + g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always; } // CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). @@ -5267,26 +5952,37 @@ bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader, label); } -bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags) +// p_visible == NULL : regular collapsing header +// p_visible != NULL && *p_visible == true : show a small close button on the corner of the header, clicking the button will set *p_visible = false +// p_visible != NULL && *p_visible == false : do not show the header at all +// Do not mistake this with the Open state of the header itself, which you can adjust with SetNextItemOpen() or ImGuiTreeNodeFlags_DefaultOpen. +bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return false; - if (p_open && !*p_open) + if (p_visible && !*p_visible) return false; ImGuiID id = window->GetID(label); - bool is_open = TreeNodeBehavior(id, flags | ImGuiTreeNodeFlags_CollapsingHeader | (p_open ? ImGuiTreeNodeFlags_AllowItemOverlap : 0), label); - if (p_open) + flags |= ImGuiTreeNodeFlags_CollapsingHeader; + if (p_visible) + flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; + bool is_open = TreeNodeBehavior(id, flags, label); + if (p_visible != NULL) { - // Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. + // Create a small overlapping close button + // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. + // FIXME: CloseButton can overlap into text, need find a way to clip the text somehow. ImGuiContext& g = *GImGui; - ImGuiItemHoveredDataBackup last_item_backup; - float button_radius = g.FontSize * 0.5f; - ImVec2 button_center = ImVec2(ImMin(window->DC.LastItemRect.Max.x, window->ClipRect.Max.x) - g.Style.FramePadding.x - button_radius, window->DC.LastItemRect.GetCenter().y); - if (CloseButton(window->GetID((void*)((intptr_t)id+1)), button_center, button_radius)) - *p_open = false; + ImGuiLastItemDataBackup last_item_backup; + float button_size = g.FontSize; + float button_x = ImMax(window->DC.LastItemRect.Min.x, window->DC.LastItemRect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); + float button_y = window->DC.LastItemRect.Min.y; + ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); + if (CloseButton(close_button_id, ImVec2(button_x, button_y))) + *p_visible = false; last_item_backup.Restore(); } @@ -5299,8 +5995,10 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags // - Selectable() //------------------------------------------------------------------------- -// Tip: pass a non-visible label (e.g. "##dummy") then you can use the space to draw other text or image. +// Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. // But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. +// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. +// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) { ImGuiWindow* window = GetCurrentWindow(); @@ -5310,35 +6008,49 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns) // FIXME-OPT: Avoid if vertically clipped. - PopClipRect(); - + // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle. ImGuiID id = window->GetID(label); ImVec2 label_size = CalcTextSize(label, NULL, true); ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); ImVec2 pos = window->DC.CursorPos; - pos.y += window->DC.CurrentLineTextBaseOffset; - ImRect bb_inner(pos, pos + size); - ItemSize(size); + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(size, 0.0f); - // Fill horizontal space. - ImVec2 window_padding = window->WindowPadding; - float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? GetWindowContentRegionMax().x : GetContentRegionMax().x; - float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - pos.x); - ImVec2 size_draw((size_arg.x != 0 && !(flags & ImGuiSelectableFlags_DrawFillAvailWidth)) ? size_arg.x : w_draw, size_arg.y != 0.0f ? size_arg.y : size.y); - ImRect bb(pos, pos + size_draw); - if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth)) - bb.Max.x += window_padding.x; + // Fill horizontal space + // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets. + const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0; + const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x; + const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x; + if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) + size.x = ImMax(label_size.x, max_x - min_x); - // Selectables are tightly packed together so we extend the box to cover spacing between selectable. - const float spacing_x = style.ItemSpacing.x; - const float spacing_y = style.ItemSpacing.y; - const float spacing_L = (float)(int)(spacing_x * 0.50f); - const float spacing_U = (float)(int)(spacing_y * 0.50f); - bb.Min.x -= spacing_L; - bb.Min.y -= spacing_U; - bb.Max.x += (spacing_x - spacing_L); - bb.Max.y += (spacing_y - spacing_U); + // Text stays at the submission position, but bounding box may be extended on both sides + const ImVec2 text_min = pos; + const ImVec2 text_max(min_x + size.x, pos.y + size.y); + + // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. + ImRect bb(min_x, pos.y, text_max.x, text_max.y); + if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0) + { + const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; + const float spacing_y = style.ItemSpacing.y; + const float spacing_L = IM_FLOOR(spacing_x * 0.50f); + const float spacing_U = IM_FLOOR(spacing_y * 0.50f); + bb.Min.x -= spacing_L; + bb.Min.y -= spacing_U; + bb.Max.x += (spacing_x - spacing_L); + bb.Max.y += (spacing_y - spacing_U); + } + //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } + + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. + const float backup_clip_rect_min_x = window->ClipRect.Min.x; + const float backup_clip_rect_max_x = window->ClipRect.Max.x; + if (span_all_columns) + { + window->ClipRect.Min.x = window->ParentWorkRect.Min.x; + window->ClipRect.Max.x = window->ParentWorkRect.Max.x; + } bool item_add; if (flags & ImGuiSelectableFlags_Disabled) @@ -5352,21 +6064,31 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl { item_add = ItemAdd(bb, id); } - if (!item_add) + + if (span_all_columns) { - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns) - PushColumnClipRect(); - return false; + window->ClipRect.Min.x = backup_clip_rect_min_x; + window->ClipRect.Max.x = backup_clip_rect_max_x; } + if (!item_add) + return false; + + // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, + // which would be advantageous since most selectable are not selected. + if (span_all_columns && window->DC.CurrentColumns) + PushColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePushBackgroundChannel(); + // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries ImGuiButtonFlags button_flags = 0; - if (flags & ImGuiSelectableFlags_NoHoldingActiveID) button_flags |= ImGuiButtonFlags_NoHoldingActiveID; - if (flags & ImGuiSelectableFlags_PressedOnClick) button_flags |= ImGuiButtonFlags_PressedOnClick; - if (flags & ImGuiSelectableFlags_PressedOnRelease) button_flags |= ImGuiButtonFlags_PressedOnRelease; - if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled; - if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; - if (flags & ImGuiSelectableFlags_AllowItemOverlap) button_flags |= ImGuiButtonFlags_AllowItemOverlap; + if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; } + if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } + if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } + if (flags & ImGuiSelectableFlags_Disabled) { button_flags |= ImGuiButtonFlags_Disabled; } + if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } + if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } if (flags & ImGuiSelectableFlags_Disabled) selected = false; @@ -5374,13 +6096,16 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl const bool was_selected = selected; bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); - // Hovering selectable with mouse updates NavId accordingly so navigation can be resumed with gamepad/keyboard (this doesn't happen on most widgets) - if (pressed || hovered) + + // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard + if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover))) + { if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent) { + SetNavID(id, window->DC.NavLayerCurrent, window->DC.NavFocusScopeIdCurrent, ImRect(bb.Min - window->Pos, bb.Max - window->Pos)); g.NavDisableHighlight = true; - SetNavID(id, window->DC.NavLayerCurrent); } + } if (pressed) MarkItemEdited(id); @@ -5392,6 +6117,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection; // Render + if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld)) + hovered = true; if (hovered || selected) { const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); @@ -5399,14 +6126,13 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); } - if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns) - { - PushColumnClipRect(); - bb.Max.x -= (GetContentRegionMax().x - max_x); - } + if (span_all_columns && window->DC.CurrentColumns) + PopColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePopBackgroundChannel(); if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); - RenderTextClipped(bb_inner.Min, bb_inner.Max, label, NULL, &label_size, style.SelectableTextAlign, &bb); + RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor(); // Automatically close popups @@ -5430,33 +6156,31 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags //------------------------------------------------------------------------- // [SECTION] Widgets: ListBox //------------------------------------------------------------------------- +// - BeginListBox() +// - EndListBox() // - ListBox() -// - ListBoxHeader() -// - ListBoxFooter() -//------------------------------------------------------------------------- -// FIXME: This is an old API. We should redesign some of it, rename ListBoxHeader->BeginListBox, ListBoxFooter->EndListBox -// and promote using them over existing ListBox() functions, similarly to change with combo boxes. //------------------------------------------------------------------------- -// FIXME: In principle this function should be called BeginListBox(). We should rename it after re-evaluating if we want to keep the same signature. -// Helper to calculate the size of a listbox and display a label on the right. -// Tip: To have a list filling the entire window width, PushItemWidth(-1) and pass an non-visible label e.g. "##empty" -bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg) +// Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" +// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). +bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) { + ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return false; - const ImGuiStyle& style = GetStyle(); + const ImGuiStyle& style = g.Style; const ImGuiID id = GetID(label); const ImVec2 label_size = CalcTextSize(label, NULL, true); - // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - ImVec2 size = CalcItemSize(size_arg, GetNextItemWidth(), GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y); + // Size default to hold ~7.25 items. + // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. + ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - window->DC.LastItemRect = bb; // Forward storage for ListBoxFooter.. dodgy. + g.NextItemData.ClearFlags(); if (!IsRectVisible(bb.Min, bb.Max)) { @@ -5465,48 +6189,42 @@ bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg) return false; } + // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. BeginGroup(); - if (label_size.x > 0) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + if (label_size.x > 0.0f) + { + ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); + RenderText(label_pos, label); + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + } BeginChildFrame(id, frame_bb.GetSize()); return true; } -// FIXME: In principle this function should be called EndListBox(). We should rename it after re-evaluating if we want to keep the same signature. +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// OBSOLETED in 1.81 (from February 2021) bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items) { - // Size default to hold ~7.25 items. - // We add +25% worth of item height to allow the user to see at a glance if there are more items up/down, without looking at the scrollbar. - // We don't add this extra bit if items_count <= height_in_items. It is slightly dodgy, because it means a dynamic list of items will make the widget resize occasionally when it crosses that size. - // I am expecting that someone will come and complain about this behavior in a remote future, then we can advise on a better solution. - if (height_in_items < 0) - height_in_items = ImMin(items_count, 7); - const ImGuiStyle& style = GetStyle(); - float height_in_items_f = (height_in_items < items_count) ? (height_in_items + 0.25f) : (height_in_items + 0.00f); - - // We include ItemSpacing.y so that a list sized for the exact number of items doesn't make a scrollbar appears. We could also enforce that by passing a flag to BeginChild(). + // If height_in_items == -1, default height is maximum 7. + ImGuiContext& g = *GImGui; + float height_in_items_f = (height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f; ImVec2 size; size.x = 0.0f; - size.y = GetTextLineHeightWithSpacing() * height_in_items_f + style.FramePadding.y * 2.0f; - return ListBoxHeader(label, size); + size.y = GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f; + return BeginListBox(label, size); } +#endif -// FIXME: In principle this function should be called EndListBox(). We should rename it after re-evaluating if we want to keep the same signature. -void ImGui::ListBoxFooter() +void ImGui::EndListBox() { - ImGuiWindow* parent_window = GetCurrentWindow()->ParentWindow; - const ImRect bb = parent_window->DC.LastItemRect; - const ImGuiStyle& style = GetStyle(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); + IM_UNUSED(window); EndChildFrame(); - - // Redeclare item size so that it includes the label (we have stored the full size in LastItemRect) - // We call SameLine() to restore DC.CurrentLine* data - SameLine(); - parent_window->DC.CursorPos = bb.Min; - ItemSize(bb, style.FramePadding.y); - EndGroup(); + EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label } bool ImGui::ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_items) @@ -5515,24 +6233,35 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* const item return value_changed; } +// This is merely a helper around BeginListBox(), EndListBox(). +// Considering using those directly to submit custom data or store selection differently. bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) { - if (!ListBoxHeader(label, items_count, height_in_items)) + ImGuiContext& g = *GImGui; + + // Calculate size from "height_in_items" + if (height_in_items < 0) + height_in_items = ImMin(items_count, 7); + float height_in_items_f = height_in_items + 0.25f; + ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); + + if (!BeginListBox(label, size)) return false; - // Assume all items have even height (= 1 line of text). If you need items of different or variable sizes you can create a custom version of ListBox() in your code without using the clipper. - ImGuiContext& g = *GImGui; + // Assume all items have even height (= 1 line of text). If you need items of different height, + // you can create a custom version of ListBox() in your code without using the clipper. bool value_changed = false; - ImGuiListClipper clipper(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. + ImGuiListClipper clipper; + clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. while (clipper.Step()) for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - const bool item_selected = (i == *current_item); const char* item_text; if (!items_getter(data, i, &item_text)) item_text = "*Unknown item*"; PushID(i); + const bool item_selected = (i == *current_item); if (Selectable(item_text, item_selected)) { *current_item = i; @@ -5542,7 +6271,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v SetItemDefaultFocus(); PopID(); } - ListBoxFooter(); + EndListBox(); if (value_changed) MarkItemEdited(g.CurrentWindow->DC.LastItemId); @@ -5556,20 +6285,25 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v // - PlotLines() // - PlotHistogram() //------------------------------------------------------------------------- +// Plot/Graph widgets are not very good. +// Consider writing your own, or using a third-party one, see: +// - ImPlot https://github.com/epezent/implot +// - others https://github.com/ocornut/imgui/wiki/Useful-Widgets +//------------------------------------------------------------------------- -void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size) +int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size) { + ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) - return; + return -1; - ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); const ImVec2 label_size = CalcTextSize(label, NULL, true); if (frame_size.x == 0.0f) - frame_size.x = GetNextItemWidth(); + frame_size.x = CalcItemWidth(); if (frame_size.y == 0.0f) frame_size.y = label_size.y + (style.FramePadding.y * 2); @@ -5578,7 +6312,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, 0, &frame_bb)) - return; + return -1; const bool hovered = ItemHoverable(frame_bb, id); // Determine scale from values if not specified @@ -5603,13 +6337,13 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; + int idx_hovered = -1; if (values_count >= values_count_min) { int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); // Tooltip on hover - int v_hovered = -1; if (hovered && inner_bb.Contains(g.IO.MousePos)) { const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); @@ -5619,10 +6353,10 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge const float v0 = values_getter(data, (v_idx + values_offset) % values_count); const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count); if (plot_type == ImGuiPlotType_Lines) - SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx+1, v1); + SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx + 1, v1); else if (plot_type == ImGuiPlotType_Histogram) SetTooltip("%d: %8.4g", v_idx, v0); - v_hovered = v_idx; + idx_hovered = v_idx; } const float t_step = 1.0f / (float)res_w; @@ -5649,13 +6383,13 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); if (plot_type == ImGuiPlotType_Lines) { - window->DrawList->AddLine(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); + window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); } else if (plot_type == ImGuiPlotType_Histogram) { if (pos1.x >= pos0.x + 2.0f) pos1.x -= 1.0f; - window->DrawList->AddRectFilled(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); + window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); } t0 = t1; @@ -5665,10 +6399,14 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge // Text overlay if (overlay_text) - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f,0.0f)); + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f, 0.0f)); if (label_size.x > 0.0f) RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); + + // Return hovered index or -1 if none are hovered. + // This is currently not exposed in the public API because we need a larger redesign of the whole thing, but in the short-term we are making it available in PlotEx(). + return idx_hovered; } struct ImGuiPlotArrayGetterData @@ -5748,23 +6486,16 @@ void ImGui::Value(const char* prefix, float v, const char* float_format) // [SECTION] MenuItem, BeginMenu, EndMenu, etc. //------------------------------------------------------------------------- // - ImGuiMenuColumns [Internal] -// - BeginMainMenuBar() -// - EndMainMenuBar() // - BeginMenuBar() // - EndMenuBar() +// - BeginMainMenuBar() +// - EndMainMenuBar() // - BeginMenu() // - EndMenu() // - MenuItem() //------------------------------------------------------------------------- // Helpers for internal use -ImGuiMenuColumns::ImGuiMenuColumns() -{ - Spacing = Width = NextWidth = 0.0f; - memset(Pos, 0, sizeof(Pos)); - memset(NextWidths, 0, sizeof(NextWidths)); -} - void ImGuiMenuColumns::Update(int count, float spacing, bool clear) { IM_ASSERT(count == IM_ARRAYSIZE(Pos)); @@ -5777,7 +6508,7 @@ void ImGuiMenuColumns::Update(int count, float spacing, bool clear) { if (i > 0 && NextWidths[i] > 0.0f) Width += Spacing; - Pos[i] = (float)(int)Width; + Pos[i] = IM_FLOOR(Width); Width += NextWidths[i]; NextWidths[i] = 0.0f; } @@ -5794,45 +6525,15 @@ float ImGuiMenuColumns::DeclColumns(float w0, float w1, float w2) // not using v return ImMax(Width, NextWidth); } -float ImGuiMenuColumns::CalcExtraSpace(float avail_w) +float ImGuiMenuColumns::CalcExtraSpace(float avail_w) const { return ImMax(0.0f, avail_w - Width); } -// For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. -bool ImGui::BeginMainMenuBar() -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); - SetNextWindowPos(ImVec2(0.0f, 0.0f)); - SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.NextWindowData.MenuBarOffsetMinVal.y + g.FontBaseSize + g.Style.FramePadding.y)); - PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0,0)); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; - bool is_open = Begin("##MainMenuBar", NULL, window_flags) && BeginMenuBar(); - PopStyleVar(2); - g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); - if (!is_open) - { - End(); - return false; - } - return true; //-V1020 -} - -void ImGui::EndMainMenuBar() -{ - EndMenuBar(); - - // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window - // FIXME: With this strategy we won't be able to restore a NULL focus. - ImGuiContext& g = *GImGui; - if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0) - FocusTopMostWindowUnderOne(g.NavWindow, NULL); - - End(); -} - +// FIXME: Provided a rectangle perhaps e.g. a BeginMenuBarEx() could be used anywhere.. +// Currently the main responsibility of this function being to setup clip-rect + horizontal layout + menu navigation layer. +// Ideally we also want this to be responsible for claiming space out of the main window scrolling rectangle, in which case ImGuiWindowFlags_MenuBar will become unnecessary. +// Then later the same system could be used for multiple menu-bars, scrollbars, side-bars. bool ImGui::BeginMenuBar() { ImGuiWindow* window = GetCurrentWindow(); @@ -5842,20 +6543,20 @@ bool ImGui::BeginMenuBar() return false; IM_ASSERT(!window->DC.MenuBarAppending); - BeginGroup(); // Backup position on layer 0 + BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore PushID("##menubar"); // We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect. // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. ImRect bar_rect = window->MenuBarRect(); - ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f)); + ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y)); clip_rect.ClipWith(window->OuterRectClipped); PushClipRect(clip_rect.Min, clip_rect.Max, false); - window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); + // We overwrite CursorMaxPos because BeginGroup sets it to CursorPos (essentially the .EmitItem hack in EndMenuBar() would need something analogous here, maybe a BeginGroupEx() with flags). + window->DC.CursorPos = window->DC.CursorMaxPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); window->DC.LayoutType = ImGuiLayoutType_Horizontal; window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu); window->DC.MenuBarAppending = true; AlignTextToFramePadding(); return true; @@ -5881,9 +6582,9 @@ void ImGui::EndMenuBar() const ImGuiNavLayer layer = ImGuiNavLayer_Menu; IM_ASSERT(window->DC.NavLayerActiveMaskNext & (1 << layer)); // Sanity check FocusWindow(window); - SetNavIDWithRectRel(window->NavLastIds[layer], layer, window->NavRectRel[layer]); - g.NavLayer = layer; + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. + g.NavDisableMouseHover = g.NavMousePosDirty = true; g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued; NavMoveRequestCancel(); } @@ -5894,14 +6595,68 @@ void ImGui::EndMenuBar() PopClipRect(); PopID(); window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->MenuBarRect().Min.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. - window->DC.GroupStack.back().AdvanceCursor = false; + g.GroupStack.back().EmitItem = false; EndGroup(); // Restore position on layer 0 window->DC.LayoutType = ImGuiLayoutType_Vertical; window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main); window->DC.MenuBarAppending = false; } +bool ImGui::BeginMainMenuBar() +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + ImGuiWindow* menu_bar_window = FindWindowByName("##MainMenuBar"); + + // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); + + // Get our rectangle at the top of the work area + if (menu_bar_window == NULL || menu_bar_window->BeginCount == 0) + { + // Set window position + // We don't attempt to calculate our height ahead, as it depends on the per-viewport font size. + // However menu-bar will affect the minimum window size so we'll get the right height. + ImVec2 menu_bar_pos = viewport->Pos + viewport->CurrWorkOffsetMin; + ImVec2 menu_bar_size = ImVec2(viewport->Size.x - viewport->CurrWorkOffsetMin.x + viewport->CurrWorkOffsetMax.x, 1.0f); + SetNextWindowPos(menu_bar_pos); + SetNextWindowSize(menu_bar_size); + } + + // Create window + PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint, however the presence of a menu-bar will give us the minimum height we want. + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; + bool is_open = Begin("##MainMenuBar", NULL, window_flags) && BeginMenuBar(); + PopStyleVar(2); + + // Report our size into work area (for next frame) using actual window size + menu_bar_window = GetCurrentWindow(); + if (menu_bar_window->BeginCount == 1) + viewport->CurrWorkOffsetMin.y += menu_bar_window->Size.y; + + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); + if (!is_open) + { + End(); + return false; + } + return true; //-V1020 +} + +void ImGui::EndMainMenuBar() +{ + EndMenuBar(); + + // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window + // FIXME: With this strategy we won't be able to restore a NULL focus. + ImGuiContext& g = *GImGui; + if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest) + FocusTopMostWindowUnderOne(g.NavWindow, NULL); + + End(); +} + bool ImGui::BeginMenu(const char* label, bool enabled) { ImGuiWindow* window = GetCurrentWindow(); @@ -5911,18 +6666,37 @@ bool ImGui::BeginMenu(const char* label, bool enabled) ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); + bool menu_is_open = IsPopupOpen(id, ImGuiPopupFlags_None); + + // Sub-menus are ChildWindow so that mouse can be hovering across them (otherwise top-most popup menu would steal focus and not allow hovering on parent menu) + ImGuiWindowFlags flags = ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; + if (window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) + flags |= ImGuiWindowFlags_ChildWindow; + + // If a menu with same the ID was already submitted, we will append to it, matching the behavior of Begin(). + // We are relying on a O(N) search - so O(N log N) over the frame - which seems like the most efficient for the expected small amount of BeginMenu() calls per frame. + // If somehow this is ever becoming a problem we can switch to use e.g. ImGuiStorage mapping key to last frame used. + if (g.MenusIdSubmittedThisFrame.contains(id)) + { + if (menu_is_open) + menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + else + g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values + return menu_is_open; + } + + // Tag menu as used. Next time BeginMenu() with same ID is called it will append to existing menu + g.MenusIdSubmittedThisFrame.push_back(id); ImVec2 label_size = CalcTextSize(label, NULL, true); - bool pressed; - bool menu_is_open = IsPopupOpen(id); bool menuset_is_open = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].OpenParentId == window->IDStack.back()); ImGuiWindow* backed_nav_window = g.NavWindow; if (menuset_is_open) g.NavWindow = window; // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent) // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu, - // However the final position is going to be different! It is choosen by FindBestWindowPosForPopup(). + // However the final position is going to be different! It is chosen by FindBestWindowPosForPopup(). // e.g. Menus tend to overlap each other horizontally to amplify relative Z-ordering. ImVec2 popup_pos, pos = window->DC.CursorPos; if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) @@ -5930,24 +6704,25 @@ bool ImGui::BeginMenu(const char* label, bool enabled) // Menu inside an horizontal menu bar // Selectable extend their highlight by half ItemSpacing in each direction. // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() - popup_pos = ImVec2(pos.x - 1.0f - (float)(int)(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f); + popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); float w = label_size.x; - pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); + pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); PopStyleVar(); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { // Menu inside a menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); - float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame - float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w); - pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); - if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - RenderArrow(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right); - if (!enabled) PopStyleColor(); + float min_w = window->DC.MenuColumns.DeclColumns(label_size.x, 0.0f, IM_FLOOR(g.FontSize * 1.20f)); // Feedback to next frame + float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_SpanAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(min_w, 0.0f)); + ImU32 text_col = GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled); + RenderArrow(window->DrawList, pos + ImVec2(window->DC.MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), text_col, ImGuiDir_Right); } const bool hovered = enabled && ItemHoverable(window->DC.LastItemRect, id); @@ -6017,7 +6792,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled) if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }' want_close = true; - if (want_close && IsPopupOpen(id)) + if (want_close && IsPopupOpen(id, ImGuiPopupFlags_None)) ClosePopupToLevel(g.BeginPopupStack.Size, true); IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Openable | (menu_is_open ? ImGuiItemStatusFlags_Opened : 0)); @@ -6035,13 +6810,13 @@ bool ImGui::BeginMenu(const char* label, bool enabled) if (menu_is_open) { - // Sub-menus are ChildWindow so that mouse can be hovering across them (otherwise top-most popup menu would steal focus and not allow hovering on parent menu) - SetNextWindowPos(popup_pos, ImGuiCond_Always); - ImGuiWindowFlags flags = ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; - if (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) - flags |= ImGuiWindowFlags_ChildWindow; + SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: this is super misleading! The value will serve as reference for FindBestWindowPosForPopup(), not actual pos. menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) } + else + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + } return menu_is_open; } @@ -6073,33 +6848,38 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, boo ImVec2 pos = window->DC.CursorPos; ImVec2 label_size = CalcTextSize(label, NULL, true); - ImGuiSelectableFlags flags = ImGuiSelectableFlags_PressedOnRelease | (enabled ? 0 : ImGuiSelectableFlags_Disabled); + // We've been using the equivalent of ImGuiSelectableFlags_SetNavIdOnHover on all Selectable() since early Nav system days (commit 43ee5d73), + // but I am unsure whether this should be kept at all. For now moved it to be an opt-in feature used by menus only. + ImGuiSelectableFlags flags = ImGuiSelectableFlags_SelectOnRelease | ImGuiSelectableFlags_SetNavIdOnHover | (enabled ? 0 : ImGuiSelectableFlags_Disabled); bool pressed; if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) { // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful // Note that in this situation we render neither the shortcut neither the selected tick mark float w = label_size.x; - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); pressed = Selectable(label, false, flags, ImVec2(w, 0.0f)); PopStyleVar(); - window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { - ImVec2 shortcut_size = shortcut ? CalcTextSize(shortcut, NULL) : ImVec2(0.0f, 0.0f); - float w = window->MenuColumns.DeclColumns(label_size.x, shortcut_size.x, (float)(int)(g.FontSize * 1.20f)); // Feedback for next frame - float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w); - pressed = Selectable(label, false, flags | ImGuiSelectableFlags_DrawFillAvailWidth, ImVec2(w, 0.0f)); - if (shortcut_size.x > 0.0f) + // Menu item inside a vertical menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. + float shortcut_w = shortcut ? CalcTextSize(shortcut, NULL).x : 0.0f; + float min_w = window->DC.MenuColumns.DeclColumns(label_size.x, shortcut_w, IM_FLOOR(g.FontSize * 1.20f)); // Feedback for next frame + float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + pressed = Selectable(label, false, flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); + if (shortcut_w > 0.0f) { PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - RenderText(pos + ImVec2(window->MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false); + RenderText(pos + ImVec2(window->DC.MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false); PopStyleColor(); } if (selected) - RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize * 0.866f); + RenderCheckMark(window->DrawList, pos + ImVec2(window->DC.MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize * 0.866f); } IMGUI_TEST_ENGINE_ITEM_INFO(window->DC.LastItemId, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (selected ? ImGuiItemStatusFlags_Checked : 0)); @@ -6120,9 +6900,6 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, //------------------------------------------------------------------------- // [SECTION] Widgets: BeginTabBar, EndTabBar, etc. //------------------------------------------------------------------------- -// [BETA API] API may evolve! This code has been extracted out of the Docking branch, -// and some of the construct which are not used in Master may be left here to facilitate merging. -//------------------------------------------------------------------------- // - BeginTabBar() // - BeginTabBarEx() [Internal] // - EndTabBar() @@ -6132,67 +6909,70 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, // - TabBarFindTabById() [Internal] // - TabBarRemoveTab() [Internal] // - TabBarCloseTab() [Internal] -// - TabBarScrollClamp()v +// - TabBarScrollClamp() [Internal] // - TabBarScrollToTab() [Internal] // - TabBarQueueChangeTabOrder() [Internal] // - TabBarScrollingButtons() [Internal] // - TabBarTabListPopupButton() [Internal] //------------------------------------------------------------------------- +struct ImGuiTabBarSection +{ + int TabCount; // Number of tabs in this section. + float Width; // Sum of width of tabs in this section (after shrinking down) + float Spacing; // Horizontal spacing at the end of the section. + + ImGuiTabBarSection() { memset(this, 0, sizeof(*this)); } +}; + namespace ImGui { static void TabBarLayout(ImGuiTabBar* tab_bar); static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label); static float TabBarCalcMaxTabWidth(); static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling); - static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections); static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar); static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar); } ImGuiTabBar::ImGuiTabBar() { - ID = 0; - SelectedTabId = NextSelectedTabId = VisibleTabId = 0; + memset(this, 0, sizeof(*this)); CurrFrameVisible = PrevFrameVisible = -1; - ContentsHeight = 0.0f; - OffsetMax = OffsetNextTab = 0.0f; - ScrollingAnim = ScrollingTarget = ScrollingTargetDistToVisibility = ScrollingSpeed = 0.0f; - Flags = ImGuiTabBarFlags_None; - ReorderRequestTabId = 0; - ReorderRequestDir = 0; - WantLayout = VisibleTabWasSubmitted = false; LastTabItemIdx = -1; } -static int IMGUI_CDECL TabItemComparerByVisibleOffset(const void* lhs, const void* rhs) +static int IMGUI_CDECL TabItemComparerBySection(const void* lhs, const void* rhs) { const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; - return (int)(a->Offset - b->Offset); + const int a_section = (a->Flags & ImGuiTabItemFlags_Leading) ? 0 : (a->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + const int b_section = (b->Flags & ImGuiTabItemFlags_Leading) ? 0 : (b->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + if (a_section != b_section) + return a_section - b_section; + return (int)(a->IndexDuringLayout - b->IndexDuringLayout); } -static int IMGUI_CDECL TabBarSortItemComparer(const void* lhs, const void* rhs) +static int IMGUI_CDECL TabItemComparerByBeginOrder(const void* lhs, const void* rhs) { - const ImGuiTabBarSortItem* a = (const ImGuiTabBarSortItem*)lhs; - const ImGuiTabBarSortItem* b = (const ImGuiTabBarSortItem*)rhs; - if (int d = (int)(b->Width - a->Width)) - return d; - return (b->Index - a->Index); + const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; + const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; + return (int)(a->BeginOrder - b->BeginOrder); } -static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiTabBarRef& ref) +static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiPtrOrIndex& ref) { ImGuiContext& g = *GImGui; - return ref.Ptr ? ref.Ptr : g.TabBars.GetByIndex(ref.IndexInMainPool); + return ref.Ptr ? (ImGuiTabBar*)ref.Ptr : g.TabBars.GetByIndex(ref.Index); } -static ImGuiTabBarRef GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar) +static ImGuiPtrOrIndex GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar) { ImGuiContext& g = *GImGui; if (g.TabBars.Contains(tab_bar)) - return ImGuiTabBarRef(g.TabBars.GetIndex(tab_bar)); - return ImGuiTabBarRef(tab_bar); + return ImGuiPtrOrIndex(g.TabBars.GetIndex(tab_bar)); + return ImGuiPtrOrIndex(tab_bar); } bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) @@ -6204,7 +6984,7 @@ bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) ImGuiID id = window->GetID(str_id); ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); - ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->InnerClipRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); + ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); tab_bar->ID = id; return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); } @@ -6223,17 +7003,20 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar)); g.CurrentTabBar = tab_bar; + // Append with multiple BeginTabBar()/EndTabBar() pairs. + tab_bar->BackupCursorPos = window->DC.CursorPos; if (tab_bar->CurrFrameVisible == g.FrameCount) { - //IMGUI_DEBUG_LOG("BeginTabBarEx already called this frame\n", g.FrameCount); - IM_ASSERT(0); + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); + tab_bar->BeginCount++; return true; } - // When toggling back from ordered to manually-reorderable, shuffle tabs to enforce the last visible order. - // Otherwise, the most recently inserted tabs would move at the end of visible list which can be a little too confusing or magic for the user. - if ((flags & ImGuiTabBarFlags_Reorderable) && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable) && tab_bar->Tabs.Size > 1 && tab_bar->PrevFrameVisible != -1) - ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByVisibleOffset); + // Ensure correct ordering when toggling ImGuiTabBarFlags_Reorderable flag, or when a new tab was added while being not reorderable + if ((flags & ImGuiTabBarFlags_Reorderable) != (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (tab_bar->TabsAddedNew && !(flags & ImGuiTabBarFlags_Reorderable))) + if (tab_bar->Tabs.Size > 1) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByBeginOrder); + tab_bar->TabsAddedNew = false; // Flags if ((flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) @@ -6244,18 +7027,22 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab() tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible; tab_bar->CurrFrameVisible = g.FrameCount; + tab_bar->PrevTabsContentsHeight = tab_bar->CurrTabsContentsHeight; + tab_bar->CurrTabsContentsHeight = 0.0f; + tab_bar->ItemSpacingY = g.Style.ItemSpacing.y; tab_bar->FramePadding = g.Style.FramePadding; + tab_bar->TabsActiveCount = 0; + tab_bar->BeginCount = 1; - // Layout - ItemSize(ImVec2(tab_bar->OffsetMax, tab_bar->BarRect.GetHeight())); - window->DC.CursorPos.x = tab_bar->BarRect.Min.x; + // Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); // Draw separator - const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_Tab); + const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); const float y = tab_bar->BarRect.Max.y - 1.0f; { - const float separator_min_x = tab_bar->BarRect.Min.x - window->WindowPadding.x; - const float separator_max_x = tab_bar->BarRect.Max.x + window->WindowPadding.x; + const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); + const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); } return true; @@ -6271,18 +7058,27 @@ void ImGui::EndTabBar() ImGuiTabBar* tab_bar = g.CurrentTabBar; if (tab_bar == NULL) { - IM_ASSERT(tab_bar != NULL && "Mismatched BeginTabBar()/EndTabBar()!"); - return; // FIXME-ERRORHANDLING + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!"); + return; } + + // Fallback in case no TabItem have been submitted if (tab_bar->WantLayout) TabBarLayout(tab_bar); // Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed(). const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing) - tab_bar->ContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, 0.0f); + { + tab_bar->CurrTabsContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, tab_bar->CurrTabsContentsHeight); + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->CurrTabsContentsHeight; + } else - window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->ContentsHeight; + { + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->PrevTabsContentsHeight; + } + if (tab_bar->BeginCount > 1) + window->DC.CursorPos = tab_bar->BackupCursorPos; if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) PopID(); @@ -6298,157 +7094,200 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) ImGuiContext& g = *GImGui; tab_bar->WantLayout = false; - // Garbage collect + // Garbage collect by compacting list + // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section) int tab_dst_n = 0; + bool need_sort_by_section = false; + ImGuiTabBarSection sections[3]; // Layout sections: Leading, Central, Trailing for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++) { ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n]; - if (tab->LastFrameVisible < tab_bar->PrevFrameVisible) + if (tab->LastFrameVisible < tab_bar->PrevFrameVisible || tab->WantClose) { - if (tab->ID == tab_bar->SelectedTabId) - tab_bar->SelectedTabId = 0; + // Remove tab + if (tab_bar->VisibleTabId == tab->ID) { tab_bar->VisibleTabId = 0; } + if (tab_bar->SelectedTabId == tab->ID) { tab_bar->SelectedTabId = 0; } + if (tab_bar->NextSelectedTabId == tab->ID) { tab_bar->NextSelectedTabId = 0; } continue; } if (tab_dst_n != tab_src_n) tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n]; + + tab = &tab_bar->Tabs[tab_dst_n]; + tab->IndexDuringLayout = (ImS16)tab_dst_n; + + // We will need sorting if tabs have changed section (e.g. moved from one of Leading/Central/Trailing to another) + int curr_tab_section_n = (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + if (tab_dst_n > 0) + { + ImGuiTabItem* prev_tab = &tab_bar->Tabs[tab_dst_n - 1]; + int prev_tab_section_n = (prev_tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (prev_tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + if (curr_tab_section_n == 0 && prev_tab_section_n != 0) + need_sort_by_section = true; + if (prev_tab_section_n == 2 && curr_tab_section_n != 2) + need_sort_by_section = true; + } + + sections[curr_tab_section_n].TabCount++; tab_dst_n++; } if (tab_bar->Tabs.Size != tab_dst_n) tab_bar->Tabs.resize(tab_dst_n); + if (need_sort_by_section) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerBySection); + + // Calculate spacing between sections + sections[0].Spacing = sections[0].TabCount > 0 && (sections[1].TabCount + sections[2].TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + // Setup next selected tab - ImGuiID scroll_track_selected_tab_id = 0; + ImGuiID scroll_to_tab_id = 0; if (tab_bar->NextSelectedTabId) { tab_bar->SelectedTabId = tab_bar->NextSelectedTabId; tab_bar->NextSelectedTabId = 0; - scroll_track_selected_tab_id = tab_bar->SelectedTabId; + scroll_to_tab_id = tab_bar->SelectedTabId; } // Process order change request (we could probably process it when requested but it's just saner to do it in a single spot). if (tab_bar->ReorderRequestTabId != 0) { - if (ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId)) - { - //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools - int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestDir; - if (tab2_order >= 0 && tab2_order < tab_bar->Tabs.Size) - { - ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order]; - ImGuiTabItem item_tmp = *tab1; - *tab1 = *tab2; - *tab2 = item_tmp; - if (tab2->ID == tab_bar->SelectedTabId) - scroll_track_selected_tab_id = tab2->ID; - tab1 = tab2 = NULL; - } - if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings) - MarkIniSettingsDirty(); - } + if (TabBarProcessReorder(tab_bar)) + if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId) + scroll_to_tab_id = tab_bar->ReorderRequestTabId; tab_bar->ReorderRequestTabId = 0; } // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!) const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0; if (tab_list_popup_button) - if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Max.x! - scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; + if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x! + scroll_to_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; - ImVector<ImGuiTabBarSortItem>& width_sort_buffer = g.TabSortByWidthBuffer; - width_sort_buffer.resize(tab_bar->Tabs.Size); + // Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central + // (whereas our tabs are stored as: leading, central, trailing) + int shrink_buffer_indexes[3] = { 0, sections[0].TabCount + sections[2].TabCount, sections[0].TabCount }; + g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size); - // Compute ideal widths - float width_total_contents = 0.0f; + // Compute ideal tabs widths + store them into shrink buffer ImGuiTabItem* most_recently_selected_tab = NULL; + int curr_section_n = -1; bool found_selected_tab_id = false; for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) { ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible); - if (most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected) + if ((most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected) && !(tab->Flags & ImGuiTabItemFlags_Button)) most_recently_selected_tab = tab; if (tab->ID == tab_bar->SelectedTabId) found_selected_tab_id = true; + if (scroll_to_tab_id == 0 && g.NavJustMovedToId == tab->ID) + scroll_to_tab_id = tab->ID; // Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar. // Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet, // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window. const char* tab_name = tab_bar->GetTabName(tab); - tab->WidthContents = TabItemCalcSize(tab_name, (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true).x; + const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true; + tab->ContentWidth = TabItemCalcSize(tab_name, has_close_button).x; - width_total_contents += (tab_n > 0 ? g.Style.ItemInnerSpacing.x : 0.0f) + tab->WidthContents; + int section_n = (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + ImGuiTabBarSection* section = §ions[section_n]; + section->Width += tab->ContentWidth + (section_n == curr_section_n ? g.Style.ItemInnerSpacing.x : 0.0f); + curr_section_n = section_n; // Store data so we can build an array sorted by width if we need to shrink tabs down - width_sort_buffer[tab_n].Index = tab_n; - width_sort_buffer[tab_n].Width = tab->WidthContents; + int shrink_buffer_index = shrink_buffer_indexes[section_n]++; + g.ShrinkWidthBuffer[shrink_buffer_index].Index = tab_n; + g.ShrinkWidthBuffer[shrink_buffer_index].Width = tab->ContentWidth; + + IM_ASSERT(tab->ContentWidth > 0.0f); + tab->Width = tab->ContentWidth; } - // Compute width - const float width_avail = tab_bar->BarRect.GetWidth(); - float width_excess = (width_avail < width_total_contents) ? (width_total_contents - width_avail) : 0.0f; - if (width_excess > 0.0f && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown)) - { - // If we don't have enough room, resize down the largest tabs first - if (tab_bar->Tabs.Size > 1) - ImQsort(width_sort_buffer.Data, (size_t)width_sort_buffer.Size, sizeof(ImGuiTabBarSortItem), TabBarSortItemComparer); - int tab_count_same_width = 1; - while (width_excess > 0.0f && tab_count_same_width < tab_bar->Tabs.Size) + // Compute total ideal width (used for e.g. auto-resizing a window) + tab_bar->WidthAllTabsIdeal = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) + tab_bar->WidthAllTabsIdeal += sections[section_n].Width + sections[section_n].Spacing; + + // Horizontal scrolling buttons + // (note that TabBarScrollButtons() will alter BarRect.Max.x) + if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll)) + if (ImGuiTabItem* scroll_and_select_tab = TabBarScrollingButtons(tab_bar)) { - while (tab_count_same_width < tab_bar->Tabs.Size && width_sort_buffer[0].Width == width_sort_buffer[tab_count_same_width].Width) - tab_count_same_width++; - float width_to_remove_per_tab_max = (tab_count_same_width < tab_bar->Tabs.Size) ? (width_sort_buffer[0].Width - width_sort_buffer[tab_count_same_width].Width) : (width_sort_buffer[0].Width - 1.0f); - float width_to_remove_per_tab = ImMin(width_excess / tab_count_same_width, width_to_remove_per_tab_max); - for (int tab_n = 0; tab_n < tab_count_same_width; tab_n++) - width_sort_buffer[tab_n].Width -= width_to_remove_per_tab; - width_excess -= width_to_remove_per_tab * tab_count_same_width; + scroll_to_tab_id = scroll_and_select_tab->ID; + if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0) + tab_bar->SelectedTabId = scroll_to_tab_id; } - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) - tab_bar->Tabs[width_sort_buffer[tab_n].Index].Width = (float)(int)width_sort_buffer[tab_n].Width; - } + + // Shrink widths if full tabs don't fit in their allocated space + float section_0_w = sections[0].Width + sections[0].Spacing; + float section_1_w = sections[1].Width + sections[1].Spacing; + float section_2_w = sections[2].Width + sections[2].Spacing; + bool central_section_is_visible = (section_0_w + section_2_w) < tab_bar->BarRect.GetWidth(); + float width_excess; + if (central_section_is_visible) + width_excess = ImMax(section_1_w - (tab_bar->BarRect.GetWidth() - section_0_w - section_2_w), 0.0f); // Excess used to shrink central section else + width_excess = (section_0_w + section_2_w) - tab_bar->BarRect.GetWidth(); // Excess used to shrink leading/trailing section + + // With ImGuiTabBarFlags_FittingPolicyScroll policy, we will only shrink leading/trailing if the central section is not visible anymore + if (width_excess > 0.0f && ((tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || !central_section_is_visible)) { - const float tab_max_width = TabBarCalcMaxTabWidth(); - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + int shrink_data_count = (central_section_is_visible ? sections[1].TabCount : sections[0].TabCount + sections[2].TabCount); + int shrink_data_offset = (central_section_is_visible ? sections[0].TabCount + sections[2].TabCount : 0); + ShrinkWidths(g.ShrinkWidthBuffer.Data + shrink_data_offset, shrink_data_count, width_excess); + + // Apply shrunk values into tabs and sections + for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - tab->Width = ImMin(tab->WidthContents, tab_max_width); + ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; + float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); + if (shrinked_width < 0.0f) + continue; + + int section_n = (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; + sections[section_n].Width -= (tab->Width - shrinked_width); + tab->Width = shrinked_width; } } // Layout all active tabs - float offset_x = 0.0f; - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + int section_tab_index = 0; + float tab_offset = 0.0f; + tab_bar->WidthAllTabs = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - tab->Offset = offset_x; - if (scroll_track_selected_tab_id == 0 && g.NavJustMovedToId == tab->ID) - scroll_track_selected_tab_id = tab->ID; - offset_x += tab->Width + g.Style.ItemInnerSpacing.x; - } - tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f); - tab_bar->OffsetNextTab = 0.0f; + ImGuiTabBarSection* section = §ions[section_n]; + if (section_n == 2) + tab_offset = ImMin(ImMax(0.0f, tab_bar->BarRect.GetWidth() - section->Width), tab_offset); - // Horizontal scrolling buttons - const bool scrolling_buttons = (tab_bar->OffsetMax > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll); - if (scrolling_buttons) - if (ImGuiTabItem* tab_to_select = TabBarScrollingButtons(tab_bar)) // NB: Will alter BarRect.Max.x! - scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; + for (int tab_n = 0; tab_n < section->TabCount; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[section_tab_index + tab_n]; + tab->Offset = tab_offset; + tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f); + } + tab_bar->WidthAllTabs += ImMax(section->Width + section->Spacing, 0.0f); + tab_offset += section->Spacing; + section_tab_index += section->TabCount; + } // If we have lost the selected tab, select the next most recently active one if (found_selected_tab_id == false) tab_bar->SelectedTabId = 0; if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL) - scroll_track_selected_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID; + scroll_to_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID; // Lock in visible tab tab_bar->VisibleTabId = tab_bar->SelectedTabId; tab_bar->VisibleTabWasSubmitted = false; // Update scrolling - if (scroll_track_selected_tab_id) - if (ImGuiTabItem* scroll_track_selected_tab = TabBarFindTabByID(tab_bar, scroll_track_selected_tab_id)) - TabBarScrollToTab(tab_bar, scroll_track_selected_tab); + if (scroll_to_tab_id != 0) + TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections); tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim); tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget); if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget) @@ -6464,10 +7303,18 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) { tab_bar->ScrollingSpeed = 0.0f; } + tab_bar->ScrollingRectMinX = tab_bar->BarRect.Min.x + sections[0].Width + sections[0].Spacing; + tab_bar->ScrollingRectMaxX = tab_bar->BarRect.Max.x - sections[2].Width - sections[1].Spacing; // Clear name buffers if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) tab_bar->TabsNames.Buf.resize(0); + + // Actual layout in host window (we don't do it in BeginTabBar() so as not to waste an extra frame) + ImGuiWindow* window = g.CurrentWindow; + window->DC.CursorPos = tab_bar->BarRect.Min; + ItemSize(ImVec2(tab_bar->WidthAllTabs, tab_bar->BarRect.GetHeight()), tab_bar->FramePadding.y); + window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, tab_bar->BarRect.Min.x + tab_bar->WidthAllTabsIdeal); } // Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack. @@ -6514,52 +7361,100 @@ void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id) // Called on manual closure attempt void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { - if ((tab_bar->VisibleTabId == tab->ID) && !(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + IM_ASSERT(!(tab->Flags & ImGuiTabItemFlags_Button)); + if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) { // This will remove a frame of lag for selecting another tab on closure. // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure - tab->LastFrameVisible = -1; - tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0; + tab->WantClose = true; + if (tab_bar->VisibleTabId == tab->ID) + { + tab->LastFrameVisible = -1; + tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0; + } } - else if ((tab_bar->VisibleTabId != tab->ID) && (tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + else { - // Actually select before expecting closure - tab_bar->NextSelectedTabId = tab->ID; + // Actually select before expecting closure attempt (on an UnsavedDocument tab user is expect to e.g. show a popup) + if (tab_bar->VisibleTabId != tab->ID) + tab_bar->NextSelectedTabId = tab->ID; } } static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling) { - scrolling = ImMin(scrolling, tab_bar->OffsetMax - tab_bar->BarRect.GetWidth()); + scrolling = ImMin(scrolling, tab_bar->WidthAllTabs - tab_bar->BarRect.GetWidth()); return ImMax(scrolling, 0.0f); } -static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) +// Note: we may scroll to tab that are not selected! e.g. using keyboard arrow keys +static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections) { + ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id); + if (tab == NULL) + return; + if (tab->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) + return; + ImGuiContext& g = *GImGui; float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar) int order = tab_bar->GetTabOrder(tab); - float tab_x1 = tab->Offset + (order > 0 ? -margin : 0.0f); - float tab_x2 = tab->Offset + tab->Width + (order + 1 < tab_bar->Tabs.Size ? margin : 1.0f); + + // Scrolling happens only in the central section (leading/trailing sections are not scrolling) + // FIXME: This is all confusing. + float scrollable_width = tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing; + + // We make all tabs positions all relative Sections[0].Width to make code simpler + float tab_x1 = tab->Offset - sections[0].Width + (order > sections[0].TabCount - 1 ? -margin : 0.0f); + float tab_x2 = tab->Offset - sections[0].Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - sections[2].TabCount ? margin : 1.0f); tab_bar->ScrollingTargetDistToVisibility = 0.0f; - if (tab_bar->ScrollingTarget > tab_x1) + if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width)) { + // Scroll to the left tab_bar->ScrollingTargetDistToVisibility = ImMax(tab_bar->ScrollingAnim - tab_x2, 0.0f); tab_bar->ScrollingTarget = tab_x1; } - else if (tab_bar->ScrollingTarget < tab_x2 - tab_bar->BarRect.GetWidth()) + else if (tab_bar->ScrollingTarget < tab_x2 - scrollable_width) { - tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - tab_bar->BarRect.GetWidth()) - tab_bar->ScrollingAnim, 0.0f); - tab_bar->ScrollingTarget = tab_x2 - tab_bar->BarRect.GetWidth(); + // Scroll to the right + tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - scrollable_width) - tab_bar->ScrollingAnim, 0.0f); + tab_bar->ScrollingTarget = tab_x2 - scrollable_width; } } -void ImGui::TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir) +void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir) { IM_ASSERT(dir == -1 || dir == +1); IM_ASSERT(tab_bar->ReorderRequestTabId == 0); tab_bar->ReorderRequestTabId = tab->ID; - tab_bar->ReorderRequestDir = dir; + tab_bar->ReorderRequestDir = (ImS8)dir; +} + +bool ImGui::TabBarProcessReorder(ImGuiTabBar* tab_bar) +{ + ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId); + if (tab1 == NULL || (tab1->Flags & ImGuiTabItemFlags_NoReorder)) + return false; + + //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools + int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestDir; + if (tab2_order < 0 || tab2_order >= tab_bar->Tabs.Size) + return false; + + // Reordered TabItem must share the same position flags than target + ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order]; + if (tab2->Flags & ImGuiTabItemFlags_NoReorder) + return false; + if ((tab1->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) != (tab2->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing))) + return false; + + ImGuiTabItem item_tmp = *tab1; + *tab1 = *tab2; + *tab2 = item_tmp; + + if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings) + MarkIniSettingsDirty(); + return true; } static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) @@ -6573,13 +7468,6 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) const ImVec2 backup_cursor_pos = window->DC.CursorPos; //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255)); - const ImRect avail_bar_rect = tab_bar->BarRect; - bool want_clip_rect = !avail_bar_rect.Contains(ImRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(scrolling_buttons_width, 0.0f))); - if (want_clip_rect) - PushClipRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max + ImVec2(g.Style.ItemInnerSpacing.x, 0.0f), true); - - ImGuiTabItem* tab_to_select = NULL; - int select_dir = 0; ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; arrow_col.w *= 0.5f; @@ -6590,30 +7478,44 @@ static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) const float backup_repeat_rate = g.IO.KeyRepeatRate; g.IO.KeyRepeatDelay = 0.250f; g.IO.KeyRepeatRate = 0.200f; - window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y); + float x = ImMax(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.x - scrolling_buttons_width); + window->DC.CursorPos = ImVec2(x, tab_bar->BarRect.Min.y); if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) select_dir = -1; - window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width + arrow_button_size.x, tab_bar->BarRect.Min.y); + window->DC.CursorPos = ImVec2(x + arrow_button_size.x, tab_bar->BarRect.Min.y); if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) select_dir = +1; PopStyleColor(2); g.IO.KeyRepeatRate = backup_repeat_rate; g.IO.KeyRepeatDelay = backup_repeat_delay; - if (want_clip_rect) - PopClipRect(); - + ImGuiTabItem* tab_to_scroll_to = NULL; if (select_dir != 0) if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId)) { int selected_order = tab_bar->GetTabOrder(tab_item); int target_order = selected_order + select_dir; - tab_to_select = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; // If we are at the end of the list, still scroll to make our tab visible + + // Skip tab item buttons until another tab item is found or end is reached + while (tab_to_scroll_to == NULL) + { + // If we are at the end of the list, still scroll to make our tab visible + tab_to_scroll_to = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; + + // Cross through buttons + // (even if first/last item is a button, return it so we can update the scroll) + if (tab_to_scroll_to->Flags & ImGuiTabItemFlags_Button) + { + target_order += select_dir; + selected_order += select_dir; + tab_to_scroll_to = (target_order < 0 || target_order >= tab_bar->Tabs.Size) ? tab_to_scroll_to : NULL; + } + } } window->DC.CursorPos = backup_cursor_pos; tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f; - return tab_to_select; + return tab_to_scroll_to; } static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) @@ -6631,7 +7533,7 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) arrow_col.w *= 0.5f; PushStyleColor(ImGuiCol_Text, arrow_col); PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview); + bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_HeightLargest); PopStyleColor(2); ImGuiTabItem* tab_to_select = NULL; @@ -6640,6 +7542,9 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) { ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + if (tab->Flags & ImGuiTabItemFlags_Button) + continue; + const char* tab_name = tab_bar->GetTabName(tab); if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID)) tab_to_select = tab; @@ -6654,11 +7559,9 @@ static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) //------------------------------------------------------------------------- // [SECTION] Widgets: BeginTabItem, EndTabItem, etc. //------------------------------------------------------------------------- -// [BETA API] API may evolve! This code has been extracted out of the Docking branch, -// and some of the construct which are not used in Master may be left here to facilitate merging. -//------------------------------------------------------------------------- // - BeginTabItem() // - EndTabItem() +// - TabItemButton() // - TabItemEx() [Internal] // - SetTabItemClosed() // - TabItemCalcSize() [Internal] @@ -6676,9 +7579,11 @@ bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags f ImGuiTabBar* tab_bar = g.CurrentTabBar; if (tab_bar == NULL) { - IM_ASSERT(tab_bar && "Needs to be called between BeginTabBar() and EndTabBar()!"); - return false; // FIXME-ERRORHANDLING + IM_ASSERT_USER_ERROR(tab_bar, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; } + IM_ASSERT(!(flags & ImGuiTabItemFlags_Button)); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead! + bool ret = TabItemEx(tab_bar, label, p_open, flags); if (ret && !(flags & ImGuiTabItemFlags_NoPushId)) { @@ -6698,13 +7603,29 @@ void ImGui::EndTabItem() ImGuiTabBar* tab_bar = g.CurrentTabBar; if (tab_bar == NULL) { - IM_ASSERT(tab_bar != NULL && "Needs to be called between BeginTabBar() and EndTabBar()!"); + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); return; } IM_ASSERT(tab_bar->LastTabItemIdx >= 0); ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; if (!(tab->Flags & ImGuiTabItemFlags_NoPushId)) - window->IDStack.pop_back(); + PopID(); +} + +bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; + } + return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder); } bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags) @@ -6721,7 +7642,9 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, const ImGuiStyle& style = g.Style; const ImGuiID id = TabBarCalcTabID(tab_bar, label); - // If the user called us with *p_open == false, we early out and don't render. We make a dummy call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID. + // If the user called us with *p_open == false, we early out and don't render. + // We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID. + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.LastItemStatusFlags); if (p_open && !*p_open) { PushItemFlag(ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus, true); @@ -6730,6 +7653,15 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, return false; } + IM_ASSERT(!p_open || !(flags & ImGuiTabItemFlags_Button)); + IM_ASSERT((flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) != (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)); // Can't use both Leading and Trailing + + // Store into ImGuiTabItemFlags_NoCloseButton, also honor ImGuiTabItemFlags_NoCloseButton passed by user (although not documented) + if (flags & ImGuiTabItemFlags_NoCloseButton) + p_open = NULL; + else if (p_open == NULL) + flags |= ImGuiTabItemFlags_NoCloseButton; + // Calculate tab contents size ImVec2 size = TabItemCalcSize(label, p_open != NULL); @@ -6742,40 +7674,35 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, tab = &tab_bar->Tabs.back(); tab->ID = id; tab->Width = size.x; + tab_bar->TabsAddedNew = true; tab_is_new = true; } - tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab); - tab->WidthContents = size.x; - - if (p_open == NULL) - flags |= ImGuiTabItemFlags_NoCloseButton; + tab_bar->LastTabItemIdx = (ImS16)tab_bar->Tabs.index_from_ptr(tab); + tab->ContentWidth = size.x; + tab->BeginOrder = tab_bar->TabsActiveCount++; const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0; const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount); + const bool is_tab_button = (flags & ImGuiTabItemFlags_Button) != 0; tab->LastFrameVisible = g.FrameCount; tab->Flags = flags; // Append name with zero-terminator - tab->NameOffset = tab_bar->TabsNames.size(); + tab->NameOffset = (ImS16)tab_bar->TabsNames.size(); tab_bar->TabsNames.append(label, label + strlen(label) + 1); - // If we are not reorderable, always reset offset based on submission order. - // (We already handled layout and sizing using the previous known order, but sizing is not affected by order!) - if (!tab_appearing && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable)) - { - tab->Offset = tab_bar->OffsetNextTab; - tab_bar->OffsetNextTab += tab->Width + g.Style.ItemInnerSpacing.x; - } - // Update selected tab if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0) if (!tab_bar_appearing || tab_bar->SelectedTabId == 0) - tab_bar->NextSelectedTabId = id; // New tabs gets activated + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; // New tabs gets activated if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // SetSelected can only be passed on explicit tab bar - tab_bar->NextSelectedTabId = id; + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; // Lock visibility + // (Note: tab_contents_visible != tab_selected... because CTRL+TAB operations may preview some tabs without selecting them!) bool tab_contents_visible = (tab_bar->VisibleTabId == id); if (tab_contents_visible) tab_bar->VisibleTabWasSubmitted = true; @@ -6785,11 +7712,15 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs)) tab_contents_visible = true; - if (tab_appearing && !(tab_bar_appearing && !tab_is_new)) + // Note that tab_is_new is not necessarily the same as tab_appearing! When a tab bar stops being submitted + // and then gets submitted again, the tabs will have 'tab_appearing=true' but 'tab_is_new=false'. + if (tab_appearing && (!tab_bar_appearing || tab_is_new)) { PushItemFlag(ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus, true); ItemAdd(ImRect(), id); PopItemFlag(); + if (is_tab_button) + return false; return tab_contents_visible; } @@ -6800,17 +7731,24 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, const ImVec2 backup_main_cursor_pos = window->DC.CursorPos; // Layout + const bool is_central_section = (tab->Flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) == 0; size.x = tab->Width; - window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2((float)(int)tab->Offset - tab_bar->ScrollingAnim, 0.0f); + if (is_central_section) + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); + else + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); ImVec2 pos = window->DC.CursorPos; ImRect bb(pos, pos + size); // We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation) - bool want_clip_rect = (bb.Min.x < tab_bar->BarRect.Min.x) || (bb.Max.x >= tab_bar->BarRect.Max.x); + const bool want_clip_rect = is_central_section && (bb.Min.x < tab_bar->ScrollingRectMinX || bb.Max.x > tab_bar->ScrollingRectMaxX); if (want_clip_rect) - PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->BarRect.Min.x), bb.Min.y - 1), ImVec2(tab_bar->BarRect.Max.x, bb.Max.y), true); + PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->ScrollingRectMinX), bb.Min.y - 1), ImVec2(tab_bar->ScrollingRectMaxX, bb.Max.y), true); + + ImVec2 backup_cursor_max_pos = window->DC.CursorMaxPos; + ItemSize(bb.GetSize(), style.FramePadding.y); + window->DC.CursorMaxPos = backup_cursor_max_pos; - ItemSize(bb, style.FramePadding.y); if (!ItemAdd(bb, id)) { if (want_clip_rect) @@ -6820,17 +7758,17 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, } // Click to Select a tab - ImGuiButtonFlags button_flags = (ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_AllowItemOverlap); + ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); if (g.DragDropActive) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); - if (pressed) + if (pressed && !is_tab_button) tab_bar->NextSelectedTabId = id; hovered |= (g.HoveredId == id); // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) - if (!held) + if (g.ActiveId != id) SetItemAllowOverlap(); // Drag and drop: re-order tabs @@ -6842,21 +7780,21 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) { if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) - TabBarQueueChangeTabOrder(tab_bar, tab, -1); + TabBarQueueReorder(tab_bar, tab, -1); } else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) { if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) - TabBarQueueChangeTabOrder(tab_bar, tab, +1); + TabBarQueueReorder(tab_bar, tab, +1); } } } #if 0 - if (hovered && g.HoveredIdNotActiveTimer > 0.50f && bb.GetWidth() < tab->WidthContents) + if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) { // Enlarge tab display when hovering - bb.Max.x = bb.Min.x + (float)(int)ImLerp(bb.GetWidth(), tab->WidthContents, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f)); + bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); display_draw_list = GetForegroundDrawList(window); TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); } @@ -6871,14 +7809,17 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget. const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup); if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1))) - tab_bar->NextSelectedTabId = id; + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton) flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton; // Render tab label, process close button - const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0; - bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id); + const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0; + bool just_closed; + bool text_clipped; + TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped); if (just_closed && p_open != NULL) { *p_open = false; @@ -6892,15 +7833,19 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, // Tooltip (FIXME: Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer) // We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar (which g.HoveredId ignores) - if (g.HoveredId == id && !held && g.HoveredIdNotActiveTimer > 0.50f && IsItemHovered()) - if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip)) + if (text_clipped && g.HoveredId == id && !held && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay && IsItemHovered()) + if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); + IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected + if (is_tab_button) + return pressed; return tab_contents_visible; } // [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. -// To use it to need to call the function SetTabItemClosed() after BeginTabBar() and before any call to BeginTabItem() +// To use it to need to call the function SetTabItemClosed() between BeginTabBar() and EndTabBar(). +// Tabs closed by the close button will automatically be flagged to avoid this issue. void ImGui::SetTabItemClosed(const char* label) { ImGuiContext& g = *GImGui; @@ -6908,9 +7853,9 @@ void ImGui::SetTabItemClosed(const char* label) if (is_within_manual_tab_bar) { ImGuiTabBar* tab_bar = g.CurrentTabBar; - IM_ASSERT(tab_bar->WantLayout); // Needs to be called AFTER BeginTabBar() and BEFORE the first call to BeginTabItem() ImGuiID tab_id = TabBarCalcTabID(tab_bar, label); - TabBarRemoveTab(tab_bar, tab_id); + if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) + tab->WantClose = true; // Will be processed by next call to TabBarLayout() } } @@ -6933,7 +7878,7 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI const float width = bb.GetWidth(); IM_UNUSED(flags); IM_ASSERT(width > 0.0f); - const float rounding = ImMax(0.0f, ImMin(g.Style.TabRounding, width * 0.5f - 1.0f)); + const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); const float y1 = bb.Min.y + 1.0f; const float y2 = bb.Max.y - 1.0f; draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); @@ -6947,18 +7892,32 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding + 0.5f, y1 + rounding + 0.5f), rounding, 6, 9); draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding - 0.5f, y1 + rounding + 0.5f), rounding, 9, 12); draw_list->PathLineTo(ImVec2(bb.Max.x - 0.5f, y2)); - draw_list->PathStroke(GetColorU32(ImGuiCol_Border), false, g.Style.TabBorderSize); + draw_list->PathStroke(GetColorU32(ImGuiCol_Border), 0, g.Style.TabBorderSize); } } // Render text label (with custom clipping) + Unsaved Document marker + Close Button logic // We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter. -bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id) +void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped) { ImGuiContext& g = *GImGui; ImVec2 label_size = CalcTextSize(label, NULL, true); + + if (out_just_closed) + *out_just_closed = false; + if (out_text_clipped) + *out_text_clipped = false; + if (bb.GetWidth() <= 1.0f) - return false; + return; + + // In Style V2 we'll have full override of all colors per state (e.g. focused, selected) + // But right now if you want to alter text color of tabs this is what you need to do. +#if 0 + const float backup_alpha = g.Style.Alpha; + if (!is_contents_visible) + g.Style.Alpha *= 0.7f; +#endif // Render text label (with clipping + alpha gradient) + unsaved marker const char* TAB_UNSAVED_MARKER = "*"; @@ -6966,11 +7925,18 @@ bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, if (flags & ImGuiTabItemFlags_UnsavedDocument) { text_pixel_clip_bb.Max.x -= CalcTextSize(TAB_UNSAVED_MARKER, NULL, false).x; - ImVec2 unsaved_marker_pos(ImMin(bb.Min.x + frame_padding.x + label_size.x + 2, text_pixel_clip_bb.Max.x), bb.Min.y + frame_padding.y + (float)(int)(-g.FontSize * 0.25f)); + ImVec2 unsaved_marker_pos(ImMin(bb.Min.x + frame_padding.x + label_size.x + 2, text_pixel_clip_bb.Max.x), bb.Min.y + frame_padding.y + IM_FLOOR(-g.FontSize * 0.25f)); RenderTextClippedEx(draw_list, unsaved_marker_pos, bb.Max - frame_padding, TAB_UNSAVED_MARKER, NULL, NULL); } ImRect text_ellipsis_clip_bb = text_pixel_clip_bb; + // Return clipped state ignoring the close button + if (out_text_clipped) + { + *out_text_clipped = (text_ellipsis_clip_bb.Min.x + label_size.x) > text_pixel_clip_bb.Max.x; + //draw_list->AddCircle(text_ellipsis_clip_bb.Min, 3.0f, *out_text_clipped ? IM_COL32(255, 0, 0, 255) : IM_COL32(0, 255, 0, 255)); + } + // Close Button // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() // 'hovered' will be true when hovering the Tab but NOT when hovering the close button @@ -6979,52 +7945,38 @@ bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, bool close_button_pressed = false; bool close_button_visible = false; if (close_button_id != 0) - if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == close_button_id) - close_button_visible = true; + if (is_contents_visible || bb.GetWidth() >= g.Style.TabMinWidthForCloseButton) + if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id) + close_button_visible = true; if (close_button_visible) { - ImGuiItemHoveredDataBackup last_item_backup; - const float close_button_sz = g.FontSize * 0.5f; - if (CloseButton(close_button_id, ImVec2(bb.Max.x - frame_padding.x - close_button_sz, bb.Min.y + frame_padding.y + close_button_sz), close_button_sz)) + ImGuiLastItemDataBackup last_item_backup; + const float close_button_sz = g.FontSize; + PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); + if (CloseButton(close_button_id, ImVec2(bb.Max.x - frame_padding.x * 2.0f - close_button_sz, bb.Min.y))) close_button_pressed = true; + PopStyleVar(); last_item_backup.Restore(); // Close with middle mouse button if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2)) close_button_pressed = true; - text_pixel_clip_bb.Max.x -= close_button_sz * 2.0f; + text_pixel_clip_bb.Max.x -= close_button_sz; } - // Label with ellipsis - // FIXME: This should be extracted into a helper but the use of text_pixel_clip_bb and !close_button_visible makes it tricky to abstract at the moment - const char* label_display_end = FindRenderedTextEnd(label); - if (label_size.x > text_ellipsis_clip_bb.GetWidth()) - { - const int ellipsis_dot_count = 3; - const float ellipsis_width = (1.0f + 1.0f) * ellipsis_dot_count - 1.0f; - const char* label_end = NULL; - float label_size_clipped_x = g.Font->CalcTextSizeA(g.FontSize, text_ellipsis_clip_bb.GetWidth() - ellipsis_width + 1.0f, 0.0f, label, label_display_end, &label_end).x; - if (label_end == label && label_end < label_display_end) // Always display at least 1 character if there's no room for character + ellipsis - { - label_end = label + ImTextCountUtf8BytesFromChar(label, label_display_end); - label_size_clipped_x = g.Font->CalcTextSizeA(g.FontSize, FLT_MAX, 0.0f, label, label_end).x; - } - while (label_end > label && ImCharIsBlankA(label_end[-1])) // Trim trailing space - { - label_end--; - label_size_clipped_x -= g.Font->CalcTextSizeA(g.FontSize, FLT_MAX, 0.0f, label_end, label_end + 1).x; // Ascii blanks are always 1 byte - } - RenderTextClippedEx(draw_list, text_pixel_clip_bb.Min, text_pixel_clip_bb.Max, label, label_end, &label_size, ImVec2(0.0f, 0.0f)); + // FIXME: if FramePadding is noticeably large, ellipsis_max_x will be wrong here (e.g. #3497), maybe for consistency that parameter of RenderTextEllipsis() shouldn't exist.. + float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f; + RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size); - const float ellipsis_x = text_pixel_clip_bb.Min.x + label_size_clipped_x + 1.0f; - if (!close_button_visible && ellipsis_x + ellipsis_width <= bb.Max.x) - RenderPixelEllipsis(draw_list, ImVec2(ellipsis_x, text_pixel_clip_bb.Min.y), ellipsis_dot_count, GetColorU32(ImGuiCol_Text)); - } - else - { - RenderTextClippedEx(draw_list, text_pixel_clip_bb.Min, text_pixel_clip_bb.Max, label, label_display_end, &label_size, ImVec2(0.0f, 0.0f)); - } +#if 0 + if (!is_contents_visible) + g.Style.Alpha = backup_alpha; +#endif - return close_button_pressed; + if (out_just_closed) + *out_just_closed = close_button_pressed; } + + +#endif // #ifndef IMGUI_DISABLE diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_rectpack.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_rectpack.h similarity index 97% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imstb_rectpack.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/imstb_rectpack.h index 23f922a579..ff2a85df42 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_rectpack.h +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_rectpack.h @@ -1,10 +1,10 @@ -// [DEAR IMGUI] -// This is a slightly modified version of stb_rect_pack.h 0.99. +// [DEAR IMGUI] +// This is a slightly modified version of stb_rect_pack.h 1.00. // Those changes would need to be pushed into nothings/stb: // - Added STBRP__CDECL // Grep for [DEAR IMGUI] to find the changes. -// stb_rect_pack.h - v0.99 - public domain - rectangle packing +// stb_rect_pack.h - v1.00 - public domain - rectangle packing // Sean Barrett 2014 // // Useful for e.g. packing rectangular textures into an atlas. @@ -37,9 +37,11 @@ // // Bugfixes / warning fixes // Jeremy Jaussaud +// Fabian Giesen // // Version history: // +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles // 0.99 (2019-02-07) warning fixes // 0.11 (2017-03-03) return packing success/fail result // 0.10 (2016-10-25) remove cast-away-const to avoid warnings @@ -357,6 +359,13 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt width -= width % c->align; STBRP_ASSERT(width % c->align == 0); + // if it can't possibly fit, bail immediately + if (width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + node = c->active_head; prev = &c->active_head; while (node->x + width <= c->width) { @@ -420,7 +429,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt } STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); - if (y + height < c->height) { + if (y + height <= c->height) { if (y <= best_y) { if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { best_x = xpos; diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_textedit.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_textedit.h similarity index 95% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imstb_textedit.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/imstb_textedit.h index d7fcbd6249..7644670975 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_textedit.h +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_textedit.h @@ -1,4 +1,4 @@ -// [DEAR IMGUI] +// [DEAR IMGUI] // This is a slightly modified version of stb_textedit.h 1.13. // Those changes would need to be pushed into nothings/stb: // - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) @@ -148,6 +148,8 @@ // STB_TEXTEDIT_K_RIGHT keyboard input to move cursor right // STB_TEXTEDIT_K_UP keyboard input to move cursor up // STB_TEXTEDIT_K_DOWN keyboard input to move cursor down +// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page +// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page // STB_TEXTEDIT_K_LINESTART keyboard input to move cursor to start of line // e.g. HOME // STB_TEXTEDIT_K_LINEEND keyboard input to move cursor to end of line // e.g. END // STB_TEXTEDIT_K_TEXTSTART keyboard input to move cursor to start of text // e.g. ctrl-HOME @@ -170,14 +172,10 @@ // STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text // STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text // -// Todo: -// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page -// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page -// // Keyboard input must be encoded as a single integer value; e.g. a character code // and some bitflags that represent shift states. to simplify the interface, SHIFT must // be a bitflag, so we can test the shifted state of cursor movements to allow selection, -// i.e. (STB_TEXTED_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. +// i.e. (STB_TEXTEDIT_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. // // You can encode other things, such as CONTROL or ALT, in additional bits, and // then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example, @@ -337,6 +335,10 @@ typedef struct // each textfield keeps its own insert mode state. to keep an app-wide // insert mode, copy this value in/out of the app state + int row_count_per_page; + // page size in number of row. + // this value MUST be set to >0 for pageup or pagedown in multilines documents. + ///////////////////// // // private data @@ -855,12 +857,16 @@ retry: break; case STB_TEXTEDIT_K_DOWN: - case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: { + case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGDOWN: + case STB_TEXTEDIT_K_PGDOWN | STB_TEXTEDIT_K_SHIFT: { StbFindState find; StbTexteditRow row; - int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int i, j, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGDOWN; + int row_count = is_page ? state->row_count_per_page : 1; - if (state->single_line) { + if (!is_page && state->single_line) { // on windows, up&down in single-line behave like left&right key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT); goto retry; @@ -869,17 +875,25 @@ retry: if (sel) stb_textedit_prep_selection_at_cursor(state); else if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str,state); + stb_textedit_move_to_last(str, state); // compute current position of cursor point stb_textedit_clamp(str, state); stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - // now find character position down a row - if (find.length) { - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - float x; + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; int start = find.first_char + find.length; + + if (find.length == 0) + break; + + // [DEAR IMGUI] + // going down while being on the last line shouldn't bring us to that line end + if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE) + break; + + // now find character position down a row state->cursor = start; STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); x = row.x0; @@ -901,17 +915,25 @@ retry: if (sel) state->select_end = state->cursor; + + // go to next line + find.first_char = find.first_char + find.length; + find.length = row.num_chars; } break; } case STB_TEXTEDIT_K_UP: - case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: { + case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGUP: + case STB_TEXTEDIT_K_PGUP | STB_TEXTEDIT_K_SHIFT: { StbFindState find; StbTexteditRow row; - int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int i, j, prev_scan, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGUP; + int row_count = is_page ? state->row_count_per_page : 1; - if (state->single_line) { + if (!is_page && state->single_line) { // on windows, up&down become left&right key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT); goto retry; @@ -926,11 +948,14 @@ retry: stb_textedit_clamp(str, state); stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - // can only go up if there's a previous row - if (find.prev_first != find.first_char) { + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; + + // can only go up if there's a previous row + if (find.prev_first == find.first_char) + break; + // now find character position up a row - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - float x; state->cursor = find.prev_first; STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); x = row.x0; @@ -952,6 +977,14 @@ retry: if (sel) state->select_end = state->cursor; + + // go to previous line + // (we need to scan previous line the hard way. maybe we could expose this as a new API function?) + prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0; + while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE) + --prev_scan; + find.first_char = find.prev_first; + find.prev_first = prev_scan; } break; } @@ -1075,10 +1108,6 @@ retry: state->has_preferred_x = 0; break; } - -// @TODO: -// STB_TEXTEDIT_K_PGUP - move cursor up a page -// STB_TEXTEDIT_K_PGDOWN - move cursor down a page } } @@ -1134,7 +1163,7 @@ static void stb_textedit_discard_redo(StbUndoState *state) state->undo_rec[i].char_storage += n; } // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' - // {DEAR IMGUI] + // [DEAR IMGUI] size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; @@ -1350,6 +1379,7 @@ static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_lin state->initialized = 1; state->single_line = (unsigned char) is_single_line; state->insert_mode = 0; + state->row_count_per_page = 0; } // API initialize diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_truetype.h b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_truetype.h similarity index 99% rename from Gems/ImGui/External/ImGui/v1.70/imgui/imstb_truetype.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/imstb_truetype.h index 65c0ddc112..fc815d7452 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/imstb_truetype.h +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imstb_truetype.h @@ -1,4 +1,4 @@ -// [DEAR IMGUI] +// [DEAR IMGUI] // This is a slightly modified version of stb_truetype.h 1.20. // Mostly fixing for compiler and static analyzer warnings. // Grep for [DEAR IMGUI] to find the changes. @@ -2538,11 +2538,11 @@ static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, i // There are no other cases. STBTT_assert(0); break; - }; + } // [DEAR IMGUI] removed ; } } break; - }; + } // [DEAR IMGUI] removed ; default: // TODO: Implement other stuff. @@ -4132,7 +4132,7 @@ STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) { stbtt_fontinfo info; - int i,j,n, return_value = 1; + int i,j,n, return_value; // [DEAR IMGUI] removed = 1 //stbrp_context *context = (stbrp_context *) spc->pack_info; stbrp_rect *rects; @@ -4302,7 +4302,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex int winding = 0; orig[0] = x; - //orig[1] = y; // [DEAR IMGUI] commmented double assignment + //orig[1] = y; // [DEAR IMGUI] commented double assignment // make sure y never passes through a vertex of the shape y_frac = (float) STBTT_fmod(y, 1.0f); @@ -4374,32 +4374,32 @@ static float stbtt__cuberoot( float x ) // x^3 + c*x^2 + b*x + a = 0 static int stbtt__solve_cubic(float a, float b, float c, float* r) { - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; + float s = -a / 3; + float p = b - a*a / 3; + float q = a * (2*a*a - 9*b) / 27 + c; float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float) STBTT_cos(v); + float d = q*q + 4*p3 / 27; + if (d >= 0) { + float z = (float) STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } else { + float u = (float) STBTT_sqrt(-p/3); + float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float) STBTT_cos(v); float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; + return 3; } } diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/README.txt b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/README.txt similarity index 56% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/README.txt rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/README.txt index be3af5ae55..b4ce89f038 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/README.txt +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/README.txt @@ -3,6 +3,10 @@ misc/cpp/ InputText() wrappers for C++ standard library (STL) type: std::string. This is also an example of how you may wrap your own similar types. +misc/debuggers/ + Helper files for popular debuggers. + With the .natvis file, types like ImVector<> will be displayed nicely in Visual Studio debugger. + misc/fonts/ Fonts loading/merging instructions (e.g. How to handle glyph ranges, how to merge icons fonts). Command line tool "binary_to_compressed_c" to create compressed arrays to embed data in source code. @@ -12,7 +16,8 @@ misc/freetype/ Font atlas builder/rasterizer using FreeType instead of stb_truetype. Benefit from better FreeType rasterization, in particular for small fonts. -misc/natvis/ - Natvis file to describe dear imgui types in the Visual Studio debugger. - With this, types like ImVector<> will be displayed nicely in the debugger. - You can include this file a Visual Studio project file, or install it in Visual Studio folder. +misc/single_file/ + Single-file header stub. + We use this to validate compiling all *.cpp files in a same compilation unit. + Users of that technique (also called "Unity builds") can generally provide this themselves, + so we don't really recommend you use this in your projects. diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/README.txt b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/README.txt similarity index 94% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/README.txt rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/README.txt index 9067cac0d1..8d5982e0ed 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/README.txt +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/README.txt @@ -5,6 +5,6 @@ imgui_stdlib.h + imgui_stdlib.cpp imgui_scoped.h [Experimental, not currently in main repository] - Additional header file with some RAII-style wrappers for common ImGui functions. + Additional header file with some RAII-style wrappers for common Dear ImGui functions. Try by merging: https://github.com/ocornut/imgui/pull/2197 Discuss at: https://github.com/ocornut/imgui/issues/2096 diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.cpp similarity index 97% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.cpp index fda60f4d83..cb1fe1743d 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.cpp @@ -1,5 +1,4 @@ -// imgui_stdlib.cpp -// Wrappers for C++ standard library (STL) types (std::string, etc.) +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) // This is also an example of how you may wrap your own similar types. // Compatibility: diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.h b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.h similarity index 92% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.h rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.h index 5bccb03236..f860b0c780 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/cpp/imgui_stdlib.h +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/cpp/imgui_stdlib.h @@ -1,5 +1,4 @@ -// imgui_stdlib.h -// Wrappers for C++ standard library (STL) types (std::string, etc.) +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) // This is also an example of how you may wrap your own similar types. // Compatibility: diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/README.txt b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/README.txt new file mode 100644 index 0000000000..3f4ba83e3c --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/README.txt @@ -0,0 +1,16 @@ + +HELPER FILES FOR POPULAR DEBUGGERS + +imgui.gdb + GDB: disable stepping into trivial functions. + (read comments inside file for details) + +imgui.natstepfilter + Visual Studio Debugger: disable stepping into trivial functions. + (read comments inside file for details) + +imgui.natvis + Visual Studio Debugger: describe Dear ImGui types for better display. + With this, types like ImVector<> will be displayed nicely in the debugger. + (read comments inside file for details) + diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.gdb b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.gdb new file mode 100644 index 0000000000..000ff6eb91 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.gdb @@ -0,0 +1,12 @@ +# GDB configuration to aid debugging experience + +# To enable these customizations edit $HOME/.gdbinit (or ./.gdbinit if local gdbinit is enabled) and add: +# add-auto-load-safe-path /path/to/imgui.gdb +# source /path/to/imgui.gdb +# +# More Information at: +# * https://sourceware.org/gdb/current/onlinedocs/gdb/gdbinit-man.html +# * https://sourceware.org/gdb/current/onlinedocs/gdb/Init-File-in-the-Current-Directory.html#Init-File-in-the-Current-Directory + +# Disable stepping into trivial functions +skip -rfunction Im(Vec2|Vec4|Strv|Vector|Span)::.+ diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natstepfilter b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natstepfilter new file mode 100644 index 0000000000..efd1957b2f --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natstepfilter @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +.natstepfilter file for Visual Studio debugger. +Purpose: instruct debugger to skip some functions when using StepInto (F11) + +To enable: +* copy in %USERPROFILE%\Documents\Visual Studio XXXX\Visualizers (current user) +* or copy in %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers (all users) +If you have multiple VS version installed, the version that matters is the one you are using the IDE/debugger of (not the compiling toolset). +This is supported since Visual Studio 2012. + +Unfortunately, unlike .natvis files, it isn't yet possible to include this file in your project :( +You may upvote this: https://developercommunity.visualstudio.com/t/allow-natstepfilter-and-natjmc-to-be-included-as-p/561718 + +More information at: https://docs.microsoft.com/en-us/visualstudio/debugger/just-my-code?view=vs-2019#BKMK_C___Just_My_Code +--> + +<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010"> + + <!-- Disable stepping into trivial functions --> + <Function> + <Name>(ImVec2|ImVec4|ImStrv)::.+</Name> + <Action>NoStepInto</Action> + </Function> + <Function> + <Name>(ImVector|ImSpan).*::operator.+</Name> + <Action>NoStepInto</Action> + </Function> + +</StepFilter> diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/imgui.natvis b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natvis similarity index 59% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/imgui.natvis rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natvis index cc768bfb55..13b6360085 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/natvis/imgui.natvis +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/debuggers/imgui.natvis @@ -1,6 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- +.natvis file for Visual Studio debugger. +Purpose: provide nicer views on data types used by Dear ImGui. -<!-- natvis file for Visual Studio debugger (you can include this in a project file, or install in visual studio folder) --> +To enable: +* include file in your VS project (most recommended: not intrusive and always kept up to date!) +* or copy in %USERPROFILE%\Documents\Visual Studio XXXX\Visualizers (current user) +* or copy in %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers (all users) + +More information at: https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2019 +--> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> @@ -14,6 +23,16 @@ </Expand> </Type> +<Type Name="ImSpan<*>"> + <DisplayString>{{Size={DataEnd-Data} }}</DisplayString> + <Expand> + <ArrayItems> + <Size>DataEnd-Data</Size> + <ValuePointer>Data</ValuePointer> + </ArrayItems> + </Expand> +</Type> + <Type Name="ImVec2"> <DisplayString>{{x={x,g} y={y,g}}}</DisplayString> </Type> @@ -35,5 +54,5 @@ <Type Name="ImGuiWindow"> <DisplayString>{{Name {Name,s} Active {(Active||WasActive)?1:0,d} Child {(Flags & 0x01000000)?1:0,d} Popup {(Flags & 0x04000000)?1:0,d} Hidden {(Hidden)?1:0,d}}</DisplayString> </Type> - -</AutoVisualizer> \ No newline at end of file + +</AutoVisualizer> diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Cousine-Regular.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Cousine-Regular.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Cousine-Regular.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Cousine-Regular.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/DroidSans.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/DroidSans.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/DroidSans.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/DroidSans.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Karla-Regular.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Karla-Regular.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Karla-Regular.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Karla-Regular.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/ProggyClean.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/ProggyClean.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/ProggyClean.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/ProggyClean.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/ProggyTiny.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/ProggyTiny.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/ProggyTiny.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/ProggyTiny.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Roboto-Medium.ttf b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Roboto-Medium.ttf similarity index 100% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/Roboto-Medium.ttf rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/Roboto-Medium.ttf diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/binary_to_compressed_c.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/binary_to_compressed_c.cpp similarity index 92% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/binary_to_compressed_c.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/binary_to_compressed_c.cpp index 3fde3d9591..441c8f67c2 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/fonts/binary_to_compressed_c.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/fonts/binary_to_compressed_c.cpp @@ -1,15 +1,17 @@ -// ImGui - binary_to_compressed_c.cpp +// dear imgui +// (binary_to_compressed_c.cpp) // Helper tool to turn a file into a C array, if you want to embed font data in your source code. // The data is first compressed with stb_compress() to reduce source code size, // then encoded in Base85 to fit in a string so we can fit roughly 4 bytes of compressed data into 5 bytes of source code (suggested by @mmalex) -// (If we used 32-bits constants it would require take 11 bytes of source code to encode 4 bytes, and be endianness dependent) +// (If we used 32-bit constants it would require take 11 bytes of source code to encode 4 bytes, and be endianness dependent) // Note that even with compression, the output array is likely to be bigger than the binary file.. // Load compressed TTF fonts with ImGui::GetIO().Fonts->AddFontFromMemoryCompressedTTF() // Build with, e.g: // # cl.exe binary_to_compressed_c.cpp -// # gcc binary_to_compressed_c.cpp +// # g++ binary_to_compressed_c.cpp +// # clang++ binary_to_compressed_c.cpp // You can also find a precompiled Windows binary in the binary/demo package available from https://github.com/ocornut/imgui // Usage: @@ -27,7 +29,7 @@ // stb_compress* from stb.h - declaration typedef unsigned int stb_uint; typedef unsigned char stb_uchar; -stb_uint stb_compress(stb_uchar *out,stb_uchar *in,stb_uint len); +stb_uint stb_compress(stb_uchar* out, stb_uchar* in, stb_uint len); static bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_base85_encoding, bool use_compression); @@ -48,18 +50,21 @@ int main(int argc, char** argv) else if (strcmp(argv[argn], "-nocompress") == 0) { use_compression = false; argn++; } else { - printf("Unknown argument: '%s'\n", argv[argn]); + fprintf(stderr, "Unknown argument: '%s'\n", argv[argn]); return 1; } } - return binary_to_compressed_c(argv[argn], argv[argn+1], use_base85_encoding, use_compression) ? 0 : 1; + bool ret = binary_to_compressed_c(argv[argn], argv[argn + 1], use_base85_encoding, use_compression); + if (!ret) + fprintf(stderr, "Error opening or reading file: '%s'\n", argv[argn]); + return ret ? 0 : 1; } char Encode85Byte(unsigned int x) { x = (x % 85) + 35; - return (x>='\\') ? x+1 : x; + return (x >= '\\') ? x + 1 : x; } bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_base85_encoding, bool use_compression) @@ -69,7 +74,7 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b if (!f) return false; int data_sz; if (fseek(f, 0, SEEK_END) || (data_sz = (int)ftell(f)) == -1 || fseek(f, 0, SEEK_SET)) { fclose(f); return false; } - char* data = new char[data_sz+4]; + char* data = new char[data_sz + 4]; if (fread(data, 1, data_sz, f) != (size_t)data_sz) { fclose(f); delete[] data; return false; } memset((void*)(((char*)data) + data_sz), 0, 4); fclose(f); @@ -79,16 +84,16 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b char* compressed = use_compression ? new char[maxlen] : data; int compressed_sz = use_compression ? stb_compress((stb_uchar*)compressed, (stb_uchar*)data, data_sz) : data_sz; if (use_compression) - memset(compressed + compressed_sz, 0, maxlen - compressed_sz); + memset(compressed + compressed_sz, 0, maxlen - compressed_sz); // Output as Base85 encoded FILE* out = stdout; fprintf(out, "// File: '%s' (%d bytes)\n", filename, (int)data_sz); fprintf(out, "// Exported using binary_to_compressed_c.cpp\n"); - const char* compressed_str = use_compression ? "compressed_" : ""; + const char* compressed_str = use_compression ? "compressed_" : ""; if (use_base85_encoding) { - fprintf(out, "static const char %s_%sdata_base85[%d+1] =\n \"", symbol, compressed_str, (int)((compressed_sz+3)/4)*5); + fprintf(out, "static const char %s_%sdata_base85[%d+1] =\n \"", symbol, compressed_str, (int)((compressed_sz + 3) / 4)*5); char prev_c = 0; for (int src_i = 0; src_i < compressed_sz; src_i += 4) { @@ -100,7 +105,7 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b fprintf(out, (c == '?' && prev_c == '?') ? "\\%c" : "%c", c); prev_c = c; } - if ((src_i % 112) == 112-4) + if ((src_i % 112) == 112 - 4) fprintf(out, "\"\n \""); } fprintf(out, "\";\n\n"); @@ -108,7 +113,7 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b else { fprintf(out, "static const unsigned int %s_%ssize = %d;\n", symbol, compressed_str, (int)compressed_sz); - fprintf(out, "static const unsigned int %s_%sdata[%d/4] =\n{", symbol, compressed_str, (int)((compressed_sz+3)/4)*4); + fprintf(out, "static const unsigned int %s_%sdata[%d/4] =\n{", symbol, compressed_str, (int)((compressed_sz + 3) / 4)*4); int column = 0; for (int i = 0; i < compressed_sz; i += 4) { @@ -124,7 +129,7 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b // Cleanup delete[] data; if (use_compression) - delete[] compressed; + delete[] compressed; return true; } diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/README.md b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/README.md new file mode 100644 index 0000000000..a3db353452 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/README.md @@ -0,0 +1,30 @@ +# imgui_freetype + +Build font atlases using FreeType instead of stb_truetype (which is the default font rasterizer). +<br>by @vuhdo, @mikesart, @ocornut. + +### Usage + +1. Get latest FreeType binaries or build yourself (under Windows you may use vcpkg with `vcpkg install freetype`, `vcpkg integrate install`). +2. Add imgui_freetype.h/cpp alongside your project files. +3. Add `#define IMGUI_ENABLE_FREETYPE` in your [imconfig.h](https://github.com/ocornut/imgui/blob/master/imconfig.h) file + +### About Gamma Correct Blending + +FreeType assumes blending in linear space rather than gamma space. +See FreeType note for [FT_Render_Glyph](https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Glyph). +For correct results you need to be using sRGB and convert to linear space in the pixel shader output. +The default Dear ImGui styles will be impacted by this change (alpha values will need tweaking). + +### Testbed for toying with settings (for developers) + +See https://gist.github.com/ocornut/b3a9ecf13502fd818799a452969649ad + +### Known issues + +- Oversampling settins are ignored but also not so much necessary with the higher quality rendering. + +### Comparaison + +Small, thin anti-aliased fonts are typically benefiting a lots from Freetype's hinting: +![comparing_font_rasterizers](https://user-images.githubusercontent.com/8225057/107550178-fef87f00-6bd0-11eb-8d09-e2edb2f0ccfc.gif) diff --git a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.cpp similarity index 64% rename from Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.cpp rename to Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.cpp index 4a579ed287..c4120778b4 100644 --- a/Gems/ImGui/External/ImGui/v1.70/imgui/misc/freetype/imgui_freetype.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.cpp @@ -1,23 +1,33 @@ -// Wrapper to use FreeType (instead of stb_truetype) for Dear ImGui +// dear imgui: FreeType font builder (used as a replacement for the stb_truetype builder) +// (code) + // Get latest version at https://github.com/ocornut/imgui/tree/master/misc/freetype -// Original code by @vuhdo (Aleksei Skriabin). Improvements by @mikesart. Maintained and v0.60+ by @ocornut. +// Original code by @vuhdo (Aleksei Skriabin). Improvements by @mikesart. Maintained since 2019 by @ocornut. -// Changelog: -// - v0.50: (2017/08/16) imported from https://github.com/Vuhdo/imgui_freetype into http://www.github.com/ocornut/imgui_club, updated for latest changes in ImFontAtlas, minor tweaks. -// - v0.51: (2017/08/26) cleanup, optimizations, support for ImFontConfig::RasterizerFlags, ImFontConfig::RasterizerMultiply. -// - v0.52: (2017/09/26) fixes for imgui internal changes. -// - v0.53: (2017/10/22) minor inconsequential change to match change in master (removed an unnecessary statement). -// - v0.54: (2018/01/22) fix for addition of ImFontAtlas::TexUvscale member. -// - v0.55: (2018/02/04) moved to main imgui repository (away from http://www.github.com/ocornut/imgui_club) -// - v0.56: (2018/06/08) added support for ImFontConfig::GlyphMinAdvanceX, GlyphMaxAdvanceX. -// - v0.60: (2019/01/10) re-factored to match big update in STB builder. fixed texture height waste. fixed redundant glyphs when merging. support for glyph padding. -// - v0.61: (2019/01/15) added support for imgui allocators + added FreeType only override function SetAllocatorFunctions(). +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2021/03/05: added ImGuiFreeTypeBuilderFlags_Bitmap to load bitmap glyphs. +// 2021/03/02: set 'atlas->TexPixelsUseColors = true' to help some backends with deciding of a prefered texture format. +// 2021/01/28: added support for color-layered glyphs via ImGuiFreeTypeBuilderFlags_LoadColor (require Freetype 2.10+). +// 2021/01/26: simplified integration by using '#define IMGUI_ENABLE_FREETYPE'. +// renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. removed ImGuiFreeType::BuildFontAtlas(). +// 2020/06/04: fix for rare case where FT_Get_Char_Index() succeed but FT_Load_Glyph() fails. +// 2019/02/09: added RasterizerFlags::Monochrome flag to disable font anti-aliasing (combine with ::MonoHinting for best results!) +// 2019/01/15: added support for imgui allocators + added FreeType only override function SetAllocatorFunctions(). +// 2019/01/10: re-factored to match big update in STB builder. fixed texture height waste. fixed redundant glyphs when merging. support for glyph padding. +// 2018/06/08: added support for ImFontConfig::GlyphMinAdvanceX, GlyphMaxAdvanceX. +// 2018/02/04: moved to main imgui repository (away from http://www.github.com/ocornut/imgui_club) +// 2018/01/22: fix for addition of ImFontAtlas::TexUvscale member. +// 2017/10/22: minor inconsequential change to match change in master (removed an unnecessary statement). +// 2017/09/26: fixes for imgui internal changes. +// 2017/08/26: cleanup, optimizations, support for ImFontConfig::RasterizerFlags, ImFontConfig::RasterizerMultiply. +// 2017/08/16: imported from https://github.com/Vuhdo/imgui_freetype into http://www.github.com/ocornut/imgui_club, updated for latest changes in ImFontAtlas, minor tweaks. -// Gamma Correct Blending: -// FreeType assumes blending in linear space rather than gamma space. -// See https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Glyph -// For correct results you need to be using sRGB and convert to linear space in the pixel shader output. -// The default imgui styles will be impacted by this change (alpha values will need tweaking). +// About Gamma Correct Blending: +// - FreeType assumes blending in linear space rather than gamma space. +// - See https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Glyph +// - For correct results you need to be using sRGB and convert to linear space in the pixel shader output. +// - The default dear imgui styles will be impacted by this change (alpha values will need tweaking). // FIXME: cfg.OversampleH, OversampleV are not supported (but perhaps not so necessary with this rasterizer). @@ -35,9 +45,27 @@ #endif #if defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used #endif +//------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------- + +// Default memory allocators +static void* ImGuiFreeTypeDefaultAllocFunc(size_t size, void* user_data) { IM_UNUSED(user_data); return IM_ALLOC(size); } +static void ImGuiFreeTypeDefaultFreeFunc(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_FREE(ptr); } + +// Current memory allocators +static void* (*GImGuiFreeTypeAllocFunc)(size_t size, void* user_data) = ImGuiFreeTypeDefaultAllocFunc; +static void (*GImGuiFreeTypeFreeFunc)(void* ptr, void* user_data) = ImGuiFreeTypeDefaultFreeFunc; +static void* GImGuiFreeTypeAllocatorUserData = NULL; + +//------------------------------------------------------------------------- +// Code +//------------------------------------------------------------------------- + namespace { // Glyph metrics: @@ -71,7 +99,7 @@ namespace // | | // |------------- advanceX ----------->| - /// A structure that describe a glyph. + // A structure that describe a glyph. struct GlyphInfo { int Width; // Glyph's width in pixels. @@ -79,6 +107,7 @@ namespace FT_Int OffsetX; // The distance from the origin ("pen position") to the left of the glyph. FT_Int OffsetY; // The distance from the origin to the top of the glyph. This is usually a value < 0. float AdvanceX; // The distance from the origin to the origin of the next glyph. This is usually a value > 0. + bool IsColored; // The glyph is colored }; // Font parameters and metrics. @@ -101,7 +130,7 @@ namespace void SetPixelHeight(int pixel_height); // Change font pixel size. All following calls to RasterizeGlyph() will use this size const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint); const FT_Bitmap* RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info); - void BlitGlyph(const FT_Bitmap* ft_bitmap, uint8_t* dst, uint32_t dst_pitch, unsigned char* multiply_table = NULL); + void BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table = NULL); ~FreeTypeFont() { CloseFont(); } // [Internals] @@ -109,12 +138,13 @@ namespace FT_Face Face; unsigned int UserFlags; // = ImFontConfig::RasterizerFlags FT_Int32 LoadFlags; + FT_Render_Mode RenderMode; }; // From SDL_ttf: Handy routines for converting from fixed point #define FT_CEIL(X) (((X + 63) & -64) / 64) - bool FreeTypeFont::InitFont(FT_Library ft_library, const ImFontConfig& cfg, unsigned int extra_user_flags) + bool FreeTypeFont::InitFont(FT_Library ft_library, const ImFontConfig& cfg, unsigned int extra_font_builder_flags) { FT_Error error = FT_New_Memory_Face(ft_library, (uint8_t*)cfg.FontData, (uint32_t)cfg.FontDataSize, (uint32_t)cfg.FontNo, &Face); if (error != 0) @@ -123,25 +153,37 @@ namespace if (error != 0) return false; - memset(&Info, 0, sizeof(Info)); - SetPixelHeight((uint32_t)cfg.SizePixels); - // Convert to FreeType flags (NB: Bold and Oblique are processed separately) - UserFlags = cfg.RasterizerFlags | extra_user_flags; - LoadFlags = FT_LOAD_NO_BITMAP; - if (UserFlags & ImGuiFreeType::NoHinting) + UserFlags = cfg.FontBuilderFlags | extra_font_builder_flags; + + LoadFlags = 0; + if ((UserFlags & ImGuiFreeTypeBuilderFlags_Bitmap) == 0) + LoadFlags |= FT_LOAD_NO_BITMAP; + + if (UserFlags & ImGuiFreeTypeBuilderFlags_NoHinting) LoadFlags |= FT_LOAD_NO_HINTING; - if (UserFlags & ImGuiFreeType::NoAutoHint) + if (UserFlags & ImGuiFreeTypeBuilderFlags_NoAutoHint) LoadFlags |= FT_LOAD_NO_AUTOHINT; - if (UserFlags & ImGuiFreeType::ForceAutoHint) + if (UserFlags & ImGuiFreeTypeBuilderFlags_ForceAutoHint) LoadFlags |= FT_LOAD_FORCE_AUTOHINT; - if (UserFlags & ImGuiFreeType::LightHinting) + if (UserFlags & ImGuiFreeTypeBuilderFlags_LightHinting) LoadFlags |= FT_LOAD_TARGET_LIGHT; - else if (UserFlags & ImGuiFreeType::MonoHinting) + else if (UserFlags & ImGuiFreeTypeBuilderFlags_MonoHinting) LoadFlags |= FT_LOAD_TARGET_MONO; else LoadFlags |= FT_LOAD_TARGET_NORMAL; + if (UserFlags & ImGuiFreeTypeBuilderFlags_Monochrome) + RenderMode = FT_RENDER_MODE_MONO; + else + RenderMode = FT_RENDER_MODE_NORMAL; + + if (UserFlags & ImGuiFreeTypeBuilderFlags_LoadColor) + LoadFlags |= FT_LOAD_COLOR; + + memset(&Info, 0, sizeof(Info)); + SetPixelHeight((uint32_t)cfg.SizePixels); + return true; } @@ -160,7 +202,7 @@ namespace // is a maximum height of an any given glyph, i.e. it's the sum of font's ascender and descender. Seems strange to me. // NB: FT_Set_Pixel_Sizes() doesn't seem to get us the same result. FT_Size_RequestRec req; - req.type = FT_SIZE_REQUEST_TYPE_REAL_DIM; + req.type = (UserFlags & ImGuiFreeTypeBuilderFlags_Bitmap) ? FT_SIZE_REQUEST_TYPE_NOMINAL : FT_SIZE_REQUEST_TYPE_REAL_DIM; req.width = 0; req.height = (uint32_t)pixel_height * 64; req.horiResolution = 0; @@ -188,12 +230,12 @@ namespace // Need an outline for this to work FT_GlyphSlot slot = Face->glyph; - IM_ASSERT(slot->format == FT_GLYPH_FORMAT_OUTLINE); + IM_ASSERT(slot->format == FT_GLYPH_FORMAT_OUTLINE || slot->format == FT_GLYPH_FORMAT_BITMAP); // Apply convenience transform (this is not picking from real "Bold"/"Italic" fonts! Merely applying FreeType helper transform. Oblique == Slanting) - if (UserFlags & ImGuiFreeType::Bold) + if (UserFlags & ImGuiFreeTypeBuilderFlags_Bold) FT_GlyphSlot_Embolden(slot); - if (UserFlags & ImGuiFreeType::Oblique) + if (UserFlags & ImGuiFreeTypeBuilderFlags_Oblique) { FT_GlyphSlot_Oblique(slot); //FT_BBox bbox; @@ -208,7 +250,7 @@ namespace const FT_Bitmap* FreeTypeFont::RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info) { FT_GlyphSlot slot = Face->glyph; - FT_Error error = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); + FT_Error error = FT_Render_Glyph(slot, RenderMode); if (error != 0) return NULL; @@ -218,11 +260,12 @@ namespace out_glyph_info->OffsetX = Face->glyph->bitmap_left; out_glyph_info->OffsetY = -Face->glyph->bitmap_top; out_glyph_info->AdvanceX = (float)FT_CEIL(slot->advance.x); + out_glyph_info->IsColored = (ft_bitmap->pixel_mode == FT_PIXEL_MODE_BGRA); return ft_bitmap; } - void FreeTypeFont::BlitGlyph(const FT_Bitmap* ft_bitmap, uint8_t* dst, uint32_t dst_pitch, unsigned char* multiply_table) + void FreeTypeFont::BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table) { IM_ASSERT(ft_bitmap != NULL); const uint32_t w = ft_bitmap->width; @@ -230,32 +273,94 @@ namespace const uint8_t* src = ft_bitmap->buffer; const uint32_t src_pitch = ft_bitmap->pitch; - if (multiply_table == NULL) + switch (ft_bitmap->pixel_mode) { - for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) - memcpy(dst, src, w); - } - else - { - for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) - for (uint32_t x = 0; x < w; x++) - dst[x] = multiply_table[src[x]]; + case FT_PIXEL_MODE_GRAY: // Grayscale image, 1 byte per pixel. + { + if (multiply_table == NULL) + { + for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) + for (uint32_t x = 0; x < w; x++) + dst[x] = IM_COL32(255, 255, 255, src[x]); + } + else + { + for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) + for (uint32_t x = 0; x < w; x++) + dst[x] = IM_COL32(255, 255, 255, multiply_table[src[x]]); + } + break; + } + case FT_PIXEL_MODE_MONO: // Monochrome image, 1 bit per pixel. The bits in each byte are ordered from MSB to LSB. + { + uint8_t color0 = multiply_table ? multiply_table[0] : 0; + uint8_t color1 = multiply_table ? multiply_table[255] : 255; + for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) + { + uint8_t bits = 0; + const uint8_t* bits_ptr = src; + for (uint32_t x = 0; x < w; x++, bits <<= 1) + { + if ((x & 7) == 0) + bits = *bits_ptr++; + dst[x] = IM_COL32(255, 255, 255, (bits & 0x80) ? color1 : color0); + } + } + break; + } + case FT_PIXEL_MODE_BGRA: + { + // FIXME: Converting pre-multiplied alpha to straight. Doesn't smell good. + #define DE_MULTIPLY(color, alpha) (ImU32)(255.0f * (float)color / (float)alpha + 0.5f) + if (multiply_table == NULL) + { + for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) + for (uint32_t x = 0; x < w; x++) + { + uint8_t r = src[x * 4 + 2], g = src[x * 4 + 1], b = src[x * 4], a = src[x * 4 + 3]; + dst[x] = IM_COL32(DE_MULTIPLY(r, a), DE_MULTIPLY(g, a), DE_MULTIPLY(b, a), a); + } + } + else + { + for (uint32_t y = 0; y < h; y++, src += src_pitch, dst += dst_pitch) + { + for (uint32_t x = 0; x < w; x++) + { + uint8_t r = src[x * 4 + 2], g = src[x * 4 + 1], b = src[x * 4], a = src[x * 4 + 3]; + dst[x] = IM_COL32(multiply_table[DE_MULTIPLY(r, a)], multiply_table[DE_MULTIPLY(g, a)], multiply_table[DE_MULTIPLY(b, a)], multiply_table[a]); + } + } + } + #undef DE_MULTIPLY + break; + } + default: + IM_ASSERT(0 && "FreeTypeFont::BlitGlyph(): Unknown bitmap pixel mode!"); } } } -#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) -#define STBRP_ASSERT(x) IM_ASSERT(x) +#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) +#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION +#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0) #define STBRP_STATIC #define STB_RECT_PACK_IMPLEMENTATION +#endif +#ifdef IMGUI_STB_RECT_PACK_FILENAME +#include IMGUI_STB_RECT_PACK_FILENAME +#else #include "imstb_rectpack.h" #endif +#endif struct ImFontBuildSrcGlyphFT { GlyphInfo Info; uint32_t Codepoint; - unsigned char* BitmapData; // Point within one of the dst_tmp_bitmap_buffers[] array + unsigned int* BitmapData; // Point within one of the dst_tmp_bitmap_buffers[] array + + ImFontBuildSrcGlyphFT() { memset(this, 0, sizeof(*this)); } }; struct ImFontBuildSrcDataFT @@ -266,7 +371,7 @@ struct ImFontBuildSrcDataFT int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[] int GlyphsHighest; // Highest requested codepoint int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font) - ImBoolVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) + ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) ImVector<ImFontBuildSrcGlyphFT> GlyphsList; }; @@ -276,14 +381,14 @@ struct ImFontBuildDstDataFT int SrcCount; // Number of source fonts targeting this destination font. int GlyphsHighest; int GlyphsCount; - ImBoolVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. + ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. }; -bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, unsigned int extra_flags) +bool ImFontAtlasBuildWithFreeTypeEx(FT_Library ft_library, ImFontAtlas* atlas, unsigned int extra_flags) { IM_ASSERT(atlas->ConfigData.Size > 0); - ImFontAtlasBuildRegisterDefaultCustomRects(atlas); + ImFontAtlasBuildInit(atlas); // Clear atlas atlas->TexID = (ImTextureID)NULL; @@ -293,12 +398,13 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns atlas->ClearTexData(); // Temporary storage for building + bool src_load_color = false; ImVector<ImFontBuildSrcDataFT> src_tmp_array; ImVector<ImFontBuildDstDataFT> dst_tmp_array; src_tmp_array.resize(atlas->ConfigData.Size); dst_tmp_array.resize(atlas->Fonts.Size); - memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); - memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); + memset((void*)src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); + memset((void*)dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); // 1. Initialize font loading structure, check font data validity for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++) @@ -322,6 +428,7 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns return false; // Measure highest codepoints + src_load_color |= (cfg.FontBuilderFlags & ImGuiFreeTypeBuilderFlags_LoadColor) != 0; ImFontBuildDstDataFT& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault(); for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) @@ -336,14 +443,14 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns { ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i]; ImFontBuildDstDataFT& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; - src_tmp.GlyphsSet.Resize(src_tmp.GlyphsHighest + 1); + src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); if (dst_tmp.GlyphsSet.Storage.empty()) - dst_tmp.GlyphsSet.Resize(dst_tmp.GlyphsHighest + 1); + dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1); for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) - for (int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) + for (int codepoint = src_range[0]; codepoint <= (int)src_range[1]; codepoint++) { - if (dst_tmp.GlyphsSet.GetBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option (e.g. MergeOverwrite) + if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option (e.g. MergeOverwrite) continue; uint32_t glyph_index = FT_Get_Char_Index(src_tmp.Font.Face, codepoint); // It is actually in the font? (FIXME-OPT: We are not storing the glyph_index..) if (glyph_index == 0) @@ -352,8 +459,8 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns // Add to avail set/counters src_tmp.GlyphsCount++; dst_tmp.GlyphsCount++; - src_tmp.GlyphsSet.SetBit(codepoint, true); - dst_tmp.GlyphsSet.SetBit(codepoint, true); + src_tmp.GlyphsSet.SetBit(codepoint); + dst_tmp.GlyphsSet.SetBit(codepoint); total_glyphs_count++; } } @@ -364,16 +471,15 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i]; src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); - IM_ASSERT(sizeof(src_tmp.GlyphsSet.Storage.Data[0]) == sizeof(int)); - const int* it_begin = src_tmp.GlyphsSet.Storage.begin(); - const int* it_end = src_tmp.GlyphsSet.Storage.end(); - for (const int* it = it_begin; it < it_end; it++) - if (int entries_32 = *it) - for (int bit_n = 0; bit_n < 32; bit_n++) - if (entries_32 & (1 << bit_n)) + IM_ASSERT(sizeof(src_tmp.GlyphsSet.Storage.Data[0]) == sizeof(ImU32)); + const ImU32* it_begin = src_tmp.GlyphsSet.Storage.begin(); + const ImU32* it_end = src_tmp.GlyphsSet.Storage.end(); + for (const ImU32* it = it_begin; it < it_end; it++) + if (ImU32 entries_32 = *it) + for (ImU32 bit_n = 0; bit_n < 32; bit_n++) + if (entries_32 & ((ImU32)1 << bit_n)) { ImFontBuildSrcGlyphFT src_glyph; - memset(&src_glyph, 0, sizeof(src_glyph)); src_glyph.Codepoint = (ImWchar)(((it - it_begin) << 5) + bit_n); //src_glyph.GlyphIndex = 0; // FIXME-OPT: We had this info in the previous step and lost it.. src_tmp.GlyphsList.push_back(src_glyph); @@ -427,7 +533,6 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns ImFontBuildSrcGlyphFT& src_glyph = src_tmp.GlyphsList[glyph_i]; const FT_Glyph_Metrics* metrics = src_tmp.Font.LoadGlyph(src_glyph.Codepoint); - IM_ASSERT(metrics != NULL); if (metrics == NULL) continue; @@ -436,7 +541,7 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns IM_ASSERT(ft_bitmap); // Allocate new temporary chunk if needed - const int bitmap_size_in_bytes = src_glyph.Info.Width * src_glyph.Info.Height; + const int bitmap_size_in_bytes = src_glyph.Info.Width * src_glyph.Info.Height * 4; if (buf_bitmap_current_used_bytes + bitmap_size_in_bytes > BITMAP_BUFFERS_CHUNK_SIZE) { buf_bitmap_current_used_bytes = 0; @@ -444,9 +549,9 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns } // Blit rasterized pixels to our temporary buffer and keep a pointer to it. - src_glyph.BitmapData = buf_bitmap_buffers.back() + buf_bitmap_current_used_bytes; + src_glyph.BitmapData = (unsigned int*)(buf_bitmap_buffers.back() + buf_bitmap_current_used_bytes); buf_bitmap_current_used_bytes += bitmap_size_in_bytes; - src_tmp.Font.BlitGlyph(ft_bitmap, src_glyph.BitmapData, src_glyph.Info.Width * 1, multiply_enabled ? multiply_table : NULL); + src_tmp.Font.BlitGlyph(ft_bitmap, src_glyph.BitmapData, src_glyph.Info.Width, multiply_enabled ? multiply_table : NULL); src_tmp.Rects[glyph_i].w = (stbrp_coord)(src_glyph.Info.Width + padding); src_tmp.Rects[glyph_i].h = (stbrp_coord)(src_glyph.Info.Height + padding); @@ -462,7 +567,7 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns if (atlas->TexDesiredWidth > 0) atlas->TexWidth = atlas->TexDesiredWidth; else - atlas->TexWidth = (surface_sqrt >= 4096*0.7f) ? 4096 : (surface_sqrt >= 2048*0.7f) ? 2048 : (surface_sqrt >= 1024*0.7f) ? 1024 : 512; + atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; // 5. Start packing // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). @@ -493,25 +598,37 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns // 7. Allocate texture atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight); atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); - atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight); - memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); + if (src_load_color) + { + atlas->TexPixelsRGBA32 = (unsigned int*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight * 4); + memset(atlas->TexPixelsRGBA32, 0, atlas->TexWidth * atlas->TexHeight * 4); + } + else + { + atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight); + memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); + } // 8. Copy rasterized font characters back into the main texture // 9. Setup ImFont and glyphs for runtime + bool tex_use_colors = false; for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) { ImFontBuildSrcDataFT& src_tmp = src_tmp_array[src_i]; if (src_tmp.GlyphsCount == 0) continue; + // When merging fonts with MergeMode=true: + // - We can have multiple input fonts writing into a same destination font. + // - dst_font->ConfigData is != from cfg which is our source configuration. ImFontConfig& cfg = atlas->ConfigData[src_i]; - ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true) + ImFont* dst_font = cfg.DstFont; const float ascent = src_tmp.Font.Info.Ascender; const float descent = src_tmp.Font.Info.Descender; ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); const float font_off_x = cfg.GlyphOffset.x; - const float font_off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f); + const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); const int padding = atlas->TexGlyphPadding; for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) @@ -519,6 +636,8 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns ImFontBuildSrcGlyphFT& src_glyph = src_tmp.GlyphsList[glyph_i]; stbrp_rect& pack_rect = src_tmp.Rects[glyph_i]; IM_ASSERT(pack_rect.was_packed); + if (pack_rect.w == 0 && pack_rect.h == 0) + continue; GlyphInfo& info = src_glyph.Info; IM_ASSERT(info.Width + padding <= pack_rect.w); @@ -529,19 +648,24 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns // Blit from temporary buffer to final texture size_t blit_src_stride = (size_t)src_glyph.Info.Width; size_t blit_dst_stride = (size_t)atlas->TexWidth; - unsigned char* blit_src = src_glyph.BitmapData; - unsigned char* blit_dst = atlas->TexPixelsAlpha8 + (ty * blit_dst_stride) + tx; - for (int y = info.Height; y > 0; y--, blit_dst += blit_dst_stride, blit_src += blit_src_stride) - memcpy(blit_dst, blit_src, blit_src_stride); - - float char_advance_x_org = info.AdvanceX; - float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX); - float char_off_x = font_off_x; - if (char_advance_x_org != char_advance_x_mod) - char_off_x += cfg.PixelSnapH ? (float)(int)((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f; + unsigned int* blit_src = src_glyph.BitmapData; + if (atlas->TexPixelsAlpha8 != NULL) + { + unsigned char* blit_dst = atlas->TexPixelsAlpha8 + (ty * blit_dst_stride) + tx; + for (int y = 0; y < info.Height; y++, blit_dst += blit_dst_stride, blit_src += blit_src_stride) + for (int x = 0; x < info.Width; x++) + blit_dst[x] = (unsigned char)((blit_src[x] >> IM_COL32_A_SHIFT) & 0xFF); + } + else + { + unsigned int* blit_dst = atlas->TexPixelsRGBA32 + (ty * blit_dst_stride) + tx; + for (int y = 0; y < info.Height; y++, blit_dst += blit_dst_stride, blit_src += blit_src_stride) + for (int x = 0; x < info.Width; x++) + blit_dst[x] = blit_src[x]; + } // Register glyph - float x0 = info.OffsetX + char_off_x; + float x0 = info.OffsetX + font_off_x; float y0 = info.OffsetY + font_off_y; float x1 = x0 + info.Width; float y1 = y0 + info.Height; @@ -549,11 +673,17 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns float v0 = (ty) / (float)atlas->TexHeight; float u1 = (tx + info.Width) / (float)atlas->TexWidth; float v1 = (ty + info.Height) / (float)atlas->TexHeight; - dst_font->AddGlyph((ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, char_advance_x_mod); + dst_font->AddGlyph(&cfg, (ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, info.AdvanceX); + + ImFontGlyph* dst_glyph = &dst_font->Glyphs.back(); + IM_ASSERT(dst_glyph->Codepoint == src_glyph.Codepoint); + if (src_glyph.Info.IsColored) + dst_glyph->Colored = tex_use_colors = true; } src_tmp.Rects = NULL; } + atlas->TexPixelsUseColors = tex_use_colors; // Cleanup for (int buf_i = 0; buf_i < buf_bitmap_buffers.Size; buf_i++) @@ -566,53 +696,45 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns return true; } -// Default memory allocators -static void* ImFreeTypeDefaultAllocFunc(size_t size, void* user_data) { IM_UNUSED(user_data); return IM_ALLOC(size); } -static void ImFreeTypeDefaultFreeFunc(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_FREE(ptr); } - -// Current memory allocators -static void* (*GImFreeTypeAllocFunc)(size_t size, void* user_data) = ImFreeTypeDefaultAllocFunc; -static void (*GImFreeTypeFreeFunc)(void* ptr, void* user_data) = ImFreeTypeDefaultFreeFunc; -static void* GImFreeTypeAllocatorUserData = NULL; - // FreeType memory allocation callbacks static void* FreeType_Alloc(FT_Memory /*memory*/, long size) { - return GImFreeTypeAllocFunc((size_t)size, GImFreeTypeAllocatorUserData); + return GImGuiFreeTypeAllocFunc((size_t)size, GImGuiFreeTypeAllocatorUserData); } static void FreeType_Free(FT_Memory /*memory*/, void* block) { - GImFreeTypeFreeFunc(block, GImFreeTypeAllocatorUserData); + GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData); } static void* FreeType_Realloc(FT_Memory /*memory*/, long cur_size, long new_size, void* block) { // Implement realloc() as we don't ask user to provide it. if (block == NULL) - return GImFreeTypeAllocFunc((size_t)new_size, GImFreeTypeAllocatorUserData); + return GImGuiFreeTypeAllocFunc((size_t)new_size, GImGuiFreeTypeAllocatorUserData); if (new_size == 0) { - GImFreeTypeFreeFunc(block, GImFreeTypeAllocatorUserData); + GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData); return NULL; } if (new_size > cur_size) { - void* new_block = GImFreeTypeAllocFunc((size_t)new_size, GImFreeTypeAllocatorUserData); + void* new_block = GImGuiFreeTypeAllocFunc((size_t)new_size, GImGuiFreeTypeAllocatorUserData); memcpy(new_block, block, (size_t)cur_size); - GImFreeTypeFreeFunc(block, GImFreeTypeAllocatorUserData); + GImGuiFreeTypeFreeFunc(block, GImGuiFreeTypeAllocatorUserData); return new_block; } return block; } -bool ImGuiFreeType::BuildFontAtlas(ImFontAtlas* atlas, unsigned int extra_flags) +static bool ImFontAtlasBuildWithFreeType(ImFontAtlas* atlas) { // FreeType memory management: https://www.freetype.org/freetype2/docs/design/design-4.html - FT_MemoryRec_ memory_rec = { 0 }; + FT_MemoryRec_ memory_rec = {}; + memory_rec.user = NULL; memory_rec.alloc = &FreeType_Alloc; memory_rec.free = &FreeType_Free; memory_rec.realloc = &FreeType_Realloc; @@ -626,15 +748,22 @@ bool ImGuiFreeType::BuildFontAtlas(ImFontAtlas* atlas, unsigned int extra_flags) // If you don't call FT_Add_Default_Modules() the rest of code may work, but FreeType won't use our custom allocator. FT_Add_Default_Modules(ft_library); - bool ret = ImFontAtlasBuildWithFreeType(ft_library, atlas, extra_flags); + bool ret = ImFontAtlasBuildWithFreeTypeEx(ft_library, atlas, atlas->FontBuilderFlags); FT_Done_Library(ft_library); return ret; } +const ImFontBuilderIO* ImGuiFreeType::GetBuilderForFreeType() +{ + static ImFontBuilderIO io; + io.FontBuilder_Build = ImFontAtlasBuildWithFreeType; + return &io; +} + void ImGuiFreeType::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data) { - GImFreeTypeAllocFunc = alloc_func; - GImFreeTypeFreeFunc = free_func; - GImFreeTypeAllocatorUserData = user_data; + GImGuiFreeTypeAllocFunc = alloc_func; + GImGuiFreeTypeFreeFunc = free_func; + GImGuiFreeTypeAllocatorUserData = user_data; } diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.h b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.h new file mode 100644 index 0000000000..713e4639e1 --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/freetype/imgui_freetype.h @@ -0,0 +1,50 @@ +// dear imgui: FreeType font builder (used as a replacement for the stb_truetype builder) +// (headers) + +#pragma once + +#include "imgui.h" // IMGUI_API + +// Forward declarations +struct ImFontAtlas; +struct ImFontBuilderIO; + +// Hinting greatly impacts visuals (and glyph sizes). +// - By default, hinting is enabled and the font's native hinter is preferred over the auto-hinter. +// - When disabled, FreeType generates blurrier glyphs, more or less matches the stb_truetype.h +// - The Default hinting mode usually looks good, but may distort glyphs in an unusual way. +// - The Light hinting mode generates fuzzier glyphs but better matches Microsoft's rasterizer. +// You can set those flags globaly in ImFontAtlas::FontBuilderFlags +// You can set those flags on a per font basis in ImFontConfig::FontBuilderFlags +enum ImGuiFreeTypeBuilderFlags +{ + ImGuiFreeTypeBuilderFlags_NoHinting = 1 << 0, // Disable hinting. This generally generates 'blurrier' bitmap glyphs when the glyph are rendered in any of the anti-aliased modes. + ImGuiFreeTypeBuilderFlags_NoAutoHint = 1 << 1, // Disable auto-hinter. + ImGuiFreeTypeBuilderFlags_ForceAutoHint = 1 << 2, // Indicates that the auto-hinter is preferred over the font's native hinter. + ImGuiFreeTypeBuilderFlags_LightHinting = 1 << 3, // A lighter hinting algorithm for gray-level modes. Many generated glyphs are fuzzier but better resemble their original shape. This is achieved by snapping glyphs to the pixel grid only vertically (Y-axis), as is done by Microsoft's ClearType and Adobe's proprietary font renderer. This preserves inter-glyph spacing in horizontal text. + ImGuiFreeTypeBuilderFlags_MonoHinting = 1 << 4, // Strong hinting algorithm that should only be used for monochrome output. + ImGuiFreeTypeBuilderFlags_Bold = 1 << 5, // Styling: Should we artificially embolden the font? + ImGuiFreeTypeBuilderFlags_Oblique = 1 << 6, // Styling: Should we slant the font, emulating italic style? + ImGuiFreeTypeBuilderFlags_Monochrome = 1 << 7, // Disable anti-aliasing. Combine this with MonoHinting for best results! + ImGuiFreeTypeBuilderFlags_LoadColor = 1 << 8, // Enable FreeType color-layered glyphs + ImGuiFreeTypeBuilderFlags_Bitmap = 1 << 9 // Enable FreeType bitmap glyphs +}; + +namespace ImGuiFreeType +{ + // This is automatically assigned when using '#define IMGUI_ENABLE_FREETYPE'. + // If you need to dynamically select between multiple builders: + // - you can manually assign this builder with 'atlas->FontBuilderIO = ImGuiFreeType::GetBuilderForFreeType()' + // - prefer deep-copying this into your own ImFontBuilderIO instance if you use hot-reloading that messes up static data. + IMGUI_API const ImFontBuilderIO* GetBuilderForFreeType(); + + // Override allocators. By default ImGuiFreeType will use IM_ALLOC()/IM_FREE() + // However, as FreeType does lots of allocations we provide a way for the user to redirect it to a separate memory heap if desired. + IMGUI_API void SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data = NULL); + + // Obsolete names (will be removed soon) + // Prefer using '#define IMGUI_ENABLE_FREETYPE' +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + static inline bool BuildFontAtlas(ImFontAtlas* atlas, unsigned int flags = 0) { atlas->FontBuilderIO = GetBuilderForFreeType(); atlas->FontBuilderFlags = flags; return atlas->Build(); } +#endif +} diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/misc/single_file/imgui_single_file.h b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/single_file/imgui_single_file.h new file mode 100644 index 0000000000..6c1fb369fc --- /dev/null +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/misc/single_file/imgui_single_file.h @@ -0,0 +1,18 @@ +// dear imgui: single-file wrapper include +// We use this to validate compiling all *.cpp files in a same compilation unit. +// Users of that technique (also called "Unity builds") can generally provide this themselves, +// so we don't really recommend you use this in your projects. + +// Do this: +// #define IMGUI_IMPLEMENTATION +// Before you include this file in *one* C++ file to create the implementation. +// Using this in your project will leak the contents of imgui_internal.h and ImVec2 operators in this compilation unit. +#include "../../imgui.h" + +#ifdef IMGUI_IMPLEMENTATION +#include "../../imgui.cpp" +#include "../../imgui_demo.cpp" +#include "../../imgui_draw.cpp" +#include "../../imgui_tables.cpp" +#include "../../imgui_widgets.cpp" +#endif diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.cpp b/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.cpp index e746cf6b22..6f68ea7581 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.cpp +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.cpp @@ -29,4 +29,4 @@ namespace ImageProcessing ->Field("Presets", &BuilderSettings::m_presets); } } -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.h index b9e558bf51..500b69f472 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/BuilderSettings.h @@ -30,4 +30,4 @@ namespace ImageProcessing bool m_enablePlatform = true; AZStd::map<AZ::Uuid, PresetSettings> m_presets; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.cpp b/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.cpp index d44295554e..43f2a50535 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.cpp +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.cpp @@ -49,4 +49,4 @@ namespace ImageProcessing ->Field("DiffuseProbePreset", &CubemapSettings::m_diffuseGenPreset); } } -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.h index 2af1f82fe1..edfdde8cbe 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/CubemapSettings.h @@ -49,4 +49,4 @@ namespace ImageProcessing // "cm_diffpreset", the name of the preset to be used for the diffuse probe AZ::Uuid m_diffuseGenPreset; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/ImageProcessingDefines.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/ImageProcessingDefines.h index 16fb111df1..c9fa860240 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/ImageProcessingDefines.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/ImageProcessingDefines.h @@ -105,4 +105,4 @@ namespace ImageProcessing ggx = 5 // same as CP_FILTER_TYPE_GGX. only used for [EnvironmentProbeHDR] }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.cpp b/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.cpp index 721c194797..0285404f50 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.cpp +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.cpp @@ -63,4 +63,4 @@ namespace ImageProcessing } } } -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.h index 7260c4c105..4a2864d2b7 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/MipmapSettings.h @@ -36,4 +36,4 @@ namespace ImageProcessing bool m_normalize; AZ::u32 m_streamableMips; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/PlatformSettings.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/PlatformSettings.h index b6ab685cbd..5cfc7757b2 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/PlatformSettings.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/PlatformSettings.h @@ -31,4 +31,4 @@ namespace ImageProcessing //! pixel formats supported for the platform AZStd::list<EPixelFormat> m_availableFormat; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/BuilderSettings/TextureSettings.h b/Gems/ImageProcessing/Code/Source/BuilderSettings/TextureSettings.h index 8198dab9f0..2ecc2c0a96 100644 --- a/Gems/ImageProcessing/Code/Source/BuilderSettings/TextureSettings.h +++ b/Gems/ImageProcessing/Code/Source/BuilderSettings/TextureSettings.h @@ -168,4 +168,4 @@ namespace ImageProcessing }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Compressors/CTSquisher.h b/Gems/ImageProcessing/Code/Source/Compressors/CTSquisher.h index b1e032ac93..6cb08ac295 100644 --- a/Gems/ImageProcessing/Code/Source/Compressors/CTSquisher.h +++ b/Gems/ImageProcessing/Code/Source/Compressors/CTSquisher.h @@ -35,4 +35,4 @@ namespace ImageProcessing static CryTextureSquisher::ECodingPreset GetCompressPreset(EPixelFormat compressFmt, EPixelFormat uncompressFmt); }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Compressors/Compressor.cpp b/Gems/ImageProcessing/Code/Source/Compressors/Compressor.cpp index cb9eef3988..fe151d8954 100644 --- a/Gems/ImageProcessing/Code/Source/Compressors/Compressor.cpp +++ b/Gems/ImageProcessing/Code/Source/Compressors/Compressor.cpp @@ -55,4 +55,4 @@ namespace ImageProcessing { } -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Compressors/ETC2.h b/Gems/ImageProcessing/Code/Source/Compressors/ETC2.h index 0962c2be4b..d862bead68 100644 --- a/Gems/ImageProcessing/Code/Source/Compressors/ETC2.h +++ b/Gems/ImageProcessing/Code/Source/Compressors/ETC2.h @@ -29,4 +29,4 @@ namespace ImageProcessing EPixelFormat GetSuggestedUncompressedFormat(EPixelFormat compressedfmt, EPixelFormat uncompressedfmt) override; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Compressors/PVRTC.h b/Gems/ImageProcessing/Code/Source/Compressors/PVRTC.h index ac68f00d07..648990a819 100644 --- a/Gems/ImageProcessing/Code/Source/Compressors/PVRTC.h +++ b/Gems/ImageProcessing/Code/Source/Compressors/PVRTC.h @@ -29,4 +29,4 @@ namespace ImageProcessing EPixelFormat GetSuggestedUncompressedFormat(EPixelFormat compressedfmt, EPixelFormat uncompressedfmt) override; }; -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Converters/Cubemap.h b/Gems/ImageProcessing/Code/Source/Converters/Cubemap.h index cc036814e8..76dd8d2c30 100644 --- a/Gems/ImageProcessing/Code/Source/Converters/Cubemap.h +++ b/Gems/ImageProcessing/Code/Source/Converters/Cubemap.h @@ -115,4 +115,4 @@ namespace ImageProcessing static void InitCubemapLayoutInfos(); }; -}//end namspace ImageProcessing \ No newline at end of file +}//end namspace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/Converters/HighPass.cpp b/Gems/ImageProcessing/Code/Source/Converters/HighPass.cpp index 1261795524..7660d02016 100644 --- a/Gems/ImageProcessing/Code/Source/Converters/HighPass.cpp +++ b/Gems/ImageProcessing/Code/Source/Converters/HighPass.cpp @@ -107,4 +107,4 @@ namespace ImageProcessing m_img = newImage; } -} // namespace ImageProcessing \ No newline at end of file +} // namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Source/ImageProcessing_precompiled.h b/Gems/ImageProcessing/Code/Source/ImageProcessing_precompiled.h index 32c0f29d1d..2972414a1f 100644 --- a/Gems/ImageProcessing/Code/Source/ImageProcessing_precompiled.h +++ b/Gems/ImageProcessing/Code/Source/ImageProcessing_precompiled.h @@ -30,4 +30,4 @@ ///////////////////////////////////////////////////////////////////////////// //Type definitions ///////////////////////////////////////////////////////////////////////////// -#include <ImageBuilderBaseType.h> \ No newline at end of file +#include <ImageBuilderBaseType.h> diff --git a/Gems/ImageProcessing/Code/Source/Processing/ImageConvertJob.cpp b/Gems/ImageProcessing/Code/Source/Processing/ImageConvertJob.cpp index d85917be75..cab3918a05 100644 --- a/Gems/ImageProcessing/Code/Source/Processing/ImageConvertJob.cpp +++ b/Gems/ImageProcessing/Code/Source/Processing/ImageConvertJob.cpp @@ -145,4 +145,4 @@ namespace ImageProcessing -}// namespace ImageProcessing \ No newline at end of file +}// namespace ImageProcessing diff --git a/Gems/ImageProcessing/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings b/Gems/ImageProcessing/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings index 0491c1ab85..0417122033 100644 --- a/Gems/ImageProcessing/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings +++ b/Gems/ImageProcessing/Code/Tests/TestAssets/1024x1024_24bit.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /bumptype=none /M=62,18,32,83,50,50 /preset=Diffuse_highQ /mipgentype=kaiser /reduce="es3:0,ios:3,osx_gl:0,pc:4,provo:1" /ser=0 \ No newline at end of file +/autooptimizefile=0 /bumptype=none /M=62,18,32,83,50,50 /preset=Diffuse_highQ /mipgentype=kaiser /reduce="es3:0,ios:3,osx_gl:0,pc:4,provo:1" /ser=0 diff --git a/Gems/InAppPurchases/Code/Include/InAppPurchases/InAppPurchasesInterface.h b/Gems/InAppPurchases/Code/Include/InAppPurchases/InAppPurchasesInterface.h index de8a70f655..6e62e4940b 100644 --- a/Gems/InAppPurchases/Code/Include/InAppPurchases/InAppPurchasesInterface.h +++ b/Gems/InAppPurchases/Code/Include/InAppPurchases/InAppPurchasesInterface.h @@ -157,4 +157,4 @@ namespace InAppPurchases static InAppPurchasesInterface* CreateInstance(); static InAppPurchasesInterface* iapInstance; }; -} \ No newline at end of file +} diff --git a/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.h b/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.h index eae10fb5d7..cb4b22432a 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.h +++ b/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.h @@ -61,4 +61,4 @@ namespace InAppPurchases protected: AZStd::string m_productType; }; -} \ No newline at end of file +} diff --git a/Gems/InAppPurchases/Code/Source/Platform/Android/java/com/amazon/lumberyard/iap/LumberyardInAppBilling.java b/Gems/InAppPurchases/Code/Source/Platform/Android/java/com/amazon/lumberyard/iap/LumberyardInAppBilling.java index d6b2de79bd..c1037594f8 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Android/java/com/amazon/lumberyard/iap/LumberyardInAppBilling.java +++ b/Gems/InAppPurchases/Code/Source/Platform/Android/java/com/amazon/lumberyard/iap/LumberyardInAppBilling.java @@ -362,4 +362,4 @@ public class LumberyardInAppBilling implements PurchasesUpdatedListener private boolean m_setupDone; private int m_numResponses; -} \ No newline at end of file +} diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.h b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.h index bb19b100aa..015a690ef6 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.h +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.h @@ -53,4 +53,4 @@ namespace InAppPurchases public: AZ_RTTI(ProductDetailsApple, "{AAF5C20F-482A-45BC-B975-F5864B4C00C5}", ProductDetails); }; -} \ No newline at end of file +} diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.mm b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.mm index 21aec6df4b..435fcdb3c0 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.mm +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesApple.mm @@ -261,4 +261,4 @@ namespace InAppPurchases { return &m_cache; } -} \ No newline at end of file +} diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.h b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.h index aa958b1bba..d6701a3929 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.h +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.h @@ -28,4 +28,4 @@ -(void) refreshAppReceipt; -(void) initialize; -(void) deinitialize; -@end \ No newline at end of file +@end diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm index 0eeb4a9480..da30cca57d 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm @@ -414,4 +414,4 @@ } } -@end \ No newline at end of file +@end diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Unimplemented/InAppPurchases_Unimplemented.cpp b/Gems/InAppPurchases/Code/Source/Platform/Common/Unimplemented/InAppPurchases_Unimplemented.cpp index b7c6123e5e..58b02b4470 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Unimplemented/InAppPurchases_Unimplemented.cpp +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Unimplemented/InAppPurchases_Unimplemented.cpp @@ -20,4 +20,4 @@ namespace InAppPurchases { return nullptr; } -} \ No newline at end of file +} diff --git a/Gems/LandscapeCanvas/Assets/Editor/Icons/Components/LandscapeCanvas.svg b/Gems/LandscapeCanvas/Assets/Editor/Icons/Components/LandscapeCanvas.svg index 03537cba9e..6a285d145a 100644 --- a/Gems/LandscapeCanvas/Assets/Editor/Icons/Components/LandscapeCanvas.svg +++ b/Gems/LandscapeCanvas/Assets/Editor/Icons/Components/LandscapeCanvas.svg @@ -6,4 +6,4 @@ <g id="icon-/landscape-canvas" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M9.01604658,11.0538724 L9.01776803,11.1874447 C9.05257785,12.9928973 9.46375492,14.0316361 10.4237892,14.194109 C11.2637721,14.3362648 12.1289522,14.281615 12.4683774,13.8728236 C12.2243576,14.6436561 11.786799,15.0283726 11.2432064,15.0050276 L11.1628024,15 C10.2697126,14.9499969 4.33663518,15.0006853 2.94065357,15.0006853 C1.51618254,15.0006853 1,13.8125362 1,12.9942668 L1,11.1874447 L9.01604658,11.0538724 Z M12.1032963,1.00542684 C13.4772665,1.00542684 14.4144185,1.53653244 14.8048119,2.62715459 C15.0172217,3.22055298 15.0167783,4.0875702 14.984086,4.67549141 C14.9699002,4.930602 14.9155203,5.26926762 14.8209464,5.69148827 L14.8048119,5.76263204 L12.3409476,5.76263204 L12.3922574,6.61050948 C12.6085287,10.2562095 12.6909291,12.0861519 12.6160273,12.8306306 C12.6106656,12.883922 12.6042922,12.9362345 12.5969461,12.9875455 C12.1195209,13.5520231 11.4908624,13.7448605 10.7109811,13.5662291 C9.90039726,13.3805653 9.55431776,12.3610546 9.67274261,10.507697 L9.67722531,10.4403451 L2.87565963,10.4985312 L2.86394393,3.00893506 C2.86394393,1.92584113 3.97857862,1.01763722 4.87931521,1.00542684 L5.30226977,1.0021363 C6.66144265,0.995854352 10.8867602,1.00542684 12.1032963,1.00542684 Z M11.6878391,3.45165046 C10.0581662,5.65649883 10.6296409,6.68400996 10.5924179,9.17973908 L10.4675374,8.72232206 C10.1155789,7.44146349 9.80291168,6.42847229 9.20478136,5.84838302 C9.8467528,4.40165455 10.6296409,3.94335808 11.6878391,3.45165046 Z M8.4886756,5.7095582 C9.195913,6.79542643 9.58830956,7.86511342 9.66586526,8.91914425 L9.67174185,9.00945142 L7.27541881,9.01392456 C7.51189788,7.8633395 7.27282494,6.78239777 6.82471695,5.96586613 C6.15255498,4.74036873 5.45218496,4.12960514 3.63326587,3.67996987 C5.826145,3.40441603 7.39750932,4.0326631 8.4886756,5.7095582 Z M3.63326587,5.04904499 C4.88452248,5.04923611 5.99819077,5.98965045 6.39573967,6.80041513 C6.65130682,7.32144496 6.81665748,8.02511214 6.89179163,8.91146947 L6.89976861,9.01070543 L5.17523716,9.01392456 C5.39070501,8.3118447 5.40971903,7.71417153 5.23227921,7.22072261 L5.19741529,7.12619278 C4.91797291,6.38691943 4.36059265,5.32901258 3.63326587,5.04904499 Z M11.3973564,2.36759406 C9.40481597,3.58066591 9.09905557,4.61542723 8.94624087,5.28787533 C8.7831357,4.81474775 8.25537971,4.3106199 7.72114279,4.17880234 C8.580003,2.91895196 10.0968289,2.46779695 11.3973564,2.36759406 Z M12.8092868,2.70576481 C13.2468709,2.21649345 14.1089872,2.21649345 14.4404899,2.98201632 C14.6614917,3.49236491 14.6614917,4.25328275 14.4404899,5.26476987 L14.4404899,5.26476987 L12.2978874,5.26476987 C12.2734322,4.76441458 12.2734322,4.39215755 12.2978874,4.14799878 L12.2978874,4.14799878 L12.3174743,3.95379056 C12.3571436,3.59403429 12.4426623,3.11569487 12.8092868,2.70576481 Z" id="Shape" fill="#8BDD15"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/LandscapeCanvas/landscapeCanvasIcon.svg b/Gems/LandscapeCanvas/landscapeCanvasIcon.svg index 6b3b606032..94fbee9425 100644 --- a/Gems/LandscapeCanvas/landscapeCanvasIcon.svg +++ b/Gems/LandscapeCanvas/landscapeCanvasIcon.svg @@ -8,4 +8,4 @@ <rect id="Rectangle" fill="#3D3D3D" x="0" y="0" width="140" height="80"></rect> <polygon id="Shape" fill="#FFFFFF" points="69.9291437 12.7103589 63.4919127 12.7103589 63.4919127 4.30424783 76.514937 4.30424783 76.3305429 12.7103589 72.1935831 12.7103589 72.1537593 23.0891659 81.0324367 14.4474037 81.0324367 11.8582305 93.6679338 11.8582305 93.6679338 19.7945198 81.0043056 19.7945198 81.0043056 17.1976538 72.1537593 25.521985 72.1537593 29.35067 77.5682456 29.35067 77.5682456 37.6187971 72.3375203 37.6187971 72.3375203 47.9418364 76.7082732 47.9418364 76.7082732 51.4151103 85.3971145 52.9130378 90.327237 48.2425518 84.9091791 48.2425518 84.9091791 39.8390522 91.6580126 39.8390522 92.2999607 38.3272686 89.0854177 30.6244826 84.9091791 30.6244826 84.9091791 24.3027828 94.4748884 24.3027828 94.4748884 30.6244826 90.9039382 30.6244826 93.6744238 36.9738504 100.701172 28.3395533 100.701172 25.2039137 113.577854 25.2039137 113.577854 33.2408436 100.701172 33.3080913 100.701172 31.4348761 93.6744238 39.8390522 97.7161385 39.8390522 97.7161385 48.2425518 93.6744238 48.2425518 85.9563685 55.3230284 76.7082732 53.4876618 76.7082732 55.9340823 71.7835458 55.91713 71.7835458 63.7002788 78.9420954 63.7002788 78.9420954 74.3042478 61.2530933 74.3042478 61.2530933 63.7002788 68.4195359 63.7002788 68.4195359 55.91713 63.9740565 55.91713 63.9740565 52.0433729 49.1527069 48.9869234 47.9517908 44.4835255 42.3802413 44.4468036 42.3802413 36.3033119 46.7420173 36.3033119 46.1535358 34.0629208 40.8514785 31.97108 40.8514785 34.1393792 31.3658527 34.1393792 31.3658527 27.6010933 40.8514785 27.6010933 40.8514785 29.5689518 45.6535885 31.4465597 44.4597984 24.3027828 38.0634802 24.3027828 38.0634802 16.2272226 51.080966 16.2502878 51.080966 24.3027828 46.7420173 24.3027828 48.7523576 36.3033119 55.1889625 36.3033119 55.1889625 44.4468036 50.5333814 44.4835255 51.4813154 47.4029319 63.9740565 50.0346704 63.9740565 47.9418364 69.7176619 47.9418364 69.7176619 37.6187971 64.7041658 37.6187971 64.7041658 29.35067 70.0559575 29.35067 70.0559575 25.521985 64.7041658 21.7644459 64.7041658 23.5880051 56.3622815 23.5880051 56.3622815 17.1976538 64.7041658 17.1976538 64.7041658 19.3944384 70.0878754 23.0891659"></polygon> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/LmbrCentral/Assets/Scripts/AI/Navigation.xml b/Gems/LmbrCentral/Assets/Scripts/AI/Navigation.xml index 7f9e06537a..5f9081a76d 100644 --- a/Gems/LmbrCentral/Assets/Scripts/AI/Navigation.xml +++ b/Gems/LmbrCentral/Assets/Scripts/AI/Navigation.xml @@ -2,4 +2,4 @@ <AgentTypes> <AgentType name="MediumSizedCharacters" voxelSize="0.125, 0.125, 0.125" radius="4" height="16" climbableHeight="3" maxWaterDepth="8" /> </AgentTypes> -</Navigation> \ No newline at end of file +</Navigation> diff --git a/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake b/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake index f0666e4819..73e1fb82c1 100644 --- a/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake +++ b/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake @@ -23,4 +23,4 @@ add_custom_command(TARGET LmbrCentral.Editor POST_BUILD $<TARGET_FILE_DIR:LmbrCentral.Editor>/lrelease.exe COMMENT "Patching lrelease..." VERBATIM -) \ No newline at end of file +) diff --git a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationAreaComponent.h b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationAreaComponent.h index 2ef224fa46..da366039a6 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationAreaComponent.h +++ b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationAreaComponent.h @@ -124,4 +124,4 @@ namespace LmbrCentral bool m_switchingToGameMode = false; ///< Set if GameView was started so we know not to destroy navigation areas in Deactivate. bool m_compositionChanging = false; ///< Set if composition is changing so we know not to destroy navigation areas while scrubbing. }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationSeedComponent.h b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationSeedComponent.h index e98968ccb2..b70741de41 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationSeedComponent.h +++ b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationSeedComponent.h @@ -47,4 +47,4 @@ namespace LmbrCentral // TransformNotificationBus void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.cpp b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.cpp index 4098c3d5c7..d4fbe6ef3d 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.cpp +++ b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.cpp @@ -25,4 +25,4 @@ namespace LmbrCentral agentTypes.insert(agentTypes.begin(), ""); // insert blank element return agentTypes; } -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.h b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.h index 2884961d17..2564a9c462 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.h +++ b/Gems/LmbrCentral/Code/Source/Ai/EditorNavigationUtil.h @@ -21,4 +21,4 @@ namespace LmbrCentral * Request available AgentTypes to populate ComboBox drop down. */ AZStd::vector<AZStd::string> PopulateAgentTypeList(); -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.cpp b/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.cpp index 5299bc9cd3..58fa845487 100644 --- a/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.cpp @@ -218,4 +218,4 @@ namespace LmbrCentral GenerateWireCapsuleMesh( radius, height, sides, capSegments, lineBufferOut); } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.h b/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.h index 60185c4e57..35ca80035b 100644 --- a/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.h +++ b/Gems/LmbrCentral/Code/Source/Geometry/GeometrySystemComponent.h @@ -50,4 +50,4 @@ namespace LmbrCentral AZStd::vector<AZ::u32>& indexBufferOut, AZStd::vector<AZ::Vector3>& lineBufferOut) override; }; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp index 29dc8a92aa..0f6b084201 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp @@ -39,7 +39,6 @@ #include "Rendering/LightComponent.h" #include "Rendering/HighQualityShadowComponent.h" #include "Rendering/MeshComponent.h" -#include "Rendering/FogVolumeComponent.h" #include "Rendering/GeomCacheComponent.h" #include "Ai/NavigationComponent.h" #include "Scripting/TagComponent.h" @@ -241,7 +240,6 @@ namespace LmbrCentral StereoRendererComponent::CreateDescriptor(), NavigationSystemComponent::CreateDescriptor(), GeometrySystemComponent::CreateDescriptor(), - FogVolumeComponent::CreateDescriptor(), RandomTimedSpawnerComponent::CreateDescriptor(), GeometryCacheComponent::CreateDescriptor(), SphereShapeDebugDisplayComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp index c658f5ebb9..b20ce12f35 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp @@ -34,7 +34,6 @@ #include "Rendering/EditorEnvProbeComponent.h" #include "Rendering/EditorHighQualityShadowComponent.h" #include "Rendering/EditorMeshComponent.h" -#include "Rendering/EditorFogVolumeComponent.h" #include "Rendering/EditorGeomCacheComponent.h" #include "Scripting/EditorLookAtComponent.h" #include "Scripting/EditorRandomTimedSpawnerComponent.h" @@ -104,7 +103,6 @@ namespace LmbrCentral EditorCommentComponent::CreateDescriptor(), EditorNavigationAreaComponent::CreateDescriptor(), EditorNavigationSeedComponent::CreateDescriptor(), - EditorFogVolumeComponent::CreateDescriptor(), EditorRandomTimedSpawnerComponent::CreateDescriptor(), EditorGeometryCacheComponent::CreateDescriptor(), EditorSpawnerComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.h b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.h index c4da49b687..f180c21d8d 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.h +++ b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.h @@ -42,4 +42,4 @@ namespace LmbrCentral bool AddMeshComponentWithAssetId(const AZ::EntityId& targetEntity, const AZ::Uuid& meshAssetId) override; }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/DecalComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/DecalComponent.cpp index b44d6fa1eb..1892b930b7 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/DecalComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/DecalComponent.cpp @@ -100,49 +100,10 @@ namespace LmbrCentral void DecalComponent::Activate() { - AZ::Transform transform = AZ::Transform::CreateIdentity(); - EBUS_EVENT_ID_RESULT(transform, GetEntityId(), AZ::TransformBus, GetWorldTM); - - SDecalProperties decalProperties = m_configuration.GetDecalProperties(transform); - - m_decalRenderNode = static_cast<IDecalRenderNode*>(gEnv->p3DEngine->CreateRenderNode(eERType_Decal)); - if (m_decalRenderNode) - { - m_decalRenderNode->SetRndFlags(m_decalRenderNode->GetRndFlags() | ERF_COMPONENT_ENTITY); - m_decalRenderNode->SetDecalProperties(decalProperties); - m_decalRenderNode->SetMinSpec(static_cast<int>(decalProperties.m_minSpec)); - m_decalRenderNode->SetMatrix(AZTransformToLYTransform(transform)); - m_decalRenderNode->SetViewDistanceMultiplier(m_configuration.m_viewDistanceMultiplier); - - const int configSpec = gEnv->pSystem->GetConfigSpec(true); - if (!m_configuration.m_visible || static_cast<AZ::u32>(configSpec) < static_cast<AZ::u32>(m_configuration.m_minSpec)) - { - Hide(); - } - } - - m_materialBusHandler->Activate(m_decalRenderNode, m_entity->GetId()); - - DecalComponentRequestBus::Handler::BusConnect(GetEntityId()); - RenderNodeRequestBus::Handler::BusConnect(GetEntityId()); - AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); - MaterialOwnerRequestBus::Handler::BusConnect(GetEntityId()); } void DecalComponent::Deactivate() { - DecalComponentRequestBus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - MaterialOwnerRequestBus::Handler::BusDisconnect(); - - m_materialBusHandler->Deactivate(); - - if (m_decalRenderNode) - { - gEnv->p3DEngine->DeleteRenderNode(m_decalRenderNode); - m_decalRenderNode = nullptr; - } } void DecalComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, const AZ::Transform& world) diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorDecalComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorDecalComponent.cpp index 0cb3dd78e7..3d79c4d2ae 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorDecalComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/EditorDecalComponent.cpp @@ -190,50 +190,10 @@ namespace LmbrCentral void EditorDecalComponent::Activate() { Base::Activate(); - - AZ::EntityId entityId = GetEntityId(); - - IEditor* editor = nullptr; - EBUS_EVENT_RESULT(editor, AzToolsFramework::EditorRequests::Bus, GetEditor); - - m_configuration.m_editorEntityId = entityId; - m_decalRenderNode = static_cast<IDecalRenderNode*>(editor->Get3DEngine()->CreateRenderNode(eERType_Decal)); - RefreshDecal(); - - MaterialOwnerRequestBus::Handler::BusConnect(entityId); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); - DecalComponentEditorRequests::Bus::Handler::BusConnect(entityId); - RenderNodeRequestBus::Handler::BusConnect(entityId); - AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(entityId); - AzToolsFramework::EditorVisibilityNotificationBus::Handler::BusConnect(entityId); - AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); - AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(entityId); - AzFramework::BoundsRequestBus::Handler::BusConnect(entityId); } void EditorDecalComponent::Deactivate() { - MaterialOwnerRequestBus::Handler::BusDisconnect(); - DecalComponentEditorRequests::Bus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); - AzToolsFramework::EditorVisibilityNotificationBus::Handler::BusDisconnect(); - AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); - AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect(); - AzFramework::BoundsRequestBus::Handler::BusDisconnect(); - - m_configuration.m_editorEntityId.SetInvalid(); - - if (m_decalRenderNode) - { - IEditor* editor = nullptr; - EBUS_EVENT_RESULT(editor, AzToolsFramework::EditorRequests::Bus, GetEditor); - editor->Get3DEngine()->DeleteRenderNode(m_decalRenderNode); - - m_decalRenderNode = nullptr; - } - Base::Deactivate(); } diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp deleted file mode 100644 index d03f884e6f..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include <AzCore/RTTI/BehaviorContext.h> -#include <AzCore/Serialization/EditContext.h> -#include <AzCore/Component/TransformBus.h> - -#include <LmbrCentral/Shape/BoxShapeComponentBus.h> -#include <IEntityRenderState.h> - -#include "EditorFogVolumeComponent.h" - -namespace LmbrCentral -{ - void EditorFogVolumeComponent::Activate() - { - Base::Activate(); - - const auto entityId = GetEntityId(); - - m_configuration.SetEntityId(entityId); - m_configuration.UpdateSizeFromEntityShape(); - - m_fogVolume.SetEntityId(entityId); - m_fogVolume.CreateFogVolumeRenderNode(m_configuration); - - RefreshFog(); - - RenderNodeRequestBus::Handler::BusConnect(entityId); - FogVolumeComponentRequestBus::Handler::BusConnect(entityId); - ShapeComponentNotificationsBus::Handler::BusConnect(entityId); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); - AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); - } - - void EditorFogVolumeComponent::Deactivate() - { - Base::Deactivate(); - - m_fogVolume.DestroyRenderNode(); - m_fogVolume.SetEntityId(AZ::EntityId()); - m_configuration.SetEntityId(AZ::EntityId()); - - AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - ShapeComponentNotificationsBus::Handler::BusDisconnect(); - FogVolumeComponentRequestBus::Handler::BusDisconnect(); - RenderNodeRequestBus::Handler::BusDisconnect(); - } - - void EditorFogVolumeComponent::Reflect(AZ::ReflectContext* context) - { - AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); - - EditorFogVolumeConfiguration::Reflect(context); - - if (serializeContext) - { - serializeContext->Class<EditorFogVolumeComponent, EditorComponentBase>() - ->Version(1) - ->Field("FogVolumeConfiguration", &EditorFogVolumeComponent::m_configuration); - - if (AZ::EditContext* editContext = serializeContext->GetEditContext()) - { - editContext->Class<EditorFogVolumeComponent>( - "Fog Volume", "Allows to specify an area with a fog") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Category, "Environment") - ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/FogVolume.svg") - ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/FogVolume.png") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) - ->Attribute(AZ::Edit::Attributes::HelpPageURL, "http://docs.aws.amazon.com/console/lumberyard/userguide/fog-volume-component") - ->Attribute(AZ::Edit::Attributes::AutoExpand, false) - ->DataElement(0, &EditorFogVolumeComponent::m_configuration, "Settings", "Fog configuration") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ; - } - } - - if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) - { - behaviorContext->Class<EditorFogVolumeComponent>()->RequestBus("EditorFogVolumeComponentRequestBus"); - FogVolumeComponent::ExposeRequestsBusInBehaviorContext(behaviorContext, "EditorFogVolumeComponentRequestBus"); - } - } - - IRenderNode* EditorFogVolumeComponent::GetRenderNode() - { - return m_fogVolume.GetRenderNode(); - } - - float EditorFogVolumeComponent::GetRenderNodeRequestBusOrder() const - { - return FogVolumeComponent::s_renderNodeRequestBusOrder; - } - - void EditorFogVolumeComponent::RefreshFog() - { - m_fogVolume.UpdateFogVolumeProperties(m_configuration); - m_fogVolume.UpdateRenderingFlags(m_configuration); - m_fogVolume.UpdateFogVolumeTransform(); - } - - void EditorFogVolumeComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, [[maybe_unused]] const AZ::Transform& world) - { - // Entities transform component calls OnTransformChanged before this component is activated - // This only happens during undo operations so we guard against that in the Editor component - if (m_fogVolume.GetRenderNode()) - { - RefreshFog(); - } - } - - void EditorFogVolumeComponent::OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) - { - if (changeReason == ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged) - { - m_configuration.UpdateSizeFromEntityShape(); - RefreshFog(); - } - } - - void EditorFogVolumeComponent::OnEditorSpecChange() - { - RefreshFog(); - } - - void EditorFogVolumeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) - { - return FogVolumeComponent::GetRequiredServices(required); - } - - void EditorFogVolumeComponent::BuildGameEntity(AZ::Entity* gameEntity) - { - FogVolumeComponent* fogComponent = gameEntity->CreateComponent<FogVolumeComponent>(); - if (fogComponent) - { - fogComponent->SetConfiguration(m_configuration); - } - } - - void EditorFogVolumeConfiguration::Reflect(AZ::ReflectContext * context) - { - if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) - { - serializeContext->Class<EditorFogVolumeConfiguration, FogVolumeConfiguration>()-> - Version(1); - - if (AZ::EditContext* editContext = serializeContext->GetEditContext()) - { - editContext->Class<FogVolumeConfiguration>("Configuration", "Fog Volume configuration") - - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &FogVolumeConfiguration::m_volumeType, - "Volume type", "Shape of the fog") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->EnumAttribute(FogVolumeType::RectangularPrism, "Cuboid") - ->EnumAttribute(FogVolumeType::Ellipsoid, "Ellipsoid") - - ->DataElement(AZ::Edit::UIHandlers::Color, &FogVolumeConfiguration::m_color, - "Color", "Fog color") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_useGlobalFogColor, - "Use global fog color", "If true, the Color property is ignored. Instead, the current global fog color is used") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_globalDensity, - "Fog Density", "Controls the density of the fog. The higher the value the more dense the fog and the less you'll be able to see objects behind or inside the fog volume") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ->Attribute(AZ::Edit::Attributes::Max, 1000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityOffset, - "Density offset", "Offset fog density, used in conjunction with the GlobalDensity parameter") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -1000.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_nearCutoff, - "Near cutoff", "Stop rendering the object, depending on camera distance to object") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 2.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_softEdges, - "Soft edges", "Specifies a factor that is used to soften the edges of the fog volume when viewed from outside") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_windInfluence, - "Wind influence (Volumetric Fog only)", "Controls the influence of the wind (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 20.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Rendering General") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_ignoresVisAreas, - "Ignore vis. areas", "Controls whether this entity should respond to visareas") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &FogVolumeConfiguration::m_affectsThisAreaOnly, - "Affect this area only", "Set this parameter to false to make this entity affect in multiple visareas") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - - ->DataElement(0, &FogVolumeConfiguration::m_viewDistMultiplier, - "View distance multiplier", "Adjusts max view distance. If 1.0 then default is used. 1.1 would be 10% further than default.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Suffix, "x") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - - ->DataElement(AZ::Edit::UIHandlers::ComboBox, &FogVolumeConfiguration::m_minSpec, - "Minimum spec", "Min spec for the fog to be active.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->EnumAttribute(EngineSpec::Never, "Never") - ->EnumAttribute(EngineSpec::VeryHigh, "Very high") - ->EnumAttribute(EngineSpec::High, "High") - ->EnumAttribute(EngineSpec::Medium, "Medium") - ->EnumAttribute(EngineSpec::Low, "Low") - - ->ClassElement(AZ::Edit::ClassElements::Group, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_hdrDynamic, - "HDR Dynamic (Non-Volumetric Fog)", "Specifies how much brighter than the default 255,255,255 white the fog is (Non-Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 20.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Fall Off Settings") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffDirLong, - "Longitude", "Controls the longitude of the world space fall off direction of the fog. 0 represents East, rotation is counter-clockwise") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 360.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffDirLatitude, - "Latitude", "Controls the latitude of the world space fall off direction of the fog. 90 lets the fall off direction point upwards in world space") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 360.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffShift, - "Shift", "Controls how much to shift the fog density distribution along the fall off direction in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -50.0f) - ->Attribute(AZ::Edit::Attributes::Max, 50.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_fallOffScale, - "Scale", "Scales the density distribution along the fall off direction. Higher values will make the fog fall off more rapidly and generate thicker fog layers along the negative fall off direction") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -50.0f) - ->Attribute(AZ::Edit::Attributes::Max, 50.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Ramp (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampStart, - "Start", "Specifies the start distance of fog density ramp in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 30000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampEnd, - "End", "Specifies the end distance of fog density ramp in world units") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 30000.0f) - ->Attribute(AZ::Edit::Attributes::Step, 1.0f) - ->Attribute(AZ::Edit::Attributes::Suffix, "m") - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_rampInfluence, - "Influence", "Controls the influence of fog density ramp") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->ClassElement(AZ::Edit::ClassElements::Group, "Density Noise (Volumetric Fog only)") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseScale, - "Scale", "Scales the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 10.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseOffset, - "Offset", "Offsets the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, -2.0f) - ->Attribute(AZ::Edit::Attributes::Max, 2.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Slider, &FogVolumeConfiguration::m_densityNoiseTimeFrequency, - "Time frequency", "Controls the time frequency of the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.01f) - - ->DataElement(AZ::Edit::UIHandlers::Default, &FogVolumeConfiguration::m_densityNoiseFrequency, - "Spatial frequency", "Controls the spatial frequency of the noise for the density") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &FogVolumeConfiguration::PropertyChanged) - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 10000.0f) - ; - } - } - } - - AZ::Crc32 EditorFogVolumeConfiguration::PropertyChanged() - { - if (m_entityId.IsValid()) - { - FogVolumeComponentRequestBus::Event(m_entityId, &FogVolumeComponentRequestBus::Events::RefreshFog); - } - return AZ::Edit::PropertyRefreshLevels::None; - } -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h deleted file mode 100644 index d78e180f6b..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorFogVolumeComponent.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <AzCore/base.h> -#include <AzCore/Component/Component.h> -#include <AzCore/Component/ComponentBus.h> -#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h> -#include <AzToolsFramework/API/ToolsApplicationAPI.h> - -#include <LmbrCentral/Rendering/RenderNodeBus.h> -#include <LmbrCentral/Shape/ShapeComponentBus.h> - -#include "FogVolumeComponent.h" -#include "FogVolumeRequestsHandler.h" - -namespace LmbrCentral -{ - class EditorFogVolumeConfiguration - : public FogVolumeConfiguration - { - public: - AZ_TYPE_INFO(EditorFogVolumeConfiguration, "{9D431EA0-92F9-4A00-96C6-28B189A6EE56}"); - - static void Reflect(AZ::ReflectContext* context); - AZ::Crc32 PropertyChanged() override; - }; - - /** - * In-editor fog volume component. - */ - class EditorFogVolumeComponent - : public AzToolsFramework::Components::EditorComponentBase - , private RenderNodeRequestBus::Handler - , private FogVolumeComponentRequestsBusHandler - , private AZ::TransformNotificationBus::Handler - , private ShapeComponentNotificationsBus::Handler - , private AzToolsFramework::EditorEvents::Bus::Handler - { - private: - using Base = AzToolsFramework::Components::EditorComponentBase; - - public: - AZ_EDITOR_COMPONENT(EditorFogVolumeComponent, "{8CA5AB61-96D8-482F-B07C-DAD72ED73646}"); - - ~EditorFogVolumeComponent() override = default; - - // AZ::Component interface implementation - void Activate() override; - void Deactivate() override; - - static void Reflect(AZ::ReflectContext* context); - - // RenderNodeRequestBus::Handler - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - - // FogVolumeComponentRequestBus::Handler - void RefreshFog() override; - - // TransformNotificationBus::Handler - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - - // ShapeComponentNotificationsBus::Handler - void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) override; - - // AzToolsFramework::EditorEvents::Handler - void OnEditorSpecChange() override; - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); - - void BuildGameEntity(AZ::Entity* gameEntity) override; - - protected: - FogVolumeConfiguration& GetConfiguration() override - { - return m_configuration; - } - - private: - EditorFogVolumeConfiguration m_configuration; - FogVolume m_fogVolume; - }; -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.cpp index b50eeb793a..657f6c2b51 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.cpp @@ -344,4 +344,4 @@ namespace LmbrCentral m_currentWorldTransform = world; } -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.h index 5f7ce51cf5..9fd64750a2 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.h +++ b/Gems/LmbrCentral/Code/Source/Rendering/EditorGeomCacheComponent.h @@ -130,4 +130,4 @@ namespace LmbrCentral AZ::Transform m_currentWorldTransform; }; -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EditorLightComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EditorLightComponent.cpp index f46f60dd7b..e9ac845a88 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EditorLightComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/EditorLightComponent.cpp @@ -805,7 +805,10 @@ namespace LmbrCentral AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); - gEnv->p3DEngine->FreeRenderNodeState(&m_cubemapPreview); + if (gEnv->p3DEngine) + { + gEnv->p3DEngine->FreeRenderNodeState(&m_cubemapPreview); + } m_light.DestroyRenderLight(); m_light.SetEntity(AZ::EntityId()); @@ -903,6 +906,11 @@ namespace LmbrCentral void EditorLightComponent::OnViewCubemapChanged() { + if (!gEnv->p3DEngine) + { + return; + } + if (m_viewCubemap) { gEnv->p3DEngine->RegisterEntity(&m_cubemapPreview); @@ -1944,6 +1952,11 @@ namespace LmbrCentral AzToolsFramework::EditorRequestBus::BroadcastResult(m_editor, &AzToolsFramework::EditorRequests::GetEditor); } + if (!m_editor->Get3DEngine()) + { + return; + } + if (!m_materialManager) { m_materialManager = m_editor->Get3DEngine()->GetMaterialManager(); diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.cpp index 3675b6837e..1462e0bf4c 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.cpp @@ -59,4 +59,4 @@ namespace LmbrCentral ->Version(1); } } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.h index c5f99467d4..d3c7914f36 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.h +++ b/Gems/LmbrCentral/Code/Source/Rendering/EntityDebugDisplayComponent.h @@ -64,4 +64,4 @@ namespace LmbrCentral AZ::Transform m_currentEntityTransform; ///< Stores the transform of the entity. }; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp deleted file mode 100644 index 458c76377e..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include <AzCore/Serialization/SerializeContext.h> -#include <LmbrCentral/Shape/BoxShapeComponentBus.h> -#include <MathConversion.h> -#include <I3DEngine.h> - -#include "FogVolumeCommon.h" -#include "FogVolumeComponent.h" - -#include <AzCore/Component/TransformBus.h> - -namespace LmbrCentral -{ - FogVolume::FogVolume() - : m_fogRenderNode(nullptr) - { - } - - FogVolume::~FogVolume() - { - DestroyRenderNode(); - } - - void FogVolume::CreateFogVolumeRenderNode(const FogVolumeConfiguration& fogVolumeConfig) - { - AZ_Assert(m_entityId.IsValid(), "[FogVolumeCommon/FogVolumeComponent Component] Entity id is invalid"); - DestroyRenderNode(); - - m_fogRenderNode = static_cast<IFogVolumeRenderNode*>(gEnv->p3DEngine->CreateRenderNode(eERType_FogVolume)); - m_fogRenderNode->SetMinSpec(static_cast<int>(fogVolumeConfig.m_minSpec)); - m_fogRenderNode->SetViewDistanceMultiplier(fogVolumeConfig.m_viewDistMultiplier); - - UpdateFogVolumeProperties(fogVolumeConfig); - UpdateFogVolumeTransform(); - } - - void FogVolume::DestroyRenderNode() - { - if (m_fogRenderNode != nullptr) - { - m_fogRenderNode->ReleaseNode(); - m_fogRenderNode = nullptr; - } - } - - void FogVolume::UpdateFogVolumeProperties(const FogVolumeConfiguration& fogVolumeConfig) - { - AZ_Assert(m_fogRenderNode != nullptr, "[FogVolumeCommon/FogVolumeComponent Component] Trying to updated null render node"); - - SFogVolumeProperties fogProperties; - FogUtils::FogConfigToFogParams(fogVolumeConfig, fogProperties); - - m_fogRenderNode->SetFogVolumeProperties(fogProperties); - } - - void FogVolume::UpdateFogVolumeTransform() - { - AZ_Assert(m_fogRenderNode != nullptr, "[FogVolumeCommon/FogVolumeComponent Component] Trying to updated null render node"); - - AZ::Transform parentTransform = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(parentTransform, m_entityId, &AZ::TransformBus::Events::GetWorldTM); - - m_fogRenderNode->SetScale(AZVec3ToLYVec3(parentTransform.GetScale())); - m_fogRenderNode->SetMatrix(AZTransformToLYTransform(parentTransform)); - } - - void FogVolume::UpdateRenderingFlags(const FogVolumeConfiguration& fogVolumeConfig) - { - if (m_fogRenderNode) - { - m_fogRenderNode->SetMinSpec(static_cast<AZ::u32>(fogVolumeConfig.m_minSpec)); - - if (gEnv && gEnv->p3DEngine) - { - const int configSpec = gEnv->pSystem->GetConfigSpec(true); - - AZ::u32 rendFlags = static_cast<AZ::u32>(m_fogRenderNode->GetRndFlags()); - - const bool hidden = static_cast<AZ::u32>(configSpec) < static_cast<AZ::u32>(fogVolumeConfig.m_minSpec); - if (hidden) - { - rendFlags |= ERF_HIDDEN; - } - else - { - rendFlags &= ~ERF_HIDDEN; - } - - rendFlags |= ERF_COMPONENT_ENTITY; - m_fogRenderNode->SetRndFlags(rendFlags); - } - } - } - - void FogUtils::FogConfigToFogParams(const LmbrCentral::FogVolumeConfiguration& configuration, SFogVolumeProperties& fogVolumeProperties) - { - AZ_Assert(configuration.m_volumeType != FogVolumeType::None, "[FogConfigToFogParams] Attempting to create a fog with invalid volume type") - - fogVolumeProperties.m_volumeType = static_cast<int>(configuration.m_volumeType); - fogVolumeProperties.m_size = AZVec3ToLYVec3(configuration.m_size); - fogVolumeProperties.m_color = AZColorToLYVec3(configuration.m_color); - fogVolumeProperties.m_useGlobalFogColor = configuration.m_useGlobalFogColor; - fogVolumeProperties.m_ignoresVisAreas = configuration.m_ignoresVisAreas; - fogVolumeProperties.m_affectsThisAreaOnly = configuration.m_affectsThisAreaOnly; - - fogVolumeProperties.m_globalDensity = max(0.01f, configuration.m_globalDensity); - fogVolumeProperties.m_densityOffset = configuration.m_densityOffset; - fogVolumeProperties.m_nearCutoff = configuration.m_nearCutoff; - fogVolumeProperties.m_fHDRDynamic = configuration.m_hdrDynamic; - fogVolumeProperties.m_softEdges = configuration.m_softEdges; - - fogVolumeProperties.m_heightFallOffDirLong = configuration.m_fallOffDirLong; - fogVolumeProperties.m_heightFallOffDirLati = configuration.m_fallOffDirLatitude; - fogVolumeProperties.m_heightFallOffShift = configuration.m_fallOffShift; - fogVolumeProperties.m_heightFallOffScale = configuration.m_fallOffScale; - - fogVolumeProperties.m_rampStart = configuration.m_rampStart; - fogVolumeProperties.m_rampEnd = configuration.m_rampEnd; - fogVolumeProperties.m_rampInfluence = configuration.m_rampInfluence; - fogVolumeProperties.m_windInfluence = configuration.m_windInfluence; - - fogVolumeProperties.m_densityNoiseScale = configuration.m_densityNoiseScale; - fogVolumeProperties.m_densityNoiseOffset = configuration.m_densityNoiseOffset; - fogVolumeProperties.m_densityNoiseTimeFrequency = configuration.m_densityNoiseTimeFrequency; - fogVolumeProperties.m_densityNoiseFrequency = AZVec3ToLYVec3(configuration.m_densityNoiseFrequency); - } - - void FogVolumeConfiguration::Reflect(AZ::ReflectContext * context) - { - if (AZ::SerializeContext *serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) - { - serializeContext->Class<FogVolumeConfiguration>() - ->Version(1) - ->Field("VolumeType", &FogVolumeConfiguration::m_volumeType) - ->Field("Color", &FogVolumeConfiguration::m_color) - ->Field("HdrDynamic", &FogVolumeConfiguration::m_hdrDynamic) - ->Field("UseGlobalFogColor", &FogVolumeConfiguration::m_useGlobalFogColor) - ->Field("SoftEdges", &FogVolumeConfiguration::m_softEdges) - ->Field("WindInfluence", &FogVolumeConfiguration::m_windInfluence) - ->Field("GlobalDensity", &FogVolumeConfiguration::m_globalDensity) - ->Field("DensityOffset", &FogVolumeConfiguration::m_densityOffset) - ->Field("NearCutoff", &FogVolumeConfiguration::m_nearCutoff) - ->Field("EngineSpec", &FogVolumeConfiguration::m_minSpec) - ->Field("DistMult", &FogVolumeConfiguration::m_viewDistMultiplier) - ->Field("IgnoresVisAreas", &FogVolumeConfiguration::m_ignoresVisAreas) - ->Field("AffectsThisAreaOnly", &FogVolumeConfiguration::m_affectsThisAreaOnly) - ->Field("FallOffDirLong", &FogVolumeConfiguration::m_fallOffDirLong) - ->Field("FallOffDirLatitude", &FogVolumeConfiguration::m_fallOffDirLatitude) - ->Field("FallOffShift", &FogVolumeConfiguration::m_fallOffShift) - ->Field("FallOffScale", &FogVolumeConfiguration::m_fallOffScale) - ->Field("RampStart", &FogVolumeConfiguration::m_rampStart) - ->Field("RampEnd", &FogVolumeConfiguration::m_rampEnd) - ->Field("RampInfluence", &FogVolumeConfiguration::m_rampInfluence) - ->Field("DensityNoiseScale", &FogVolumeConfiguration::m_densityNoiseScale) - ->Field("DensityNoiseOffset", &FogVolumeConfiguration::m_densityNoiseOffset) - ->Field("DensityNoiseTimeFrequency", &FogVolumeConfiguration::m_densityNoiseTimeFrequency) - ->Field("DensityNoiseFrequency", &FogVolumeConfiguration::m_densityNoiseFrequency) - ; - } - } - - void FogVolumeConfiguration::UpdateSizeFromEntityShape() - { - AZ_Assert(m_entityId.IsValid(), "[FogVolumeConfiguration] Entity id is invalid"); - BoxShapeComponentRequestsBus::EventResult(m_size, m_entityId, &BoxShapeComponentRequestsBus::Events::GetBoxDimensions); - } -} diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h deleted file mode 100644 index d54685aadd..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeCommon.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <AzCore/Component/EntityId.h> -#include <AzCore/Math/Color.h> -#include <IEntityRenderState.h> - -#include <LmbrCentral/Rendering/FogVolumeComponentBus.h> - -struct SFogVolumeProperties; -struct IFogVolumeRenderNode; - -namespace LmbrCentral -{ - /** - * Stores configuration settings for the Fog Volume. - */ - class FogVolumeConfiguration - { - public: - AZ_TYPE_INFO(FogVolumeConfiguration, "{3B786BBB-0B1D-4EF2-9181-CC75C783C26E}"); - virtual ~FogVolumeConfiguration() {}; - - static void Reflect(AZ::ReflectContext* context); - - // Universal rendering properties - EngineSpec m_minSpec = EngineSpec::Low; - float m_viewDistMultiplier = 1.0f; - - FogVolumeType m_volumeType = FogVolumeType::Ellipsoid; - AZ::Color m_color = AZ::Color(1.f, 1.f, 1.f, 1.f); - // Size is not reflected: taken from BoxShape - AZ::Vector3 m_size = AZ::Vector3(1.0f, 1.0f, 1.0f); - - float m_hdrDynamic = false; - bool m_useGlobalFogColor = false; - - float m_globalDensity = 1.0f; - float m_densityOffset = 0.0f; - float m_nearCutoff = 0.0f; - - float m_fallOffDirLong = 0.0f; - float m_fallOffDirLatitude = 90.0f; - float m_fallOffShift = 0.0f; - float m_fallOffScale = 1.0f; - - float m_softEdges = 1.0f; - - float m_rampStart = 1.0f; - float m_rampEnd = 50.0f; - float m_rampInfluence = 0.0f; - float m_windInfluence = 1.0f; - - float m_densityNoiseScale = 1.0f; - float m_densityNoiseOffset = 1.0f; - float m_densityNoiseTimeFrequency = 0.0f; - - AZ::Vector3 m_densityNoiseFrequency = AZ::Vector3(10.0f, 10.0f, 10.0f); - bool m_ignoresVisAreas = false; - bool m_affectsThisAreaOnly = 0.0f; - - void UpdateSizeFromEntityShape(); - - // Implemented in EditorFogVolumeConfiguration - virtual AZ::Crc32 PropertyChanged() { return 0; } - - void SetEntityId(AZ::EntityId id) { m_entityId = id; } - - protected: - // Not reflected - AZ::EntityId m_entityId; - }; - - class FogVolume - { - public: - FogVolume(); - FogVolume(const FogVolume&) = delete; - FogVolume& operator= (const FogVolume&) = delete; - - virtual ~FogVolume(); - - void SetEntityId(AZ::EntityId id) { m_entityId = id; } - - void CreateFogVolumeRenderNode(const FogVolumeConfiguration& fogVolumeConfig); - void DestroyRenderNode(); - - IFogVolumeRenderNode* GetRenderNode() const - { - return m_fogRenderNode; - } - - void UpdateFogVolumeProperties(const FogVolumeConfiguration& fogVolumeConfig); - void UpdateRenderingFlags(const FogVolumeConfiguration& fogVolumeConfig); - void UpdateFogVolumeTransform(); - - private: - IFogVolumeRenderNode* m_fogRenderNode; - AZ::EntityId m_entityId; - }; - - namespace FogUtils - { - void FogConfigToFogParams(const LmbrCentral::FogVolumeConfiguration& configuration, SFogVolumeProperties& fogVolumeProperties); - } -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp deleted file mode 100644 index 6a49862f59..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include <AzCore/Serialization/SerializeContext.h> -#include <AzCore/RTTI/BehaviorContext.h> -#include <IEntityRenderState.h> - -#include "FogVolumeComponent.h" - -namespace LmbrCentral -{ - const float FogVolumeComponent::s_renderNodeRequestBusOrder = 500.f; - - void FogVolumeComponent::Activate() - { - const auto entityId = GetEntityId(); - - m_configuration.SetEntityId(entityId); - m_configuration.UpdateSizeFromEntityShape(); - - m_fogVolume.SetEntityId(entityId); - m_fogVolume.CreateFogVolumeRenderNode(m_configuration); - - RefreshFog(); - - RenderNodeRequestBus::Handler::BusConnect(entityId); - FogVolumeComponentRequestBus::Handler::BusConnect(entityId); - ShapeComponentNotificationsBus::Handler::BusConnect(entityId); - AZ::TransformNotificationBus::Handler::BusConnect(entityId); - } - - void FogVolumeComponent::Deactivate() - { - m_fogVolume.DestroyRenderNode(); - m_fogVolume.SetEntityId(AZ::EntityId()); - m_configuration.SetEntityId(AZ::EntityId()); - - RenderNodeRequestBus::Handler::BusDisconnect(); - FogVolumeComponentRequestBus::Handler::BusDisconnect(); - ShapeComponentNotificationsBus::Handler::BusDisconnect(); - AZ::TransformNotificationBus::Handler::BusDisconnect(); - } - - void FogVolumeComponent::Reflect(AZ::ReflectContext* context) - { - FogVolumeConfiguration::Reflect(context); - - if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) - { - serializeContext->Class<FogVolumeComponent, AZ::Component>() - ->Version(1) - ->Field("FogVolumeConfiguration", &FogVolumeComponent::m_configuration); - } - - if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) - { - behaviorContext->Class<FogVolumeComponent>()->RequestBus("FogVolumeComponentRequestBus"); - FogVolumeComponent::ExposeRequestsBusInBehaviorContext(behaviorContext, "FogVolumeComponentRequestBus"); - } - } - - IRenderNode* FogVolumeComponent::GetRenderNode() - { - return m_fogVolume.GetRenderNode(); - } - - float FogVolumeComponent::GetRenderNodeRequestBusOrder() const - { - return s_renderNodeRequestBusOrder; - } - - void FogVolumeComponent::RefreshFog() - { - m_fogVolume.UpdateFogVolumeProperties(m_configuration); - m_fogVolume.UpdateRenderingFlags(m_configuration); - m_fogVolume.UpdateFogVolumeTransform(); - } - - void FogVolumeComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform & local, [[maybe_unused]] const AZ::Transform & world) - { - RefreshFog(); - } - - void FogVolumeComponent::OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) - { - if (changeReason == ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged) - { - m_configuration.UpdateSizeFromEntityShape(); - RefreshFog(); - } - } - - void FogVolumeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType & required) - { - required.push_back(AZ_CRC("BoxShapeService", 0x946a0032)); - } - - void FogVolumeComponent::ExposeRequestsBusInBehaviorContext(AZ::BehaviorContext* behaviorContext, const char* name) - { - behaviorContext->EBus<FogVolumeComponentRequestBus>(name) - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::All) - ->Event("RefreshFog", &FogVolumeComponentRequestBus::Events::RefreshFog) - - ->Event("GetVolumeType", &FogVolumeComponentRequestBus::Events::GetVolumeType) - ->Event("SetVolumeType", &FogVolumeComponentRequestBus::Events::SetVolumeType) - ->VirtualProperty("VolumeType", "GetVolumeType", "SetVolumeType") - - ->Event("GetColor", &FogVolumeComponentRequestBus::Events::GetColor) - ->Event("SetColor", &FogVolumeComponentRequestBus::Events::SetColor) - ->VirtualProperty("Color", "GetColor", "SetColor") - - ->Event("GetHdrDynamic", &FogVolumeComponentRequestBus::Events::GetHdrDynamic) - ->Event("SetHdrDynamic", &FogVolumeComponentRequestBus::Events::SetHdrDynamic) - ->VirtualProperty("HdrDynamic", "GetHdrDynamic", "SetHdrDynamic") - - ->Event("GetUseGlobalFogColor", &FogVolumeComponentRequestBus::Events::GetUseGlobalFogColor) - ->Event("SetUseGlobalFogColor", &FogVolumeComponentRequestBus::Events::SetUseGlobalFogColor) - ->VirtualProperty("UseGlobalFogColor", "GetUseGlobalFogColor", "SetUseGlobalFogColor") - - ->Event("GetGlobalDensity", &FogVolumeComponentRequestBus::Events::GetGlobalDensity) - ->Event("SetGlobalDensity", &FogVolumeComponentRequestBus::Events::SetGlobalDensity) - ->VirtualProperty("GlobalDensity", "GetGlobalDensity", "SetGlobalDensity") - - ->Event("GetDensityOffset", &FogVolumeComponentRequestBus::Events::GetDensityOffset) - ->Event("SetDensityOffset", &FogVolumeComponentRequestBus::Events::SetDensityOffset) - ->VirtualProperty("DensityOffset", "GetDensityOffset", "SetDensityOffset") - - ->Event("GetNearCutoff", &FogVolumeComponentRequestBus::Events::GetNearCutoff) - ->Event("SetNearCutoff", &FogVolumeComponentRequestBus::Events::SetNearCutoff) - ->VirtualProperty("NearCutoff", "GetNearCutoff", "SetNearCutoff") - - ->Event("GetFallOffDirLong", &FogVolumeComponentRequestBus::Events::GetFallOffDirLong) - ->Event("SetFallOffDirLong", &FogVolumeComponentRequestBus::Events::SetFallOffDirLong) - ->VirtualProperty("FallOffDirLong", "GetFallOffDirLong", "SetFallOffDirLong") - - ->Event("GetFallOffDirLatitude", &FogVolumeComponentRequestBus::Events::GetFallOffDirLatitude) - ->Event("SetFallOffDirLatitude", &FogVolumeComponentRequestBus::Events::SetFallOffDirLatitude) - ->VirtualProperty("FallOffDirLatitude", "GetFallOffDirLatitude", "SetFallOffDirLatitude") - - ->Event("GetFallOffShift", &FogVolumeComponentRequestBus::Events::GetFallOffShift) - ->Event("SetFallOffShift", &FogVolumeComponentRequestBus::Events::SetFallOffShift) - ->VirtualProperty("FallOffShift", "GetFallOffShift", "SetFallOffShift") - - ->Event("GetFallOffScale", &FogVolumeComponentRequestBus::Events::GetFallOffScale) - ->Event("SetFallOffScale", &FogVolumeComponentRequestBus::Events::SetFallOffScale) - ->VirtualProperty("FallOffScale", "GetFallOffScale", "SetFallOffScale") - - ->Event("GetSoftEdges", &FogVolumeComponentRequestBus::Events::GetSoftEdges) - ->Event("SetSoftEdges", &FogVolumeComponentRequestBus::Events::SetSoftEdges) - ->VirtualProperty("SoftEdges", "GetSoftEdges", "SetSoftEdges") - - ->Event("GetRampStart", &FogVolumeComponentRequestBus::Events::GetRampStart) - ->Event("SetRampStart", &FogVolumeComponentRequestBus::Events::SetRampStart) - ->VirtualProperty("RampStart", "GetRampStart", "SetRampStart") - - ->Event("GetRampEnd", &FogVolumeComponentRequestBus::Events::GetRampEnd) - ->Event("SetRampEnd", &FogVolumeComponentRequestBus::Events::SetRampEnd) - ->VirtualProperty("RampEnd", "GetRampEnd", "SetRampEnd") - - ->Event("GetRampInfluence", &FogVolumeComponentRequestBus::Events::GetRampInfluence) - ->Event("SetRampInfluence", &FogVolumeComponentRequestBus::Events::SetRampInfluence) - ->VirtualProperty("RampInfluence", "GetRampInfluence", "SetRampInfluence") - - ->Event("GetWindInfluence", &FogVolumeComponentRequestBus::Events::GetWindInfluence) - ->Event("SetWindInfluence", &FogVolumeComponentRequestBus::Events::SetWindInfluence) - ->VirtualProperty("WindInfluence", "GetWindInfluence", "SetWindInfluence") - - ->Event("GetDensityNoiseScale", &FogVolumeComponentRequestBus::Events::GetDensityNoiseScale) - ->Event("SetDensityNoiseScale", &FogVolumeComponentRequestBus::Events::SetDensityNoiseScale) - ->VirtualProperty("DensityNoiseScale", "GetDensityNoiseScale", "SetDensityNoiseScale") - - ->Event("GetDensityNoiseOffset", &FogVolumeComponentRequestBus::Events::GetDensityNoiseOffset) - ->Event("SetDensityNoiseOffset", &FogVolumeComponentRequestBus::Events::SetDensityNoiseOffset) - ->VirtualProperty("DensityNoiseOffset", "GetDensityNoiseOffset", "SetDensityNoiseOffset") - - ->Event("GetDensityNoiseTimeFrequency", &FogVolumeComponentRequestBus::Events::GetDensityNoiseTimeFrequency) - ->Event("SetDensityNoiseTimeFrequency", &FogVolumeComponentRequestBus::Events::SetDensityNoiseTimeFrequency) - ->VirtualProperty("DensityNoiseTimeFrequency", "GetDensityNoiseTimeFrequency", "SetDensityNoiseTimeFrequency") - - ->Event("GetDensityNoiseFrequency", &FogVolumeComponentRequestBus::Events::GetDensityNoiseFrequency) - ->Event("SetDensityNoiseFrequency", &FogVolumeComponentRequestBus::Events::SetDensityNoiseFrequency) - ->VirtualProperty("DensityNoiseFrequency", "GetDensityNoiseFrequency", "SetDensityNoiseFrequency") - - ->Event("GetIgnoresVisAreas", &FogVolumeComponentRequestBus::Events::GetIgnoresVisAreas) - ->Event("SetIgnoresVisAreas", &FogVolumeComponentRequestBus::Events::SetIgnoresVisAreas) - ->VirtualProperty("IgnoresVisAreas", "GetIgnoresVisAreas", "SetIgnoresVisAreas") - - ->Event("GetAffectsThisAreaOnly", &FogVolumeComponentRequestBus::Events::GetAffectsThisAreaOnly) - ->Event("SetAffectsThisAreaOnly", &FogVolumeComponentRequestBus::Events::SetAffectsThisAreaOnly) - ->VirtualProperty("AffectsThisAreaOnly", "GetAffectsThisAreaOnly", "SetAffectsThisAreaOnly") - ; - } -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h deleted file mode 100644 index b9153a5743..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeComponent.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <AzCore/base.h> - -#include <AzCore/Component/Component.h> -#include <AzCore/Component/ComponentBus.h> -#include <AzCore/Component/TransformBus.h> -#include <AzCore/Math/Vector3.h> - -#include <LmbrCentral/Rendering/RenderNodeBus.h> -#include <LmbrCentral/Shape/ShapeComponentBus.h> - -#include <IEntityRenderState.h> - -#include "FogVolumeCommon.h" -#include "FogVolumeRequestsHandler.h" - -namespace LmbrCentral -{ - /*! - * In-game Fog Volume component. - */ - class FogVolumeComponent - : public AZ::Component - , public RenderNodeRequestBus::Handler - , private FogVolumeComponentRequestsBusHandler - , private AZ::TransformNotificationBus::Handler - , private ShapeComponentNotificationsBus::Handler - { - public: - AZ_COMPONENT(FogVolumeComponent, "{C01B9E8F-C015-46AC-9065-79445CE1408A}"); - ~FogVolumeComponent() override = default; - - template<typename T> - void SetConfiguration(T&& configuration) - { - m_configuration = AZStd::forward<T>(configuration); - } - - // AZ::Component interface implementation - void Activate() override; - void Deactivate() override; - - static void Reflect(AZ::ReflectContext* context); - - // RenderNodeRequestBus::Handler interface implementation - IRenderNode* GetRenderNode() override; - float GetRenderNodeRequestBusOrder() const override; - static const float s_renderNodeRequestBusOrder; - - // TransformNotificationBus::Handler - void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; - - // ShapeComponentNotificationsBus::Handler - void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons changeReason) override; - - // FogVolumeComponentRequestBus::Handler - void RefreshFog() override; - - static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); - static void ExposeRequestsBusInBehaviorContext(AZ::BehaviorContext* behaviorContext, const char* name); - - protected: - FogVolumeConfiguration& GetConfiguration() override - { - return m_configuration; - } - - private: - FogVolumeConfiguration m_configuration; - FogVolume m_fogVolume; - }; -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp deleted file mode 100644 index e186b6d48f..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#include "LmbrCentral_precompiled.h" - -#include "FogVolumeRequestsHandler.h" -#include "FogVolumeCommon.h" - -namespace LmbrCentral -{ - FogVolumeType FogVolumeComponentRequestsBusHandler::GetVolumeType() - { - return GetConfiguration().m_volumeType; - } - - void FogVolumeComponentRequestsBusHandler::SetVolumeType(FogVolumeType volumeType) - { - auto& configuration = GetConfiguration(); - if (configuration.m_volumeType != volumeType) - { - configuration.m_volumeType = volumeType; - RefreshFog(); - } - } - - AZ::Color FogVolumeComponentRequestsBusHandler::GetColor() - { - return GetConfiguration().m_color; - } - - void FogVolumeComponentRequestsBusHandler::SetColor(AZ::Color color) - { - GetConfiguration().m_color = color; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetHdrDynamic() - { - return GetConfiguration().m_hdrDynamic; - } - - void FogVolumeComponentRequestsBusHandler::SetHdrDynamic(float hdrDynamic) - { - GetConfiguration().m_hdrDynamic = hdrDynamic; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetUseGlobalFogColor() - { - return GetConfiguration().m_useGlobalFogColor; - } - - void FogVolumeComponentRequestsBusHandler::SetUseGlobalFogColor(bool useGlobalFogColor) - { - GetConfiguration().m_useGlobalFogColor = useGlobalFogColor; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetGlobalDensity() - { - return GetConfiguration().m_globalDensity; - } - - void FogVolumeComponentRequestsBusHandler::SetGlobalDensity(float globalDensity) - { - GetConfiguration().m_globalDensity = globalDensity; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityOffset() - { - return GetConfiguration().m_densityOffset; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityOffset(float densityOffset) - { - GetConfiguration().m_densityOffset = densityOffset; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetNearCutoff() - { - return GetConfiguration().m_nearCutoff; - } - - void FogVolumeComponentRequestsBusHandler::SetNearCutoff(float nearCutoff) - { - GetConfiguration().m_nearCutoff = nearCutoff; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffDirLong() - { - return GetConfiguration().m_fallOffDirLong; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffDirLong(float fallOffDirLong) - { - GetConfiguration().m_fallOffDirLong = fallOffDirLong; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffDirLatitude() - { - return GetConfiguration().m_fallOffDirLatitude; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffDirLatitude(float fallOffDirLatitude) - { - GetConfiguration().m_fallOffDirLatitude = fallOffDirLatitude; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffShift() - { - return GetConfiguration().m_fallOffShift; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffShift(float fallOffShift) - { - GetConfiguration().m_fallOffShift = fallOffShift; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetFallOffScale() - { - return GetConfiguration().m_fallOffScale; - } - - void FogVolumeComponentRequestsBusHandler::SetFallOffScale(float fallOffScale) - { - GetConfiguration().m_fallOffScale = fallOffScale; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetSoftEdges() - { - return GetConfiguration().m_softEdges; - } - - void FogVolumeComponentRequestsBusHandler::SetSoftEdges(float softEdges) - { - GetConfiguration().m_softEdges = softEdges; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampStart() - { - return GetConfiguration().m_rampStart; - } - - void FogVolumeComponentRequestsBusHandler::SetRampStart(float rampStart) - { - GetConfiguration().m_rampStart = rampStart; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampEnd() - { - return GetConfiguration().m_rampEnd; - } - - void FogVolumeComponentRequestsBusHandler::SetRampEnd(float rampEnd) - { - GetConfiguration().m_rampEnd = rampEnd; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetRampInfluence() - { - return GetConfiguration().m_rampInfluence; - } - - void FogVolumeComponentRequestsBusHandler::SetRampInfluence(float rampInfluence) - { - GetConfiguration().m_rampInfluence = rampInfluence; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetWindInfluence() - { - return GetConfiguration().m_windInfluence; - } - - void FogVolumeComponentRequestsBusHandler::SetWindInfluence(float windInfluence) - { - GetConfiguration().m_windInfluence = windInfluence; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseScale() - { - return GetConfiguration().m_densityNoiseScale; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseScale(float densityNoiseScale) - { - GetConfiguration().m_densityNoiseScale = densityNoiseScale; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseOffset() - { - return GetConfiguration().m_densityNoiseOffset; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseOffset(float densityNoiseOffset) - { - GetConfiguration().m_densityNoiseOffset = densityNoiseOffset; - RefreshFog(); - } - - float FogVolumeComponentRequestsBusHandler::GetDensityNoiseTimeFrequency() - { - return GetConfiguration().m_densityNoiseTimeFrequency; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseTimeFrequency(float timeFrequency) - { - GetConfiguration().m_densityNoiseTimeFrequency = timeFrequency; - RefreshFog(); - } - - AZ::Vector3 FogVolumeComponentRequestsBusHandler::GetDensityNoiseFrequency() - { - return GetConfiguration().m_densityNoiseFrequency; - } - - void FogVolumeComponentRequestsBusHandler::SetDensityNoiseFrequency(AZ::Vector3 densityNoiseFrequency) - { - GetConfiguration().m_densityNoiseFrequency = densityNoiseFrequency; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetIgnoresVisAreas() - { - return GetConfiguration().m_ignoresVisAreas; - } - - void FogVolumeComponentRequestsBusHandler::SetIgnoresVisAreas(bool ignoresVisAreas) - { - GetConfiguration().m_ignoresVisAreas = ignoresVisAreas; - RefreshFog(); - } - - bool FogVolumeComponentRequestsBusHandler::GetAffectsThisAreaOnly() - { - return GetConfiguration().m_affectsThisAreaOnly; - } - - void FogVolumeComponentRequestsBusHandler::SetAffectsThisAreaOnly(bool affectsThisAreaOnly) - { - GetConfiguration().m_affectsThisAreaOnly = affectsThisAreaOnly; - RefreshFog(); - } -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h b/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h deleted file mode 100644 index c4ddc292bd..0000000000 --- a/Gems/LmbrCentral/Code/Source/Rendering/FogVolumeRequestsHandler.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <AzCore/Math/Color.h> -#include <LmbrCentral/Rendering/FogVolumeComponentBus.h> - -namespace LmbrCentral -{ - class FogVolumeComponentRequestsBusHandler - : public FogVolumeComponentRequestBus::Handler - { - ///////////////////////////////////////////// - // FogVolumeComponentRequestBus::Handler - FogVolumeType GetVolumeType() override; - void SetVolumeType(FogVolumeType volumeType) override; - - AZ::Color GetColor() override; - void SetColor(AZ::Color color) override; - - float GetHdrDynamic() override; - void SetHdrDynamic(float hdrDynamic) override; - - bool GetUseGlobalFogColor() override; - void SetUseGlobalFogColor(bool useGlobalFogColor) override; - - float GetGlobalDensity() override; - void SetGlobalDensity(float globalDensity) override; - - float GetDensityOffset() override; - void SetDensityOffset(float densityOffset) override; - - float GetNearCutoff() override; - void SetNearCutoff(float nearCutoff) override; - - float GetFallOffDirLong() override; - void SetFallOffDirLong(float fallOffDirLong) override; - - float GetFallOffDirLatitude() override; - void SetFallOffDirLatitude(float fallOffDirLatitude) override; - - float GetFallOffShift() override; - void SetFallOffShift(float fallOffShift) override; - - float GetFallOffScale() override; - void SetFallOffScale(float fallOffScale) override; - - float GetSoftEdges() override; - void SetSoftEdges(float softEdges) override; - - float GetRampStart() override; - void SetRampStart(float rampStart) override; - - float GetRampEnd() override; - void SetRampEnd(float rampEnd) override; - - float GetRampInfluence() override; - void SetRampInfluence(float rampInfluence) override; - - float GetWindInfluence() override; - void SetWindInfluence(float windInfluence) override; - - float GetDensityNoiseScale() override; - void SetDensityNoiseScale(float densityNoiseScale) override; - - float GetDensityNoiseOffset() override; - void SetDensityNoiseOffset(float densityNoiseOffset) override; - - float GetDensityNoiseTimeFrequency() override; - void SetDensityNoiseTimeFrequency(float timeFrequency) override; - - AZ::Vector3 GetDensityNoiseFrequency() override; - void SetDensityNoiseFrequency(AZ::Vector3 densityNoiseFrequency) override; - - bool GetIgnoresVisAreas() override; - void SetIgnoresVisAreas(bool ignoresVisAreas) override; - - bool GetAffectsThisAreaOnly() override; - void SetAffectsThisAreaOnly(bool affectsThisAreaOnly) override; - ///////////////////////////////////////////// - - protected: - virtual FogVolumeConfiguration& GetConfiguration() = 0; - }; -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/Source/Rendering/GeomCacheComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/GeomCacheComponent.h index 1d020f05ae..3f011c6e62 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/GeomCacheComponent.h +++ b/Gems/LmbrCentral/Code/Source/Rendering/GeomCacheComponent.h @@ -222,4 +222,4 @@ namespace LmbrCentral //Reflected members GeometryCacheCommon m_common; }; -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.cpp b/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.cpp index 507e96b263..b52feac3fd 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.cpp @@ -872,4 +872,4 @@ namespace LmbrCentral , m_cubemapId(AZ::Uuid::Create()) { } -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.h b/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.h index 525d4f40aa..d562cf1701 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.h +++ b/Gems/LmbrCentral/Code/Source/Rendering/LightComponent.h @@ -300,4 +300,4 @@ namespace LmbrCentral LightConfiguration m_configuration; LightInstance m_light; }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Rendering/LightInstance.cpp b/Gems/LmbrCentral/Code/Source/Rendering/LightInstance.cpp index d3564f228d..0c5da629ed 100644 --- a/Gems/LmbrCentral/Code/Source/Rendering/LightInstance.cpp +++ b/Gems/LmbrCentral/Code/Source/Rendering/LightInstance.cpp @@ -136,13 +136,16 @@ namespace const char* texturePath = configuration.m_projectorTexture.GetAssetPath().c_str(); const int flags = FT_DONT_STREAM; - lightParams.m_pLightImage = gEnv->pRenderer->EF_LoadTexture(texturePath, flags); - - if (!lightParams.m_pLightImage || !lightParams.m_pLightImage->IsTextureLoaded()) + if (gEnv->pRenderer) { - GetISystem()->Warning(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, 0, texturePath, - "Light projector texture not found: %s", texturePath); - lightParams.m_pLightImage = gEnv->pRenderer->EF_LoadTexture("Textures/defaults/red.dds", flags); + lightParams.m_pLightImage = gEnv->pRenderer->EF_LoadTexture(texturePath, flags); + + if (!lightParams.m_pLightImage || !lightParams.m_pLightImage->IsTextureLoaded()) + { + GetISystem()->Warning(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, 0, texturePath, + "Light projector texture not found: %s", texturePath); + lightParams.m_pLightImage = gEnv->pRenderer->EF_LoadTexture("Textures/defaults/red.dds", flags); + } } } break; @@ -180,8 +183,11 @@ namespace diffuseMap.insert(dotPos, "_diff"); } - lightParams.SetSpecularCubemap(gEnv->pRenderer->EF_LoadCubemapTexture(specularMap.c_str(), FT_DONT_STREAM)); - lightParams.SetDiffuseCubemap(gEnv->pRenderer->EF_LoadCubemapTexture(diffuseMap.c_str(), FT_DONT_STREAM)); + if (gEnv->pRenderer) + { + lightParams.SetSpecularCubemap(gEnv->pRenderer->EF_LoadCubemapTexture(specularMap.c_str(), FT_DONT_STREAM)); + lightParams.SetDiffuseCubemap(gEnv->pRenderer->EF_LoadCubemapTexture(diffuseMap.c_str(), FT_DONT_STREAM)); + } if (lightParams.GetDiffuseCubemap() && lightParams.GetSpecularCubemap()) { @@ -401,7 +407,7 @@ namespace LmbrCentral template <typename ConfigurationType, typename ConfigToLightParamsFunc> void LightInstance::CreateRenderLightInternal(const ConfigurationType& configuration, ConfigToLightParamsFunc configToLightParams) { - if (m_renderLight || !configuration.m_visible) + if (m_renderLight || !configuration.m_visible || !gEnv->p3DEngine) { return; } diff --git a/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h b/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h index f0775b9382..3a6209f477 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h +++ b/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h @@ -68,4 +68,4 @@ namespace LmbrCentral EditorRandomTimedSpawnerConfiguration m_config; }; -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Scripting/RandomTimedSpawnerComponent.h b/Gems/LmbrCentral/Code/Source/Scripting/RandomTimedSpawnerComponent.h index d61b4beaa3..b41f431325 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/RandomTimedSpawnerComponent.h +++ b/Gems/LmbrCentral/Code/Source/Scripting/RandomTimedSpawnerComponent.h @@ -103,4 +103,4 @@ namespace LmbrCentral void CalculateNextSpawnTime(); AZ::Vector3 CalculateNextSpawnPosition(); }; -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.cpp b/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.cpp index 2595fc09fd..7b76a1465c 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.cpp @@ -148,6 +148,7 @@ namespace LmbrCentral ->Event("GetCurrentEntitiesFromSpawnedSlice", &SpawnerComponentRequestBus::Events::GetCurrentEntitiesFromSpawnedSlice) ->Event("GetAllCurrentlySpawnedEntities", &SpawnerComponentRequestBus::Events::GetAllCurrentlySpawnedEntities) ->Event("SetDynamicSlice", &SpawnerComponentRequestBus::Events::SetDynamicSliceByAssetId) + ->Event("IsReadyToSpawn", &SpawnerComponentRequestBus::Events::IsReadyToSpawn) ; behaviorContext->EBus<SpawnerComponentNotificationBus>("SpawnerComponentNotificationBus") @@ -250,17 +251,15 @@ namespace LmbrCentral //========================================================================= void SpawnerComponent::SetDynamicSliceByAssetId(AZ::Data::AssetId& assetId) { - auto sliceAsset = AZ::Data::AssetManager::Instance().GetAsset(assetId, AZ::AzTypeInfo<AZ::DynamicSliceAsset>::Uuid(), m_sliceAsset.GetAutoLoadBehavior()); + if (m_sliceAsset.GetId() == assetId) + { + return; + } - if (sliceAsset.IsReady()) - { - m_sliceAsset = sliceAsset; - } - else - { - AZ::Data::AssetBus::Handler::BusDisconnect(); - AZ::Data::AssetBus::Handler::BusConnect(assetId); - } + m_sliceAsset = AZ::Data::AssetManager::Instance().GetAsset( + assetId, AZ::AzTypeInfo<AZ::DynamicSliceAsset>::Uuid(), m_sliceAsset.GetAutoLoadBehavior()); + AZ::Data::AssetBus::Handler::BusDisconnect(); + AZ::Data::AssetBus::Handler::BusConnect(assetId); } //========================================================================= @@ -444,6 +443,12 @@ namespace LmbrCentral return entities; } + //========================================================================= + bool SpawnerComponent::IsReadyToSpawn() + { + return m_sliceAsset.IsReady(); + } + //========================================================================= void SpawnerComponent::OnSlicePreInstantiate(const AZ::Data::AssetId& /*sliceAssetId*/, [[maybe_unused]] const AZ::SliceComponent::SliceInstanceAddress& sliceAddress) { diff --git a/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.h b/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.h index 3dee332df3..75f5db8df2 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.h +++ b/Gems/LmbrCentral/Code/Source/Scripting/SpawnerComponent.h @@ -70,7 +70,8 @@ namespace LmbrCentral AZStd::vector<AzFramework::SliceInstantiationTicket> GetCurrentlySpawnedSlices() override; bool HasAnyCurrentlySpawnedSlices() override; AZStd::vector<AZ::EntityId> GetCurrentEntitiesFromSpawnedSlice(const AzFramework::SliceInstantiationTicket& ticket) override; - AZStd::vector<AZ::EntityId> GetAllCurrentlySpawnedEntities(); + AZStd::vector<AZ::EntityId> GetAllCurrentlySpawnedEntities() override; + bool IsReadyToSpawn() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.cpp index 46379063f7..ea4223e875 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.cpp @@ -346,4 +346,4 @@ namespace LmbrCentral return true; } } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.h b/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.h index 098180f308..1ad02ba66f 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.h +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorShapeComponentConverters.h @@ -37,4 +37,4 @@ namespace LmbrCentral /// EditorPolygonPrismShapeComponent converters bool UpgradeEditorPolygonPrismShapeComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); } // namespace ClassConverters -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.cpp b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.cpp index 26ced926f9..c75fc4acce 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.cpp @@ -51,4 +51,4 @@ namespace LmbrCentral classElement.GetVersion(), "CylinderShape", context, classElement); } } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.h b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.h index 68d40d2fc7..ae49e80230 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.h +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.h @@ -32,4 +32,4 @@ namespace LmbrCentral } // namespace ClassConverters } // namespace LmbrCentral -#include "ShapeComponentConverters.inl" \ No newline at end of file +#include "ShapeComponentConverters.inl" diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.inl b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.inl index b0675490f1..41e41bfb3f 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.inl +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponentConverters.inl @@ -48,4 +48,4 @@ namespace LmbrCentral return true; } } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeDisplay.h b/Gems/LmbrCentral/Code/Source/Shape/ShapeDisplay.h index 09088f06cd..fb3164960e 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeDisplay.h +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeDisplay.h @@ -53,4 +53,4 @@ namespace LmbrCentral debugDisplay.PopMatrix(); } -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.h b/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.h index ccec1319bc..36c658ccc2 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.h +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.h @@ -99,4 +99,4 @@ namespace LmbrCentral const AZ::Vector3& localPosition, const AZ::Vector3& forwardAxis, const AZ::Vector3& sideAxis, float radius, float angle); } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Source/Shape/SplineComponent.h b/Gems/LmbrCentral/Code/Source/Shape/SplineComponent.h index 1ae2d03fac..eaa3fde457 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/SplineComponent.h +++ b/Gems/LmbrCentral/Code/Source/Shape/SplineComponent.h @@ -117,4 +117,4 @@ namespace LmbrCentral AZ::Transform m_currentTransform; ///< Caches the current transform for the entity on which this component lives. }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/TubeShapeComponent.h b/Gems/LmbrCentral/Code/Source/Shape/TubeShapeComponent.h index dcbb333d95..a93a367c86 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/TubeShapeComponent.h +++ b/Gems/LmbrCentral/Code/Source/Shape/TubeShapeComponent.h @@ -75,4 +75,4 @@ namespace LmbrCentral SplineAttribute<float> m_radiusAttribute; ///< Radius Attribute. float m_radius = 0.0f; ///< Global radius for the Tube. }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Hidden/TextureMipmapAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Hidden/TextureMipmapAssetTypeInfo.h index 7fc95a330b..de66697e35 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Hidden/TextureMipmapAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Hidden/TextureMipmapAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Material/MaterialAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Material/MaterialAssetTypeInfo.h index 38880bef08..b7f3294e89 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Material/MaterialAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Material/MaterialAssetTypeInfo.h @@ -57,4 +57,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/AudioAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/AudioAssetTypeInfo.h index 6bf02c8a34..0da77b290c 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/AudioAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/AudioAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.h index 4c004324ca..df983410f4 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/CharacterPhysicsAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h index 23e98801c2..a98b364c58 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/EntityPrototypeLibraryAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/GameTokenAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/GameTokenAssetTypeInfo.h index 0beb779391..e0f9ffd042 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/GameTokenAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/GameTokenAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/GroupAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/GroupAssetTypeInfo.h index fd075d9d80..070d233b05 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/GroupAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/GroupAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.h index 26cc2f152c..712dc49fa3 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Other/PrefabsLibraryAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Texture/SubstanceAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Texture/SubstanceAssetTypeInfo.h index c785d7bb08..ec2c56caea 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Texture/SubstanceAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Texture/SubstanceAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/Texture/TextureAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/Texture/TextureAssetTypeInfo.h index fc24001ad7..2a7e2c0e1d 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/Texture/TextureAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/Texture/TextureAssetTypeInfo.h @@ -35,4 +35,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/UI/EntityIconAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/UI/EntityIconAssetTypeInfo.h index e6f3669503..c81f70501d 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/UI/EntityIconAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/UI/EntityIconAssetTypeInfo.h @@ -39,4 +39,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/UI/FontAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/UI/FontAssetTypeInfo.h index cf6aff9144..be52f4d4dd 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/UI/FontAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/UI/FontAssetTypeInfo.h @@ -34,4 +34,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Unhandled/UI/UICanvasAssetTypeInfo.h b/Gems/LmbrCentral/Code/Source/Unhandled/UI/UICanvasAssetTypeInfo.h index 9fd04e692d..e75e3d0b0e 100644 --- a/Gems/LmbrCentral/Code/Source/Unhandled/UI/UICanvasAssetTypeInfo.h +++ b/Gems/LmbrCentral/Code/Source/Unhandled/UI/UICanvasAssetTypeInfo.h @@ -35,4 +35,4 @@ namespace LmbrCentral void Register(); void Unregister(); }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Tests/EditorCompoundShapeComponentTests.cpp b/Gems/LmbrCentral/Code/Tests/EditorCompoundShapeComponentTests.cpp index 66505b5006..f4a3ad9068 100644 --- a/Gems/LmbrCentral/Code/Tests/EditorCompoundShapeComponentTests.cpp +++ b/Gems/LmbrCentral/Code/Tests/EditorCompoundShapeComponentTests.cpp @@ -100,4 +100,4 @@ namespace LmbrCentral &LmbrCentral::CompoundShapeComponentHierarchyRequestsBus::Events::ValidateChildIds); EXPECT_TRUE(valid); } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Tests/EditorSphereShapeComponentTests.cpp b/Gems/LmbrCentral/Code/Tests/EditorSphereShapeComponentTests.cpp index 0fa4bb9bc6..1c96236e0e 100644 --- a/Gems/LmbrCentral/Code/Tests/EditorSphereShapeComponentTests.cpp +++ b/Gems/LmbrCentral/Code/Tests/EditorSphereShapeComponentTests.cpp @@ -61,4 +61,4 @@ namespace LmbrCentral EXPECT_FLOAT_EQ(radius, 0.57f); } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test1.xml b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test1.xml index be648a66b9..c03c1483fd 100644 --- a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test1.xml +++ b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test1.xml @@ -38,4 +38,4 @@ <Library Name="Waterfall"/> </ParticlesLibrary> <GameTokensLibraryReferences /> -</LevelData> \ No newline at end of file +</LevelData> diff --git a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test5.xml b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test5.xml index bb3388b68f..4c5ef6b840 100644 --- a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test5.xml +++ b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test5.xml @@ -1,4 +1,4 @@ <SurfaceTypes> <SurfaceType Name="Materials/material_terrain_default" SurfaceTypeID="0" DetailTexture="" DetailScaleX="1" DetailScaleY="1" DetailMaterial="Materials/material_terrain_default" ProjectAxis="2" Bumpmap="" ProjAxis="Z"/> </SurfaceTypes> -<CollisionClasses \ No newline at end of file +<CollisionClasses diff --git a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test6.xml b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test6.xml index 5e1c309dae..557db03de9 100644 --- a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test6.xml +++ b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test6.xml @@ -1 +1 @@ -Hello World \ No newline at end of file +Hello World diff --git a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test7.xml b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test7.xml index 66fccbc6f0..fc8f5e0a15 100644 --- a/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test7.xml +++ b/Gems/LmbrCentral/Code/Tests/Levels/leveldata_test7.xml @@ -1 +1 @@ -<SurfaceT \ No newline at end of file +<SurfaceT diff --git a/Gems/LmbrCentral/Code/Tests/Levels/mission_mission0_test1.xml b/Gems/LmbrCentral/Code/Tests/Levels/mission_mission0_test1.xml index 1b39818c33..2c6efe329d 100644 --- a/Gems/LmbrCentral/Code/Tests/Levels/mission_mission0_test1.xml +++ b/Gems/LmbrCentral/Code/Tests/Levels/mission_mission0_test1.xml @@ -20,4 +20,4 @@ <Ammo /> </Weapons> <Objects /> -</Mission> \ No newline at end of file +</Mission> diff --git a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadErrorsAndMultipleRefs.txt b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadErrorsAndMultipleRefs.txt index 8224906c20..3b146b165d 100644 --- a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadErrorsAndMultipleRefs.txt +++ b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadErrorsAndMultipleRefs.txt @@ -1,4 +1,4 @@ SomeLibrary Has*WildcardCharacter @PreloadLib -@ \ No newline at end of file +@ diff --git a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadOnlyAtSymbol.txt b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadOnlyAtSymbol.txt index b516b2c489..59c227c5c8 100644 --- a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadOnlyAtSymbol.txt +++ b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadOnlyAtSymbol.txt @@ -1 +1 @@ -@ \ No newline at end of file +@ diff --git a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadWithPreloadRef.txt b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadWithPreloadRef.txt index 0241dfd049..c6487b09e5 100644 --- a/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadWithPreloadRef.txt +++ b/Gems/LmbrCentral/Code/Tests/Libs/Particles/PreloadWithPreloadRef.txt @@ -1 +1 @@ -@PreloadLibsWithXmlExt \ No newline at end of file +@PreloadLibsWithXmlExt diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test1.lua b/Gems/LmbrCentral/Code/Tests/Lua/test1.lua index 508a45c8af..bf6b226472 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test1.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test1.lua @@ -59,4 +59,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test2.lua b/Gems/LmbrCentral/Code/Tests/Lua/test2.lua index 939f93c0ef..0994a89eb9 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test2.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test2.lua @@ -56,4 +56,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test3_general_dependencies.lua b/Gems/LmbrCentral/Code/Tests/Lua/test3_general_dependencies.lua index 0f49fc0ec0..c6fa64efc5 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test3_general_dependencies.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test3_general_dependencies.lua @@ -52,4 +52,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test4_console_command.lua b/Gems/LmbrCentral/Code/Tests/Lua/test4_console_command.lua index cdaec5a325..0cc0fa589f 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test4_console_command.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test4_console_command.lua @@ -54,4 +54,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test5_whole_line_comment.lua b/Gems/LmbrCentral/Code/Tests/Lua/test5_whole_line_comment.lua index eea171e1c4..ace95e1a4b 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test5_whole_line_comment.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test5_whole_line_comment.lua @@ -56,4 +56,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test6_partial_line_comment.lua b/Gems/LmbrCentral/Code/Tests/Lua/test6_partial_line_comment.lua index ecdb8a0a26..63b0647c42 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test6_partial_line_comment.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test6_partial_line_comment.lua @@ -54,4 +54,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test7_block_comment.lua b/Gems/LmbrCentral/Code/Tests/Lua/test7_block_comment.lua index 5db03e78bb..8e7eb36659 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test7_block_comment.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test7_block_comment.lua @@ -57,4 +57,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Lua/test8_negated_block_comment.lua b/Gems/LmbrCentral/Code/Tests/Lua/test8_negated_block_comment.lua index ba33afb96b..fb7d957db0 100644 --- a/Gems/LmbrCentral/Code/Tests/Lua/test8_negated_block_comment.lua +++ b/Gems/LmbrCentral/Code/Tests/Lua/test8_negated_block_comment.lua @@ -57,4 +57,4 @@ function SpawnerScriptSample:OnDeactivate() end end -return SpawnerScriptSample \ No newline at end of file +return SpawnerScriptSample diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/ExcludedFilePathExample.xml b/Gems/LmbrCentral/Code/Tests/Xmls/ExcludedFilePathExample.xml index 21442545d7..2b6a2bac2b 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/ExcludedFilePathExample.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/ExcludedFilePathExample.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/NoMatchedSchemaExample.xml b/Gems/LmbrCentral/Code/Tests/Xmls/NoMatchedSchemaExample.xml index bc0daa3917..d57c3190b5 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/NoMatchedSchemaExample.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/NoMatchedSchemaExample.xml @@ -2,4 +2,4 @@ <tag2 dependson="dependency6.txt"/> <tag2/> <tag2 dependson="dependency7.txt"/> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExample.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExample.xml index 21442545d7..2b6a2bac2b 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExample.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExample.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleEmptyAttributeValue.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleEmptyAttributeValue.xml index 919c93931e..96d75b987f 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleEmptyAttributeValue.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleEmptyAttributeValue.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleInvalidVersionNumberFormat.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleInvalidVersionNumberFormat.xml index 7eaf288501..1a31313552 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleInvalidVersionNumberFormat.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleInvalidVersionNumberFormat.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleMultipleMatchingExtensions.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleMultipleMatchingExtensions.xml index e16e4a76ba..050a9a8dc1 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleMultipleMatchingExtensions.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleMultipleMatchingExtensions.xml @@ -1,4 +1,4 @@ <tag1 versionnumber="1.0.0"> <tag2 path="Extension1.ext1"/> <tag2 path="Extension2.ext2"/> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleVersionOutOfRange.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleVersionOutOfRange.xml index 386ff1461a..c14261859d 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleVersionOutOfRange.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleVersionOutOfRange.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsCount.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsCount.xml index fc0ef53d62..4630d593e6 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsCount.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsCount.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsSeparator.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsSeparator.xml index 461c4f132c..84a2dcfc89 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsSeparator.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithInvalidVersionPartsSeparator.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithOneVersionPart.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithOneVersionPart.xml index 5ce058ce32..e721221a37 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithOneVersionPart.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithOneVersionPart.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithThreeVersionParts.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithThreeVersionParts.xml index 5e2e4434c2..1f652de67b 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithThreeVersionParts.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithThreeVersionParts.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithTwoVersionParts.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithTwoVersionParts.xml index 15926643e1..5f66b0c599 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithTwoVersionParts.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithTwoVersionParts.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithoutExtension.xml b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithoutExtension.xml index 2db0dc5d4f..115371a013 100644 --- a/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithoutExtension.xml +++ b/Gems/LmbrCentral/Code/Tests/Xmls/XmlExampleWithoutExtension.xml @@ -13,4 +13,4 @@ <tag3 path="dependency7.txt"/> </tag2> </tag1> -</tag1> \ No newline at end of file +</tag1> diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Ai/NavigationAreaBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Ai/NavigationAreaBus.h index acebec7ff7..498ba5f6a9 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Ai/NavigationAreaBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Ai/NavigationAreaBus.h @@ -36,4 +36,4 @@ namespace LmbrCentral * Bus to service requests made to the Navigation Area component. */ using NavigationAreaRequestBus = AZ::EBus<NavigationAreaRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Bundling/BundlingSystemComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Bundling/BundlingSystemComponentBus.h index 9f891d2a56..dd8ffadb28 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Bundling/BundlingSystemComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Bundling/BundlingSystemComponentBus.h @@ -38,4 +38,4 @@ namespace LmbrCentral using BundlingSystemRequestBus = AZ::EBus<BundlingSystemRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.h index b10337cbab..d52f4be345 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.h @@ -82,4 +82,4 @@ namespace LmbrCentral }; } -#include <LmbrCentral/Dependency/DependencyMonitor.inl> \ No newline at end of file +#include <LmbrCentral/Dependency/DependencyMonitor.inl> diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.inl b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.inl index 4007f8a186..04c2cb9dfe 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.inl +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyMonitor.inl @@ -134,4 +134,4 @@ namespace LmbrCentral m_notificationInProgress = false; } } -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyNotificationBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyNotificationBus.h index e4b87684eb..75a52dc463 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyNotificationBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Dependency/DependencyNotificationBus.h @@ -29,4 +29,4 @@ namespace LmbrCentral }; typedef AZ::EBus<DependencyNotifications> DependencyNotificationBus; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Geometry/GeometrySystemComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Geometry/GeometrySystemComponentBus.h index ccbde61270..2f83d28530 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Geometry/GeometrySystemComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Geometry/GeometrySystemComponentBus.h @@ -42,4 +42,4 @@ namespace LmbrCentral using CapsuleGeometrySystemRequestBus = AZ::EBus<CapsuleGeometrySystemRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Physics/WaterNotificationBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Physics/WaterNotificationBus.h index 85e2b38943..304fdd1600 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Physics/WaterNotificationBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Physics/WaterNotificationBus.h @@ -47,4 +47,4 @@ namespace LmbrCentral }; using WaterNotificationBus = AZ::EBus<WaterNotifications>; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorCameraCorrectionBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorCameraCorrectionBus.h index 4cf3a6463e..19dda4cdcb 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorCameraCorrectionBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorCameraCorrectionBus.h @@ -32,4 +32,4 @@ namespace LmbrCentral }; using EditorCameraCorrectionRequestBus = AZ::EBus<EditorCameraCorrectionRequests>; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorMeshBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorMeshBus.h index 1ac0be7ec3..19cad8cd29 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorMeshBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/EditorMeshBus.h @@ -25,4 +25,4 @@ namespace LmbrCentral virtual bool AddMeshComponentWithAssetId(const AZ::EntityId& targetEntity, const AZ::Uuid& meshAssetId) = 0; }; using EditorMeshBus = AZ::EBus<EditorMeshBusRequests>; -} \ No newline at end of file +} diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h deleted file mode 100644 index 7044949100..0000000000 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/FogVolumeComponentBus.h +++ /dev/null @@ -1,247 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <AzCore/Component/ComponentBus.h> - -namespace LmbrCentral -{ - class FogVolumeConfiguration; - - enum class FogVolumeType : AZ::s32 - { - None = -1, - Ellipsoid = 0, - RectangularPrism = 1, - }; - - class FogVolumeComponentRequests - : public AZ::ComponentBus - { - public: - virtual ~FogVolumeComponentRequests() {} - - /// Propagates updated configuration to the fog volume component - virtual void RefreshFog() {}; - - /** - * Gets the volume shape type. - */ - virtual FogVolumeType GetVolumeType() { return FogVolumeType::None; } - /** - * Sets the volume shape type. - */ - virtual void SetVolumeType([[maybe_unused]] FogVolumeType volumeType) {}; - - /** - * Gets color of the fog. - */ - virtual AZ::Color GetColor() { return AZ::Color::CreateOne(); } - /** - * Sets color of the fog. - */ - virtual void SetColor([[maybe_unused]] AZ::Color color) {}; - - /** - * Gets HDR Dynamic. - */ - virtual float GetHdrDynamic() { return FLT_MAX; } - /** - * Set HDR Dynamic. - */ - virtual void SetHdrDynamic([[maybe_unused]] float hdrDynamic) {}; - - /** - * Returns true if global fog color is used instead of the color property. - */ - virtual bool GetUseGlobalFogColor() { return false; } - /** - * Sets whether global fog color is used instead of the color property. - */ - virtual void SetUseGlobalFogColor([[maybe_unused]] bool useGlobalFogColor) {}; - - /** - * Gets Fog density. - */ - virtual float GetGlobalDensity() { return FLT_MAX; } - /** - * Sets Fog density. Fog density controls how thick the fog appears. - */ - virtual void SetGlobalDensity([[maybe_unused]] float globalDensity) {}; - - /** - * Gets density offset - */ - virtual float GetDensityOffset() { return FLT_MAX; } - /** - * Sets density offset. Density offset additionaly controls to the density of the fog volume. - */ - virtual void SetDensityOffset([[maybe_unused]] float densityOffset) {}; - - /** - * Gets near cutoff distance - */ - virtual float GetNearCutoff() { return FLT_MAX; } - /** - * Sets near cutoff distance. Stops rendering the volume, depending on the camera distance to the object (m). - */ - virtual void SetNearCutoff([[maybe_unused]] float nearCutoff) {}; - - /** - * Gets fall off direction horizontally. - */ - virtual float GetFallOffDirLong() { return FLT_MAX; } - /** - * Sets fall off direction horizontally. - */ - virtual void SetFallOffDirLong([[maybe_unused]] float fallOffDirLong) {}; - - /** - * Gets vertical fall off direction. - */ - virtual float GetFallOffDirLatitude() { return FLT_MAX; } - /** - * Sets vertical fall off direction. Controls the latitude of the world space fall off direction of the fog. - * A value of 90 degrees lets the fall off direction point upwards in world space (respectively, -90° points downwards). - */ - virtual void SetFallOffDirLatitude([[maybe_unused]] float fallOffDirLatitude) {}; - - /** - * Gets fall off shift. - */ - virtual float GetFallOffShift() { return FLT_MAX; } - /** - * Sets fall off shift. Controls how much to shift the fog density along the fall off direction. - * Positive values will move thicker fog layers along the fall off direction into the fog volume. - * Negative values will move thick layers along the negative fall off direction out of the fog volume. - */ - virtual void SetFallOffShift([[maybe_unused]] float fallOffShift) {}; - - /** - * Gets the scale of density distribution along the fall off direction. - */ - virtual float GetFallOffScale() { return FLT_MAX; } - /** - * Sets the scale of the density distribution along the fall off direction. Higher values will make the fog fall off more rapidly. - */ - virtual void SetFallOffScale([[maybe_unused]] float fallOffScale) {}; - - /** - * Gets a factor that is used to soften the edges of the fog volume when viewed from outside. - */ - virtual float GetSoftEdges() { return FLT_MAX; } - /** - * Sets a factor that is used to soften the edges of the fog volume when viewed from outside. - */ - virtual void SetSoftEdges([[maybe_unused]] float softEdges) {}; - - /** - * Gets the start distance of fog density ramp in world units (m) Only works with Volumetric Fog. - */ - virtual float GetRampStart() { return FLT_MAX; } - /** - * Sets the start distance of fog density ramp in world units (m) Only works with Volumetric Fog. - */ - virtual void SetRampStart([[maybe_unused]] float rampStart) {}; - - /** - * Gets the end distance of fog density ramp in world units (m). Only works with Volumetric Fog. - */ - virtual float GetRampEnd() { return FLT_MAX; } - /** - * Sets the end distance of fog density ramp in world units (m). Only works with Volumetric Fog. - */ - virtual void SetRampEnd([[maybe_unused]] float rampEnd) {}; - - /** - * Gets the influence of fog density ramp. Only works with Volumetric Fog. - */ - virtual float GetRampInfluence() { return FLT_MAX; } - /** - * Sets the influence of fog density ramp. Only works with Volumetric Fog. - */ - virtual void SetRampInfluence([[maybe_unused]] float rampInfluence) {}; - - /** - * Gets the influence of the global wind upon the fog volume. Only works with Volumetric Fog. - */ - virtual float GetWindInfluence() { return FLT_MAX; } - /** - * Sets the influence of the global wind upon the fog volume. Only works with Volumetric Fog. - */ - virtual void SetWindInfluence([[maybe_unused]] float windInfluence) {}; - - /** - * Gets the scale of the noise value for the density. Only works with Volumetric Fog. - */ - virtual float GetDensityNoiseScale() { return FLT_MAX; } - /** - * Sets the scale of the noise value for the density. This will define the thickness of the individual patches of fog (clouds), - * or if you look at it from the other direction it will define how big the spaces are in-between each cloud. Reducing the value - * will thin out the cloud density and increase the spacing between each cloud. - * Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseScale([[maybe_unused]] float densityNoiseScale) {}; - - /** - * Gets the offset of the noise value for the density. Only works with Volumetric Fog. - */ - virtual float GetDensityNoiseOffset() { return FLT_MAX; } - /** - * Sets the offset of the noise value for the density. Noise breaks up the solid shape of the fog volume into patches. - * Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseOffset([[maybe_unused]] float densityNoiseOffset) {}; - - /** - * Gets the time frequency of the noise for the density. High frequencies produce fast changing fog. Allows the individual fog patches to morph into - * different shapes during the course of their lifetime. Keep this value low otherwise they will morph too quickly and will look very unnatural - */ - virtual float GetDensityNoiseTimeFrequency() { return FLT_MAX; } - /** - * Sets the time frequency of the noise for the density. High frequencies produce fast changing fog. Only works with Volumetric Fog. - */ - virtual void SetDensityNoiseTimeFrequency([[maybe_unused]] float timeFrequency) {}; - - /** - * Gets the spatial frequency of the noise for the density. - */ - virtual AZ::Vector3 GetDensityNoiseFrequency() { return AZ::Vector3::CreateOne(); } - /** - * Sets the spatial frequency of the noise for the density. Allows defining how many fog patches are there. - * Increasing Z value will create a layered effect within the volume simulating different fog patches stacked on top of each other. - * Adding higher values in X & Y would mean there would be more individual fog patches within the volume. - * Only works with Volumetric Fog - */ - virtual void SetDensityNoiseFrequency([[maybe_unused]] AZ::Vector3 densityNoiseFrequency) {}; - - /** - * Returns true if the FogVolume entity should respond to VisAreas and ClipVolumes. - */ - virtual bool GetIgnoresVisAreas() { return false; }; - /** - * Sets whether the FogVolume entity should respond to VisAreas and ClipVolumes. - */ - virtual void SetIgnoresVisAreas([[maybe_unused]] bool ignoresVisAreas) {}; - - /** - * Returns true if the FogVolume entity effect doesn't occur in multiple VisAreas and ClipVolumes. - */ - virtual bool GetAffectsThisAreaOnly() { return false; }; - /** - * Sets whether the FogVolume entity effect doesn't occur in multiple VisAreas and ClipVolumes. - */ - virtual void SetAffectsThisAreaOnly([[maybe_unused]] bool affectsThisAreaOnly) {}; - }; - - using FogVolumeComponentRequestBus = AZ::EBus<FogVolumeComponentRequests>; -} \ No newline at end of file diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/RandomTimedSpawnerComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/RandomTimedSpawnerComponentBus.h index 90964264ee..be83b95376 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/RandomTimedSpawnerComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/RandomTimedSpawnerComponentBus.h @@ -97,4 +97,4 @@ namespace LmbrCentral using RandomTimedSpawnerComponentRequestBus = AZ::EBus<RandomTimedSpawnerComponentRequests>; -} //namespace LmbrCentral \ No newline at end of file +} //namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/SpawnerComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/SpawnerComponentBus.h index 6122a747f3..92ca003300 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/SpawnerComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Scripting/SpawnerComponentBus.h @@ -91,6 +91,9 @@ namespace LmbrCentral //! Note that spawning is not instant, if a slice hasn't finished spawning then none of its entities are returned. //! If an entity has been destroyed since it was spawned, its ID is not returned. virtual AZStd::vector<AZ::EntityId> GetAllCurrentlySpawnedEntities() = 0; + + //! Returns whether or not the spawner is in a state that's ready to spawn. + virtual bool IsReadyToSpawn() = 0; }; using SpawnerComponentRequestBus = AZ::EBus<SpawnerComponentRequests>; diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h index ff027cab10..da5b102c07 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h @@ -72,4 +72,4 @@ namespace LmbrCentral // Bus to service the Box Shape component event group using BoxShapeComponentRequestsBus = AZ::EBus<BoxShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CompoundShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CompoundShapeComponentBus.h index 2ff5672438..e5f2738aba 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CompoundShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CompoundShapeComponentBus.h @@ -84,4 +84,4 @@ namespace LmbrCentral // Bus to service the Compound Shape component hierarchy tests using CompoundShapeComponentHierarchyRequestsBus = AZ::EBus<CompoundShapeComponentHierarchyRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CylinderShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CylinderShapeComponentBus.h index c5b6e51314..f3e8363978 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CylinderShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/CylinderShapeComponentBus.h @@ -85,4 +85,4 @@ namespace LmbrCentral // Bus to service the Cylinder Shape component event group using CylinderShapeComponentRequestsBus = AZ::EBus<CylinderShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorPolygonPrismShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorPolygonPrismShapeComponentBus.h index 83f35c070d..71a521052b 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorPolygonPrismShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorPolygonPrismShapeComponentBus.h @@ -30,4 +30,4 @@ namespace LmbrCentral /// Type to inherit to provide EditorPolygonPrismShapeComponentRequests using EditorPolygonPrismShapeComponentRequestsBus = AZ::EBus<EditorPolygonPrismShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorSplineComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorSplineComponentBus.h index fd3a6c4cf3..7ba32278de 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorSplineComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorSplineComponentBus.h @@ -30,4 +30,4 @@ namespace LmbrCentral /// Type to inherit to provide EditorPolygonPrismShapeComponentRequests using EditorSplineComponentNotificationBus = AZ::EBus<EditorSplineComponentNotifications>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorTubeShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorTubeShapeComponentBus.h index 4fe9bb8b94..76e973890c 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorTubeShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/EditorTubeShapeComponentBus.h @@ -32,4 +32,4 @@ namespace LmbrCentral /// Type to inherit to provide EditorTubeShapeComponentRequests using EditorTubeShapeComponentRequestBus = AZ::EBus<EditorTubeShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/PolygonPrismShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/PolygonPrismShapeComponentBus.h index fab813dcee..be76dfb5d7 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/PolygonPrismShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/PolygonPrismShapeComponentBus.h @@ -83,4 +83,4 @@ namespace LmbrCentral PolygonPrismShapeConfig() = default; }; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SphereShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SphereShapeComponentBus.h index bbe4685ab4..15a807a82a 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SphereShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SphereShapeComponentBus.h @@ -71,4 +71,4 @@ namespace LmbrCentral // Bus to service the Sphere Shape component event group using SphereShapeComponentRequestsBus = AZ::EBus<SphereShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.h index 332bcf0269..e5ac5e4df5 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.h @@ -121,4 +121,4 @@ namespace LmbrCentral } } // namespace LmbrCentral -#include "SplineAttribute.inl" \ No newline at end of file +#include "SplineAttribute.inl" diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.inl b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.inl index 4f30b19b6a..e15eadfefe 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.inl +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineAttribute.inl @@ -189,4 +189,4 @@ namespace LmbrCentral { m_elementEditData = elementData; } -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineComponentBus.h index c8434e4d91..36aac84e7e 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/SplineComponentBus.h @@ -72,4 +72,4 @@ namespace LmbrCentral /// Bus to service the spline component notification group. using SplineComponentNotificationBus = AZ::EBus<SplineComponentNotification>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/TubeShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/TubeShapeComponentBus.h index db0560bb25..91cb72c7e7 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/TubeShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/TubeShapeComponentBus.h @@ -58,4 +58,4 @@ namespace LmbrCentral /// Bus to service the TubeShapeComponent event group using TubeShapeComponentRequestsBus = AZ::EBus<TubeShapeComponentRequests>; -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake index a7dcc8f770..ab245a07f4 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake @@ -58,8 +58,6 @@ set(FILES Source/Rendering/EditorMeshComponent.cpp Source/Rendering/EditorHighQualityShadowComponent.h Source/Rendering/EditorHighQualityShadowComponent.cpp - Source/Rendering/EditorFogVolumeComponent.h - Source/Rendering/EditorFogVolumeComponent.cpp Source/Rendering/EditorGeomCacheComponent.h Source/Rendering/EditorGeomCacheComponent.cpp Source/Scripting/EditorLookAtComponent.h diff --git a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake index ba0330e93c..d0df6c7dd0 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake @@ -45,7 +45,6 @@ set(FILES include/LmbrCentral/Rendering/MeshComponentBus.h include/LmbrCentral/Rendering/MeshModificationBus.h include/LmbrCentral/Rendering/RenderNodeBus.h - include/LmbrCentral/Rendering/FogVolumeComponentBus.h include/LmbrCentral/Rendering/HighQualityShadowComponentBus.h include/LmbrCentral/Rendering/GeomCacheComponentBus.h include/LmbrCentral/Rendering/GiRegistrationBus.h @@ -115,12 +114,6 @@ set(FILES Source/Rendering/LightInstance.h Source/Rendering/LightInstance.cpp Source/Rendering/MaterialHandle.cpp - Source/Rendering/FogVolumeComponent.h - Source/Rendering/FogVolumeComponent.cpp - Source/Rendering/FogVolumeCommon.h - Source/Rendering/FogVolumeCommon.cpp - Source/Rendering/FogVolumeRequestsHandler.h - Source/Rendering/FogVolumeRequestsHandler.cpp Source/Rendering/MeshAssetHandler.h Source/Rendering/MeshAssetHandler.cpp Source/Rendering/MeshComponent.h diff --git a/Gems/LyShine/Assets/LyShine_Dependencies.xml b/Gems/LyShine/Assets/LyShine_Dependencies.xml index 48abd7fe38..83c63cfbd4 100644 --- a/Gems/LyShine/Assets/LyShine_Dependencies.xml +++ b/Gems/LyShine/Assets/LyShine_Dependencies.xml @@ -6,4 +6,4 @@ <Dependency path="textures/defaults/sliderManipulator.tif" optional="true" /> <Dependency path="textures/defaults/sliderManipulator.sprite" optional="true" /> <Dependency path="engineassets/textures/cursor_green.sprite" optional="true" /> -</EngineDependencies> \ No newline at end of file +</EngineDependencies> diff --git a/Gems/LyShine/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings b/Gems/LyShine/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/LyShine/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings +++ b/Gems/LyShine/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewEventNode.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewEventNode.cpp index f57a2aac00..562d1ebbee 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewEventNode.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewEventNode.cpp @@ -108,4 +108,4 @@ void CUiAnimViewEventNode::RemoveTrackEvent(const char* removedEventName) { // rename the removedEventName keys to the empty string, which represents an unset event key RenameTrackEvent(removedEventName, ""); -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Editor/AssetTreeEntry.h b/Gems/LyShine/Code/Editor/AssetTreeEntry.h index e39ff49fe4..73c47500b6 100644 --- a/Gems/LyShine/Code/Editor/AssetTreeEntry.h +++ b/Gems/LyShine/Code/Editor/AssetTreeEntry.h @@ -63,4 +63,4 @@ public: // data protected: void Insert(const AZStd::string& path, const AZStd::string& menuName, const AZ::Data::AssetId& assetId); -}; \ No newline at end of file +}; diff --git a/Gems/LyShine/Code/Editor/Platform/Linux/PAL_linux.cmake b/Gems/LyShine/Code/Editor/Platform/Linux/PAL_linux.cmake index 351856a397..c8d979ae26 100644 --- a/Gems/LyShine/Code/Editor/Platform/Linux/PAL_linux.cmake +++ b/Gems/LyShine/Code/Editor/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED FALSE) diff --git a/Gems/LyShine/Code/Editor/Platform/Mac/PAL_mac.cmake b/Gems/LyShine/Code/Editor/Platform/Mac/PAL_mac.cmake index 1411808cf7..ea20711775 100644 --- a/Gems/LyShine/Code/Editor/Platform/Mac/PAL_mac.cmake +++ b/Gems/LyShine/Code/Editor/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED TRUE) diff --git a/Gems/LyShine/Code/Editor/Platform/Windows/PAL_windows.cmake b/Gems/LyShine/Code/Editor/Platform/Windows/PAL_windows.cmake index 1411808cf7..ea20711775 100644 --- a/Gems/LyShine/Code/Editor/Platform/Windows/PAL_windows.cmake +++ b/Gems/LyShine/Code/Editor/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_UICANVASPLUGIN_SUPPORTED TRUE) diff --git a/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleColorKeyframe.h b/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleColorKeyframe.h index 32a0ae56b5..d0d8862562 100644 --- a/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleColorKeyframe.h +++ b/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleColorKeyframe.h @@ -64,4 +64,4 @@ public: AZ::EntityId GetParentEntityId(AzToolsFramework::InstanceDataNode* node, size_t index); static void Register(); -}; \ No newline at end of file +}; diff --git a/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleFloatKeyframe.h b/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleFloatKeyframe.h index dc2093d00e..1f94f0ed5e 100644 --- a/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleFloatKeyframe.h +++ b/Gems/LyShine/Code/Editor/PropertyHandlerUiParticleFloatKeyframe.h @@ -64,4 +64,4 @@ public: AZ::EntityId GetParentEntityId(AzToolsFramework::InstanceDataNode* node, size_t index); static void Register(); -}; \ No newline at end of file +}; diff --git a/Gems/LyShine/Code/Editor/UiEditorEntityContextBus.h b/Gems/LyShine/Code/Editor/UiEditorEntityContextBus.h index a9d7cc68b2..36eebbf02e 100644 --- a/Gems/LyShine/Code/Editor/UiEditorEntityContextBus.h +++ b/Gems/LyShine/Code/Editor/UiEditorEntityContextBus.h @@ -108,4 +108,4 @@ public: virtual void OnSliceInstantiationFailed(const AZ::Data::AssetId& /*sliceAssetId*/, const AzFramework::SliceInstantiationTicket& /*ticket*/) {} }; -using UiEditorEntityContextNotificationBus = AZ::EBus<UiEditorEntityContextNotification>; \ No newline at end of file +using UiEditorEntityContextNotificationBus = AZ::EBus<UiEditorEntityContextNotification>; diff --git a/Gems/LyShine/Code/Editor/ViewportDragInteraction.h b/Gems/LyShine/Code/Editor/ViewportDragInteraction.h index f7574900a2..477720d0a2 100644 --- a/Gems/LyShine/Code/Editor/ViewportDragInteraction.h +++ b/Gems/LyShine/Code/Editor/ViewportDragInteraction.h @@ -12,7 +12,7 @@ #pragma once #include <AzCore/Math/Vector2.h> -#include <LyShine/IDraw2d.h> +#include <LyShine/Draw2d.h> //! Abstract base class for drag interactions in the UI Editor viewport window. class ViewportDragInteraction diff --git a/Gems/LyShine/Code/Editor/ViewportHelpers.h b/Gems/LyShine/Code/Editor/ViewportHelpers.h index d128603171..9a1aadead5 100644 --- a/Gems/LyShine/Code/Editor/ViewportHelpers.h +++ b/Gems/LyShine/Code/Editor/ViewportHelpers.h @@ -11,6 +11,8 @@ */ #pragma once +#include <LyShine/Draw2d.h> + namespace ViewportHelpers { //------------------------------------------------------------------------------- diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.cpp b/Gems/LyShine/Code/Editor/ViewportIcon.cpp index 5ce2bf37f7..1e137fe91b 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.cpp +++ b/Gems/LyShine/Code/Editor/ViewportIcon.cpp @@ -12,25 +12,34 @@ #include "UiCanvasEditor_precompiled.h" #include "EditorCommon.h" +#include <LyShine/Draw2d.h> + +#include <Atom/RPI.Public/Image/StreamingImage.h> +#include <Atom/RPI.Reflect/Image/StreamingImageAsset.h> ViewportIcon::ViewportIcon(const char* textureFilename) - : m_texture(gEnv->pRenderer->EF_LoadTexture(textureFilename, FT_DONT_STREAM)) { + m_image = CDraw2d::LoadTexture(textureFilename); } ViewportIcon::~ViewportIcon() { - gEnv->pRenderer->RemoveTexture(m_texture->GetTextureID()); } AZ::Vector2 ViewportIcon::GetTextureSize() const { - return AZ::Vector2(aznumeric_cast<float>(m_texture->GetWidth()), aznumeric_cast<float>(m_texture->GetHeight())); + if (m_image) + { + AZ::RHI::Size size = m_image->GetDescriptor().m_size; + return AZ::Vector2(size.m_width, size.m_height); + } + + return AZ::Vector2(0.0f, 0.0f); } void ViewportIcon::DrawImageAligned(Draw2dHelper& draw2d, AZ::Vector2& pivot, float opacity) { - draw2d.DrawImageAligned(m_texture->GetTextureID(), + draw2d.DrawImageAligned(m_image, pivot, GetTextureSize(), IDraw2d::HAlign::Center, @@ -43,7 +52,7 @@ void ViewportIcon::DrawImageTiled(Draw2dHelper& draw2d, IDraw2d::VertexPosColUV* // Use default blending and rounding modes int blendMode = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; IDraw2d::Rounding rounding = IDraw2d::Rounding::Nearest; - draw2d.DrawQuad(m_texture->GetTextureID(), verts, blendMode, rounding); + draw2d.DrawQuad(m_image, verts, blendMode, rounding); } void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 bound0, AZ::Vector2 bound1) @@ -73,7 +82,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 verts[0].uv = AZ::Vector2(0.0f, 0.5f); verts[1].uv = AZ::Vector2(endTexCoordU, 0.5f); - draw2d.DrawLineTextured(m_texture->GetTextureID(), verts); + draw2d.DrawLineTextured(m_image, verts); } // bound0 @@ -89,7 +98,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 verts[0].uv = AZ::Vector2(0.0f, 0.5f); verts[1].uv = AZ::Vector2(endTexCoordV, 0.5f); - draw2d.DrawLineTextured(m_texture->GetTextureID(), verts); + draw2d.DrawLineTextured(m_image, verts); } // bound0 @@ -105,7 +114,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 verts[0].uv = AZ::Vector2(0.0f, 0.5f); verts[1].uv = AZ::Vector2(endTexCoordU, 0.5f); - draw2d.DrawLineTextured(m_texture->GetTextureID(), verts); + draw2d.DrawLineTextured(m_image, verts); } // bound0 @@ -121,7 +130,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 verts[0].uv = AZ::Vector2(0.0f, 0.5f); verts[1].uv = AZ::Vector2(endTexCoordV, 0.5f); - draw2d.DrawLineTextured(m_texture->GetTextureID(), verts); + draw2d.DrawLineTextured(m_image, verts); } } @@ -189,7 +198,7 @@ void ViewportIcon::Draw(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, const AZ::M verts[3].position = originPos - widthVec * originRatio.GetX() + heightVec * (1.0f - originRatio.GetY()); } - draw2d.DrawQuad(m_texture->GetTextureID(), verts); + draw2d.DrawQuad(m_image, verts); } void ViewportIcon::DrawAnchorLines(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, AZ::Vector2 targetPos, const AZ::Matrix4x4& transform, @@ -252,7 +261,7 @@ void ViewportIcon::DrawDistanceLine(Draw2dHelper& draw2d, AZ::Vector2 start, AZ: verts[1].color = dottedColor; verts[1].uv = AZ::Vector2(endTexCoordU, 0.5f); - draw2d.DrawLineTextured(m_texture->GetTextureID(), verts); + draw2d.DrawLineTextured(m_image, verts); // Now draw the text rotated to match the angle of the line and slightly offset from the center point @@ -379,7 +388,7 @@ void ViewportIcon::DrawElementRectOutline([[maybe_unused]] Draw2dHelper& draw2d, float rectHeight = heightVec.GetLength(); // the outline "width" will be based on the texture height - int textureHeight = m_texture->GetHeight(); + float textureHeight = GetTextureSize().GetY(); if (textureHeight <= 0) { return; // should never happen - avoiding possible divide by zero later @@ -464,6 +473,7 @@ void ViewportIcon::DrawElementRectOutline([[maybe_unused]] Draw2dHelper& draw2d, 5, 1, 7, 1, 7, 3, // right quad }; +#ifdef LYSHINE_ATOM_TODO IRenderer* renderer = gEnv->pRenderer; renderer->SetTexture(m_texture->GetTextureID()); @@ -472,4 +482,7 @@ void ViewportIcon::DrawElementRectOutline([[maybe_unused]] Draw2dHelper& draw2d, // This will end up using DrawIndexedPrimitive to render the quad renderer->DrawDynVB(vertices, indicies, NUM_VERTS, NUM_INDICES, prtTriangleList); +#else + // LYSHINE_ATOM_TODO - add option in Draw2d to draw indexed primitive for this textured element outline +#endif } diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.h b/Gems/LyShine/Code/Editor/ViewportIcon.h index 5f72c7562a..85fd2fe068 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.h +++ b/Gems/LyShine/Code/Editor/ViewportIcon.h @@ -11,6 +11,8 @@ */ #pragma once +#include <Atom/RPI.Reflect/Image/Image.h> + class ViewportIcon { public: @@ -48,6 +50,5 @@ public: void DrawElementRectOutline(Draw2dHelper& draw2d, AZ::EntityId entityId, AZ::Color color); private: - - ITexture* m_texture; + AZ::Data::Instance<AZ::RPI::Image> m_image; }; diff --git a/Gems/LyShine/Code/Editor/ViewportWidget.cpp b/Gems/LyShine/Code/Editor/ViewportWidget.cpp index c805d45bef..9956a39647 100644 --- a/Gems/LyShine/Code/Editor/ViewportWidget.cpp +++ b/Gems/LyShine/Code/Editor/ViewportWidget.cpp @@ -21,6 +21,7 @@ #include <QViewportSettings.h> #include <LyShine/Bus/UiEditorCanvasBus.h> +#include <LyShine/Draw2d.h> #include "LyShine.h" #include "UiRenderer.h" @@ -203,7 +204,7 @@ namespace } // anonymous namespace. ViewportWidget::ViewportWidget(EditorWindow* parent) - : AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent) + : AtomToolsFramework::RenderViewportWidget(parent) , m_editorWindow(parent) , m_viewportInteraction(new ViewportInteraction(m_editorWindow)) , m_viewportAnchor(new ViewportAnchor()) @@ -277,6 +278,8 @@ void ViewportWidget::InitUiRenderer() // Only one viewport/renderer is currently supported in the UI Editor CLyShine* lyShine = static_cast<CLyShine*>(gEnv->pLyShine); lyShine->SetUiRendererForEditor(m_uiRenderer); + + m_draw2d = AZStd::make_shared<CDraw2d>(GetViewportContext()); } ViewportInteraction* ViewportWidget::GetViewportInteraction() @@ -914,7 +917,7 @@ void ViewportWidget::RenderEditMode(float deltaTime) return; // this can happen if a render happens during a restart } - Draw2dHelper draw2d; // sets and resets 2D draw mode in constructor/destructor + Draw2dHelper draw2d(m_draw2d.get()); // sets and resets 2D draw mode in constructor/destructor QTreeWidgetItemRawPtrQList selection = m_editorWindow->GetHierarchy()->selectedItems(); @@ -1142,7 +1145,7 @@ void ViewportWidget::RenderPreviewMode(float deltaTime) AZ::Vector2 topLeftInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, AZ::Vector2(0.0f, 0.0f)); AZ::Vector2 bottomRightInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, canvasSize); AZ::Vector2 sizeInViewportSpace = bottomRightInViewportSpace - topLeftInViewportSpace; - Draw2dHelper draw2d; + Draw2dHelper draw2d(m_draw2d.get()) int texId = gEnv->pRenderer->GetBlackTextureId(); draw2d.DrawImage(texId, topLeftInViewportSpace, sizeInViewportSpace); #endif diff --git a/Gems/LyShine/Code/Editor/ViewportWidget.h b/Gems/LyShine/Code/Editor/ViewportWidget.h index e506a26d88..4d15f3dea4 100644 --- a/Gems/LyShine/Code/Editor/ViewportWidget.h +++ b/Gems/LyShine/Code/Editor/ViewportWidget.h @@ -25,6 +25,7 @@ class RulerWidget; class QMimeData; class UiRenderer; +class CDraw2d; class ViewportWidget : public AtomToolsFramework::RenderViewportWidget @@ -201,4 +202,5 @@ private: // data bool m_fontTextureHasChanged = false; AZStd::shared_ptr<UiRenderer> m_uiRenderer; + AZStd::shared_ptr<CDraw2d> m_draw2d; }; diff --git a/Gems/LyShine/Code/Include/LyShine/Draw2d.h b/Gems/LyShine/Code/Include/LyShine/Draw2d.h new file mode 100644 index 0000000000..ec636c3e3b --- /dev/null +++ b/Gems/LyShine/Code/Include/LyShine/Draw2d.h @@ -0,0 +1,517 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ +#pragma once + +#include <LyShine/IDraw2d.h> +#include <LyShine/ILyShine.h> + +#include <Atom/Bootstrap/BootstrapNotificationBus.h> +#include <Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h> +#include <Atom/RPI.Reflect/Image/Image.h> +#include <Atom/RPI.Public/ViewportContext.h> + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//! Implementation of IDraw2d interface for 2D drawing in screen space +// +//! The CDraw2d class implements the IDraw2d interface for drawing 2D images, shapes and text. +//! Positions and sizes are specified in pixels in the associated 2D viewport. +class CDraw2d + : public IDraw2d // LYSHINE_ATOM_TODO - keep around until gEnv->pLyShine is replaced by bus interface + , public AZ::Render::Bootstrap::NotificationBus::Handler +{ +public: // member functions + + //! Constructor, constructed by the LyShine class + CDraw2d(AZ::RPI::ViewportContextPtr viewportContext = nullptr); + + // IDraw2d + + ~CDraw2d() override; + + // ~IDraw2d + + //! Draw a textured quad with the top left corner at the given position. + // + //! The image is drawn with the color specified by SetShapeColor and the opacity + //! passed as an argument. + //! If rotation is non-zero then the quad is rotated. If the pivot point is + //! provided then the points of the quad are rotated about that point, otherwise + //! they are rotated about the top left corner of the quad. + //! \param texId The texture ID returned by ITexture::GetTextureID() + //! \param position Position of the top left corner of the quad (before rotation) in pixels + //! \param size The width and height of the quad. Use texture width and height to avoid minification, + //! magnification or stretching (assuming the minMaxTexCoords are left to the default) + //! \param opacity The alpha value used when blending + //! \param rotation Angle of rotation in degrees counter-clockwise + //! \param pivotPoint The point about which the quad is rotated + //! \param minMaxTexCoords An optional two component array. The first component is the UV coord for the top left + //! point of the quad and the second is the UV coord of the bottom right point of the quad + //! \param imageOptions Optional struct specifying options that tend to be the same from call to call + void DrawImage(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, float opacity = 1.0f, + float rotation = 0.0f, const AZ::Vector2* pivotPoint = nullptr, const AZ::Vector2* minMaxTexCoords = nullptr, + ImageOptions* imageOptions = nullptr); + + //! Draw a textured quad where the position specifies the point specified by the alignment. + // + //! Rotation is always around the position. + //! \param texId The texture ID returned by ITexture::GetTextureID() + //! \param position Position align point of the quad (before rotation) in pixels + //! \param size The width and height of the quad. Use texture width and height to avoid minification, + //! magnification or stretching (assuming the minMaxTexCoords are left to the default) + //! \param horizontalAlignment Specifies how the quad is horizontally aligned to the given position + //! \param verticalAlignment Specifies how the quad is vertically aligned to the given position + //! \param opacity The alpha value used when blending + //! \param rotation Angle of rotation in degrees counter-clockwise + //! \param minMaxTexCoords An optional two component array. The first component is the UV coord for the top left + //! point of the quad and the second is the UV coord of the bottom right point of the quad + //! \param imageOptions Optional struct specifying options that tend to be the same from call to call + void DrawImageAligned(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, + HAlign horizontalAlignment, VAlign verticalAlignment, + float opacity = 1.0f, float rotation = 0.0f, const AZ::Vector2* minMaxTexCoords = nullptr, + ImageOptions* imageOptions = nullptr); + + //! Draw a textured quad where the position, color and uv of each point is specified explicitly + // + //! \param texId The texture ID returned by ITexture::GetTextureID() + //! \param verts An array of 4 vertices, in clockwise order (e.g. top left, top right, bottom right, bottom left) + //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) + //! \param pixelRounding Whether and how to round pixel coordinates + //! \param baseState Additional render state to pass to or into value passed to renderer SetState + virtual void DrawQuad(AZ::Data::Instance<AZ::RPI::Image> image, + VertexPosColUV* verts, + int blendMode = UseDefault, + Rounding pixelRounding = Rounding::Nearest, + int baseState = UseDefault); + + //! Draw a line + // + //! \param start The start position + //! \param end The end position + //! \param color The color of the line + //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) + //! \param pixelRounding Whether and how to round pixel coordinates + //! \param baseState Additional render state to pass to or into value passed to renderer SetState + virtual void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, + int blendMode = UseDefault, + IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, + int baseState = UseDefault); + + //! Draw a line with a texture so it can be dotted or dashed + // + //! \param texId The texture ID returned by ITexture::GetTextureID() + //! \param verts An array of 2 vertices for the start and end points of the line + //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) + //! \param pixelRounding Whether and how to round pixel coordinates + //! \param baseState Additional render state to pass to or into value passed to renderer SetState + virtual void DrawLineTextured(AZ::Data::Instance<AZ::RPI::Image> image, + VertexPosColUV* verts, + int blendMode = UseDefault, + IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, + int baseState = UseDefault); + //! Draw a text string. Only supports ASCII text. + // + //! The font and effect used to render the text are specified in the textOptions structure + //! \param textString A null terminated ASCII text string. May contain \n characters + //! \param position Position of the text in pixels. Alignment values in textOptions affect actual position + //! \param pointSize The size of the font to use + //! \param opacity The opacity (alpha value) to use to draw the text + //! \param textOptions Pointer to an options struct. If null the default options are used + void DrawText(const char* textString, AZ::Vector2 position, float pointSize, + float opacity = 1.0f, TextOptions* textOptions = nullptr); + + //! Get the width and height (in pixels) that would be used to draw the given text string. + // + //! Pass the same parameter values that would be used to draw the string + AZ::Vector2 GetTextSize(const char* textString, float pointSize, TextOptions* textOptions = nullptr); + + //! Get the width of the rendering viewport (in pixels). + float GetViewportWidth() const; + + //! Get the height of the rendering viewport (in pixels). + float GetViewportHeight() const; + + //! Get the default values that would be used if no image options were passed in + // + //! This is a convenient way to initialize the imageOptions struct + virtual const ImageOptions& GetDefaultImageOptions() const; + + //! Get the default values that would be used if no text options were passed in + // + //! This is a convenient way to initialize the textOptions struct + virtual const TextOptions& GetDefaultTextOptions() const; + + //! Render the primitives that have been deferred + void RenderDeferredPrimitives(); + + //! Specify whether to defer future primitives or render them right away + void SetDeferPrimitives(bool deferPrimitives); + + //! Return whether future primitives will be deferred or rendered right away + bool GetDeferPrimitives(); + +private: + + AZ_DISABLE_COPY_MOVE(CDraw2d); + + // AZ::Render::Bootstrap::NotificationBus overrides + void OnBootstrapSceneReady(AZ::RPI::Scene* bootstrapScene) override; + +public: // static member functions + + //! Given a position and size and an alignment return the top left corner of the aligned quad + static AZ::Vector2 Align(AZ::Vector2 position, AZ::Vector2 size, HAlign horizontalAlignment, VAlign verticalAlignment); + + //! Helper to load a texture + static AZ::Data::Instance<AZ::RPI::Image> LoadTexture(const AZStd::string& pathName); + +protected: // types and constants + + enum + { + MAX_VERTICES_IN_PRIM = 6 + }; + + // Cached shader data + struct Draw2dShaderData + { + AZ::RHI::ShaderInputImageIndex m_imageInputIndex; + AZ::RHI::ShaderInputConstantIndex m_viewProjInputIndex; + }; + + class DeferredPrimitive + { + public: + virtual ~DeferredPrimitive() {}; + virtual void Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const = 0; + }; + + class DeferredQuad + : public DeferredPrimitive + { + public: + ~DeferredQuad() override {}; + void Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const override; + + AZ::Vector2 m_points[4]; + AZ::Vector2 m_texCoords[4]; + uint32 m_packedColors[4]; + AZ::Data::Instance<AZ::RPI::Image> m_image; + int m_state; + }; + + class DeferredLine + : public DeferredPrimitive + { + public: + ~DeferredLine() override {}; + void Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const override; + + AZ::Data::Instance<AZ::RPI::Image> m_image; + AZ::Vector2 m_points[2]; + AZ::Vector2 m_texCoords[2]; + uint32 m_packedColors[2]; + int m_state; + }; + + class DeferredText + : public DeferredPrimitive + { + public: + ~DeferredText() override {}; + void Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const override; + + STextDrawContext m_fontContext; + IFFont* m_font; + AZ::Vector2 m_position; + std::string m_string; + }; + +protected: // member functions + + //! Rotate an array of points around the z-axis at the pivot point. + // + //! Angle is in degrees counter-clockwise + void RotatePointsAboutPivot(AZ::Vector2* points, int numPoints, AZ::Vector2 pivot, float angle) const; + + //! Helper function to render a text string + void DrawTextInternal(const char* textString, IFFont* font, unsigned int effectIndex, + AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, + HAlign horizontalAlignment, VAlign verticalAlignment, int baseState); + + //! Draw or defer a quad + void DrawOrDeferQuad(const DeferredQuad* quad); + + //! Draw or defer a line + void DrawOrDeferLine(const DeferredLine* line); + + //! Get specified viewport context or default viewport context if not specified + AZ::RPI::ViewportContextPtr GetViewportContext() const; + +protected: // attributes + + ImageOptions m_defaultImageOptions; //!< The default image options used if nullptr is passed + TextOptions m_defaultTextOptions; //!< The default text options used if nullptr is passed + + //! True if the actual render of the primitives should be deferred to a RenderDeferredPrimitives call + bool m_deferCalls; + + std::vector<DeferredPrimitive*> m_deferredPrimitives; + + AZ::RPI::ViewportContextPtr m_viewportContext; + AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> m_dynamicDraw; + Draw2dShaderData m_shaderData; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//! Helper class for using the IDraw2d interface +//! +//! The Draw2dHelper class is an inline wrapper that provides the convenience feature of +//! automatically setting member options structures to their defaults and providing set functions. +class Draw2dHelper +{ +public: // member functions + + //! Start a section of 2D drawing function calls that will render to the default viewport + Draw2dHelper(bool deferCalls = false) + { + InitCommon(nullptr, deferCalls); + } + + //! Start a section of 2D drawing function calls that will render to the viewport + //! associated with the specified Draw2d object + Draw2dHelper(CDraw2d* draw2d, bool deferCalls = false) + { + InitCommon(draw2d, deferCalls); + } + + void InitCommon(CDraw2d* draw2d, bool deferCalls) + { + m_draw2d = draw2d; + + if (!m_draw2d) + { + // Set to default which is the game's draw 2d object + m_draw2d = GetDefaultDraw2d(); + } + + if (m_draw2d) + { + m_previousDeferCalls = m_draw2d->GetDeferPrimitives(); + m_draw2d->SetDeferPrimitives(deferCalls); + m_imageOptions = m_draw2d->GetDefaultImageOptions(); + m_textOptions = m_draw2d->GetDefaultTextOptions(); + } + } + + //! End a section of 2D drawing function calls. + ~Draw2dHelper() + { + if (m_draw2d) + { + m_draw2d->SetDeferPrimitives(m_previousDeferCalls); + } + } + + //! Draw a textured quad, optional rotation is counter-clockwise in degrees. + // + //! See IDraw2d:DrawImage for parameter descriptions + void DrawImage(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, float opacity = 1.0f, + float rotation = 0.0f, const AZ::Vector2* pivotPoint = nullptr, const AZ::Vector2* minMaxTexCoords = nullptr) + { + if (m_draw2d) + { + m_draw2d->DrawImage(image, position, size, opacity, rotation, pivotPoint, minMaxTexCoords, &m_imageOptions); + } + } + + //! Draw a textured quad where the position specifies the point specified by the alignment. + // + //! See IDraw2d:DrawImageAligned for parameter descriptions + void DrawImageAligned(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, + IDraw2d::HAlign horizontalAlignment, IDraw2d::VAlign verticalAlignment, + float opacity = 1.0f, float rotation = 0.0f, const AZ::Vector2* minMaxTexCoords = nullptr) + { + if (m_draw2d) + { + m_draw2d->DrawImageAligned(image, position, size, horizontalAlignment, verticalAlignment, + opacity, rotation, minMaxTexCoords, &m_imageOptions); + } + } + + //! Draw a textured quad where the position, color and uv of each point is specified explicitly + // + //! See IDraw2d:DrawQuad for parameter descriptions + void DrawQuad(AZ::Data::Instance<AZ::RPI::Image> image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, + int baseState = IDraw2d::UseDefault) + { + if (m_draw2d) + { + m_draw2d->DrawQuad(image, verts, blendMode, pixelRounding, baseState); + } + } + + //! Draw a line + // + //! See IDraw2d:DrawLine for parameter descriptions + void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode = IDraw2d::UseDefault, + IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, + int baseState = IDraw2d::UseDefault) + { + if (m_draw2d) + { + m_draw2d->DrawLine(start, end, color, blendMode, pixelRounding, baseState); + } + } + + //! Draw a line with a texture so it can be dotted or dashed + // + //! See IDraw2d:DrawLineTextured for parameter descriptions + void DrawLineTextured(AZ::Data::Instance<AZ::RPI::Image> image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, + int baseState = IDraw2d::UseDefault) + { + if (m_draw2d) + { + m_draw2d->DrawLineTextured(image, verts, blendMode, pixelRounding, baseState); + } + } + + //! Draw a text string. Only supports ASCII text. + // + //! See IDraw2d:DrawText for parameter descriptions + void DrawText(const char* textString, AZ::Vector2 position, float pointSize, float opacity = 1.0f) + { + if (m_draw2d) + { + m_draw2d->DrawText(textString, position, pointSize, opacity, &m_textOptions); + } + } + + //! Get the width and height (in pixels) that would be used to draw the given text string. + // + //! See IDraw2d:GetTextSize for parameter descriptions + AZ::Vector2 GetTextSize(const char* textString, float pointSize) + { + if (m_draw2d) + { + return m_draw2d->GetTextSize(textString, pointSize, &m_textOptions); + } + else + { + return AZ::Vector2(0, 0); + } + } + + // State management + + //! Set the blend mode used for images, default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA. + void SetImageBlendMode(int mode) { m_imageOptions.blendMode = mode; } + + //! Set the color used for DrawImage and other image drawing. + void SetImageColor(AZ::Vector3 color) { m_imageOptions.color = color; } + + //! Set whether images are rounded to have the points on exact pixel boundaries. + void SetImagePixelRounding(IDraw2d::Rounding round) { m_imageOptions.pixelRounding = round; } + + //! Set the base state (that blend mode etc is combined with) used for images, default is GS_NODEPTHTEST. + void SetImageBaseState(int state) { m_imageOptions.baseState = state; } + + //! Set the text font. + void SetTextFont(IFFont* font) { m_textOptions.font = font; } + + //! Set the text font effect index. + void SetTextEffectIndex(unsigned int effectIndex) { m_textOptions.effectIndex = effectIndex; } + + //! Set the text color. + void SetTextColor(AZ::Vector3 color) { m_textOptions.color = color; } + + //! Set the text alignment. + void SetTextAlignment(IDraw2d::HAlign horizontalAlignment, IDraw2d::VAlign verticalAlignment) + { + m_textOptions.horizontalAlignment = horizontalAlignment; + m_textOptions.verticalAlignment = verticalAlignment; + } + + //! Set a drop shadow for text drawing. An alpha of zero disables drop shadow. + void SetTextDropShadow(AZ::Vector2 offset, AZ::Color color) + { + m_textOptions.dropShadowOffset = offset; + m_textOptions.dropShadowColor = color; + } + + //! Set a rotation for the text. The text rotates around its position (taking into account alignment). + void SetTextRotation(float rotation) + { + m_textOptions.rotation = rotation; + } + + //! Set the base state (that blend mode etc is combined with) used for text, default is GS_NODEPTHTEST. + void SetTextBaseState(int state) { m_textOptions.baseState = state; } + +public: // static member functions + + //! Helper to get the default IDraw2d interface + static CDraw2d* GetDefaultDraw2d() + { + if (gEnv && gEnv->pLyShine) // LYSHINE_ATOM_TODO - remove pLyShine and use bus interface + { + IDraw2d* draw2d = gEnv->pLyShine->GetDraw2d(); + return reinterpret_cast<CDraw2d*>(draw2d); + } + + return nullptr; + } + + //! Round the X and Y coordinates of a point using the given rounding policy + template<typename T> + static T RoundXY(T value, IDraw2d::Rounding roundingType) + { + T result = value; + + switch (roundingType) + { + case IDraw2d::Rounding::None: + // nothing to do + break; + case IDraw2d::Rounding::Nearest: + result.SetX(floor(value.GetX() + 0.5f)); + result.SetY(floor(value.GetY() + 0.5f)); + break; + case IDraw2d::Rounding::Down: + result.SetX(floor(value.GetX())); + result.SetY(floor(value.GetY())); + break; + case IDraw2d::Rounding::Up: + result.SetX(ceil(value.GetX())); + result.SetY(ceil(value.GetY())); + break; + } + + return result; + } + +protected: // attributes + + IDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions + IDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions + CDraw2d* m_draw2d; + bool m_previousDeferCalls; +}; diff --git a/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.h b/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.h index bbb58315d3..db7fdee53e 100644 --- a/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.h +++ b/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.h @@ -55,4 +55,4 @@ namespace LyShine //! an assert about duplicate entities. This has no noticeable effect on performance right now mutable AZStd::mutex m_processingMutex; }; -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/Animation/AnimTrack.cpp b/Gems/LyShine/Code/Source/Animation/AnimTrack.cpp index 3ce3d4bd37..0f2419b5f8 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimTrack.cpp +++ b/Gems/LyShine/Code/Source/Animation/AnimTrack.cpp @@ -12,4 +12,4 @@ // Original file Copyright Crytek GMBH or its affiliates, used under license. #include "LyShine_precompiled.h" -#include "AnimTrack.h" \ No newline at end of file +#include "AnimTrack.h" diff --git a/Gems/LyShine/Code/Source/Animation/EventNode.cpp b/Gems/LyShine/Code/Source/Animation/EventNode.cpp index e18eb4a51c..6dd7693f2a 100644 --- a/Gems/LyShine/Code/Source/Animation/EventNode.cpp +++ b/Gems/LyShine/Code/Source/Animation/EventNode.cpp @@ -112,4 +112,4 @@ void CUiAnimEventNode::Reflect(AZ::SerializeContext* serializeContext) { serializeContext->Class<CUiAnimEventNode, CUiAnimNode>() ->Version(1); -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/Draw2d.cpp b/Gems/LyShine/Code/Source/Draw2d.cpp index 4beba0b1eb..cd15475039 100644 --- a/Gems/LyShine/Code/Source/Draw2d.cpp +++ b/Gems/LyShine/Code/Source/Draw2d.cpp @@ -10,17 +10,24 @@ * */ #include "LyShine_precompiled.h" -#include "Draw2d.h" #include "IFont.h" -#include "IRenderer.h" + +#include <LyShine/Draw2d.h> #include <AzCore/Math/Matrix3x3.h> +#include <AzCore/Math/MatrixUtils.h> + +#include <Atom/RPI.Public/Image/ImageSystemInterface.h> +#include <Atom/RPI.Public/RPISystemInterface.h> +#include <Atom/RHI/RHISystemInterface.h> +#include <Atom/RPI.Public/Shader/Shader.h> +#include <Atom/RPI.Public/Image/StreamingImage.h> +#include <Atom/RPI.Public/RPIUtils.h> +#include <Atom/RPI.Public/ViewportContextBus.h> static const int g_defaultBlendState = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; static const int g_defaultBaseState = GS_NODEPTHTEST; -static const int g_2dModeNotStarted = -1; - //////////////////////////////////////////////////////////////////////////////////////////////////// // LOCAL STATIC FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -37,9 +44,9 @@ static AZ::u32 PackARGB8888(const AZ::Color& color) //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -CDraw2d::CDraw2d() +CDraw2d::CDraw2d(AZ::RPI::ViewportContextPtr viewportContext) : m_deferCalls(false) - , m_nestLevelAtWhichStarted2dMode(g_2dModeNotStarted) + , m_viewportContext(viewportContext) { // These default options are set here and never change. They are stored so that if a null options // structure is passed into the draw functions then this default one can be used instead @@ -57,78 +64,75 @@ CDraw2d::CDraw2d() m_defaultTextOptions.dropShadowColor.Set(0.0f, 0.0f, 0.0f, 0.0f); m_defaultTextOptions.rotation = 0.0f; m_defaultTextOptions.baseState = g_defaultBaseState; + + AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); } //////////////////////////////////////////////////////////////////////////////////////////////////// CDraw2d::~CDraw2d() { + AZ::Render::Bootstrap::NotificationBus::Handler::BusDisconnect(); } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::BeginDraw2d(bool deferCalls) +void CDraw2d::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapScene) { - IRenderer* renderer = gEnv->pRenderer; - AZ::Vector2 viewportSize( - static_cast<float>(renderer->GetOverlayWidth()), - static_cast<float>(renderer->GetOverlayHeight())); - BeginDraw2d(viewportSize, deferCalls); -} + // At this point the RPI is ready for use -//////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::BeginDraw2d(AZ::Vector2 viewportSize, bool deferCalls) -{ - // So that nested calls to BeginDraw2d/EndDraw2d do not end 2D drawmode prematurely we only - // switch to 2D mode once and do not do it again until the corresponding call to EndDraw2d - // is processed. - // It may seem overkill to allow nested calls rather than just asserting in that case. But - // a) it is more flexible to do so - // b) it can be useful to draw some debug primitives in deferred mode while rendering a - // canvas in non-deferred mode for example + // Load the shader to be used for 2d drawing + const char* shaderFilepath = "Shaders/SimpleTextured.azshader"; + AZ::Data::Instance<AZ::RPI::Shader> shader = AZ::RPI::LoadShader(shaderFilepath); - // Push the current state of the m_deferCalls onto a stack to support nested calls - m_deferCallsFlagStack.push(m_deferCalls); - - m_deferCalls = deferCalls; - - // if this is the outermost call with non-deferred rendering then switch to 2D mode - if (!m_deferCalls && m_nestLevelAtWhichStarted2dMode == g_2dModeNotStarted) + // Set scene to be associated with the dynamic draw context + AZ::RPI::ScenePtr scene; + if (m_viewportContext) { - IRenderer* renderer = gEnv->pRenderer; - - renderer->SetCullMode(R_CULL_DISABLE); - - renderer->Set2DMode(static_cast<uint32>(viewportSize.GetX()), static_cast<uint32>(viewportSize.GetY()), m_backupSceneMatrices); - - renderer->SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); - renderer->SetState(g_defaultBlendState | g_defaultBaseState); - - // remember the nesting level that we turned on 2D mode so we can turn it off as - // we unwind the stack - m_nestLevelAtWhichStarted2dMode = m_deferCallsFlagStack.size(); + // Use scene associated with the specified viewport context + scene = m_viewportContext->GetRenderScene(); } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::EndDraw2d() -{ - // if we are ending a non-deferred series of calls and we turned on 2D draw mode when we started - // this series then turn it off. - if (!m_deferCalls && m_nestLevelAtWhichStarted2dMode == m_deferCallsFlagStack.size()) + else { - IRenderer* renderer = gEnv->pRenderer; - renderer->Unset2DMode(m_backupSceneMatrices); - m_nestLevelAtWhichStarted2dMode = -1; + // No viewport context specified, use default scene + scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene(); } + AZ_Assert(scene != nullptr, "Attempting to create a DynamicDrawContext for a viewport context that has not been associated with a scene yet."); - // unwind the nesting stack - m_deferCalls = m_deferCallsFlagStack.top(); - m_deferCallsFlagStack.pop(); + // Create and initialize a DynamicDrawContext for 2d drawing + m_dynamicDraw = AZ::RPI::DynamicDrawInterface::Get()->CreateDynamicDrawContext(scene.get()); + AZ::RPI::ShaderOptionList shaderOptions; + shaderOptions.push_back(AZ::RPI::ShaderOption(AZ::Name("o_useColorChannels"), AZ::Name("true"))); + shaderOptions.push_back(AZ::RPI::ShaderOption(AZ::Name("o_clamp"), AZ::Name("false"))); + m_dynamicDraw->InitShaderWithVariant(shader, &shaderOptions); + m_dynamicDraw->InitVertexFormat( + { {"POSITION", AZ::RHI::Format::R32G32B32_FLOAT}, + {"COLOR", AZ::RHI::Format::B8G8R8A8_UNORM}, + {"TEXCOORD0", AZ::RHI::Format::R32G32_FLOAT} }); + m_dynamicDraw->AddDrawStateOptions(AZ::RPI::DynamicDrawContext::DrawStateOptions::PrimitiveType + | AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode); + m_dynamicDraw->EndInit(); + + AZ::RHI::TargetBlendState targetBlendState; + targetBlendState.m_enable = true; + targetBlendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + targetBlendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; + m_dynamicDraw->SetTarget0BlendState(targetBlendState); + + // Cache draw srg input indices for later use + static const char textureIndexName[] = "m_texture"; + static const char worldToProjIndexName[] = "m_worldToProj"; + AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> drawSrg = m_dynamicDraw->NewDrawSrg(); + const AZ::RHI::ShaderResourceGroupLayout* layout = drawSrg->GetAsset()->GetLayout(); + m_shaderData.m_imageInputIndex = layout->FindShaderInputImageIndex(AZ::Name(textureIndexName)); + AZ_Error("Draw2d", m_shaderData.m_imageInputIndex.IsValid(), "Failed to find shader input constant %s.", + textureIndexName); + m_shaderData.m_viewProjInputIndex = layout->FindShaderInputConstantIndex(AZ::Name(worldToProjIndexName)); + AZ_Error("Draw2d", m_shaderData.m_viewProjInputIndex.IsValid(), "Failed to find shader input constant %s.", + worldToProjIndexName); } - //////////////////////////////////////////////////////////////////////////////////////////////////// // Draw a textured quad with the top left corner at the given position. -void CDraw2d::DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float opacity, +void CDraw2d::DrawImage(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, float opacity, float rotation, const AZ::Vector2* pivotPoint, const AZ::Vector2* minMaxTexCoords, ImageOptions* imageOptions) { @@ -169,7 +173,7 @@ void CDraw2d::DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float quad.m_texCoords[3].Set(0.0f, 1.0f); } - quad.m_texId = texId; + quad.m_image = image; // add the blendMode flags to the base state quad.m_state = blendMode | actualImageOptions->baseState; @@ -185,17 +189,17 @@ void CDraw2d::DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawImageAligned(int texId, AZ::Vector2 position, AZ::Vector2 size, +void CDraw2d::DrawImageAligned(AZ::Data::Instance<AZ::RPI::Image> image, AZ::Vector2 position, AZ::Vector2 size, HAlign horizontalAlignment, VAlign verticalAlignment, float opacity, float rotation, const AZ::Vector2* minMaxTexCoords, ImageOptions* imageOptions) { AZ::Vector2 alignedPosition = Align(position, size, horizontalAlignment, verticalAlignment); - DrawImage(texId, alignedPosition, size, opacity, rotation, &position, minMaxTexCoords, imageOptions); + DrawImage(image, alignedPosition, size, opacity, rotation, &position, minMaxTexCoords, imageOptions); } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawQuad(int texId, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawQuad(AZ::Data::Instance<AZ::RPI::Image> image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) { int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; @@ -208,7 +212,7 @@ void CDraw2d::DrawQuad(int texId, VertexPosColUV* verts, int blendMode, Rounding quad.m_texCoords[i] = verts[i].uv; quad.m_packedColors[i] = PackARGB8888(verts[i].color); } - quad.m_texId = texId; + quad.m_image = image; // add the blendMode flags to the base state quad.m_state = actualBlendMode | actualBaseState; @@ -221,9 +225,7 @@ void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int { int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - IRenderer* renderer = gEnv->pRenderer; - - int texId = renderer->GetWhiteTextureId(); + auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; @@ -231,7 +233,7 @@ void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int uint32 packedColor = PackARGB8888(color); DeferredLine line; - line.m_texId = texId; + line.m_image = image; line.m_points[0] = Draw2dHelper::RoundXY(start, pixelRounding); line.m_points[1] = Draw2dHelper::RoundXY(end, pixelRounding); @@ -250,7 +252,7 @@ void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawLineTextured(int texId, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawLineTextured(AZ::Data::Instance<AZ::RPI::Image> image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) { int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; @@ -258,7 +260,7 @@ void CDraw2d::DrawLineTextured(int texId, VertexPosColUV* verts, int blendMode, // define line DeferredLine line; - line.m_texId = texId; + line.m_image = image; for (int i = 0; i < 2; ++i) { @@ -327,15 +329,19 @@ AZ::Vector2 CDraw2d::GetTextSize(const char* textString, float pointSize, TextOp //////////////////////////////////////////////////////////////////////////////////////////////////// float CDraw2d::GetViewportWidth() const { - IRenderer* renderer = gEnv->pRenderer; - return (float)renderer->GetOverlayWidth(); + auto windowContext = GetViewportContext()->GetWindowContext(); + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewWidth = viewport.m_maxX - viewport.m_minX; + return viewWidth; } //////////////////////////////////////////////////////////////////////////////////////////////////// float CDraw2d::GetViewportHeight() const { - IRenderer* renderer = gEnv->pRenderer; - return (float)renderer->GetOverlayHeight(); + auto windowContext = GetViewportContext()->GetWindowContext(); + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewHeight = viewport.m_maxY - viewport.m_minY; + return viewHeight; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -353,27 +359,28 @@ const CDraw2d::TextOptions& CDraw2d::GetDefaultTextOptions() const //////////////////////////////////////////////////////////////////////////////////////////////////// void CDraw2d::RenderDeferredPrimitives() { - IRenderer* renderer = gEnv->pRenderer; - - // Set up the 2D drawing state - renderer->SetCullMode(R_CULL_DISABLE); - - renderer->Set2DMode(renderer->GetOverlayWidth(), renderer->GetOverlayHeight(), m_backupSceneMatrices); - renderer->SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); - renderer->SetState(g_defaultBlendState | g_defaultBaseState); - // Draw and delete the deferred primitives + AZ::RPI::ViewportContextPtr viewportContext = GetViewportContext(); for (auto primIter : m_deferredPrimitives) { - primIter->Draw(); + primIter->Draw(m_dynamicDraw, m_shaderData, viewportContext); delete primIter; } // clear the list of deferred primitives m_deferredPrimitives.clear(); +} - // Reset the render state - renderer->Unset2DMode(m_backupSceneMatrices); +//////////////////////////////////////////////////////////////////////////////////////////////////// +void CDraw2d::SetDeferPrimitives(bool deferPrimitives) +{ + m_deferCalls = deferPrimitives; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +bool CDraw2d::GetDeferPrimitives() +{ + return m_deferCalls; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -414,6 +421,30 @@ AZ::Vector2 CDraw2d::Align(AZ::Vector2 position, AZ::Vector2 size, return result; } +//////////////////////////////////////////////////////////////////////////////////////////////////// +AZ::Data::Instance<AZ::RPI::Image> CDraw2d::LoadTexture(const AZStd::string& pathName) +{ + AZStd::string sourceRelativePath(pathName); + AZStd::string cacheRelativePath = sourceRelativePath + ".streamingimage"; + + // The file may not be in the AssetCatalog at this point if it is still processing or doesn't exist on disk. + // Use GenerateAssetIdTEMP instead of GetAssetIdByPath so that it will return a valid AssetId anyways + AZ::Data::AssetId streamingImageAssetId; + AZ::Data::AssetCatalogRequestBus::BroadcastResult( + streamingImageAssetId, &AZ::Data::AssetCatalogRequestBus::Events::GenerateAssetIdTEMP, + sourceRelativePath.c_str()); + streamingImageAssetId.m_subId = AZ::RPI::StreamingImageAsset::GetImageAssetSubId(); + + auto streamingImageAsset = AZ::Data::AssetManager::Instance().FindOrCreateAsset<AZ::RPI::StreamingImageAsset>(streamingImageAssetId, AZ::Data::AssetLoadBehavior::PreLoad); + AZ::Data::Instance<AZ::RPI::Image> image = AZ::RPI::StreamingImage::FindOrCreate(streamingImageAsset); + if (!image) + { + AZ_Error("Draw2d", false, "Failed to find or create an image instance from image asset '%s'", streamingImageAsset.GetHint().c_str()); + } + + return image; +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // PROTECTED MEMBER FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -542,7 +573,7 @@ void CDraw2d::DrawOrDeferQuad(const DeferredQuad* quad) } else { - quad->Draw(); + quad->Draw(m_dynamicDraw, m_shaderData, GetViewportContext()); } } @@ -557,16 +588,33 @@ void CDraw2d::DrawOrDeferLine(const DeferredLine* line) } else { - line->Draw(); + line->Draw(m_dynamicDraw, m_shaderData, GetViewportContext()); } } +//////////////////////////////////////////////////////////////////////////////////////////////////// +AZ::RPI::ViewportContextPtr CDraw2d::GetViewportContext() const +{ + if (!m_viewportContext) + { + // Return the default viewport context + auto viewContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get(); + return viewContextManager->GetDefaultViewportContext(); + } + + // Return the user specified viewport context + return m_viewportContext; + +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // CDraw2d::DeferredQuad //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DeferredQuad::Draw() const +void CDraw2d::DeferredQuad::Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const { const int32 NUM_VERTS = 6; @@ -585,17 +633,41 @@ void CDraw2d::DeferredQuad::Draw() const vertices[i].st = Vec2(m_texCoords[j].GetX(), m_texCoords[j].GetY()); } - IRenderer* renderer = gEnv->pRenderer; - renderer->SetTexture(m_texId); + // Set up per draw SRG + AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> drawSrg = dynamicDraw->NewDrawSrg(); - // Set the render state, can't rely on this being right because font rendering changes it - renderer->SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); + // Set texture + const AZ::RHI::ImageView* imageView = m_image ? m_image->GetImageView() : nullptr; + if (!imageView) + { + // Default to white texture + auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + imageView = image->GetImageView(); + } - // set the desired render state - renderer->SetState(m_state); + if (imageView) + { + drawSrg->SetImageView(shaderData.m_imageInputIndex, imageView, 0); + } - // This will end up using DrawPrimitive to render the quad - renderer->DrawDynVB(vertices, nullptr, NUM_VERTS, 0, prtTriangleList); + // Set projection matrix + auto windowContext = viewportContext->GetWindowContext(); + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewX = viewport.m_minX; + const float viewY = viewport.m_minY; + const float viewWidth = viewport.m_maxX - viewport.m_minX; + const float viewHeight = viewport.m_maxY - viewport.m_minY; + const float zf = viewport.m_minZ; + const float zn = viewport.m_maxZ; + AZ::Matrix4x4 modelViewProjMat; + AZ::MakeOrthographicMatrixRH(modelViewProjMat, viewX, viewX + viewWidth, viewY + viewHeight, viewY, zn, zf); + drawSrg->SetConstant(shaderData.m_viewProjInputIndex, modelViewProjMat); + + drawSrg->Compile(); + + // Add the primitive to the dynamic draw context for drawing + dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::TriangleList); + dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -603,7 +675,9 @@ void CDraw2d::DeferredQuad::Draw() const //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DeferredLine::Draw() const +void CDraw2d::DeferredLine::Draw(AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + const Draw2dShaderData& shaderData, + AZ::RPI::ViewportContextPtr viewportContext) const { const float z = 1.0f; // depth test disabled, if writing Z this will write at far plane @@ -618,15 +692,41 @@ void CDraw2d::DeferredLine::Draw() const vertices[i].st = Vec2(m_texCoords[i].GetX(), m_texCoords[i].GetY()); } - IRenderer* renderer = gEnv->pRenderer; - renderer->SetTexture(m_texId); + // Set up per draw SRG + AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> drawSrg = dynamicDraw->NewDrawSrg(); - // Set the render state, can't rely on this being right because font rendering changes it - renderer->SetColorOp(eCO_MODULATE, eCO_MODULATE, DEF_TEXARG0, DEF_TEXARG0); - renderer->SetState(m_state); + // Set texture + const AZ::RHI::ImageView* imageView = m_image ? m_image->GetImageView() : nullptr; + if (!imageView) + { + // Default to white texture + auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + imageView = image->GetImageView(); + } - // This will end up using DrawPrimitive to render the quad - renderer->DrawDynVB(vertices, nullptr, NUM_VERTS, 0, prtLineList); + if (imageView) + { + drawSrg->SetImageView(shaderData.m_imageInputIndex, imageView, 0); + } + + // Set projection matrix + auto windowContext = viewportContext->GetWindowContext(); + const AZ::RHI::Viewport& viewport = windowContext->GetViewport(); + const float viewX = viewport.m_minX; + const float viewY = viewport.m_minY; + const float viewWidth = viewport.m_maxX - viewport.m_minX; + const float viewHeight = viewport.m_maxY - viewport.m_minY; + const float zf = viewport.m_minZ; + const float zn = viewport.m_maxZ; + AZ::Matrix4x4 modelViewProjMat; + AZ::MakeOrthographicMatrixRH(modelViewProjMat, viewX, viewX + viewWidth, viewY + viewHeight, viewY, zn, zf); + drawSrg->SetConstant(shaderData.m_viewProjInputIndex, modelViewProjMat); + + drawSrg->Compile(); + + // Add the primitive to the dynamic draw context for drawing + dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::LineList); + dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } @@ -635,7 +735,9 @@ void CDraw2d::DeferredLine::Draw() const //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DeferredText::Draw() const +void CDraw2d::DeferredText::Draw([[maybe_unused]] AZ::RHI::Ptr<AZ::RPI::DynamicDrawContext> dynamicDraw, + [[maybe_unused]] const Draw2dShaderData& shaderData, + [[maybe_unused]] AZ::RPI::ViewportContextPtr viewportContext) const { m_font->DrawString(m_position.GetX(), m_position.GetY(), m_string.c_str(), true, m_fontContext); } diff --git a/Gems/LyShine/Code/Source/Draw2d.h b/Gems/LyShine/Code/Source/Draw2d.h deleted file mode 100644 index a62dc22937..0000000000 --- a/Gems/LyShine/Code/Source/Draw2d.h +++ /dev/null @@ -1,189 +0,0 @@ -/* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ -#pragma once - -#include <LyShine/IDraw2d.h> -#include <IRenderer.h> -#include <stack> - -//////////////////////////////////////////////////////////////////////////////////////////////////// -//! Implementation of IDraw2d interface for 2D drawing in screen space -// -//! The CDraw2d class implements the IDraw2d interface for drawing 2D images, shapes and text. -//! Positions and sizes are specified in pixels in the current 2D viewport. -class CDraw2d - : public IDraw2d -{ -public: // member functions - - //! Constructor, constructed by the LyShine class - CDraw2d(); - - // IDraw2d - - ~CDraw2d() override; - - //! Start a section of 2D drawing function calls. This will set appropriate render state. - void BeginDraw2d(bool deferCalls = false) override; - - //! Start a section of 2D drawing function calls. This will set appropriate render state. - //! This variant allows the viewport size to be specified - void BeginDraw2d(AZ::Vector2 viewportSize, bool deferCalls = false) override; - - //! End a section of 2D drawing function calls. This will reset some render state. - void EndDraw2d() override; - - //! Draw a textured quad, optional rotation is counter-clockwise in degrees. - void DrawImage(int texId, AZ::Vector2 position, AZ::Vector2 size, float opacity = 1.0f, - float rotation = 0.0f, const AZ::Vector2* pivotPoint = nullptr, const AZ::Vector2* minMaxTexCoords = nullptr, - ImageOptions* imageOptions = nullptr) override; - - //! Draw a textured quad where the position specifies the point specified by the alignment. Rotation is around that point. - void DrawImageAligned(int texId, AZ::Vector2 position, AZ::Vector2 size, - HAlign horizontalAlignment, VAlign verticalAlignment, - float opacity = 1.0f, float rotation = 0.0f, const AZ::Vector2* minMaxTexCoords = nullptr, - ImageOptions* imageOptions = nullptr) override; - - //! Draw a textured quad where the position, color and uv of each point is specified explicitly - void DrawQuad(int texId, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) override; - - //! Draw a line - void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode, Rounding pixelRounding, int baseState) override; - - //! Draw a line textured - void DrawLineTextured(int texId, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) override; - - //! Draw a text string. Only supports ASCII text. - void DrawText(const char* textString, AZ::Vector2 position, float pointSize, - float opacity = 1.0f, TextOptions* textOptions = nullptr) override; - - //! Get the width and height (in pixels) that would be used to draw the given text string. - AZ::Vector2 GetTextSize(const char* textString, float pointSize, TextOptions* textOptions = nullptr) override; - - //! Get the width of the rendering viewport (in pixels). - float GetViewportWidth() const override; - - //! Get the height of the rendering viewport (in pixels). - float GetViewportHeight() const override; - - //! Get the default values that would be used if no image options were passed in - const ImageOptions& GetDefaultImageOptions() const override; - - //! Get the default values that would be used if no text options were passed in - const TextOptions& GetDefaultTextOptions() const override; - - // ~IDraw2d - - //! Render the primitives that have been deferred - void RenderDeferredPrimitives(); - -private: - - AZ_DISABLE_COPY_MOVE(CDraw2d); - -public: // static member functions - - //! Given a position and size and an alignment return the top left corner of the aligned quad - static AZ::Vector2 Align(AZ::Vector2 position, AZ::Vector2 size, HAlign horizontalAlignment, VAlign verticalAlignment); - -protected: // types and constants - - enum - { - MAX_VERTICES_IN_PRIM = 6 - }; - - class DeferredPrimitive - { - public: - virtual ~DeferredPrimitive() {}; - virtual void Draw() const = 0; - }; - - class DeferredQuad - : public DeferredPrimitive - { - public: - ~DeferredQuad() override {}; - void Draw() const override; - - AZ::Vector2 m_points[4]; - AZ::Vector2 m_texCoords[4]; - uint32 m_packedColors[4]; - int m_texId; - int m_state; - }; - - class DeferredLine - : public DeferredPrimitive - { - public: - ~DeferredLine() override {}; - void Draw() const override; - - int m_texId; - AZ::Vector2 m_points[2]; - AZ::Vector2 m_texCoords[2]; - uint32 m_packedColors[2]; - int m_state; - }; - - class DeferredText - : public DeferredPrimitive - { - public: - ~DeferredText() override {}; - void Draw() const override; - - STextDrawContext m_fontContext; - IFFont* m_font; - AZ::Vector2 m_position; - std::string m_string; - }; - -protected: // member functions - - //! Rotate an array of points around the z-axis at the pivot point. - // - //! Angle is in degrees counter-clockwise - void RotatePointsAboutPivot(AZ::Vector2* points, int numPoints, AZ::Vector2 pivot, float angle) const; - - //! Helper function to render a text string - void DrawTextInternal(const char* textString, IFFont* font, unsigned int effectIndex, - AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, - HAlign horizontalAlignment, VAlign verticalAlignment, int baseState); - - //! Draw or defer a quad - void DrawOrDeferQuad(const DeferredQuad* quad); - - //! Draw or defer a line - void DrawOrDeferLine(const DeferredLine* line); - -protected: // attributes - - ImageOptions m_defaultImageOptions; //!< The default image options used if nullptr is passed - TextOptions m_defaultTextOptions; //!< The default text options used if nullptr is passed - - bool m_deferCalls; //!< True if the actual render of the primitives should be deferred until end of frame - - std::vector<DeferredPrimitive*> m_deferredPrimitives; - - //! These two data members allows nested calls to BeginDraw2d/EndDraw2d. We will begin 2D mode only on the - //! outermost call to BeginDraw2d with deferCalls set to false and will end 2D mode on the corresposnding - //! call to EndDraw2d. The stack is used to detect that corresponding call and we need the level it occurred - //! to know when to end 2D mode. - int m_nestLevelAtWhichStarted2dMode; - std::stack<bool> m_deferCallsFlagStack; - -private: - TransformationMatrices m_backupSceneMatrices; -}; diff --git a/Gems/LyShine/Code/Source/EditorPropertyTypes.cpp b/Gems/LyShine/Code/Source/EditorPropertyTypes.cpp index 8ae3ed697a..4e868bc132 100644 --- a/Gems/LyShine/Code/Source/EditorPropertyTypes.cpp +++ b/Gems/LyShine/Code/Source/EditorPropertyTypes.cpp @@ -56,4 +56,4 @@ LyShine::AZu32ComboBoxVec LyShine::GetEnumSpriteIndexList(AZ::EntityId entityId, } return indexStringComboVec; -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/EditorPropertyTypes.h b/Gems/LyShine/Code/Source/EditorPropertyTypes.h index 505ec41ed5..e33839a57e 100644 --- a/Gems/LyShine/Code/Source/EditorPropertyTypes.h +++ b/Gems/LyShine/Code/Source/EditorPropertyTypes.h @@ -21,4 +21,4 @@ namespace LyShine //! Returns a string enumeration list for the given min/max value ranges AZu32ComboBoxVec GetEnumSpriteIndexList(AZ::EntityId entityId, AZ::u32 indexMin, AZ::u32 indexMax, const char* errorMessage = ""); -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/LyShine.cpp b/Gems/LyShine/Code/Source/LyShine.cpp index cfea0cbdf7..286e756ffa 100644 --- a/Gems/LyShine/Code/Source/LyShine.cpp +++ b/Gems/LyShine/Code/Source/LyShine.cpp @@ -13,8 +13,6 @@ #include "LyShine.h" -#include "Draw2d.h" - #include "UiCanvasComponent.h" #include "UiCanvasManager.h" #include "LyShineDebug.h" @@ -55,6 +53,7 @@ #include <LyShine/Bus/UiCursorBus.h> #include <LyShine/Bus/UiDraggableBus.h> #include <LyShine/Bus/UiDropTargetBus.h> +#include <LyShine/Draw2d.h> #if defined(LYSHINE_INTERNAL_UNIT_TEST) #include "TextMarkup.h" @@ -455,7 +454,6 @@ void CLyShine::Render() // Render all the canvases loaded in game m_uiCanvasManager->RenderLoadedCanvases(); -#ifdef LYSHINE_ATOM_TODO // convert cursor support to use Atom m_draw2d->RenderDeferredPrimitives(); // Don't render the UI cursor when in edit mode. For example during UI Preview mode a script could turn on the @@ -466,7 +464,6 @@ void CLyShine::Render() { RenderUiCursor(); } -#endif GetUiRenderer()->EndUiFrameRender(); @@ -687,9 +684,11 @@ void CLyShine::RenderUiCursor() const AZ::Vector2 position = GetUiCursorPosition(); const AZ::Vector2 dimensions(static_cast<float>(m_uiCursorTexture->GetWidth()), static_cast<float>(m_uiCursorTexture->GetHeight())); +#ifdef LYSHINE_ATOM_TODO // Convert cursor to Atom image m_draw2d->BeginDraw2d(); m_draw2d->DrawImage(m_uiCursorTexture->GetTextureID(), position, dimensions); m_draw2d->EndDraw2d(); +#endif } #ifndef _RELEASE diff --git a/Gems/LyShine/Code/Source/LyShineDebug.cpp b/Gems/LyShine/Code/Source/LyShineDebug.cpp index f1ce411d83..5ea01c5c1e 100644 --- a/Gems/LyShine/Code/Source/LyShineDebug.cpp +++ b/Gems/LyShine/Code/Source/LyShineDebug.cpp @@ -12,8 +12,9 @@ #include "LyShine_precompiled.h" #include "LyShineDebug.h" #include "IConsole.h" -#include <LyShine/IDraw2d.h> -#include "IRenderer.h" +#include <LyShine/Draw2d.h> + +#include <Atom/RPI.Public/Image/ImageSystemInterface.h> #include <AzCore/Math/Crc.h> #include <AzCore/Serialization/SerializeContext.h> @@ -105,15 +106,24 @@ static bool g_deferDrawsToEndOfFrame = false; //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) +#ifdef LYSHINE_ATOM_TODO static int Create2DTexture(int width, int height, byte* data, ETEX_Format format) { IRenderer* renderer = gEnv->pRenderer; return renderer->DownLoadToVideoMemory(data, width, height, format, format, 1); } #endif +#endif + +static AZ::Vector2 GetTextureSize(AZ::Data::Instance<AZ::RPI::Image> image) +{ + AZ::RHI::Size size = image->GetDescriptor().m_size; + return AZ::Vector2(size.m_width, size.m_height); +} //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) +#ifdef LYSHINE_ATOM_TODO static void FillTextureRectWithCheckerboard(uint32* data, int textureWidth, int textureHeight, int minX, int minY, [[maybe_unused]] int rectWidth, int rectHeight, int tileWidth, int tileHeight, uint32* colors, bool varyAlpha) @@ -139,11 +149,13 @@ static void FillTextureRectWithCheckerboard(uint32* data, int textureWidth, int } } #endif +#endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* CreateMonoTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> CreateMonoTestTexture() { +#ifdef LYSHINE_ATOM_TODO const int width = 32; const int height = 32; uint32 data[width * height]; @@ -172,13 +184,18 @@ static ITexture* CreateMonoTestTexture() int textureId = Create2DTexture(width, height, (uint8*)data, eTF_R8G8B8A8); return gEnv->pRenderer->EF_GetTextureByID(textureId); +#else + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + return whiteTexture; +#endif } #endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* CreateColorTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> CreateColorTestTexture() { +#ifdef LYSHINE_ATOM_TODO const int width = 32; const int height = 32; uint32 data[width * height]; @@ -207,13 +224,18 @@ static ITexture* CreateColorTestTexture() int textureId = Create2DTexture(width, height, (uint8*)data, eTF_R8G8B8A8); return gEnv->pRenderer->EF_GetTextureByID(textureId); +#else + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + return whiteTexture; +#endif } #endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* CreateMonoAlphaTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> CreateMonoAlphaTestTexture() { +#ifdef LYSHINE_ATOM_TODO const int width = 32; const int height = 32; uint32 data[width * height]; @@ -242,13 +264,18 @@ static ITexture* CreateMonoAlphaTestTexture() int textureId = Create2DTexture(width, height, (uint8*)data, eTF_R8G8B8A8); return gEnv->pRenderer->EF_GetTextureByID(textureId); +#else + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + return whiteTexture; +#endif } #endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* CreateColorAlphaTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> CreateColorAlphaTestTexture() { +#ifdef LYSHINE_ATOM_TODO const int width = 32; const int height = 32; uint32 data[width * height]; @@ -277,14 +304,18 @@ static ITexture* CreateColorAlphaTestTexture() int textureId = Create2DTexture(width, height, (uint8*)data, eTF_R8G8B8A8); return gEnv->pRenderer->EF_GetTextureByID(textureId); +#else + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + return whiteTexture; +#endif } #endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* GetMonoTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> GetMonoTestTexture() { - static ITexture* testImageMono = nullptr; + static AZ::Data::Instance<AZ::RPI::Image> testImageMono = nullptr; if (!testImageMono) { @@ -297,9 +328,9 @@ static ITexture* GetMonoTestTexture() //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* GetColorTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> GetColorTestTexture() { - static ITexture* testImageColor = nullptr; + static AZ::Data::Instance<AZ::RPI::Image> testImageColor = nullptr; if (!testImageColor) { @@ -312,9 +343,9 @@ static ITexture* GetColorTestTexture() //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* GetMonoAlphaTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> GetMonoAlphaTestTexture() { - static ITexture* testImageMonoAlpha = nullptr; + static AZ::Data::Instance<AZ::RPI::Image> testImageMonoAlpha = nullptr; if (!testImageMonoAlpha) { @@ -327,9 +358,9 @@ static ITexture* GetMonoAlphaTestTexture() //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(_RELEASE) -static ITexture* GetColorAlphaTestTexture() +static AZ::Data::Instance<AZ::RPI::Image> GetColorAlphaTestTexture() { - static ITexture* testImageColorAlpha = nullptr; + static AZ::Data::Instance<AZ::RPI::Image> testImageColorAlpha = nullptr; if (!testImageColorAlpha) { @@ -347,14 +378,12 @@ static void DebugDrawColoredBox(AZ::Vector2 pos, AZ::Vector2 size, AZ::Color col IDraw2d::HAlign horizontalAlignment = IDraw2d::HAlign::Left, IDraw2d::VAlign verticalAlignment = IDraw2d::VAlign::Top) { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - IRenderer* renderer = gEnv->pRenderer; + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - int whiteTextureId = renderer->GetWhiteTextureId(); - imageOptions.color = color.GetAsVector3(); - draw2d->DrawImageAligned(whiteTextureId, pos, size, horizontalAlignment, verticalAlignment, + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); + draw2d->DrawImageAligned(whiteTexture, pos, size, horizontalAlignment, verticalAlignment, color.GetA(), 0.0f, nullptr, &imageOptions); } #endif @@ -364,7 +393,7 @@ static void DebugDrawColoredBox(AZ::Vector2 pos, AZ::Vector2 size, AZ::Color col static void DebugDrawStringWithSizeBox(IFFont* font, unsigned int effectIndex, const char* sizeString, const char* testString, AZ::Vector2 pos, float spacing, float size) { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); if (font) @@ -398,9 +427,7 @@ static void DebugDrawStringWithSizeBox(IFFont* font, unsigned int effectIndex, c #if !defined(_RELEASE) static void DebugDraw2dFontSizes(IFFont* font, unsigned int effectIndex, const char* fontName) { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); float xOffset = 20.0f; float yOffset = 20.0f; @@ -463,8 +490,6 @@ static void DebugDraw2dFontSizes(IFFont* font, unsigned int effectIndex, const c yOffset += 55.0f; DebugDrawStringWithSizeBox(font, effectIndex, "Size 49", testString, AZ::Vector2(xOffset, yOffset), xSpacing, 49); - - draw2d->EndDraw2d(); } #endif @@ -524,7 +549,7 @@ static void DebugDrawAlignedTextWithOriginBox(AZ::Vector2 pos, #if !defined(_RELEASE) static void DebugDraw2dFontAlignment() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); float w = draw2d->GetViewportWidth(); float yPos = 20; @@ -591,7 +616,7 @@ static void DebugDraw2dFontAlignment() #if !defined(_RELEASE) static AZ::Vector2 DebugDrawFontColorTestBox(AZ::Vector2 pos, const char* string, AZ::Vector3 color, float opacity) { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); float pointSize = 32.0f; const float spacing = 6.0f; @@ -626,9 +651,7 @@ static AZ::Vector2 DebugDrawFontColorTestBox(AZ::Vector2 pos, const char* string #if !defined(_RELEASE) static void DebugDraw2dFontColorAndOpacity() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); AZ::Vector2 size; AZ::Vector2 pos(20.0f, 20.0f); @@ -659,8 +682,6 @@ static void DebugDraw2dFontColorAndOpacity() draw2d->DrawText("Opacity=0.25f", pos, 24.0f); pos.SetX(pos.GetX() + 200.0f); draw2d->DrawText("Opacity=0.00f", pos, 24.0f); - - draw2d->EndDraw2d(); } #endif @@ -668,16 +689,11 @@ static void DebugDraw2dFontColorAndOpacity() #if !defined(_RELEASE) static void DebugDraw2dImageRotations() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - ITexture* texture = GetMonoTestTexture(); - int texId = texture->GetTextureID(); + AZ::Data::Instance<AZ::RPI::Image> texture = GetMonoTestTexture(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - - float width = (float)texture->GetWidth(); - float height = (float)texture->GetHeight(); - AZ::Vector2 size(width, height); + AZ::Vector2 size = GetTextureSize(texture); float row = 20.0f; float xSpacing = size.GetX() * 2.0f; @@ -690,7 +706,7 @@ static void DebugDraw2dImageRotations() for (int i = 0; i < 10; ++i) { AZ::Vector2 pos(xStart + xSpacing * i, row); - draw2d->DrawImage(texId, pos, size, 1.0f, 45.0f * i); + draw2d->DrawImage(texture, pos, size, 1.0f, 45.0f * i); DebugDrawColoredBox(AZ::Vector2(pos.GetX() - 2, pos.GetY() - 2), AZ::Vector2(5, 5), posBoxColor); } @@ -703,7 +719,7 @@ static void DebugDraw2dImageRotations() { AZ::Vector2 pos(xStart + xSpacing * i, row); AZ::Vector2 pivot = pos + pivotOffset; - draw2d->DrawImage(texId, pos, size, 1.0f, 45.0f * i, &pivot); + draw2d->DrawImage(texture, pos, size, 1.0f, 45.0f * i, &pivot); DebugDrawColoredBox(AZ::Vector2(pos.GetX() - 2, pos.GetY() - 2), AZ::Vector2(5, 5), posBoxColor); DebugDrawColoredBox(AZ::Vector2(pivot.GetX() - 2, pivot.GetY() - 2), AZ::Vector2(5, 5), pivotBoxColor); } @@ -715,11 +731,9 @@ static void DebugDraw2dImageRotations() for (int i = 0; i < 10; ++i) { AZ::Vector2 pos(xStart + xSpacing * i + size.GetX() * 0.5f, row + size.GetY() * 0.5f); - draw2d->DrawImageAligned(texId, pos, size, IDraw2d::HAlign::Center, IDraw2d::VAlign::Center, 1.0f, 45.0f * i); + draw2d->DrawImageAligned(texture, pos, size, IDraw2d::HAlign::Center, IDraw2d::VAlign::Center, 1.0f, 45.0f * i); DebugDrawColoredBox(AZ::Vector2(pos.GetX() - 2, pos.GetY() - 2), AZ::Vector2(5, 5), posBoxColor); } - - draw2d->EndDraw2d(); } #endif @@ -727,22 +741,17 @@ static void DebugDraw2dImageRotations() #if !defined(_RELEASE) static void DebugDraw2dImageColor() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - ITexture* texture = GetMonoAlphaTestTexture(); - int texId = texture->GetTextureID(); + AZ::Data::Instance<AZ::RPI::Image> texture = GetMonoAlphaTestTexture(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - draw2d->DrawText( "Testing image colors, image is black and white, top row is opacity=1, bottom row is opacity = 0.5", AZ::Vector2(20, 20), 16); - float width = texture->GetWidth() * 2.0f; - float height = texture->GetHeight() * 2.0f; - AZ::Vector2 size(width, height); + AZ::Vector2 size = GetTextureSize(texture) * 2.0f; float xStart = 20.0f; float yStart = 50.0f; @@ -755,14 +764,12 @@ static void DebugDraw2dImageColor() // Draw the image with this color imageOptions.color = g_colorVec3[color]; - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); // draw below with half opacity to test combination of color and opacity pos.SetY(pos.GetY() + ySpacing); - draw2d->DrawImage(texId, pos, size, 0.5f, 0.0f, 0, 0, &imageOptions); + draw2d->DrawImage(texture, pos, size, 0.5f, 0.0f, 0, 0, &imageOptions); } - - draw2d->EndDraw2d(); } #endif @@ -770,24 +777,20 @@ static void DebugDraw2dImageColor() #if !defined(_RELEASE) static void DebugDraw2dImageBlendMode() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - IRenderer* renderer = gEnv->pRenderer; + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - int whiteTextureId = renderer->GetWhiteTextureId(); + auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); - ITexture* texture = GetColorAlphaTestTexture(); - int texId = texture->GetTextureID(); + AZ::Data::Instance<AZ::RPI::Image> texture = GetColorAlphaTestTexture(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - draw2d->DrawText("Testing blend modes, src blend changes across x-axis, dst blend changes across y axis", AZ::Vector2(20, 20), 16); - float width = (float)texture->GetWidth(); - float height = (float)texture->GetHeight(); - AZ::Vector2 size(width, height); + AZ::Vector2 size = GetTextureSize(texture); + float width = size.GetX(); + float height = size.GetY(); float xStart = 20.0f; float yStart = 60.0f; @@ -824,16 +827,14 @@ static void DebugDraw2dImageBlendMode() AZ::Vector2(0.0f, 1.0f) }, }; - draw2d->DrawQuad(whiteTextureId, verts); + draw2d->DrawQuad(whiteTexture, verts); // Draw the image with this color imageOptions.blendMode = g_srcBlendModes[srcIndex] | g_dstBlendModes[dstIndex]; - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); } } - - draw2d->EndDraw2d(); } #endif @@ -841,20 +842,17 @@ static void DebugDraw2dImageBlendMode() #if !defined(_RELEASE) static void DebugDraw2dImageUVs() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - ITexture* texture = GetColorTestTexture(); - int texId = texture->GetTextureID(); + AZ::Data::Instance<AZ::RPI::Image> texture = GetColorTestTexture(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - draw2d->DrawText( "Testing DrawImage with minMaxTexCoords. Full image, top left quadrant, middle section, full flipped", AZ::Vector2(20, 20), 16); - AZ::Vector2 size((float)texture->GetWidth() * 2.0f, (float)texture->GetHeight() * 2.0f); + AZ::Vector2 size = GetTextureSize(texture) * 2.0f; float xStart = 20.0f; float yStart = 50.0f; @@ -867,27 +865,25 @@ static void DebugDraw2dImageUVs() // full image minMaxTexCoords[0] = AZ::Vector2(0, 0); minMaxTexCoords[1] = AZ::Vector2(1, 1); - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); // top left quadrant of image pos.SetX(pos.GetX() + xSpacing); minMaxTexCoords[0] = AZ::Vector2(0, 0); minMaxTexCoords[1] = AZ::Vector2(0.5, 0.5); - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); // middle of image pos.SetX(pos.GetX() + xSpacing); minMaxTexCoords[0] = AZ::Vector2(0.25, 0.25); minMaxTexCoords[1] = AZ::Vector2(0.75, 0.75); - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); // flip of image pos.SetX(pos.GetX() + xSpacing); minMaxTexCoords[0] = AZ::Vector2(0.0, 1.0); minMaxTexCoords[1] = AZ::Vector2(1.0, 0.0); - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); - - draw2d->EndDraw2d(); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, minMaxTexCoords); } #endif @@ -895,18 +891,15 @@ static void DebugDraw2dImageUVs() #if !defined(_RELEASE) static void DebugDraw2dImagePixelRounding() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - ITexture* texture = GetColorTestTexture(); - int texId = texture->GetTextureID(); + AZ::Data::Instance<AZ::RPI::Image> texture = GetColorTestTexture(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - draw2d->DrawText("Testing DrawImage pixel rounding options", AZ::Vector2(20, 20), 16); - AZ::Vector2 size((float)texture->GetWidth(), (float)texture->GetHeight()); + AZ::Vector2 size = GetTextureSize(texture); float xStart = 20.0f; float yStart = 50.0f; @@ -929,11 +922,9 @@ static void DebugDraw2dImagePixelRounding() imageOptions.pixelRounding = roundings[j]; - draw2d->DrawImage(texId, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); + draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); } } - - draw2d->EndDraw2d(); } #endif @@ -941,12 +932,10 @@ static void DebugDraw2dImagePixelRounding() #if !defined(_RELEASE) static void DebugDraw2dLineBasic() { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); - draw2d->BeginDraw2d(g_deferDrawsToEndOfFrame); - draw2d->DrawText("Testing DrawLine", AZ::Vector2(20, 20), 16); AZ::Vector2 center = AZ::Vector2(draw2d->GetViewportWidth() * 0.5f, draw2d->GetViewportHeight() * 0.5f); @@ -963,8 +952,6 @@ static void DebugDraw2dLineBasic() draw2d->DrawLine(center, center + AZ::Vector2(-offset, -offset), AZ::Color(0.0f, 0.0f, 1.0f, 1.0f)); draw2d->DrawLine(center, center + AZ::Vector2(0, -offset), AZ::Color(1.0f, 0.0f, 1.0f, 1.0f)); draw2d->DrawLine(center, center + AZ::Vector2(offset, -offset), AZ::Color(0.0f, 0.0f, 0.0f, 1.0f)); - - draw2d->EndDraw2d(); } #endif @@ -1436,13 +1423,17 @@ void LyShineDebug::RenderDebug() #if !defined(_RELEASE) #ifndef EXCLUDE_DOCUMENTATION_PURPOSE - if (!Draw2dHelper::GetDraw2d()) + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); + if (!draw2d) { return; } g_deferDrawsToEndOfFrame = (CV_r_DebugUIDraw2dDefer) ? true : false; + // Set whether to defer draws or render immediately during scope of this helper + Draw2dHelper draw2dHelper(g_deferDrawsToEndOfFrame); + if (CV_r_DebugUIDraw2dFont) { switch (CV_r_DebugUIDraw2dFont) diff --git a/Gems/LyShine/Code/Source/LyShineDebug.h b/Gems/LyShine/Code/Source/LyShineDebug.h index ff5d0c5947..ed03fd10b2 100644 --- a/Gems/LyShine/Code/Source/LyShineDebug.h +++ b/Gems/LyShine/Code/Source/LyShineDebug.h @@ -79,4 +79,4 @@ public: // static member functions AZStd::vector<DebugInfoTextureUsage> m_textures; }; #endif -}; \ No newline at end of file +}; diff --git a/Gems/LyShine/Code/Source/LyShine_precompiled.h b/Gems/LyShine/Code/Source/LyShine_precompiled.h index 4ec577c8ef..1025236fe6 100644 --- a/Gems/LyShine/Code/Source/LyShine_precompiled.h +++ b/Gems/LyShine/Code/Source/LyShine_precompiled.h @@ -16,4 +16,4 @@ #include <algorithm> #include <ISystem.h> -#include <LyShine/ILyShine.h> \ No newline at end of file +#include <LyShine/ILyShine.h> diff --git a/Gems/LyShine/Code/Source/Platform/Windows/UiClipboard_Windows.cpp b/Gems/LyShine/Code/Source/Platform/Windows/UiClipboard_Windows.cpp index 1b3c241f22..c069b0af30 100644 --- a/Gems/LyShine/Code/Source/Platform/Windows/UiClipboard_Windows.cpp +++ b/Gems/LyShine/Code/Source/Platform/Windows/UiClipboard_Windows.cpp @@ -57,4 +57,4 @@ AZStd::string UiClipboard::GetText() CloseClipboard(); } return outText; -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/StringUtfUtils.h b/Gems/LyShine/Code/Source/StringUtfUtils.h index 07ef88747c..9a4a2b42a6 100644 --- a/Gems/LyShine/Code/Source/StringUtfUtils.h +++ b/Gems/LyShine/Code/Source/StringUtfUtils.h @@ -62,4 +62,4 @@ namespace LyShine return byteStrlen; } -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/Tests/internal/test_UiTransform2dComponent.cpp b/Gems/LyShine/Code/Source/Tests/internal/test_UiTransform2dComponent.cpp index cd1b18e919..edee095b34 100644 --- a/Gems/LyShine/Code/Source/Tests/internal/test_UiTransform2dComponent.cpp +++ b/Gems/LyShine/Code/Source/Tests/internal/test_UiTransform2dComponent.cpp @@ -1050,4 +1050,4 @@ void UiTransform2dComponent::UnitTest(CLyShine* lyShine, IConsoleCmdArgs* /* cmd TestLocalSizeParameters(lyShine); } -#endif \ No newline at end of file +#endif diff --git a/Gems/LyShine/Code/Source/UiCanvasComponent.cpp b/Gems/LyShine/Code/Source/UiCanvasComponent.cpp index f386d5756b..2af773734c 100644 --- a/Gems/LyShine/Code/Source/UiCanvasComponent.cpp +++ b/Gems/LyShine/Code/Source/UiCanvasComponent.cpp @@ -33,6 +33,7 @@ #include <LyShine/Bus/UiEntityContextBus.h> #include <LyShine/Bus/UiCanvasUpdateNotificationBus.h> #include <LyShine/UiSerializeHelpers.h> +#include <LyShine/Draw2d.h> #include <AzCore/Math/Crc.h> #include <AzCore/Memory/Memory.h> @@ -2224,13 +2225,13 @@ void UiCanvasComponent::DebugReportDrawCalls(AZ::IO::HandleType fileHandle, LySh } //////////////////////////////////////////////////////////////////////////////////////////////////// -void UiCanvasComponent::DebugDisplayElemBounds(IDraw2d* draw2d) const +void UiCanvasComponent::DebugDisplayElemBounds(CDraw2d* draw2d) const { DebugDisplayChildElemBounds(draw2d, m_rootElement); } //////////////////////////////////////////////////////////////////////////////////////////////////// -void UiCanvasComponent::DebugDisplayChildElemBounds(IDraw2d* draw2d, const AZ::EntityId entity) const +void UiCanvasComponent::DebugDisplayChildElemBounds(CDraw2d* draw2d, const AZ::EntityId entity) const { AZ::u64 time = AZStd::GetTimeUTCMilliSecond(); uint32 fractionsOfOneSecond = time % 1000; diff --git a/Gems/LyShine/Code/Source/UiCanvasComponent.h b/Gems/LyShine/Code/Source/UiCanvasComponent.h index 6e59a0899f..3e7171c642 100644 --- a/Gems/LyShine/Code/Source/UiCanvasComponent.h +++ b/Gems/LyShine/Code/Source/UiCanvasComponent.h @@ -42,6 +42,7 @@ namespace AZ } struct SDepthTexture; +class CDraw2d; //////////////////////////////////////////////////////////////////////////////////////////////////// class UiCanvasComponent @@ -287,8 +288,8 @@ public: // member functions void DebugReportDrawCalls(AZ::IO::HandleType fileHandle, LyShineDebug::DebugInfoDrawCallReport& reportInfo, void* context) const; - void DebugDisplayElemBounds(IDraw2d* draw2d) const; - void DebugDisplayChildElemBounds(IDraw2d* draw2d, const AZ::EntityId entity) const; + void DebugDisplayElemBounds(CDraw2d* draw2d) const; + void DebugDisplayChildElemBounds(CDraw2d* draw2d, const AZ::EntityId entity) const; #endif public: // static member functions diff --git a/Gems/LyShine/Code/Source/UiCanvasManager.cpp b/Gems/LyShine/Code/Source/UiCanvasManager.cpp index 380095a289..6575a1d2f0 100644 --- a/Gems/LyShine/Code/Source/UiCanvasManager.cpp +++ b/Gems/LyShine/Code/Source/UiCanvasManager.cpp @@ -11,6 +11,7 @@ */ #include "LyShine_precompiled.h" #include "UiCanvasManager.h" +#include <LyShine/Draw2d.h> #include "UiCanvasFileObject.h" #include "UiCanvasComponent.h" @@ -33,6 +34,8 @@ #include <LyShine/Bus/World/UiCanvasOnMeshBus.h> #include <LyShine/Bus/World/UiCanvasRefBus.h> +#include <Atom/RPI.Public/Image/ImageSystemInterface.h> + #ifndef _RELEASE #include <AzFramework/IO/LocalFileIO.h> #endif @@ -998,16 +1001,15 @@ void UiCanvasManager::DebugDisplayCanvasData(int setting) const { bool onlyShowEnabledCanvases = (setting == 2) ? true : false; - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - - draw2d->BeginDraw2d(false); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); float xOffset = 20.0f; float yOffset = 20.0f; const int elementNameFieldLength = 20; - int blackTexture = gEnv->pRenderer->GetBlackTextureId(); + auto blackTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::Black); + float textOpacity = 1.0f; float backgroundRectOpacity = 0.75f; @@ -1152,21 +1154,17 @@ void UiCanvasManager::DebugDisplayCanvasData(int setting) const totalEnabledIntrs, totalEnabledUpdates); WriteLine(buffer, red); - - draw2d->EndDraw2d(); } //////////////////////////////////////////////////////////////////////////////////////////////////// void UiCanvasManager::DebugDisplayDrawCallData() const { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - - draw2d->BeginDraw2d(false); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); float xOffset = 20.0f; float yOffset = 20.0f; - int blackTexture = gEnv->pRenderer->GetBlackTextureId(); + auto blackTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::Black); float textOpacity = 1.0f; float backgroundRectOpacity = 0.75f; const float lineSpacing = 20.0f; @@ -1293,8 +1291,6 @@ void UiCanvasManager::DebugDisplayDrawCallData() const totalDueToMaxVerts, totalDueToTextures); WriteLine(buffer, red); - - draw2d->EndDraw2d(); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1492,9 +1488,7 @@ void UiCanvasManager::DebugReportDrawCalls(const AZStd::string& name) const //////////////////////////////////////////////////////////////////////////////////////////////////// void UiCanvasManager::DebugDisplayElemBounds(int canvasIndexFilter) const { - IDraw2d* draw2d = Draw2dHelper::GetDraw2d(); - - draw2d->BeginDraw2d(false); + CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); int canvasIndex = 0; for (auto canvas : m_loadedCanvases) @@ -1515,8 +1509,6 @@ void UiCanvasManager::DebugDisplayElemBounds(int canvasIndexFilter) const ++canvasIndex; // only increments for enabled canvases so index matches "ui_DisplayCanvasData 2" } - - draw2d->EndDraw2d(); } #endif diff --git a/Gems/LyShine/Code/Source/UiFaderComponent.cpp b/Gems/LyShine/Code/Source/UiFaderComponent.cpp index 96690db7c9..3259da0480 100644 --- a/Gems/LyShine/Code/Source/UiFaderComponent.cpp +++ b/Gems/LyShine/Code/Source/UiFaderComponent.cpp @@ -11,6 +11,7 @@ */ #include "LyShine_precompiled.h" #include "UiFaderComponent.h" +#include <LyShine/Draw2d.h> #include <AzCore/Math/Crc.h> #include <AzCore/Math/MathUtils.h> diff --git a/Gems/LyShine/Code/Source/UiImageComponent.cpp b/Gems/LyShine/Code/Source/UiImageComponent.cpp index b5b407c421..02ea1467dc 100644 --- a/Gems/LyShine/Code/Source/UiImageComponent.cpp +++ b/Gems/LyShine/Code/Source/UiImageComponent.cpp @@ -20,7 +20,7 @@ #include <IRenderer.h> -#include <LyShine/IDraw2d.h> +#include <LyShine/Draw2d.h> #include <LyShine/UiSerializeHelpers.h> #include <LyShine/Bus/UiElementBus.h> #include <LyShine/Bus/UiCanvasBus.h> diff --git a/Gems/LyShine/Code/Source/UiImageSequenceComponent.cpp b/Gems/LyShine/Code/Source/UiImageSequenceComponent.cpp index 518be03751..e6cbef8386 100644 --- a/Gems/LyShine/Code/Source/UiImageSequenceComponent.cpp +++ b/Gems/LyShine/Code/Source/UiImageSequenceComponent.cpp @@ -12,7 +12,7 @@ #include "LyShine_precompiled.h" #include "UiImageSequenceComponent.h" -#include <LyShine/IDraw2d.h> +#include <LyShine/Draw2d.h> #include <LyShine/ISprite.h> #include <LyShine/IRenderGraph.h> #include <LyShine/Bus/UiElementBus.h> diff --git a/Gems/LyShine/Code/Source/UiLayoutCellComponent.cpp b/Gems/LyShine/Code/Source/UiLayoutCellComponent.cpp index ab1807cb0e..13e3d7a53a 100644 --- a/Gems/LyShine/Code/Source/UiLayoutCellComponent.cpp +++ b/Gems/LyShine/Code/Source/UiLayoutCellComponent.cpp @@ -432,4 +432,4 @@ void UiLayoutCellComponent::InvalidateLayout() // Invalidate the element's layout EBUS_EVENT_ID(canvasEntityId, UiLayoutManagerBus, MarkToRecomputeLayout, GetEntityId()); -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/UiLayoutGridComponent.cpp b/Gems/LyShine/Code/Source/UiLayoutGridComponent.cpp index 74e137f96e..e39b9cc684 100644 --- a/Gems/LyShine/Code/Source/UiLayoutGridComponent.cpp +++ b/Gems/LyShine/Code/Source/UiLayoutGridComponent.cpp @@ -697,4 +697,4 @@ bool UiLayoutGridComponent::VersionConverter(AZ::SerializeContext& context, } return true; -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/UiLayoutHelpers.cpp b/Gems/LyShine/Code/Source/UiLayoutHelpers.cpp index 79c77aa448..424516914f 100644 --- a/Gems/LyShine/Code/Source/UiLayoutHelpers.cpp +++ b/Gems/LyShine/Code/Source/UiLayoutHelpers.cpp @@ -767,4 +767,4 @@ namespace UiLayoutHelpers EBUS_EVENT(UiEditorChangeNotificationBus, OnEditorTransformPropertiesNeedRefresh); } } -} // namespace UiLayoutHelpers \ No newline at end of file +} // namespace UiLayoutHelpers diff --git a/Gems/LyShine/Code/Source/UiLayoutHelpers.h b/Gems/LyShine/Code/Source/UiLayoutHelpers.h index b42cb1f6bd..ce567573be 100644 --- a/Gems/LyShine/Code/Source/UiLayoutHelpers.h +++ b/Gems/LyShine/Code/Source/UiLayoutHelpers.h @@ -107,4 +107,4 @@ namespace UiLayoutHelpers //! Sets up a refresh of the UI editor's transform properties in the properties pane if //! the transform is controlled by a layout fitter void CheckFitterAndRefreshEditorTransformProperties(AZ::EntityId elementId); -} // namespace UiLayoutHelpers \ No newline at end of file +} // namespace UiLayoutHelpers diff --git a/Gems/LyShine/Code/Source/UiMaskComponent.cpp b/Gems/LyShine/Code/Source/UiMaskComponent.cpp index df49673858..f7452108e7 100644 --- a/Gems/LyShine/Code/Source/UiMaskComponent.cpp +++ b/Gems/LyShine/Code/Source/UiMaskComponent.cpp @@ -11,6 +11,7 @@ */ #include "LyShine_precompiled.h" #include "UiMaskComponent.h" +#include <LyShine/Draw2d.h> #include <AzCore/Math/Crc.h> #include <AzCore/Serialization/SerializeContext.h> @@ -23,7 +24,6 @@ #include <LyShine/Bus/UiRenderBus.h> #include <LyShine/Bus/UiVisualBus.h> #include <LyShine/Bus/UiCanvasBus.h> -#include <LyShine/IDraw2d.h> //////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC MEMBER FUNCTIONS diff --git a/Gems/LyShine/Code/Source/UiNavigationSettings.cpp b/Gems/LyShine/Code/Source/UiNavigationSettings.cpp index bda2714eae..1e968c0c4c 100644 --- a/Gems/LyShine/Code/Source/UiNavigationSettings.cpp +++ b/Gems/LyShine/Code/Source/UiNavigationSettings.cpp @@ -209,4 +209,4 @@ UiNavigationSettings::EntityComboBoxVec UiNavigationSettings::PopulateNavigableE bool UiNavigationSettings::IsNavigationModeCustom() const { return (m_navigationMode == NavigationMode::Custom); -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Source/UiParticleEmitterComponent.h b/Gems/LyShine/Code/Source/UiParticleEmitterComponent.h index 94b864947d..1defba1056 100644 --- a/Gems/LyShine/Code/Source/UiParticleEmitterComponent.h +++ b/Gems/LyShine/Code/Source/UiParticleEmitterComponent.h @@ -354,4 +354,4 @@ protected: // data AZ::u32 m_particleBufferSize = 0; IRenderer::DynUiPrimitive m_cachedPrimitive; -}; \ No newline at end of file +}; diff --git a/Gems/LyShine/Code/Source/UiTextComponent.cpp b/Gems/LyShine/Code/Source/UiTextComponent.cpp index a718cc8e53..b1092ab92f 100644 --- a/Gems/LyShine/Code/Source/UiTextComponent.cpp +++ b/Gems/LyShine/Code/Source/UiTextComponent.cpp @@ -28,11 +28,11 @@ #include <LyShine/Bus/UiCanvasBus.h> #include <LyShine/UiSerializeHelpers.h> #include <LyShine/IRenderGraph.h> +#include <LyShine/Draw2d.h> #include <ILocalizationManager.h> #include "UiSerialize.h" -#include "Draw2d.h" #include "TextMarkup.h" #include "UiTextComponentOffsetsSelector.h" #include "StringUtfUtils.h" diff --git a/Gems/LyShine/Code/Source/UiTextComponentOffsetsSelector.cpp b/Gems/LyShine/Code/Source/UiTextComponentOffsetsSelector.cpp index 1d29418d44..056a600f88 100644 --- a/Gems/LyShine/Code/Source/UiTextComponentOffsetsSelector.cpp +++ b/Gems/LyShine/Code/Source/UiTextComponentOffsetsSelector.cpp @@ -231,4 +231,4 @@ void UiTextComponentOffsetsSelector::CalculateOffsets(UiTextComponent::LineOffse IncrementYOffsets(); } } -} \ No newline at end of file +} diff --git a/Gems/LyShine/Code/Tests/AnimationTest.cpp b/Gems/LyShine/Code/Tests/AnimationTest.cpp index 525b35136f..5b739b866f 100644 --- a/Gems/LyShine/Code/Tests/AnimationTest.cpp +++ b/Gems/LyShine/Code/Tests/AnimationTest.cpp @@ -148,4 +148,4 @@ namespace UnitTest EXPECT_STREQ(eventHandler.m_recievedEvents[0].m_value.c_str(), key.eventValue.c_str()); EXPECT_STREQ(eventHandler.m_recievedEvents[0].m_sequence.c_str(), sequence->GetName()); } -} //namespace UnitTest \ No newline at end of file +} //namespace UnitTest diff --git a/Gems/LyShine/Code/lyshine_static_files.cmake b/Gems/LyShine/Code/lyshine_static_files.cmake index 140debff84..8491a66030 100644 --- a/Gems/LyShine/Code/lyshine_static_files.cmake +++ b/Gems/LyShine/Code/lyshine_static_files.cmake @@ -11,7 +11,7 @@ set(FILES Source/Draw2d.cpp - Source/Draw2d.h + Include/LyShine/Draw2d.h Source/LyShine.cpp Source/LyShine.h Source/LyShineDebug.cpp diff --git a/Gems/LyShineExamples/Assets/LyShineExamples_Dependencies.xml b/Gems/LyShineExamples/Assets/LyShineExamples_Dependencies.xml index ce336a9bc7..dd6a21627d 100644 --- a/Gems/LyShineExamples/Assets/LyShineExamples_Dependencies.xml +++ b/Gems/LyShineExamples/Assets/LyShineExamples_Dependencies.xml @@ -1,4 +1,4 @@ <EngineDependencies versionnumber="1.0.0"> <Dependency path="ui/textures/prefab/checkbox_check.sprite" optional="true" /> <Dependency path="ui/textures/prefab/checkbox_box_normal.sprite" optional="true" /> -</EngineDependencies> \ No newline at end of file +</EngineDependencies> diff --git a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestFreeColors.json b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestFreeColors.json index 79096934e9..e59b5fd938 100644 --- a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestFreeColors.json +++ b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestFreeColors.json @@ -21,4 +21,4 @@ "price": "Free" } ] -} \ No newline at end of file +} diff --git a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMoreFreeColors.json b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMoreFreeColors.json index 41018792c2..4601bbdf39 100644 --- a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMoreFreeColors.json +++ b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMoreFreeColors.json @@ -61,4 +61,4 @@ "price": "Free" } ] -} \ No newline at end of file +} diff --git a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMorePaidColors.json b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMorePaidColors.json index 1e50128d06..fc06a66912 100644 --- a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMorePaidColors.json +++ b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestMorePaidColors.json @@ -581,4 +581,4 @@ "price": "$1.99" } ] -} \ No newline at end of file +} diff --git a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestPaidColors.json b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestPaidColors.json index 3d2d3ebc13..10e9222293 100644 --- a/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestPaidColors.json +++ b/Gems/LyShineExamples/Assets/StaticData/LyShineExamples/uiTestPaidColors.json @@ -26,4 +26,4 @@ "price": "$0.99" } ] -} \ No newline at end of file +} diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/ButtonAnimation.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/ButtonAnimation.lua index 9087b0891f..90f3edd781 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/ButtonAnimation.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/ButtonAnimation.lua @@ -96,4 +96,4 @@ function ButtonAnimation:OnUiAnimationEvent(eventType, sequenceName) end end -return ButtonAnimation \ No newline at end of file +return ButtonAnimation diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/MultipleSequences.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/MultipleSequences.lua index 830ebcf0da..7bb99e78e9 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/MultipleSequences.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/MultipleSequences.lua @@ -39,4 +39,4 @@ end function MultipleSequences:OnDeactivate() end -return MultipleSequences \ No newline at end of file +return MultipleSequences diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/SequenceStates.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/SequenceStates.lua index e7605037a2..b5f8fcfc7f 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/SequenceStates.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Animation/SequenceStates.lua @@ -140,4 +140,4 @@ function SequenceStates:OnUiAnimationEvent(eventType, sequenceName) end end -return SequenceStates \ No newline at end of file +return SequenceStates diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/CppExample/LoadCppCanvas.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/CppExample/LoadCppCanvas.lua index 48b9356d0d..0a4da4fd5e 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/CppExample/LoadCppCanvas.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/CppExample/LoadCppCanvas.lua @@ -32,4 +32,4 @@ function LoadCppCanvas:OnDeactivate() LyShineExamplesCppExampleBus.Broadcast.DestroyCanvas() end -return LoadCppCanvas \ No newline at end of file +return LoadCppCanvas diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DisplayMouseCursor.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DisplayMouseCursor.lua index 1ee6068206..b40275117f 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DisplayMouseCursor.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DisplayMouseCursor.lua @@ -29,4 +29,4 @@ function DisplayMouseCursor:OnDeactivate() LyShineLua.ShowMouseCursor(false) end -return DisplayMouseCursor \ No newline at end of file +return DisplayMouseCursor diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_ChildDropTarget.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_ChildDropTarget.lua index 6e1775e957..05575e98f6 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_ChildDropTarget.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_ChildDropTarget.lua @@ -43,4 +43,4 @@ function DropTargetLayoutDraggableChild:OnDrop(draggable) UiElementBus.Event.Reparent(draggable, parentLayout, parentDraggable) end -return DropTargetLayoutDraggableChild \ No newline at end of file +return DropTargetLayoutDraggableChild diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_Draggable.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_Draggable.lua index 4184463e49..5acb07049d 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_Draggable.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_Draggable.lua @@ -58,4 +58,4 @@ function ChildDropTargets_Draggable:OnDragEnd(position) UiTransformBus.Event.SetCanvasPosition(self.entityId, self.originalPosition) end -return ChildDropTargets_Draggable \ No newline at end of file +return ChildDropTargets_Draggable diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_EndDropTarget.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_EndDropTarget.lua index 46c8806cec..4c64d5aa5e 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_EndDropTarget.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_EndDropTarget.lua @@ -43,4 +43,4 @@ function ChildDropTargets_EndDropTarget:OnDrop(draggable) UiElementBus.Event.Reparent(draggable, parentLayout, self.entityId) end -return ChildDropTargets_EndDropTarget \ No newline at end of file +return ChildDropTargets_EndDropTarget diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_LayoutDropTarget.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_LayoutDropTarget.lua index 878d13db0a..646f2ac92d 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_LayoutDropTarget.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/ChildDropTargets/ChildDropTargets_LayoutDropTarget.lua @@ -43,4 +43,4 @@ function ChildDropTargets_LayoutDropTarget:OnDrop(draggable) UiElementBus.Event.Reparent(draggable, self.entityId, self.Properties.EndDropTarget) end -return ChildDropTargets_LayoutDropTarget \ No newline at end of file +return ChildDropTargets_LayoutDropTarget diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableCrossCanvasElement.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableCrossCanvasElement.lua index 348be5cb0e..bdfd376d81 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableCrossCanvasElement.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableCrossCanvasElement.lua @@ -113,4 +113,4 @@ function DraggableCrossCanvasElement:OnDragEnd(position) end -return DraggableCrossCanvasElement \ No newline at end of file +return DraggableCrossCanvasElement diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableElement.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableElement.lua index cee9dac695..fcc40e9702 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableElement.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableElement.lua @@ -43,4 +43,4 @@ function DraggableElement:OnDragEnd(position) UiTransformBus.Event.SetViewportPosition(self.entityId, self.originalPosition) end -return DraggableElement \ No newline at end of file +return DraggableElement diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableStackingElement.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableStackingElement.lua index f39609d56b..24c7bb43f6 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableStackingElement.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DraggableStackingElement.lua @@ -75,4 +75,4 @@ function DraggableStackingElement:OnDragEnd(position) end -return DraggableStackingElement \ No newline at end of file +return DraggableStackingElement diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTarget.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTarget.lua index 111773776a..3d56e9d40e 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTarget.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTarget.lua @@ -48,4 +48,4 @@ function DropTarget:OnDrop(draggable) end end -return DropTarget \ No newline at end of file +return DropTarget diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetCrossCanvas.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetCrossCanvas.lua index 23645557e3..9cb1ea724c 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetCrossCanvas.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetCrossCanvas.lua @@ -69,4 +69,4 @@ function DropTargetCrossCanvas:OnDrop(draggable) end end -return DropTargetCrossCanvas \ No newline at end of file +return DropTargetCrossCanvas diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetStacking.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetStacking.lua index 3cda0977bc..d0e63ec456 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetStacking.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/DragAndDrop/DropTargetStacking.lua @@ -126,4 +126,4 @@ function DropTargetStacking:OnDrop(draggable) end end -return DropTargetStacking \ No newline at end of file +return DropTargetStacking diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ColorBall.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ColorBall.lua index edb9867a19..b50e6786db 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ColorBall.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ColorBall.lua @@ -33,4 +33,4 @@ function ColorBall:OnDeactivate() self.buttonHandler:Disconnect() end -return ColorBall \ No newline at end of file +return ColorBall diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/CreateBall.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/CreateBall.lua index 0de24ea664..e0cd063cbe 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/CreateBall.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/CreateBall.lua @@ -54,4 +54,4 @@ function CreateBall:OnDeactivate() self.buttonHandler:Disconnect() end -return CreateBall \ No newline at end of file +return CreateBall diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/DestroyBall.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/DestroyBall.lua index 023346a646..14739ed915 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/DestroyBall.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/DestroyBall.lua @@ -32,4 +32,4 @@ function DestroyBall:OnDeactivate() self.buttonHandler:Disconnect() end -return DestroyBall \ No newline at end of file +return DestroyBall diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallDown.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallDown.lua index 29fdf45ea3..248467272c 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallDown.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallDown.lua @@ -41,4 +41,4 @@ function MoveBallDown:OnDeactivate() self.buttonHandler:Disconnect() end -return MoveBallDown \ No newline at end of file +return MoveBallDown diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallUp.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallUp.lua index 82e9db35e1..d732eeb4f3 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallUp.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/MoveBallUp.lua @@ -41,4 +41,4 @@ function MoveBallUp:OnDeactivate() self.buttonHandler:Disconnect() end -return MoveBallUp \ No newline at end of file +return MoveBallUp diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ResetBall.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ResetBall.lua index edab9c1a7d..f9c95f8faf 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ResetBall.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/FunctionalityDropdown/ResetBall.lua @@ -46,4 +46,4 @@ function ResetBall:OnDeactivate() self.canvasNotificationBusHandler:Disconnect() end -return ResetBall \ No newline at end of file +return ResetBall diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/MultiSelectionDropdown.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/MultiSelectionDropdown.lua index 7209cbe3e1..2bea8282bf 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/MultiSelectionDropdown.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/MultiSelectionDropdown.lua @@ -44,4 +44,4 @@ end function MultiSelectionDropdown:OnDeactivate() end -return MultiSelectionDropdown \ No newline at end of file +return MultiSelectionDropdown diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownOption.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownOption.lua index 70a17d4c95..6930396094 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownOption.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownOption.lua @@ -46,4 +46,4 @@ function SelectionDropdownOption:OnDeactivate() self.buttonHandler:Disconnect() end -return SelectionDropdownOption \ No newline at end of file +return SelectionDropdownOption diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownSelectedOption.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownSelectedOption.lua index 53c1116729..2ad87803f8 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownSelectedOption.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dropdown/SelectionDropdownSelectedOption.lua @@ -47,4 +47,4 @@ function SelectionDropdownSelectedOption:OnDeactivate() self.buttonHandler:Disconnect() end -return SelectionDropdownSelectedOption \ No newline at end of file +return SelectionDropdownSelectedOption diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutColumn.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutColumn.lua index 1b2ff575dd..663e5e6aaa 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutColumn.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutColumn.lua @@ -98,4 +98,4 @@ function DynamicLayoutColumn:InitContent(jsonFilepath) UiCanvasBus.Event.ForceHoverInteractable(canvas, self.Properties.ScrollBox) end -return DynamicLayoutColumn \ No newline at end of file +return DynamicLayoutColumn diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutGrid.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutGrid.lua index 8dd90250f9..78269d8a68 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutGrid.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicLayoutGrid.lua @@ -72,4 +72,4 @@ function DynamicLayoutGrid:InitContent(jsonFilepath) end end -return DynamicLayoutGrid \ No newline at end of file +return DynamicLayoutGrid diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSize.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSize.lua index 4446d69427..b949462f51 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSize.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSize.lua @@ -167,4 +167,4 @@ function DynamicScrollBox:OnScrollerValueChanged(value) UiInteractableBus.Event.SetIsHandlingEvents(self.Properties.ScrollToEndButton, enabled) end -return DynamicScrollBox \ No newline at end of file +return DynamicScrollBox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSizeWithSections.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSizeWithSections.lua index ddfea424f3..35bd1c0667 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSizeWithSections.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicSBVariableSizeWithSections.lua @@ -130,4 +130,4 @@ function DynamicScrollBox:OnSectionHeaderBecomingVisible(entityId, sectionIndex) UiTextBus.Event.SetText(headerTitle, formattedValue) end -return DynamicScrollBox \ No newline at end of file +return DynamicScrollBox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicScrollBox.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicScrollBox.lua index 814fb68a5c..31d92cf224 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicScrollBox.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Dynamic/DynamicScrollBox.lua @@ -107,4 +107,4 @@ function DynamicScrollBox:InitContent(jsonFilepath) UiCanvasBus.Event.ForceHoverInteractable(canvas, self.Properties.DynamicScrollBox) end -return DynamicScrollBox \ No newline at end of file +return DynamicScrollBox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeButton.lua index 0859a0b3e8..224f15987e 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeButton.lua @@ -79,4 +79,4 @@ function FadeButton:OnButtonClick() end end -return FadeButton \ No newline at end of file +return FadeButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeSlider.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeSlider.lua index 6fd80a84dd..ffc7572238 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeSlider.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Fader/FadeSlider.lua @@ -42,4 +42,4 @@ function FadeSlider:OnSliderValueChanged(percent) UiFaderBus.Event.SetFadeValue(self.Properties.FaderEntity, percent / 100) end -return FadeSlider \ No newline at end of file +return FadeSlider diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/HideThisElementButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/HideThisElementButton.lua index 4de1adedc7..3806c0d368 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/HideThisElementButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/HideThisElementButton.lua @@ -34,4 +34,4 @@ function HideThisElementButton:OnButtonClick() UiInteractableBus.Event.SetIsHandlingEvents(self.entityId, false) end -return HideThisElementButton \ No newline at end of file +return HideThisElementButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageFillTypes.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageFillTypes.lua index d7095afe7c..dfe350ae80 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageFillTypes.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageFillTypes.lua @@ -150,4 +150,4 @@ function ImageFillTypes:DeInitAutomatedTestEvents() end end -return ImageFillTypes \ No newline at end of file +return ImageFillTypes diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageTypes.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageTypes.lua index 8da242afb1..239c14cbdf 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageTypes.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Image/ImageTypes.lua @@ -50,4 +50,4 @@ function ImageTypes:ShowOutlines(show) end end -return ImageTypes \ No newline at end of file +return ImageTypes diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ResetSizes.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ResetSizes.lua index 2b1709951a..15cfe9f3d6 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ResetSizes.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ResetSizes.lua @@ -71,4 +71,4 @@ function ResetSizes:OnButtonClick() end end -return ResetSizes \ No newline at end of file +return ResetSizes diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ScaleToTarget.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ScaleToTarget.lua index dcc8c4a2ff..d6e9a377bf 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ScaleToTarget.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ScaleToTarget.lua @@ -33,4 +33,4 @@ function ScaletoTarget:OnDeactivate() self.tickHandler:Disconnect() end -return ScaletoTarget \ No newline at end of file +return ScaletoTarget diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleHorizontalFitRecursive.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleHorizontalFitRecursive.lua index 3031cf3c28..96933174c1 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleHorizontalFitRecursive.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleHorizontalFitRecursive.lua @@ -41,4 +41,4 @@ function ToggleHorizontalFitRecursive:OnCheckboxStateChange(isChecked) SetHorizontalFitRecursive(self.Properties.ContainerElement, isChecked) end -return ToggleHorizontalFitRecursive \ No newline at end of file +return ToggleHorizontalFitRecursive diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleVerticalFitRecursive.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleVerticalFitRecursive.lua index f7322631fa..838619ff07 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleVerticalFitRecursive.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Layout/ToggleVerticalFitRecursive.lua @@ -41,4 +41,4 @@ function ToggleVerticalFitRecursive:OnCheckboxStateChange(isChecked) SetVerticalFitRecursive(self.Properties.ContainerElement, isChecked) end -return ToggleVerticalFitRecursive \ No newline at end of file +return ToggleVerticalFitRecursive diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadCanvasButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadCanvasButton.lua index 1ffce41ae1..ed50de56dc 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadCanvasButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadCanvasButton.lua @@ -32,4 +32,4 @@ function LoadCanvasButton:OnButtonClick() UiCanvasManagerBus.Broadcast.LoadCanvas(self.Properties.canvasName) end -return LoadCanvasButton \ No newline at end of file +return LoadCanvasButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadUnloadCanvasButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadUnloadCanvasButton.lua index d7b2352d4b..c65aa1496f 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadUnloadCanvasButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/LoadUnloadCanvasButton.lua @@ -42,4 +42,4 @@ function LoadUnloadCanvasButton:OnButtonClick() end end -return LoadUnloadCanvasButton \ No newline at end of file +return LoadUnloadCanvasButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Localization/ScrollingScrollBox.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Localization/ScrollingScrollBox.lua index c7164aa90f..a323ae13e4 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Localization/ScrollingScrollBox.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Localization/ScrollingScrollBox.lua @@ -85,4 +85,4 @@ function ScrollingScrollBox:DeInitAutomatedTestEvents() end end -return ScrollingScrollBox \ No newline at end of file +return ScrollingScrollBox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/ChildMaskElement.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/ChildMaskElement.lua index 41315c60fb..65aa981b37 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/ChildMaskElement.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/ChildMaskElement.lua @@ -61,4 +61,4 @@ function ChildMaskElement:DeInitAutomatedTestEvents() end end -return ChildMaskElement \ No newline at end of file +return ChildMaskElement diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetElementEnabledCheckbox.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetElementEnabledCheckbox.lua index 4c249f62cf..fcb21f4837 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetElementEnabledCheckbox.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetElementEnabledCheckbox.lua @@ -32,4 +32,4 @@ function SetElementEnabledCheckbox:OnCheckboxStateChange(isChecked) UiElementBus.Event.SetIsEnabled(self.Properties.Element, isChecked) end -return SetElementEnabledCheckbox \ No newline at end of file +return SetElementEnabledCheckbox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetUseAlphaGradientCheckbox.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetUseAlphaGradientCheckbox.lua index 844e63c66b..e0631ce10a 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetUseAlphaGradientCheckbox.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Mask/SetUseAlphaGradientCheckbox.lua @@ -32,4 +32,4 @@ function SetUseAlphaGradientCheckbox:OnCheckboxStateChange(isChecked) UiMaskBus.Event.SetUseRenderToTexture(self.Properties.Element, isChecked) end -return SetUseAlphaGradientCheckbox \ No newline at end of file +return SetUseAlphaGradientCheckbox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/NextCanvasButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/NextCanvasButton.lua index 7a483b83e0..822695b1e0 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/NextCanvasButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/NextCanvasButton.lua @@ -38,4 +38,4 @@ function NextCanvasButton:OnButtonClick() end end -return NextCanvasButton \ No newline at end of file +return NextCanvasButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ParticleEmitter/ParticleTrailButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ParticleEmitter/ParticleTrailButton.lua index a1f49eb7b1..65e2f4ac02 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ParticleEmitter/ParticleTrailButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ParticleEmitter/ParticleTrailButton.lua @@ -59,4 +59,4 @@ function ParticleTrailButton:OnButtonClick() end -return ParticleTrailButton \ No newline at end of file +return ParticleTrailButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/RadioButton/SwitchGroup.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/RadioButton/SwitchGroup.lua index c979ab6163..94e575c038 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/RadioButton/SwitchGroup.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/RadioButton/SwitchGroup.lua @@ -46,4 +46,4 @@ function SwitchGroup:OnDeactivate() self.buttonHandler:Disconnect() end -return SwitchGroup \ No newline at end of file +return SwitchGroup diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ChangeValues.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ChangeValues.lua index 1ff96e01e8..4940f8670f 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ChangeValues.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ChangeValues.lua @@ -39,4 +39,4 @@ function ChangeValues:OnScrollerValueChanging(value) UiTextBus.Event.SetText(self.Properties.CurrentValue, formattedValue) end -return ChangeValues \ No newline at end of file +return ChangeValues diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ZoomSlider.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ZoomSlider.lua index c4649b9073..afb572a113 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ZoomSlider.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ScrollBar/ZoomSlider.lua @@ -104,4 +104,4 @@ function ZoomSlider:OnSliderValueChanging(percent) self.currentZoom = (self.Properties.MaxZoomMultiplier - self.Properties.MinZoomMultiplier) * percent / 100 + self.Properties.MinZoomMultiplier end -return ZoomSlider \ No newline at end of file +return ZoomSlider diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SetTextFromInput.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SetTextFromInput.lua index 1fbb459971..b17eab74b0 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SetTextFromInput.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SetTextFromInput.lua @@ -33,4 +33,4 @@ function SetTextFromInput:OnTextInputEndEdit(textString) UiTextInputBus.Event.SetText(self.entityId, "") end -return SetTextFromInput \ No newline at end of file +return SetTextFromInput diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ShowAndInputEnableElementButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ShowAndInputEnableElementButton.lua index 4f6351a7ef..44c609ad55 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ShowAndInputEnableElementButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ShowAndInputEnableElementButton.lua @@ -38,4 +38,4 @@ function ShowAndInputEnableElementButton:OnButtonClick() end end -return ShowAndInputEnableElementButton \ No newline at end of file +return ShowAndInputEnableElementButton diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SliderWithButtons.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SliderWithButtons.lua index 84d2e48865..62fd5efe5b 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SliderWithButtons.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/SliderWithButtons.lua @@ -47,4 +47,4 @@ function SliderWithButtons:OnButtonClick() end end -return SliderWithButtons \ No newline at end of file +return SliderWithButtons diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/DeleteElements.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/DeleteElements.lua index 773d7b0ca6..b64414b2a1 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/DeleteElements.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/DeleteElements.lua @@ -37,4 +37,4 @@ function DeleteElements:OnButtonClick() end end -return DeleteElements \ No newline at end of file +return DeleteElements diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/RadioButtonSpawner.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/RadioButtonSpawner.lua index 05b54e0d73..0d32a7056f 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/RadioButtonSpawner.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/RadioButtonSpawner.lua @@ -153,4 +153,4 @@ function RadioButtonSpawner:SetRadioButtonText(rb, value) end end -return RadioButtonSpawner \ No newline at end of file +return RadioButtonSpawner diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/Spawn3Elements.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/Spawn3Elements.lua index 16273e03ac..8f2752c98b 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/Spawn3Elements.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/Spawn3Elements.lua @@ -85,4 +85,4 @@ function Spawn3Elements:OnSpawnFailed(ticket) end end -return Spawn3Elements \ No newline at end of file +return Spawn3Elements diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/SpawnElements.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/SpawnElements.lua index cd2e25b567..21a2e9a296 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/SpawnElements.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Spawner/SpawnElements.lua @@ -62,4 +62,4 @@ function SpawnElements:OnSpawnFailed(ticket) end end -return SpawnElements \ No newline at end of file +return SpawnElements diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/FontSizeSlider.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/FontSizeSlider.lua index 20ca5f69ce..da5970357b 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/FontSizeSlider.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/FontSizeSlider.lua @@ -48,4 +48,4 @@ function FontSizeSlider:OnSliderValueChanged(percent) UpdateFontSize(self.Properties.FontEntity, percent) end -return FontSizeSlider \ No newline at end of file +return FontSizeSlider diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/ImageMarkup.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/ImageMarkup.lua index d174e3aa14..acd55b6ac3 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/ImageMarkup.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/ImageMarkup.lua @@ -215,4 +215,4 @@ function ImageMarkup:OnCheckboxStateChange(checked) self:UpdateMarkupText() end -return ImageMarkup \ No newline at end of file +return ImageMarkup diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/MarkupCheckBox.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/MarkupCheckBox.lua index 889844c45a..e492f9d063 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/MarkupCheckBox.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/MarkupCheckBox.lua @@ -41,4 +41,4 @@ function MarkupCheckBox:OnCheckboxStateChange(isChecked) SetIsMarkupEnabledRecursive(self.Properties.ContainerElement, isChecked) end -return MarkupCheckBox \ No newline at end of file +return MarkupCheckBox diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/PlayAnimationOnStart.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/PlayAnimationOnStart.lua index f1743fec5a..ccfa4a3f00 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/PlayAnimationOnStart.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Text/PlayAnimationOnStart.lua @@ -37,4 +37,4 @@ end function PlayAnimationOnStart:OnDeactivate() end -return PlayAnimationOnStart \ No newline at end of file +return PlayAnimationOnStart diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInputEnabledOnElementChildren.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInputEnabledOnElementChildren.lua index 7a13015045..c7b69e5c25 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInputEnabledOnElementChildren.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInputEnabledOnElementChildren.lua @@ -41,4 +41,4 @@ function ToggleInputEnabledOnElementChildren:OnCheckboxStateChange(isChecked) SetIsHandlingEventsRecursive(self.Properties.ContainerElement, isChecked) end -return ToggleInputEnabledOnElementChildren \ No newline at end of file +return ToggleInputEnabledOnElementChildren diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInteractionMaskingOnElementChildren.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInteractionMaskingOnElementChildren.lua index 1a1060d79f..8a144144ad 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInteractionMaskingOnElementChildren.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleInteractionMaskingOnElementChildren.lua @@ -41,4 +41,4 @@ function ToggleInteractionMaskingOnElementChildren:OnCheckboxStateChange(isCheck SetIsInteractionMaskEnabledRecursive(self.Properties.ContainerElement, isChecked) end -return ToggleInteractionMaskingOnElementChildren \ No newline at end of file +return ToggleInteractionMaskingOnElementChildren diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleMaskingOnElementChildren.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleMaskingOnElementChildren.lua index a71998dd7b..3d9bc1fa17 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleMaskingOnElementChildren.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/ToggleMaskingOnElementChildren.lua @@ -41,4 +41,4 @@ function ToggleMaskingOnElementChildren:OnCheckboxStateChange(isChecked) SetIsMaskEnabledRecursive(self.Properties.ContainerElement, isChecked) end -return ToggleMaskingOnElementChildren \ No newline at end of file +return ToggleMaskingOnElementChildren diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/Styles.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/Styles.lua index 6f0999d227..c7f3eec5f5 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/Styles.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/Styles.lua @@ -83,4 +83,4 @@ function Styles:UpdateSelection(selectedIndex) end end -return Styles \ No newline at end of file +return Styles diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/TextOptions.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/TextOptions.lua index efe9a3435c..e76427a253 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/TextOptions.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/Tooltips/TextOptions.lua @@ -144,4 +144,4 @@ function TextOptions:OnDropdownValueChanged(value) end end -return TextOptions \ No newline at end of file +return TextOptions diff --git a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/UnloadThisCanvasButton.lua b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/UnloadThisCanvasButton.lua index 5cec4d25d2..e652a4b790 100644 --- a/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/UnloadThisCanvasButton.lua +++ b/Gems/LyShineExamples/Assets/UI/Scripts/LyShineExamples/UnloadThisCanvasButton.lua @@ -32,4 +32,4 @@ function UnloadThisCanvasButton:OnButtonClick() end end -return UnloadThisCanvasButton \ No newline at end of file +return UnloadThisCanvasButton diff --git a/Gems/LyShineExamples/Code/CMakeLists.txt b/Gems/LyShineExamples/Code/CMakeLists.txt index ccf49ba467..372bfa948b 100644 --- a/Gems/LyShineExamples/Code/CMakeLists.txt +++ b/Gems/LyShineExamples/Code/CMakeLists.txt @@ -23,6 +23,7 @@ ly_add_target( PUBLIC Legacy::CryCommon Gem::LmbrCentral + Gem::LyShine.Static ) ly_add_target( diff --git a/Gems/LyShineExamples/Code/Source/UiCustomImageComponent.cpp b/Gems/LyShineExamples/Code/Source/UiCustomImageComponent.cpp index 4ff8128d47..80750efe7f 100644 --- a/Gems/LyShineExamples/Code/Source/UiCustomImageComponent.cpp +++ b/Gems/LyShineExamples/Code/Source/UiCustomImageComponent.cpp @@ -20,7 +20,7 @@ #include <IRenderer.h> -#include <LyShine/IDraw2d.h> +#include <LyShine/Draw2d.h> #include <LyShine/ISprite.h> #include <LyShine/Bus/UiElementBus.h> #include <LyShine/Bus/UiCanvasBus.h> diff --git a/Gems/Maestro/Code/CMakeLists.txt b/Gems/Maestro/Code/CMakeLists.txt index bf67ee2744..fe58ba03a6 100644 --- a/Gems/Maestro/Code/CMakeLists.txt +++ b/Gems/Maestro/Code/CMakeLists.txt @@ -98,4 +98,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_googletest( NAME Gem::Maestro.Tests ) -endif() \ No newline at end of file +endif() diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.cpp index 0fdcca5e2d..b0ebb10b0e 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.cpp @@ -88,11 +88,14 @@ void CAnimAzEntityNode::SetSkipInterpolatedCameraNode(const bool skipNodeCameraA } ////////////////////////////////////////////////////////////////////////// -void CAnimAzEntityNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimAzEntityNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimAzEntityNode, CAnimNode>() - ->Version(1) - ->Field("Entity", &CAnimAzEntityNode::m_entityId); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimAzEntityNode, CAnimNode>() + ->Version(1) + ->Field("Entity", &CAnimAzEntityNode::m_entityId); + } } ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h index 2a3264f381..863d0e927f 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h @@ -74,7 +74,7 @@ public: // will be animating these components during interpolation. void SetSkipInterpolatedCameraNode(const bool skipNodeCameraAnimation) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.cpp index d66d0f266f..ea7322014c 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.cpp @@ -651,12 +651,15 @@ void CAnimComponentNode::AddPropertyToParamInfoMap(const CAnimParamType& paramTy } ////////////////////////////////////////////////////////////////////////// -void CAnimComponentNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimComponentNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimComponentNode, CAnimNode>() - ->Version(1) - ->Field("ComponentID", &CAnimComponentNode::m_componentId) - ->Field("ComponentTypeID", &CAnimComponentNode::m_componentTypeId); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimComponentNode, CAnimNode>() + ->Version(1) + ->Field("ComponentID", &CAnimComponentNode::m_componentId) + ->Field("ComponentTypeID", &CAnimComponentNode::m_componentTypeId); + } } ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h index d519a9ba96..5d83f7ba0d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h @@ -102,7 +102,7 @@ public: m_skipComponentAnimationUpdates = skipAnimationUpdates; } - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: // functions involved in the process to parse and store component behavior context animated properties diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.cpp index 8ee5f605aa..7996cc8c65 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.cpp @@ -67,10 +67,13 @@ void CAnimEnvironmentNode::Initialize() } } ////////////////////////////////////////////////////////////////////////// -void CAnimEnvironmentNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimEnvironmentNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimEnvironmentNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimEnvironmentNode, CAnimNode>() + ->Version(1); + } } void CAnimEnvironmentNode::Animate(SAnimContext& ac) diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.h index 1a92e4d30d..9287ce4cdd 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimEnvironmentNode.h @@ -40,7 +40,7 @@ public: virtual unsigned int GetParamCount() const; virtual CAnimParamType GetParamType(unsigned int nIndex) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimNode.cpp index 25215e348d..ef346bd230 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimNode.cpp @@ -272,17 +272,32 @@ bool CAnimNode::RemoveTrack(IAnimTrack* pTrack) } ////////////////////////////////////////////////////////////////////////// -void CAnimNode::Reflect(AZ::SerializeContext* serializeContext) +static bool AnimNodeVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<CAnimNode>() - ->Version(2) - ->Field("ID", &CAnimNode::m_id) - ->Field("Name", &CAnimNode::m_name) - ->Field("Flags", &CAnimNode::m_flags) - ->Field("Tracks", &CAnimNode::m_tracks) - ->Field("Parent", &CAnimNode::m_parentNodeId) - ->Field("Type", &CAnimNode::m_nodeType) - ->Field("Expanded", &CAnimNode::m_expanded); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimNode>()); + } + + return true; +} + +void CAnimNode::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimNode, IAnimNode>() + ->Version(3, &AnimNodeVersionConverter) + ->Field("ID", &CAnimNode::m_id) + ->Field("Name", &CAnimNode::m_name) + ->Field("Flags", &CAnimNode::m_flags) + ->Field("Tracks", &CAnimNode::m_tracks) + ->Field("Parent", &CAnimNode::m_parentNodeId) + ->Field("Type", &CAnimNode::m_nodeType) + ->Field("Expanded", &CAnimNode::m_expanded); + } } ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimNode.h index 4df5e692d0..0c52ac5a48 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimNode.h @@ -162,7 +162,7 @@ public: void SetExpanded(bool expanded) override; bool GetExpanded() const override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual void UpdateDynamicParamsInternal() {}; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.cpp index 05ba8309b1..1a177b6dc0 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.cpp @@ -36,8 +36,11 @@ CAnimParamType CAnimNodeGroup::GetParamType([[maybe_unused]] unsigned int nIndex } ////////////////////////////////////////////////////////////////////////// -void CAnimNodeGroup::Reflect(AZ::SerializeContext* serializeContext) +void CAnimNodeGroup::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimNodeGroup, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimNodeGroup, CAnimNode>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.h b/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.h index 66ffeea570..fcb18c448a 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimNodeGroup.h @@ -34,7 +34,7 @@ public: virtual CAnimParamType GetParamType(unsigned int nIndex) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; -#endif // CRYINCLUDE_CRYMOVIE_ANIMNODEGROUP_H \ No newline at end of file +#endif // CRYINCLUDE_CRYMOVIE_ANIMNODEGROUP_H diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp index d42a5d948e..f94022af89 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp @@ -453,8 +453,11 @@ void CAnimPostFXNode::OnReset() } ////////////////////////////////////////////////////////////////////////// -void CAnimPostFXNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimPostFXNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimPostFXNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimPostFXNode, CAnimNode>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h index 38bcffd20b..2f332aa7c2 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h @@ -63,7 +63,7 @@ public: void InitPostLoad(IAnimSequence* sequence) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.cpp index bc5f0597a7..ba30c3de39 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.cpp @@ -291,10 +291,13 @@ void CAnimScreenFaderNode::Serialize } ////////////////////////////////////////////////////////////////////////// -void CAnimScreenFaderNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimScreenFaderNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimScreenFaderNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimScreenFaderNode, CAnimNode>() + ->Version(1); + } } //----------------------------------------------------------------------------- diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h index c67febe983..eb77385ba3 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h @@ -56,7 +56,7 @@ public: bool IsAnyTextureVisible() const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSequence.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimSequence.cpp index ffbdce8ed6..9145b18380 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSequence.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSequence.cpp @@ -837,9 +837,7 @@ static bool AnimSequenceVersionConverter( void CAnimSequence::Reflect(AZ::ReflectContext* context) { - IAnimSequence::Reflect(context); - - if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context); serializeContext != nullptr) + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { serializeContext->Class<CAnimSequence, IAnimSequence>() ->Version(IAnimSequence::kSequenceVersion, &AnimSequenceVersionConverter) diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp index 1c60c23b51..81281b27df 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.cpp @@ -17,101 +17,104 @@ #include "AnimSerializer.h" -void AnimSerializer::ReflectAnimTypes(AZ::SerializeContext* context) +void AnimSerializer::ReflectAnimTypes(AZ::ReflectContext* context) { - // Reflection for Maestro's AZ_TYPE_INFO'ed classes - context->Class<CAnimParamType>() - ->Version(1) - ->Field("Type", &CAnimParamType::m_type) - ->Field("Name", &CAnimParamType::m_name); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context); serializeContext != nullptr) + { + // Reflection for Maestro's AZ_TYPE_INFO'ed classes + serializeContext->Class<CAnimParamType>() + ->Version(1) + ->Field("Type", &CAnimParamType::m_type) + ->Field("Name", &CAnimParamType::m_name); - context->Class<Range>() - ->Field("Start", &Range::start) - ->Field("End", &Range::end); + serializeContext->Class<Range>() + ->Field("Start", &Range::start) + ->Field("End", &Range::end); - // Curve Key classes - context->Class<IKey>() - ->Field("Time", &IKey::time) - ->Field("Flags", &IKey::flags); + // Curve Key classes + serializeContext->Class<IKey>() + ->Field("Time", &IKey::time) + ->Field("Flags", &IKey::flags); - context->Class<AZ::IAssetBlendKey, ITimeRangeKey>() - ->Field("AssetId", &AZ::IAssetBlendKey::m_assetId) - ->Field("Description", &AZ::IAssetBlendKey::m_description) - ->Field("BlendInTime", &AZ::IAssetBlendKey::m_blendInTime) - ->Field("BlendOutTime", &AZ::IAssetBlendKey::m_blendOutTime); + serializeContext->Class<AZ::IAssetBlendKey, ITimeRangeKey>() + ->Field("AssetId", &AZ::IAssetBlendKey::m_assetId) + ->Field("Description", &AZ::IAssetBlendKey::m_description) + ->Field("BlendInTime", &AZ::IAssetBlendKey::m_blendInTime) + ->Field("BlendOutTime", &AZ::IAssetBlendKey::m_blendOutTime); - context->Class<IBoolKey, IKey>(); + serializeContext->Class<IBoolKey, IKey>(); - context->Class<ICaptureKey, IKey>() - ->Field("Duration", &ICaptureKey::duration) - ->Field("TimeStep", &ICaptureKey::timeStep) - ->Field("Folder", &ICaptureKey::folder) - ->Field("Once", &ICaptureKey::once) - ->Field("FilePrefix", &ICaptureKey::prefix); + serializeContext->Class<ICaptureKey, IKey>() + ->Field("Duration", &ICaptureKey::duration) + ->Field("TimeStep", &ICaptureKey::timeStep) + ->Field("Folder", &ICaptureKey::folder) + ->Field("Once", &ICaptureKey::once) + ->Field("FilePrefix", &ICaptureKey::prefix); - context->Class<ICharacterKey, ITimeRangeKey>() - ->Field("Animation", &ICharacterKey::m_animation) - ->Field("BlendGap", &ICharacterKey::m_bBlendGap) - ->Field("PlayInPlace", &ICharacterKey::m_bInPlace); + serializeContext->Class<ICharacterKey, ITimeRangeKey>() + ->Field("Animation", &ICharacterKey::m_animation) + ->Field("BlendGap", &ICharacterKey::m_bBlendGap) + ->Field("PlayInPlace", &ICharacterKey::m_bInPlace); - context->Class<ICommentKey, IKey>() - ->Field("Comment", &ICommentKey::m_strComment) - ->Field("Duration", &ICommentKey::m_duration) - ->Field("Font", &ICommentKey::m_strFont) - ->Field("Color", &ICommentKey::m_color) - ->Field("Size", &ICommentKey::m_size) - ->Field("Align", &ICommentKey::m_align); + serializeContext->Class<ICommentKey, IKey>() + ->Field("Comment", &ICommentKey::m_strComment) + ->Field("Duration", &ICommentKey::m_duration) + ->Field("Font", &ICommentKey::m_strFont) + ->Field("Color", &ICommentKey::m_color) + ->Field("Size", &ICommentKey::m_size) + ->Field("Align", &ICommentKey::m_align); - context->Class<IConsoleKey, IKey>() - ->Field("Command", &IConsoleKey::command); + serializeContext->Class<IConsoleKey, IKey>() + ->Field("Command", &IConsoleKey::command); - context->Class<IDiscreteFloatKey, IKey>() - ->Field("Value", &IDiscreteFloatKey::m_fValue); + serializeContext->Class<IDiscreteFloatKey, IKey>() + ->Field("Value", &IDiscreteFloatKey::m_fValue); - context->Class<IEventKey, IKey>() - ->Field("Event", &IEventKey::event) - ->Field("EventValue", &IEventKey::eventValue) - ->Field("Anim", &IEventKey::animation) - ->Field("Target", &IEventKey::target) - ->Field("Length", &IEventKey::duration); + serializeContext->Class<IEventKey, IKey>() + ->Field("Event", &IEventKey::event) + ->Field("EventValue", &IEventKey::eventValue) + ->Field("Anim", &IEventKey::animation) + ->Field("Target", &IEventKey::target) + ->Field("Length", &IEventKey::duration); - context->Class<ILookAtKey, IKey>() - ->Field("LookAtNodeName", &ILookAtKey::szSelection) - ->Field("LookPose", &ILookAtKey::lookPose) - ->Field("Duration", &ILookAtKey::fDuration) - ->Field("SmoothTime", &ILookAtKey::smoothTime); + serializeContext->Class<ILookAtKey, IKey>() + ->Field("LookAtNodeName", &ILookAtKey::szSelection) + ->Field("LookPose", &ILookAtKey::lookPose) + ->Field("Duration", &ILookAtKey::fDuration) + ->Field("SmoothTime", &ILookAtKey::smoothTime); - context->Class<IScreenFaderKey, IKey>() - ->Field("FadeTime", &IScreenFaderKey::m_fadeTime) - ->Field("FadeColor", &IScreenFaderKey::m_fadeColor) - ->Field("FadeType", &IScreenFaderKey::m_fadeType) - ->Field("FadeChangeType", &IScreenFaderKey::m_fadeChangeType) - ->Field("Texture", &IScreenFaderKey::m_strTexture) - ->Field("useCurColor", &IScreenFaderKey::m_bUseCurColor); + serializeContext->Class<IScreenFaderKey, IKey>() + ->Field("FadeTime", &IScreenFaderKey::m_fadeTime) + ->Field("FadeColor", &IScreenFaderKey::m_fadeColor) + ->Field("FadeType", &IScreenFaderKey::m_fadeType) + ->Field("FadeChangeType", &IScreenFaderKey::m_fadeChangeType) + ->Field("Texture", &IScreenFaderKey::m_strTexture) + ->Field("useCurColor", &IScreenFaderKey::m_bUseCurColor); - context->Class<ISelectKey, IKey>() - ->Field("SelectedName", &ISelectKey::szSelection) - ->Field("SelectedEntityId", &ISelectKey::cameraAzEntityId) - ->Field("Duration", &ISelectKey::fDuration) - ->Field("BlendTime", &ISelectKey::fBlendTime); + serializeContext->Class<ISelectKey, IKey>() + ->Field("SelectedName", &ISelectKey::szSelection) + ->Field("SelectedEntityId", &ISelectKey::cameraAzEntityId) + ->Field("Duration", &ISelectKey::fDuration) + ->Field("BlendTime", &ISelectKey::fBlendTime); - context->Class<ISequenceKey, IKey>() - ->Field("Node", &ISequenceKey::szSelection) - ->Field("SequenceEntityId", &ISequenceKey::sequenceEntityId) - ->Field("OverrideTimes", &ISequenceKey::bOverrideTimes) - ->Field("StartTime", &ISequenceKey::fStartTime) - ->Field("EndTime", &ISequenceKey::fEndTime); + serializeContext->Class<ISequenceKey, IKey>() + ->Field("Node", &ISequenceKey::szSelection) + ->Field("SequenceEntityId", &ISequenceKey::sequenceEntityId) + ->Field("OverrideTimes", &ISequenceKey::bOverrideTimes) + ->Field("StartTime", &ISequenceKey::fStartTime) + ->Field("EndTime", &ISequenceKey::fEndTime); - context->Class<ISoundKey, IKey>() - ->Field("StartTrigger", &ISoundKey::sStartTrigger) - ->Field("StopTrigger", &ISoundKey::sStopTrigger) - ->Field("Duration", &ISoundKey::fDuration) - ->Field("Color", &ISoundKey::customColor); + serializeContext->Class<ISoundKey, IKey>() + ->Field("StartTrigger", &ISoundKey::sStartTrigger) + ->Field("StopTrigger", &ISoundKey::sStopTrigger) + ->Field("Duration", &ISoundKey::fDuration) + ->Field("Color", &ISoundKey::customColor); - context->Class<ITimeRangeKey, IKey>() - ->Field("Duration", &ITimeRangeKey::m_duration) - ->Field("Start", &ITimeRangeKey::m_startTime) - ->Field("End", &ITimeRangeKey::m_endTime) - ->Field("Speed", &ITimeRangeKey::m_speed) - ->Field("Loop", &ITimeRangeKey::m_bLoop); + serializeContext->Class<ITimeRangeKey, IKey>() + ->Field("Duration", &ITimeRangeKey::m_duration) + ->Field("Start", &ITimeRangeKey::m_startTime) + ->Field("End", &ITimeRangeKey::m_endTime) + ->Field("Speed", &ITimeRangeKey::m_speed) + ->Field("Loop", &ITimeRangeKey::m_bLoop); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.h b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.h index bc9b2269ee..3242970cad 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSerializer.h @@ -11,11 +11,11 @@ */ #pragma once -#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/RTTI/ReflectContext.h> class AnimSerializer { public: //! Reflection for Maestro's AZ_TYPE_INFO'ed classes - static void ReflectAnimTypes(AZ::SerializeContext* context); + static void ReflectAnimTypes(AZ::ReflectContext* context); }; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h index 0bd2f24ad8..02ed7aa55a 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h @@ -370,7 +370,7 @@ public: m_id = id; } - static void Reflect(AZ::SerializeContext* serializeContext) {} + static void Reflect([[maybe_unused]] AZ::ReflectContext* context) {} protected: diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack_Vec2Specialization.h b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack_Vec2Specialization.h index 83ba4b00c3..bc85c6b6f4 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack_Vec2Specialization.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack_Vec2Specialization.h @@ -404,34 +404,39 @@ inline bool TAnimSplineTrack<Vec2>::VersionConverter(AZ::SerializeContext& conte AZ::SerializeContext::DataElementNode& classElement) { bool result = true; - if (classElement.GetVersion() == 1) + if (classElement.GetVersion() < 5) { - bool converted = false; + classElement.AddElement(context, "BaseClass1", azrtti_typeid<IAnimTrack>()); - int splineElementIdx = classElement.FindElement(AZ_CRC("Spline", 0x35f655e9)); - if (splineElementIdx != -1) + if (classElement.GetVersion() == 1) { - // Find & copy the raw pointer node - AZ::SerializeContext::DataElementNode& splinePtrNodeRef = classElement.GetSubElement(splineElementIdx); - AZ::SerializeContext::DataElementNode splinePtrNodeCopy = splinePtrNodeRef; + bool converted = false; - // Reset the node, then convert it to an intrusive pointer - splinePtrNodeRef = AZ::SerializeContext::DataElementNode(); - if (splinePtrNodeRef.Convert<AZStd::intrusive_ptr<spline::TrackSplineInterpolator<Vec2>>>(context, "Spline")) + int splineElementIdx = classElement.FindElement(AZ_CRC("Spline", 0x35f655e9)); + if (splineElementIdx != -1) { - // Use the standard name used with the smart pointers serialization - // (smart pointers are serialized as containers with one element); - // Set the intrusive pointer to the raw pointer value - splinePtrNodeCopy.SetName(AZ::SerializeContext::IDataContainer::GetDefaultElementName()); - splinePtrNodeRef.AddElement(splinePtrNodeCopy); + // Find & copy the raw pointer node + AZ::SerializeContext::DataElementNode& splinePtrNodeRef = classElement.GetSubElement(splineElementIdx); + AZ::SerializeContext::DataElementNode splinePtrNodeCopy = splinePtrNodeRef; - converted = true; + // Reset the node, then convert it to an intrusive pointer + splinePtrNodeRef = AZ::SerializeContext::DataElementNode(); + if (splinePtrNodeRef.Convert<AZStd::intrusive_ptr<spline::TrackSplineInterpolator<Vec2>>>(context, "Spline")) + { + // Use the standard name used with the smart pointers serialization + // (smart pointers are serialized as containers with one element); + // Set the intrusive pointer to the raw pointer value + splinePtrNodeCopy.SetName(AZ::SerializeContext::IDataContainer::GetDefaultElementName()); + splinePtrNodeRef.AddElement(splinePtrNodeCopy); + + converted = true; + } } - } - // Did not convert. Discard unknown versions if failed to convert, and hope for the best - AZ_Assert(converted, "Failed to convert TUiAnimSplineTrack<Vec2> version %d to the current version", classElement.GetVersion()); - result = converted; + // Did not convert. Discard unknown versions if failed to convert, and hope for the best + AZ_Assert(converted, "Failed to convert TUiAnimSplineTrack<Vec2> version %d to the current version", classElement.GetVersion()); + result = converted; + } } return result; @@ -439,31 +444,34 @@ inline bool TAnimSplineTrack<Vec2>::VersionConverter(AZ::SerializeContext& conte ////////////////////////////////////////////////////////////////////////// template<> -inline void TAnimSplineTrack<Vec2>::Reflect(AZ::SerializeContext* serializeContext) +inline void TAnimSplineTrack<Vec2>::Reflect(AZ::ReflectContext* context) { - spline::SplineKey<Vec2>::Reflect(serializeContext); - spline::SplineKeyEx<Vec2>::Reflect(serializeContext); - - spline::TrackSplineInterpolator<Vec2>::Reflect(serializeContext); - BezierSplineVec2::Reflect(serializeContext); - - serializeContext->Class<TAnimSplineTrack<Vec2> >() - ->Version(4, &TAnimSplineTrack<Vec2>::VersionConverter) - ->Field("Flags", &TAnimSplineTrack<Vec2>::m_flags) - ->Field("DefaultValue", &TAnimSplineTrack<Vec2>::m_defaultValue) - ->Field("ParamType", &TAnimSplineTrack<Vec2>::m_nParamType) - ->Field("Spline", &TAnimSplineTrack<Vec2>::m_spline) - ->Field("Id", &TAnimSplineTrack<Vec2>::m_id); - - AZ::EditContext* ec = serializeContext->GetEditContext(); - - // Preventing the default value from being pushed to slice to keep it from dirtying the slice when updated internally - if (ec) + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { - ec->Class<TAnimSplineTrack<Vec2>>("TAnimSplineTrack Vec2", "Specialization track for Vec2 AnimSpline")-> - DataElement(AZ::Edit::UIHandlers::Vector2, &TAnimSplineTrack<Vec2>::m_defaultValue, "DefaultValue", "")-> + spline::SplineKey<Vec2>::Reflect(serializeContext); + spline::SplineKeyEx<Vec2>::Reflect(serializeContext); + + spline::TrackSplineInterpolator<Vec2>::Reflect(serializeContext); + BezierSplineVec2::Reflect(serializeContext); + + serializeContext->Class<TAnimSplineTrack<Vec2>, IAnimTrack>() + ->Version(5, &TAnimSplineTrack<Vec2>::VersionConverter) + ->Field("Flags", &TAnimSplineTrack<Vec2>::m_flags) + ->Field("DefaultValue", &TAnimSplineTrack<Vec2>::m_defaultValue) + ->Field("ParamType", &TAnimSplineTrack<Vec2>::m_nParamType) + ->Field("Spline", &TAnimSplineTrack<Vec2>::m_spline) + ->Field("Id", &TAnimSplineTrack<Vec2>::m_id); + + AZ::EditContext* ec = serializeContext->GetEditContext(); + + // Preventing the default value from being pushed to slice to keep it from dirtying the slice when updated internally + if (ec) + { + ec->Class<TAnimSplineTrack<Vec2>>("TAnimSplineTrack Vec2", "Specialization track for Vec2 AnimSpline")-> + DataElement(AZ::Edit::UIHandlers::Vector2, &TAnimSplineTrack<Vec2>::m_defaultValue, "DefaultValue", "")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Hide)-> Attribute(AZ::Edit::Attributes::SliceFlags, AZ::Edit::SliceFlags::NotPushable); + } } } #endif // CRYINCLUDE_CRYMOVIE_ANIMSPLINETRACK_VEC2SPECIALIZATION_H diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.cpp index 5fc8ddb6db..6c19e34623 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.cpp @@ -12,4 +12,4 @@ // Original file Copyright Crytek GMBH or its affiliates, used under license. #include "Maestro_precompiled.h" -#include "AnimTrack.h" \ No newline at end of file +#include "AnimTrack.h" diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h index d8a644e671..24c78f5a1b 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h @@ -249,7 +249,7 @@ public: m_id = id; } - static void Reflect([[maybe_unused]] AZ::SerializeContext* serializeContext) {} + static void Reflect([[maybe_unused]] AZ::ReflectContext* context) {} protected: void CheckValid() diff --git a/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.cpp index b619d3877f..ee3b6a64c2 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.cpp @@ -163,16 +163,31 @@ float CAssetBlendTrack::GetKeyDuration(int key) const } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<AZ::IAssetBlendKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool AssetBlendTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<AZ::IAssetBlendKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<AZ::IAssetBlendKey>::m_flags) - ->Field("Range", &TAnimTrack<AZ::IAssetBlendKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<AZ::IAssetBlendKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<AZ::IAssetBlendKey>::m_keys) - ->Field("Id", &TAnimTrack<AZ::IAssetBlendKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<AZ::IAssetBlendKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<AZ::IAssetBlendKey>, IAnimTrack>() + ->Version(3, &AssetBlendTrackVersionConverter) + ->Field("Flags", &TAnimTrack<AZ::IAssetBlendKey>::m_flags) + ->Field("Range", &TAnimTrack<AZ::IAssetBlendKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<AZ::IAssetBlendKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<AZ::IAssetBlendKey>::m_keys) + ->Field("Id", &TAnimTrack<AZ::IAssetBlendKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// @@ -277,10 +292,13 @@ float CAssetBlendTrack::GetEndTime() const } ////////////////////////////////////////////////////////////////////////// -void CAssetBlendTrack::Reflect(AZ::SerializeContext* serializeContext) +void CAssetBlendTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<AZ::IAssetBlendKey>::Reflect(serializeContext); + TAnimTrack<AZ::IAssetBlendKey>::Reflect(context); - serializeContext->Class<CAssetBlendTrack, TAnimTrack<AZ::IAssetBlendKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAssetBlendTrack, TAnimTrack<AZ::IAssetBlendKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.h b/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.h index a14e66463e..e676fdf05b 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AssetBlendTrack.h @@ -47,7 +47,7 @@ public: float GetEndTime() const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: diff --git a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.cpp index adfbba312d..e485d022b2 100644 --- a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.cpp @@ -98,24 +98,42 @@ bool CBoolTrack::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTr } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<IBoolKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool BoolTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<IBoolKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<IBoolKey>::m_flags) - ->Field("Range", &TAnimTrack<IBoolKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<IBoolKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<IBoolKey>::m_keys) - ->Field("Id", &TAnimTrack<IBoolKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<IBoolKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<IBoolKey>, IAnimTrack>() + ->Version(3, &BoolTrackVersionConverter) + ->Field("Flags", &TAnimTrack<IBoolKey>::m_flags) + ->Field("Range", &TAnimTrack<IBoolKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<IBoolKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<IBoolKey>::m_keys) + ->Field("Id", &TAnimTrack<IBoolKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CBoolTrack::Reflect(AZ::SerializeContext* serializeContext) +void CBoolTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IBoolKey>::Reflect(serializeContext); + TAnimTrack<IBoolKey>::Reflect(context); - serializeContext->Class<CBoolTrack, TAnimTrack<IBoolKey> >() - ->Version(1) - ->Field("DefaultValue", &CBoolTrack::m_bDefaultValue); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CBoolTrack, TAnimTrack<IBoolKey>>() + ->Version(1) + ->Field("DefaultValue", &CBoolTrack::m_bDefaultValue); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h index 5a69706967..d374aad5db 100644 --- a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h @@ -45,7 +45,7 @@ public: bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: bool m_bDefaultValue; diff --git a/Gems/Maestro/Code/Source/Cinematics/CVarNode.cpp b/Gems/Maestro/Code/Source/Cinematics/CVarNode.cpp index 20b0bae527..2d27feec95 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CVarNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CVarNode.cpp @@ -151,8 +151,11 @@ void CAnimCVarNode::Animate(SAnimContext& ec) } ////////////////////////////////////////////////////////////////////////// -void CAnimCVarNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimCVarNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimCVarNode,CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimCVarNode, CAnimNode>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/CVarNode.h b/Gems/Maestro/Code/Source/Cinematics/CVarNode.h index 63b1fb46f8..7a1b578238 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CVarNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/CVarNode.h @@ -41,7 +41,7 @@ public: int GetDefaultKeyTangentFlags() const override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp index 1a9df2baa7..c627343914 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.cpp @@ -71,23 +71,41 @@ void CCaptureTrack::GetKeyInfo(int key, const char*& description, float& duratio } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ICaptureKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool CaptureTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ICaptureKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ICaptureKey>::m_flags) - ->Field("Range", &TAnimTrack<ICaptureKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ICaptureKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ICaptureKey>::m_keys) - ->Field("Id", &TAnimTrack<ICaptureKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ICaptureKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ICaptureKey>, IAnimTrack>() + ->Version(3, &CaptureTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ICaptureKey>::m_flags) + ->Field("Range", &TAnimTrack<ICaptureKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ICaptureKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ICaptureKey>::m_keys) + ->Field("Id", &TAnimTrack<ICaptureKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CCaptureTrack::Reflect(AZ::SerializeContext* serializeContext) +void CCaptureTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ICaptureKey>::Reflect(serializeContext); + TAnimTrack<ICaptureKey>::Reflect(context); - serializeContext->Class<CCaptureTrack, TAnimTrack<ICaptureKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CCaptureTrack, TAnimTrack<ICaptureKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.h b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.h index c4f15f65ae..cee5f5137d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/CaptureTrack.h @@ -33,7 +33,7 @@ public: void SerializeKey(ICaptureKey& key, XmlNodeRef& keyNode, bool bLoading); void GetKeyInfo(int key, const char*& description, float& duration); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_CAPTURETRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.cpp index 9c54069d4c..4ad6cbb24a 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.cpp @@ -150,16 +150,31 @@ float CCharacterTrack::GetKeyDuration(int key) const } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ICharacterKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool CharacterTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ICharacterKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ICharacterKey>::m_flags) - ->Field("Range", &TAnimTrack<ICharacterKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ICharacterKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ICharacterKey>::m_keys) - ->Field("Id", &TAnimTrack<ICharacterKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ICharacterKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ICharacterKey>, IAnimTrack>() + ->Version(3, &CharacterTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ICharacterKey>::m_flags) + ->Field("Range", &TAnimTrack<ICharacterKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ICharacterKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ICharacterKey>::m_keys) + ->Field("Id", &TAnimTrack<ICharacterKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// @@ -169,11 +184,14 @@ AnimValueType CCharacterTrack::GetValueType() } ////////////////////////////////////////////////////////////////////////// -void CCharacterTrack::Reflect(AZ::SerializeContext* serializeContext) +void CCharacterTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ICharacterKey>::Reflect(serializeContext); + TAnimTrack<ICharacterKey>::Reflect(context); - serializeContext->Class<CCharacterTrack, TAnimTrack<ICharacterKey> >() - ->Version(1) - ->Field("AnimationLayer", &CCharacterTrack::m_iAnimationLayer); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CCharacterTrack, TAnimTrack<ICharacterKey>>() + ->Version(1) + ->Field("AnimationLayer", &CCharacterTrack::m_iAnimationLayer); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.h b/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.h index d95d648318..ccfb2f87c2 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/CharacterTrack.h @@ -51,7 +51,7 @@ public: float GetEndTime() const { return m_timeRange.end; } - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: int m_iAnimationLayer; diff --git a/Gems/Maestro/Code/Source/Cinematics/CommentNode.cpp b/Gems/Maestro/Code/Source/Cinematics/CommentNode.cpp index c052d7dd04..a519de18f7 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CommentNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CommentNode.cpp @@ -107,10 +107,13 @@ void CCommentNode::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmpty } ////////////////////////////////////////////////////////////////////////// -void CCommentNode::Reflect(AZ::SerializeContext* serializeContext) +void CCommentNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CCommentNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CCommentNode, CAnimNode>() + ->Version(1); + } } //----------------------------------------------------------------------------- diff --git a/Gems/Maestro/Code/Source/Cinematics/CommentNode.h b/Gems/Maestro/Code/Source/Cinematics/CommentNode.h index a0d62903f6..1fc46817ff 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CommentNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/CommentNode.h @@ -49,7 +49,7 @@ public: virtual unsigned int GetParamCount() const; virtual CAnimParamType GetParamType(unsigned int nIndex) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/CommentTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/CommentTrack.cpp index 981b98de01..3f64433dbb 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CommentTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CommentTrack.cpp @@ -78,23 +78,41 @@ void CCommentTrack::SerializeKey(ICommentKey& key, XmlNodeRef& keyNode, bool bLo ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ICommentKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool CommentTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ICommentKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ICommentKey>::m_flags) - ->Field("Range", &TAnimTrack<ICommentKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ICommentKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ICommentKey>::m_keys) - ->Field("Id", &TAnimTrack<ICommentKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ICommentKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ICommentKey>, IAnimTrack>() + ->Version(3, &CommentTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ICommentKey>::m_flags) + ->Field("Range", &TAnimTrack<ICommentKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ICommentKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ICommentKey>::m_keys) + ->Field("Id", &TAnimTrack<ICommentKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CCommentTrack::Reflect(AZ::SerializeContext* serializeContext) +void CCommentTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ICommentKey>::Reflect(serializeContext); + TAnimTrack<ICommentKey>::Reflect(context); - serializeContext->Class<CCommentTrack, TAnimTrack<ICommentKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CCommentTrack, TAnimTrack<ICommentKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/CommentTrack.h b/Gems/Maestro/Code/Source/Cinematics/CommentTrack.h index 9ae370e58d..2db786b72d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CommentTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/CommentTrack.h @@ -40,7 +40,7 @@ public: //! void ValidateKeyOrder() { CheckValid(); } - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_COMMENTTRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.cpp index 002a370c61..c1aab0060f 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.cpp @@ -604,16 +604,31 @@ void CCompoundSplineTrack::SetId(unsigned int id) } ////////////////////////////////////////////////////////////////////////// -void CCompoundSplineTrack::Reflect(AZ::SerializeContext* serializeContext) +static bool CompoundSplineTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<CCompoundSplineTrack>() - ->Version(3) - ->Field("Flags", &CCompoundSplineTrack::m_flags) - ->Field("ParamType", &CCompoundSplineTrack::m_nParamType) - ->Field("NumSubTracks", &CCompoundSplineTrack::m_nDimensions) - ->Field("SubTracks", &CCompoundSplineTrack::m_subTracks) - ->Field("SubTrackNames", &CCompoundSplineTrack::m_subTrackNames) - ->Field("ValueType", &CCompoundSplineTrack::m_valueType) - ->Field("Expanded", &CCompoundSplineTrack::m_expanded) - ->Field("Id", &CCompoundSplineTrack::m_id); + if (rootElement.GetVersion() < 4) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +void CCompoundSplineTrack::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CCompoundSplineTrack, IAnimTrack>() + ->Version(4, &CompoundSplineTrackVersionConverter) + ->Field("Flags", &CCompoundSplineTrack::m_flags) + ->Field("ParamType", &CCompoundSplineTrack::m_nParamType) + ->Field("NumSubTracks", &CCompoundSplineTrack::m_nDimensions) + ->Field("SubTracks", &CCompoundSplineTrack::m_subTracks) + ->Field("SubTrackNames", &CCompoundSplineTrack::m_subTrackNames) + ->Field("ValueType", &CCompoundSplineTrack::m_valueType) + ->Field("Expanded", &CCompoundSplineTrack::m_expanded) + ->Field("Id", &CCompoundSplineTrack::m_id); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h index 642d9fa4e0..63b76631ab 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h @@ -157,7 +157,7 @@ public: unsigned int GetId() const override; void SetId(unsigned int id) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: int m_refCount; diff --git a/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.cpp index fce49f0bd4..03c3eef634 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.cpp @@ -47,23 +47,41 @@ void CConsoleTrack::GetKeyInfo(int key, const char*& description, float& duratio } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<IConsoleKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool ConsoleTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<IConsoleKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<IConsoleKey>::m_flags) - ->Field("Range", &TAnimTrack<IConsoleKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<IConsoleKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<IConsoleKey>::m_keys) - ->Field("Id", &TAnimTrack<IConsoleKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<IConsoleKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<IConsoleKey>, IAnimTrack>() + ->Version(3, &ConsoleTrackVersionConverter) + ->Field("Flags", &TAnimTrack<IConsoleKey>::m_flags) + ->Field("Range", &TAnimTrack<IConsoleKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<IConsoleKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<IConsoleKey>::m_keys) + ->Field("Id", &TAnimTrack<IConsoleKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CConsoleTrack::Reflect(AZ::SerializeContext* serializeContext) +void CConsoleTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IConsoleKey>::Reflect(serializeContext); + TAnimTrack<IConsoleKey>::Reflect(context); - serializeContext->Class<CConsoleTrack, TAnimTrack<IConsoleKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CConsoleTrack, TAnimTrack<IConsoleKey> >() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.h b/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.h index c9ef0e3c4e..854ebacbaa 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/ConsoleTrack.h @@ -35,7 +35,7 @@ public: void GetKeyInfo(int key, const char*& description, float& duration); void SerializeKey(IConsoleKey& key, XmlNodeRef& keyNode, bool bLoading); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_CONSOLETRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/CryMovie.def b/Gems/Maestro/Code/Source/Cinematics/CryMovie.def index 091f1654b6..fc5c3c91cd 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CryMovie.def +++ b/Gems/Maestro/Code/Source/Cinematics/CryMovie.def @@ -1,3 +1,3 @@ EXPORTS ModuleInitISystem @2 - CryModuleGetMemoryInfo @8 \ No newline at end of file + CryModuleGetMemoryInfo @8 diff --git a/Gems/Maestro/Code/Source/Cinematics/EventNode.cpp b/Gems/Maestro/Code/Source/Cinematics/EventNode.cpp index 9ce35c4dbe..7a3f1361cf 100644 --- a/Gems/Maestro/Code/Source/Cinematics/EventNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/EventNode.cpp @@ -112,8 +112,11 @@ void CAnimEventNode::OnReset() } ////////////////////////////////////////////////////////////////////////// -void CAnimEventNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimEventNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimEventNode, CAnimNode>() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimEventNode, CAnimNode>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/EventNode.h b/Gems/Maestro/Code/Source/Cinematics/EventNode.h index d54fe73d80..78b3cd53ae 100644 --- a/Gems/Maestro/Code/Source/Cinematics/EventNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/EventNode.h @@ -42,7 +42,7 @@ public: virtual CAnimParamType GetParamType(unsigned int nIndex) const; virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: //! Last animated key in track. diff --git a/Gems/Maestro/Code/Source/Cinematics/EventTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/EventTrack.cpp index 02977ef377..a90a1dad83 100644 --- a/Gems/Maestro/Code/Source/Cinematics/EventTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/EventTrack.cpp @@ -103,10 +103,13 @@ void CEventTrack::InitPostLoad(IAnimSequence* sequence) } ////////////////////////////////////////////////////////////////////////// -void CEventTrack::Reflect(AZ::SerializeContext* serializeContext) +void CEventTrack::Reflect(AZ::ReflectContext* context) { // Note the template base class TAnimTrack<IEventKey>::Reflect() is reflected by CTrackEventTrack::Reflect() - serializeContext->Class<CEventTrack, TAnimTrack<IEventKey> >() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CEventTrack, TAnimTrack<IEventKey>>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/EventTrack.h b/Gems/Maestro/Code/Source/Cinematics/EventTrack.h index 58c9153014..b03f7d8e9f 100644 --- a/Gems/Maestro/Code/Source/Cinematics/EventTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/EventTrack.h @@ -42,7 +42,7 @@ public: void SetKey(int index, IKey* key); void InitPostLoad(IAnimSequence* sequence) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: AZStd::intrusive_ptr<IAnimStringTable> m_pStrings; diff --git a/Gems/Maestro/Code/Source/Cinematics/GotoTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/GotoTrack.cpp index 77662592cd..facd1e80fa 100644 --- a/Gems/Maestro/Code/Source/Cinematics/GotoTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/GotoTrack.cpp @@ -156,23 +156,41 @@ void CGotoTrack::SetKeyAtTime(float time, IKey* key) } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<IDiscreteFloatKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool GotoTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<IDiscreteFloatKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<IDiscreteFloatKey>::m_flags) - ->Field("Range", &TAnimTrack<IDiscreteFloatKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<IDiscreteFloatKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<IDiscreteFloatKey>::m_keys) - ->Field("Id", &TAnimTrack<IDiscreteFloatKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<IDiscreteFloatKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<IDiscreteFloatKey>, IAnimTrack>() + ->Version(3, &GotoTrackVersionConverter) + ->Field("Flags", &TAnimTrack<IDiscreteFloatKey>::m_flags) + ->Field("Range", &TAnimTrack<IDiscreteFloatKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<IDiscreteFloatKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<IDiscreteFloatKey>::m_keys) + ->Field("Id", &TAnimTrack<IDiscreteFloatKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CGotoTrack::Reflect(AZ::SerializeContext* serializeContext) +void CGotoTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IDiscreteFloatKey>::Reflect(serializeContext); + TAnimTrack<IDiscreteFloatKey>::Reflect(context); - serializeContext->Class<CGotoTrack, TAnimTrack<IDiscreteFloatKey> >() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CGotoTrack, TAnimTrack<IDiscreteFloatKey>>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/GotoTrack.h b/Gems/Maestro/Code/Source/Cinematics/GotoTrack.h index 1a38817204..aff269c56a 100644 --- a/Gems/Maestro/Code/Source/Cinematics/GotoTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/GotoTrack.h @@ -40,7 +40,7 @@ public: void SerializeKey(IDiscreteFloatKey& key, XmlNodeRef& keyNode, bool bLoading); void GetKeyInfo(int key, const char*& description, float& duration); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: void SetKeyAtTime(float time, IKey* key); diff --git a/Gems/Maestro/Code/Source/Cinematics/LayerNode.cpp b/Gems/Maestro/Code/Source/Cinematics/LayerNode.cpp index 1e2b6d401e..a7f0984069 100644 --- a/Gems/Maestro/Code/Source/Cinematics/LayerNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/LayerNode.cpp @@ -172,8 +172,11 @@ bool CLayerNode::GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& } ////////////////////////////////////////////////////////////////////////// -void CLayerNode::Reflect(AZ::SerializeContext* serializeContext) +void CLayerNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CLayerNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CLayerNode, CAnimNode>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/LayerNode.h b/Gems/Maestro/Code/Source/Cinematics/LayerNode.h index 7660c544b4..0ca977df2d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/LayerNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/LayerNode.h @@ -52,7 +52,7 @@ public: virtual unsigned int GetParamCount() const; virtual CAnimParamType GetParamType(unsigned int nIndex) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.cpp index 164b15b809..745dc5a8a4 100644 --- a/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.cpp @@ -79,24 +79,42 @@ void CLookAtTrack::GetKeyInfo(int key, const char*& description, float& duration ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ILookAtKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool LookAtTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ILookAtKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ILookAtKey>::m_flags) - ->Field("Range", &TAnimTrack<ILookAtKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ILookAtKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ILookAtKey>::m_keys) - ->Field("Id", &TAnimTrack<ILookAtKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ILookAtKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ILookAtKey>, IAnimTrack>() + ->Version(3, &LookAtTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ILookAtKey>::m_flags) + ->Field("Range", &TAnimTrack<ILookAtKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ILookAtKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ILookAtKey>::m_keys) + ->Field("Id", &TAnimTrack<ILookAtKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CLookAtTrack::Reflect(AZ::SerializeContext* serializeContext) +void CLookAtTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ILookAtKey>::Reflect(serializeContext); + TAnimTrack<ILookAtKey>::Reflect(context); - serializeContext->Class<CLookAtTrack, TAnimTrack<ILookAtKey> >() - ->Version(1) - ->Field("AnimationLayer", &CLookAtTrack::m_iAnimationLayer); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CLookAtTrack, TAnimTrack<ILookAtKey>>() + ->Version(1) + ->Field("AnimationLayer", &CLookAtTrack::m_iAnimationLayer); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.h b/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.h index c3479b04b8..c45df95046 100644 --- a/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/LookAtTrack.h @@ -41,7 +41,7 @@ public: int GetAnimationLayerIndex() const { return m_iAnimationLayer; } void SetAnimationLayerIndex(int index) { m_iAnimationLayer = index; } - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: int m_iAnimationLayer; }; diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp index a54737953e..abf1e5dc52 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp @@ -432,10 +432,13 @@ void CAnimMaterialNode::AddTrack(IAnimTrack* track) } ////////////////////////////////////////////////////////////////////////// -void CAnimMaterialNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimMaterialNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimMaterialNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimMaterialNode, CAnimNode>() + ->Version(1); + } } #undef s_nodeParamsInitialized diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h index 39b917b15c..9d6ff6b6e0 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h @@ -49,7 +49,7 @@ public: virtual void InitializeTrack(IAnimTrack* pTrack, const CAnimParamType& paramType); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp index ee7a443964..f68ddb2b49 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp @@ -1196,13 +1196,16 @@ void CMovieSystem::Callback(IMovieCallback::ECallbackReason reason, IAnimNode* p } ////////////////////////////////////////////////////////////////////////// -/*static*/ void CMovieSystem::Reflect(AZ::SerializeContext* serializeContext) +void CMovieSystem::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CMovieSystem>() - ->Version(1) - ->Field("Sequences", &CMovieSystem::m_sequences); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CMovieSystem>() + ->Version(1) + ->Field("Sequences", &CMovieSystem::m_sequences); + } - AnimSerializer::ReflectAnimTypes(serializeContext); + AnimSerializer::ReflectAnimTypes(context); } ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.h b/Gems/Maestro/Code/Source/Cinematics/Movie.h index 1749d3b491..2150a72304 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.h +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.h @@ -204,7 +204,7 @@ public: void OnSequenceActivated(IAnimSequence* sequence) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: diff --git a/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp b/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp index 652a144513..0b971dc7da 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp @@ -1026,10 +1026,13 @@ void CAnimSceneNode::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmp SetFlags(GetFlags() | eAnimNodeFlags_CanChangeName); } -void CAnimSceneNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimSceneNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimSceneNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimSceneNode, CAnimNode>() + ->Version(1); + } } void CAnimSceneNode::PrecacheStatic(float startTime) diff --git a/Gems/Maestro/Code/Source/Cinematics/SceneNode.h b/Gems/Maestro/Code/Source/Cinematics/SceneNode.h index f5e2a92005..81166ab6b1 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SceneNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/SceneNode.h @@ -90,7 +90,7 @@ public: virtual void PrecacheStatic(float startTime) override; virtual void PrecacheDynamic(float time) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); // Utility function to find the sequence associated with an ISequenceKey static IAnimSequence* GetSequenceFromSequenceKey(const ISequenceKey& sequenceKey); diff --git a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.cpp index aae6f7d01b..8b2e615c26 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.cpp @@ -179,23 +179,41 @@ bool CScreenFaderTrack::SetActiveTexture(int index) } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<IScreenFaderKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool ScreenFaderTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<IScreenFaderKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<IScreenFaderKey>::m_flags) - ->Field("Range", &TAnimTrack<IScreenFaderKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<IScreenFaderKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<IScreenFaderKey>::m_keys) - ->Field("Id", &TAnimTrack<IScreenFaderKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<IScreenFaderKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<IScreenFaderKey>, IAnimTrack>() + ->Version(3, &ScreenFaderTrackVersionConverter) + ->Field("Flags", &TAnimTrack<IScreenFaderKey>::m_flags) + ->Field("Range", &TAnimTrack<IScreenFaderKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<IScreenFaderKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<IScreenFaderKey>::m_keys) + ->Field("Id", &TAnimTrack<IScreenFaderKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CScreenFaderTrack::Reflect(AZ::SerializeContext* serializeContext) +void CScreenFaderTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IScreenFaderKey>::Reflect(serializeContext); + TAnimTrack<IScreenFaderKey>::Reflect(context); - serializeContext->Class<CScreenFaderTrack, TAnimTrack<IScreenFaderKey> >() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CScreenFaderTrack, TAnimTrack<IScreenFaderKey>>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h index 335e22038c..0c8faa890f 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h @@ -50,7 +50,7 @@ public: void SetLastTextureID(int nTextureID){ m_lastTextureID = nTextureID; }; bool SetActiveTexture(int index); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: void ReleasePreloadedTextures(); diff --git a/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.cpp b/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.cpp index fc6a57a521..e1ecdc77f5 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.cpp @@ -107,8 +107,11 @@ void CAnimScriptVarNode::Animate(SAnimContext& ec) } } -void CAnimScriptVarNode::Reflect(AZ::SerializeContext* serializeContext) +void CAnimScriptVarNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CAnimScriptVarNode, CAnimNode>() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CAnimScriptVarNode, CAnimNode>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.h b/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.h index 10e0c83063..6355961117 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/ScriptVarNode.h @@ -40,7 +40,7 @@ public: virtual CAnimParamType GetParamType(unsigned int nIndex) const; virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: float m_value; diff --git a/Gems/Maestro/Code/Source/Cinematics/SelectTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/SelectTrack.cpp index cc23a86ecd..53489bb454 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SelectTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/SelectTrack.cpp @@ -63,23 +63,41 @@ void CSelectTrack::GetKeyInfo(int key, const char*& description, float& duration } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ISelectKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool SelectTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ISelectKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ISelectKey>::m_flags) - ->Field("Range", &TAnimTrack<ISelectKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ISelectKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ISelectKey>::m_keys) - ->Field("Id", &TAnimTrack<ISelectKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ISelectKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ISelectKey>, IAnimTrack>() + ->Version(3, &SelectTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ISelectKey>::m_flags) + ->Field("Range", &TAnimTrack<ISelectKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ISelectKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ISelectKey>::m_keys) + ->Field("Id", &TAnimTrack<ISelectKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CSelectTrack::Reflect(AZ::SerializeContext* serializeContext) +void CSelectTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ISelectKey>::Reflect(serializeContext); + TAnimTrack<ISelectKey>::Reflect(context); - serializeContext->Class<CSelectTrack, TAnimTrack<ISelectKey> >() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CSelectTrack, TAnimTrack<ISelectKey>>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/SelectTrack.h b/Gems/Maestro/Code/Source/Cinematics/SelectTrack.h index a146f656ad..6e581bd507 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SelectTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/SelectTrack.h @@ -35,7 +35,7 @@ public: void GetKeyInfo(int key, const char*& description, float& duration); void SerializeKey(ISelectKey& key, XmlNodeRef& keyNode, bool bLoading); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_SELECTTRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.cpp index 25b8e9b421..b230dacf91 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.cpp @@ -83,23 +83,41 @@ void CSequenceTrack::GetKeyInfo(int key, const char*& description, float& durati } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ISequenceKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool SequencTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ISequenceKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ISequenceKey>::m_flags) - ->Field("Range", &TAnimTrack<ISequenceKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ISequenceKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ISequenceKey>::m_keys) - ->Field("Id", &TAnimTrack<ISequenceKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ISequenceKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ISequenceKey>, IAnimTrack>() + ->Version(3, &SequencTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ISequenceKey>::m_flags) + ->Field("Range", &TAnimTrack<ISequenceKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ISequenceKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ISequenceKey>::m_keys) + ->Field("Id", &TAnimTrack<ISequenceKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CSequenceTrack::Reflect(AZ::SerializeContext* serializeContext) +void CSequenceTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ISequenceKey>::Reflect(serializeContext); + TAnimTrack<ISequenceKey>::Reflect(context); - serializeContext->Class<CSequenceTrack, TAnimTrack<ISequenceKey> >() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CSequenceTrack, TAnimTrack<ISequenceKey> >() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.h b/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.h index 816b011e39..d4bfa65985 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/SequenceTrack.h @@ -29,7 +29,7 @@ public: void GetKeyInfo(int key, const char*& description, float& duration); void SerializeKey(ISequenceKey& key, XmlNodeRef& keyNode, bool bLoading); - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_SEQUENCETRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.cpp b/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.cpp index 317791fe7c..5cc8409b2d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.cpp @@ -117,8 +117,11 @@ bool CShadowsSetupNode::GetParamInfoFromType(const CAnimParamType& paramId, SPar } ////////////////////////////////////////////////////////////////////////// -void CShadowsSetupNode::Reflect(AZ::SerializeContext* serializeContext) +void CShadowsSetupNode::Reflect(AZ::ReflectContext* context) { - serializeContext->Class<CShadowsSetupNode, CAnimNode>() - ->Version(1); -} \ No newline at end of file + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CShadowsSetupNode, CAnimNode>() + ->Version(1); + } +} diff --git a/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.h b/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.h index 8cdf908168..85a44ace69 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/ShadowsSetupNode.h @@ -45,7 +45,7 @@ public: virtual unsigned int GetParamCount() const; virtual CAnimParamType GetParamType(unsigned int nIndex) const; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); protected: virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.cpp index 2378cceb2d..c7bf492e54 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.cpp @@ -60,23 +60,41 @@ void CSoundTrack::GetKeyInfo(int key, const char*& description, float& duration) } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ISoundKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool SoundTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ISoundKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ISoundKey>::m_flags) - ->Field("Range", &TAnimTrack<ISoundKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ISoundKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ISoundKey>::m_keys) - ->Field("Id", &TAnimTrack<ISoundKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ISoundKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ISoundKey>, IAnimTrack>() + ->Version(3, &SoundTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ISoundKey>::m_flags) + ->Field("Range", &TAnimTrack<ISoundKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ISoundKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ISoundKey>::m_keys) + ->Field("Id", &TAnimTrack<ISoundKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CSoundTrack::Reflect(AZ::SerializeContext* serializeContext) +void CSoundTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<ISoundKey>::Reflect(serializeContext); + TAnimTrack<ISoundKey>::Reflect(context); - serializeContext->Class<CSoundTrack, TAnimTrack<ISoundKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CSoundTrack, TAnimTrack<ISoundKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h index 8f76f09e79..83706ea9ba 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h @@ -55,7 +55,7 @@ public: bool UsesMute() const override { return true; } - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_SOUNDTRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/Tests/AssetBlendTrackTest.cpp b/Gems/Maestro/Code/Source/Cinematics/Tests/AssetBlendTrackTest.cpp index 34da16e3d0..58d6181aca 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Tests/AssetBlendTrackTest.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/Tests/AssetBlendTrackTest.cpp @@ -100,4 +100,4 @@ namespace AssetBlendTrackTest }; // namespace AssetBlendTrackTest -#endif // !defined(_RELEASE) \ No newline at end of file +#endif // !defined(_RELEASE) diff --git a/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.cpp index e2b18bdac1..334c5bdd6b 100644 --- a/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.cpp @@ -100,23 +100,41 @@ int CTimeRangesTrack::GetActiveKeyIndexForTime(const float time) } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<ITimeRangeKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool TimeRangesTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<ITimeRangeKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<ITimeRangeKey>::m_flags) - ->Field("Range", &TAnimTrack<ITimeRangeKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<ITimeRangeKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<ITimeRangeKey>::m_keys) - ->Field("Id", &TAnimTrack<ITimeRangeKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<ITimeRangeKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<ITimeRangeKey>, IAnimTrack>() + ->Version(3, &TimeRangesTrackVersionConverter) + ->Field("Flags", &TAnimTrack<ITimeRangeKey>::m_flags) + ->Field("Range", &TAnimTrack<ITimeRangeKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<ITimeRangeKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<ITimeRangeKey>::m_keys) + ->Field("Id", &TAnimTrack<ITimeRangeKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CTimeRangesTrack::Reflect(AZ::SerializeContext* serializeContext) +void CTimeRangesTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IBoolKey>::Reflect(serializeContext); + TAnimTrack<ITimeRangeKey>::Reflect(context); - serializeContext->Class<CTimeRangesTrack, TAnimTrack<ITimeRangeKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CTimeRangesTrack, TAnimTrack<ITimeRangeKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.h b/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.h index e8861e53a4..dd07e6d8e4 100644 --- a/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/TimeRangesTrack.h @@ -39,8 +39,7 @@ public: int GetActiveKeyIndexForTime(const float time); - static void Reflect(AZ::SerializeContext* serializeContext); - + static void Reflect(AZ::ReflectContext* context); }; #endif // CRYINCLUDE_CRYMOVIE_TIMERANGESTRACK_H diff --git a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.cpp b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.cpp index 9d690e1afb..41c17ce6f3 100644 --- a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.cpp @@ -159,23 +159,41 @@ void CTrackEventTrack::GetKeyInfo(int key, const char*& description, float& dura } ////////////////////////////////////////////////////////////////////////// -template<> -inline void TAnimTrack<IEventKey>::Reflect(AZ::SerializeContext* serializeContext) +static bool EventTrackVersionConverter( + AZ::SerializeContext& serializeContext, + AZ::SerializeContext::DataElementNode& rootElement) { - serializeContext->Class<TAnimTrack<IEventKey> >() - ->Version(2) - ->Field("Flags", &TAnimTrack<IEventKey>::m_flags) - ->Field("Range", &TAnimTrack<IEventKey>::m_timeRange) - ->Field("ParamType", &TAnimTrack<IEventKey>::m_nParamType) - ->Field("Keys", &TAnimTrack<IEventKey>::m_keys) - ->Field("Id", &TAnimTrack<IEventKey>::m_id); + if (rootElement.GetVersion() < 3) + { + rootElement.AddElement(serializeContext, "BaseClass1", azrtti_typeid<IAnimTrack>()); + } + + return true; +} + +template<> +inline void TAnimTrack<IEventKey>::Reflect(AZ::ReflectContext* context) +{ + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<TAnimTrack<IEventKey>, IAnimTrack>() + ->Version(3, &EventTrackVersionConverter) + ->Field("Flags", &TAnimTrack<IEventKey>::m_flags) + ->Field("Range", &TAnimTrack<IEventKey>::m_timeRange) + ->Field("ParamType", &TAnimTrack<IEventKey>::m_nParamType) + ->Field("Keys", &TAnimTrack<IEventKey>::m_keys) + ->Field("Id", &TAnimTrack<IEventKey>::m_id); + } } ////////////////////////////////////////////////////////////////////////// -void CTrackEventTrack::Reflect(AZ::SerializeContext* serializeContext) +void CTrackEventTrack::Reflect(AZ::ReflectContext* context) { - TAnimTrack<IEventKey>::Reflect(serializeContext); + TAnimTrack<IEventKey>::Reflect(context); - serializeContext->Class<CTrackEventTrack, TAnimTrack<IEventKey> >() - ->Version(1); + if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<CTrackEventTrack, TAnimTrack<IEventKey>>() + ->Version(1); + } } diff --git a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h index 86043110c3..1095a7736d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h @@ -78,7 +78,7 @@ public: void SetKey(int index, IKey* key); void InitPostLoad(IAnimSequence* sequence) override; - static void Reflect(AZ::SerializeContext* serializeContext); + static void Reflect(AZ::ReflectContext* context); private: AZStd::intrusive_ptr< IAnimStringTable> m_pStrings; diff --git a/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.h b/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.h index e1c7738abc..081b2feec9 100644 --- a/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.h +++ b/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.h @@ -88,4 +88,4 @@ namespace Maestro // set of ids of all unique Entities with SequenceComponent instances connected to this Agent AZStd::unordered_set<AZ::EntityId> m_sequenceEntityIds; }; -} // namespace Maestro \ No newline at end of file +} // namespace Maestro diff --git a/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h b/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h index a28c9ad3fa..294f7b4370 100644 --- a/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h +++ b/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h @@ -115,4 +115,4 @@ namespace Maestro static const double s_refreshPeriodMilliseconds; // property refresh period for SetAnimatedPropertyValue events static const int s_invalidSequenceId; }; -} // namespace Maestro \ No newline at end of file +} // namespace Maestro diff --git a/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.h b/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.h index 781f949436..58779f40d8 100644 --- a/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.h +++ b/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.h @@ -80,4 +80,4 @@ namespace Maestro AZStd::unordered_set<AZ::EntityId> m_sequenceEntityIds; }; -} // namespace Maestro \ No newline at end of file +} // namespace Maestro diff --git a/Gems/Maestro/Code/Source/Components/SequenceComponent.cpp b/Gems/Maestro/Code/Source/Components/SequenceComponent.cpp index 62261d1427..491e9287b8 100644 --- a/Gems/Maestro/Code/Source/Components/SequenceComponent.cpp +++ b/Gems/Maestro/Code/Source/Components/SequenceComponent.cpp @@ -34,6 +34,7 @@ #include <Cinematics/SelectTrack.h> #include <Cinematics/SequenceTrack.h> #include <Cinematics/SoundTrack.h> +#include <Cinematics/TimeRangesTrack.h> #include <Cinematics/TrackEventTrack.h> #include <Cinematics/AnimSequence.h> @@ -105,18 +106,16 @@ namespace Maestro { } - /*static*/ void SequenceComponent::Reflect(AZ::ReflectContext* context) + void SequenceComponent::Reflect(AZ::ReflectContext* context) { - AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); - - if (serializeContext) + // Reflect the Cinematics library + ReflectCinematicsLib(context); + + if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { serializeContext->Class<SequenceComponent, AZ::Component>() ->Version(2) ->Field("Sequence", &SequenceComponent::m_sequence); - - // Reflect the Cinematics library - ReflectCinematicsLib(serializeContext); } if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) @@ -141,12 +140,13 @@ namespace Maestro } } - /*static*/ void SequenceComponent::ReflectCinematicsLib(AZ::SerializeContext* context) + void SequenceComponent::ReflectCinematicsLib(AZ::ReflectContext* context) { // The Movie System itself CMovieSystem::Reflect(context); // Tracks + IAnimTrack::Reflect(context); TAnimSplineTrack<Vec2>::Reflect(context); CBoolTrack::Reflect(context); CCaptureTrack::Reflect(context); @@ -163,10 +163,13 @@ namespace Maestro CSoundTrack::Reflect(context); CTrackEventTrack::Reflect(context); CAssetBlendTrack::Reflect(context); + CTimeRangesTrack::Reflect(context); // Nodes + IAnimSequence::Reflect(context); CAnimSequence::Reflect(context); CAnimSceneNode::Reflect(context); + IAnimNode::Reflect(context); CAnimNode::Reflect(context); CAnimAzEntityNode::Reflect(context); CAnimComponentNode::Reflect(context); diff --git a/Gems/Maestro/Code/Source/Components/SequenceComponent.h b/Gems/Maestro/Code/Source/Components/SequenceComponent.h index eab484903d..20e7d22fe3 100644 --- a/Gems/Maestro/Code/Source/Components/SequenceComponent.h +++ b/Gems/Maestro/Code/Source/Components/SequenceComponent.h @@ -104,7 +104,7 @@ namespace Maestro AZStd::intrusive_ptr<IAnimSequence> m_sequence; // Reflects the entire CryMovie library - static void ReflectCinematicsLib(AZ::SerializeContext* context); + static void ReflectCinematicsLib(AZ::ReflectContext* context); }; } // namespace Maestro diff --git a/Gems/Maestro/Code/Tests/Tracks/AnimTrackTest.cpp b/Gems/Maestro/Code/Tests/Tracks/AnimTrackTest.cpp index 37273911e4..56e0311cff 100644 --- a/Gems/Maestro/Code/Tests/Tracks/AnimTrackTest.cpp +++ b/Gems/Maestro/Code/Tests/Tracks/AnimTrackTest.cpp @@ -401,4 +401,4 @@ namespace AnimTrackTest int i = m_testTrackA.GetActiveKey(6.0f, &tempKey); EXPECT_EQ(i, 2); } -} //namespace AnimTrackTest \ No newline at end of file +} //namespace AnimTrackTest diff --git a/Gems/Maestro/gem.json b/Gems/Maestro/gem.json index 743bc5b091..fc9cf2e02a 100644 --- a/Gems/Maestro/gem.json +++ b/Gems/Maestro/gem.json @@ -11,4 +11,4 @@ "IconPath": "preview.png", "EditorModule": true, "IsRequired": true -} \ No newline at end of file +} diff --git a/Gems/Metastream/Code/CMakeLists.txt b/Gems/Metastream/Code/CMakeLists.txt index 6d2983c91d..47b6f6f9c5 100644 --- a/Gems/Metastream/Code/CMakeLists.txt +++ b/Gems/Metastream/Code/CMakeLists.txt @@ -47,7 +47,6 @@ ly_add_target( PRIVATE Gem::Metastream.Static Legacy::CryCommon - 3rdParty::civetweb ) @@ -74,7 +73,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) AZ::AzTest Gem::Metastream.Static Legacy::CryCommon - 3rdParty::civetweb ) ly_add_googletest( NAME Gem::Metastream.Tests diff --git a/Gems/Metastream/Code/Source/BaseHttpServer.cpp b/Gems/Metastream/Code/Source/BaseHttpServer.cpp index 6e05294b64..29d15e2ce2 100644 --- a/Gems/Metastream/Code/Source/BaseHttpServer.cpp +++ b/Gems/Metastream/Code/Source/BaseHttpServer.cpp @@ -180,4 +180,4 @@ std::string BaseHttpServer::HttpStatus(int code) httpStatus << "HTTP/1.1 " << code << " " << description << "\r\n"; return std::string(httpStatus.str()); -} \ No newline at end of file +} diff --git a/Gems/Metastream/Code/Source/CivetHttpServer.h b/Gems/Metastream/Code/Source/CivetHttpServer.h index 6ac46dc647..0e62cfbd09 100644 --- a/Gems/Metastream/Code/Source/CivetHttpServer.h +++ b/Gems/Metastream/Code/Source/CivetHttpServer.h @@ -29,4 +29,4 @@ namespace Metastream CivetWebSocketHandler* m_webSocketHandler; CivetServer* m_server; }; -} // namespace Metastream \ No newline at end of file +} // namespace Metastream diff --git a/Gems/Metastream/Code/Source/Metastream_precompiled.cpp b/Gems/Metastream/Code/Source/Metastream_precompiled.cpp index a6d50f901c..7b4896ad9f 100644 --- a/Gems/Metastream/Code/Source/Metastream_precompiled.cpp +++ b/Gems/Metastream/Code/Source/Metastream_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Metastream_precompiled.h" \ No newline at end of file +#include "Metastream_precompiled.h" diff --git a/Gems/Metastream/Code/Source/Platform/Common/MSVC/metastream_msvc.cmake b/Gems/Metastream/Code/Source/Platform/Common/MSVC/metastream_msvc.cmake index 5cebdbd198..2a42a01b08 100644 --- a/Gems/Metastream/Code/Source/Platform/Common/MSVC/metastream_msvc.cmake +++ b/Gems/Metastream/Code/Source/Platform/Common/MSVC/metastream_msvc.cmake @@ -11,3 +11,7 @@ # CivetHttpServer.cpp uses a try catch block set(LY_COMPILE_OPTIONS PRIVATE /EHsc) +set(LY_BUILD_DEPENDENCIES + PRIVATE + 3rdParty::civetweb +) \ No newline at end of file diff --git a/Gems/Microphone/Code/Source/Android/AndroidManifest.xml b/Gems/Microphone/Code/Source/Android/AndroidManifest.xml index 9bf0effe47..d0a4274598 100644 --- a/Gems/Microphone/Code/Source/Android/AndroidManifest.xml +++ b/Gems/Microphone/Code/Source/Android/AndroidManifest.xml @@ -4,4 +4,4 @@ <uses-permission android:name="android.permission.RECORD_AUDIO" /> -</manifest> \ No newline at end of file +</manifest> diff --git a/Gems/Microphone/Code/Source/Platform/Android/MicrophoneSystemComponent_Android.cpp b/Gems/Microphone/Code/Source/Platform/Android/MicrophoneSystemComponent_Android.cpp index c30fe2978b..fffd377121 100644 --- a/Gems/Microphone/Code/Source/Platform/Android/MicrophoneSystemComponent_Android.cpp +++ b/Gems/Microphone/Code/Source/Platform/Android/MicrophoneSystemComponent_Android.cpp @@ -193,4 +193,4 @@ namespace Audio { return aznew MicrophoneSystemComponentAndroid(); } -} \ No newline at end of file +} diff --git a/Gems/Microphone/Code/Source/Platform/Android/java/com/amazon/lumberyard/Microphone/MicrophoneSystemComponent.java b/Gems/Microphone/Code/Source/Platform/Android/java/com/amazon/lumberyard/Microphone/MicrophoneSystemComponent.java index fa189c8921..e44d9970d5 100644 --- a/Gems/Microphone/Code/Source/Platform/Android/java/com/amazon/lumberyard/Microphone/MicrophoneSystemComponent.java +++ b/Gems/Microphone/Code/Source/Platform/Android/java/com/amazon/lumberyard/Microphone/MicrophoneSystemComponent.java @@ -199,4 +199,4 @@ public class MicrophoneSystemComponent implements Runnable super.finalize(); ShutdownDeviceImpl(); } -} \ No newline at end of file +} diff --git a/Gems/Microphone/Code/Source/SimpleDownsample.cpp b/Gems/Microphone/Code/Source/SimpleDownsample.cpp index 4426335353..cda53eb040 100644 --- a/Gems/Microphone/Code/Source/SimpleDownsample.cpp +++ b/Gems/Microphone/Code/Source/SimpleDownsample.cpp @@ -53,4 +53,4 @@ void Downsample(AZ::s16* inBuffer, AZStd::size_t inBufferSize, AZ::u32 inBufferS offsetResult++; offsetBuffer = nextOffsetBuffer; } -} \ No newline at end of file +} diff --git a/Gems/Microphone/Code/microphone_shared_files.cmake b/Gems/Microphone/Code/microphone_shared_files.cmake index b05a965e1e..4c8204e175 100644 --- a/Gems/Microphone/Code/microphone_shared_files.cmake +++ b/Gems/Microphone/Code/microphone_shared_files.cmake @@ -11,4 +11,4 @@ set(FILES Source/MicrophoneModule.cpp -) \ No newline at end of file +) diff --git a/Gems/Multiplayer/Code/CMakeLists.txt b/Gems/Multiplayer/Code/CMakeLists.txt index dde5e387f6..cd0cfca40d 100644 --- a/Gems/Multiplayer/Code/CMakeLists.txt +++ b/Gems/Multiplayer/Code/CMakeLists.txt @@ -18,16 +18,16 @@ ly_add_target( INCLUDE_DIRECTORIES PRIVATE ${pal_source_dir} - Source AZ::AzNetworking + Source . + PUBLIC + Include BUILD_DEPENDENCIES PUBLIC AZ::AzCore AZ::AzFramework AZ::AzNetworking - Gem::CertificateManager - 3rdParty::AWSNativeSDK::Core AUTOGEN_RULES *.AutoPackets.xml,AutoPackets_Header.jinja,$path/$fileprefix.AutoPackets.h *.AutoPackets.xml,AutoPackets_Inline.jinja,$path/$fileprefix.AutoPackets.inl @@ -49,6 +49,8 @@ ly_add_target( PRIVATE Source . + PUBLIC + Include BUILD_DEPENDENCIES PRIVATE Gem::Multiplayer.Static @@ -56,10 +58,27 @@ ly_add_target( Gem::CertificateManager ) -################################################################################ -# Tests -################################################################################ -if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) +if (PAL_TRAIT_BUILD_HOST_TOOLS) + ly_add_target( + NAME Multiplayer.Tools MODULE + NAMESPACE Gem + OUTPUT_NAME Gem.Multiplayer.Tools + FILES_CMAKE + multiplayer_tools_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Source + . + PUBLIC + Include + BUILD_DEPENDENCIES + PRIVATE + AZ::AzToolsFramework + Gem::Multiplayer.Static + ) +endif() + +if (PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_target( NAME Multiplayer.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} NAMESPACE Gem @@ -71,6 +90,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ${pal_source_dir} Source . + PUBLIC + Include BUILD_DEPENDENCIES PRIVATE AZ::AzTest @@ -80,3 +101,25 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) NAME Gem::Multiplayer.Tests ) endif() + +ly_add_target( + NAME Multiplayer.Debug ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE} + NAMESPACE Gem + FILES_CMAKE + multiplayer_debug_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Source + . + PUBLIC + Include + BUILD_DEPENDENCIES + PRIVATE + AZ::AzCore + AZ::AtomCore + AZ::AzFramework + AZ::AzNetworking + Gem::Atom_Feature_Common.Static + Gem::Multiplayer.Static + Gem::ImGui.Static +) diff --git a/Gems/Multiplayer/Code/Include/IMultiplayer.h b/Gems/Multiplayer/Code/Include/IMultiplayer.h index 94744dbb54..67776e15be 100644 --- a/Gems/Multiplayer/Code/Include/IMultiplayer.h +++ b/Gems/Multiplayer/Code/Include/IMultiplayer.h @@ -15,6 +15,7 @@ #include <AzCore/RTTI/RTTI.h> #include <AzNetworking/ConnectionLayer/IConnection.h> #include <AzNetworking/DataStructures/ByteBuffer.h> +#include <Include/MultiplayerStats.h> namespace AzNetworking { @@ -23,21 +24,6 @@ namespace AzNetworking namespace Multiplayer { - struct MultiplayerStats - { - uint64_t m_entityCount = 0; - uint64_t m_clientConnectionCount = 0; - uint64_t m_serverConnectionCount = 0; - uint64_t m_propertyUpdatesSent = 0; - uint64_t m_propertyUpdatesSentBytes = 0; - uint64_t m_propertyUpdatesRecv = 0; - uint64_t m_propertyUpdatesRecvBytes = 0; - uint64_t m_rpcsSent = 0; - uint64_t m_rpcsSentBytes = 0; - uint64_t m_rpcsRecv = 0; - uint64_t m_rpcsRecvBytes = 0; - }; - //! Collection of types of Multiplayer Connections enum class MultiplayerAgentType { @@ -88,6 +74,28 @@ namespace Multiplayer //! @param handler The SessionShutdownEvent handler to add virtual void AddSessionShutdownHandler(SessionShutdownEvent::Handler& handler) = 0; + //! Returns the gem name associated with the provided component index. + //! @param netComponentId the componentId to return the gem name of + //! @return the name of the gem that contains the requested component + virtual const char* GetComponentGemName(NetComponentId netComponentId) const = 0; + + //! Returns the component name associated with the provided component index. + //! @param netComponentId the componentId to return the component name of + //! @return the name of the component + virtual const char* GetComponentName(NetComponentId netComponentId) const = 0; + + //! Returns the property name associated with the provided component index and property index. + //! @param netComponentId the component index to return the property name of + //! @param propertyIndex the index of the network property to return the property name of + //! @return the name of the network property + virtual const char* GetComponentPropertyName(NetComponentId netComponentId, PropertyIndex propertyIndex) const = 0; + + //! Returns the Rpc name associated with the provided component index and rpc index. + //! @param netComponentId the componentId to return the property name of + //! @param rpcIndex the index of the rpc to return the rpc name of + //! @return the name of the requested rpc + virtual const char* GetComponentRpcName(NetComponentId netComponentId, RpcIndex rpcIndex) const = 0; + //! Retrieve the stats object bound to this multiplayer instance. //! @return the stats object bound to this multiplayer instance MultiplayerStats& GetStats() { return m_stats; } diff --git a/Gems/Multiplayer/Code/Include/MultiplayerStats.cpp b/Gems/Multiplayer/Code/Include/MultiplayerStats.cpp new file mode 100644 index 0000000000..b9f47814b4 --- /dev/null +++ b/Gems/Multiplayer/Code/Include/MultiplayerStats.cpp @@ -0,0 +1,164 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <Include/MultiplayerStats.h> + +namespace Multiplayer +{ + void MultiplayerStats::ReserveComponentStats(NetComponentId netComponentId, uint16_t propertyCount, uint16_t rpcCount) + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + if (m_componentStats.size() <= netComponentIndex) + { + m_componentStats.resize(netComponentIndex + 1); + } + m_componentStats[netComponentIndex].m_propertyUpdatesSent.resize(propertyCount); + m_componentStats[netComponentIndex].m_propertyUpdatesRecv.resize(propertyCount); + m_componentStats[netComponentIndex].m_rpcsSent.resize(rpcCount); + m_componentStats[netComponentIndex].m_rpcsRecv.resize(rpcCount); + } + + void MultiplayerStats::RecordPropertySent(NetComponentId netComponentId, PropertyIndex propertyId, uint32_t totalBytes) + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + const uint16_t propertyIndex = aznumeric_cast<uint16_t>(propertyId); + m_componentStats[netComponentIndex].m_propertyUpdatesSent[propertyIndex].m_totalCalls++; + m_componentStats[netComponentIndex].m_propertyUpdatesSent[propertyIndex].m_totalBytes += totalBytes; + m_componentStats[netComponentIndex].m_propertyUpdatesSent[propertyIndex].m_callHistory[m_recordMetricIndex]++; + m_componentStats[netComponentIndex].m_propertyUpdatesSent[propertyIndex].m_byteHistory[m_recordMetricIndex] += totalBytes; + } + + void MultiplayerStats::RecordPropertyReceived(NetComponentId netComponentId, PropertyIndex propertyId, uint32_t totalBytes) + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + const uint16_t propertyIndex = aznumeric_cast<uint16_t>(propertyId); + m_componentStats[netComponentIndex].m_propertyUpdatesRecv[propertyIndex].m_totalCalls++; + m_componentStats[netComponentIndex].m_propertyUpdatesRecv[propertyIndex].m_totalBytes += totalBytes; + m_componentStats[netComponentIndex].m_propertyUpdatesRecv[propertyIndex].m_callHistory[m_recordMetricIndex]++; + m_componentStats[netComponentIndex].m_propertyUpdatesRecv[propertyIndex].m_byteHistory[m_recordMetricIndex] += totalBytes; + } + + void MultiplayerStats::RecordRpcSent(NetComponentId netComponentId, RpcIndex rpcId, uint32_t totalBytes) + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + const uint16_t rpcIndex = aznumeric_cast<uint16_t>(rpcId); + m_componentStats[netComponentIndex].m_rpcsSent[rpcIndex].m_totalCalls++; + m_componentStats[netComponentIndex].m_rpcsSent[rpcIndex].m_totalBytes += totalBytes; + m_componentStats[netComponentIndex].m_rpcsSent[rpcIndex].m_callHistory[m_recordMetricIndex]++; + m_componentStats[netComponentIndex].m_rpcsSent[rpcIndex].m_byteHistory[m_recordMetricIndex] += totalBytes; + } + + void MultiplayerStats::RecordRpcReceived(NetComponentId netComponentId, RpcIndex rpcId, uint32_t totalBytes) + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + const uint16_t rpcIndex = aznumeric_cast<uint16_t>(rpcId); + m_componentStats[netComponentIndex].m_rpcsRecv[rpcIndex].m_totalCalls++; + m_componentStats[netComponentIndex].m_rpcsRecv[rpcIndex].m_totalBytes += totalBytes; + m_componentStats[netComponentIndex].m_rpcsRecv[rpcIndex].m_callHistory[m_recordMetricIndex]++; + m_componentStats[netComponentIndex].m_rpcsRecv[rpcIndex].m_byteHistory[m_recordMetricIndex] += totalBytes; + } + + void MultiplayerStats::TickStats(AZ::TimeMs metricFrameTimeMs) + { + m_totalHistoryTimeMs = metricFrameTimeMs * static_cast<AZ::TimeMs>(RingbufferSamples); + m_recordMetricIndex = ++m_recordMetricIndex % RingbufferSamples; + } + + static void CombineMetrics(MultiplayerStats::Metric& outArg1, const MultiplayerStats::Metric& arg2) + { + outArg1.m_totalCalls += arg2.m_totalCalls; + outArg1.m_totalBytes += arg2.m_totalBytes; + for (uint32_t index = 0; index < MultiplayerStats::RingbufferSamples; ++index) + { + outArg1.m_callHistory[index] += arg2.m_callHistory[index]; + outArg1.m_byteHistory[index] += arg2.m_byteHistory[index]; + } + } + + static MultiplayerStats::Metric SumMetricVector(const AZStd::vector<MultiplayerStats::Metric>& metricVector) + { + MultiplayerStats::Metric result; + for (AZStd::size_t index = 0; index < metricVector.size(); ++index) + { + CombineMetrics(result, metricVector[index]); + } + return result; + } + + MultiplayerStats::Metric MultiplayerStats::CalculateComponentPropertyUpdateSentMetrics(NetComponentId netComponentId) const + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + return SumMetricVector(m_componentStats[netComponentIndex].m_propertyUpdatesSent); + } + + MultiplayerStats::Metric MultiplayerStats::CalculateComponentPropertyUpdateRecvMetrics(NetComponentId netComponentId) const + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + return SumMetricVector(m_componentStats[netComponentIndex].m_propertyUpdatesRecv); + } + + MultiplayerStats::Metric MultiplayerStats::CalculateComponentRpcsSentMetrics(NetComponentId netComponentId) const + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + return SumMetricVector(m_componentStats[netComponentIndex].m_rpcsSent); + } + + MultiplayerStats::Metric MultiplayerStats::CalculateComponentRpcsRecvMetrics(NetComponentId netComponentId) const + { + const uint16_t netComponentIndex = aznumeric_cast<uint16_t>(netComponentId); + return SumMetricVector(m_componentStats[netComponentIndex].m_rpcsRecv); + } + + MultiplayerStats::Metric MultiplayerStats::CalculateTotalPropertyUpdateSentMetrics() const + { + Metric result; + for (AZStd::size_t index = 0; index < m_componentStats.size(); ++index) + { + const NetComponentId netComponentId = aznumeric_cast<NetComponentId>(index); + CombineMetrics(result, CalculateComponentPropertyUpdateSentMetrics(netComponentId)); + } + return result; + } + + MultiplayerStats::Metric MultiplayerStats::CalculateTotalPropertyUpdateRecvMetrics() const + { + Metric result; + for (AZStd::size_t index = 0; index < m_componentStats.size(); ++index) + { + const NetComponentId netComponentId = aznumeric_cast<NetComponentId>(index); + CombineMetrics(result, CalculateComponentPropertyUpdateRecvMetrics(netComponentId)); + } + return result; + } + + MultiplayerStats::Metric MultiplayerStats::CalculateTotalRpcsSentMetrics() const + { + Metric result; + for (AZStd::size_t index = 0; index < m_componentStats.size(); ++index) + { + const NetComponentId netComponentId = aznumeric_cast<NetComponentId>(index); + CombineMetrics(result, CalculateComponentRpcsSentMetrics(netComponentId)); + } + return result; + } + + MultiplayerStats::Metric MultiplayerStats::CalculateTotalRpcsRecvMetrics() const + { + Metric result; + for (AZStd::size_t index = 0; index < m_componentStats.size(); ++index) + { + const NetComponentId netComponentId = aznumeric_cast<NetComponentId>(index); + CombineMetrics(result, CalculateComponentRpcsRecvMetrics(netComponentId)); + } + return result; + } +} diff --git a/Gems/Multiplayer/Code/Include/MultiplayerStats.h b/Gems/Multiplayer/Code/Include/MultiplayerStats.h new file mode 100644 index 0000000000..fcbd741bb9 --- /dev/null +++ b/Gems/Multiplayer/Code/Include/MultiplayerStats.h @@ -0,0 +1,71 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Time/ITime.h> +#include <AzCore/std/containers/vector.h> +#include <AzCore/std/containers/array.h> +#include <Include/MultiplayerTypes.h> + +namespace AzNetworking +{ + class INetworkInterface; +} + +namespace Multiplayer +{ + struct MultiplayerStats + { + uint64_t m_entityCount = 0; + uint64_t m_clientConnectionCount = 0; + uint64_t m_serverConnectionCount = 0; + + uint64_t m_recordMetricIndex = 0; + AZ::TimeMs m_totalHistoryTimeMs = AZ::TimeMs{ 0 }; + + static const uint32_t RingbufferSamples = 32; + using MetricRingbuffer = AZStd::array<uint64_t, RingbufferSamples>; + struct Metric + { + uint64_t m_totalCalls = 0; + uint64_t m_totalBytes = 0; + MetricRingbuffer m_callHistory; + MetricRingbuffer m_byteHistory; + }; + + struct ComponentStats + { + AZStd::vector<Metric> m_propertyUpdatesSent; + AZStd::vector<Metric> m_propertyUpdatesRecv; + AZStd::vector<Metric> m_rpcsSent; + AZStd::vector<Metric> m_rpcsRecv; + }; + AZStd::vector<ComponentStats> m_componentStats; + + void ReserveComponentStats(NetComponentId netComponentId, uint16_t propertyCount, uint16_t rpcCount); + void RecordPropertySent(NetComponentId netComponentId, PropertyIndex propertyId, uint32_t totalBytes); + void RecordPropertyReceived(NetComponentId netComponentId, PropertyIndex propertyId, uint32_t totalBytes); + void RecordRpcSent(NetComponentId netComponentId, RpcIndex rpcId, uint32_t totalBytes); + void RecordRpcReceived(NetComponentId netComponentId, RpcIndex rpcId, uint32_t totalBytes); + void TickStats(AZ::TimeMs metricFrameTimeMs); + + Metric CalculateComponentPropertyUpdateSentMetrics(NetComponentId netComponentId) const; + Metric CalculateComponentPropertyUpdateRecvMetrics(NetComponentId netComponentId) const; + Metric CalculateComponentRpcsSentMetrics(NetComponentId netComponentId) const; + Metric CalculateComponentRpcsRecvMetrics(NetComponentId netComponentId) const; + Metric CalculateTotalPropertyUpdateSentMetrics() const; + Metric CalculateTotalPropertyUpdateRecvMetrics() const; + Metric CalculateTotalRpcsSentMetrics() const; + Metric CalculateTotalRpcsRecvMetrics() const; + }; +} diff --git a/Gems/Multiplayer/Code/Include/MultiplayerTypes.h b/Gems/Multiplayer/Code/Include/MultiplayerTypes.h new file mode 100644 index 0000000000..ca3734e4f0 --- /dev/null +++ b/Gems/Multiplayer/Code/Include/MultiplayerTypes.h @@ -0,0 +1,118 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/EBus/Event.h> +#include <AzCore/Name/Name.h> +#include <AzCore/RTTI/TypeSafeIntegral.h> +#include <AzCore/std/string/fixed_string.h> +#include <AzNetworking/Serialization/ISerializer.h> +#include <AzNetworking/ConnectionLayer/ConnectionEnums.h> + +namespace Multiplayer +{ + //! The default number of rewindable samples for us to store. + static constexpr uint32_t RewindHistorySize = 128; + + AZ_TYPE_SAFE_INTEGRAL(HostId, uint32_t); + static constexpr HostId InvalidHostId = static_cast<HostId>(-1); + + AZ_TYPE_SAFE_INTEGRAL(NetEntityId, uint32_t); + static constexpr NetEntityId InvalidNetEntityId = static_cast<NetEntityId>(-1); + + AZ_TYPE_SAFE_INTEGRAL(NetComponentId, uint16_t); + static constexpr NetComponentId InvalidNetComponentId = static_cast<NetComponentId>(-1); + + AZ_TYPE_SAFE_INTEGRAL(PropertyIndex, uint16_t); + AZ_TYPE_SAFE_INTEGRAL(RpcIndex, uint16_t); + + using LongNetworkString = AZ::CVarFixedString; + using ReliabilityType = AzNetworking::ReliabilityType; + + class NetworkEntityRpcMessage; + using RpcSendEvent = AZ::Event<NetworkEntityRpcMessage&>; + + // Note that we explicitly set storage classes so that sizeof() is accurate for serialized size + enum class RpcDeliveryType : uint8_t + { + None, + AuthorityToClient, // Invoked from Authority, handled on Client + AuthorityToAutonomous, // Invoked from Authority, handled on Autonomous + AutonomousToAuthority, // Invoked from Autonomous, handled on Authority + ServerToAuthority // Invoked from Server, handled on Authority + }; + + enum class NetEntityRole : uint8_t + { + InvalidRole, // No role + Client, // A simulated proxy on a client + Autonomous, // An autonomous proxy on a client (can execute local prediction) + Server, // A simulated proxy on a server + Authority // An authoritative proxy on a server (full authority) + }; + + enum class ComponentSerializationType : uint8_t + { + Properties, + Correction + }; + + enum class EntityIsMigrating : uint8_t + { + False, + True + }; + + // This is just a placeholder + // The level/prefab cooking will devise the actual solution for identifying a dynamically spawnable entity within a prefab + struct PrefabEntityId + { + AZ_TYPE_INFO(PrefabEntityId, "{EFD37465-CCAC-4E87-A825-41B4010A2C75}"); + + static constexpr uint32_t AllIndices = AZStd::numeric_limits<uint32_t>::max(); + + AZ::Name m_prefabName; + uint32_t m_entityOffset = AllIndices; + + PrefabEntityId() = default; + + explicit PrefabEntityId(AZ::Name name, uint32_t entityOffset = AllIndices) + : m_prefabName(name) + , m_entityOffset(entityOffset) + { + } + + bool operator==(const PrefabEntityId& rhs) const + { + return m_prefabName == rhs.m_prefabName && m_entityOffset == rhs.m_entityOffset; + } + + bool operator!=(const PrefabEntityId& rhs) const + { + return !(*this == rhs); + } + + bool Serialize(AzNetworking::ISerializer& serializer) + { + serializer.Serialize(m_prefabName, "prefabName"); + serializer.Serialize(m_entityOffset, "entityOffset"); + return serializer.IsValid(); + } + }; +} + +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::HostId); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::NetEntityId); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::NetComponentId); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::PropertyIndex); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::RpcIndex); diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja index 090bd4f0e0..fc2860ebe7 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Header.jinja @@ -1,7 +1,7 @@ #pragma once #include <AzCore/std/containers/list.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> namespace AZ { @@ -12,15 +12,8 @@ namespace AZ {% set Namespace = dataFiles[0].attrib['Namespace'] %} namespace {{ Namespace }} { - enum class ComponentTypes - { -{% for Component in dataFiles %} -{% set ComponentName = Component.attrib['Name'] %} - {{ ComponentName }}, -{% endfor %} - Count - }; - static_assert(ComponentTypes::Count < static_cast<ComponentTypes>(Multiplayer::InvalidNetComponentId), "ComponentId overflow"); + //! Registers all multiplayer components contained within this gem with the MultiplayerComponentRegistry. + void RegisterMultiplayerComponents(); //! For reflecting multiplayer components into the serialize, edit, and behaviour contexts. void CreateComponentDescriptors(AZStd::list<AZ::ComponentDescriptor*>& descriptors); diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Source.jinja index 40f20dd04b..57375b39f2 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponentTypes_Source.jinja @@ -1,4 +1,6 @@ #include <AzCore/Component/Component.h> +#include <Source/Components/MultiplayerComponentRegistry.h> +#include <Source/NetworkEntity/INetworkEntityManager.h> {% for Component in dataFiles %} {% set ComponentDerived = Component.attrib['OverrideComponent']|booleanTrue %} {% set ControllerDerived = Component.attrib['OverrideController']|booleanTrue %} @@ -10,8 +12,38 @@ {% endfor %} {% set Namespace = dataFiles[0].attrib['Namespace'] %} +{% for Component in dataFiles %} +{% if Component.attrib['Namespace'] != Namespace %} +#error "mismatched component namespaces detected in declared multiplayer components, expected {{ Namespace }} but found {{ Component.attrib['Namespace'] }}" +{% endif %} +{% endfor %} namespace {{ Namespace }} { + void RegisterMultiplayerComponents() + { + Multiplayer::MultiplayerComponentRegistry* multiplayerComponentRegistry = GetMultiplayerComponentRegistry(); + Multiplayer::MultiplayerStats& stats = AZ::Interface<Multiplayer::IMultiplayer>::Get()->GetStats(); +{% for Component in dataFiles %} +{% set ComponentName = Component.attrib['Name'] %} +{% set ComponentBaseName = ComponentName %} +{% if Component.attrib['OverrideComponent']|booleanTrue %} +{% set ComponentBaseName = ComponentName + "Base" %} +{% endif %} +{% set NetworkInputCount = Component.findall('NetworkInput') | len %} +{% set NetworkPropertyCount = Component.findall('NetworkProperty') | len %} +{% set RpcCount = Component.findall('RemoteProcedure') | len %} + { + Multiplayer::MultiplayerComponentRegistry::ComponentData componentData; + componentData.m_gemName = AZ::Name("{{ Namespace }}"); + componentData.m_componentName = AZ::Name("{{ Component.attrib['Name'] }}"); + componentData.m_componentPropertyNameLookupFunction = {{ ComponentBaseName }}::GetNetworkPropertyName; + componentData.m_componentRpcNameLookupFunction = {{ ComponentBaseName }}::GetRpcName; + {{ ComponentBaseName }}::s_netComponentId = multiplayerComponentRegistry->RegisterMultiplayerComponent(componentData); + stats.ReserveComponentStats({{ ComponentBaseName }}::s_netComponentId, static_cast<uint16_t>({{ NetworkPropertyCount }}), static_cast<uint16_t>({{ RpcCount }})); + } +{% endfor %} + } + void CreateComponentDescriptors(AZStd::list<AZ::ComponentDescriptor*>& descriptors) { descriptors.insert(descriptors.end(), { diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja index f5774b07c0..14a68cddf1 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja @@ -227,7 +227,7 @@ AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] } #include <Source/Components/MultiplayerController.h> #include <Source/NetworkInput/IMultiplayerComponentInput.h> #include <Source/NetworkTime/RewindableObject.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> {% call(Include) AutoComponentMacros.ParseIncludes(Component) %} #include <{{ Include.attrib['File'] }}> {% endcall %} @@ -251,9 +251,6 @@ namespace {{ Component.attrib['Namespace'] }} class {{ ComponentName }}; class {{ ControllerName }}; - //! Returns a human readable name for the provided remoteProcedureId. - const char* GetRemoteProcedureName(uint16_t remoteProcedureId); - {% set RecordName = ComponentName + "Record" %} //! @class {{RecordName }} //! @brief A record of the changed bits in the NetworkProperties for component {{ ComponentName }}. @@ -329,7 +326,6 @@ namespace {{ Component.attrib['Namespace'] }} : public Multiplayer::IMultiplayerComponentInput { public: - static const Multiplayer::NetComponentId s_componentId = static_cast<Multiplayer::NetComponentId>({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); Multiplayer::NetComponentId GetComponentId() const override; INetworkInput& operator=(const INetworkInput& rhs) override; bool Serialize(AzNetworking::ISerializer& serializer); @@ -412,8 +408,6 @@ namespace {{ Component.attrib['Namespace'] }} AZ_MULTIPLAYER_COMPONENT({{ Component.attrib['Namespace'] }}::{{ ComponentBaseName }}, s_{{ LowerFirst(ComponentName) }}ConcreteUuid, Multiplayer::MultiplayerComponent); {% endif %} - static const Multiplayer::NetComponentId s_componentId = static_cast<Multiplayer::NetComponentId>({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); - static void Reflect(AZ::ReflectContext* context); static void ReflectToEditContext(AZ::ReflectContext* context); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); @@ -489,6 +483,10 @@ namespace {{ Component.attrib['Namespace'] }} bool SerializeAutonomousToAuthorityProperties({{ RecordName }}& replicationRecord, AzNetworking::ISerializer& serializer); void NotifyChangesAutonomousToAuthorityProperties(const {{ RecordName }}& replicationRecord) const; + //! Debug name helpers + static const char* GetNetworkPropertyName(PropertyIndex propertyIndex); + static const char* GetRpcName(RpcIndex rpcIndex); + AZStd::unique_ptr<{{ RecordName }}> m_currentRecord; AZStd::unique_ptr<{{ ControllerName }}> m_controller; @@ -518,6 +516,9 @@ namespace {{ Component.attrib['Namespace'] }} {% call(Type, Name) AutoComponentMacros.ParseComponentServiceTypeAndName(Component) %} {{ Type }}* {{ Name }} = nullptr; {% endcall %} + + static NetComponentId s_netComponentId; + friend void RegisterMultiplayerComponents(); }; } {% endfor %} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja index aee15bc190..fb802541ce 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -285,15 +285,15 @@ void {{ ClassName }}::Set{{ UpperFirst(Property.attrib['Name']) }}(const {{ Prop {{ AutoComponentMacros.ParseRpcParams(Property, paramNames, paramTypes, paramDefines) }} void {{ ClassName }}::{{ UpperFirst(Property.attrib['Name']) }}({{ ', '.join(paramDefines) }}) { - constexpr uint8_t rpcId = static_cast<uint8_t>({{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure::{{ UpperFirst(Property.attrib['Name']) }}); - constexpr Multiplayer::NetComponentId componentId = static_cast<Multiplayer::NetComponentId>({{ Component.attrib['Namespace'] }}::ComponentTypes::{{ Component.attrib['Name'] }}); + constexpr RpcIndex rpcId = static_cast<RpcIndex>({{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure::{{ UpperFirst(Property.attrib['Name']) }}); {% if Property.attrib['IsReliable']|booleanTrue %} constexpr AzNetworking::ReliabilityType isReliable = Multiplayer::ReliabilityType::Reliable; {% else %} constexpr AzNetworking::ReliabilityType isReliable = Multiplayer::ReliabilityType::Unreliable; {% endif %} - Multiplayer::NetworkEntityRpcMessage rpcMessage(Multiplayer::RpcDeliveryType::{{ InvokeFrom }}To{{ HandleOn }}, GetNetEntityId(), componentId, rpcId, isReliable); + const Multiplayer::NetComponentId netComponentId = GetParent().GetNetComponentId(); + Multiplayer::NetworkEntityRpcMessage rpcMessage(Multiplayer::RpcDeliveryType::{{ InvokeFrom }}To{{ HandleOn }}, GetNetEntityId(), netComponentId, rpcId, isReliable); {% if paramNames|count > 0 %} {{ UpperFirst(Component.attrib['Name']) }}Internal::{{ UpperFirst(Property.attrib['Name']) }}RpcStruct rpcStruct({{ ', '.join(paramNames) }}); {% else %} @@ -509,6 +509,7 @@ bool {{ ClassName }}::Serialize{{ AutoComponentMacros.GetNetPropertiesSetName(Re m_{{ LowerFirst(Property.attrib['Name']) }}, "{{ Property.attrib['Name'] }}", GetNetComponentId(), + static_cast<PropertyIndex>({{ UpperFirst(Component.attrib['Name']) }}Internal::NetworkProperties::{{ UpperFirst(Property.attrib['Name']) }}), stats ); {% endif %} @@ -646,6 +647,16 @@ enum class RemoteProcedure MAX }; +{% endmacro %} +{% macro DeclareNetworkPropertyEnumerations(Component) %} +enum class NetworkProperties +{ +{% for NetworkProperty in Component.iter('NetworkProperty') %} + {{ UpperFirst(NetworkProperty.attrib['Name']) }}, +{% endfor %} + MAX +}; + {% endmacro %} {# @@ -881,6 +892,9 @@ m_{{ LowerFirst(Property.attrib['Name']) }} = m_{{ LowerFirst(Property.attrib['N {% else %} {% set ControllerBaseName = ControllerName %} {% endif %} +{% set NetworkInputCount = Component.findall('NetworkInput') | len %} +{% set NetworkPropertyCount = Component.findall('NetworkProperty') | len %} +{% set RpcCount = Component.findall('RemoteProcedure') | len %} #include "{{ includeFile }}" #include <AzCore/Console/IConsole.h> #include <AzCore/Console/ILogger.h> @@ -901,9 +915,12 @@ m_{{ LowerFirst(Property.attrib['Name']) }} = m_{{ LowerFirst(Property.attrib['N namespace {{ Component.attrib['Namespace'] }} { + NetComponentId {{ UpperFirst(ComponentBaseName) }}::s_netComponentId = InvalidNetComponentId; + namespace {{ UpperFirst(Component.attrib['Name']) }}Internal { {{ DeclareRemoteProcedureEnumerations(Component)|indent(8) }} + {{ DeclareNetworkPropertyEnumerations(Component)|indent(8) }} {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Authority')|indent(8) }} {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Client')|indent(8) }} {{ DefineNetworkPropertyDirtyEnumeration(Component, ClassType, 'Authority', 'Server')|indent(8) }} @@ -1168,6 +1185,12 @@ namespace {{ Component.attrib['Namespace'] }} void {{ ComponentBaseName }}::Init() { + if (m_netBindComponent == nullptr) + { + AZLOG_ERROR("NetBindComponent is null, ensure NetworkAttach is called prior to activating a networked entity"); + return; + } + {{ DefineComponentServiceProxyGrabs(Component, ClassType, ComponentName)|indent(8) }} {% if ComponentDerived %} OnInit(); @@ -1223,14 +1246,14 @@ namespace {{ Component.attrib['Namespace'] }} Multiplayer::NetComponentId {{ ComponentBaseName }}::GetNetComponentId() const { - return s_componentId; + return s_netComponentId; } #pragma warning(push) #pragma warning(disable: 4065) // switch statement contains 'default' but no 'case' labels bool {{ ComponentBaseName }}::HandleRpcMessage([[maybe_unused]] Multiplayer::NetEntityRole remoteRole, Multiplayer::NetworkEntityRpcMessage& message) { - const {{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure rpcType = static_cast<{{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure>(message.GetRpcMessageType()); + const {{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure rpcType = static_cast<{{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure>(message.GetRpcIndex()); switch (rpcType) { {{ DeclareRpcHandleCases(Component, ComponentDerived, 'Server', 'Authority', "(remoteRole == Multiplayer::NetEntityRole::Authority || remoteRole == Multiplayer::NetEntityRole::Server)" )|indent(8) }} @@ -1373,6 +1396,35 @@ namespace {{ Component.attrib['Namespace'] }} } {% endif %} + const char* {{ ComponentBaseName }}::GetNetworkPropertyName([[maybe_unused]] PropertyIndex propertyIndex) + { +{% if NetworkPropertyCount > 0 %} + const {{ UpperFirst(Component.attrib['Name']) }}Internal::NetworkProperties propertyId = static_cast<{{ UpperFirst(Component.attrib['Name']) }}Internal::NetworkProperties>(propertyIndex); + switch (propertyId) + { +{% for NetworkProperty in Component.iter('NetworkProperty') %} + case {{ UpperFirst(Component.attrib['Name']) }}Internal::NetworkProperties::{{ UpperFirst(NetworkProperty.attrib['Name']) }}: + return "{{ UpperFirst(NetworkProperty.attrib['Name']) }}"; +{% endfor %} + } +{% endif %} + return "Unknown network property"; + } + + const char* {{ ComponentBaseName }}::GetRpcName([[maybe_unused]] RpcIndex rpcIndex) + { +{% if RpcCount > 0 %} + const {{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure rpcId = static_cast<{{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure>(rpcIndex); + switch (rpcId) + { +{% for RemoteProcedure in Component.iter('RemoteProcedure') %} + case {{ UpperFirst(Component.attrib['Name']) }}Internal::RemoteProcedure::{{ RemoteProcedure.attrib['Name'] }}: + return "{{ RemoteProcedure.attrib['Name'] }}"; +{% endfor %} + } +{% endif %} + return "Unknown Rpc"; + } {% endfor %} } {% endfor %} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml b/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml index d38ebbb1b8..4eaf7ff0fb 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml +++ b/Gems/Multiplayer/Code/Source/AutoGen/LocalPredictionPlayerInputComponent.AutoComponent.xml @@ -10,7 +10,7 @@ <ComponentRelation Constraint="Weak" HasController="true" Name="NetworkTransformComponent" Namespace="Multiplayer" Include="Source/Components/NetworkTransformComponent.h" /> - <Include File="Source/MultiplayerTypes.h"/> + <Include File="Include/MultiplayerTypes.h"/> <Include File="Source/NetworkInput/NetworkInput.h"/> <Include File="Source/NetworkInput/NetworkInputHistory.h"/> <Include File="Source/NetworkInput/NetworkInputVector.h"/> diff --git a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml index e5549e90d6..95204a3c3f 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml +++ b/Gems/Multiplayer/Code/Source/AutoGen/Multiplayer.AutoPackets.xml @@ -2,7 +2,7 @@ <PacketGroup Name="MultiplayerPackets" PacketStart="CorePackets::PacketType::MAX"> <Include File="AzNetworking/AutoGen/CorePackets.AutoPackets.h" /> - <Include File="Source/MultiplayerTypes.h" /> + <Include File="Include/MultiplayerTypes.h" /> <Include File="Source/NetworkEntity/NetworkEntityRpcMessage.h" /> <Include File="Source/NetworkEntity/NetworkEntityUpdateMessage.h" /> diff --git a/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml b/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml index e6323ba5fd..46065b386f 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml +++ b/Gems/Multiplayer/Code/Source/AutoGen/NetworkTransformComponent.AutoComponent.xml @@ -10,7 +10,7 @@ <ComponentRelation Constraint="Weak" HasController="false" Name="TransformComponent" Namespace="AzFramework" Include="AzFramework/Components/TransformComponent.h" /> - <Include File="Source/MultiplayerTypes.h"/> + <Include File="Include/MultiplayerTypes.h"/> <NetworkProperty Type="AZ::Quaternion" Name="rotation" Init="AZ::Quaternion::CreateIdentity()" ReplicateFrom="Authority" ReplicateTo="Client" IsRewindable="true" IsPredictable="true" IsPublic="true" Container="Object" ExposeToEditor="false" GenerateEventBindings="true" /> <NetworkProperty Type="AZ::Vector3" Name="translation" Init="AZ::Vector3::CreateZero()" ReplicateFrom="Authority" ReplicateTo="Client" IsRewindable="true" IsPredictable="true" IsPublic="true" Container="Object" ExposeToEditor="false" GenerateEventBindings="true" /> diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h index 9efc13ed4b..3642a55476 100644 --- a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponent.h @@ -16,7 +16,7 @@ #include <AzNetworking/Serialization/ISerializer.h> #include <AzNetworking/DataStructures/FixedSizeBitsetView.h> #include <Source/NetworkEntity/NetworkEntityHandle.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <Include/IMultiplayer.h> //! Macro to declare bindings for a multiplayer component inheriting from MultiplayerComponent @@ -104,13 +104,14 @@ namespace Multiplayer template <typename TYPE> inline void SerializeNetworkPropertyHelper ( - AzNetworking::ISerializer& serializer, - bool modifyRecord, - AzNetworking::FixedSizeBitsetView& bitset, - int32_t bitIndex, - TYPE& value, - const char* name, - [[maybe_unused]] NetComponentId componentId, + AzNetworking::ISerializer& serializer, + bool modifyRecord, + AzNetworking::FixedSizeBitsetView& bitset, + int32_t bitIndex, + TYPE& value, + const char* name, + NetComponentId componentId, + PropertyIndex propertyIndex, MultiplayerStats& stats ) { @@ -131,13 +132,11 @@ namespace Multiplayer { if (modifyRecord) { - stats.m_propertyUpdatesRecv++; - stats.m_propertyUpdatesRecvBytes += updateSize; + stats.RecordPropertyReceived(componentId, propertyIndex, updateSize); } else { - stats.m_propertyUpdatesSent++; - stats.m_propertyUpdatesSentBytes += updateSize; + stats.RecordPropertySent(componentId, propertyIndex, updateSize); } } } diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp new file mode 100644 index 0000000000..de1782cc59 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.cpp @@ -0,0 +1,58 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <Source/Components/MultiplayerComponentRegistry.h> + +namespace Multiplayer +{ + NetComponentId MultiplayerComponentRegistry::RegisterMultiplayerComponent(const ComponentData& componentData) + { + NetComponentId netComponentId = m_nextNetComponentId++; + m_componentData[netComponentId] = componentData; + return netComponentId; + } + + const char* MultiplayerComponentRegistry::GetComponentGemName(NetComponentId netComponentId) const + { + const ComponentData& componentData = GetMultiplayerComponentData(netComponentId); + return componentData.m_gemName.GetCStr(); + } + + const char* MultiplayerComponentRegistry::GetComponentName(NetComponentId netComponentId) const + { + const ComponentData& componentData = GetMultiplayerComponentData(netComponentId); + return componentData.m_componentName.GetCStr(); + } + + const char* MultiplayerComponentRegistry::GetComponentPropertyName(NetComponentId netComponentId, PropertyIndex propertyIndex) const + { + const ComponentData& componentData = GetMultiplayerComponentData(netComponentId); + return componentData.m_componentPropertyNameLookupFunction(propertyIndex); + } + + const char* MultiplayerComponentRegistry::GetComponentRpcName(NetComponentId netComponentId, RpcIndex rpcIndex) const + { + const ComponentData& componentData = GetMultiplayerComponentData(netComponentId); + return componentData.m_componentRpcNameLookupFunction(rpcIndex); + } + + const MultiplayerComponentRegistry::ComponentData& MultiplayerComponentRegistry::GetMultiplayerComponentData(NetComponentId netComponentId) const + { + static ComponentData nullComponentData; + auto it = m_componentData.find(netComponentId); + if (it != m_componentData.end()) + { + return it->second; + } + return nullComponentData; + } +} diff --git a/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.h b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.h new file mode 100644 index 0000000000..e16f942100 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Components/MultiplayerComponentRegistry.h @@ -0,0 +1,70 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Name/Name.h> +#include <AzCore/std/containers/unordered_map.h> +#include <Source/Components/MultiplayerComponent.h> + +namespace Multiplayer +{ + class MultiplayerComponentRegistry + { + public: + using PropertyNameLookupFunction = AZStd::function<const char*(PropertyIndex index)>; + using RpcNameLookupFunction = AZStd::function<const char* (RpcIndex index)>; + struct ComponentData + { + AZ::Name m_gemName; + AZ::Name m_componentName; + PropertyNameLookupFunction m_componentPropertyNameLookupFunction; + RpcNameLookupFunction m_componentRpcNameLookupFunction; + }; + + //! Registers a multiplayer component with the multiplayer system. + //! @param componentData the data associated with the component being registered + //! @return the NetComponentId assigned to this particular component + NetComponentId RegisterMultiplayerComponent(const ComponentData& componentData); + + //! Returns the gem name associated with the provided NetComponentId. + //! @param netComponentId the NetComponentId to return the gem name of + //! @return the name of the gem that contains the requested component + const char* GetComponentGemName(NetComponentId netComponentId) const; + + //! Returns the component name associated with the provided NetComponentId. + //! @param netComponentId the NetComponentId to return the component name of + //! @return the name of the component + const char* GetComponentName(NetComponentId netComponentId) const; + + //! Returns the property name associated with the provided NetComponentId and propertyIndex. + //! @param netComponentId the NetComponentId to return the property name of + //! @param propertyIndex the index off the network property to return the property name of + //! @return the name of the network property + const char* GetComponentPropertyName(NetComponentId netComponentId, PropertyIndex propertyIndex) const; + + //! Returns the Rpc name associated with the provided NetComponentId and rpcId. + //! @param netComponentId the NetComponentId to return the property name of + //! @param rpcIndex the index of the rpc to return the rpc name of + //! @return the name of the requested rpc + const char* GetComponentRpcName(NetComponentId netComponentId, RpcIndex rpcIndex) const; + + //! Retrieves the stored component data for a given NetComponentId. + //! @param netComponentId the NetComponentId to return component data for + //! @return reference to the requested component data, an empty container will be returned if the NetComponentId does not exist + const ComponentData& GetMultiplayerComponentData(NetComponentId netComponentId) const; + + private: + NetComponentId m_nextNetComponentId = NetComponentId{ 0 }; + AZStd::unordered_map<NetComponentId, ComponentData> m_componentData; + }; +} diff --git a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h index 8860c16fc1..e992dbfd72 100644 --- a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h +++ b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.h @@ -23,7 +23,7 @@ #include <Source/NetworkEntity/EntityReplication/ReplicationRecord.h> #include <Source/NetworkEntity/NetworkEntityHandle.h> #include <Source/NetworkInput/IMultiplayerComponentInput.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <AzCore/EBus/Event.h> namespace Multiplayer diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.cpp b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.cpp index 1388c1f5d2..4420e0689c 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.cpp +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ClientToServerConnectionData.cpp @@ -14,10 +14,8 @@ namespace Multiplayer { - static constexpr uint32_t Uint32Max = AZStd::numeric_limits<uint32_t>::max(); - // This can be used to help mitigate client side performance when large numbers of entities are created off the network - AZ_CVAR(uint32_t, cl_ClientMaxRemoteEntitiesPendingCreationCount, Uint32Max, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we have sent to the client, but have not had a confirmation back from the client"); + AZ_CVAR(uint32_t, cl_ClientMaxRemoteEntitiesPendingCreationCount, AZStd::numeric_limits<uint32_t>::max(), nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we have sent to the client, but have not had a confirmation back from the client"); AZ_CVAR(AZ::TimeMs, cl_ClientEntityReplicatorPendingRemovalTimeMs, AZ::TimeMs{ 10000 }, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "How long should wait prior to removing an entity for the client through a change in the replication window, entity deletes are still immediate"); ClientToServerConnectionData::ClientToServerConnectionData diff --git a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp index 0c2573e15d..7a7e266a38 100644 --- a/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp +++ b/Gems/Multiplayer/Code/Source/ConnectionData/ServerToClientConnectionData.cpp @@ -14,11 +14,9 @@ namespace Multiplayer { - static constexpr uint32_t Uint32Max = AZStd::numeric_limits<uint32_t>::max(); - // This can be used to help mitigate client side performance when large numbers of entities are created off the network - AZ_CVAR(uint32_t, sv_ClientMaxRemoteEntitiesPendingCreationCount, Uint32Max, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we have sent to the client, but have not had a confirmation back from the client"); - AZ_CVAR(uint32_t, sv_ClientMaxRemoteEntitiesPendingCreationCountPostInit, Uint32Max, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we will send to clients after gameplay has begun"); + AZ_CVAR(uint32_t, sv_ClientMaxRemoteEntitiesPendingCreationCount, AZStd::numeric_limits<uint32_t>::max(), nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we have sent to the client, but have not had a confirmation back from the client"); + AZ_CVAR(uint32_t, sv_ClientMaxRemoteEntitiesPendingCreationCountPostInit, AZStd::numeric_limits<uint32_t>::max(), nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Maximum number of entities that we will send to clients after gameplay has begun"); AZ_CVAR(AZ::TimeMs, sv_ClientEntityReplicatorPendingRemovalTimeMs, AZ::TimeMs{ 10000 }, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "How long should wait prior to removing an entity for the client through a change in the replication window, entity deletes are still immediate"); ServerToClientConnectionData::ServerToClientConnectionData diff --git a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp new file mode 100644 index 0000000000..ec148d09b1 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp @@ -0,0 +1,36 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <Source/Multiplayer_precompiled.h> +#include <Source/Debug/MultiplayerDebugModule.h> +#include <Source/Debug/MultiplayerDebugSystemComponent.h> + +namespace Multiplayer +{ + MultiplayerDebugModule::MultiplayerDebugModule() + : AZ::Module() + { + m_descriptors.insert(m_descriptors.end(), { + MultiplayerDebugSystemComponent::CreateDescriptor(), + }); + } + + AZ::ComponentTypeList MultiplayerDebugModule::GetRequiredSystemComponents() const + { + return AZ::ComponentTypeList + { + azrtti_typeid<MultiplayerDebugSystemComponent>(), + }; + } +} + +AZ_DECLARE_MODULE_CLASS(Gem_Multiplayer_Imgui, Multiplayer::MultiplayerDebugModule); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.h similarity index 55% rename from Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h rename to Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.h index afbb790c1a..94e96edf95 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidgetInterface.h +++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.h @@ -12,19 +12,20 @@ #pragma once -#include <AzCore/Interface/Interface.h> -#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/Module/Module.h> -namespace AzToolsFramework +namespace Multiplayer { - class EntityOutlinerWidgetInterface + class MultiplayerDebugModule + : public AZ::Module { public: - AZ_RTTI(EntityOutlinerWidgetInterface, "{30C0F252-EC84-4196-BF59-EB9E73B8ADCB}"); + AZ_RTTI(MultiplayerDebugModule, "{9E1460FA-4513-4B5E-86B4-9DD8ADEFA714}", AZ::Module); + AZ_CLASS_ALLOCATOR(MultiplayerDebugModule, AZ::SystemAllocator, 0); - virtual void SetUpdatesEnabled(bool enable) = 0; - virtual void ExpandEntityChildren(AZ::EntityId entityId) = 0; + MultiplayerDebugModule(); + ~MultiplayerDebugModule() override = default; + + AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; - -} // namespace AzToolsFramework - +} diff --git a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.cpp b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.cpp new file mode 100644 index 0000000000..506581b5e4 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.cpp @@ -0,0 +1,287 @@ +/* +* All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution(the "License").All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file.Do not +* remove or modify any license notices.This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <Source/Debug/MultiplayerDebugSystemComponent.h> +#include <AzCore/Serialization/SerializeContext.h> +#include <AzCore/Interface/Interface.h> +#include <Include/IMultiplayer.h> + +namespace Multiplayer +{ + void MultiplayerDebugSystemComponent::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) + { + serializeContext->Class<MultiplayerDebugSystemComponent, AZ::Component>() + ->Version(1); + } + } + + void MultiplayerDebugSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("MultiplayerDebugSystemComponent")); + } + + void MultiplayerDebugSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required) + { + ; + } + + void MultiplayerDebugSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatbile) + { + incompatbile.push_back(AZ_CRC_CE("MultiplayerDebugSystemComponent")); + } + + void MultiplayerDebugSystemComponent::Activate() + { +#ifdef IMGUI_ENABLED + ImGui::ImGuiUpdateListenerBus::Handler::BusConnect(); +#endif + } + + void MultiplayerDebugSystemComponent::Deactivate() + { +#ifdef IMGUI_ENABLED + ImGui::ImGuiUpdateListenerBus::Handler::BusDisconnect(); +#endif + } + +#ifdef IMGUI_ENABLED + void MultiplayerDebugSystemComponent::OnImGuiMainMenuUpdate() + { + if (ImGui::BeginMenu("Multiplayer")) + { + ImGui::Checkbox("Networking Stats", &m_displayNetworkingStats); + ImGui::Checkbox("Multiplayer Stats", &m_displayMultiplayerStats); + ImGui::EndMenu(); + } + } + + void AccumulatePerSecondValues(const MultiplayerStats& stats, const MultiplayerStats::Metric& metric, float& outCallsPerSecond, float& outBytesPerSecond) + { + uint64_t summedCalls = 0; + uint64_t summedBytes = 0; + for (uint32_t index = 0; index < MultiplayerStats::RingbufferSamples; ++index) + { + summedCalls += metric.m_callHistory[index]; + summedBytes += metric.m_byteHistory[index]; + } + const float totalTimeSeconds = static_cast<float>(stats.m_totalHistoryTimeMs) / 1000.0f; + outCallsPerSecond += (summedCalls > 0 && totalTimeSeconds > 0.0f) ? static_cast<float>(summedCalls) / totalTimeSeconds : 0.0f; + outBytesPerSecond += (summedBytes > 0 && totalTimeSeconds > 0.0f) ? static_cast<float>(summedBytes) / totalTimeSeconds : 0.0f; + } + + bool DrawMetricsRow(const char* name, bool expandable, uint64_t totalCalls, uint64_t totalBytes, float callsPerSecond, float bytesPerSecond) + { + const ImGuiTreeNodeFlags flags = expandable ? ImGuiTreeNodeFlags_SpanFullWidth + : (ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + const bool open = ImGui::TreeNodeEx(name, flags); + ImGui::TableNextColumn(); + ImGui::Text("%11llu", aznumeric_cast<AZ::u64>(totalCalls)); + ImGui::TableNextColumn(); + ImGui::Text("%11llu", aznumeric_cast<AZ::u64>(totalBytes)); + ImGui::TableNextColumn(); + ImGui::Text("%11.2f", callsPerSecond); + ImGui::TableNextColumn(); + ImGui::Text("%11.2f", bytesPerSecond); + return open; + } + + bool DrawSummaryRow(const char* name, const MultiplayerStats& stats) + { + const MultiplayerStats::Metric propertyUpdatesSent = stats.CalculateTotalPropertyUpdateSentMetrics(); + const MultiplayerStats::Metric propertyUpdatesRecv = stats.CalculateTotalPropertyUpdateRecvMetrics(); + const MultiplayerStats::Metric rpcsSent = stats.CalculateTotalRpcsSentMetrics(); + const MultiplayerStats::Metric rpcsRecv = stats.CalculateTotalRpcsRecvMetrics(); + + const uint64_t totalCalls = propertyUpdatesSent.m_totalCalls + propertyUpdatesRecv.m_totalCalls + rpcsSent.m_totalCalls + rpcsRecv.m_totalCalls; + const uint64_t totalBytes = propertyUpdatesSent.m_totalBytes + propertyUpdatesRecv.m_totalBytes + rpcsSent.m_totalBytes + rpcsRecv.m_totalBytes; + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, propertyUpdatesSent, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, propertyUpdatesRecv, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, rpcsSent, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, rpcsRecv, callsPerSecond, bytesPerSecond); + + return DrawMetricsRow(name, true, totalCalls, totalBytes, callsPerSecond, bytesPerSecond); + } + + bool DrawComponentRow(const char* name, const MultiplayerStats& stats, NetComponentId netComponentId) + { + const MultiplayerStats::Metric propertyUpdatesSent = stats.CalculateComponentPropertyUpdateSentMetrics(netComponentId); + const MultiplayerStats::Metric propertyUpdatesRecv = stats.CalculateComponentPropertyUpdateRecvMetrics(netComponentId); + const MultiplayerStats::Metric rpcsSent = stats.CalculateComponentRpcsSentMetrics(netComponentId); + const MultiplayerStats::Metric rpcsRecv = stats.CalculateComponentRpcsRecvMetrics(netComponentId); + + const uint64_t totalCalls = propertyUpdatesSent.m_totalCalls + propertyUpdatesRecv.m_totalCalls + rpcsSent.m_totalCalls + rpcsRecv.m_totalCalls; + const uint64_t totalBytes = propertyUpdatesSent.m_totalBytes + propertyUpdatesRecv.m_totalBytes + rpcsSent.m_totalBytes + rpcsRecv.m_totalBytes; + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, propertyUpdatesSent, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, propertyUpdatesRecv, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, rpcsSent, callsPerSecond, bytesPerSecond); + AccumulatePerSecondValues(stats, rpcsRecv, callsPerSecond, bytesPerSecond); + + return DrawMetricsRow(name, true, totalCalls, totalBytes, callsPerSecond, bytesPerSecond); + } + + void DrawComponentDetails(const MultiplayerStats& stats, NetComponentId netComponentId) + { + IMultiplayer* multiplayer = AZ::Interface<IMultiplayer>::Get(); + { + const MultiplayerStats::Metric metric = stats.CalculateComponentPropertyUpdateSentMetrics(netComponentId); + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, metric, callsPerSecond, bytesPerSecond); + if (DrawMetricsRow("PropertyUpdates Sent", true, metric.m_totalCalls, metric.m_totalBytes, callsPerSecond, bytesPerSecond)) + { + const MultiplayerStats::ComponentStats& componentStats = stats.m_componentStats[aznumeric_cast<AZStd::size_t>(netComponentId)]; + for (AZStd::size_t index = 0; index < componentStats.m_propertyUpdatesSent.size(); ++index) + { + const PropertyIndex propertyIndex = aznumeric_cast<PropertyIndex>(index); + const char* propertyName = multiplayer->GetComponentPropertyName(netComponentId, propertyIndex); + const MultiplayerStats::Metric& subMetric = componentStats.m_propertyUpdatesSent[index]; + callsPerSecond = 0.0f; + bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, subMetric, callsPerSecond, bytesPerSecond); + DrawMetricsRow(propertyName, false, subMetric.m_totalCalls, subMetric.m_totalBytes, callsPerSecond, bytesPerSecond); + } + ImGui::TreePop(); + } + } + + { + const MultiplayerStats::Metric metric = stats.CalculateComponentPropertyUpdateRecvMetrics(netComponentId); + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, metric, callsPerSecond, bytesPerSecond); + if (DrawMetricsRow("PropertyUpdates Recv", true, metric.m_totalCalls, metric.m_totalBytes, callsPerSecond, bytesPerSecond)) + { + const MultiplayerStats::ComponentStats& componentStats = stats.m_componentStats[aznumeric_cast<AZStd::size_t>(netComponentId)]; + for (AZStd::size_t index = 0; index < componentStats.m_propertyUpdatesRecv.size(); ++index) + { + const PropertyIndex propertyIndex = aznumeric_cast<PropertyIndex>(index); + const char* propertyName = multiplayer->GetComponentPropertyName(netComponentId, propertyIndex); + const MultiplayerStats::Metric& subMetric = componentStats.m_propertyUpdatesRecv[index]; + callsPerSecond = 0.0f; + bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, subMetric, callsPerSecond, bytesPerSecond); + DrawMetricsRow(propertyName, false, subMetric.m_totalCalls, subMetric.m_totalBytes, callsPerSecond, bytesPerSecond); + } + ImGui::TreePop(); + } + } + + { + const MultiplayerStats::Metric metric = stats.CalculateComponentRpcsSentMetrics(netComponentId); + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, metric, callsPerSecond, bytesPerSecond); + if (DrawMetricsRow("RemoteProcedures Sent", true, metric.m_totalCalls, metric.m_totalBytes, callsPerSecond, bytesPerSecond)) + { + const MultiplayerStats::ComponentStats& componentStats = stats.m_componentStats[aznumeric_cast<AZStd::size_t>(netComponentId)]; + for (AZStd::size_t index = 0; index < componentStats.m_rpcsSent.size(); ++index) + { + const RpcIndex rpcIndex = aznumeric_cast<RpcIndex>(index); + const char* rpcName = multiplayer->GetComponentRpcName(netComponentId, rpcIndex); + const MultiplayerStats::Metric& subMetric = componentStats.m_rpcsSent[index]; + callsPerSecond = 0.0f; + bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, subMetric, callsPerSecond, bytesPerSecond); + DrawMetricsRow(rpcName, false, subMetric.m_totalCalls, subMetric.m_totalBytes, callsPerSecond, bytesPerSecond); + } + ImGui::TreePop(); + } + } + + { + const MultiplayerStats::Metric metric = stats.CalculateComponentRpcsRecvMetrics(netComponentId); + float callsPerSecond = 0.0f; + float bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, metric, callsPerSecond, bytesPerSecond); + if (DrawMetricsRow("RemoteProcedures Recv", true, metric.m_totalCalls, metric.m_totalBytes, callsPerSecond, bytesPerSecond)) + { + const MultiplayerStats::ComponentStats& componentStats = stats.m_componentStats[aznumeric_cast<AZStd::size_t>(netComponentId)]; + for (AZStd::size_t index = 0; index < componentStats.m_rpcsRecv.size(); ++index) + { + const RpcIndex rpcIndex = aznumeric_cast<RpcIndex>(index); + const char* rpcName = multiplayer->GetComponentRpcName(netComponentId, rpcIndex); + const MultiplayerStats::Metric& subMetric = componentStats.m_rpcsRecv[index]; + callsPerSecond = 0.0f; + bytesPerSecond = 0.0f; + AccumulatePerSecondValues(stats, subMetric, callsPerSecond, bytesPerSecond); + DrawMetricsRow(rpcName, false, subMetric.m_totalCalls, subMetric.m_totalBytes, callsPerSecond, bytesPerSecond); + } + ImGui::TreePop(); + } + } + } + + void MultiplayerDebugSystemComponent::OnImGuiUpdate() + { + const float TEXT_BASE_WIDTH = ImGui::CalcTextSize("A").x; + const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); + + if (m_displayMultiplayerStats) + { + if (ImGui::Begin("Multiplayer Stats", &m_displayMultiplayerStats, ImGuiWindowFlags_HorizontalScrollbar)) + { + IMultiplayer* multiplayer = AZ::Interface<IMultiplayer>::Get(); + const Multiplayer::MultiplayerStats& stats = multiplayer->GetStats(); + ImGui::Text("Multiplayer operating in %s mode", GetEnumString(multiplayer->GetAgentType())); + ImGui::Text("Total networked entities: %llu", aznumeric_cast<AZ::u64>(stats.m_entityCount)); + ImGui::Text("Total client connections: %llu", aznumeric_cast<AZ::u64>(stats.m_clientConnectionCount)); + ImGui::Text("Total server connections: %llu", aznumeric_cast<AZ::u64>(stats.m_serverConnectionCount)); + ImGui::NewLine(); + + static ImGuiTableFlags flags = ImGuiTableFlags_BordersV + | ImGuiTableFlags_BordersOuterH + | ImGuiTableFlags_Resizable + | ImGuiTableFlags_RowBg + | ImGuiTableFlags_NoBordersInBody; + + if (ImGui::BeginTable("", 5, flags)) + { + // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide, TEXT_BASE_WIDTH * 36.0f); + ImGui::TableSetupColumn("Total Calls", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Total Bytes", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Calls/Sec", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Bytes/Sec", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableHeadersRow(); + + if (DrawSummaryRow("Totals", stats)) + { + for (AZStd::size_t index = 0; index < stats.m_componentStats.size(); ++index) + { + const NetComponentId netComponentId = aznumeric_cast<NetComponentId>(index); + using StringLabel = AZStd::fixed_string<128>; + const StringLabel gemName = multiplayer->GetComponentGemName(netComponentId); + const StringLabel componentName = multiplayer->GetComponentName(netComponentId); + const StringLabel label = gemName + "::" + componentName; + if (DrawComponentRow(label.c_str(), stats, netComponentId)) + { + DrawComponentDetails(stats, netComponentId); + ImGui::TreePop(); + } + } + } + ImGui::EndTable(); + } + ImGui::End(); + } + } + } +#endif +} diff --git a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.h b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.h new file mode 100644 index 0000000000..a05b880f0e --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugSystemComponent.h @@ -0,0 +1,57 @@ +/* +* All or portions of this file Copyright(c) Amazon.com, Inc.or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution(the "License").All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file.Do not +* remove or modify any license notices.This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Component/Component.h> + +#ifdef IMGUI_ENABLED +# include <imgui/imgui.h> +# include <ImGuiBus.h> +#endif + +namespace Multiplayer +{ + class MultiplayerDebugSystemComponent final + : public AZ::Component +#ifdef IMGUI_ENABLED + , public ImGui::ImGuiUpdateListenerBus::Handler +#endif + { + public: + AZ_COMPONENT(MultiplayerDebugSystemComponent, "{060BF3F1-0BFE-4FCE-9C3C-EE991F0DA581}"); + + static void Reflect(AZ::ReflectContext* context); + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatbile); + + ~MultiplayerDebugSystemComponent() override = default; + + //! AZ::Component overrides + //! @{ + void Activate() override; + void Deactivate() override; + //! @} + +#ifdef IMGUI_ENABLED + //! ImGui::ImGuiUpdateListenerBus overrides + //! @{ + void OnImGuiMainMenuUpdate() override; + void OnImGuiUpdate() override; + //! @} +#endif + private: + bool m_displayNetworkingStats = false; + bool m_displayMultiplayerStats = false; + }; +} diff --git a/Gems/Multiplayer/Code/Source/MultiplayerGem.cpp b/Gems/Multiplayer/Code/Source/MultiplayerGem.cpp index 9fa1413be5..596a1b40fa 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerGem.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerGem.cpp @@ -15,6 +15,8 @@ #include <Source/MultiplayerSystemComponent.h> #include <Source/Components/NetBindComponent.h> #include <Source/AutoGen/AutoComponentTypes.h> +#include <Source/Pipeline/NetBindMarkerComponent.h> +#include <Source/Pipeline/NetworkSpawnableHolderComponent.h> #include <AzNetworking/Framework/NetworkingSystemComponent.h> namespace Multiplayer @@ -26,6 +28,8 @@ namespace Multiplayer AzNetworking::NetworkingSystemComponent::CreateDescriptor(), MultiplayerSystemComponent::CreateDescriptor(), NetBindComponent::CreateDescriptor(), + NetBindMarkerComponent::CreateDescriptor(), + NetworkSpawnableHolderComponent::CreateDescriptor(), }); CreateComponentDescriptors(m_descriptors); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index 70323d7de3..2756bb649a 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -114,6 +114,9 @@ namespace Multiplayer m_networkInterface = AZ::Interface<INetworking>::Get()->CreateNetworkInterface(AZ::Name(s_networkInterfaceName), sv_protocol, TrustZone::ExternalClientToServer, *this); m_consoleCommandHandler.Connect(AZ::Interface<AZ::IConsole>::Get()->GetConsoleCommandInvokedEvent()); AZ::Interface<IMultiplayer>::Register(this); + + //! Register our gems multiplayer components to assign NetComponentIds + RegisterMultiplayerComponents(); } void MultiplayerSystemComponent::Deactivate() @@ -133,23 +136,33 @@ namespace Multiplayer // Let the network system know the frame is done and we can collect dirty bits m_networkEntityManager.NotifyEntitiesDirtied(); + MultiplayerStats& stats = GetStats(); + stats.m_entityCount = GetNetworkEntityManager()->GetEntityCount(); + stats.m_serverConnectionCount = 0; + stats.m_clientConnectionCount = 0; + // Send out the game state update to all connections { - auto sendNetworkUpdates = [serverGameTimeMs](IConnection& connection) + auto sendNetworkUpdates = [serverGameTimeMs, &stats](IConnection& connection) { if (connection.GetUserData() != nullptr) { IConnectionData* connectionData = reinterpret_cast<IConnectionData*>(connection.GetUserData()); connectionData->Update(serverGameTimeMs); + if (connectionData->GetConnectionDataType() == ConnectionDataType::ServerToClient) + { + stats.m_clientConnectionCount++; + } + else + { + stats.m_serverConnectionCount++; + } } }; m_networkInterface->GetConnectionSet().VisitConnections(sendNetworkUpdates); } - MultiplayerStats& stats = GetStats(); - stats.m_entityCount = GetNetworkEntityManager()->GetEntityCount(); - MultiplayerPackets::SyncConsole packet; AZ::ThreadSafeDeque<AZStd::string>::DequeType cvarUpdates; m_cvarCommands.Swap(cvarUpdates); @@ -493,6 +506,26 @@ namespace Multiplayer handler.Connect(m_shutdownEvent); } + const char* MultiplayerSystemComponent::GetComponentGemName(NetComponentId netComponentId) const + { + return GetMultiplayerComponentRegistry()->GetComponentGemName(netComponentId); + } + + const char* MultiplayerSystemComponent::GetComponentName(NetComponentId netComponentId) const + { + return GetMultiplayerComponentRegistry()->GetComponentName(netComponentId); + } + + const char* MultiplayerSystemComponent::GetComponentPropertyName(NetComponentId netComponentId, PropertyIndex propertyIndex) const + { + return GetMultiplayerComponentRegistry()->GetComponentPropertyName(netComponentId, propertyIndex); + } + + const char* MultiplayerSystemComponent::GetComponentRpcName(NetComponentId netComponentId, RpcIndex rpcIndex) const + { + return GetMultiplayerComponentRegistry()->GetComponentRpcName(netComponentId, rpcIndex); + } + void MultiplayerSystemComponent::DumpStats([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments) { const MultiplayerStats& stats = GetStats(); @@ -500,14 +533,20 @@ namespace Multiplayer AZLOG_INFO("Total networked entities: %llu", aznumeric_cast<AZ::u64>(stats.m_entityCount)); AZLOG_INFO("Total client connections: %llu", aznumeric_cast<AZ::u64>(stats.m_clientConnectionCount)); AZLOG_INFO("Total server connections: %llu", aznumeric_cast<AZ::u64>(stats.m_serverConnectionCount)); - AZLOG_INFO("Total property updates sent: %llu", aznumeric_cast<AZ::u64>(stats.m_propertyUpdatesSent)); - AZLOG_INFO("Total property updates sent bytes: %llu", aznumeric_cast<AZ::u64>(stats.m_propertyUpdatesSentBytes)); - AZLOG_INFO("Total property updates received: %llu", aznumeric_cast<AZ::u64>(stats.m_propertyUpdatesRecv)); - AZLOG_INFO("Total property updates received bytes: %llu", aznumeric_cast<AZ::u64>(stats.m_propertyUpdatesRecvBytes)); - AZLOG_INFO("Total RPCs sent: %llu", aznumeric_cast<AZ::u64>(stats.m_rpcsSent)); - AZLOG_INFO("Total RPCs sent bytes: %llu", aznumeric_cast<AZ::u64>(stats.m_rpcsSentBytes)); - AZLOG_INFO("Total RPCs received: %llu", aznumeric_cast<AZ::u64>(stats.m_rpcsRecv)); - AZLOG_INFO("Total RPCs received bytes: %llu", aznumeric_cast<AZ::u64>(stats.m_rpcsRecvBytes)); + + const MultiplayerStats::Metric propertyUpdatesSent = stats.CalculateTotalPropertyUpdateSentMetrics(); + const MultiplayerStats::Metric propertyUpdatesRecv = stats.CalculateTotalPropertyUpdateRecvMetrics(); + const MultiplayerStats::Metric rpcsSent = stats.CalculateTotalRpcsSentMetrics(); + const MultiplayerStats::Metric rpcsRecv = stats.CalculateTotalRpcsRecvMetrics(); + + AZLOG_INFO("Total property updates sent: %llu", aznumeric_cast<AZ::u64>(propertyUpdatesSent.m_totalCalls)); + AZLOG_INFO("Total property updates sent bytes: %llu", aznumeric_cast<AZ::u64>(propertyUpdatesSent.m_totalBytes)); + AZLOG_INFO("Total property updates received: %llu", aznumeric_cast<AZ::u64>(propertyUpdatesRecv.m_totalCalls)); + AZLOG_INFO("Total property updates received bytes: %llu", aznumeric_cast<AZ::u64>(propertyUpdatesRecv.m_totalBytes)); + AZLOG_INFO("Total RPCs sent: %llu", aznumeric_cast<AZ::u64>(rpcsSent.m_totalCalls)); + AZLOG_INFO("Total RPCs sent bytes: %llu", aznumeric_cast<AZ::u64>(rpcsSent.m_totalBytes)); + AZLOG_INFO("Total RPCs received: %llu", aznumeric_cast<AZ::u64>(rpcsRecv.m_totalCalls)); + AZLOG_INFO("Total RPCs received bytes: %llu", aznumeric_cast<AZ::u64>(rpcsRecv.m_totalBytes)); } void MultiplayerSystemComponent::OnConsoleCommandInvoked diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h index 1e10f9841e..f8d56e0408 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.h @@ -88,6 +88,10 @@ namespace Multiplayer void AddConnectionAcquiredHandler(ConnectionAcquiredEvent::Handler& handler) override; void AddSessionInitHandler(SessionInitEvent::Handler& handler) override; void AddSessionShutdownHandler(SessionShutdownEvent::Handler& handler) override; + const char* GetComponentGemName(NetComponentId netComponentId) const override; + const char* GetComponentName(NetComponentId netComponentId) const override; + const char* GetComponentPropertyName(NetComponentId netComponentId, PropertyIndex propertyIndex) const override; + const char* GetComponentRpcName(NetComponentId netComponentId, RpcIndex rpcIndex) const override; //! @} //! Console commands. diff --git a/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp new file mode 100644 index 0000000000..5a223d6214 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.cpp @@ -0,0 +1,65 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#include <Source/Multiplayer_precompiled.h> +#include <Source/MultiplayerToolsModule.h> +#include <Pipeline/NetworkPrefabProcessor.h> +#include <AzCore/Serialization/Json/RegistrationContext.h> +#include <Prefab/Instance/InstanceSerializer.h> + +namespace Multiplayer +{ + //! Multiplayer Tools system component provides serialize context reflection for tools-only systems. + class MultiplayerToolsSystemComponent final + : public AZ::Component + { + public: + AZ_COMPONENT(MultiplayerToolsSystemComponent, "{65AF5342-0ECE-423B-B646-AF55A122F72B}"); + + static void Reflect(AZ::ReflectContext* context) + { + NetworkPrefabProcessor::Reflect(context); + } + + MultiplayerToolsSystemComponent() = default; + ~MultiplayerToolsSystemComponent() override = default; + + /// AZ::Component overrides. + void Activate() override + { + + } + + void Deactivate() override + { + + } + }; + + MultiplayerToolsModule::MultiplayerToolsModule() + : AZ::Module() + { + m_descriptors.insert(m_descriptors.end(), { + MultiplayerToolsSystemComponent::CreateDescriptor(), + }); + } + + AZ::ComponentTypeList MultiplayerToolsModule::GetRequiredSystemComponents() const + { + return AZ::ComponentTypeList + { + azrtti_typeid<MultiplayerToolsSystemComponent>(), + }; + } +} // namespace Multiplayer + +AZ_DECLARE_MODULE_CLASS(Gem_Multiplayer_Tools, Multiplayer::MultiplayerToolsModule); diff --git a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleFileGuard.hpp b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h similarity index 51% rename from Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleFileGuard.hpp rename to Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h index 58bd88d57b..823bd63a1d 100644 --- a/Code/Tools/CrySCompileServer/CrySCompileServer/Core/Server/CrySimpleFileGuard.hpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerToolsModule.h @@ -9,25 +9,25 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -// Original file Copyright Crytek GMBH or its affiliates, used under license. -#ifndef __CRYSIMPLEFILEGUARD__ -#define __CRYSIMPLEFILEGUARD__ +#pragma once -#include <Core/Common.h> -#include <string> +#include <AzCore/Module/Module.h> -class CCrySimpleFileGuard +namespace Multiplayer { - std::string m_FileName; -public: - CCrySimpleFileGuard(const std::string& rFileName) - : m_FileName(rFileName) + class MultiplayerToolsModule + : public AZ::Module { - } - ~CCrySimpleFileGuard() - { - remove(m_FileName.c_str()); - } -}; -#endif + public: + + AZ_RTTI(MultiplayerToolsModule, "{3F726172-21FC-48FA-8CFA-7D87EBA07E55}", AZ::Module); + AZ_CLASS_ALLOCATOR(MultiplayerToolsModule, AZ::SystemAllocator, 0); + + MultiplayerToolsModule(); + ~MultiplayerToolsModule() override = default; + + AZ::ComponentTypeList GetRequiredSystemComponents() const override; + }; +} // namespace Multiplayer + diff --git a/Gems/Multiplayer/Code/Source/MultiplayerTypes.h b/Gems/Multiplayer/Code/Source/MultiplayerTypes.h index b387602843..ca3734e4f0 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerTypes.h +++ b/Gems/Multiplayer/Code/Source/MultiplayerTypes.h @@ -13,6 +13,7 @@ #pragma once #include <AzCore/EBus/Event.h> +#include <AzCore/Name/Name.h> #include <AzCore/RTTI/TypeSafeIntegral.h> #include <AzCore/std/string/fixed_string.h> #include <AzNetworking/Serialization/ISerializer.h> @@ -32,6 +33,9 @@ namespace Multiplayer AZ_TYPE_SAFE_INTEGRAL(NetComponentId, uint16_t); static constexpr NetComponentId InvalidNetComponentId = static_cast<NetComponentId>(-1); + AZ_TYPE_SAFE_INTEGRAL(PropertyIndex, uint16_t); + AZ_TYPE_SAFE_INTEGRAL(RpcIndex, uint16_t); + using LongNetworkString = AZ::CVarFixedString; using ReliabilityType = AzNetworking::ReliabilityType; @@ -74,12 +78,41 @@ namespace Multiplayer struct PrefabEntityId { AZ_TYPE_INFO(PrefabEntityId, "{EFD37465-CCAC-4E87-A825-41B4010A2C75}"); - bool operator==(const PrefabEntityId&) const { return true; } - bool operator!=(const PrefabEntityId& rhs) const { return !(*this == rhs); } - bool Serialize(AzNetworking::ISerializer&) { return true; } + + static constexpr uint32_t AllIndices = AZStd::numeric_limits<uint32_t>::max(); + + AZ::Name m_prefabName; + uint32_t m_entityOffset = AllIndices; + + PrefabEntityId() = default; + + explicit PrefabEntityId(AZ::Name name, uint32_t entityOffset = AllIndices) + : m_prefabName(name) + , m_entityOffset(entityOffset) + { + } + + bool operator==(const PrefabEntityId& rhs) const + { + return m_prefabName == rhs.m_prefabName && m_entityOffset == rhs.m_entityOffset; + } + + bool operator!=(const PrefabEntityId& rhs) const + { + return !(*this == rhs); + } + + bool Serialize(AzNetworking::ISerializer& serializer) + { + serializer.Serialize(m_prefabName, "prefabName"); + serializer.Serialize(m_entityOffset, "entityOffset"); + return serializer.IsValid(); + } }; } AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::HostId); AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::NetEntityId); AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::NetComponentId); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::PropertyIndex); +AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::RpcIndex); diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp index 8c076f759d..938e3b2c23 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.cpp @@ -18,8 +18,10 @@ #include <Source/EntityDomains/IEntityDomain.h> #include <Source/NetworkEntity/NetworkEntityUpdateMessage.h> #include <Source/NetworkEntity/NetworkEntityRpcMessage.h> +#include <Source/NetworkEntity/INetworkEntityManager.h> #include <Source/Components/NetBindComponent.h> #include <Source/AutoGen/Multiplayer.AutoPackets.h> +#include <Include/IMultiplayer.h> #include <AzNetworking/ConnectionLayer/IConnection.h> #include <AzNetworking/ConnectionLayer/IConnectionListener.h> #include <AzNetworking/PacketLayer/IPacketHeader.h> @@ -530,7 +532,7 @@ namespace Multiplayer NetEntityId netEntityId, NetEntityRole localNetworkRole, AzNetworking::ISerializer& serializer, - [[maybe_unused]] const PrefabEntityId& prefabEntityId + const PrefabEntityId& prefabEntityId ) { ConstNetworkEntityHandle replicatorEntity = GetNetworkEntityManager()->GetEntity(netEntityId); @@ -543,7 +545,16 @@ namespace Multiplayer { // @pereslav //replicatorEntity = GetNetworkEntityManager()->CreateSingleEntityImmediateInternal(prefabEntityId, EntitySpawnType::Replicate, AutoActivate::DoNotActivate, netEntityId, localNetworkRole, AZ::Transform::Identity()); - AZ_Assert(replicatorEntity != nullptr, "Failed to create entity from prefab");// %s", prefabEntityId.GetString()); + INetworkEntityManager::EntityList entityList = GetNetworkEntityManager()->CreateEntitiesImmediate( + prefabEntityId, netEntityId, localNetworkRole, + AZ::Transform::Identity()); + + if (entityList.size() == 1) + { + replicatorEntity = entityList[0]; + } + + AZ_Assert(replicatorEntity != nullptr, "Failed to create entity from prefab %s", prefabEntityId.m_prefabName.GetCStr()); if (replicatorEntity == nullptr) { return false; @@ -815,11 +826,12 @@ namespace Multiplayer { if (entityReplicator == nullptr) { + IMultiplayer* multiplayer = AZ::Interface<IMultiplayer>::Get(); AZLOG_INFO ( - "EntityReplicationManager: Dropping remote RPC message for component %u of rpc type %d, entityId %u has already been deleted", - aznumeric_cast<uint32_t>(message.GetComponentId()), - message.GetRpcMessageType(), + "EntityReplicationManager: Dropping remote RPC message for component %s of rpc index %s, entityId %u has already been deleted", + multiplayer->GetComponentName(message.GetComponentId()), + multiplayer->GetComponentRpcName(message.GetComponentId(), message.GetRpcIndex()), message.GetEntityId() ); return false; diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp index 0edb5db250..b645101677 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicator.cpp @@ -449,8 +449,7 @@ namespace Multiplayer { // Received rpc metrics, log rpc sent, number of bytes, and the componentId/rpcId for bandwidth metrics MultiplayerStats& stats = AZ::Interface<IMultiplayer>::Get()->GetStats(); - stats.m_rpcsSent++; - stats.m_rpcsSentBytes += entityRpcMessage.GetEstimatedSerializeSize(); + stats.RecordRpcSent(entityRpcMessage.GetComponentId(), entityRpcMessage.GetRpcIndex(), entityRpcMessage.GetEstimatedSerializeSize()); m_replicationManager.AddDeferredRpcMessage(entityRpcMessage); } @@ -604,7 +603,7 @@ namespace Multiplayer aznumeric_cast<uint32_t>(GetRemoteNetworkRole()), aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcDeliveryType()), aznumeric_cast<uint32_t>(entityRpcMessage.GetComponentId()), - aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcMessageType()), + aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcIndex()), entityRpcMessage.GetReliability() == ReliabilityType::Reliable ? "true" : "false", IsMarkedForRemoval() ? "true" : "false" ); @@ -621,7 +620,7 @@ namespace Multiplayer aznumeric_cast<uint32_t>(GetRemoteNetworkRole()), aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcDeliveryType()), aznumeric_cast<uint32_t>(entityRpcMessage.GetComponentId()), - aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcMessageType()), + aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcIndex()), entityRpcMessage.GetReliability() == ReliabilityType::Reliable ? "true" : "false", IsMarkedForRemoval() ? "true" : "false" ); @@ -633,8 +632,7 @@ namespace Multiplayer { // Received rpc metrics, log rpc received, time spent, number of bytes, and the componentId/rpcId for bandwidth metrics MultiplayerStats& stats = AZ::Interface<IMultiplayer>::Get()->GetStats(); - stats.m_rpcsRecv++; - stats.m_rpcsRecvBytes += entityRpcMessage.GetEstimatedSerializeSize(); + stats.RecordRpcReceived(entityRpcMessage.GetComponentId(), entityRpcMessage.GetRpcIndex(), entityRpcMessage.GetEstimatedSerializeSize()); if (!m_netBindComponent) { @@ -646,7 +644,7 @@ namespace Multiplayer aznumeric_cast<uint32_t>(GetRemoteNetworkRole()), aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcDeliveryType()), aznumeric_cast<uint32_t>(entityRpcMessage.GetComponentId()), - aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcMessageType()), + aznumeric_cast<uint32_t>(entityRpcMessage.GetRpcIndex()), entityRpcMessage.GetReliability() == ReliabilityType::Reliable ? "true" : "false", IsMarkedForRemoval() ? "true" : "false" ); diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h index 7c2f4668ed..83721a5539 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/ReplicationRecord.h @@ -15,7 +15,7 @@ #include <AzNetworking/DataStructures/FixedSizeVectorBitset.h> #include <AzNetworking/Serialization/ISerializer.h> #include <AzNetworking/Utilities/NetworkCommon.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> namespace Multiplayer { diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/INetworkEntityManager.h b/Gems/Multiplayer/Code/Source/NetworkEntity/INetworkEntityManager.h index 2262cccd19..da6d9a4cbe 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/INetworkEntityManager.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/INetworkEntityManager.h @@ -12,16 +12,18 @@ #pragma once -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <Source/NetworkEntity/NetworkEntityHandle.h> #include <AzCore/Component/Entity.h> #include <AzCore/EBus/Event.h> +#include <AzCore/Asset/AssetCommon.h> namespace Multiplayer { class NetworkEntityTracker; class NetworkEntityAuthorityTracker; class NetworkEntityRpcMessage; + class MultiplayerComponentRegistry; using EntityExitDomainEvent = AZ::Event<const ConstNetworkEntityHandle&>; using ControllersActivatedEvent = AZ::Event<const ConstNetworkEntityHandle&, EntityIsMigrating>; @@ -35,6 +37,7 @@ namespace Multiplayer AZ_RTTI(INetworkEntityManager, "{109759DE-9492-439C-A0B1-AE46E6FD029C}"); using OwnedEntitySet = AZStd::unordered_set<ConstNetworkEntityHandle>; + using EntityList = AZStd::vector<NetworkEntityHandle>; virtual ~INetworkEntityManager() = default; @@ -46,11 +49,18 @@ namespace Multiplayer //! @return the NetworkEntityAuthorityTracker for this INetworkEntityManager instance virtual NetworkEntityAuthorityTracker* GetNetworkEntityAuthorityTracker() = 0; + //! Returns the MultiplayerComponentRegistry for this INetworkEntityManager instance. + //! @return the MultiplayerComponentRegistry for this INetworkEntityManager instance + virtual MultiplayerComponentRegistry* GetMultiplayerComponentRegistry() = 0; + //! Returns the HostId for this INetworkEntityManager instance. //! @return the HostId for this INetworkEntityManager instance virtual HostId GetHostId() const = 0; - // TODO: Spawn methods for entities within slices/prefabs/levels + //! Creates new entities of the given archetype + //! @param prefabEntryId the name of the spawnable to spawn + virtual EntityList CreateEntitiesImmediate( + const PrefabEntityId& prefabEntryId, NetEntityId netEntityId, NetEntityRole netEntityRole, const AZ::Transform& transform) = 0; //! Returns an ConstEntityPtr for the provided entityId. //! @param netEntityId the netEntityId to get an ConstEntityPtr for @@ -139,4 +149,9 @@ namespace Multiplayer { return GetNetworkEntityManager()->GetNetworkEntityAuthorityTracker(); } + + inline MultiplayerComponentRegistry* GetMultiplayerComponentRegistry() + { + return GetNetworkEntityManager()->GetMultiplayerComponentRegistry(); + } } diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityHandle.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityHandle.h index 7e1f3f15fa..0f84ed4477 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityHandle.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityHandle.h @@ -13,7 +13,7 @@ #pragma once #include <AzCore/Component/Entity.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> namespace Multiplayer { diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp index 23be4fb4fb..ca1b40ca9b 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp @@ -21,6 +21,9 @@ #include <AzFramework/Entity/EntityContextBus.h> #include <AzFramework/Entity/GameEntityContextBus.h> #include <AzFramework/Components/TransformComponent.h> +#include <Include/IMultiplayer.h> +#include <Pipeline/NetworkSpawnableHolderComponent.h> +#include <AzCore/Asset/AssetManager.h> namespace Multiplayer { @@ -31,20 +34,14 @@ namespace Multiplayer : m_networkEntityAuthorityTracker(*this) , m_removeEntitiesEvent([this] { RemoveEntities(); }, AZ::Name("NetworkEntityManager remove entities event")) , m_updateEntityDomainEvent([this] { UpdateEntityDomain(); }, AZ::Name("NetworkEntityManager update entity domain event")) - , m_entityAddedEventHandler([this](AZ::Entity* entity) { OnEntityAdded(entity); }) - , m_entityRemovedEventHandler([this](AZ::Entity* entity) { OnEntityRemoved(entity); }) { AZ::Interface<INetworkEntityManager>::Register(this); - if (AZ::Interface<AZ::ComponentApplicationRequests>::Get() != nullptr) - { - // Null guard needed for unit tests - AZ::Interface<AZ::ComponentApplicationRequests>::Get()->RegisterEntityAddedEventHandler(m_entityAddedEventHandler); - AZ::Interface<AZ::ComponentApplicationRequests>::Get()->RegisterEntityRemovedEventHandler(m_entityRemovedEventHandler); - } + AzFramework::RootSpawnableNotificationBus::Handler::BusConnect(); } NetworkEntityManager::~NetworkEntityManager() { + AzFramework::RootSpawnableNotificationBus::Handler::BusDisconnect(); AZ::Interface<INetworkEntityManager>::Unregister(this); } @@ -65,6 +62,11 @@ namespace Multiplayer return &m_networkEntityAuthorityTracker; } + MultiplayerComponentRegistry* NetworkEntityManager::GetMultiplayerComponentRegistry() + { + return &m_multiplayerComponentRegistry; + } + HostId NetworkEntityManager::GetHostId() const { return m_hostId; @@ -147,7 +149,6 @@ namespace Multiplayer //{ // rootSlice->RemoveEntity(entity); //} - m_nonNetworkedEntities.clear(); m_networkEntityTracker.clear(); } @@ -277,30 +278,6 @@ namespace Multiplayer } } - void NetworkEntityManager::OnEntityAdded(AZ::Entity* entity) - { - NetBindComponent* netBindComponent = entity->FindComponent<NetBindComponent>(); - if (netBindComponent != nullptr) - { - // @pereslav - // Note that this is a total hack.. we should not be listening to this event on a client - // Entities should instead be spawned by the prefabEntityId inside EntityReplicationManager::HandlePropertyChangeMessage() - const bool isClient = AZ::Interface<IMultiplayer>::Get()->GetAgentType() == MultiplayerAgentType::Client; - const NetEntityRole netEntityRole = isClient ? NetEntityRole::Client: NetEntityRole::Authority; - const NetEntityId netEntityId = m_nextEntityId++; - netBindComponent->PreInit(entity, PrefabEntityId(), netEntityId, netEntityRole); - } - } - - void NetworkEntityManager::OnEntityRemoved(AZ::Entity* entity) - { - NetBindComponent* netBindComponent = entity->FindComponent<NetBindComponent>(); - if (netBindComponent != nullptr) - { - MarkForRemoval(netBindComponent->GetEntityHandle()); - } - } - void NetworkEntityManager::RemoveEntities() { //RewindableObjectState::ClearRewoundEntities(); @@ -339,4 +316,165 @@ namespace Multiplayer m_networkEntityTracker.erase(entityId); } } + + INetworkEntityManager::EntityList NetworkEntityManager::CreateEntitiesImmediate( + const AzFramework::Spawnable& spawnable, NetEntityRole netEntityRole) + { + INetworkEntityManager::EntityList returnList; + + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + + const AzFramework::Spawnable::EntityList& entities = spawnable.GetEntities(); + size_t entitiesSize = entities.size(); + + for (size_t i = 0; i < entitiesSize; ++i) + { + AZ::Entity* clone = serializeContext->CloneObject(entities[i].get()); + AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); + clone->SetId(AZ::Entity::MakeId()); + + NetBindComponent* netBindComponent = clone->FindComponent<NetBindComponent>(); + if (netBindComponent != nullptr) + { + PrefabEntityId prefabEntityId; + prefabEntityId.m_prefabName = m_networkPrefabLibrary.GetPrefabNameFromAssetId(spawnable.GetId()); + prefabEntityId.m_entityOffset = aznumeric_cast<uint32_t>(i); + + const NetEntityId netEntityId = NextId(); + netBindComponent->PreInit(clone, prefabEntityId, netEntityId, netEntityRole); + + AzFramework::GameEntityContextRequestBus::Broadcast( + &AzFramework::GameEntityContextRequestBus::Events::AddGameEntity, clone); + + returnList.push_back(netBindComponent->GetEntityHandle()); + + } + else + { + delete clone; + } + } + + return returnList; + } + + INetworkEntityManager::EntityList NetworkEntityManager::CreateEntitiesImmediate( + const PrefabEntityId& prefabEntryId, NetEntityId netEntityId, NetEntityRole netEntityRole, + const AZ::Transform& transform) + { + INetworkEntityManager::EntityList returnList; + + // TODO: Implement for non-root spawnables + auto spawnableAssetId = m_networkPrefabLibrary.GetAssetIdByName(prefabEntryId.m_prefabName); + if (spawnableAssetId == m_rootSpawnableAsset.GetId()) + { + AzFramework::Spawnable* netSpawnable = m_rootSpawnableAsset.GetAs<AzFramework::Spawnable>(); + if (!netSpawnable) + { + return returnList; + } + + const uint32_t entityIndex = prefabEntryId.m_entityOffset; + + if (entityIndex == PrefabEntityId::AllIndices) + { + return CreateEntitiesImmediate(*netSpawnable, netEntityRole); + } + + const AzFramework::Spawnable::EntityList& entities = netSpawnable->GetEntities(); + size_t entitiesSize = entities.size(); + if (entityIndex >= entitiesSize) + { + return returnList; + } + + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + + AZ::Entity* clone = serializeContext->CloneObject(entities[entityIndex].get()); + AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); + clone->SetId(AZ::Entity::MakeId()); + + NetBindComponent* netBindComponent = clone->FindComponent<NetBindComponent>(); + if (netBindComponent) + { + netBindComponent->PreInit(clone, prefabEntryId, netEntityId, netEntityRole); + + auto* transformComponent = clone->FindComponent<AzFramework::TransformComponent>(); + if (transformComponent) + { + transformComponent->SetWorldTM(transform); + } + + AzFramework::GameEntityContextRequestBus::Broadcast( + &AzFramework::GameEntityContextRequestBus::Events::AddGameEntity, clone); + + returnList.push_back(netBindComponent->GetEntityHandle()); + } + } + + return returnList; + } + + Multiplayer::NetEntityId NetworkEntityManager::NextId() + { + const NetEntityId netEntityId = m_nextEntityId++; + return netEntityId; + } + + void NetworkEntityManager::OnRootSpawnableAssigned( + AZ::Data::Asset<AzFramework::Spawnable> rootSpawnable, [[maybe_unused]] uint32_t generation) + { + AzFramework::Spawnable* rootSpawnableData = rootSpawnable.GetAs<AzFramework::Spawnable>(); + const auto& entityList = rootSpawnableData->GetEntities(); + if (entityList.size() == 0) + { + AZ_Error("NetworkEntityManager", false, "OnRootSpawnableAssigned: Root spawnable doesn't have any entities."); + return; + } + + const auto& rootEntity = entityList[0]; + auto* spawnableHolder = rootEntity->FindComponent<NetworkSpawnableHolderComponent>(); + if (!spawnableHolder) + { + AZ_Error("NetworkEntityManager", false, "OnRootSpawnableAssigned: Root entity doesn't have NetworkSpawnableHolderComponent."); + return; + } + + AZ::Data::Asset<AzFramework::Spawnable> netSpawnableAsset = spawnableHolder->GetNetworkSpawnableAsset(); + AzFramework::Spawnable* netSpawnable = netSpawnableAsset.GetAs<AzFramework::Spawnable>(); + if (!netSpawnable) + { + // TODO: Temp sync load until JsonSerialization of loadBehavior is fixed. + netSpawnableAsset = AZ::Data::AssetManager::Instance().GetAsset<AzFramework::Spawnable>( + netSpawnableAsset.GetId(), AZ::Data::AssetLoadBehavior::PreLoad); + AZ::Data::AssetManager::Instance().BlockUntilLoadComplete(netSpawnableAsset); + + netSpawnable = netSpawnableAsset.GetAs<AzFramework::Spawnable>(); + } + + if (!netSpawnable) + { + AZ_Error("NetworkEntityManager", false, "OnRootSpawnableAssigned: Net spawnable doesn't have any data."); + return; + } + + m_rootSpawnableAsset = netSpawnableAsset; + + const auto agentType = AZ::Interface<IMultiplayer>::Get()->GetAgentType(); + const bool spawnImmediately = + (agentType == MultiplayerAgentType::ClientServer || agentType == MultiplayerAgentType::DedicatedServer); + + if (spawnImmediately) + { + CreateEntitiesImmediate(*netSpawnable, NetEntityRole::Authority); + } + } + + void NetworkEntityManager::OnRootSpawnableReleased([[maybe_unused]] uint32_t generation) + { + // TODO: Do we need to clear all entities here? + m_rootSpawnableAsset.Release(); + } } diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h index b154983f4c..46f59f3762 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.h @@ -14,11 +14,14 @@ #include <AzCore/EBus/ScheduledEvent.h> #include <AzCore/Component/ComponentApplicationBus.h> +#include <AzFramework/Spawnable/RootSpawnableInterface.h> #include <Source/NetworkEntity/INetworkEntityManager.h> #include <Source/NetworkEntity/NetworkEntityAuthorityTracker.h> #include <Source/NetworkEntity/NetworkEntityTracker.h> #include <Source/NetworkEntity/NetworkEntityRpcMessage.h> #include <Source/EntityDomains/IEntityDomain.h> +#include <Source/NetworkEntity/NetworkSpawnableLibrary.h> +#include <Source/Components/MultiplayerComponentRegistry.h> namespace Multiplayer { @@ -26,6 +29,7 @@ namespace Multiplayer //! This class creates and manages all networked entities. class NetworkEntityManager final : public INetworkEntityManager + , public AzFramework::RootSpawnableNotificationBus::Handler { public: NetworkEntityManager(); @@ -38,8 +42,16 @@ namespace Multiplayer //! @{ NetworkEntityTracker* GetNetworkEntityTracker() override; NetworkEntityAuthorityTracker* GetNetworkEntityAuthorityTracker() override; + MultiplayerComponentRegistry* GetMultiplayerComponentRegistry() override; HostId GetHostId() const override; ConstNetworkEntityHandle GetEntity(NetEntityId netEntityId) const override; + + EntityList CreateEntitiesImmediate(const AzFramework::Spawnable& spawnable, NetEntityRole netEntityRole); + + EntityList CreateEntitiesImmediate( + const PrefabEntityId& prefabEntryId, NetEntityId netEntityId, NetEntityRole netEntityRole, + const AZ::Transform& transform) override; + uint32_t GetEntityCount() const override; NetworkEntityHandle AddEntityToEntityMap(NetEntityId netEntityId, AZ::Entity* entity) override; void MarkForRemoval(const ConstNetworkEntityHandle& entityHandle) override; @@ -61,19 +73,23 @@ namespace Multiplayer void DispatchLocalDeferredRpcMessages(); void UpdateEntityDomain(); void OnEntityExitDomain(NetEntityId entityId); + //! RootSpawnableNotificationBus + //! @{ + void OnRootSpawnableAssigned(AZ::Data::Asset<AzFramework::Spawnable> rootSpawnable, uint32_t generation) override; + void OnRootSpawnableReleased(uint32_t generation) override; + //! @} private: - - void OnEntityAdded(AZ::Entity* entity); - void OnEntityRemoved(AZ::Entity* entity); void RemoveEntities(); + NetEntityId NextId(); + NetworkEntityTracker m_networkEntityTracker; NetworkEntityAuthorityTracker m_networkEntityAuthorityTracker; + MultiplayerComponentRegistry m_multiplayerComponentRegistry; + AZ::ScheduledEvent m_removeEntitiesEvent; AZStd::vector<NetEntityId> m_removeList; - AZStd::vector<AZ::Entity*> m_nonNetworkedEntities; // Contains entities that we've instantiated, but are not networked entities - AZStd::unique_ptr<IEntityDomain> m_entityDomain; AZ::ScheduledEvent m_updateEntityDomainEvent; @@ -85,8 +101,6 @@ namespace Multiplayer AZ::Event<> m_onEntityNotifyChanges; ControllersActivatedEvent m_controllersActivatedEvent; ControllersDeactivatedEvent m_controllersDeactivatedEvent; - AZ::EntityAddedEvent::Handler m_entityAddedEventHandler; - AZ::EntityRemovedEvent::Handler m_entityRemovedEventHandler; HostId m_hostId = InvalidHostId; NetEntityId m_nextEntityId = NetEntityId{ 0 }; @@ -95,5 +109,8 @@ namespace Multiplayer // This is done to prevent local and network sent RPC's from having different dispatch behaviours typedef AZStd::deque<NetworkEntityRpcMessage> DeferredRpcMessages; DeferredRpcMessages m_localDeferredRpcMessages; + + NetworkSpawnableLibrary m_networkPrefabLibrary; + AZ::Data::Asset<AzFramework::Spawnable> m_rootSpawnableAsset; }; } diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.cpp index cde8367bc6..4bfc753f75 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.cpp @@ -21,7 +21,7 @@ namespace Multiplayer : m_rpcDeliveryType(rhs.m_rpcDeliveryType) , m_entityId(rhs.m_entityId) , m_componentId(rhs.m_componentId) - , m_rpcMessageType(rhs.m_rpcMessageType) + , m_rpcIndex(rhs.m_rpcIndex) , m_data(AZStd::move(rhs.m_data)) , m_isReliable(rhs.m_isReliable) { @@ -32,7 +32,7 @@ namespace Multiplayer : m_rpcDeliveryType(rhs.m_rpcDeliveryType) , m_entityId(rhs.m_entityId) , m_componentId(rhs.m_componentId) - , m_rpcMessageType(rhs.m_rpcMessageType) + , m_rpcIndex(rhs.m_rpcIndex) , m_isReliable(rhs.m_isReliable) { if (rhs.m_data != nullptr) @@ -42,11 +42,11 @@ namespace Multiplayer } } - NetworkEntityRpcMessage::NetworkEntityRpcMessage(RpcDeliveryType rpcDeliveryType, NetEntityId entityId, NetComponentId componentId, uint8_t rpcMessageType, ReliabilityType isReliable) + NetworkEntityRpcMessage::NetworkEntityRpcMessage(RpcDeliveryType rpcDeliveryType, NetEntityId entityId, NetComponentId componentId, RpcIndex rpcIndex, ReliabilityType isReliable) : m_rpcDeliveryType(rpcDeliveryType) , m_entityId(entityId) , m_componentId(componentId) - , m_rpcMessageType(rpcMessageType) + , m_rpcIndex(rpcIndex) , m_isReliable(isReliable) { ; @@ -57,7 +57,7 @@ namespace Multiplayer m_rpcDeliveryType = rhs.m_rpcDeliveryType; m_entityId = rhs.m_entityId; m_componentId = rhs.m_componentId; - m_rpcMessageType = rhs.m_rpcMessageType; + m_rpcIndex = rhs.m_rpcIndex; m_isReliable = rhs.m_isReliable; m_data = AZStd::move(rhs.m_data); return *this; @@ -68,7 +68,7 @@ namespace Multiplayer m_rpcDeliveryType = rhs.m_rpcDeliveryType; m_entityId = rhs.m_entityId; m_componentId = rhs.m_componentId; - m_rpcMessageType = rhs.m_rpcMessageType; + m_rpcIndex = rhs.m_rpcIndex; m_isReliable = rhs.m_isReliable; if (rhs.m_data != nullptr) { @@ -85,7 +85,7 @@ namespace Multiplayer return ((m_rpcDeliveryType == rhs.m_rpcDeliveryType) && (m_entityId == rhs.m_entityId) && (m_componentId == rhs.m_componentId) - && (m_rpcMessageType == rhs.m_rpcMessageType)); + && (m_rpcIndex == rhs.m_rpcIndex)); } bool NetworkEntityRpcMessage::operator !=(const NetworkEntityRpcMessage& rhs) const @@ -98,7 +98,7 @@ namespace Multiplayer static constexpr uint32_t sizeOfFields = sizeof(RpcDeliveryType) + sizeof(NetEntityId) + sizeof(NetComponentId) - + sizeof(uint8_t); + + sizeof(RpcIndex); // 2-byte size header + the actual blob payload itself const uint32_t sizeOfBlob = (m_data != nullptr) ? sizeof(uint16_t) + m_data->GetSize() : 0; @@ -127,9 +127,9 @@ namespace Multiplayer return m_componentId; } - uint8_t NetworkEntityRpcMessage::GetRpcMessageType() const + RpcIndex NetworkEntityRpcMessage::GetRpcIndex() const { - return m_rpcMessageType; + return m_rpcIndex; } bool NetworkEntityRpcMessage::SetRpcParams(IRpcParamStruct& params) @@ -167,7 +167,7 @@ namespace Multiplayer serializer.Serialize(m_rpcDeliveryType, "RpcDeliveryType"); serializer.Serialize(m_entityId, "EntityId"); serializer.Serialize(m_componentId, "ComponentId"); - serializer.Serialize(m_rpcMessageType, "RpcMessageType"); + serializer.Serialize(m_rpcIndex, "RpcIndex"); // m_data should never be nullptr, it contains serialized data for our Rpc params struct if (m_data == nullptr) diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h index 503a5900bd..08b1960172 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityRpcMessage.h @@ -14,7 +14,7 @@ #include <AzNetworking/Serialization/ISerializer.h> #include <AzNetworking/DataStructures/ByteBuffer.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> namespace Multiplayer { @@ -35,12 +35,12 @@ namespace Multiplayer NetworkEntityRpcMessage(const NetworkEntityRpcMessage& rhs); //! Fill explicit constructor. - //! @param rpcDeliveryType the delivery type (origin and target) for this RPC - //! @param entityId the networked entityId of the entity handling this RPC - //! @param componentType the networked componentId of the component handling this RPC - //! @param rpcMessageType the component defined RPC type, so the component knows which RPC this message corresponds to - //! @param isReliable whether or not this RPC should be sent reliably - explicit NetworkEntityRpcMessage(RpcDeliveryType rpcDeliveryType, NetEntityId entityId, NetComponentId componentId, uint8_t rpcMessageType, ReliabilityType isReliable); + //! @param rpcDeliveryType the delivery type (origin and target) for this rpc + //! @param entityId the networked entityId of the entity handling this rpc + //! @param componentType the networked componentId of the component handling this rpc + //! @param rpcIndex the component defined rpc index, so the component knows which rpc this message corresponds to + //! @param isReliable whether or not this rpc should be sent reliably + explicit NetworkEntityRpcMessage(RpcDeliveryType rpcDeliveryType, NetEntityId entityId, NetComponentId componentId, RpcIndex rpcIndex, ReliabilityType isReliable); NetworkEntityRpcMessage& operator =(NetworkEntityRpcMessage&& rhs); NetworkEntityRpcMessage& operator =(const NetworkEntityRpcMessage& rhs); @@ -67,9 +67,9 @@ namespace Multiplayer //! @return the current value of EntityComponentType NetComponentId GetComponentId() const; - //! Gets the current value of RpcMessageType. - //! @return the current value of RpcMessageType - uint8_t GetRpcMessageType() const; + //! Gets the current value of RpcIndex. + //! @return the current value of RpcIndex + RpcIndex GetRpcIndex() const; //! Writes the data contained inside a_Params to this NetworkEntityRpcMessage's blob buffer. //! @param params the parameters to save inside this NetworkEntityRpcMessage instance @@ -98,7 +98,7 @@ namespace Multiplayer RpcDeliveryType m_rpcDeliveryType = RpcDeliveryType::None; NetEntityId m_entityId = InvalidNetEntityId; NetComponentId m_componentId = InvalidNetComponentId; - uint8_t m_rpcMessageType = 0; + RpcIndex m_rpcIndex = RpcIndex{ 0 }; // Only allocated if we actually have data // This is to prevent blowing out stack memory if we declare an array of these EntityUpdateMessages diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityTracker.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityTracker.h index 5c9d8485dd..ffc150e5cc 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityTracker.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityTracker.h @@ -12,7 +12,7 @@ #pragma once -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <Source/NetworkEntity/NetworkEntityHandle.h> #include <AzCore/std/containers/unordered_map.h> #include <AzCore/Component/Entity.h> diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.cpp index 63345e79a0..27c39ea135 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.cpp @@ -131,7 +131,7 @@ namespace Multiplayer } // 2-byte size header + the actual blob payload itself - const uint32_t sizeOfBlob = (m_data != nullptr) ? sizeof(uint16_t) + m_data->GetSize() : 0; + const uint32_t sizeOfBlob = (m_data != nullptr) ? sizeof(PropertyIndex) + m_data->GetSize() : 0; if (m_hasValidPrefabId) { diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.h index 481181e0b4..9ca539d75d 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityUpdateMessage.h @@ -15,7 +15,7 @@ #include <AzNetworking/Serialization/ISerializer.h> #include <AzNetworking/DataStructures/ByteBuffer.h> #include <AzCore/Name/Name.h> -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> namespace Multiplayer { diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.cpp new file mode 100644 index 0000000000..ad2e18e222 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.cpp @@ -0,0 +1,81 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <Source/NetworkEntity/NetworkSpawnableLibrary.h> +#include <AzCore/Asset/AssetManagerBus.h> +#include <AzFramework/Spawnable/Spawnable.h> +#include <AzCore/StringFunc/StringFunc.h> + +namespace Multiplayer +{ + NetworkSpawnableLibrary::NetworkSpawnableLibrary() + { + AzFramework::AssetCatalogEventBus::Handler::BusConnect(); + } + + NetworkSpawnableLibrary::~NetworkSpawnableLibrary() + { + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); + } + + void NetworkSpawnableLibrary::BuildPrefabsList() + { + auto enumerateCallback = [this](const AZ::Data::AssetId id, const AZ::Data::AssetInfo& info) + { + if (info.m_assetType == AZ::AzTypeInfo<AzFramework::Spawnable>::Uuid()) + { + ProcessSpawnableAsset(info.m_relativePath, id); + } + }; + + AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequests::EnumerateAssets, nullptr, + enumerateCallback, nullptr); + } + + void NetworkSpawnableLibrary::ProcessSpawnableAsset(const AZStd::string& relativePath, const AZ::Data::AssetId id) + { + const AZ::Name name = AZ::Name(relativePath); + m_spawnables[name] = id; + m_spawnablesReverseLookup[id] = name; + + } + + void NetworkSpawnableLibrary::OnCatalogLoaded([[maybe_unused]] const char* catalogFile) + { + BuildPrefabsList(); + } + + AZ::Name NetworkSpawnableLibrary::GetPrefabNameFromAssetId(AZ::Data::AssetId assetId) + { + if (assetId.IsValid()) + { + auto it = m_spawnablesReverseLookup.find(assetId); + if (it != m_spawnablesReverseLookup.end()) + { + return it->second; + } + } + + return {}; + } + + AZ::Data::AssetId NetworkSpawnableLibrary::GetAssetIdByName(AZ::Name name) + { + auto it = m_spawnables.find(name); + if (it != m_spawnables.end()) + { + return it->second; + } + + return {}; + } +} diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.h b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.h new file mode 100644 index 0000000000..a2c3d4ae56 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkSpawnableLibrary.h @@ -0,0 +1,43 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Asset/AssetCommon.h> +#include <AzCore/std/string/string.h> +#include <AzFramework/Asset/AssetCatalogBus.h> +#include <AzCore/Name/Name.h> + +namespace Multiplayer +{ + /// Implementation of the network prefab library interface. + class NetworkSpawnableLibrary final + : private AzFramework::AssetCatalogEventBus::Handler + { + public: + NetworkSpawnableLibrary(); + ~NetworkSpawnableLibrary(); + + void BuildPrefabsList(); + void ProcessSpawnableAsset(const AZStd::string& relativePath, AZ::Data::AssetId id); + + /// AssetCatalogEventBus overrides. + void OnCatalogLoaded(const char* catalogFile) override; + + AZ::Name GetPrefabNameFromAssetId(AZ::Data::AssetId assetId); + AZ::Data::AssetId GetAssetIdByName(AZ::Name name); + + private: + AZStd::unordered_map<AZ::Name, AZ::Data::AssetId> m_spawnables; + AZStd::unordered_map<AZ::Data::AssetId, AZ::Name> m_spawnablesReverseLookup; + }; +} diff --git a/Gems/Multiplayer/Code/Source/NetworkInput/IMultiplayerComponentInput.h b/Gems/Multiplayer/Code/Source/NetworkInput/IMultiplayerComponentInput.h index a87f8e0b47..b5df01a1a8 100644 --- a/Gems/Multiplayer/Code/Source/NetworkInput/IMultiplayerComponentInput.h +++ b/Gems/Multiplayer/Code/Source/NetworkInput/IMultiplayerComponentInput.h @@ -12,7 +12,7 @@ #pragma once -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <AzNetworking/DataStructures/FixedSizeBitset.h> #include <AzCore/std/containers/vector.h> #include <AzCore/std/smart_ptr/unique_ptr.h> diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.cpp b/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.cpp new file mode 100644 index 0000000000..84983b700e --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.cpp @@ -0,0 +1,35 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <Source/Pipeline/NetBindMarkerComponent.h> +#include <AzCore/Serialization/SerializeContext.h> + +namespace Multiplayer +{ + void NetBindMarkerComponent::Reflect(AZ::ReflectContext* context) + { + AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); + if (serializeContext) + { + serializeContext->Class<NetBindMarkerComponent, AZ::Component>() + ->Version(1); + } + } + + void NetBindMarkerComponent::Activate() + { + } + + void NetBindMarkerComponent::Deactivate() + { + } +} diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.h b/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.h new file mode 100644 index 0000000000..ebafead73c --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetBindMarkerComponent.h @@ -0,0 +1,39 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Component/Component.h> + +namespace Multiplayer +{ + //! @class NetBindMarkerComponent + //! @brief Component for tracking net entities in the original non-networked spawnable. + class NetBindMarkerComponent final : public AZ::Component + { + public: + AZ_COMPONENT(NetBindMarkerComponent, "{40612C1B-427D-45C6-A2F0-04E16DF5B718}"); + + static void Reflect(AZ::ReflectContext* context); + + NetBindMarkerComponent() = default; + ~NetBindMarkerComponent() override = default; + + //! AZ::Component overrides. + //! @{ + void Activate() override; + void Deactivate() override; + //! @} + + private: + }; +} // namespace Multiplayer diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp new file mode 100644 index 0000000000..2006272135 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.cpp @@ -0,0 +1,185 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <Source/Pipeline/NetworkPrefabProcessor.h> + +#include <AzCore/Serialization/Utils.h> +#include <AzFramework/Components/TransformComponent.h> +#include <AzFramework/Spawnable/Spawnable.h> +#include <AzToolsFramework/Prefab/Instance/Instance.h> +#include <AzToolsFramework/Prefab/PrefabDomUtils.h> +#include <Prefab/Spawnable/SpawnableUtils.h> +#include <Source/Components/NetBindComponent.h> +#include <Source/Pipeline/NetBindMarkerComponent.h> +#include <Source/Pipeline/NetworkSpawnableHolderComponent.h> + +namespace Multiplayer +{ + using AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessor; + using AzToolsFramework::Prefab::PrefabConversionUtils::ProcessedObjectStore; + + void NetworkPrefabProcessor::Process(PrefabProcessorContext& context) + { + context.ListPrefabs([&context](AZStd::string_view prefabName, PrefabDom& prefab) { + ProcessPrefab(context, prefabName, prefab); + }); + } + + void NetworkPrefabProcessor::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); serializeContext != nullptr) + { + serializeContext->Class<NetworkPrefabProcessor, PrefabProcessor>()->Version(1); + } + } + + static AZStd::vector<AZ::Entity*> GetEntitiesFromInstance(AZStd::unique_ptr<AzToolsFramework::Prefab::Instance>& instance) + { + AZStd::vector<AZ::Entity*> result; + + instance->GetNestedEntities([&result](const AZStd::unique_ptr<AZ::Entity>& entity) { + result.emplace_back(entity.get()); + return true; + }); + + if (instance->HasContainerEntity()) + { + auto containerEntityReference = instance->GetContainerEntity(); + result.emplace_back(&containerEntityReference->get()); + } + + return result; + } + void NetworkPrefabProcessor::ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab) + { + using namespace AzToolsFramework::Prefab; + + // convert Prefab DOM into Prefab Instance. + AZStd::unique_ptr<Instance> sourceInstance(aznew Instance()); + if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*sourceInstance, prefab, + PrefabDomUtils::LoadInstanceFlags::AssignRandomEntityId)) + { + PrefabDomValueReference sourceReference = PrefabDomUtils::FindPrefabDomValue(prefab, PrefabDomUtils::SourceName); + + AZStd::string errorMessage("NetworkPrefabProcessor: Failed to Load Prefab Instance from given Prefab Dom."); + if (sourceReference.has_value() && sourceReference->get().IsString() && sourceReference->get().GetStringLength() != 0) + { + AZStd::string_view source(sourceReference->get().GetString(), sourceReference->get().GetStringLength()); + errorMessage += AZStd::string::format("Prefab Source: %.*s", AZ_STRING_ARG(source)); + } + AZ_Error("NetworkPrefabProcessor", false, errorMessage.c_str()); + return; + } + + AZStd::string uniqueName = prefabName; + uniqueName += ".network.spawnable"; + + auto serializer = [](AZStd::vector<uint8_t>& output, const ProcessedObjectStore& object) -> bool { + AZ::IO::ByteContainerStream stream(&output); + auto& asset = object.GetAsset(); + return AZ::Utils::SaveObjectToStream(stream, AZ::DataStream::ST_JSON, &asset, asset.GetType()); + }; + + auto&& [object, networkSpawnable] = + ProcessedObjectStore::Create<AzFramework::Spawnable>(uniqueName, context.GetSourceUuid(), AZStd::move(serializer)); + + // grab all nested entities from the Instance as source entities. + AZStd::vector<AZ::Entity*> sourceEntities = GetEntitiesFromInstance(sourceInstance); + AZStd::vector<AZ::EntityId> networkedEntityIds; + networkedEntityIds.reserve(sourceEntities.size()); + + for (auto* sourceEntity : sourceEntities) + { + if (sourceEntity->FindComponent<NetBindComponent>()) + { + networkedEntityIds.push_back(sourceEntity->GetId()); + } + } + if (!PrefabDomUtils::StoreInstanceInPrefabDom(*sourceInstance, prefab)) + { + AZ_Error("NetworkPrefabProcessor", false, "Saving exported Prefab Instance within a Prefab Dom failed."); + return; + } + + AZStd::unique_ptr<Instance> networkInstance(aznew Instance()); + + for (auto entityId : networkedEntityIds) + { + AZ::Entity* netEntity = sourceInstance->DetachEntity(entityId).release(); + + networkInstance->AddEntity(*netEntity); + + AZ::Entity* breadcrumbEntity = aznew AZ::Entity(netEntity->GetName()); + breadcrumbEntity->SetRuntimeActiveByDefault(netEntity->IsRuntimeActiveByDefault()); + breadcrumbEntity->CreateComponent<NetBindMarkerComponent>(); + AzFramework::TransformComponent* transformComponent = netEntity->FindComponent<AzFramework::TransformComponent>(); + breadcrumbEntity->CreateComponent<AzFramework::TransformComponent>(*transformComponent); + + // TODO: Configure NetBindMarkerComponent to refer to the net entity + sourceInstance->AddEntity(*breadcrumbEntity); + } + + // Add net spawnable asset holder + { + AZ::Data::AssetId assetId = networkSpawnable->GetId(); + AZ::Data::Asset<AzFramework::Spawnable> networkSpawnableAsset; + networkSpawnableAsset.Create(assetId); + networkSpawnableAsset.SetAutoLoadBehavior(AZ::Data::AssetLoadBehavior::PreLoad); + + EntityOptionalReference containerEntityRef = sourceInstance->GetContainerEntity(); + if (containerEntityRef.has_value()) + { + auto* networkSpawnableHolderComponent = containerEntityRef.value().get().CreateComponent<NetworkSpawnableHolderComponent>(); + networkSpawnableHolderComponent->SetNetworkSpawnableAsset(networkSpawnableAsset); + } + else + { + AZ::Entity* networkSpawnableHolderEntity = aznew AZ::Entity(uniqueName); + auto* networkSpawnableHolderComponent = networkSpawnableHolderEntity->CreateComponent<NetworkSpawnableHolderComponent>(); + networkSpawnableHolderComponent->SetNetworkSpawnableAsset(networkSpawnableAsset); + sourceInstance->AddEntity(*networkSpawnableHolderEntity); + } + } + + // save the final result in the target Prefab DOM. + PrefabDom networkPrefab; + if (!PrefabDomUtils::StoreInstanceInPrefabDom(*networkInstance, networkPrefab)) + { + AZ_Error("NetworkPrefabProcessor", false, "Saving exported Prefab Instance within a Prefab Dom failed."); + return; + } + + if (!PrefabDomUtils::StoreInstanceInPrefabDom(*sourceInstance, prefab)) + { + AZ_Error("NetworkPrefabProcessor", false, "Saving exported Prefab Instance within a Prefab Dom failed."); + return; + } + + + bool result = SpawnableUtils::CreateSpawnable(*networkSpawnable, networkPrefab); + if (result) + { + AzFramework::Spawnable::EntityList& entities = networkSpawnable->GetEntities(); + for (auto it = entities.begin(); it != entities.end(); ++it) + { + (*it)->InvalidateDependencies(); + (*it)->EvaluateDependencies(); + } + context.GetProcessedObjects().push_back(AZStd::move(object)); + } + else + { + AZ_Error("Prefabs", false, "Failed to convert prefab '%.*s' to a spawnable.", AZ_STRING_ARG(prefabName)); + context.ErrorEncountered(); + } + } +} diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.h b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.h new file mode 100644 index 0000000000..ea927a1453 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkPrefabProcessor.h @@ -0,0 +1,43 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#pragma once + +#include <AzToolsFramework/Prefab/Spawnable/PrefabProcessor.h> + +namespace AzToolsFramework::Prefab::PrefabConversionUtils +{ + class PrefabProcessorContext; +} + +namespace Multiplayer +{ + using AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessor; + using AzToolsFramework::Prefab::PrefabConversionUtils::PrefabProcessorContext; + using AzToolsFramework::Prefab::PrefabDom; + + class NetworkPrefabProcessor : public PrefabProcessor + { + public: + AZ_CLASS_ALLOCATOR(NetworkPrefabProcessor, AZ::SystemAllocator, 0); + AZ_RTTI(NetworkPrefabProcessor, "{AF6C36DA-CBB9-4DF4-AE2D-7BC6CCE65176}", PrefabProcessor); + + ~NetworkPrefabProcessor() override = default; + + void Process(PrefabProcessorContext& context) override; + + static void Reflect(AZ::ReflectContext* context); + + protected: + static void ProcessPrefab(PrefabProcessorContext& context, AZStd::string_view prefabName, PrefabDom& prefab); + }; +} diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.cpp b/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.cpp new file mode 100644 index 0000000000..6087376b30 --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.cpp @@ -0,0 +1,50 @@ +/* + * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or + * its licensors. + * + * For complete copyright and license terms please see the LICENSE at the root of this + * distribution (the "License"). All use of this software is governed by the License, + * or, if provided, by the license below or the license accompanying this file. Do not + * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + */ + +#include <Source/Pipeline/NetworkSpawnableHolderComponent.h> +#include <AzCore/Serialization/SerializeContext.h> + +namespace Multiplayer +{ + void NetworkSpawnableHolderComponent::Reflect(AZ::ReflectContext* context) + { + AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); + if (serializeContext) + { + serializeContext->Class<NetworkSpawnableHolderComponent, AZ::Component>() + ->Version(1) + ->Field("AssetRef", &NetworkSpawnableHolderComponent::m_networkSpawnableAsset); + } + } + + NetworkSpawnableHolderComponent::NetworkSpawnableHolderComponent() + { + } + + void NetworkSpawnableHolderComponent::Activate() + { + } + + void NetworkSpawnableHolderComponent::Deactivate() + { + } + + void NetworkSpawnableHolderComponent::SetNetworkSpawnableAsset(AZ::Data::Asset<AzFramework::Spawnable> networkSpawnableAsset) + { + m_networkSpawnableAsset = networkSpawnableAsset; + } + + AZ::Data::Asset<AzFramework::Spawnable> NetworkSpawnableHolderComponent::GetNetworkSpawnableAsset() + { + return m_networkSpawnableAsset; + } +} diff --git a/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.h b/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.h new file mode 100644 index 0000000000..54a9a4e42f --- /dev/null +++ b/Gems/Multiplayer/Code/Source/Pipeline/NetworkSpawnableHolderComponent.h @@ -0,0 +1,45 @@ +/* +* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +* its licensors. +* +* For complete copyright and license terms please see the LICENSE at the root of this +* distribution (the "License"). All use of this software is governed by the License, +* or, if provided, by the license below or the license accompanying this file. Do not +* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* +*/ + +#pragma once + +#include <AzCore/Component/Component.h> +#include <AzCore/Asset/AssetCommon.h> +#include <AzFramework/Spawnable/Spawnable.h> + +namespace Multiplayer +{ + //! @class NetworkSpawnableHolderComponent + //! @brief Component for holding a reference to the network spawnable to make sure it is loaded with the original one. + class NetworkSpawnableHolderComponent final : public AZ::Component + { + public: + AZ_COMPONENT(NetworkSpawnableHolderComponent, "{B0E3ADEE-FCB4-4A32-8D4F-6920F1CB08E4}"); + + static void Reflect(AZ::ReflectContext* context); + + NetworkSpawnableHolderComponent();; + ~NetworkSpawnableHolderComponent() override = default; + + //! AZ::Component overrides. + //! @{ + void Activate() override; + void Deactivate() override; + //! @} + + void SetNetworkSpawnableAsset(AZ::Data::Asset<AzFramework::Spawnable> networkSpawnableAsset); + AZ::Data::Asset<AzFramework::Spawnable> GetNetworkSpawnableAsset(); + + private: + AZ::Data::Asset<AzFramework::Spawnable> m_networkSpawnableAsset{ AZ::Data::AssetLoadBehavior::PreLoad }; + }; +} // namespace Multiplayer diff --git a/Gems/Multiplayer/Code/Source/ReplicationWindows/IReplicationWindow.h b/Gems/Multiplayer/Code/Source/ReplicationWindows/IReplicationWindow.h index bc0e909dcd..27c14f8049 100644 --- a/Gems/Multiplayer/Code/Source/ReplicationWindows/IReplicationWindow.h +++ b/Gems/Multiplayer/Code/Source/ReplicationWindows/IReplicationWindow.h @@ -12,7 +12,7 @@ #pragma once -#include <Source/MultiplayerTypes.h> +#include <Include/MultiplayerTypes.h> #include <Source/NetworkEntity/NetworkEntityHandle.h> #include <AzCore/std/containers/unordered_map.h> diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac_files.cmake b/Gems/Multiplayer/Code/multiplayer_debug_files.cmake similarity index 66% rename from Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac_files.cmake rename to Gems/Multiplayer/Code/multiplayer_debug_files.cmake index f0296f198b..8d0b121735 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Mac/platform_mac_files.cmake +++ b/Gems/Multiplayer/Code/multiplayer_debug_files.cmake @@ -10,6 +10,10 @@ # set(FILES - ../Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp - AtomShim_Renderer_Mac.cpp + Source/Multiplayer_precompiled.cpp + Source/Multiplayer_precompiled.h + Source/Debug/MultiplayerDebugModule.cpp + Source/Debug/MultiplayerDebugModule.h + Source/Debug/MultiplayerDebugSystemComponent.cpp + Source/Debug/MultiplayerDebugSystemComponent.h ) diff --git a/Gems/Multiplayer/Code/multiplayer_files.cmake b/Gems/Multiplayer/Code/multiplayer_files.cmake index 275625b8b4..f26e40355e 100644 --- a/Gems/Multiplayer/Code/multiplayer_files.cmake +++ b/Gems/Multiplayer/Code/multiplayer_files.cmake @@ -11,11 +11,13 @@ set(FILES Include/IMultiplayer.h + Include/MultiplayerStats.cpp + Include/MultiplayerStats.h + Include/MultiplayerTypes.h Source/Multiplayer_precompiled.cpp Source/Multiplayer_precompiled.h Source/MultiplayerSystemComponent.cpp Source/MultiplayerSystemComponent.h - Source/MultiplayerTypes.h Source/AutoGen/AutoComponent_Header.jinja Source/AutoGen/AutoComponent_Source.jinja Source/AutoGen/AutoComponent_Common.jinja @@ -26,6 +28,8 @@ set(FILES Source/AutoGen/NetworkTransformComponent.AutoComponent.xml Source/Components/LocalPredictionPlayerInputComponent.cpp Source/Components/LocalPredictionPlayerInputComponent.h + Source/Components/MultiplayerComponentRegistry.cpp + Source/Components/MultiplayerComponentRegistry.h Source/Components/MultiplayerComponent.cpp Source/Components/MultiplayerComponent.h Source/Components/MultiplayerController.cpp @@ -63,6 +67,8 @@ set(FILES Source/NetworkEntity/NetworkEntityHandle.inl Source/NetworkEntity/NetworkEntityManager.cpp Source/NetworkEntity/NetworkEntityManager.h + Source/NetworkEntity/NetworkSpawnableLibrary.cpp + Source/NetworkEntity/NetworkSpawnableLibrary.h Source/NetworkEntity/NetworkEntityRpcMessage.cpp Source/NetworkEntity/NetworkEntityRpcMessage.h Source/NetworkEntity/NetworkEntityTracker.cpp @@ -84,6 +90,10 @@ set(FILES Source/NetworkTime/NetworkTime.h Source/NetworkTime/RewindableObject.h Source/NetworkTime/RewindableObject.inl + Source/Pipeline/NetBindMarkerComponent.cpp + Source/Pipeline/NetBindMarkerComponent.h + Source/Pipeline/NetworkSpawnableHolderComponent.cpp + Source/Pipeline/NetworkSpawnableHolderComponent.h Source/ReplicationWindows/NullReplicationWindow.cpp Source/ReplicationWindows/NullReplicationWindow.h Source/ReplicationWindows/IReplicationWindow.h diff --git a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux_files.cmake b/Gems/Multiplayer/Code/multiplayer_tools_files.cmake similarity index 68% rename from Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux_files.cmake rename to Gems/Multiplayer/Code/multiplayer_tools_files.cmake index 52ed52bc87..1be02fd999 100644 --- a/Gems/AtomLyIntegration/CryRenderAtomShim/Platform/Linux/platform_linux_files.cmake +++ b/Gems/Multiplayer/Code/multiplayer_tools_files.cmake @@ -10,5 +10,10 @@ # set(FILES - ../Common/Unimplemented/AtomShim_Renderer_Unimplemented.cpp + Source/Multiplayer_precompiled.cpp + Source/Multiplayer_precompiled.h + Source/Pipeline/NetworkPrefabProcessor.cpp + Source/Pipeline/NetworkPrefabProcessor.h + Source/MultiplayerToolsModule.h + Source/MultiplayerToolsModule.cpp ) diff --git a/Gems/Multiplayer/Registry/prefab.tools.setreg b/Gems/Multiplayer/Registry/prefab.tools.setreg new file mode 100644 index 0000000000..4f20f88df9 --- /dev/null +++ b/Gems/Multiplayer/Registry/prefab.tools.setreg @@ -0,0 +1,26 @@ +{ + "Amazon": + { + "Tools": + { + "Prefab": + { + "Processing": + { + "Stack": + { + "GameObjectCreation": + [ + { "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::EditorInfoRemover" }, + { "$type": "{AF6C36DA-CBB9-4DF4-AE2D-7BC6CCE65176}" }, + { + "$type": "AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor", + "SerializationFormat": "Text" // Options are "Binary" (default) or "Text". Prefer "Binary" for performance. + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/Gems/MultiplayerCompression/Code/multiplayercompression.waf_files b/Gems/MultiplayerCompression/Code/multiplayercompression.waf_files index 82e73da384..f961725685 100644 --- a/Gems/MultiplayerCompression/Code/multiplayercompression.waf_files +++ b/Gems/MultiplayerCompression/Code/multiplayercompression.waf_files @@ -19,4 +19,4 @@ "Source/MultiplayerCompressionSystemComponent.h" ] } -} \ No newline at end of file +} diff --git a/Gems/MultiplayerCompression/Code/multiplayercompression_shared_files.cmake b/Gems/MultiplayerCompression/Code/multiplayercompression_shared_files.cmake index d922bacd57..ba2508218e 100644 --- a/Gems/MultiplayerCompression/Code/multiplayercompression_shared_files.cmake +++ b/Gems/MultiplayerCompression/Code/multiplayercompression_shared_files.cmake @@ -11,4 +11,4 @@ set(FILES Source/MultiplayerCompressionModule.cpp -) \ No newline at end of file +) diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo index 92c20c02ac..0036fa39f9 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo @@ -132,16 +132,20 @@ "RootNode.chicken_skeleton.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint", "RootNode.chicken_feet_skin.SkinWeight_0", + "RootNode.chicken_feet_skin.transform", "RootNode.chicken_feet_skin.map1", "RootNode.chicken_feet_skin.chicken_body_mat", "RootNode.chicken_eyes_skin.SkinWeight_0", + "RootNode.chicken_eyes_skin.transform", "RootNode.chicken_eyes_skin.uvSet1", "RootNode.chicken_eyes_skin.chicken_eye_mat", "RootNode.chicken_body_skin.SkinWeight_0", + "RootNode.chicken_body_skin.transform", "RootNode.chicken_body_skin.map1", "RootNode.chicken_body_skin.chicken_body_mat", + "RootNode.chicken_mohawk.Col0", "RootNode.chicken_mohawk.SkinWeight_0", - "RootNode.chicken_mohawk.colorSet1", + "RootNode.chicken_mohawk.transform", "RootNode.chicken_mohawk.map1", "RootNode.chicken_mohawk.mohawkMat", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.transform", @@ -228,7 +232,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.chicken_mohawk", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_body_mat.material b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_body_mat.material index fb752ed761..2ebfc261b7 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_body_mat.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_body_mat.material @@ -27,4 +27,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_eye_mat.material b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_eye_mat.material index 8bfc5ca136..87c8b7dab5 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_eye_mat.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_chicken_eye_mat.material @@ -27,4 +27,4 @@ "factor": 1.0 } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_mohawkmat.material b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_mohawkmat.material index 3e67d6075b..7e12d7fdee 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_mohawkmat.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken_mohawkmat.material @@ -29,4 +29,4 @@ "mode": "Blended" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo index 88fef4a2cd..cbde27b201 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo @@ -7,7 +7,8 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.colorSet1", + "RootNode.pPlane1.Col0", + "RootNode.pPlane1.transform", "RootNode.pPlane1.map1", "RootNode.pPlane1.lambert1" ] @@ -24,7 +25,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.pPlane1", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } @@ -33,4 +34,4 @@ "id": "{9D0F5F7F-FB90-5C00-97A7-C55F9180CE4E}" } ] -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.material b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.material index 9bc75c7189..8d645287f6 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.material @@ -19,4 +19,4 @@ "mode": "Cutout" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo index 9a21c3adc7..1636e063a7 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo @@ -7,8 +7,8 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", + "RootNode.pPlane1.Col0", "RootNode.pPlane1.transform", - "RootNode.pPlane1.colorSet1", "RootNode.pPlane1.map1", "RootNode.pPlane1.lambert1" ] @@ -25,7 +25,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.pPlane1", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } @@ -34,4 +34,4 @@ "id": "{3A467F2C-C2AB-581F-94E3-946575011973}" } ] -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.material b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.material index 0efbc2fd14..9340723882 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.material @@ -19,4 +19,4 @@ "mode": "Cutout" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo index 6256b0d521..aea3110a42 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo @@ -7,7 +7,8 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.colorSet1", + "RootNode.pPlane1.Col0", + "RootNode.pPlane1.transform", "RootNode.pPlane1.map1", "RootNode.pPlane1.lambert1" ] @@ -24,7 +25,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.pPlane1", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } @@ -33,4 +34,4 @@ "id": "{105338D3-5947-5F72-A077-36C193C8AE7C}" } ] -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.material b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.material index 904c57fa24..682be41887 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.material @@ -19,4 +19,4 @@ "mode": "Cutout" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo index ef5ffa8618..d23b92be9f 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo @@ -7,7 +7,8 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.colorSet1", + "RootNode.pPlane1.Col0", + "RootNode.pPlane1.transform", "RootNode.pPlane1.map1", "RootNode.pPlane1.lambert1" ] @@ -24,7 +25,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.pPlane1", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } @@ -33,4 +34,4 @@ "id": "{45EFD81A-7FBC-59E3-B495-280376B40AC5}" } ] -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.material b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.material index 771995ffe6..6ff5a554d3 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.material @@ -19,4 +19,4 @@ "mode": "Cutout" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo index 90e369f88e..6a56ea23cf 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo @@ -7,7 +7,8 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.colorSet1", + "RootNode.pPlane1.Col0", + "RootNode.pPlane1.transform", "RootNode.pPlane1.map1", "RootNode.pPlane1.lambert1" ] @@ -24,7 +25,7 @@ { "$type": "ClothRule", "meshNodeName": "RootNode.pPlane1", - "inverseMassesStreamName": "colorSet1", + "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" } @@ -33,4 +34,4 @@ "id": "{40E4554D-B904-50DF-90C6-98395C9DDE8C}" } ] -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.material b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.material index 7e577bf98e..c65a3afdbe 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.material +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.material @@ -19,4 +19,4 @@ "mode": "Cutout" } } -} \ No newline at end of file +} diff --git a/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice b/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice index e146d46fe2..6f64caf5f2 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice @@ -154,7 +154,7 @@ </Class> <Class name="EditorTransform" field="Transform Data" version="2" type="{B02B7063-D238-4F40-A724-405F7A6D68CB}"> <Class name="Vector3" field="Translate" value="0.0000000 0.0000000 0.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/> - <Class name="Vector3" field="Rotate" value="0.0000000 0.0000000 359.9999695" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/> + <Class name="Vector3" field="Rotate" value="0.0000000 0.0000000 -0.0000546" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/> <Class name="Vector3" field="Scale" value="1.0000000 1.0000000 1.0000000" type="{8379EB7D-01FA-4538-B64B-A6543B4BE73D}"/> <Class name="bool" field="Locked" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> </Class> @@ -379,20 +379,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="4115391834" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - </Class> - </Class> - <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> - <Class name="Asset" field="MaterialAsset" value="id={80F92051-203E-52CE-B4D6-E3AED21795C9}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/chicken/actor/chicken_mohawkmat.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> - <Class name="AZStd::unordered_map" field="PropertyOverrides" type="{6E6962E1-04C9-56F9-89C4-361031CC1384}"/> - </Class> - </Class> - <Class name="AZStd::pair" field="element" type="{F652A87A-0FDF-527C-B0ED-340C074A4874}"> - <Class name="AZ::Render::MaterialAssignmentId" field="value1" version="1" type="{EB603581-4654-4C17-B6DE-AE61E79EDA97}"> - <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> - <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> - <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3988576522" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="1541321207" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -405,7 +392,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="2328463833" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="668669130" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -413,6 +400,19 @@ <Class name="AZStd::unordered_map" field="PropertyOverrides" type="{6E6962E1-04C9-56F9-89C4-361031CC1384}"/> </Class> </Class> + <Class name="AZStd::pair" field="element" type="{F652A87A-0FDF-527C-B0ED-340C074A4874}"> + <Class name="AZ::Render::MaterialAssignmentId" field="value1" version="1" type="{EB603581-4654-4C17-B6DE-AE61E79EDA97}"> + <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> + <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="unsigned int" field="subId" value="2608524672" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> + <Class name="Asset" field="MaterialAsset" value="id={80F92051-203E-52CE-B4D6-E3AED21795C9}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/chicken/actor/chicken_mohawkmat.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="AZStd::unordered_map" field="PropertyOverrides" type="{6E6962E1-04C9-56F9-89C4-361031CC1384}"/> + </Class> + </Class> </Class> </Class> </Class> @@ -437,7 +437,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="2328463833" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="668669130" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={FB34D8F7-E8CA-542D-92A3-F0E04F3A3EC3}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/chicken/actor/chicken_chicken_body_mat.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -449,7 +449,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3988576522" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="1541321207" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={6114C408-26EE-51DC-8733-A07800BF4991}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/chicken/actor/chicken_chicken_eye_mat.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -461,7 +461,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="4115391834" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="2608524672" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={80F92051-203E-52CE-B4D6-E3AED21795C9}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/chicken/actor/chicken_mohawkmat.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -477,7 +477,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="2328463833" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="668669130" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -489,7 +489,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3988576522" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="1541321207" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -501,7 +501,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{3E4C6A29-92A4-523E-8739-F3E64957569E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="4115391834" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="2608524672" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice index 214e6ce3b0..c8709b3a6a 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice @@ -200,7 +200,7 @@ </Class> <Class name="AZ::Render::MeshComponentController" field="Controller" type="{D0F35FAC-4194-4C89-9487-D000DDB8B272}"> <Class name="AZ::Render::MeshComponentConfig" field="Configuration" version="1" type="{63737345-51B1-472B-9355-98F99993909B}"> - <Class name="Asset" field="ModelAsset" value="id={C3078003-51DA-5D8E-B311-38C426480DD2}:10e37787,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_blinds.azmodel},loadBehavior=0" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Asset" field="ModelAsset" value="id={C3078003-51DA-5D8E-B311-38C426480DD2}:10e37787,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_blinds.azmodel},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="AZ::s64" field="SortKey" value="0" type="{70D8A282-A1EA-462D-9D04-51EDE81FAC2F}"/> <Class name="unsigned char" field="LodOverride" value="255" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> <Class name="bool" field="ExcludeFromReflectionCubeMaps" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> @@ -228,7 +228,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{C3078003-51DA-5D8E-B311-38C426480DD2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -260,7 +260,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{C3078003-51DA-5D8E-B311-38C426480DD2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={6BFA7C7C-AF9F-5B12-8B30-6B6ECE9BAB9E}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/environment/cloth_blinds.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -276,7 +276,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{C3078003-51DA-5D8E-B311-38C426480DD2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice index 979616f8f3..e3ef330b3e 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice @@ -200,7 +200,7 @@ </Class> <Class name="AZ::Render::MeshComponentController" field="Controller" type="{D0F35FAC-4194-4C89-9487-D000DDB8B272}"> <Class name="AZ::Render::MeshComponentConfig" field="Configuration" version="1" type="{63737345-51B1-472B-9355-98F99993909B}"> - <Class name="Asset" field="ModelAsset" value="id={A64AD477-5E35-5834-A9A3-580B9D708E0C}:101c095a,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_blinds_broken.azmodel},loadBehavior=0" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Asset" field="ModelAsset" value="id={A64AD477-5E35-5834-A9A3-580B9D708E0C}:101c095a,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_blinds_broken.azmodel},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="AZ::s64" field="SortKey" value="0" type="{70D8A282-A1EA-462D-9D04-51EDE81FAC2F}"/> <Class name="unsigned char" field="LodOverride" value="255" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> <Class name="bool" field="ExcludeFromReflectionCubeMaps" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> @@ -228,7 +228,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{A64AD477-5E35-5834-A9A3-580B9D708E0C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -260,7 +260,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{A64AD477-5E35-5834-A9A3-580B9D708E0C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={EB6CB909-E4BB-54CB-8CAE-6A4B4F203B1B}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/environment/cloth_blinds_broken.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -276,7 +276,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{A64AD477-5E35-5834-A9A3-580B9D708E0C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice index b2bcb265fe..0a32a4191a 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice @@ -200,7 +200,7 @@ </Class> <Class name="AZ::Render::MeshComponentController" field="Controller" type="{D0F35FAC-4194-4C89-9487-D000DDB8B272}"> <Class name="AZ::Render::MeshComponentConfig" field="Configuration" version="1" type="{63737345-51B1-472B-9355-98F99993909B}"> - <Class name="Asset" field="ModelAsset" value="id={89C91D92-7B4E-5EB5-945D-0053111859EE}:10a5006e,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_corners_four.azmodel},loadBehavior=0" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Asset" field="ModelAsset" value="id={89C91D92-7B4E-5EB5-945D-0053111859EE}:10a5006e,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_corners_four.azmodel},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="AZ::s64" field="SortKey" value="0" type="{70D8A282-A1EA-462D-9D04-51EDE81FAC2F}"/> <Class name="unsigned char" field="LodOverride" value="255" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> <Class name="bool" field="ExcludeFromReflectionCubeMaps" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> @@ -228,7 +228,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{89C91D92-7B4E-5EB5-945D-0053111859EE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -260,7 +260,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{89C91D92-7B4E-5EB5-945D-0053111859EE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={838EA487-0F74-5448-AABE-947B138CD6C2}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/environment/cloth_locked_corners_four.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -276,7 +276,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{89C91D92-7B4E-5EB5-945D-0053111859EE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice index f93956890c..369cb76841 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice @@ -200,7 +200,7 @@ </Class> <Class name="AZ::Render::MeshComponentController" field="Controller" type="{D0F35FAC-4194-4C89-9487-D000DDB8B272}"> <Class name="AZ::Render::MeshComponentConfig" field="Configuration" version="1" type="{63737345-51B1-472B-9355-98F99993909B}"> - <Class name="Asset" field="ModelAsset" value="id={23C6817F-0B79-5CAD-B861-9E6F5E55927D}:10ba54b2,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_corners_two.azmodel},loadBehavior=0" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Asset" field="ModelAsset" value="id={23C6817F-0B79-5CAD-B861-9E6F5E55927D}:10ba54b2,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_corners_two.azmodel},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="AZ::s64" field="SortKey" value="0" type="{70D8A282-A1EA-462D-9D04-51EDE81FAC2F}"/> <Class name="unsigned char" field="LodOverride" value="255" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> <Class name="bool" field="ExcludeFromReflectionCubeMaps" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> @@ -228,7 +228,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{23C6817F-0B79-5CAD-B861-9E6F5E55927D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -260,7 +260,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{23C6817F-0B79-5CAD-B861-9E6F5E55927D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={A56F28DD-6082-50B6-9B44-9EF3E03E95BB}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/environment/cloth_locked_corners_two.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -276,7 +276,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{23C6817F-0B79-5CAD-B861-9E6F5E55927D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice index 0d6a7d7f30..b44a440d4d 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice @@ -200,7 +200,7 @@ </Class> <Class name="AZ::Render::MeshComponentController" field="Controller" type="{D0F35FAC-4194-4C89-9487-D000DDB8B272}"> <Class name="AZ::Render::MeshComponentConfig" field="Configuration" version="1" type="{63737345-51B1-472B-9355-98F99993909B}"> - <Class name="Asset" field="ModelAsset" value="id={9DCAD62C-7A35-5D7D-8276-870D646CD5E2}:103ef5f6,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_edge.azmodel},loadBehavior=0" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Asset" field="ModelAsset" value="id={9DCAD62C-7A35-5D7D-8276-870D646CD5E2}:103ef5f6,type={2C7477B6-69C5-45BE-8163-BCD6A275B6D8},hint={objects/cloth/environment/cloth_locked_edge.azmodel},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="AZ::s64" field="SortKey" value="0" type="{70D8A282-A1EA-462D-9D04-51EDE81FAC2F}"/> <Class name="unsigned char" field="LodOverride" value="255" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> <Class name="bool" field="ExcludeFromReflectionCubeMaps" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> @@ -228,7 +228,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="AZ::Render::MaterialAssignment" field="value2" version="1" type="{C66E5214-A24B-4722-B7F0-5991E6F8F163}"> @@ -260,7 +260,7 @@ <Class name="AZ::u64" field="lodIndex" value="18446744073709551615" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={FF25E0FE-B695-5084-AE1E-65F095AA5C3F}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={objects/cloth/environment/cloth_locked_edge.azmaterial},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> @@ -276,7 +276,7 @@ <Class name="AZ::u64" field="lodIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AssetId" field="materialAssetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}"> <Class name="AZ::Uuid" field="guid" value="{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="unsigned int" field="subId" value="3644789410" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="unsigned int" field="subId" value="902256226" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> </Class> </Class> <Class name="Asset" field="materialAsset" value="id={00000000-0000-0000-0000-000000000000}:0,type={522C7BE0-501D-463E-92C6-15184A2B7AD8},hint={},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> diff --git a/Gems/NvCloth/Code/Platform/Windows/PAL_windows.cmake b/Gems/NvCloth/Code/Platform/Windows/PAL_windows.cmake index e6c7c23614..5a4d953220 100644 --- a/Gems/NvCloth/Code/Platform/Windows/PAL_windows.cmake +++ b/Gems/NvCloth/Code/Platform/Windows/PAL_windows.cmake @@ -10,3 +10,5 @@ # set(PAL_TRAIT_NVCLOTH_USE_STUB FALSE) + +ly_associate_package(PACKAGE_NAME NvCloth-1.1.6-rev1-multiplatform TARGETS NvCloth PACKAGE_HASH 05fc62634ca28644e7659a89e97f4520d791e6ddf4b66f010ac669e4e2ed4454) diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp index cd3381966c..c295eca188 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.cpp @@ -10,19 +10,18 @@ * */ -#include <Cry_Math.h> // Needed for DualQuat -#include <MathConversion.h> - +#include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h> #include <Integration/ActorComponentBus.h> // Needed to access the Mesh information inside Actor. #include <EMotionFX/Source/TransformData.h> -#include <EMotionFX/Source/SkinningInfoVertexAttributeLayer.h> -#include <EMotionFX/Source/Node.h> -#include <EMotionFX/Source/Mesh.h> #include <EMotionFX/Source/ActorInstance.h> +#include <MCore/Source/DualQuaternion.h> #include <Components/ClothComponentMesh/ActorClothSkinning.h> +#include <Utils/AssetHelper.h> + +#include <AzCore/Math/PackedVector3.h> namespace NvCloth { @@ -30,11 +29,29 @@ namespace NvCloth { bool ObtainSkinningData( AZ::EntityId entityId, - const AZStd::string& meshNode, + const MeshNodeInfo& meshNodeInfo, const size_t numSimParticles, - const AZStd::vector<int>& meshRemappedVertices, AZStd::vector<SkinningInfo>& skinningData) { + AZ::Data::Asset<AZ::RPI::ModelAsset> modelAsset; + AZ::Render::MeshComponentRequestBus::EventResult( + modelAsset, entityId, &AZ::Render::MeshComponentRequestBus::Events::GetModelAsset); + if (!modelAsset.IsReady()) + { + return false; + } + + if (modelAsset->GetLodCount() < meshNodeInfo.m_lodLevel) + { + return false; + } + + const AZ::Data::Asset<AZ::RPI::ModelLodAsset>& modelLodAsset = modelAsset->GetLodAssets()[meshNodeInfo.m_lodLevel]; + if (!modelLodAsset.GetId().IsValid()) + { + return false; + } + EMotionFX::ActorInstance* actorInstance = nullptr; EMotionFX::Integration::ActorComponentRequestBus::EventResult(actorInstance, entityId, &EMotionFX::Integration::ActorComponentRequestBus::Events::GetActorInstance); if (!actorInstance) @@ -48,111 +65,74 @@ namespace NvCloth return false; } - const uint32 numNodes = actor->GetNumNodes(); - const uint32 numLODs = actor->GetNumLODLevels(); - - const EMotionFX::Mesh* emfxMesh = nullptr; - - // Find the render data of the mesh node - for (uint32 lodLevel = 0; lodLevel < numLODs; ++lodLevel) - { - for (uint32 nodeIndex = 0; nodeIndex < numNodes; ++nodeIndex) - { - const EMotionFX::Mesh* mesh = actor->GetMesh(lodLevel, nodeIndex); - if (!mesh || mesh->GetIsCollisionMesh()) - { - // Skip invalid and collision meshes. - continue; - } - - const EMotionFX::Node* node = actor->GetSkeleton()->GetNode(nodeIndex); - if (meshNode != node->GetNameString()) - { - // Skip nodes other than the one we're looking for. - continue; - } - - emfxMesh = mesh; - break; - } - - if (emfxMesh) - { - break; - } - } - - if (!emfxMesh) - { - return false; - } - - const AZ::u32* sourceOriginalVertex = static_cast<AZ::u32*>(emfxMesh->FindOriginalVertexData(EMotionFX::Mesh::ATTRIB_ORGVTXNUMBERS)); - EMotionFX::SkinningInfoVertexAttributeLayer* sourceSkinningInfo = - static_cast<EMotionFX::SkinningInfoVertexAttributeLayer*>( - emfxMesh->FindSharedVertexAttributeLayer(EMotionFX::SkinningInfoVertexAttributeLayer::TYPE_ID)); - - if (!sourceOriginalVertex || !sourceSkinningInfo) - { - return false; - } - - const int numVertices = emfxMesh->GetNumVertices(); - if (numVertices == 0) - { - AZ_Error("ActorClothSkinning", false, "Invalid mesh data"); - return false; - } - - if (meshRemappedVertices.size() != numVertices) - { - AZ_Error("ActorClothSkinning", false, - "Number of vertices (%d) doesn't match the mesh remapping size (%zu)", - numVertices, meshRemappedVertices.size()); - return false; - } + const auto& skinToSkeletonIndexMap = actor->GetSkinToSkeletonIndexMap(); skinningData.resize(numSimParticles); - for (int index = 0; index < numVertices; ++index) + + // For each submesh... + for (const auto& subMeshInfo : meshNodeInfo.m_subMeshes) { - const int skinnedDataIndex = meshRemappedVertices[index]; - if (skinnedDataIndex < 0) + if (modelLodAsset->GetMeshes().size() < subMeshInfo.m_primitiveIndex) + { + AZ_Error("ActorClothSkinning", false, + "Unable to access submesh %d from lod asset '%s' as it only has %d submeshes.", + subMeshInfo.m_primitiveIndex, + modelAsset.GetHint().c_str(), + modelLodAsset->GetMeshes().size()); + return false; + } + + const AZ::RPI::ModelLodAsset::Mesh& subMesh = modelLodAsset->GetMeshes()[subMeshInfo.m_primitiveIndex]; + + const auto sourcePositions = subMesh.GetSemanticBufferTyped<AZ::PackedVector3f>(AZ::Name("POSITION")); + if (sourcePositions.size() != subMeshInfo.m_numVertices) + { + AZ_Error("ActorClothSkinning", false, + "Number of vertices (%zu) in submesh %d doesn't match the cloth's submesh (%d)", + sourcePositions.size(), subMeshInfo.m_primitiveIndex, subMeshInfo.m_numVertices); + return false; + } + + const auto sourceSkinJointIndices = subMesh.GetSemanticBufferTyped<uint16_t>(AZ::Name("SKIN_JOINTINDICES")); + const auto sourceSkinWeights = subMesh.GetSemanticBufferTyped<float>(AZ::Name("SKIN_WEIGHTS")); + + if (sourceSkinJointIndices.empty() || sourceSkinWeights.empty()) + { + continue; + } + AZ_Assert(sourceSkinJointIndices.size() == sourceSkinWeights.size(), + "Size of skin joint indices buffer (%zu) different from skin weights buffer (%zu)", + sourceSkinJointIndices.size(), sourceSkinWeights.size()); + + const size_t influenceCount = sourceSkinWeights.size() / sourcePositions.size(); + if (influenceCount == 0) { - // Removed particle continue; } - SkinningInfo& skinningInfo = skinningData[skinnedDataIndex]; - - const AZ::u32 originalVertex = sourceOriginalVertex[index]; - const AZ::u32 influenceCount = AZ::GetMin<AZ::u32>(MaxSkinningBones, sourceSkinningInfo->GetNumInfluences(originalVertex)); - AZ::u32 influenceIndex = 0; - AZ::u8 weightError = 255; - - for (; influenceIndex < influenceCount; ++influenceIndex) + for (int vertexIndex = 0; vertexIndex < subMeshInfo.m_numVertices; ++vertexIndex) { - EMotionFX::SkinInfluence* influence = sourceSkinningInfo->GetInfluence(originalVertex, influenceIndex); - skinningInfo.m_jointIndices[influenceIndex] = influence->GetNodeNr(); - skinningInfo.m_jointWeights[influenceIndex] = static_cast<AZ::u8>(AZ::GetClamp<float>(influence->GetWeight() * 255.0f, 0.0f, 255.0f)); - if (skinningInfo.m_jointWeights[influenceIndex] >= weightError) - { - skinningInfo.m_jointWeights[influenceIndex] = weightError; - weightError = 0; - influenceIndex++; - break; - } - else - { - weightError -= skinningInfo.m_jointWeights[influenceIndex]; - } - } + SkinningInfo& skinningInfo = skinningData[subMeshInfo.m_verticesFirstIndex + vertexIndex]; + skinningInfo.m_jointIndices.resize(influenceCount); + skinningInfo.m_jointWeights.resize(influenceCount); - skinningInfo.m_jointWeights[0] += weightError; + for (size_t influenceIndex = 0; influenceIndex < influenceCount; ++influenceIndex) + { + const AZ::u16 jointIndex = sourceSkinJointIndices[vertexIndex * influenceCount + influenceIndex]; + const float weight = sourceSkinWeights[vertexIndex * influenceCount + influenceIndex]; - for (; influenceIndex < MaxSkinningBones; ++influenceIndex) - { - skinningInfo.m_jointIndices[influenceIndex] = 0; - skinningInfo.m_jointWeights[influenceIndex] = 0; + auto skeletonIndexIt = skinToSkeletonIndexMap.find(jointIndex); + if (skeletonIndexIt == skinToSkeletonIndexMap.end()) + { + AZ_Error("ActorClothSkinning", false, + "Joint index %d from model asset not found in map to skeleton indices", + jointIndex); + return false; + } + + skinningInfo.m_jointIndices[influenceIndex] = skeletonIndexIt->second; + skinningInfo.m_jointWeights[influenceIndex] = weight; + } } } @@ -189,7 +169,7 @@ namespace NvCloth return transformData->GetSkinningMatrices(); } - AZStd::unordered_map<AZ::u16, DualQuat> ObtainSkinningDualQuaternions( + AZStd::unordered_map<AZ::u16, MCore::DualQuaternion> ObtainSkinningDualQuaternions( AZ::EntityId entityId, const AZStd::vector<AZ::u16>& jointIndices) { @@ -199,10 +179,10 @@ namespace NvCloth return {}; } - AZStd::unordered_map<AZ::u16, DualQuat> skinningDualQuaternions; + AZStd::unordered_map<AZ::u16, MCore::DualQuaternion> skinningDualQuaternions; for (AZ::u16 jointIndex : jointIndices) { - skinningDualQuaternions.emplace(jointIndex, AZMatrix3x4ToLYMatrix3x4(skinningMatrices[jointIndex])); + skinningDualQuaternions.emplace(jointIndex, MCore::DualQuaternion(AZ::Transform::CreateFromMatrix3x4(skinningMatrices[jointIndex]))); } return skinningDualQuaternions; } @@ -218,19 +198,17 @@ namespace NvCloth { } + protected: // ActorClothSkinning overrides ... void UpdateSkinning() override; - void ApplySkinning( - const AZStd::vector<AZ::Vector4>& originalPositions, - AZStd::vector<AZ::Vector4>& positions) override; + bool HasSkinningTransformData() override; + void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) override; + AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) override; + AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZ::Vector3 ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZ::Matrix3x4* skinningMatrices); - const AZ::Matrix3x4* m_skinningMatrices = nullptr; + AZ::Matrix3x4 m_vertexSkinningTransform = AZ::Matrix3x4::CreateIdentity(); }; void ActorClothSkinningLinear::UpdateSkinning() @@ -240,54 +218,41 @@ namespace NvCloth m_skinningMatrices = Internal::ObtainSkinningMatrices(m_entityId); } - void ActorClothSkinningLinear::ApplySkinning( - const AZStd::vector<AZ::Vector4>& originalPositions, - AZStd::vector<AZ::Vector4>& positions) + bool ActorClothSkinningLinear::HasSkinningTransformData() { - if (!m_skinningMatrices) - { - return; - } - - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); - - for (size_t index = 0; index < originalPositions.size(); ++index) - { - const AZ::Vector3 skinnedPosition = ComputeSkinnedPosition( - originalPositions[index].GetAsVector3(), - m_skinningData[index], - m_skinningMatrices); - - // Avoid overwriting the w component - positions[index].Set(skinnedPosition, positions[index].GetW()); - } + return m_skinningMatrices != nullptr; } - AZ::Vector3 ActorClothSkinningLinear::ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZ::Matrix3x4* skinningMatrices) + void ActorClothSkinningLinear::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - AZ::Matrix3x4 clothSkinningMatrix = AZ::Matrix3x4::CreateZero(); - for (int weightIndex = 0; weightIndex < MaxSkinningBones; ++weightIndex) + m_vertexSkinningTransform = AZ::Matrix3x4::CreateZero(); + for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { - if (skinningInfo.m_jointWeights[weightIndex] == 0) + const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; + const float jointWeight = skinningInfo.m_jointWeights[weightIndex]; + + if (AZ::IsClose(jointWeight, 0.0f)) { continue; } - const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; - const float jointWeight = skinningInfo.m_jointWeights[weightIndex] / 255.0f; - // Blending matrices the same way done in GPU shaders, by adding each weighted matrix element by element. // This way the skinning results are much similar to the skinning performed in GPU. for (int i = 0; i < 3; ++i) { - clothSkinningMatrix.SetRow(i, clothSkinningMatrix.GetRow(i) + skinningMatrices[jointIndex].GetRow(i) * jointWeight); + m_vertexSkinningTransform.SetRow(i, m_vertexSkinningTransform.GetRow(i) + m_skinningMatrices[jointIndex].GetRow(i) * jointWeight); } } + } - return clothSkinningMatrix * originalPosition; + AZ::Vector3 ActorClothSkinningLinear::ComputeSkinningPosition(const AZ::Vector3& originalPosition) + { + return m_vertexSkinningTransform * originalPosition; + } + + AZ::Vector3 ActorClothSkinningLinear::ComputeSkinningVector(const AZ::Vector3& originalVector) + { + return (m_vertexSkinningTransform * AZ::Vector4::CreateFromVector3AndFloat(originalVector, 0.0f)).GetAsVector3().GetNormalized(); } // Specialized class that applies dual quaternion blending skinning @@ -300,22 +265,19 @@ namespace NvCloth { } + protected: // ActorClothSkinning overrides ... void UpdateSkinning() override; - void ApplySkinning( - const AZStd::vector<AZ::Vector4>& originalPositions, - AZStd::vector<AZ::Vector4>& positions) override; + bool HasSkinningTransformData() override; + void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) override; + AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) override; + AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) override; private: - AZ::Vector3 ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZStd::unordered_map<AZ::u16, DualQuat>& skinningDualQuaternions); - - AZStd::unordered_map<AZ::u16, DualQuat> m_skinningDualQuaternions; + AZStd::unordered_map<AZ::u16, MCore::DualQuaternion> m_skinningDualQuaternions; + MCore::DualQuaternion m_vertexSkinningTransform; }; - void ActorClothSkinningDualQuaternion::UpdateSkinning() { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); @@ -323,60 +285,46 @@ namespace NvCloth m_skinningDualQuaternions = Internal::ObtainSkinningDualQuaternions(m_entityId, m_jointIndices); } - void ActorClothSkinningDualQuaternion::ApplySkinning( - const AZStd::vector<AZ::Vector4>& originalPositions, - AZStd::vector<AZ::Vector4>& positions) + bool ActorClothSkinningDualQuaternion::HasSkinningTransformData() { - if (m_skinningDualQuaternions.empty()) - { - return; - } - - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); - - for (size_t index = 0; index < originalPositions.size(); ++index) - { - const AZ::Vector3 skinnedPosition = ComputeSkinnedPosition( - originalPositions[index].GetAsVector3(), - m_skinningData[index], - m_skinningDualQuaternions); - - // Avoid overwriting the w component - positions[index].Set(skinnedPosition, positions[index].GetW()); - } + return !m_skinningDualQuaternions.empty(); } - AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinnedPosition( - const AZ::Vector3& originalPosition, - const SkinningInfo& skinningInfo, - const AZStd::unordered_map<AZ::u16, DualQuat>& skinningDualQuaternions) + void ActorClothSkinningDualQuaternion::ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) { - DualQuat clothSkinningDualQuaternion(type_zero::ZERO); - for (int weightIndex = 0; weightIndex < MaxSkinningBones; ++weightIndex) + m_vertexSkinningTransform = MCore::DualQuaternion(AZ::Quaternion::CreateZero(), AZ::Quaternion::CreateZero()); + for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { - if (skinningInfo.m_jointWeights[weightIndex] == 0) + const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; + const float jointWeight = skinningInfo.m_jointWeights[weightIndex]; + + if (AZ::IsClose(jointWeight, 0.0f)) { continue; } - const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; - const float jointWeight = skinningInfo.m_jointWeights[weightIndex] / 255.0f; - - clothSkinningDualQuaternion += skinningDualQuaternions.at(jointIndex) * jointWeight; + m_vertexSkinningTransform += m_skinningDualQuaternions.at(jointIndex) * jointWeight; } - clothSkinningDualQuaternion.Normalize(); + m_vertexSkinningTransform.Normalize(); + } - return LYVec3ToAZVec3(clothSkinningDualQuaternion * AZVec3ToLYVec3(originalPosition)); + AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningPosition(const AZ::Vector3& originalPosition) + { + return m_vertexSkinningTransform.TransformPoint(originalPosition); + } + + AZ::Vector3 ActorClothSkinningDualQuaternion::ComputeSkinningVector(const AZ::Vector3& originalVector) + { + return m_vertexSkinningTransform.TransformVector(originalVector).GetNormalized(); } AZStd::unique_ptr<ActorClothSkinning> ActorClothSkinning::Create( AZ::EntityId entityId, - const AZStd::string& meshNode, - const size_t numSimParticles, - const AZStd::vector<int>& meshRemappedVertices) + const MeshNodeInfo& meshNodeInfo, + const size_t numSimParticles) { AZStd::vector<SkinningInfo> skinningData; - if (!Internal::ObtainSkinningData(entityId, meshNode, numSimParticles, meshRemappedVertices, skinningData)) + if (!Internal::ObtainSkinningData(entityId, meshNodeInfo, numSimParticles, skinningData)) { return nullptr; } @@ -411,14 +359,17 @@ namespace NvCloth AZStd::set<AZ::u16> jointIndices; for (size_t particleIndex = 0; particleIndex < numSimParticles; ++particleIndex) { - for (int weightIndex = 0; weightIndex < MaxSkinningBones; ++weightIndex) + const SkinningInfo& skinningInfo = skinningData[particleIndex]; + for (size_t weightIndex = 0; weightIndex < skinningInfo.m_jointWeights.size(); ++weightIndex) { - if (skinningData[particleIndex].m_jointWeights[weightIndex] == 0) + const AZ::u16 jointIndex = skinningInfo.m_jointIndices[weightIndex]; + const float jointWeight = skinningInfo.m_jointWeights[weightIndex]; + + if (AZ::IsClose(jointWeight, 0.0f)) { continue; } - const AZ::u16 jointIndex = skinningData[particleIndex].m_jointIndices[weightIndex]; jointIndices.insert(jointIndex); } } @@ -434,6 +385,69 @@ namespace NvCloth { } + void ActorClothSkinning::ApplySkinning( + const AZStd::vector<AZ::Vector4>& originalPositions, + AZStd::vector<AZ::Vector4>& positions, + const AZStd::vector<int>& meshRemappedVertices) + { + if (!HasSkinningTransformData() || + originalPositions.empty() || + originalPositions.size() != positions.size() || + m_skinningData.size() != meshRemappedVertices.size()) + { + return; + } + + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); + + AZStd::unordered_set<int> skinnedIndices; + for (size_t index = 0; index < meshRemappedVertices.size(); ++index) + { + const int remappedIndex = meshRemappedVertices[index]; + if (remappedIndex >= 0 && !skinnedIndices.contains(remappedIndex)) + { + ComputeVertexSkinnningTransform(m_skinningData[index]); + + const AZ::Vector3 skinnedPosition = ComputeSkinningPosition(originalPositions[remappedIndex].GetAsVector3()); + positions[remappedIndex].Set(skinnedPosition, positions[remappedIndex].GetW()); // Avoid overwriting the w component + + skinnedIndices.emplace(remappedIndex); // Avoid computing this index again + } + } + } + + void ActorClothSkinning::ApplySkinninOnRemovedVertices( + const MeshClothInfo& originalData, + ClothComponentMesh::RenderData& renderData, + const AZStd::vector<int>& meshRemappedVertices) + { + if (!HasSkinningTransformData() || + originalData.m_particles.empty() || + originalData.m_particles.size() != renderData.m_particles.size() || + originalData.m_particles.size() != m_skinningData.size() || + m_skinningData.size() != meshRemappedVertices.size()) + { + return; + } + + AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Cloth); + + for (size_t index = 0; index < originalData.m_particles.size(); ++index) + { + if (meshRemappedVertices[index] < 0) + { + ComputeVertexSkinnningTransform(m_skinningData[index]); + + const AZ::Vector3 skinnedPosition = ComputeSkinningPosition(originalData.m_particles[index].GetAsVector3()); + renderData.m_particles[index].Set(skinnedPosition, renderData.m_particles[index].GetW()); // Avoid overwriting the w component + + renderData.m_tangents[index] = ComputeSkinningVector(originalData.m_tangents[index]); + renderData.m_bitangents[index] = ComputeSkinningVector(originalData.m_bitangents[index]); + renderData.m_normals[index] = ComputeSkinningVector(originalData.m_normals[index]); + } + } + } + void ActorClothSkinning::UpdateActorVisibility() { bool isVisible = true; diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h index 85ae75c014..8cf139c75a 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h @@ -16,19 +16,20 @@ #include <NvCloth/Types.h> +#include <Components/ClothComponentMesh/ClothComponentMesh.h> + namespace NvCloth { - //! Maximum number of bones that can influence a particle. - static const int MaxSkinningBones = 4; + struct MeshNodeInfo; //! Skinning information of a particle. struct SkinningInfo { //! Weights of each joint that influence the particle. - AZStd::array<AZ::u8, MaxSkinningBones> m_jointWeights; + AZStd::vector<float> m_jointWeights; //! List of joints that influence the particle. - AZStd::array<AZ::u16, MaxSkinningBones> m_jointIndices; + AZStd::vector<AZ::u16> m_jointIndices; }; //! Class to retrieve skinning information from an actor on the same entity @@ -42,9 +43,8 @@ namespace NvCloth static AZStd::unique_ptr<ActorClothSkinning> Create( AZ::EntityId entityId, - const AZStd::string& meshNode, - const size_t numSimParticles, - const AZStd::vector<int>& meshRemappedVertices); + const MeshNodeInfo& meshNodeInfo, + const size_t numSimParticles); explicit ActorClothSkinning(AZ::EntityId entityId); @@ -53,9 +53,17 @@ namespace NvCloth //! Applies skinning to a list of positions. //! @note w components are not affected. - virtual void ApplySkinning( + void ApplySkinning( const AZStd::vector<AZ::Vector4>& originalPositions, - AZStd::vector<AZ::Vector4>& positions) = 0; + AZStd::vector<AZ::Vector4>& positions, + const AZStd::vector<int>& meshRemappedVertices); + + //! Applies skinning to a list of positions and vectors whose vertices + //! have not been used for simulation (remapped index is negative). + void ApplySkinninOnRemovedVertices( + const MeshClothInfo& originalData, + ClothComponentMesh::RenderData& renderData, + const AZStd::vector<int>& meshRemappedVertices); //! Updates visibility variables. void UpdateActorVisibility(); @@ -67,6 +75,18 @@ namespace NvCloth bool WasActorVisible() const; protected: + //! Returns true if it has valid skinning trasform data. + virtual bool HasSkinningTransformData() = 0; + + //! Computes the skinnning transformation to apply to a vertex data. + virtual void ComputeVertexSkinnningTransform(const SkinningInfo& skinningInfo) = 0; + + //! Computes skinning on a position. + virtual AZ::Vector3 ComputeSkinningPosition(const AZ::Vector3& originalPosition) = 0; + + //! Computes skinning on a vector. + virtual AZ::Vector3 ComputeSkinningVector(const AZ::Vector3& originalVector) = 0; + AZ::EntityId m_entityId; // Skinning information of all particles diff --git a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp index 92dbfdb89a..740518b61a 100644 --- a/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp +++ b/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ClothComponentMesh.cpp @@ -166,6 +166,13 @@ namespace NvCloth // Initialize render data m_renderDataBufferIndex = 0; + { + auto& renderData = GetRenderData(); + renderData.m_particles = m_meshClothInfo.m_particles; + renderData.m_tangents = m_meshClothInfo.m_tangents; + renderData.m_bitangents = m_meshClothInfo.m_bitangents; + renderData.m_normals = m_meshClothInfo.m_normals; + } UpdateRenderData(m_cloth->GetParticles()); // Copy the first initialized element to the rest of the buffer for (AZ::u32 i = 1; i < RenderDataBufferSize; ++i) @@ -177,7 +184,7 @@ namespace NvCloth m_actorClothColliders = ActorClothColliders::Create(m_entityId); // It will return a valid instance if it's an actor with skinning data. - m_actorClothSkinning = ActorClothSkinning::Create(m_entityId, m_config.m_meshNode, m_cloth->GetParticles().size(), m_meshRemappedVertices); + m_actorClothSkinning = ActorClothSkinning::Create(m_entityId, m_meshNodeInfo, m_meshClothInfo.m_particles.size()); m_numberOfClothSkinningUpdates = 0; m_clothConstraints = ClothConstraints::Create( @@ -356,7 +363,7 @@ namespace NvCloth { // Update skinning for all particles and apply it to cloth AZStd::vector<SimParticleFormat> particles = m_cloth->GetParticles(); - m_actorClothSkinning->ApplySkinning(m_cloth->GetInitialParticles(), particles); + m_actorClothSkinning->ApplySkinning(m_cloth->GetInitialParticles(), particles, m_meshRemappedVertices); m_cloth->SetParticles(AZStd::move(particles)); m_cloth->DiscardParticleDelta(); } @@ -372,8 +379,8 @@ namespace NvCloth if (m_actorClothSkinning) { - m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetMotionConstraints(), m_motionConstraints); - m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetSeparationConstraints(), m_separationConstraints); + m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetMotionConstraints(), m_motionConstraints, m_meshRemappedVertices); + m_actorClothSkinning->ApplySkinning(m_clothConstraints->GetSeparationConstraints(), m_separationConstraints, m_meshRemappedVertices); } m_cloth->GetClothConfigurator()->SetMotionConstraints(m_motionConstraints); @@ -392,6 +399,14 @@ namespace NvCloth return; } + auto& renderData = GetRenderData(); + + if (m_config.m_removeStaticTriangles && m_actorClothSkinning) + { + // Apply skinning to the non-simulated part of the mesh. + m_actorClothSkinning->ApplySkinninOnRemovedVertices(m_meshClothInfo, renderData, m_meshRemappedVertices); + } + // Calculate normals of the cloth particles (simplified mesh). AZStd::vector<AZ::Vector3> normals; [[maybe_unused]] bool normalsCalculated = @@ -401,19 +416,10 @@ namespace NvCloth // Copy particles and normals to render data. // Since cloth's vertices were welded together, // the full mesh will result in smooth normals. - auto& renderData = GetRenderData(); - renderData.m_particles.resize_no_construct(m_meshRemappedVertices.size()); - renderData.m_normals.resize_no_construct(m_meshRemappedVertices.size()); for (size_t index = 0; index < m_meshRemappedVertices.size(); ++index) { const int remappedIndex = m_meshRemappedVertices[index]; - if (remappedIndex < 0) - { - // Removed particle. Assign initial values to have something valid during tangents and bitangents calculation. - renderData.m_particles[index] = m_meshClothInfo.m_particles[index]; - renderData.m_normals[index] = AZ::Vector3::CreateAxisZ(); - } - else + if (remappedIndex >= 0) { renderData.m_particles[index] = particles[remappedIndex]; renderData.m_normals[index] = normals[remappedIndex]; @@ -505,8 +511,8 @@ namespace NvCloth } const AZ::RPI::ModelLodAsset::Mesh& subMesh = modelLodAsset->GetMeshes()[subMeshInfo.m_primitiveIndex]; - int numVertices = subMeshInfo.m_numVertices; - int firstVertex = subMeshInfo.m_verticesFirstIndex; + const int numVertices = subMeshInfo.m_numVertices; + const int firstVertex = subMeshInfo.m_verticesFirstIndex; if (subMesh.GetVertexCount() != numVertices) { AZ_Error("ClothComponentMesh", false, @@ -540,12 +546,6 @@ namespace NvCloth { const int renderVertexIndex = firstVertex + index; - if (m_meshRemappedVertices[renderVertexIndex] < 0) - { - // Removed particle from simulation - continue; - } - const SimParticleFormat& renderParticle = renderParticles[renderVertexIndex]; destVerticesBuffer[index].Set( renderParticle.GetX(), @@ -604,10 +604,7 @@ namespace NvCloth m_meshClothInfo.m_particles, m_meshClothInfo.m_indices, meshSimplifiedParticles, meshSimplifiedIndices, m_meshRemappedVertices, - // [TODO LYN-1890] - // Since blend weights cannot be controlled per instance with Atom, - // this additional mesh optimization is not possible at the moment. - false /*m_config.m_removeStaticTriangles*/); + m_config.m_removeStaticTriangles); if (meshSimplifiedParticles.empty() || meshSimplifiedIndices.empty()) { diff --git a/Gems/NvCloth/Code/Source/Components/EditorClothComponent.cpp b/Gems/NvCloth/Code/Source/Components/EditorClothComponent.cpp index 18f86f558b..8d9731c9e6 100644 --- a/Gems/NvCloth/Code/Source/Components/EditorClothComponent.cpp +++ b/Gems/NvCloth/Code/Source/Components/EditorClothComponent.cpp @@ -482,14 +482,14 @@ namespace NvCloth { bool foundNode = AZStd::find(m_meshNodeList.cbegin(), m_meshNodeList.cend(), m_config.m_meshNode) != m_meshNodeList.cend(); - if (!foundNode && !m_previousMeshNode.empty()) + if (!foundNode && !m_lastKnownMeshNode.empty()) { // Check the if the mesh node previously selected is still part of the mesh list // to keep using it and avoid the user to select it again in the combo box. - foundNode = AZStd::find(m_meshNodeList.cbegin(), m_meshNodeList.cend(), m_previousMeshNode) != m_meshNodeList.cend(); + foundNode = AZStd::find(m_meshNodeList.cbegin(), m_meshNodeList.cend(), m_lastKnownMeshNode) != m_meshNodeList.cend(); if (foundNode) { - m_config.m_meshNode = m_previousMeshNode; + m_config.m_meshNode = m_lastKnownMeshNode; } } @@ -502,7 +502,7 @@ namespace NvCloth } } - m_previousMeshNode = ""; + m_lastKnownMeshNode = ""; if (m_simulateInEditor) { @@ -517,7 +517,12 @@ namespace NvCloth void EditorClothComponent::OnModelPreDestroy() { - m_previousMeshNode = m_config.m_meshNode; + if (m_config.m_meshNode != Internal::StatusMessageSelectNode && + m_config.m_meshNode != Internal::StatusMessageNoAsset && + m_config.m_meshNode != Internal::StatusMessageNoClothNodes) + { + m_lastKnownMeshNode = m_config.m_meshNode; + } m_meshNodeList = { {Internal::StatusMessageNoAsset} }; m_config.m_meshNode = Internal::StatusMessageNoAsset; diff --git a/Gems/NvCloth/Code/Source/Components/EditorClothComponent.h b/Gems/NvCloth/Code/Source/Components/EditorClothComponent.h index 1339fe1c6d..9727895a43 100644 --- a/Gems/NvCloth/Code/Source/Components/EditorClothComponent.h +++ b/Gems/NvCloth/Code/Source/Components/EditorClothComponent.h @@ -70,7 +70,7 @@ namespace NvCloth // This list is not serialized, it's compiled when the asset has been received via MeshComponentNotificationBus. MeshNodeList m_meshNodeList; - AZStd::string m_previousMeshNode; + AZStd::string m_lastKnownMeshNode; AZStd::unordered_set<AZStd::string> m_meshNodesWithBackstopData; diff --git a/Gems/NvCloth/Code/Source/Utils/AssetHelper.h b/Gems/NvCloth/Code/Source/Utils/AssetHelper.h index 9630eeb5e1..4c73282008 100644 --- a/Gems/NvCloth/Code/Source/Utils/AssetHelper.h +++ b/Gems/NvCloth/Code/Source/Utils/AssetHelper.h @@ -65,6 +65,9 @@ namespace NvCloth AZStd::vector<SimUVType> m_uvs; AZStd::vector<float> m_motionConstraints; AZStd::vector<AZ::Vector2> m_backstopData; //!< X contains offset, Y contains radius. + AZStd::vector<AZ::Vector3> m_tangents; + AZStd::vector<AZ::Vector3> m_bitangents; + AZStd::vector<AZ::Vector3> m_normals; }; //! Interface to obtain cloth information from inside an Asset. diff --git a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp index fa8d6e5455..00ce77c176 100644 --- a/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp +++ b/Gems/NvCloth/Code/Source/Utils/MeshAssetHelper.cpp @@ -12,6 +12,8 @@ #include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h> +#include <NvCloth/ITangentSpaceHelper.h> + #include <Utils/MeshAssetHelper.h> namespace NvCloth @@ -224,6 +226,13 @@ namespace NvCloth meshClothInfo.m_indices.insert(meshClothInfo.m_indices.end(), sourceIndices.begin(), sourceIndices.end()); } + // Calculate tangent space for the mesh. + [[maybe_unused]] bool tangentSpaceCalculated = + AZ::Interface<ITangentSpaceHelper>::Get()->CalculateTangentSpace( + meshClothInfo.m_particles, meshClothInfo.m_indices, meshClothInfo.m_uvs, + meshClothInfo.m_tangents, meshClothInfo.m_bitangents, meshClothInfo.m_normals); + AZ_Assert(tangentSpaceCalculated, "Failed to calculate tangent space."); + return true; } } // namespace NvCloth diff --git a/Gems/NvCloth/Code/Tests/ActorHelper.cpp b/Gems/NvCloth/Code/Tests/ActorHelper.cpp index 2b50f37a7c..22b1cda74d 100644 --- a/Gems/NvCloth/Code/Tests/ActorHelper.cpp +++ b/Gems/NvCloth/Code/Tests/ActorHelper.cpp @@ -126,8 +126,7 @@ namespace UnitTest const AZStd::vector<AZ::Vector3>& vertices, const AZStd::vector<AZ::u32>& indices, const AZStd::vector<VertexSkinInfluences>& skinningInfo, - const AZStd::vector<AZ::Vector2>& uvs, - const AZStd::vector<AZ::Color>& clothData) + const AZStd::vector<AZ::Vector2>& uvs) { // Generate the normals for this mesh AZStd::vector<AZ::Vector4> particles(vertices.size()); @@ -142,7 +141,6 @@ namespace UnitTest vertices, normals, uvs, - clothData, skinningInfo ); } diff --git a/Gems/NvCloth/Code/Tests/ActorHelper.h b/Gems/NvCloth/Code/Tests/ActorHelper.h index 01884fd6d7..7f4918a4c9 100644 --- a/Gems/NvCloth/Code/Tests/ActorHelper.h +++ b/Gems/NvCloth/Code/Tests/ActorHelper.h @@ -62,6 +62,5 @@ namespace UnitTest const AZStd::vector<AZ::Vector3>& vertices, const AZStd::vector<AZ::u32>& indices, const AZStd::vector<VertexSkinInfluences>& skinningInfo = {}, - const AZStd::vector<AZ::Vector2>& uvs = {}, - const AZStd::vector<AZ::Color>& clothData = {}); + const AZStd::vector<AZ::Vector2>& uvs = {}); } // namespace UnitTest diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp index 312d2debe3..75cff2da04 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ActorClothSkinningTest.cpp @@ -16,6 +16,7 @@ #include <AzFramework/Components/TransformComponent.h> #include <Components/ClothComponentMesh/ActorClothSkinning.h> +#include <Utils/AssetHelper.h> #include <UnitTestHelper.h> #include <ActorHelper.h> @@ -52,6 +53,20 @@ namespace UnitTest const AZ::u32 LodLevel = 0; + const NvCloth::MeshNodeInfo MeshNodeInfo = { + static_cast<int>(LodLevel), + {{ + // One SubMesh + { + 0, // Primitive index + 0, // First vertex + static_cast<int>(MeshVertices.size()), // Vertex count + 0, // First index + static_cast<int>(MeshIndices.size()) // Index count + } + }} + }; + protected: // ::testing::Test overrides ... void SetUp() override; @@ -83,7 +98,7 @@ namespace UnitTest { AZ::EntityId entityId; AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(entityId, "", 0, {}); + NvCloth::ActorClothSkinning::Create(entityId, {}, 0); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -92,7 +107,7 @@ namespace UnitTest { AZ::EntityId entityId; AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(entityId, MeshNodeName, MeshRemappedVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(entityId, MeshNodeInfo, MeshRemappedVertices.size()); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -107,7 +122,7 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), "", 0, {}); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), {}, 0); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } @@ -124,12 +139,12 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeName, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); EXPECT_TRUE(actorClothSkinning.get() == nullptr); } - TEST_F(NvClothActorClothSkinning, ActorClothSkinning_CreateWithActor_ReturnsValidInstance) + TEST_F(NvClothActorClothSkinning, DISABLED_ActorClothSkinning_CreateWithActor_ReturnsValidInstance) { { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); @@ -141,12 +156,12 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeName, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); EXPECT_TRUE(actorClothSkinning.get() != nullptr); } - TEST_F(NvClothActorClothSkinning, ActorClothSkinning_UpdateAndApplyLinearSkinning_ModifiesVertices) + TEST_F(NvClothActorClothSkinning, DISABLED_ActorClothSkinning_UpdateAndApplyLinearSkinning_ModifiesVertices) { const AZ::Transform meshNodeTransform = AZ::Transform::CreateRotationY(AZ::DegToRad(90.0f)); @@ -169,7 +184,8 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(actorComponent->GetEntityId(), MeshNodeName, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); + ASSERT_TRUE(actorClothSkinning.get() != nullptr); const AZStd::vector<NvCloth::SimParticleFormat> clothParticles = {{ NvCloth::SimParticleFormat::CreateFromVector3AndFloat(MeshVertices[0], 1.0f), @@ -179,7 +195,7 @@ namespace UnitTest AZStd::vector<NvCloth::SimParticleFormat> skinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles, MeshRemappedVertices); EXPECT_THAT(skinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticles)); @@ -192,7 +208,7 @@ namespace UnitTest AZStd::vector<NvCloth::SimParticleFormat> newSkinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles, MeshRemappedVertices); const AZ::Transform diffTransform = AZ::Transform::CreateRotationY(AZ::DegToRad(90.0f)); const AZStd::vector<NvCloth::SimParticleFormat> clothParticlesResult = {{ @@ -204,7 +220,7 @@ namespace UnitTest EXPECT_THAT(newSkinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticlesResult)); } - TEST_F(NvClothActorClothSkinning, ActorClothSkinning_UpdateAndApplyDualQuatSkinning_ModifiesVertices) + TEST_F(NvClothActorClothSkinning, DISABLED_ActorClothSkinning_UpdateAndApplyDualQuatSkinning_ModifiesVertices) { const AZStd::string rootNodeName = "root_node"; const AZStd::string meshNodeName = "cloth_mesh_node"; @@ -229,7 +245,8 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), meshNodeName, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); + ASSERT_TRUE(actorClothSkinning.get() != nullptr); const AZStd::vector<NvCloth::SimParticleFormat> clothParticles = {{ NvCloth::SimParticleFormat::CreateFromVector3AndFloat(MeshVertices[0], 1.0f), @@ -239,7 +256,7 @@ namespace UnitTest AZStd::vector<NvCloth::SimParticleFormat> skinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, skinnedClothParticles, MeshRemappedVertices); EXPECT_THAT(skinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticles)); @@ -254,7 +271,7 @@ namespace UnitTest AZStd::vector<NvCloth::SimParticleFormat> newSkinnedClothParticles(clothParticles.size(), NvCloth::SimParticleFormat(0.0f, 0.0f, 0.0f, 1.0f)); actorClothSkinning->UpdateSkinning(); - actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles); + actorClothSkinning->ApplySkinning(clothParticles, newSkinnedClothParticles, MeshRemappedVertices); const AZStd::vector<NvCloth::SimParticleFormat> clothParticlesResult = {{ NvCloth::SimParticleFormat(-48.4177f, -31.9446f, 45.2279f, 1.0f), @@ -265,7 +282,7 @@ namespace UnitTest EXPECT_THAT(newSkinnedClothParticles, ::testing::Pointwise(ContainerIsCloseTolerance(Tolerance), clothParticlesResult)); } - TEST_F(NvClothActorClothSkinning, ActorClothSkinning_UpdateActorVisibility_ReturnsExpectedValues) + TEST_F(NvClothActorClothSkinning, DISABLED_ActorClothSkinning_UpdateActorVisibility_ReturnsExpectedValues) { { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); @@ -277,7 +294,8 @@ namespace UnitTest } AZStd::unique_ptr<NvCloth::ActorClothSkinning> actorClothSkinning = - NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeName, MeshVertices.size(), MeshRemappedVertices); + NvCloth::ActorClothSkinning::Create(m_actorComponent->GetEntityId(), MeshNodeInfo, MeshVertices.size()); + ASSERT_TRUE(actorClothSkinning.get() != nullptr); EXPECT_FALSE(actorClothSkinning->IsActorVisible()); EXPECT_FALSE(actorClothSkinning->WasActorVisible()); diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp index 9916029d3b..e121a5311f 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentMesh/ClothComponentMeshTest.cpp @@ -178,7 +178,7 @@ namespace UnitTest { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -204,7 +204,7 @@ namespace UnitTest EXPECT_THAT(renderData.m_normals, ::testing::Each(IsCloseTolerance(AZ::Vector3::CreateAxisZ(), Tolerance))); } - TEST_F(NvClothComponentMesh, ClothComponentMesh_TickClothSystem_RunningSimulationVerticesGoDown) + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_TickClothSystem_RunningSimulationVerticesGoDown) { { const float height = 4.7f; @@ -213,7 +213,7 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->AddClothCollider(collider); actor->FinishSetup(); @@ -245,12 +245,12 @@ namespace UnitTest } } - TEST_F(NvClothComponentMesh, ClothComponentMesh_UpdateConfigurationInvalidEntity_ReturnEmptyRenderData) + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_UpdateConfigurationInvalidEntity_ReturnEmptyRenderData) { { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -281,7 +281,7 @@ namespace UnitTest { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -306,7 +306,7 @@ namespace UnitTest { auto actor = AZStd::make_unique<ActorHelper>("actor_test2"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(newMeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(newMeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); newActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -325,12 +325,12 @@ namespace UnitTest } } - TEST_F(NvClothComponentMesh, ClothComponentMesh_UpdateConfigurationInvalidMeshNode_ReturnEmptyRenderData) + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_UpdateConfigurationInvalidMeshNode_ReturnEmptyRenderData) { { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -370,8 +370,8 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); auto meshNode2Index = actor->AddJoint(meshNode2Name); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); - actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(mesh2Vertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); + actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(mesh2Vertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -396,12 +396,12 @@ namespace UnitTest } } - TEST_F(NvClothComponentMesh, ClothComponentMesh_UpdateConfigurationInvertingGravity_RunningSimulationVerticesGoUp) + TEST_F(NvClothComponentMesh, DISABLED_ClothComponentMesh_UpdateConfigurationInvertingGravity_RunningSimulationVerticesGoUp) { { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -444,7 +444,7 @@ namespace UnitTest { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(MeshNodeName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); diff --git a/Gems/NvCloth/Code/Tests/Components/ClothComponentTest.cpp b/Gems/NvCloth/Code/Tests/Components/ClothComponentTest.cpp index 126197aa5d..379cf6988d 100644 --- a/Gems/NvCloth/Code/Tests/Components/ClothComponentTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/ClothComponentTest.cpp @@ -196,7 +196,7 @@ namespace UnitTest { auto actor = AZStd::make_unique<ActorHelper>("actor_test"); auto meshNodeIndex = actor->AddJoint(meshNodeName); - actor->SetMesh(lodLevel, meshNodeIndex, CreateEMotionFXMesh(meshVertices, meshIndices, meshSkinningInfo, meshUVs, meshClothData)); + actor->SetMesh(lodLevel, meshNodeIndex, CreateEMotionFXMesh(meshVertices, meshIndices, meshSkinningInfo, meshUVs/*, meshClothData*/)); actor->FinishSetup(); actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); diff --git a/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp b/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp index 7dc191bd9a..d05ceee31a 100644 --- a/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp +++ b/Gems/NvCloth/Code/Tests/Components/EditorClothComponentTest.cpp @@ -253,7 +253,7 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); actor->AddJoint(JointRootName); auto meshNodeIndex = actor->AddJoint(MeshNodeName, AZ::Transform::CreateIdentity(), JointRootName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); editorActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -284,7 +284,7 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); actor->AddJoint(JointRootName); auto meshNodeIndex = actor->AddJoint(MeshNodeName, AZ::Transform::CreateIdentity(), JointRootName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs, meshClothDataNoBackstop)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs/*, meshClothDataNoBackstop*/)); actor->FinishSetup(); editorActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -310,7 +310,7 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); actor->AddJoint(JointRootName); auto meshNodeIndex = actor->AddJoint(MeshNodeName, AZ::Transform::CreateIdentity(), JointRootName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); editorActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -337,7 +337,7 @@ namespace UnitTest auto actor = AZStd::make_unique<ActorHelper>("actor_test"); actor->AddJoint(JointRootName); auto meshNodeIndex = actor->AddJoint(MeshNodeName, AZ::Transform::CreateIdentity(), JointRootName); - actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices, {}, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); editorActorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); diff --git a/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp b/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp index ad3a87d5ff..07b28bfb31 100644 --- a/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp +++ b/Gems/NvCloth/Code/Tests/Utils/ActorAssetHelperTest.cpp @@ -172,9 +172,9 @@ namespace UnitTest auto meshNode1Index = actor->AddJoint(MeshNode1Name, AZ::Transform::CreateTranslation(AZ::Vector3(3.0f, -2.0f, 0.0f)), RootNodeName); auto otherNodeIndex = actor->AddJoint(OtherNodeName, AZ::Transform::CreateTranslation(AZ::Vector3(0.5f, 0.0f, 0.0f)), RootNodeName); auto meshNode2Index = actor->AddJoint(MeshNode2Name, AZ::Transform::CreateTranslation(AZ::Vector3(0.2f, 0.6f, 1.0f)), OtherNodeName); - actor->SetMesh(LodLevel, meshNode1Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNode1Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->SetMesh(LodLevel, otherNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices)); - actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); @@ -202,9 +202,9 @@ namespace UnitTest auto meshNode1Index = actor->AddJoint(MeshNode1Name, AZ::Transform::CreateTranslation(AZ::Vector3(3.0f, -2.0f, 0.0f)), RootNodeName); auto otherNodeIndex = actor->AddJoint(OtherNodeName, AZ::Transform::CreateTranslation(AZ::Vector3(0.5f, 0.0f, 0.0f)), RootNodeName); auto meshNode2Index = actor->AddJoint(MeshNode2Name, AZ::Transform::CreateTranslation(AZ::Vector3(0.2f, 0.6f, 1.0f)), OtherNodeName); - actor->SetMesh(LodLevel, meshNode1Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNode1Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->SetMesh(LodLevel, otherNodeIndex, CreateEMotionFXMesh(MeshVertices, MeshIndices)); - actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs, MeshClothData)); + actor->SetMesh(LodLevel, meshNode2Index, CreateEMotionFXMesh(MeshVertices, MeshIndices, MeshSkinningInfo, MeshUVs/*, MeshClothData*/)); actor->FinishSetup(); m_actorComponent->SetActorAsset(CreateAssetFromActor(AZStd::move(actor))); diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_diff.tif.exportsettings index a83cad229f..8d01ab1ac2 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:0,ios:0,osx_gl:0,pc:2,provo:0,wiiu:0" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:0,ios:0,osx_gl:0,pc:2,provo:0,wiiu:0" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_spec.tif.exportsettings index 23e8b76071..0e4a4a080e 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/anodized_metal_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel.tif.exportsettings index 5463f8e47f..fb61d0f55c 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/brushed_steel_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_spec.tif.exportsettings index 23e8b76071..0e4a4a080e 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/car_paint_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_ddna.tif.exportsettings index d39a7daed2..4377d1bc2a 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_diff.tif.exportsettings index 8bd9a872dd..78867ef15c 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/coal_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=Albedo /reduce=-1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=Albedo /reduce=-1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_ddna.tif.exportsettings index d39a7daed2..4377d1bc2a 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_diff.tif.exportsettings index 5463f8e47f..fb61d0f55c 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/concrete_stucco_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/conductor_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/conductor_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/conductor_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/conductor_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/copper_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/copper_spec.tif.exportsettings index 4add268f10..a6837b396f 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/copper_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/copper_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=average /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=average /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/dark_leather_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/dark_leather_diff.tif.exportsettings index 96ac799bd1..2a29854fae 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/dark_leather_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/dark_leather_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel.tif.exportsettings index 972ff8361c..6a4cbb4a3f 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=NormalsWithSmoothness /reduce=-1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=NormalsWithSmoothness /reduce=-1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_spec.tif.exportsettings index cfa22d1637..93bcddc494 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/galvanized_steel_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce="es3:0,ios:0,osx_gl:0,pc:1,provo:0,wiiu:0" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce="es3:0,ios:0,osx_gl:0,pc:1,provo:0,wiiu:0" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/glazed_clay_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss0_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss0_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss0_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss0_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss100_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss100_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss100_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss100_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss10_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss10_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss10_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss10_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss20_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss20_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss20_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss20_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss30_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss30_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss30_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss30_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss40_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss40_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss40_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss40_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss50_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss50_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss50_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss50_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss60_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss60_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss60_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss60_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss70_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss70_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss70_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss70_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss80_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss80_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss80_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss80_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss90_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss90_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss90_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gloss90_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gold_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gold_spec.tif.exportsettings index 4add268f10..a6837b396f 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gold_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/gold_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=average /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=average /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/iron_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/iron_spec.tif.exportsettings index 23e8b76071..0e4a4a080e 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/iron_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/iron_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/leather_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/leather_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/leather_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/leather_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/light_leather_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/light_leather_diff.tif.exportsettings index 96ac799bd1..2a29854fae 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/light_leather_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/light_leather_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_diff.tif.exportsettings index 96ac799bd1..2a29854fae 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/mixed_stones_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/nickel_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/nickel_spec.tif.exportsettings index 23e8b76071..0e4a4a080e 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/nickel_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/nickel_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_ddna.tif.exportsettings index d39a7daed2..4377d1bc2a 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/plain_fabric_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/platinum_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/platinum_spec.tif.exportsettings index 288dff2c17..2bec812694 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/platinum_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/platinum_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance_Linear /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance_Linear /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/porcelain_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/porcelain_diff.tif.exportsettings index 8bd9a872dd..78867ef15c 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/porcelain_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/porcelain_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=Albedo /reduce=-1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipmaps=0 /preset=Albedo /reduce=-1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/red_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/red_diff.tif.exportsettings index 7a716dc579..54586c2db1 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/red_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/red_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:0,ios:0,osx_gl:0,pc:3,provo:0,wiiu:0" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:0,ios:0,osx_gl:0,pc:3,provo:0,wiiu:0" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rotary_brushed_steel_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rotary_brushed_steel_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rotary_brushed_steel_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rotary_brushed_steel_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_blend.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_blend.tif.exportsettings index a08e0b583a..8092b156b4 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_blend.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_blend.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=box /preset=Albedo /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=box /preset=Albedo /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_diff.tif.exportsettings index 96ac799bd1..2a29854fae 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/rust_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/silver_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/silver_spec.tif.exportsettings index 288dff2c17..2bec812694 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/silver_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/silver_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance_Linear /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance_Linear /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_ddna.tif.exportsettings index a7a4dd9147..f1f2f06410 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:1,pc:0,provo:1,wiiu:1" diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_diff.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_diff.tif.exportsettings index 5463f8e47f..fb61d0f55c 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_diff.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_spec.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_spec.tif.exportsettings index 4824736ac6..c31be74648 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_spec.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/wood_planks_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=1 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Reflectance /reduce=1 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/worn_metal_ddna.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/worn_metal_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/worn_metal_ddna.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/pbs_reference/worn_metal_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_AO.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_AO.tif.exportsettings index aaaf14a9fe..25a6d5d697 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_AO.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_AO.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Reflectance /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_H.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_H.tif.exportsettings index 0c60643afc..08f50cf38b 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_H.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_H.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /mipgentype=sigma-six /preset=Displacement /reduce=0 \ No newline at end of file +/autooptimizefile=0 /mipgentype=sigma-six /preset=Displacement /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_albedo.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_albedo.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_albedo.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_albedo.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_normals_ddn.tif.exportsettings b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_normals_ddn.tif.exportsettings index 4eeacce656..d1103c9959 100644 --- a/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_normals_ddn.tif.exportsettings +++ b/Gems/PBSreferenceMaterials/Assets/materials/test_reference/test_normals_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Normals /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Normals /reduce=0 diff --git a/Gems/PhysX/Assets/PhysX_Dependencies.xml b/Gems/PhysX/Assets/PhysX_Dependencies.xml index 0c3d07ad7b..f40ee695d1 100644 --- a/Gems/PhysX/Assets/PhysX_Dependencies.xml +++ b/Gems/PhysX/Assets/PhysX_Dependencies.xml @@ -2,4 +2,4 @@ <Dependency path="project.physicsconfiguration" optional="true" /> <Dependency path="project.physxconfiguration" optional="true" /> <Dependency path="default.physxconfiguration" optional="true" /> -</EngineDependencies> \ No newline at end of file +</EngineDependencies> diff --git a/Gems/PhysX/CMakeLists.txt b/Gems/PhysX/CMakeLists.txt index d96d812af0..20a680bce9 100644 --- a/Gems/PhysX/CMakeLists.txt +++ b/Gems/PhysX/CMakeLists.txt @@ -9,6 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) - add_subdirectory(Code) diff --git a/Gems/PhysX/Code/CMakeLists.txt b/Gems/PhysX/Code/CMakeLists.txt index ac5fd902c2..e6f8fc7188 100644 --- a/Gems/PhysX/Code/CMakeLists.txt +++ b/Gems/PhysX/Code/CMakeLists.txt @@ -71,6 +71,9 @@ ly_add_target( if(PAL_TRAIT_BUILD_HOST_TOOLS) + ly_associate_package(PACKAGE_NAME poly2tri-0.3.3-rev2-multiplatform TARGETS poly2tri PACKAGE_HASH 04092d06716f59b936b61906eaf3647db23b685d81d8b66131eb53e0aeaa1a38) + ly_associate_package(PACKAGE_NAME v-hacd-2.0-rev1-multiplatform TARGETS v-hacd PACKAGE_HASH 5c71aef19cc9787d018d64eec076e9f51ea5a3e0dc6b6e22e57c898f6cc4afe3) + ly_add_target( NAME PhysX.Editor.Static STATIC NAMESPACE Gem diff --git a/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.cpp b/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.cpp index 8beb2df284..3c908f588c 100644 --- a/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.cpp @@ -113,4 +113,4 @@ namespace PhysX { PhysX::EditorColliderComponentRequestBus::Event(idPair, &PhysX::EditorColliderComponentRequests::SetAssetScale, ResetScale); } -} // namespace PhysX \ No newline at end of file +} // namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.h b/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.h index 6c535be12d..6857964f5a 100644 --- a/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.h +++ b/Gems/PhysX/Code/Editor/ColliderAssetScaleMode.h @@ -40,4 +40,4 @@ namespace PhysX AZ::Vector3 m_initialScale; AzToolsFramework::ScaleManipulators m_dimensionsManipulators; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderBoxMode.cpp b/Gems/PhysX/Code/Editor/ColliderBoxMode.cpp index e9bebb113b..7b7069a0c3 100644 --- a/Gems/PhysX/Code/Editor/ColliderBoxMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderBoxMode.cpp @@ -40,4 +40,4 @@ namespace PhysX idPair, &AzToolsFramework::BoxManipulatorRequests::SetDimensions, AZ::Vector3::CreateOne()); } -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Editor/ColliderBoxMode.h b/Gems/PhysX/Code/Editor/ColliderBoxMode.h index aec672013f..21b3c0b0ac 100644 --- a/Gems/PhysX/Code/Editor/ColliderBoxMode.h +++ b/Gems/PhysX/Code/Editor/ColliderBoxMode.h @@ -33,4 +33,4 @@ namespace PhysX private: AzToolsFramework::BoxViewportEdit m_boxEdit; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h index ae20c9ecd5..c79f459397 100644 --- a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h +++ b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h @@ -48,4 +48,4 @@ namespace PhysX AZStd::shared_ptr<AzToolsFramework::LinearManipulator> m_radiusManipulator; AZStd::shared_ptr<AzToolsFramework::LinearManipulator> m_heightManipulator; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderOffsetMode.h b/Gems/PhysX/Code/Editor/ColliderOffsetMode.h index b2a83b79e3..82b38e1956 100644 --- a/Gems/PhysX/Code/Editor/ColliderOffsetMode.h +++ b/Gems/PhysX/Code/Editor/ColliderOffsetMode.h @@ -37,4 +37,4 @@ namespace PhysX AzToolsFramework::TranslationManipulators m_translationManipulators; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp b/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp index ac122da4de..b80ff8fb0b 100644 --- a/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp @@ -98,4 +98,4 @@ namespace PhysX const AzFramework::CameraState cameraState = AzToolsFramework::GetCameraState(viewportInfo.m_viewportId); m_rotationManipulators.RefreshView(cameraState.m_position); } -} // namespace PhysX \ No newline at end of file +} // namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderRotationMode.h b/Gems/PhysX/Code/Editor/ColliderRotationMode.h index 1d1a335c34..e297a92ee0 100644 --- a/Gems/PhysX/Code/Editor/ColliderRotationMode.h +++ b/Gems/PhysX/Code/Editor/ColliderRotationMode.h @@ -42,4 +42,4 @@ namespace PhysX AzToolsFramework::RotationManipulators m_rotationManipulators; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderSphereMode.h b/Gems/PhysX/Code/Editor/ColliderSphereMode.h index 73ac4e53f0..c2e54ce65d 100644 --- a/Gems/PhysX/Code/Editor/ColliderSphereMode.h +++ b/Gems/PhysX/Code/Editor/ColliderSphereMode.h @@ -43,4 +43,4 @@ namespace PhysX AZ::Vector3 m_colliderOffset; AZStd::shared_ptr<AzToolsFramework::LinearManipulator> m_radiusManipulator; }; -} //namespace PhysX \ No newline at end of file +} //namespace PhysX diff --git a/Gems/PhysX/Code/Editor/ColliderSubComponentMode.h b/Gems/PhysX/Code/Editor/ColliderSubComponentMode.h index adaeec5314..a57bc07d9d 100644 --- a/Gems/PhysX/Code/Editor/ColliderSubComponentMode.h +++ b/Gems/PhysX/Code/Editor/ColliderSubComponentMode.h @@ -43,4 +43,4 @@ namespace PhysX /// @param idPair The entity/component id pair. virtual void ResetValues(const AZ::EntityComponentIdPair& idPair) = 0; }; -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Editor/ConfigStringLineEditCtrl.cpp b/Gems/PhysX/Code/Editor/ConfigStringLineEditCtrl.cpp index c6b46b35e0..6aaf45b184 100644 --- a/Gems/PhysX/Code/Editor/ConfigStringLineEditCtrl.cpp +++ b/Gems/PhysX/Code/Editor/ConfigStringLineEditCtrl.cpp @@ -276,4 +276,4 @@ namespace PhysX } } -#include <Editor/moc_ConfigStringLineEditCtrl.cpp> \ No newline at end of file +#include <Editor/moc_ConfigStringLineEditCtrl.cpp> diff --git a/Gems/PhysX/Code/Editor/ConfigurationWindowBus.h b/Gems/PhysX/Code/Editor/ConfigurationWindowBus.h index 43ee5609e5..d2aa735960 100644 --- a/Gems/PhysX/Code/Editor/ConfigurationWindowBus.h +++ b/Gems/PhysX/Code/Editor/ConfigurationWindowBus.h @@ -39,4 +39,4 @@ namespace PhysX using ConfigurationWindowRequestBus = AZ::EBus<ConfigurationWindowRequests>; } -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Editor/DocumentationLinkWidget.cpp b/Gems/PhysX/Code/Editor/DocumentationLinkWidget.cpp index 0c8906e6c5..a029676278 100644 --- a/Gems/PhysX/Code/Editor/DocumentationLinkWidget.cpp +++ b/Gems/PhysX/Code/Editor/DocumentationLinkWidget.cpp @@ -29,4 +29,4 @@ namespace PhysX setWordWrap(true); } } -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Editor/DocumentationLinkWidget.h b/Gems/PhysX/Code/Editor/DocumentationLinkWidget.h index 0d1063c6d8..65e784f595 100644 --- a/Gems/PhysX/Code/Editor/DocumentationLinkWidget.h +++ b/Gems/PhysX/Code/Editor/DocumentationLinkWidget.h @@ -25,4 +25,4 @@ namespace PhysX explicit DocumentationLinkWidget(const QString& linkFormat, const QString& linkAddress); }; } -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Editor/EditorJointComponentMode.cpp b/Gems/PhysX/Code/Editor/EditorJointComponentMode.cpp index 2bc9c3bc2b..7010707578 100644 --- a/Gems/PhysX/Code/Editor/EditorJointComponentMode.cpp +++ b/Gems/PhysX/Code/Editor/EditorJointComponentMode.cpp @@ -580,4 +580,4 @@ namespace PhysX return configMap; } -} // namespace LmbrCentral \ No newline at end of file +} // namespace LmbrCentral diff --git a/Gems/PhysX/Code/Editor/PropertyTypes.h b/Gems/PhysX/Code/Editor/PropertyTypes.h index c58fa917be..071afa9f46 100644 --- a/Gems/PhysX/Code/Editor/PropertyTypes.h +++ b/Gems/PhysX/Code/Editor/PropertyTypes.h @@ -19,4 +19,4 @@ namespace PhysX void RegisterPropertyTypes(); void UnregisterPropertyTypes(); } // namespace Editor -} // namespace PhysX \ No newline at end of file +} // namespace PhysX diff --git a/Gems/PhysX/Code/Include/PhysX/ComponentTypeIds.h b/Gems/PhysX/Code/Include/PhysX/ComponentTypeIds.h index 97c474f363..055fc80f27 100644 --- a/Gems/PhysX/Code/Include/PhysX/ComponentTypeIds.h +++ b/Gems/PhysX/Code/Include/PhysX/ComponentTypeIds.h @@ -39,4 +39,4 @@ namespace PhysX /// The type ID of runtime component PhysX::StaticRigidBodyComponent. /// static const AZ::TypeId StaticRigidBodyComponentTypeId("{A2CCCD3D-FB31-4D65-8DCD-2CD7E1D09538}"); -} \ No newline at end of file +} diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp index c470c05c58..eb4235766c 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp @@ -88,33 +88,33 @@ namespace PhysX editContext->Class<EditorProxyShapeConfig>( "EditorProxyShapeConfig", "PhysX Base shape collider") ->DataElement(AZ::Edit::UIHandlers::ComboBox, &EditorProxyShapeConfig::m_shapeType, "Shape", "The shape of the collider") - ->EnumAttribute(Physics::ShapeType::Sphere, "Sphere") - ->EnumAttribute(Physics::ShapeType::Box, "Box") - ->EnumAttribute(Physics::ShapeType::Capsule, "Capsule") - ->EnumAttribute(Physics::ShapeType::PhysicsAsset, "PhysicsAsset") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) - // note: we do not want the user to be able to change shape types while in ComponentMode (there will - // potentially be different ComponentModes for different shape types) - ->Attribute(AZ::Edit::Attributes::ReadOnly, &AzToolsFramework::ComponentModeFramework::InComponentMode) + ->EnumAttribute(Physics::ShapeType::Sphere, "Sphere") + ->EnumAttribute(Physics::ShapeType::Box, "Box") + ->EnumAttribute(Physics::ShapeType::Capsule, "Capsule") + ->EnumAttribute(Physics::ShapeType::PhysicsAsset, "PhysicsAsset") + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree) + // note: we do not want the user to be able to change shape types while in ComponentMode (there will + // potentially be different ComponentModes for different shape types) + ->Attribute(AZ::Edit::Attributes::ReadOnly, &AzToolsFramework::ComponentModeFramework::InComponentMode) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_sphere, "Sphere", "Configuration of sphere shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsSphereConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsSphereConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_box, "Box", "Configuration of box shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsBoxConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsBoxConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_capsule, "Capsule", "Configuration of capsule shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsCapsuleConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsCapsuleConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_physicsAsset, "Asset", "Configuration of asset shape") - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsAssetConfig) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::IsAssetConfig) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorProxyShapeConfig::m_subdivisionLevel, "Subdivision level", "The level of subdivision if a primitive shape is replaced with a convex mesh due to scaling") - ->Attribute(AZ::Edit::Attributes::Min, Utils::MinCapsuleSubdivisionLevel) - ->Attribute(AZ::Edit::Attributes::Max, Utils::MaxCapsuleSubdivisionLevel) - ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::ShowingSubdivisionLevel) - ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::Min, Utils::MinCapsuleSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::Max, Utils::MaxCapsuleSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::Visibility, &EditorProxyShapeConfig::ShowingSubdivisionLevel) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorProxyShapeConfig::OnConfigurationChanged) ; } } diff --git a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp index 639a079c02..c77e1ad1b2 100644 --- a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp @@ -687,8 +687,14 @@ namespace PhysX { if (auto* physXSystem = GetPhysXSystem()) { - physXSystem->RegisterSystemConfigurationChangedEvent(m_physXConfigChangedHandler); - physXSystem->RegisterOnDefaultMaterialLibraryChangedEventHandler(m_onDefaultMaterialLibraryChangedEventHandler); + if (!m_physXConfigChangedHandler.IsConnected()) + { + physXSystem->RegisterSystemConfigurationChangedEvent(m_physXConfigChangedHandler); + } + if (!m_onDefaultMaterialLibraryChangedEventHandler.IsConnected()) + { + physXSystem->RegisterOnDefaultMaterialLibraryChangedEventHandler(m_onDefaultMaterialLibraryChangedEventHandler); + } } } diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp index dba069ac29..9e5f92aa72 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterController.cpp @@ -311,7 +311,10 @@ namespace PhysX CreateShadowBody(configuration); SetTag(configuration.m_colliderTag); - m_simulating = true; + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_bodyHandle); + } } void CharacterController::DisablePhysics() @@ -323,7 +326,11 @@ namespace PhysX DestroyShadowBody(); RemoveControllerFromScene(); - m_simulating = false; + + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + sceneInterface->DisableSimulationOfBody(m_sceneOwner, m_bodyHandle); + } } void CharacterController::DestroyShadowBody() diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp index 2761980d1b..d1502a0c65 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.cpp @@ -96,25 +96,17 @@ namespace PhysX } } - AZStd::unique_ptr<CharacterController> CreateCharacterController(const Physics::CharacterConfiguration& characterConfig, - const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle sceneHandle) + CharacterController* CreateCharacterController(PhysXScene* scene, + const Physics::CharacterConfiguration& characterConfig) { - physx::PxControllerManager* manager = nullptr; - AzPhysics::Scene* scene = nullptr; - PhysX::PhysXScene* physxScene = nullptr; - if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get()) + if (scene == nullptr) { - scene = physicsSystem->GetScene(sceneHandle); - if (scene) - { - physxScene = azrtti_cast<PhysX::PhysXScene*>(scene); - if (physxScene) - { - manager = physxScene->GetOrCreateControllerManager(); - } - } + AZ_Error("PhysX Character Controller", false, "Failed to create character controller as the scene is null"); + return nullptr; } - if (!manager || !scene) + + physx::PxControllerManager* manager = scene->GetOrCreateControllerManager(); + if (manager == nullptr) { AZ_Error("PhysX Character Controller", false, "Could not retrieve character controller manager."); return nullptr; @@ -123,41 +115,47 @@ namespace PhysX auto callbackManager = AZStd::make_unique<CharacterControllerCallbackManager>(); physx::PxController* pxController = nullptr; - auto* pxScene = static_cast<physx::PxScene*>(physxScene->GetNativePointer()); + auto* pxScene = static_cast<physx::PxScene*>(scene->GetNativePointer()); - if (shapeConfig.GetShapeType() == Physics::ShapeType::Capsule) + switch (characterConfig.m_shapeConfig->GetShapeType()) { - physx::PxCapsuleControllerDesc capsuleDesc; + case Physics::ShapeType::Capsule: + { + physx::PxCapsuleControllerDesc capsuleDesc; - const Physics::CapsuleShapeConfiguration& capsuleConfig = static_cast<const Physics::CapsuleShapeConfiguration&>(shapeConfig); - // LY height means total height, PhysX means height of straight section - capsuleDesc.height = AZ::GetMax(epsilon, capsuleConfig.m_height - 2.0f * capsuleConfig.m_radius); - capsuleDesc.radius = capsuleConfig.m_radius; - capsuleDesc.climbingMode = physx::PxCapsuleClimbingMode::eCONSTRAINED; + const Physics::CapsuleShapeConfiguration& capsuleConfig = static_cast<const Physics::CapsuleShapeConfiguration&>(*characterConfig.m_shapeConfig); + // LY height means total height, PhysX means height of straight section + capsuleDesc.height = AZ::GetMax(epsilon, capsuleConfig.m_height - 2.0f * capsuleConfig.m_radius); + capsuleDesc.radius = capsuleConfig.m_radius; + capsuleDesc.climbingMode = physx::PxCapsuleClimbingMode::eCONSTRAINED; - AppendShapeIndependentProperties(capsuleDesc, characterConfig, callbackManager.get()); - AppendPhysXSpecificProperties(capsuleDesc, characterConfig); - PHYSX_SCENE_WRITE_LOCK(pxScene); - pxController = manager->createController(capsuleDesc); // This internally adds the controller's actor to the scene - } - else if (shapeConfig.GetShapeType() == Physics::ShapeType::Box) - { - physx::PxBoxControllerDesc boxDesc; + AppendShapeIndependentProperties(capsuleDesc, characterConfig, callbackManager.get()); + AppendPhysXSpecificProperties(capsuleDesc, characterConfig); + PHYSX_SCENE_WRITE_LOCK(pxScene); + pxController = manager->createController(capsuleDesc); // This internally adds the controller's actor to the scene + } + break; + case Physics::ShapeType::Box: + { + physx::PxBoxControllerDesc boxDesc; - const Physics::BoxShapeConfiguration& boxConfig = static_cast<const Physics::BoxShapeConfiguration&>(shapeConfig); - boxDesc.halfHeight = 0.5f * boxConfig.m_dimensions.GetZ(); - boxDesc.halfSideExtent = 0.5f * boxConfig.m_dimensions.GetY(); - boxDesc.halfForwardExtent = 0.5f * boxConfig.m_dimensions.GetX(); + const Physics::BoxShapeConfiguration& boxConfig = static_cast<const Physics::BoxShapeConfiguration&>(*characterConfig.m_shapeConfig); + boxDesc.halfHeight = 0.5f * boxConfig.m_dimensions.GetZ(); + boxDesc.halfSideExtent = 0.5f * boxConfig.m_dimensions.GetY(); + boxDesc.halfForwardExtent = 0.5f * boxConfig.m_dimensions.GetX(); - AppendShapeIndependentProperties(boxDesc, characterConfig, callbackManager.get()); - AppendPhysXSpecificProperties(boxDesc, characterConfig); - PHYSX_SCENE_WRITE_LOCK(pxScene); - pxController = manager->createController(boxDesc); // This internally adds the controller's actor to the scene - } - else - { - AZ_Error("PhysX Character Controller", false, "PhysX only supports box and capsule shapes for character controllers."); - return nullptr; + AppendShapeIndependentProperties(boxDesc, characterConfig, callbackManager.get()); + AppendPhysXSpecificProperties(boxDesc, characterConfig); + PHYSX_SCENE_WRITE_LOCK(pxScene); + pxController = manager->createController(boxDesc); // This internally adds the controller's actor to the scene + } + break; + default: + { + AZ_Error("PhysX Character Controller", false, "PhysX only supports box and capsule shapes for character controllers."); + return nullptr; + } + break; } if (!pxController) @@ -166,23 +164,21 @@ namespace PhysX return nullptr; } - auto controller = AZStd::make_unique<CharacterController>(pxController, AZStd::move(callbackManager), sceneHandle); - return controller; + return aznew CharacterController(pxController, AZStd::move(callbackManager), scene->GetSceneHandle()); } - AZStd::unique_ptr<Ragdoll> CreateRagdoll(Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle) + Ragdoll* CreateRagdoll(Physics::RagdollConfiguration& configuration, AzPhysics::SceneHandle sceneHandle) { const size_t numNodes = configuration.m_nodes.size(); - if (numNodes != initialState.size()) + if (numNodes != configuration.m_initialState.size()) { AZ_Error("PhysX Ragdoll", false, "Mismatch between number of nodes in ragdoll configuration (%i) " - "and number of nodes in the initial ragdoll state (%i)", numNodes, initialState.size()); + "and number of nodes in the initial ragdoll state (%i)", numNodes, configuration.m_initialState.size()); return nullptr; } AZStd::unique_ptr<Ragdoll> ragdoll = AZStd::make_unique<Ragdoll>(sceneHandle); - ragdoll->SetParentIndices(parentIndices); + ragdoll->SetParentIndices(configuration.m_parentIndices); auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get(); if (sceneInterface == nullptr) @@ -195,15 +191,21 @@ namespace PhysX for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { Physics::RagdollNodeConfiguration& nodeConfig = configuration.m_nodes[nodeIndex]; - const Physics::RagdollNodeState& nodeState = initialState[nodeIndex]; + const Physics::RagdollNodeState& nodeState = configuration.m_initialState[nodeIndex]; Physics::CharacterColliderNodeConfiguration* colliderNodeConfig = configuration.m_colliders.FindNodeConfigByName(nodeConfig.m_debugName); if (colliderNodeConfig) { AZStd::vector<AZStd::shared_ptr<Physics::Shape>> shapes; - for (const auto& shapeConfig : colliderNodeConfig->m_shapes) + for (const auto& [colliderConfig, shapeConfig] : colliderNodeConfig->m_shapes) { - if (auto shape = AZStd::make_shared<Shape>(*shapeConfig.first, *shapeConfig.second)) + if (colliderConfig == nullptr || shapeConfig == nullptr) + { + AZ_Error("PhysX Ragdoll", false, "Failed to create collider shape for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return nullptr; + } + + if (auto shape = AZStd::make_shared<Shape>(*colliderConfig, *shapeConfig)) { shapes.emplace_back(shape); } @@ -215,22 +217,20 @@ namespace PhysX } nodeConfig.m_colliderAndShapeData = shapes; } + nodeConfig.m_startSimulationEnabled = false; + nodeConfig.m_position = nodeState.m_position; + nodeConfig.m_orientation = nodeState.m_orientation; - AzPhysics::SimulatedBodyHandle newBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig); - if (newBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + AZStd::unique_ptr<RagdollNode> node = AZStd::make_unique<RagdollNode>(sceneHandle, nodeConfig); + if (node->GetRigidBodyHandle() != AzPhysics::InvalidSimulatedBodyHandle) + { + ragdoll->AddNode(AZStd::move(node)); + } + else { AZ_Error("PhysX Ragdoll", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); - return nullptr; + node.reset(); } - sceneInterface->DisableSimulationOfBody(sceneHandle, newBodyHandle); - auto* rigidBody = azdynamic_cast<AzPhysics::RigidBody*>(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, newBodyHandle)); - - physx::PxRigidDynamic* pxRigidDynamic = static_cast<physx::PxRigidDynamic*>(rigidBody->GetNativePointer()); - physx::PxTransform transform(PxMathConvert(nodeState.m_position), PxMathConvert(nodeState.m_orientation)); - pxRigidDynamic->setGlobalPose(transform); - - AZStd::unique_ptr<RagdollNode> node = AZStd::make_unique<RagdollNode>(rigidBody, newBodyHandle); - ragdoll->AddNode(AZStd::move(node)); } // Set up joints. Needs a second pass because child nodes in the ragdoll config aren't guaranteed to have @@ -238,7 +238,7 @@ namespace PhysX size_t rootIndex = SIZE_MAX; for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { - size_t parentIndex = parentIndices[nodeIndex]; + size_t parentIndex = configuration.m_parentIndices[nodeIndex]; if (parentIndex < numNodes) { physx::PxRigidDynamic* parentActor = ragdoll->GetPxRigidDynamic(parentIndex); @@ -304,8 +304,8 @@ namespace PhysX } ragdoll->SetRootIndex(rootIndex); - - return ragdoll; + + return ragdoll.release(); } physx::PxD6JointDrive CreateD6JointDrive(float stiffness, float dampingRatio, float forceLimit) diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h index 6eb10bd4eb..e919426457 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/CharacterUtils.h @@ -25,6 +25,7 @@ namespace Physics namespace PhysX { class CharacterController; + class PhysXScene; namespace Utils { @@ -33,18 +34,14 @@ namespace PhysX AZ::Outcome<size_t> GetNodeIndex(const Physics::RagdollConfiguration& configuration, const AZStd::string& nodeName); //! Creates a character controller based on the supplied configuration in the specified world. - //! @param configuration Information required to create the controller such as shape, slope behavior etc. - //! @param sceneHandle A handle to the physics scene in which the character controller should be created. - AZStd::unique_ptr<CharacterController> CreateCharacterController(const Physics::CharacterConfiguration& - characterConfig, const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle sceneHandle); + //! @param scene The scene to add the character controller to. + //! @param characterConfig Information required to create the controller such as shape, slope behavior etc. + CharacterController* CreateCharacterController(PhysXScene* scene, const Physics::CharacterConfiguration& characterConfig); //! Creates a ragdoll based on the specified setup and initial pose. //! @param configuration Information about collider geometry and joint setup required to initialize the ragdoll. - //! @param initialState Initial settings for the positions, orientations and velocities of the ragdoll nodes. - //! @param parentIndices Identifies the parent ragdoll node for each node in the ragdoll. //! @param sceneHandle A handle to the physics scene in which the ragdoll should be created. - AZStd::unique_ptr<Ragdoll> CreateRagdoll(Physics::RagdollConfiguration& configuration, - const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle); + Ragdoll* CreateRagdoll(Physics::RagdollConfiguration& configuration, AzPhysics::SceneHandle sceneHandle); //! Creates a joint drive with properties based on the input values. //! The input values are validated and the damping ratio is used to calculate the damping value used internally. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp index 72cb511e21..5249781e31 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.cpp @@ -45,7 +45,7 @@ namespace PhysX AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); if (serializeContext) { - serializeContext->Class<Ragdoll>() + serializeContext->Class<PhysX::Ragdoll, Physics::Ragdoll>() ->Version(1) ; } @@ -56,7 +56,7 @@ namespace PhysX m_nodes.push_back(AZStd::move(node)); } - void Ragdoll::SetParentIndices(const ParentIndices& parentIndices) + void Ragdoll::SetParentIndices(const Physics::ParentIndices& parentIndices) { m_parentIndices = parentIndices; } @@ -109,7 +109,6 @@ namespace PhysX this->ApplyQueuedDisableSimulation(); }) { - m_simulating = false; m_sceneOwner = sceneHandle; } @@ -117,14 +116,7 @@ namespace PhysX { m_sceneStartSimHandler.Disconnect(); - if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) - { - const size_t numNodes = m_nodes.size(); - for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) - { - sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); - } - } + m_nodes.clear(); //the nodes destructor will remove the simulated body from the scene. } void Ragdoll::ApplyQueuedEnableSimulation() @@ -204,7 +196,6 @@ namespace PhysX sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_nodes[nodeIndex]->GetRigidBodyHandle()); } - else { AZ_Error("PhysX Ragdoll", false, "Invalid PhysX actor for node index %i", nodeIndex); @@ -222,8 +213,7 @@ namespace PhysX } sceneInterface->RegisterSceneSimulationStartHandler(m_sceneOwner, m_sceneStartSimHandler); - - m_simulating = true; + sceneInterface->EnableSimulationOfBody(m_sceneOwner, m_bodyHandle); } void Ragdoll::EnableSimulationQueued(const Physics::RagdollState& initialState) @@ -276,7 +266,7 @@ namespace PhysX } } - m_simulating = false; + sceneInterface->DisableSimulationOfBody(m_sceneOwner, m_bodyHandle); } void Ragdoll::DisableSimulationQueued() diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h index 46bae6648b..7bf807bcc5 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/Ragdoll.h @@ -19,8 +19,6 @@ namespace PhysX { - using ParentIndices = AZStd::vector<size_t>; - /// PhysX specific implementation of generic physics API Ragdoll class. class Ragdoll : public Physics::Ragdoll @@ -29,7 +27,7 @@ namespace PhysX friend class RagdollComponent; AZ_CLASS_ALLOCATOR(Ragdoll, AZ::SystemAllocator, 0); - AZ_TYPE_INFO_LEGACY(PhysX::Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); + AZ_RTTI(PhysX::Ragdoll, "{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}", Physics::Ragdoll); static void Reflect(AZ::ReflectContext* context); Ragdoll() = default; @@ -38,7 +36,7 @@ namespace PhysX ~Ragdoll(); void AddNode(AZStd::unique_ptr<RagdollNode> node); - void SetParentIndices(const ParentIndices& parentIndices); + void SetParentIndices(const Physics::ParentIndices& parentIndices); void SetRootIndex(size_t nodeIndex); physx::PxRigidDynamic* GetPxRigidDynamic(size_t nodeIndex) const; physx::PxTransform GetRootPxTransform() const; @@ -75,7 +73,7 @@ namespace PhysX void ApplyQueuedDisableSimulation(); AZStd::vector<AZStd::unique_ptr<RagdollNode>> m_nodes; - ParentIndices m_parentIndices; + Physics::ParentIndices m_parentIndices; AZ::Outcome<size_t> m_rootIndex = AZ::Failure(); /// Queued initial state for the ragdoll, for EnableSimulationQueued, to be applied prior to the world update. diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp index 63d62144f8..6e3b97212b 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.cpp @@ -12,6 +12,7 @@ #include <PhysX_precompiled.h> #include <AzCore/Serialization/EditContext.h> +#include <AzFramework/Physics/PhysicsScene.h> #include <AzFramework/Physics/Common/PhysicsSceneQueries.h> #include <PhysXCharacters/API/RagdollNode.h> #include <PhysX/NativeTypeIdentifiers.h> @@ -30,14 +31,14 @@ namespace PhysX } } - RagdollNode::RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle) - : m_rigidBody(rigidBody) - , m_rigidBodyHandle(rigidBodyHandle) + RagdollNode::RagdollNode(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig) { - physx::PxRigidDynamic* pxRigidDynamic = static_cast<physx::PxRigidDynamic*>(m_rigidBody->GetNativePointer()); - m_actorUserData = PhysX::ActorData(pxRigidDynamic); - m_actorUserData.SetRagdollNode(this); - m_actorUserData.SetEntityId(m_rigidBody->GetEntityId()); + CreatePhysicsBody(sceneHandle, nodeConfig); + } + + RagdollNode::~RagdollNode() + { + DestroyPhysicsBody(); } void RagdollNode::SetJoint(const AZStd::shared_ptr<Physics::Joint>& joint) @@ -124,4 +125,47 @@ namespace PhysX { return m_rigidBodyHandle; } + + void RagdollNode::CreatePhysicsBody(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig) + { + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + m_rigidBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig); + if (m_rigidBodyHandle == AzPhysics::InvalidSimulatedBodyHandle) + { + AZ_Error("PhysX RagdollNode", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return; + } + m_rigidBody = azdynamic_cast<AzPhysics::RigidBody*>(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, m_rigidBodyHandle)); + } + if (m_rigidBody == nullptr) + { + AZ_Error("PhysX RagdollNode", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str()); + return; + } + m_sceneOwner = sceneHandle; + + physx::PxRigidDynamic* pxRigidDynamic = static_cast<physx::PxRigidDynamic*>(m_rigidBody->GetNativePointer()); + physx::PxTransform transform(PxMathConvert(nodeConfig.m_position), PxMathConvert(nodeConfig.m_orientation)); + pxRigidDynamic->setGlobalPose(transform); + + m_actorUserData = PhysX::ActorData(pxRigidDynamic); + m_actorUserData.SetRagdollNode(this); + m_actorUserData.SetEntityId(m_rigidBody->GetEntityId()); + } + + void RagdollNode::DestroyPhysicsBody() + { + if (m_rigidBody != nullptr) + { + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_rigidBodyHandle); + } + m_rigidBody = nullptr; + m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + m_sceneOwner = AzPhysics::InvalidSceneHandle; + } + } + } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h index c23930e25e..0567723c01 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/API/RagdollNode.h @@ -29,8 +29,8 @@ namespace PhysX static void Reflect(AZ::ReflectContext* context); RagdollNode() = default; - explicit RagdollNode(AzPhysics::RigidBody* rigidBody, AzPhysics::SimulatedBodyHandle rigidBodyHandle); - ~RagdollNode() = default; + explicit RagdollNode(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig); + ~RagdollNode(); void SetJoint(const AZStd::shared_ptr<Physics::Joint>& joint); @@ -58,9 +58,13 @@ namespace PhysX AzPhysics::SimulatedBodyHandle GetRigidBodyHandle() const; private: + void CreatePhysicsBody(AzPhysics::SceneHandle sceneHandle, Physics::RagdollNodeConfiguration& nodeConfig); + void DestroyPhysicsBody(); + AZStd::shared_ptr<Physics::Joint> m_joint; AzPhysics::RigidBody* m_rigidBody; AzPhysics::SimulatedBodyHandle m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle; + AzPhysics::SceneHandle m_sceneOwner = AzPhysics::InvalidSceneHandle; PhysX::ActorData m_actorUserData; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp index bd12b68ca3..ca02554036 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.cpp @@ -67,7 +67,7 @@ namespace PhysX CharacterControllerComponent::CharacterControllerComponent() = default; CharacterControllerComponent::CharacterControllerComponent(AZStd::unique_ptr<Physics::CharacterConfiguration> characterConfig, - AZStd::unique_ptr<Physics::ShapeConfiguration> shapeConfig) + AZStd::shared_ptr<Physics::ShapeConfiguration> shapeConfig) : m_characterConfig(AZStd::move(characterConfig)) , m_shapeConfig(AZStd::move(shapeConfig)) { @@ -188,7 +188,7 @@ namespace PhysX Physics::Character* CharacterControllerComponent::GetCharacter() { - return m_controller.get(); + return m_controller; } void CharacterControllerComponent::EnablePhysics() @@ -217,7 +217,7 @@ namespace PhysX AzPhysics::SimulatedBody* CharacterControllerComponent::GetWorldBody() { - return m_controller.get(); + return GetCharacter(); } AzPhysics::SceneQueryHit CharacterControllerComponent::RayCast(const AzPhysics::RayCastRequest& request) @@ -382,7 +382,7 @@ namespace PhysX void CharacterControllerComponent::CreateController() { - if (m_controller) + if (IsPhysicsEnabled()) { return; } @@ -397,22 +397,32 @@ namespace PhysX m_characterConfig->m_debugName = GetEntity()->GetName(); m_characterConfig->m_entityId = GetEntityId(); + m_characterConfig->m_shapeConfig = m_shapeConfig; + // get all the collider shapes and add it to the config + PhysX::ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [this](PhysX::ColliderComponentRequests* handler) + { + auto shapes = handler->GetShapes(); + m_characterConfig->m_colliders.insert(m_characterConfig->m_colliders.end(), shapes.begin(), shapes.end()); + return true; + }); - m_controller = Utils::Characters::CreateCharacterController(*m_characterConfig, *m_shapeConfig, defaultSceneHandle); - if (!m_controller) + // It's usually more convenient to control the foot position rather than the centre of the capsule, so + // make the foot position coincide with the entity position. + AZ::Vector3 entityTranslation = AZ::Vector3::CreateZero(); + AZ::TransformBus::EventResult(entityTranslation, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation); + m_characterConfig->m_position = entityTranslation; + + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(defaultSceneHandle, m_characterConfig.get()); + m_controller = azdynamic_cast<PhysX::CharacterController*>(sceneInterface->GetSimulatedBodyFromHandle(defaultSceneHandle, bodyHandle)); + } + if (m_controller == nullptr) { AZ_Error("PhysX Character Controller Component", false, "Failed to create character controller."); return; } - m_controller->EnablePhysics(*m_characterConfig); - - AZ::Vector3 entityTranslation = AZ::Vector3::CreateZero(); - AZ::TransformBus::EventResult(entityTranslation, GetEntityId(), &AZ::TransformBus::Events::GetWorldTranslation); - // It's usually more convenient to control the foot position rather than the centre of the capsule, so - // make the foot position coincide with the entity position. - m_controller->SetBasePosition(entityTranslation); - AttachColliders(*m_controller); - + CharacterControllerRequestBus::Handler::BusConnect(GetEntityId()); m_preSimulateHandler = AzPhysics::SystemEvents::OnPresimulateEvent::Handler( @@ -426,27 +436,22 @@ namespace PhysX { physXSystem->RegisterPreSimulateEvent(m_preSimulateHandler); } - - Physics::WorldBodyNotificationBus::Event(GetEntityId(), &Physics::WorldBodyNotifications::OnPhysicsEnabled); } void CharacterControllerComponent::DestroyController() { - if (!m_controller) + if (!IsPhysicsEnabled()) { return; } m_controller->DisablePhysics(); - // The character is first removed from the scene, and then its deletion is deferred. - // This ensures trigger exit events are raised correctly on deleted objects. + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) { - auto* scene = azdynamic_cast<PhysX::PhysXScene*>(m_controller->GetScene()); - AZ_Assert(scene, "Invalid PhysX scene"); - scene->DeferDelete(AZStd::move(m_controller)); - m_controller.reset(); + sceneInterface->RemoveSimulatedBody(m_controller->m_sceneOwner, m_controller->m_bodyHandle); } + m_controller = nullptr; m_preSimulateHandler.Disconnect(); @@ -454,17 +459,4 @@ namespace PhysX Physics::WorldBodyNotificationBus::Event(GetEntityId(), &Physics::WorldBodyNotifications::OnPhysicsDisabled); } - - void CharacterControllerComponent::AttachColliders(Physics::Character& character) - { - PhysX::ColliderComponentRequestBus::EnumerateHandlersId(GetEntityId(), [&character](PhysX::ColliderComponentRequests* handler) - { - for (auto& shape : handler->GetShapes()) - { - character.AttachShape(shape); - } - return true; - }); - } - } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h index 42ac5d4cce..ca956b1757 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h @@ -47,7 +47,7 @@ namespace PhysX CharacterControllerComponent(); CharacterControllerComponent(AZStd::unique_ptr<Physics::CharacterConfiguration> characterConfig, - AZStd::unique_ptr<Physics::ShapeConfiguration> shapeConfig); + AZStd::shared_ptr<Physics::ShapeConfiguration> shapeConfig); ~CharacterControllerComponent(); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) @@ -131,12 +131,12 @@ namespace PhysX private: void CreateController(); void DestroyController(); - void AttachColliders(Physics::Character& character); + void OnPreSimulate(float deltaTime); AZStd::unique_ptr<Physics::CharacterConfiguration> m_characterConfig; - AZStd::unique_ptr<Physics::ShapeConfiguration> m_shapeConfig; - AZStd::unique_ptr<PhysX::CharacterController> m_controller; + AZStd::shared_ptr<Physics::ShapeConfiguration> m_shapeConfig; + PhysX::CharacterController* m_controller = nullptr; AzPhysics::SystemEvents::OnPresimulateEvent::Handler m_preSimulateHandler; }; } // namespace PhysX diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/EditorCharacterControllerComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/EditorCharacterControllerComponent.cpp index 3f76b269e7..9a85274910 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/EditorCharacterControllerComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/EditorCharacterControllerComponent.cpp @@ -149,7 +149,10 @@ namespace PhysX { if (auto* physXSystem = GetPhysXSystem()) { - physXSystem->RegisterSystemConfigurationChangedEvent(m_physXConfigChangedHandler); + if (!m_physXConfigChangedHandler.IsConnected()) + { + physXSystem->RegisterSystemConfigurationChangedEvent(m_physXConfigChangedHandler); + } } } diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp index 56627ff7b9..d120e3d6b0 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.cpp @@ -55,6 +55,16 @@ namespace PhysX } } + if (classElement.GetVersion() < 3) + { + int ragdollElementIndex = classElement.FindElement(AZ_CRC_CE("PhysXRagdoll")); + + if (ragdollElementIndex >= 0) + { + classElement.RemoveElement(ragdollElementIndex); + } + } + return true; } @@ -66,8 +76,7 @@ namespace PhysX if (serializeContext) { serializeContext->Class<RagdollComponent, AZ::Component>() - ->Version(2, &VersionConverter) - ->Field("PhysXRagdoll", &RagdollComponent::m_ragdoll) + ->Version(3, &VersionConverter) ->Field("PositionIterations", &RagdollComponent::m_positionIterations) ->Field("VelocityIterations", &RagdollComponent::m_velocityIterations) ->Field("EnableJointProjection", &RagdollComponent::m_enableJointProjection) @@ -187,7 +196,7 @@ namespace PhysX Physics::Ragdoll* RagdollComponent::GetRagdoll() { - return m_ragdoll.get(); + return m_ragdoll; } void RagdollComponent::GetState(Physics::RagdollState& ragdollState) const @@ -250,7 +259,7 @@ namespace PhysX AzPhysics::SimulatedBody* RagdollComponent::GetWorldBody() { - return m_ragdoll.get(); + return GetRagdoll(); } AzPhysics::SceneQueryHit RagdollComponent::RayCast(const AzPhysics::RayCastRequest& request) @@ -283,8 +292,8 @@ namespace PhysX return; } - ParentIndices parentIndices; - parentIndices.resize(numNodes); + + ragdollConfiguration.m_parentIndices.resize(numNodes); for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++) { AZStd::string parentName; @@ -292,7 +301,7 @@ namespace PhysX AzFramework::CharacterPhysicsDataRequestBus::EventResult(parentName, GetEntityId(), &AzFramework::CharacterPhysicsDataRequests::GetParentNodeName, nodeName); AZ::Outcome<size_t> parentIndex = Utils::Characters::GetNodeIndex(ragdollConfiguration, parentName); - parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; + ragdollConfiguration.m_parentIndices[nodeIndex] = parentIndex ? parentIndex.GetValue() : SIZE_MAX; ragdollConfiguration.m_nodes[nodeIndex].m_entityId = GetEntityId(); } @@ -303,12 +312,17 @@ namespace PhysX AZ::Transform entityTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(entityTransform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); - Physics::RagdollState bindPoseWorld = GetBindPoseWorld(bindPose, entityTransform); + ragdollConfiguration.m_initialState = GetBindPoseWorld(bindPose, entityTransform); AzPhysics::SceneHandle defaultSceneHandle = AzPhysics::InvalidSceneHandle; Physics::DefaultWorldBus::BroadcastResult(defaultSceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle); - m_ragdoll = Utils::Characters::CreateRagdoll(ragdollConfiguration, bindPoseWorld, parentIndices, defaultSceneHandle); - if (!m_ragdoll) + + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(defaultSceneHandle, &ragdollConfiguration); + m_ragdoll = azdynamic_cast<PhysX::Ragdoll*>(sceneInterface->GetSimulatedBodyFromHandle(defaultSceneHandle, bodyHandle)); + } + if (m_ragdoll == nullptr) { AZ_Error("PhysX Ragdoll Component", false, "Failed to create ragdoll."); return; @@ -358,7 +372,11 @@ namespace PhysX AzFramework::RagdollPhysicsNotificationBus::Event(GetEntityId(), &AzFramework::RagdollPhysicsNotifications::OnRagdollDeactivated); - m_ragdoll.reset(); + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + sceneInterface->RemoveSimulatedBody(m_ragdoll->m_sceneOwner, m_ragdoll->m_bodyHandle); + } + m_ragdoll = nullptr; } } diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h index 77a4c992a3..1b616dda79 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/RagdollComponent.h @@ -32,7 +32,7 @@ namespace PhysX , public AzFramework::CharacterPhysicsDataNotificationBus::Handler { public: - AZ_COMPONENT(RagdollComponent, "{B89498F8-4718-42FE-A457-A377DD0D61A0}"); + AZ_COMPONENT(PhysX::RagdollComponent, "{B89498F8-4718-42FE-A457-A377DD0D61A0}"); static void Reflect(AZ::ReflectContext* context); @@ -105,7 +105,7 @@ namespace PhysX bool IsJointProjectionVisible(); - AZStd::unique_ptr<Ragdoll> m_ragdoll; + Ragdoll* m_ragdoll; /// Minimum number of position iterations to perform in the PhysX solver. /// Lower iteration counts are less expensive but may behave less realistically. AZ::u32 m_positionIterations = 16; diff --git a/Gems/PhysX/Code/Source/Platform/Android/PAL_android.cmake b/Gems/PhysX/Code/Source/Platform/Android/PAL_android.cmake index c4e46f9b91..975225b8a4 100644 --- a/Gems/PhysX/Code/Source/Platform/Android/PAL_android.cmake +++ b/Gems/PhysX/Code/Source/Platform/Android/PAL_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) diff --git a/Gems/PhysX/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/PhysX/Code/Source/Platform/Linux/PAL_linux.cmake index c4e46f9b91..975225b8a4 100644 --- a/Gems/PhysX/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/PhysX/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) diff --git a/Gems/PhysX/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/PhysX/Code/Source/Platform/Mac/PAL_mac.cmake index c4e46f9b91..975225b8a4 100644 --- a/Gems/PhysX/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/PhysX/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) diff --git a/Gems/PhysX/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/PhysX/Code/Source/Platform/Windows/PAL_windows.cmake index c4e46f9b91..975225b8a4 100644 --- a/Gems/PhysX/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/PhysX/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) diff --git a/Gems/PhysX/Code/Source/Platform/iOS/PAL_ios.cmake b/Gems/PhysX/Code/Source/Platform/iOS/PAL_ios.cmake index c4e46f9b91..975225b8a4 100644 --- a/Gems/PhysX/Code/Source/Platform/iOS/PAL_ios.cmake +++ b/Gems/PhysX/Code/Source/Platform/iOS/PAL_ios.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_PHYSX_SUPPORTED TRUE) diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp index 28c8cc327b..03bbac9fd4 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp @@ -16,6 +16,7 @@ #include <AzCore/Debug/ProfilerBus.h> #include <AzCore/std/containers/variant.h> #include <AzCore/std/containers/vector.h> +#include <AzFramework/Physics/Character.h> #include <AzFramework/Physics/Collision/CollisionEvents.h> #include <AzFramework/Physics/Configuration/RigidBodyConfiguration.h> #include <AzFramework/Physics/Configuration/StaticRigidBodyConfiguration.h> @@ -27,6 +28,8 @@ #include <Common/PhysXSceneQueryHelpers.h> #include <PhysX/PhysXLocks.h> #include <PhysX/Utils.h> +#include <PhysXCharacters/API/CharacterController.h> +#include <PhysXCharacters/API/CharacterUtils.h> #include <System/PhysXSystem.h> namespace PhysX @@ -186,6 +189,33 @@ namespace PhysX return newBody; } + AzPhysics::SimulatedBody* CreateCharacterBody(PhysXScene* scene, + const Physics::CharacterConfiguration* characterConfig) + { + CharacterController* controller = Utils::Characters::CreateCharacterController(scene, *characterConfig); + if (controller == nullptr) + { + AZ_Error("PhysXScene", false, "Failed to create character controller."); + return nullptr; + } + controller->EnablePhysics(*characterConfig); + controller->SetBasePosition(characterConfig->m_position); + + for (auto shape : characterConfig->m_colliders) + { + controller->AttachShape(shape); + } + + return controller; + } + + AzPhysics::SimulatedBody* CreateRagdollBody(PhysXScene* scene, + const Physics::RagdollConfiguration* ragdollConfig) + { + return Utils::Characters::CreateRagdoll(const_cast<Physics::RagdollConfiguration&>(*ragdollConfig), + scene->GetSceneHandle()); + } + //helper to perform a ray cast AzPhysics::SceneQueryHits RayCast(const AzPhysics::RayCastRequest* raycastRequest, AZStd::vector<physx::PxRaycastHit>& raycastBuffer, @@ -595,6 +625,19 @@ namespace PhysX newBody = Internal::CreateSimulatedBody<StaticRigidBody, AzPhysics::StaticRigidBodyConfiguration>( azdynamic_cast<const AzPhysics::StaticRigidBodyConfiguration*>(simulatedBodyConfig), newBodyCrc); } + else if (azrtti_istypeof<Physics::CharacterConfiguration>(simulatedBodyConfig)) + { + newBody = Internal::CreateCharacterBody(this, azdynamic_cast<const Physics::CharacterConfiguration*>(simulatedBodyConfig)); + } + else if (azrtti_istypeof<Physics::RagdollConfiguration>(simulatedBodyConfig)) + { + newBody = Internal::CreateRagdollBody(this, azdynamic_cast<const Physics::RagdollConfiguration*>(simulatedBodyConfig)); + } + else + { + AZ_Warning("PhysXScene", false, "Unknown SimulatedBodyConfiguration."); + return AzPhysics::InvalidSimulatedBodyHandle; + } if (newBody != nullptr) { @@ -621,8 +664,11 @@ namespace PhysX newBody->m_bodyHandle = newBodyHandle; m_simulatedBodyAddedEvent.Signal(m_sceneHandle, newBodyHandle); - // Enable simulation by default (not signaling OnSimulationBodySimulationEnabled event) - EnableSimulationOfBodyInternal(*newBody); + // Enable simulation by default (not signaling OnSimulationBodySimulationEnabled event) + if (simulatedBodyConfig->m_startSimulationEnabled) + { + EnableSimulationOfBodyInternal(*newBody); + } return newBodyHandle; } @@ -850,20 +896,25 @@ namespace PhysX void PhysXScene::EnableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) { - auto pxActor = static_cast<physx::PxActor*>(body.GetNativePointer()); - AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); - + //character controller is a special actor and only needs the m_simulating flag set, + if (!azrtti_istypeof<PhysX::CharacterController>(body) && + !azrtti_istypeof<PhysX::Ragdoll>(body)) { - PHYSX_SCENE_WRITE_LOCK(m_pxScene); - m_pxScene->addActor(*pxActor); - } + auto pxActor = static_cast<physx::PxActor*>(body.GetNativePointer()); + AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); - if (azrtti_istypeof<PhysX::RigidBody>(body)) - { - auto rigidBody = azdynamic_cast<PhysX::RigidBody*>(&body); - if (rigidBody->ShouldStartAsleep()) { - rigidBody->ForceAsleep(); + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->addActor(*pxActor); + } + + if (azrtti_istypeof<PhysX::RigidBody>(body)) + { + auto rigidBody = azdynamic_cast<PhysX::RigidBody*>(&body); + if (rigidBody->ShouldStartAsleep()) + { + rigidBody->ForceAsleep(); + } } } @@ -872,14 +923,18 @@ namespace PhysX void PhysXScene::DisableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body) { - auto pxActor = static_cast<physx::PxActor*>(body.GetNativePointer()); - AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); - + //character controller is a special actor and only needs the m_simulating flag set, + if (!azrtti_istypeof<PhysX::CharacterController>(body) && + !azrtti_istypeof<PhysX::Ragdoll>(body)) { - PHYSX_SCENE_WRITE_LOCK(m_pxScene); - m_pxScene->removeActor(*pxActor); - } + auto pxActor = static_cast<physx::PxActor*>(body.GetNativePointer()); + AZ_Assert(pxActor, "Simulated Body doesn't have a valid physx actor"); + { + PHYSX_SCENE_WRITE_LOCK(m_pxScene); + m_pxScene->removeActor(*pxActor); + } + } body.m_simulating = false; } @@ -907,11 +962,6 @@ namespace PhysX return m_controllerManager; } - void PhysXScene::DeferDelete(AZStd::unique_ptr<AzPhysics::SimulatedBody> worldBody) - { - m_deferredDeletions_uniquePtrs.push_back(AZStd::move(worldBody)); - } - void* PhysXScene::GetNativePointer() const { return m_pxScene; @@ -919,12 +969,14 @@ namespace PhysX void PhysXScene::ClearDeferedDeletions() { - for (auto& simulatedBody : m_deferredDeletions) + // swap the deletions in case the simulated body + // manages more bodies and removes them on destruction (ie. Ragdoll). + AZStd::vector<AzPhysics::SimulatedBody*> deletions; + deletions.swap(m_deferredDeletions); + for (auto* simulatedBody : deletions) { delete simulatedBody; } - m_deferredDeletions.clear(); - m_deferredDeletions_uniquePtrs.clear(); } void PhysXScene::ProcessTriggerEvents() diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.h b/Gems/PhysX/Code/Source/Scene/PhysXScene.h index ec708cee9e..8bf20fca55 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.h +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.h @@ -73,7 +73,6 @@ namespace PhysX void* GetNativePointer() const override; physx::PxControllerManager* GetOrCreateControllerManager(); - void DeferDelete(AZStd::unique_ptr<AzPhysics::SimulatedBody> worldBody); private: void EnableSimulationOfBodyInternal(AzPhysics::SimulatedBody& body); @@ -93,7 +92,6 @@ namespace PhysX AZStd::vector<AZStd::pair<AZ::Crc32, AzPhysics::SimulatedBody*>> m_simulatedBodies; //this will become a SimulatedBody with LYN-1334 AZStd::vector<AzPhysics::SimulatedBody*> m_deferredDeletions; - AZStd::vector<AZStd::unique_ptr<AzPhysics::SimulatedBody>> m_deferredDeletions_uniquePtrs; // this is to support Character as it stores itself in a unique pointer currently. AZStd::queue<AzPhysics::SimulatedBodyIndex> m_freeSceneSlots; AzPhysics::SystemEvents::OnConfigurationChangedEvent::Handler m_physicsSystemConfigChanged; diff --git a/Gems/PhysX/Code/Source/SystemComponent.cpp b/Gems/PhysX/Code/Source/SystemComponent.cpp index 8210492fe7..9ef4dc5099 100644 --- a/Gems/PhysX/Code/Source/SystemComponent.cpp +++ b/Gems/PhysX/Code/Source/SystemComponent.cpp @@ -211,7 +211,6 @@ namespace PhysX Physics::SystemRequestBus::Handler::BusConnect(); PhysX::SystemRequestsBus::Handler::BusConnect(); Physics::CollisionRequestBus::Handler::BusConnect(); - Physics::CharacterSystemRequestBus::Handler::BusConnect(); ActivatePhysXSystem(); } @@ -219,7 +218,6 @@ namespace PhysX void SystemComponent::Deactivate() { AZ::TickBus::Handler::BusDisconnect(); - Physics::CharacterSystemRequestBus::Handler::BusDisconnect(); Physics::CollisionRequestBus::Handler::BusDisconnect(); PhysX::SystemRequestsBus::Handler::BusDisconnect(); Physics::SystemRequestBus::Handler::BusDisconnect(); @@ -421,13 +419,6 @@ namespace PhysX } } - // Physics::CharacterSystemRequestBus - AZStd::unique_ptr<Physics::Character> SystemComponent::CreateCharacter(const Physics::CharacterConfiguration& - characterConfig, const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) - { - return Utils::Characters::CreateCharacterController(characterConfig, shapeConfig, sceneHandle); - } - AzPhysics::CollisionLayer SystemComponent::GetCollisionLayerByName(const AZStd::string& layerName) { return m_physXSystem->GetPhysXConfiguration().m_collisionConfig.m_collisionLayers.GetLayer(layerName); diff --git a/Gems/PhysX/Code/Source/SystemComponent.h b/Gems/PhysX/Code/Source/SystemComponent.h index 8c4ac0d836..8871adfeeb 100644 --- a/Gems/PhysX/Code/Source/SystemComponent.h +++ b/Gems/PhysX/Code/Source/SystemComponent.h @@ -57,7 +57,6 @@ namespace PhysX : public AZ::Component , public Physics::SystemRequestBus::Handler , public PhysX::SystemRequestsBus::Handler - , public Physics::CharacterSystemRequestBus::Handler , private Physics::CollisionRequestBus::Handler , private AZ::TickBus::Handler { @@ -96,10 +95,6 @@ namespace PhysX physx::PxFilterData CreateFilterData(const AzPhysics::CollisionLayer& layer, const AzPhysics::CollisionGroup& group) override; physx::PxCooking* GetCooking() override; - // Physics::CharacterSystemRequestBus - virtual AZStd::unique_ptr<Physics::Character> CreateCharacter(const Physics::CharacterConfiguration& characterConfig, - const Physics::ShapeConfiguration& shapeConfig, AzPhysics::SceneHandle& sceneHandle) override; - // CollisionRequestBus AzPhysics::CollisionLayer GetCollisionLayerByName(const AZStd::string& layerName) override; AZStd::string GetCollisionLayerName(const AzPhysics::CollisionLayer& layer) override; diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp index 892d7b2da0..c7b9bd5623 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp @@ -130,7 +130,9 @@ namespace PhysX::Benchmarks //! @param colliderType, the collider type to use //! @param scene, the scene to spawn the characters controller into //! @param genSpawnPosFuncPtr - [optional] function pointer to allow caller to pick the spawn position - AZStd::vector<AZStd::unique_ptr<Physics::Character>> CreateCharacterControllers(int numCharacterControllers, CharacterConstants::CharacterSettings::ColliderType colliderType, + AZStd::vector<Physics::Character*> CreateCharacterControllers( + int numCharacterControllers, + CharacterConstants::CharacterSettings::ColliderType colliderType, AzPhysics::SceneHandle& sceneHandle, GenerateSpawnPositionFuncPtr* genSpawnPosFuncPtr = nullptr) { @@ -139,12 +141,11 @@ namespace PhysX::Benchmarks characterConfig.m_maximumSlopeAngle = CharacterConstants::CharacterSettings::MaximumSlopeAngle; characterConfig.m_stepHeight = CharacterConstants::CharacterSettings::StepHeight; - Physics::ShapeConfiguration* shapeConfig = nullptr; switch (colliderType) { case CharacterConstants::CharacterSettings::ColliderType::Box: { - shapeConfig = new Physics::BoxShapeConfiguration( + characterConfig.m_shapeConfig = AZStd::make_shared<Physics::BoxShapeConfiguration>( AZ::Vector3(CharacterConstants::CharacterSettings::CharacterBoxWidth, CharacterConstants::CharacterSettings::CharacterBoxDepth, CharacterConstants::CharacterSettings::CharacterBoxHeight) @@ -155,26 +156,32 @@ namespace PhysX::Benchmarks case CharacterConstants::CharacterSettings::ColliderType::Capsule: default: { - shapeConfig = new Physics::CapsuleShapeConfiguration(CharacterConstants::CharacterSettings::CharacterCylinderHeight, + characterConfig.m_shapeConfig = AZStd::make_shared<Physics::CapsuleShapeConfiguration>( + CharacterConstants::CharacterSettings::CharacterCylinderHeight, CharacterConstants::CharacterSettings::CharacterCylinderRadius); } break; } - AZStd::vector<AZStd::unique_ptr<Physics::Character>> controllers; + auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get(); + + AZStd::vector<Physics::Character*> controllers; controllers.reserve(numCharacterControllers); for (int i = 0; i < numCharacterControllers; i++) { - AZStd::unique_ptr<Physics::Character> controller; - Physics::CharacterSystemRequestBus::BroadcastResult(controller, - &Physics::CharacterSystemRequests::CreateCharacter, characterConfig, *shapeConfig, sceneHandle); - - const AZ::Vector3 spawnPosition = genSpawnPosFuncPtr != nullptr ? (*genSpawnPosFuncPtr)(i) : AZ::Vector3::CreateZero(); - controller->SetBasePosition(spawnPosition); - - controllers.emplace_back(AZStd::move(controller)); + const AZ::Vector3 spawnPosition = genSpawnPosFuncPtr != nullptr ? (*genSpawnPosFuncPtr)(i) : AZ::Vector3::CreateZero(); + characterConfig.m_position = spawnPosition; + AzPhysics::SimulatedBodyHandle newHandle = sceneInterface->AddSimulatedBody(sceneHandle, &characterConfig); + if (newHandle != AzPhysics::InvalidSimulatedBodyHandle) + { + if (auto* characterPtr = azdynamic_cast<Physics::Character*>( + sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, newHandle) + )) + { + controllers.emplace_back(characterPtr); + } + } } - delete shapeConfig; return controllers; } @@ -206,7 +213,7 @@ namespace PhysX::Benchmarks } return AZ::Vector3(x, y, z); }; - AZStd::vector<AZStd::unique_ptr<Physics::Character>> controllers = Utils::CreateCharacterControllers(numCharacters, + AZStd::vector<Physics::Character*> controllers = Utils::CreateCharacterControllers(numCharacters, static_cast<CharacterConstants::CharacterSettings::ColliderType>(state.range(1)), m_testSceneHandle, &posGenerator); //setup the sub tick tracker @@ -262,7 +269,7 @@ namespace PhysX::Benchmarks } return AZ::Vector3(x, y, z); }; - AZStd::vector<AZStd::unique_ptr<Physics::Character>> controllers = Utils::CreateCharacterControllers(numCharacters, + AZStd::vector<Physics::Character*> controllers = Utils::CreateCharacterControllers(numCharacters, static_cast<CharacterConstants::CharacterSettings::ColliderType>(state.range(1)), m_testSceneHandle, &posGenerator); //setup the sub tick tracker @@ -320,15 +327,15 @@ namespace PhysX::Benchmarks const float z = 0.0f; return AZ::Vector3(x, y, z); }; - AZStd::vector<AZStd::unique_ptr<Physics::Character>> controllers = Utils::CreateCharacterControllers(numCharacters, + AZStd::vector<Physics::Character*> controllers = Utils::CreateCharacterControllers(numCharacters, static_cast<CharacterConstants::CharacterSettings::ColliderType>(state.range(1)), m_testSceneHandle, &posGenerator); //pair up each character controller with a movement vector - using ControllerAndMovementDirPair = AZStd::pair<AZStd::unique_ptr<Physics::Character>, AZ::Vector3>; + using ControllerAndMovementDirPair = AZStd::pair<Physics::Character*, AZ::Vector3>; AZStd::vector<ControllerAndMovementDirPair> targetMoveAndControllers; for (auto& controller : controllers) { - targetMoveAndControllers.emplace_back(ControllerAndMovementDirPair(AZStd::move(controller), AZ::Vector3::CreateZero())); + targetMoveAndControllers.emplace_back(ControllerAndMovementDirPair(controller, AZ::Vector3::CreateZero())); } //setup the sub tick tracker diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp index 149dfac30b..4f905342be 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp @@ -125,19 +125,24 @@ namespace PhysX::Benchmarks return GetTPose(AZ::Vector3::CreateZero(), simulationType); } - AZStd::unique_ptr<PhysX::Ragdoll> CreateRagdoll(AzPhysics::SceneHandle sceneHandle) + PhysX::Ragdoll* CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile<Physics::RagdollConfiguration>(AZ::Test::GetEngineRootPath() + "/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); - Physics::RagdollState initialState = GetTPose(); - PhysX::ParentIndices parentIndices; + configuration->m_initialState = GetTPose(); + configuration->m_parentIndices.reserve(configuration->m_nodes.size()); for (int i = 0; i < configuration->m_nodes.size(); i++) { - parentIndices.push_back(RagdollTestData::ParentIndices[i]); + configuration->m_parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return PhysX::Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, configuration); + return azdynamic_cast<Ragdoll*>(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)); + } + return nullptr; } //! BM_Ragdoll_AtRest - This test just spawns the requested number of ragdolls and places them near the terrain @@ -148,7 +153,7 @@ namespace PhysX::Benchmarks const int numRagdolls = static_cast<const int>(state.range(0)); //create ragdolls - AZStd::vector<AZStd::unique_ptr<PhysX::Ragdoll>> ragdolls; + AZStd::vector<PhysX::Ragdoll*> ragdolls; ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { @@ -218,7 +223,7 @@ namespace PhysX::Benchmarks washingMachineCentre, RagdollConstants::WashingMachine::BladeRPM); //create ragdolls - AZStd::vector<AZStd::unique_ptr<PhysX::Ragdoll>> ragdolls; + AZStd::vector<PhysX::Ragdoll*> ragdolls; ragdolls.reserve(numRagdolls); for (int i = 0; i < numRagdolls; i++) { diff --git a/Gems/PhysX/Code/Tests/RagdollTests.cpp b/Gems/PhysX/Code/Tests/RagdollTests.cpp index 8e3bdc69c3..ec803c1707 100644 --- a/Gems/PhysX/Code/Tests/RagdollTests.cpp +++ b/Gems/PhysX/Code/Tests/RagdollTests.cpp @@ -37,7 +37,7 @@ namespace PhysX <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> <Class name="AZ::u64" field="Id" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> </Class> - <Class name="AZStd::shared_ptr" field="PhysXRagdoll" type="{A3E470C6-D6E0-5A32-9E83-96C379D9E7FA}"/> + <Class name="PhysX::Ragdoll" field="PhysXRagdoll" type="{55D477B5-B922-4D3E-89FE-7FB7B9FDD635}"/> </Class> </ObjectStream>)DELIMITER"; @@ -63,19 +63,24 @@ namespace PhysX return ragdollState; } - AZStd::unique_ptr<Ragdoll> CreateRagdoll(AzPhysics::SceneHandle sceneHandle) + Ragdoll* CreateRagdoll(AzPhysics::SceneHandle sceneHandle) { Physics::RagdollConfiguration* configuration = AZ::Utils::LoadObjectFromFile<Physics::RagdollConfiguration>(AZ::Test::GetCurrentExecutablePath() + "/Test.Assets/Gems/PhysX/Code/Tests/RagdollConfiguration.xml"); - Physics::RagdollState initialState = GetTPose(); - ParentIndices parentIndices; + configuration->m_initialState = GetTPose(); + configuration->m_parentIndices.reserve(configuration->m_nodes.size()); for (int i = 0; i < configuration->m_nodes.size(); i++) { - parentIndices.push_back(RagdollTestData::ParentIndices[i]); + configuration->m_parentIndices.push_back(RagdollTestData::ParentIndices[i]); } - return Utils::Characters::CreateRagdoll(*configuration, initialState, parentIndices, sceneHandle); + if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get()) + { + AzPhysics::SimulatedBodyHandle bodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, configuration); + return azdynamic_cast<Ragdoll*>(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, bodyHandle)); + } + return nullptr; } #if AZ_TRAIT_DISABLE_FAILED_PHYSICS_TESTS diff --git a/Gems/PhysX/Code/Tests/TestColliderComponent.h b/Gems/PhysX/Code/Tests/TestColliderComponent.h index b972e9bd12..51885e87a2 100644 --- a/Gems/PhysX/Code/Tests/TestColliderComponent.h +++ b/Gems/PhysX/Code/Tests/TestColliderComponent.h @@ -80,4 +80,4 @@ namespace UnitTest float m_capsuleRadius; AZ::Vector3 m_assetScale; }; -} // namespace UnitTest \ No newline at end of file +} // namespace UnitTest diff --git a/Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h b/Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h index 1c70344671..1b33c5c01d 100644 --- a/Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h +++ b/Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h @@ -12,4 +12,4 @@ #pragma once #include <platform.h> // Many CryCommon files require that this is included first. -#include <PxPhysicsAPI.h> \ No newline at end of file +#include <PxPhysicsAPI.h> diff --git a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp index 0d26d1cbc0..77b0959008 100644 --- a/Gems/PhysXDebug/Code/Source/SystemComponent.cpp +++ b/Gems/PhysXDebug/Code/Source/SystemComponent.cpp @@ -511,13 +511,13 @@ namespace PhysXDebug void SystemComponent::RenderBuffers() { - if (gEnv && !m_linePoints.empty()) + if (gEnv && gEnv->pRenderer && !m_linePoints.empty()) { AZ_Assert(m_linePoints.size() == m_lineColors.size(), "Lines: Expected an equal number of points to colors."); gEnv->pRenderer->GetIRenderAuxGeom()->DrawLines(m_linePoints.begin(), m_linePoints.size(), m_lineColors.begin(), 1.0f); } - if (gEnv && !m_trianglePoints.empty()) + if (gEnv && gEnv->pRenderer && !m_trianglePoints.empty()) { AZ_Assert(m_trianglePoints.size() == m_triangleColors.size(), "Triangles: Expected an equal number of points to colors."); gEnv->pRenderer->GetIRenderAuxGeom()->DrawTriangles(m_trianglePoints.begin(), m_trianglePoints.size(), m_triangleColors.begin()); @@ -829,7 +829,7 @@ namespace PhysXDebug { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Physics); - if (m_settings.m_visualizationEnabled && m_culling.m_boxWireframe) + if (gEnv && gEnv->pRenderer && m_settings.m_visualizationEnabled && m_culling.m_boxWireframe) { ColorB wireframeColor = MapOriginalPhysXColorToUserDefinedValues(1); AABB lyAABB(AZAabbToLyAABB(cullingBoxAabb)); diff --git a/Gems/PhysXDebug/README_PhysXDebug.txt b/Gems/PhysXDebug/README_PhysXDebug.txt index 329faf89d9..07c455290f 100644 --- a/Gems/PhysXDebug/README_PhysXDebug.txt +++ b/Gems/PhysXDebug/README_PhysXDebug.txt @@ -35,4 +35,4 @@ Connect to the PhysX Visual Debugger. physx_PvdDisconnect Disconnect from the PhysX Visual Debugger. -[1] https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/VisualDebugger.html#physxvisualdebugger \ No newline at end of file +[1] https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/VisualDebugger.html#physxvisualdebugger diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo index 963975f48e..2db91380e3 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Actor/Cowboy_01.fbx.assetinfo @@ -1,937 +1,442 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="ActorGroup" field="element" version="4" type="{D1AC3803-8282-46C5-8610-93CD39B0F843}"> - <Class name="IActorGroup" field="BaseClass1" version="2" type="{C86945A8-AEE8-4CFC-8FBF-A20E9BC71348}"> - <Class name="ISceneNodeGroup" field="BaseClass1" version="1" type="{1D20FA11-B184-429E-8C86-745852234845}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="SceneNodeSelectionList" field="nodeSelectionList" version="1" type="{D0CE66CE-1BAD-42F5-86ED-3923573B3A02}"> - <Class name="ISceneNodeSelectionList" field="BaseClass1" version="1" type="{DC3F9996-E550-4780-A03B-80B0DDA1DA45}"/> - <Class name="AZStd::vector" field="selectedNodes" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.SkinWeight_0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.map1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.mat_cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - <Class name="AZStd::vector" field="unselectedNodes" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> - <Class name="AZStd::string" field="element" value="RootNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Belt1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.Holster2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Belt1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.Holster2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.aimwrist" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.aimwrist.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - <Class name="AZ::Uuid" field="id" value="{0020C9AF-AA5D-50CB-8FE0-4250396B3F9D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="TangentsRule" field="element" version="1" type="{4BD1CE13-D2EB-4CCF-AB21-4877EF69DE7D}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="tangentSpace" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - <Class name="int" field="bitangentMethod" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - <Class name="bool" field="normalize" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="AZ::u64" field="uvSetIndex" value="0" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="SkinRule" field="element" version="2" type="{B26E7FC9-86A1-4711-8415-8BE4861C08BA}"> - <Class name="ISkinRule" field="BaseClass1" version="1" type="{5496ECAF-B096-4455-AE72-D55C5B675443}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="unsigned int" field="maxWeightsPerVertex" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="float" field="weightThreshold" value="0.0010000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MeshRule" field="element" version="2" type="{7F115A73-28A2-4E35-8C87-1A1982773034}"> - <Class name="IMeshRule" field="BaseClass1" version="1" type="{299934A2-22EC-48AF-AB2B-953AFF8E0B19}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="bool" field="optimizeTriangleList" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MaterialRule" field="element" version="2" type="{35620013-A27C-4F6D-87BF-72F11688ACAD}"> - <Class name="IMaterialRule" field="BaseClass1" version="1" type="{428C9752-6EDF-4FA2-9BDF-DBDFCEB4CC0F}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="bool" field="updateMaterials" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="removeMaterials" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"/> - <Class name="AZStd::string" field="metaData" value='AdjustActor -actorID $(ACTORID) -name "cowboy_01" -ActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList "" -AdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds "" -nodeAction "select" -AdjustActor -actorID $(ACTORID) -nodeAction "replace" -attachmentNodes "" -AdjustActor -actorID $(ACTORID) -motionExtractionNodeName "Reference" -AdjustActor -actorID $(ACTORID) -mirrorSetup "LeftUpLeg,RightUpLeg;RightUpLeg,LeftUpLeg;LeftShoulder,RightShoulder;RightShoulder,LeftShoulder;LeftLegHelper4,RightLegHelper4;LeftLeg,RightLeg;RightLegHelper4,LeftLegHelper4;RightLeg,LeftLeg;LeftArm,RightArm;RightArm,LeftArm;LeftLegHelper5,RightLegHelper5;LeftLegHelper8,RightLegHelper8;LeftLegHelper7,RightLegHelper7;LeftLegHelper6,RightLegHelper6;LeftFoot,RightFoot;RightLegHelper5,LeftLegHelper5;RightLegHelper8,LeftLegHelper8;RightLegHelper7,LeftLegHelper7;RightLegHelper6,LeftLegHelper6;RightFoot,LeftFoot;LeftArmHelper4,RightArmHelper4;LeftArmHelper1,RightArmHelper1;LeftArmHelper2,RightArmHelper2;LeftArmHelper3,RightArmHelper3;LeftForeArm,RightForeArm;RightArmHelper4,LeftArmHelper4;RightArmHelper3,LeftArmHelper3;RightArmHelper2,LeftArmHelper2;RightArmHelper1,LeftArmHelper1;RightForeArm,LeftForeArm;LeftLegHelper9,RightLegHelper9;LeftToeBase,RightToeBase;RightLegHelper9,LeftLegHelper9;RightToeBase,LeftToeBase;LeftArmHelper5,RightArmHelper5;LeftArmHelper8,RightArmHelper8;LeftArmHelper6,RightArmHelper6;LeftArmHelper7,RightArmHelper7;LeftHand,RightHand;RightArmHelper5,LeftArmHelper5;RightArmHelper8,LeftArmHelper8;RightArmHelper7,LeftArmHelper7;RightArmHelper6,LeftArmHelper6;RightHand,LeftHand;LeftArmHelper9,RightArmHelper9;LeftInHandPinky,RightInHandPinky;LeftInHandRing,RightInHandRing;LeftInHandIndex,RightInHandIndex;LeftHandThumb1,RightHandThumb1;RightArmHelper9,LeftArmHelper9;RightInHandPinky,LeftInHandPinky;RightInHandRing,LeftInHandRing;RightInHandIndex,LeftInHandIndex;RightHandThumb1,LeftHandThumb1;LeftHandPinky1,RightHandPinky1;LeftHandRing1,RightHandRing1;LeftHandMiddle1,RightHandMiddle1;LeftHandIndex1,RightHandIndex1;LeftHandThumb2,RightHandThumb2;RightHandPinky1,LeftHandPinky1;RightHandRing1,LeftHandRing1;RightHandMiddle1,LeftHandMiddle1;RightHandIndex1,LeftHandIndex1;RightHandThumb2,LeftHandThumb2;LeftHandPinky2,RightHandPinky2;LeftHandRing2,RightHandRing2;LeftHandMiddle2,RightHandMiddle2;LeftHandIndex2,RightHandIndex2;LeftHandThumb3,RightHandThumb3;RightHandPinky2,LeftHandPinky2;RightHandRing2,LeftHandRing2;RightHandMiddle2,LeftHandMiddle2;RightHandIndex2,LeftHandIndex2;RightHandThumb3,LeftHandThumb3;LeftHandPinky3,RightHandPinky3;LeftHandRing3,RightHandRing3;LeftHandMiddle3,RightHandMiddle3;LeftHandIndex3,RightHandIndex3;RightHandPinky3,LeftHandPinky3;RightHandRing3,LeftHandRing3;RightHandMiddle3,LeftHandMiddle3;RightHandIndex3,LeftHandIndex3;" -' type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MeshGroup" field="element" version="1" type="{5B03C8E6-8CEE-4DA0-A7FA-CD88689DD45B}"> - <Class name="ISceneNodeGroup" field="BaseClass1" version="1" type="{1D20FA11-B184-429E-8C86-745852234845}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="bool" field="export as convex" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="float" field="AreaTestEpsilon" value="0.0600000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="PlaneTolerance" value="0.0007000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="bool" field="Use16bitIndices" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="CheckZeroAreaTriangles" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="QuantizeInput" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="UsePlaneShifting" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="ShiftVertices" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="unsigned int" field="GaussMapLimit" value="32" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="bool" field="WeldVertices" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="DisableCleanMesh" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="Force32BitIndices" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="SuppressTriangleMeshRemapTable" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="bool" field="BuildTriangleAdjacencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="float" field="MeshWeldTolerance" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="unsigned int" field="NumTrisPerLeaf" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="bool" field="BuildGPUData" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - <Class name="SceneNodeSelectionList" field="NodeSelectionList" version="1" type="{D0CE66CE-1BAD-42F5-86ED-3923573B3A02}"> - <Class name="ISceneNodeSelectionList" field="BaseClass1" version="1" type="{DC3F9996-E550-4780-A03B-80B0DDA1DA45}"/> - <Class name="AZStd::vector" field="selectedNodes" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> - <Class name="AZStd::vector" field="unselectedNodes" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> - <Class name="AZStd::string" field="element" value="RootNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.SkinWeight_0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.map1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.cowboy_01.mat_cowboy_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Belt1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.Holster2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Belt1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.Holster1.Holster2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.aimwrist" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.aimstart.prop.aimwrist.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="element" value="RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT.transform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - <Class name="AZ::Uuid" field="id" value="{0E27B613-8926-5655-AB5F-567CB07D4081}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "ActorGroup", + "name": "cowboy_01", + "id": "{0020C9AF-AA5D-50CB-8FE0-4250396B3F9D}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "metaData": "AdjustActor -actorID $(ACTORID) -name \"cowboy_01\"\r\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\r\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\r\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\r\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"Reference\"\r\nAdjustActor -actorID $(ACTORID) -mirrorSetup \"LeftUpLeg,RightUpLeg;RightUpLeg,LeftUpLeg;LeftShoulder,RightShoulder;RightShoulder,LeftShoulder;LeftLegHelper4,RightLegHelper4;LeftLeg,RightLeg;RightLegHelper4,LeftLegHelper4;RightLeg,LeftLeg;LeftArm,RightArm;RightArm,LeftArm;LeftLegHelper5,RightLegHelper5;LeftLegHelper8,RightLegHelper8;LeftLegHelper7,RightLegHelper7;LeftLegHelper6,RightLegHelper6;LeftFoot,RightFoot;RightLegHelper5,LeftLegHelper5;RightLegHelper8,LeftLegHelper8;RightLegHelper7,LeftLegHelper7;RightLegHelper6,LeftLegHelper6;RightFoot,LeftFoot;LeftArmHelper4,RightArmHelper4;LeftArmHelper1,RightArmHelper1;LeftArmHelper2,RightArmHelper2;LeftArmHelper3,RightArmHelper3;LeftForeArm,RightForeArm;RightArmHelper4,LeftArmHelper4;RightArmHelper3,LeftArmHelper3;RightArmHelper2,LeftArmHelper2;RightArmHelper1,LeftArmHelper1;RightForeArm,LeftForeArm;LeftLegHelper9,RightLegHelper9;LeftToeBase,RightToeBase;RightLegHelper9,LeftLegHelper9;RightToeBase,LeftToeBase;LeftArmHelper5,RightArmHelper5;LeftArmHelper8,RightArmHelper8;LeftArmHelper6,RightArmHelper6;LeftArmHelper7,RightArmHelper7;LeftHand,RightHand;RightArmHelper5,LeftArmHelper5;RightArmHelper8,LeftArmHelper8;RightArmHelper7,LeftArmHelper7;RightArmHelper6,LeftArmHelper6;RightHand,LeftHand;LeftArmHelper9,RightArmHelper9;LeftInHandPinky,RightInHandPinky;LeftInHandRing,RightInHandRing;LeftInHandIndex,RightInHandIndex;LeftHandThumb1,RightHandThumb1;RightArmHelper9,LeftArmHelper9;RightInHandPinky,LeftInHandPinky;RightInHandRing,LeftInHandRing;RightInHandIndex,LeftInHandIndex;RightHandThumb1,LeftHandThumb1;LeftHandPinky1,RightHandPinky1;LeftHandRing1,RightHandRing1;LeftHandMiddle1,RightHandMiddle1;LeftHandIndex1,RightHandIndex1;LeftHandThumb2,RightHandThumb2;RightHandPinky1,LeftHandPinky1;RightHandRing1,LeftHandRing1;RightHandMiddle1,LeftHandMiddle1;RightHandIndex1,LeftHandIndex1;RightHandThumb2,LeftHandThumb2;LeftHandPinky2,RightHandPinky2;LeftHandRing2,RightHandRing2;LeftHandMiddle2,RightHandMiddle2;LeftHandIndex2,RightHandIndex2;LeftHandThumb3,RightHandThumb3;RightHandPinky2,LeftHandPinky2;RightHandRing2,LeftHandRing2;RightHandMiddle2,LeftHandMiddle2;RightHandIndex2,LeftHandIndex2;RightHandThumb3,LeftHandThumb3;LeftHandPinky3,RightHandPinky3;LeftHandRing3,RightHandRing3;LeftHandMiddle3,RightHandMiddle3;LeftHandIndex3,RightHandIndex3;RightHandPinky3,LeftHandPinky3;RightHandRing3,LeftHandRing3;RightHandMiddle3,LeftHandMiddle3;RightHandIndex3,LeftHandIndex3;\"\r\n" + } + ] + } + }, + { + "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup", + "name": "Cowboy_01", + "nodeSelectionList": { + "selectedNodes": [ + "RootNode", + "RootNode.Reference", + "RootNode.cowboy_01", + "RootNode.Reference.transform", + "RootNode.Reference.Hips", + "RootNode.cowboy_01.SkinWeight_0", + "RootNode.cowboy_01.transform", + "RootNode.cowboy_01.map1", + "RootNode.cowboy_01.mat_cowboy_01", + "RootNode.Reference.Hips.transform", + "RootNode.Reference.Hips.Spine", + "RootNode.Reference.Hips.Pelvis", + "RootNode.Reference.Hips.Spine.transform", + "RootNode.Reference.Hips.Spine.Spine1", + "RootNode.Reference.Hips.Pelvis.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg", + "RootNode.Reference.Hips.Pelvis.RightUpLeg", + "RootNode.Reference.Hips.Pelvis.Holster1", + "RootNode.Reference.Hips.Pelvis.Belt1", + "RootNode.Reference.Hips.Spine.Spine1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder", + "RootNode.Reference.Hips.Spine.Spine1.Neck", + "RootNode.Reference.Hips.Spine.Spine1.aimstart", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg", + "RootNode.Reference.Hips.Pelvis.Holster1.transform", + "RootNode.Reference.Hips.Pelvis.Holster1.Holster2", + "RootNode.Reference.Hips.Pelvis.Belt1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm", + "RootNode.Reference.Hips.Spine.Spine1.Neck.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.HolsterPin1.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot", + "RootNode.Reference.Hips.Pelvis.Holster1.Holster2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.aimend.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.transform", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.aimwristmatch", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLegHelper4.LeftLegHelper5.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper7.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper6.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLegHelper4.RightLegHelper5.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper7.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper6.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmPV.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.aimstart.propmatch.aimwristmatch.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftLegHelper8.LeftLegHelper9.transform", + "RootNode.Reference.Hips.Pelvis.LeftUpLeg.LeftLeg.LeftFoot.LeftToeBase.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightLegHelper8.RightLegHelper9.transform", + "RootNode.Reference.Hips.Pelvis.RightUpLeg.RightLeg.RightFoot.RightToeBase.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftArmHelper4.LeftArmHelper5.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper6.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper7.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightArmHelper4.RightArmHelper5.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper7.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper6.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.prop", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_eye_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_eye_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftArmHelper8.LeftArmHelper9.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightArmHelper8.RightArmHelper9.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.prop.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botTeeth_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browExt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_browInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_brow_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_browExt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseOut_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_cheekRaiseInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseInt_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseCen_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_cheekRaiseOut_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topTeeth_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Lf_cheek_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Rt_cheek_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair0_PUPPET_0_JNT.Rt_Hair0_PUPPET_1_JNT.Rt_Hair0_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Rt_Hair1_PUPPET_0_JNT.Rt_Hair1_PUPPET_1_JNT.Rt_Hair1_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_cornerLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Rt_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Ct_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_botLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_botMuzzle_0_JNT.Lf_cornerLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair0_PUPPET_0_JNT.Lf_Hair0_PUPPET_1_JNT.Lf_Hair0_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Lf_Hair1_PUPPET_0_JNT.Lf_Hair1_PUPPET_1_JNT.Lf_Hair1_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_in_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_lidCorner_out_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_in_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_lidCorner_out_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Lf_nostril_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_nose_0_JNT.Rt_nostril_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Rt_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Ct_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headBot_0_JNT.Ct_topMuzzle_0_JNT.Lf_topLip_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftHandThumb1.LeftHandThumb2.LeftHandThumb3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightHandThumb1.RightHandThumb2.RightHandThumb3.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_BackHair_PUPPET_0_JNT.Ct_BackHair_PUPPET_1_JNT.Ct_BackHair_PUPPET_2_JNT.Ct_BackHair_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandPinky.LeftHandPinky1.LeftHandPinky2.LeftHandPinky3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandRing.LeftHandRing1.LeftHandRing2.LeftHandRing3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandMIddle.LeftHandMiddle1.LeftHandMiddle2.LeftHandMiddle3.transform", + "RootNode.Reference.Hips.Spine.Spine1.LeftShoulder.LeftArm.LeftForeArm.LeftHand.LeftInHandIndex.LeftHandIndex1.LeftHandIndex2.LeftHandIndex3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandPinky.RightHandPinky1.RightHandPinky2.RightHandPinky3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandRing.RightHandRing1.RightHandRing2.RightHandRing3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandMiddle.RightHandMiddle1.RightHandMiddle2.RightHandMiddle3.transform", + "RootNode.Reference.Hips.Spine.Spine1.RightShoulder.RightArm.RightForeArm.RightHand.RightInHandIndex.RightHandIndex1.RightHandIndex2.RightHandIndex3.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_jaw_0_JNT.Ct_tongue_0_JNT.Ct_tongue_1_JNT.Ct_tongue_2_JNT.Ct_tongue_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_botLidMain_0_JNT.Rt_botLid_0_JNT.Rt_botLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Rt_eyeSocket_0_JNT.Rt_topLidMain_0_JNT.Rt_topLid_0_JNT.Rt_topLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_botLidMain_0_JNT.Lf_botLid_0_JNT.Lf_botLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_1_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Lf_eyeSocket_0_JNT.Lf_topLidMain_0_JNT.Lf_topLid_0_JNT.Lf_topLid_2_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_0_JNT.Lf_Hat_PUPPET_1_JNT.Lf_Hat_PUPPET_2_JNT.Lf_Hat_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_0_JNT.Rt_Hat_PUPPET_1_JNT.Rt_Hat_PUPPET_2_JNT.Rt_Hat_PUPPET_3_JNT.transform", + "RootNode.Reference.Hips.Spine.Spine1.Neck.Neck1.Head.Ct_headTop_0_JNT.Ct_Hat_PUPPET_0_JNT.Ct_FrontHair_PUPPET_0_JNT.Ct_FrontHair_PUPPET_1_JNT.Ct_FrontHair_PUPPET_2_JNT.Ct_FrontHair_PUPPET_3_JNT.transform" + ] + }, + "rules": { + "rules": [ + { + "$type": "SkinRule" + }, + { + "$type": "MaterialRule" + } + ] + }, + "id": "{6247689D-B117-4653-A672-12198E7EDD69}" + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo index 74e470b719..60a381de2c 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/aimposes01.fbx.assetinfo @@ -1,109 +1,56 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="aimposes01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{394BA97A-7EF3-56B3-ADE2-D9D734AA5B6B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MotionRangeRule" field="element" version="1" type="{3107B08E-5D9D-49A0-8B1B-2133B5A1B041}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="unsigned int" field="startFrame" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="unsigned int" field="endFrame" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="bool" field="processRangeRuleConversion" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="aimposes01-1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{991539D2-8F87-40EF-9664-7994FFEA6B34}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MotionRangeRule" field="element" version="1" type="{3107B08E-5D9D-49A0-8B1B-2133B5A1B041}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="unsigned int" field="startFrame" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="unsigned int" field="endFrame" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="bool" field="processRangeRuleConversion" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="aimposes01-2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{DBCED014-4E7E-4865-9F94-F84B85F6B007}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MotionRangeRule" field="element" version="1" type="{3107B08E-5D9D-49A0-8B1B-2133B5A1B041}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="unsigned int" field="startFrame" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="unsigned int" field="endFrame" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> - <Class name="bool" field="processRangeRuleConversion" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "aimposes01", + "selectedRootBone": "RootNode.Reference", + "id": "{394BA97A-7EF3-56B3-ADE2-D9D734AA5B6B}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule" + }, + { + "$type": "MotionSamplingRule" + } + ] + } + }, + { + "$type": "MotionGroup", + "name": "aimposes01-1", + "selectedRootBone": "RootNode.Reference", + "id": "{991539D2-8F87-40EF-9664-7994FFEA6B34}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule", + "startFrame": 1, + "endFrame": 1 + }, + { + "$type": "MotionSamplingRule" + } + ] + } + }, + { + "$type": "MotionGroup", + "name": "aimposes01-2", + "selectedRootBone": "RootNode.Reference", + "id": "{DBCED014-4E7E-4865-9F94-F84B85F6B007}", + "rules": { + "rules": [ + { + "$type": "MotionRangeRule", + "startFrame": 2, + "endFrame": 2 + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo index 2e4a8f55d7..2ca1f67d65 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/idle_cwby_01.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="idle_cwby_01" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{492E8A35-2647-581F-A701-F1D2A9FBB979}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="IdleState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "idle_cwby_01", + "selectedRootBone": "RootNode.Reference", + "id": "{492E8A35-2647-581F-A701-F1D2A9FBB979}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo index 4cd5a8194a..3d935c330e 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/reload.fbx.assetinfo @@ -1,137 +1,61 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="reload" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{28092685-3550-5583-A666-CD60018AB2E9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="ReloadEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="ReloadEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.5092110" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.5092110" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="AmmoBack" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="ReloadEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="1.2446810" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="1.2446810" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="ReleaseShells" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="ReloadEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="1.4295191" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="1.4295191" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="ReloadEnd" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "reload", + "selectedRootBone": "RootNode.Reference", + "id": "{28092685-3550-5583-A666-CD60018AB2E9}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "ReloadEvent", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "ReloadEvent", + "startTime": 0.509211003780365, + "endTime": 0.509211003780365, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "ReloadEvent", + "startTime": 1.2446810007095338, + "endTime": 1.2446810007095338, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "ReloadEvent", + "startTime": 1.4295190572738648, + "endTime": 1.4295190572738648, + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo index b93139dc83..c32d66694b 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/run.fbx.assetinfo @@ -1,137 +1,59 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="run" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{7D6889F1-6536-57B6-8B02-93C815D1ADA9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.3396752" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.3396752" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.6319157" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.6319157" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="RunState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "run", + "selectedRootBone": "RootNode.Reference", + "id": "{7D6889F1-6536-57B6-8B02-93C815D1ADA9}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "Sync", + "startTime": 0.3396751880645752, + "endTime": 0.3396751880645752, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "Sync", + "startTime": 0.6319156885147095, + "endTime": 0.6319156885147095, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo index 89f051b5eb..9536e6597d 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/shootrecoil.fbx.assetinfo @@ -1,91 +1,47 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="shootrecoil" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{A1DC3BB2-3324-50F3-8C4B-BBFB61623129}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="RecoilEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="RecoilEvent" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.2325000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.2325000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="RecoilEnd" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "shootrecoil", + "selectedRootBone": "RootNode.Reference", + "id": "{A1DC3BB2-3324-50F3-8C4B-BBFB61623129}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "RecoilEvent", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "RecoilEvent", + "startTime": 0.23250000178813935, + "endTime": 0.23250000178813935, + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo index 91b795d9af..9d7c7e299c 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeback.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeback" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{CA0EF712-DA36-5DA8-B474-207BD250CF2F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameEvents" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameEvents" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeback", + "selectedRootBone": "RootNode.Reference", + "id": "{CA0EF712-DA36-5DA8-B474-207BD250CF2F}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameEvents", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameEvents", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo index 00ba9b3830..b22d00d3fe 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackl.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafebackl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{9433F0E6-EA1A-5473-AA21-EE4DC45387C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafebackl", + "selectedRootBone": "RootNode.Reference", + "id": "{9433F0E6-EA1A-5473-AA21-EE4DC45387C1}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo index 7f15392868..6b7dd5c4aa 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafebackr.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafebackr" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{5392AC3D-FF18-51F5-984E-248CAAF09F2E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafebackr", + "selectedRootBone": "RootNode.Reference", + "id": "{5392AC3D-FF18-51F5-984E-248CAAF09F2E}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo index 5003f620ca..a0dd296fa9 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforward.fbx.assetinfo @@ -1,137 +1,59 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeforward" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{2FB879C6-B3FB-5BD8-B52B-1012000351C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.2708907" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.2708907" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.9699266" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.9699266" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="LeftFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="RightFoot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeforward", + "selectedRootBone": "RootNode.Reference", + "id": "{2FB879C6-B3FB-5BD8-B52B-1012000351C2}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "Sync", + "startTime": 0.2708907127380371, + "endTime": 0.2708907127380371, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "Sync", + "startTime": 0.9699265956878662, + "endTime": 0.9699265956878662, + "eventDatas": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo index bd6a91a56c..233d7d248e 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardl.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeforwardl" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{2D945D52-C313-57A3-B722-C6402ACC3506}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeforwardl", + "selectedRootBone": "RootNode.Reference", + "id": "{2D945D52-C313-57A3-B722-C6402ACC3506}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo index 7014e29bcf..5332ba04bd 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeforwardr.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeforwardr" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{3E691B9F-C0D7-5BFD-BBBC-50BAE737886E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeforwardr", + "selectedRootBone": "RootNode.Reference", + "id": "{3E691B9F-C0D7-5BFD-BBBC-50BAE737886E}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo index 6ad0025f61..4d7e41b48a 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeinplace.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeinplace" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{A2686CFC-D49B-5468-AE9F-E3F84FA75C6D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeinplace", + "selectedRootBone": "RootNode.Reference", + "id": "{A2686CFC-D49B-5468-AE9F-E3F84FA75C6D}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo index a257eba8e0..02114bd336 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/strafeleft.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="strafeleft" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{2093C7DF-0C51-5C2B-B763-4DC1CC81D10E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "strafeleft", + "selectedRootBone": "RootNode.Reference", + "id": "{2093C7DF-0C51-5C2B-B763-4DC1CC81D10E}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo index c4308f71e2..28ac40918d 100644 --- a/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo +++ b/Gems/PhysXSamples/Assets/Characters/Cowboy/Animations/straferight.fbx.assetinfo @@ -1,91 +1,45 @@ -<ObjectStream version="3"> - <Class name="SceneManifest" version="1" type="{9274AD17-3212-4651-9F3B-7DCCB080E467}"> - <Class name="AZStd::vector" field="values" type="{5D6A7C67-11CA-59A4-829B-0B20B781B292}"> - <Class name="AZStd::shared_ptr" field="element" type="{EB7522F9-0E87-55A9-A191-E924DC5AE867}"> - <Class name="MotionGroup" field="element" version="3" type="{1B0ABB1E-F6DF-4534-9A35-2DD8244BF58C}"> - <Class name="IMotionGroup" field="BaseClass1" version="1" type="{1CA400A8-2C3E-423D-B8A3-C457EF88E533}"> - <Class name="IGroup" field="BaseClass1" version="1" type="{DE008E67-790D-4672-A73A-5CA0F31EDD2D}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - </Class> - <Class name="AZStd::string" field="name" value="straferight" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="selectedRootBone" value="RootNode.Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZ::Uuid" field="id" value="{CE0E45E9-4B8C-5340-9521-B6290BAB24FC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> - <Class name="RuleContainer" field="rules" version="1" type="{2C20D3DF-57FF-4A31-8680-A4D45302B9CF}"> - <Class name="AZStd::vector" field="rules" type="{B5BDB053-178F-5D55-8663-70897A71B7C9}"> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="CoordinateSystemRule" field="element" version="1" type="{603207E2-4F55-4C33-9AAB-98CA75C1E351}"> - <Class name="IRule" field="BaseClass1" version="1" type="{81267F8B-3963-423B-9FF7-D276D82CD110}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - </Class> - <Class name="int" field="targetCoordinateSystem" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - </Class> - <Class name="AZStd::shared_ptr" field="element" type="{0BB4AFBA-F087-55C7-95DF-01D71F6CB052}"> - <Class name="MetaDataRule" field="element" version="2" type="{8D759063-7D2E-4543-8EB3-AB510A5886CF}"> - <Class name="IManifestObject" field="BaseClass1" type="{3B839407-1884-4FF4-ABEA-CA9D347E83F7}"/> - <Class name="AZStd::vector" field="commands" type="{C9984A24-DA9E-518F-9F81-27E51FAEB1F7}"> - <Class name="CommandSystem::CommandAdjustMotion" field="element" version="1" type="{A8977553-4011-4BEB-97C8-6AE44B07C7A8}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::optional" field="dirtyFlag" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - <Class name="AZStd::optional" field="motionExtractionFlags" type="{43BA4537-CBCC-54F5-B403-84188A203D60}"> - <Class name="unsigned char" field="element" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> - </Class> - <Class name="AZStd::optional" field="name" type="{B0D91084-263A-54B9-A4F3-7C5F4240E248}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="Sync" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEventTrack" field="element" version="1" type="{961F762D-5B90-4E21-8692-9FADDCA54E6C}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::optional" field="eventTrackIndex" type="{5BC30B08-5E9C-5B73-BDE4-4BE8170C21C6}"/> - <Class name="AZStd::optional" field="isEnabled" type="{0170062C-2E7E-5CEB-BAB8-F7663BEF7B3E}"/> - </Class> - <Class name="CommandSystem::CommandCreateMotionEvent" field="element" type="{D19C2AFB-A5AA-4367-BCFC-02EB88C1B61F}"> - <Class name="MCore::Command" field="BaseClass1" version="1" type="{49C636CE-7C0E-408A-A0F7-F7D12647EFBA}"/> - <Class name="CommandSystem::MotionIdCommandMixin" field="BaseClass2" version="1" type="{968E9513-3159-4469-B5FA-97D0920456E3}"> - <Class name="int" field="motionID" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> - </Class> - <Class name="AZStd::string" field="eventTrackName" value="GameState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="float" field="startTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="float" field="endTime" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> - <Class name="AZStd::optional" field="eventDatas" type="{C69F2148-2DBF-5C3D-8154-447C6E99D041}"> - <Class name="AZStd::vector" field="element" type="{4918F644-6F31-5DC0-92CC-471D16563C8A}"> - <Class name="AZStd::shared_ptr" field="element" type="{FA64741F-5600-53BC-9B56-A81DD4938FF5}"> - <Class name="TwoStringEventData" field="element" version="1" type="{A437CD65-4012-47DE-BC60-4F9EC2A9ACEE}"> - <Class name="EventDataSyncable" field="BaseClass1" version="1" type="{18A0050C-D05A-424C-B645-8E3B31120CBA}"> - <Class name="EventData" field="BaseClass1" version="1" type="{F6AFCD3B-D58E-4821-9E7C-D1F437304E5D}"/> - </Class> - <Class name="AZStd::string" field="subject" value="StrafeState" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="parameters" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - <Class name="AZStd::string" field="mirrorSubject" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - <Class name="AZStd::string" field="metaData" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> - </Class> -</ObjectStream> - +{ + "values": [ + { + "$type": "MotionGroup", + "name": "straferight", + "selectedRootBone": "RootNode.Reference", + "id": "{CE0E45E9-4B8C-5340-9521-B6290BAB24FC}", + "rules": { + "rules": [ + { + "$type": "MetaDataRule", + "commands": [ + { + "$type": "CommandSystem::CommandAdjustMotion", + "dirtyFlag": {}, + "motionExtractionFlags": {}, + "name": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "Sync", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEventTrack", + "eventTrackName": "GameState", + "eventTrackIndex": {}, + "isEnabled": {} + }, + { + "$type": "CommandSystem::CommandCreateMotionEvent", + "eventTrackName": "GameState", + "eventDatas": {} + } + ] + }, + { + "$type": "MotionSamplingRule" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Gems/PhysicsEntities/Assets/Entities/Constraint.ent b/Gems/PhysicsEntities/Assets/Entities/Constraint.ent index fe28bd2334..4bbc454474 100644 --- a/Gems/PhysicsEntities/Assets/Entities/Constraint.ent +++ b/Gems/PhysicsEntities/Assets/Entities/Constraint.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:10444abf658c4ac9ffbf5683830d3a6a1b141698e824a25f08682ae8f27879eb -size 79 +oid sha256:056f3c42226567848b7b7bd959cde0dccdcf63a79700743e55436eae35520a28 +size 80 diff --git a/Gems/PhysicsEntities/Assets/Entities/DeadBody.ent b/Gems/PhysicsEntities/Assets/Entities/DeadBody.ent index 49b434f2ff..1df82c55cd 100644 --- a/Gems/PhysicsEntities/Assets/Entities/DeadBody.ent +++ b/Gems/PhysicsEntities/Assets/Entities/DeadBody.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7933b7980cb011b85e03b3a87b877630f1497278d248de58bdb7ed7d23a1778 -size 75 +oid sha256:5fc10f1dd377cc2663faaa6aa5503aadb8288179cddc46bb3379337167c150fc +size 76 diff --git a/Gems/PhysicsEntities/Assets/Entities/GravityBox.ent b/Gems/PhysicsEntities/Assets/Entities/GravityBox.ent index 81ad2b7e23..bc78053312 100644 --- a/Gems/PhysicsEntities/Assets/Entities/GravityBox.ent +++ b/Gems/PhysicsEntities/Assets/Entities/GravityBox.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:98f8e15fee05e2997e7f48656dfebcf6d726af0e819472509f4827af34a3db25 -size 79 +oid sha256:785988d40e9af3f1f6adccc10a5a6fa1f6a78b6f6bb10647acf0f3997cd14834 +size 80 diff --git a/Gems/PhysicsEntities/Assets/Entities/GravitySphere.ent b/Gems/PhysicsEntities/Assets/Entities/GravitySphere.ent index d91d5257cc..d039267dce 100644 --- a/Gems/PhysicsEntities/Assets/Entities/GravitySphere.ent +++ b/Gems/PhysicsEntities/Assets/Entities/GravitySphere.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28ab76c6b2137d379f2703016082b20b4f28e6b29fd5cdc7f0628d5d5e732e1a -size 86 +oid sha256:76017bdaf559051a5ec6fb46a9132020ad54d35c1bdaf39511e52f0d3faeffe2 +size 87 diff --git a/Gems/PhysicsEntities/Assets/Entities/ParticlePhysics.ent b/Gems/PhysicsEntities/Assets/Entities/ParticlePhysics.ent index acc7a10500..7f47b60ff0 100644 --- a/Gems/PhysicsEntities/Assets/Entities/ParticlePhysics.ent +++ b/Gems/PhysicsEntities/Assets/Entities/ParticlePhysics.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6cec81a09c0c714074fb2333eb5b55be81c915c1aa6a0372467218fd49f20e8 -size 90 +oid sha256:fa1ed0cda25890a36a3f2c9f4bd2cbfbb4cef0198258f1b33a0ad3fb804c860c +size 91 diff --git a/Gems/PhysicsEntities/Assets/Entities/Wind.ent b/Gems/PhysicsEntities/Assets/Entities/Wind.ent index 30f1fbe3e9..94693ba365 100644 --- a/Gems/PhysicsEntities/Assets/Entities/Wind.ent +++ b/Gems/PhysicsEntities/Assets/Entities/Wind.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc89eb241cd80eaaf89ab14eb4df217dea806d7003c12406fdd589137d50e25d -size 67 +oid sha256:38cff841ea29a428729b79667672d3825188b9eec74ce0be324c5a072958c63d +size 68 diff --git a/Gems/PhysicsEntities/Assets/Entities/WindArea.ent b/Gems/PhysicsEntities/Assets/Entities/WindArea.ent index 997441950e..d7bff82e42 100644 --- a/Gems/PhysicsEntities/Assets/Entities/WindArea.ent +++ b/Gems/PhysicsEntities/Assets/Entities/WindArea.ent @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9d420e15cde892f7f26c8dc2dfc64dbf2573a20ff15a5fa6a1af9b62b574fd8f -size 75 +oid sha256:cc9ad675bca0b1446b9d3ad9b6bf53b1348f7dd96e00eb256744f82273b9f9da +size 76 diff --git a/Gems/Prefab/PrefabBuilder/CMakeLists.txt b/Gems/Prefab/PrefabBuilder/CMakeLists.txt index 5ab614eecb..22b89287ca 100644 --- a/Gems/Prefab/PrefabBuilder/CMakeLists.txt +++ b/Gems/Prefab/PrefabBuilder/CMakeLists.txt @@ -38,23 +38,6 @@ ly_add_target( Gem::PrefabBuilder.Static ) -ly_add_target( - NAME PrefabBuilder.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} - NAMESPACE Gem - FILES_CMAKE - prefabbuilder_tests_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - . - BUILD_DEPENDENCIES - PRIVATE - AZ::AzTest - Gem::PrefabBuilder.Static -) -ly_add_googletest( - NAME Gem::PrefabBuilder.Tests -) - ly_add_target_dependencies( TARGETS AssetBuilder @@ -63,3 +46,22 @@ ly_add_target_dependencies( DEPENDENT_TARGETS Gem::PrefabBuilder ) + +if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) + ly_add_target( + NAME PrefabBuilder.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAMESPACE Gem + FILES_CMAKE + prefabbuilder_tests_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + . + BUILD_DEPENDENCIES + PRIVATE + AZ::AzTest + Gem::PrefabBuilder.Static + ) + ly_add_googletest( + NAME Gem::PrefabBuilder.Tests + ) +endif() diff --git a/Gems/Presence/Code/Include/Presence/PresenceNotificationBus.h b/Gems/Presence/Code/Include/Presence/PresenceNotificationBus.h index 7b78fc1898..d435d1a24d 100644 --- a/Gems/Presence/Code/Include/Presence/PresenceNotificationBus.h +++ b/Gems/Presence/Code/Include/Presence/PresenceNotificationBus.h @@ -43,4 +43,4 @@ namespace Presence virtual void OnPresenceQueried(const PresenceDetails& presenceDetails) = 0; }; using PresenceNotificationBus = AZ::EBus<PresenceNotifications>; -} // namespace Presence \ No newline at end of file +} // namespace Presence diff --git a/Gems/PrimitiveAssets/Assets/Objects/_Primitives/_Sphere_1x1.fbx.assetinfo b/Gems/PrimitiveAssets/Assets/Objects/_Primitives/_Sphere_1x1.fbx.assetinfo index bf1e9d6907..9abc145db1 100644 --- a/Gems/PrimitiveAssets/Assets/Objects/_Primitives/_Sphere_1x1.fbx.assetinfo +++ b/Gems/PrimitiveAssets/Assets/Objects/_Primitives/_Sphere_1x1.fbx.assetinfo @@ -41,4 +41,4 @@ </Class> </Class> </Class> -</ObjectStream> \ No newline at end of file +</ObjectStream> diff --git a/Gems/PythonAssetBuilder/Assets/example.foo b/Gems/PythonAssetBuilder/Assets/example.foo index 69fbf10ab7..7ae9fec5c2 100644 --- a/Gems/PythonAssetBuilder/Assets/example.foo +++ b/Gems/PythonAssetBuilder/Assets/example.foo @@ -1,3 +1,3 @@ { "test": true -} \ No newline at end of file +} diff --git a/Gems/PythonAssetBuilder/CMakeLists.txt b/Gems/PythonAssetBuilder/CMakeLists.txt index d577738051..20a680bce9 100644 --- a/Gems/PythonAssetBuilder/CMakeLists.txt +++ b/Gems/PythonAssetBuilder/CMakeLists.txt @@ -9,5 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) add_subdirectory(Code) diff --git a/Gems/PythonAssetBuilder/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/PythonAssetBuilder/Code/Source/Platform/Mac/PAL_mac.cmake index c92f89c49d..39dcc67251 100644 --- a/Gems/PythonAssetBuilder/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/PythonAssetBuilder/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_PYTHONASSETBUILDER_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_PYTHONASSETBUILDER_SUPPORTED FALSE) diff --git a/Gems/PythonAssetBuilder/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/PythonAssetBuilder/Code/Source/Platform/Windows/PAL_windows.cmake index 28e48f20ea..590db54a88 100644 --- a/Gems/PythonAssetBuilder/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/PythonAssetBuilder/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_PYTHONASSETBUILDER_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_PYTHONASSETBUILDER_SUPPORTED TRUE) diff --git a/Gems/PythonAssetBuilder/3rdParty/readme.md b/Gems/PythonAssetBuilder/readme.md similarity index 100% rename from Gems/PythonAssetBuilder/3rdParty/readme.md rename to Gems/PythonAssetBuilder/readme.md diff --git a/Gems/QtForPython/Code/Source/Platform/Linux/PAL_linux.cmake b/Gems/QtForPython/Code/Source/Platform/Linux/PAL_linux.cmake index 47c48ebd71..af591da27d 100644 --- a/Gems/QtForPython/Code/Source/Platform/Linux/PAL_linux.cmake +++ b/Gems/QtForPython/Code/Source/Platform/Linux/PAL_linux.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE) diff --git a/Gems/QtForPython/Code/Source/Platform/Mac/PAL_mac.cmake b/Gems/QtForPython/Code/Source/Platform/Mac/PAL_mac.cmake index 47c48ebd71..af591da27d 100644 --- a/Gems/QtForPython/Code/Source/Platform/Mac/PAL_mac.cmake +++ b/Gems/QtForPython/Code/Source/Platform/Mac/PAL_mac.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE) \ No newline at end of file +set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED FALSE) diff --git a/Gems/QtForPython/Code/Source/Platform/Windows/PAL_windows.cmake b/Gems/QtForPython/Code/Source/Platform/Windows/PAL_windows.cmake index 4f2029e5bc..a8e98458d9 100644 --- a/Gems/QtForPython/Code/Source/Platform/Windows/PAL_windows.cmake +++ b/Gems/QtForPython/Code/Source/Platform/Windows/PAL_windows.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED TRUE) \ No newline at end of file +set(PAL_TRAIT_BUILD_QTFORPYTHON_SUPPORTED TRUE) diff --git a/Gems/RADTelemetry/Code/Source/Platform/Android/RADTelemetry_Traits_Platform.h b/Gems/RADTelemetry/Code/Source/Platform/Android/RADTelemetry_Traits_Platform.h index cb31f2e0fa..a6c1c505ad 100644 --- a/Gems/RADTelemetry/Code/Source/Platform/Android/RADTelemetry_Traits_Platform.h +++ b/Gems/RADTelemetry/Code/Source/Platform/Android/RADTelemetry_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING \ No newline at end of file +#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING diff --git a/Gems/RADTelemetry/Code/Source/Platform/Linux/RADTelemetry_Traits_Platform.h b/Gems/RADTelemetry/Code/Source/Platform/Linux/RADTelemetry_Traits_Platform.h index cb31f2e0fa..a6c1c505ad 100644 --- a/Gems/RADTelemetry/Code/Source/Platform/Linux/RADTelemetry_Traits_Platform.h +++ b/Gems/RADTelemetry/Code/Source/Platform/Linux/RADTelemetry_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING \ No newline at end of file +#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING diff --git a/Gems/RADTelemetry/Code/Source/Platform/Mac/RADTelemetry_Traits_Platform.h b/Gems/RADTelemetry/Code/Source/Platform/Mac/RADTelemetry_Traits_Platform.h index cb31f2e0fa..a6c1c505ad 100644 --- a/Gems/RADTelemetry/Code/Source/Platform/Mac/RADTelemetry_Traits_Platform.h +++ b/Gems/RADTelemetry/Code/Source/Platform/Mac/RADTelemetry_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING \ No newline at end of file +#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING diff --git a/Gems/RADTelemetry/Code/Source/Platform/Windows/RADTelemetry_Traits_Platform.h b/Gems/RADTelemetry/Code/Source/Platform/Windows/RADTelemetry_Traits_Platform.h index cb31f2e0fa..a6c1c505ad 100644 --- a/Gems/RADTelemetry/Code/Source/Platform/Windows/RADTelemetry_Traits_Platform.h +++ b/Gems/RADTelemetry/Code/Source/Platform/Windows/RADTelemetry_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING \ No newline at end of file +#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING diff --git a/Gems/RADTelemetry/Code/Source/Platform/iOS/RADTelemetry_Traits_Platform.h b/Gems/RADTelemetry/Code/Source/Platform/iOS/RADTelemetry_Traits_Platform.h index cb31f2e0fa..a6c1c505ad 100644 --- a/Gems/RADTelemetry/Code/Source/Platform/iOS/RADTelemetry_Traits_Platform.h +++ b/Gems/RADTelemetry/Code/Source/Platform/iOS/RADTelemetry_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING \ No newline at end of file +#define AZ_TRAIT_RAD_TELEMETRY_OPEN_FLAGS TMOF_INIT_NETWORKING diff --git a/Gems/SVOGI/Code/Source/Platform/Android/SVOGI_Traits_Platform.h b/Gems/SVOGI/Code/Source/Platform/Android/SVOGI_Traits_Platform.h index 562eb4d2f2..b4a43f9d16 100644 --- a/Gems/SVOGI/Code/Source/Platform/Android/SVOGI_Traits_Platform.h +++ b/Gems/SVOGI/Code/Source/Platform/Android/SVOGI_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <SVOGI_Traits_Android.h> \ No newline at end of file +#include <SVOGI_Traits_Android.h> diff --git a/Gems/SVOGI/Code/Source/Platform/Linux/SVOGI_Traits_Platform.h b/Gems/SVOGI/Code/Source/Platform/Linux/SVOGI_Traits_Platform.h index 17c2a60bdd..eb98072706 100644 --- a/Gems/SVOGI/Code/Source/Platform/Linux/SVOGI_Traits_Platform.h +++ b/Gems/SVOGI/Code/Source/Platform/Linux/SVOGI_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <SVOGI_Traits_Linux.h> \ No newline at end of file +#include <SVOGI_Traits_Linux.h> diff --git a/Gems/SVOGI/Code/Source/Platform/Mac/SVOGI_Traits_Platform.h b/Gems/SVOGI/Code/Source/Platform/Mac/SVOGI_Traits_Platform.h index f3b9121ec4..398bdffadd 100644 --- a/Gems/SVOGI/Code/Source/Platform/Mac/SVOGI_Traits_Platform.h +++ b/Gems/SVOGI/Code/Source/Platform/Mac/SVOGI_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <SVOGI_Traits_Mac.h> \ No newline at end of file +#include <SVOGI_Traits_Mac.h> diff --git a/Gems/SVOGI/Code/Source/Platform/Windows/SVOGI_Traits_Platform.h b/Gems/SVOGI/Code/Source/Platform/Windows/SVOGI_Traits_Platform.h index 4c56b01ea2..13ba491450 100644 --- a/Gems/SVOGI/Code/Source/Platform/Windows/SVOGI_Traits_Platform.h +++ b/Gems/SVOGI/Code/Source/Platform/Windows/SVOGI_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <SVOGI_Traits_Windows.h> \ No newline at end of file +#include <SVOGI_Traits_Windows.h> diff --git a/Gems/SVOGI/Code/Source/Platform/iOS/SVOGI_Traits_Platform.h b/Gems/SVOGI/Code/Source/Platform/iOS/SVOGI_Traits_Platform.h index 09ec6da4ba..47d7acec67 100644 --- a/Gems/SVOGI/Code/Source/Platform/iOS/SVOGI_Traits_Platform.h +++ b/Gems/SVOGI/Code/Source/Platform/iOS/SVOGI_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <SVOGI_Traits_iOS.h> \ No newline at end of file +#include <SVOGI_Traits_iOS.h> diff --git a/Gems/SVOGI/Code/Source/SvoTree.h b/Gems/SVOGI/Code/Source/SvoTree.h index 36e53f8a2d..d4e118bc77 100644 --- a/Gems/SVOGI/Code/Source/SvoTree.h +++ b/Gems/SVOGI/Code/Source/SvoTree.h @@ -230,4 +230,4 @@ namespace SVOGI }; inline AZ::s32 GetCurrPassMainFrameID() { return SvoEnvironment::m_currentPassFrameId; } -} \ No newline at end of file +} diff --git a/Gems/SVOGI/Code/Source/TextureBlockPacker.h b/Gems/SVOGI/Code/Source/TextureBlockPacker.h index 9e5659ebfc..f819a98b90 100644 --- a/Gems/SVOGI/Code/Source/TextureBlockPacker.h +++ b/Gems/SVOGI/Code/Source/TextureBlockPacker.h @@ -115,4 +115,4 @@ namespace SVOGI AZ::s32 FindFreeBlockIDOrCreateNew(); }; -} \ No newline at end of file +} diff --git a/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h b/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h index 2dbfe44df0..34db756555 100644 --- a/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h +++ b/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h @@ -41,4 +41,4 @@ namespace SceneLoggingExample ManifestAction action, RequestingApplication requester) override; void InitializeObject(const AZ::SceneAPI::Containers::Scene& scene, AZ::SceneAPI::DataTypes::IManifestObject& target) override; }; -} // namespace SceneLoggingExample \ No newline at end of file +} // namespace SceneLoggingExample diff --git a/Gems/SceneLoggingExample/Code/Groups/LoggingGroup.h b/Gems/SceneLoggingExample/Code/Groups/LoggingGroup.h index 575fb51f4c..455ce254ad 100644 --- a/Gems/SceneLoggingExample/Code/Groups/LoggingGroup.h +++ b/Gems/SceneLoggingExample/Code/Groups/LoggingGroup.h @@ -67,4 +67,4 @@ namespace SceneLoggingExample static const char* s_disabledOption; }; -} // namespace SceneLoggingExample \ No newline at end of file +} // namespace SceneLoggingExample diff --git a/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.h b/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.h index 3e1c48802f..f8952eeb3a 100644 --- a/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.h +++ b/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.h @@ -54,4 +54,4 @@ namespace SceneLoggingExample const AZ::SceneAPI::Containers::SceneManifest* m_manifest = nullptr; }; -} // namespace SceneLoggingExample \ No newline at end of file +} // namespace SceneLoggingExample diff --git a/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h b/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h index 6f9fd9afa9..62601a7a25 100644 --- a/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h +++ b/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h @@ -46,4 +46,4 @@ namespace SceneLoggingExample AZ::SceneAPI::Events::ProcessingResult ContextCallback(AZ::SceneAPI::Events::ICallContext& context); }; -} // namespace SceneLoggingExample \ No newline at end of file +} // namespace SceneLoggingExample diff --git a/Gems/SceneProcessing/Code/Include/Config/SceneProcessingConfigBus.h b/Gems/SceneProcessing/Code/Include/Config/SceneProcessingConfigBus.h index bba54b1457..75928977fb 100644 --- a/Gems/SceneProcessing/Code/Include/Config/SceneProcessingConfigBus.h +++ b/Gems/SceneProcessing/Code/Include/Config/SceneProcessingConfigBus.h @@ -83,4 +83,4 @@ namespace AZ using SceneProcessingConfigRequestBus = EBus<SceneProcessingConfigRequests>; } // namespace SceneProcessingConfig -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.cpp b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.cpp index 96ed1db203..39e4de9a5e 100644 --- a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.cpp +++ b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.cpp @@ -164,4 +164,4 @@ namespace AZ } // namespace SceneProcessingConfig } // namespace AZ -#include <Source/Config/Widgets/moc_GraphTypeSelector.cpp> \ No newline at end of file +#include <Source/Config/Widgets/moc_GraphTypeSelector.cpp> diff --git a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h index fcc02ce918..42c6cdf098 100644 --- a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h +++ b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h @@ -56,4 +56,4 @@ namespace AZ static GraphTypeSelector* s_instance; }; } // namespace SceneProcessingConfig -} // namespace AZ \ No newline at end of file +} // namespace AZ diff --git a/Gems/SceneProcessing/Code/Source/Generation/Components/MeshOptimizer/MeshOptimizerComponent.cpp b/Gems/SceneProcessing/Code/Source/Generation/Components/MeshOptimizer/MeshOptimizerComponent.cpp index 64ea69f4e4..8be67fe89b 100644 --- a/Gems/SceneProcessing/Code/Source/Generation/Components/MeshOptimizer/MeshOptimizerComponent.cpp +++ b/Gems/SceneProcessing/Code/Source/Generation/Components/MeshOptimizer/MeshOptimizerComponent.cpp @@ -54,6 +54,7 @@ #include <SceneAPI/SceneCore/Events/GenerateEventContext.h> #include <SceneAPI/SceneCore/Events/ProcessingResult.h> #include <SceneAPI/SceneCore/Utilities/Reporting.h> +#include <SceneAPI/SceneCore/Utilities/SceneGraphSelector.h> #include <SceneAPI/SceneData/GraphData/BlendShapeData.h> #include <SceneAPI/SceneData/GraphData/MeshData.h> #include <SceneAPI/SceneData/GraphData/MeshVertexBitangentData.h> @@ -102,6 +103,7 @@ namespace AZ::SceneGenerationComponents MeshOptimizerComponent::MeshOptimizerComponent() { + BindToCall(&MeshOptimizerComponent::OptimizeMeshes); } void MeshOptimizerComponent::Reflect(AZ::ReflectContext* context) @@ -109,7 +111,7 @@ namespace AZ::SceneGenerationComponents auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); if (serializeContext) { - serializeContext->Class<MeshOptimizerComponent, GenerationComponent>()->Version(1); + serializeContext->Class<MeshOptimizerComponent, GenerationComponent>()->Version(2); } } @@ -279,8 +281,7 @@ namespace AZ::SceneGenerationComponents } const AZStd::string name = - AZStd::string(graph.GetNodeName(nodeIndex).GetName(), graph.GetNodeName(nodeIndex).GetNameLength()) - + "_optimized"; + AZStd::string(graph.GetNodeName(nodeIndex).GetName(), graph.GetNodeName(nodeIndex).GetNameLength()).append(SceneAPI::Utilities::OptimizedMeshSuffix); if (graph.Find(name).IsValid()) { AZ_TracePrintf(AZ::SceneAPI::Utilities::LogWindow, "Optimized mesh already exists at '%s', there must be multiple mesh groups that have selected this mesh. Skipping the additional ones.", name.c_str()); diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.cpp b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.cpp index 00e2aedd72..c4ea4b4bd6 100644 --- a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.cpp +++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.cpp @@ -94,4 +94,4 @@ namespace SceneBuilder return scene; } -} // namespace SceneBuilder \ No newline at end of file +} // namespace SceneBuilder diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.h b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.h index c7d2e412ce..574bf6ee22 100644 --- a/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.h +++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/SceneSerializationHandler.h @@ -37,4 +37,4 @@ namespace SceneBuilder AZStd::shared_ptr<AZ::SceneAPI::Containers::Scene> LoadScene( const AZStd::string& sceneFilePath, AZ::Uuid sceneSourceGuid) override; }; -} // namespace SceneBuilder \ No newline at end of file +} // namespace SceneBuilder diff --git a/Gems/SceneProcessing/Code/Source/SceneBuilder/TraceMessageHook.h b/Gems/SceneProcessing/Code/Source/SceneBuilder/TraceMessageHook.h index a57d68c3e7..3a49d3d900 100644 --- a/Gems/SceneProcessing/Code/Source/SceneBuilder/TraceMessageHook.h +++ b/Gems/SceneProcessing/Code/Source/SceneBuilder/TraceMessageHook.h @@ -25,4 +25,4 @@ namespace SceneBuilder bool OnPrintf(const char* window, const char* message) override; }; -} // namespace SceneBuilder \ No newline at end of file +} // namespace SceneBuilder diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp index 0a0c3f3712..ab59ddd840 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorkerUtility.cpp @@ -394,11 +394,13 @@ namespace ScriptCanvasBuilder int GetBuilderVersion() { + // #functions2 remove-execution-out-hash include version from all library nodes, split fingerprint generation to relax Is Out of Data restriction when graphs only need a recompile return static_cast<int>(BuilderVersion::Current) + static_cast<int>(ScriptCanvas::GrammarVersion::Current) + static_cast<int>(ScriptCanvas::RuntimeVersion::Current) ; } + AZ::Outcome < AZ::Data::Asset<ScriptCanvasEditor::ScriptCanvasAsset>, AZStd::string> LoadEditorAsset(AZStd::string_view filePath) { AZStd::shared_ptr<AZ::Data::AssetDataStream> assetDataStream = AZStd::make_shared<AZ::Data::AssetDataStream>(); diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/Functions/ScriptCanvasFunctionAssetHolder.h b/Gems/ScriptCanvas/Code/Editor/Assets/Functions/ScriptCanvasFunctionAssetHolder.h index b17153b9d9..91def053a1 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/Functions/ScriptCanvasFunctionAssetHolder.h +++ b/Gems/ScriptCanvas/Code/Editor/Assets/Functions/ScriptCanvasFunctionAssetHolder.h @@ -77,4 +77,4 @@ namespace ScriptCanvasEditor ScriptChangedCB m_scriptNotifyCallback; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetInstance.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetInstance.cpp index 7795efca48..144157cc8f 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetInstance.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetInstance.cpp @@ -156,4 +156,4 @@ namespace ScriptCanvasEditor return dataFlags; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetReference.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetReference.cpp index b5b72b1ab6..6494edd7fb 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetReference.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetReference.cpp @@ -59,4 +59,4 @@ namespace ScriptCanvasEditor return m_storeInObjectStream; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp index f49ace2e58..ba82f58889 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp @@ -528,8 +528,10 @@ namespace ScriptCanvasEditor { const auto& variableId = varConfig.m_graphVariable.GetVariableId(); + // We only add component sourced graph properties to the script canvas component, so if this variable was switched to a graph-only property remove it. + // Also be sure to remove this variable if it's been deleted entirely. auto graphVariable = graphVarData.FindVariable(variableId); - if (!graphVariable->IsComponentProperty()) + if (!graphVariable || !graphVariable->IsComponentProperty()) { oldVariableIds.push_back(variableId); } diff --git a/Gems/ScriptCanvas/Code/Editor/Components/IconComponent.h b/Gems/ScriptCanvas/Code/Editor/Components/IconComponent.h index 549590abdf..468b03744a 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/IconComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/Components/IconComponent.h @@ -48,4 +48,4 @@ namespace ScriptCanvasEditor private: AZStd::string m_iconPath; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Debugger/Debugger.h b/Gems/ScriptCanvas/Code/Editor/Debugger/Debugger.h index 9e4e0ae00d..f47ed6c33a 100644 --- a/Gems/ScriptCanvas/Code/Editor/Debugger/Debugger.h +++ b/Gems/ScriptCanvas/Code/Editor/Debugger/Debugger.h @@ -15,4 +15,4 @@ namespace DragonUI { -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.cpp index 8057a7b39e..b3f3dab8fb 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.cpp @@ -37,4 +37,4 @@ namespace ScriptCanvasEditor : NodeDescriptorComponent(NodeDescriptorType::ClassMethod) { } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.h index d0e265b5c0..07ea3168e0 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ClassMethodNodeDescriptorComponent.h @@ -25,4 +25,4 @@ namespace ScriptCanvasEditor ClassMethodNodeDescriptorComponent(); ~ClassMethodNodeDescriptorComponent() = default; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerEventNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerEventNodeDescriptorComponent.h index 085fa60837..87701909a8 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerEventNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerEventNodeDescriptorComponent.h @@ -74,4 +74,4 @@ namespace ScriptCanvasEditor ScriptCanvas::Datum m_queuedId; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h index 3a4b2ce1d9..039da208f8 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusHandlerNodeDescriptorComponent.h @@ -125,4 +125,4 @@ namespace ScriptCanvasEditor AZStd::unordered_map< ScriptCanvas::EBusEventId, AZ::EntityId > m_eventTypeToId; AZStd::unordered_map< AZ::EntityId, ScriptCanvas::EBusEventId > m_idToEventType; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.cpp index da901e2693..14080675d5 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.cpp @@ -84,4 +84,4 @@ namespace ScriptCanvasEditor } } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.h index 4a61a1268b..1d0007a28a 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/EBusSenderNodeDescriptorComponent.h @@ -30,4 +30,4 @@ namespace ScriptCanvasEditor protected: void OnAddedToGraphCanvasGraph(const GraphCanvas::GraphId& graphId, const AZ::EntityId& scriptCanvasNodeId) override; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.cpp index 063f7a899e..51fdfe5c4a 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.cpp @@ -54,4 +54,4 @@ namespace ScriptCanvasEditor GraphCanvas::NodeTitleRequestBus::Event(GetEntityId(), &GraphCanvas::NodeTitleRequests::SetTitle, titleName); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.h index 6116886c4b..0b0cb0515f 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/GetVariableNodeDescriptorComponent.h @@ -30,4 +30,4 @@ namespace ScriptCanvasEditor protected: void UpdateTitle(AZStd::string_view variableName) override; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.cpp index a0c6c0034d..6afb6df2a8 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.cpp @@ -52,4 +52,4 @@ namespace ScriptCanvasEditor GraphCanvas::NodeTitleRequestBus::Event(GetEntityId(), &GraphCanvas::NodeTitleRequests::SetTitle, titleName); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.h index 34e532492f..bcf2082b23 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/SetVariableNodeDescriptorComponent.h @@ -31,4 +31,4 @@ namespace ScriptCanvasEditor protected: void UpdateTitle(AZStd::string_view variableName) override; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.cpp b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.cpp index c64a3c9702..8ff0027ff7 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.cpp @@ -37,4 +37,4 @@ namespace ScriptCanvasEditor : NodeDescriptorComponent(NodeDescriptorType::UserDefined) { } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.h index ce105e36dc..6c3fff2262 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.h @@ -25,4 +25,4 @@ namespace ScriptCanvasEditor UserDefinedNodeDescriptorComponent(); ~UserDefinedNodeDescriptorComponent() = default; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h index 9f72a55272..2d2e0ea283 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h @@ -69,4 +69,4 @@ namespace ScriptCanvasEditor void SetVariableId(const ScriptCanvas::VariableId& variableId); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasBoolDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasBoolDataInterface.h index f5844b00f0..62f1c04728 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasBoolDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasBoolDataInterface.h @@ -61,4 +61,4 @@ namespace ScriptCanvasEditor } } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasNumericDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasNumericDataInterface.h index e03c06286a..62dbf14140 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasNumericDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasNumericDataInterface.h @@ -64,4 +64,4 @@ namespace ScriptCanvasEditor } //// }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasReadOnlyDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasReadOnlyDataInterface.h index 41ed8d73e1..8a26ca69cb 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasReadOnlyDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasReadOnlyDataInterface.h @@ -45,4 +45,4 @@ namespace ScriptCanvasEditor } //// }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h index 50843fefc3..3911d924ee 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h @@ -117,4 +117,4 @@ namespace ScriptCanvasEditor return AZStd::string::format("vector_%i", index); } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasStringPropertyDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasStringPropertyDataInterface.h index 0afb638264..c2a71baacf 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasStringPropertyDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasStringPropertyDataInterface.h @@ -41,4 +41,4 @@ namespace ScriptCanvasEditor } //// }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertySlotIds.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertySlotIds.h index dd302c47d3..5e79f78b24 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertySlotIds.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertySlotIds.h @@ -27,4 +27,4 @@ namespace ScriptCanvasEditor { static const AZ::Crc32 DefaultValue = AZ_CRC("ScriptCanvas_Property_DefaultValue", 0xf837b153); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetTypes.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetTypes.h index 93df57f1e6..45daab73f2 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetTypes.h @@ -15,4 +15,4 @@ namespace ScriptCanvasEditor { -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h index 295f8858d9..a0028cb147 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h @@ -36,4 +36,4 @@ namespace ScriptCanvas private: ScriptCanvasData(const ScriptCanvasData&) = delete; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorSceneVariableManagerBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorSceneVariableManagerBus.h index a9a7b748dd..e635b74e77 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorSceneVariableManagerBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorSceneVariableManagerBus.h @@ -34,4 +34,4 @@ namespace ScriptCanvasEditor }; using EditorSceneVariableManagerRequestBus = AZ::EBus<EditorSceneVariableManagerRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/GraphBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/GraphBus.h index d00423703b..cdc97e9d3c 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/GraphBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/GraphBus.h @@ -28,4 +28,4 @@ namespace ScriptCanvasEditor }; using GeneralGraphEventBus = AZ::EBus<GeneralGraphEvents>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/IconBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/IconBus.h index c7afe22e07..57ceab727c 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/IconBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/IconBus.h @@ -30,4 +30,4 @@ namespace ScriptCanvasEditor }; using IconBus = AZ::EBus<IconRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/NodeIdPair.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/NodeIdPair.h index 8c167d2201..a46226b63b 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/NodeIdPair.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/NodeIdPair.h @@ -26,4 +26,4 @@ namespace ScriptCanvasEditor , m_scriptCanvasId(AZ::EntityId::InvalidEntityId) {} }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraphVariableManagerComponent.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraphVariableManagerComponent.h index f116be496f..2c1cc9495a 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraphVariableManagerComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraphVariableManagerComponent.h @@ -99,4 +99,4 @@ namespace ScriptCanvasEditor EditorGraphVariableItemModel m_variableModel; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorUtils.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorUtils.h index 961a4a46ac..b40dc0cef4 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorUtils.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorUtils.h @@ -53,4 +53,4 @@ namespace ScriptCanvasEditor void RegisterNodeType(const ScriptCanvas::NodeTypeIdentifier& nodeTypeIdentifier); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/DynamicSlotBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/DynamicSlotBus.h index ce603dfb20..cc31c1a48d 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/DynamicSlotBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/DynamicSlotBus.h @@ -31,4 +31,4 @@ namespace ScriptCanvasEditor }; using DynamicSlotRequestBus = AZ::EBus<DynamicSlotRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/MappingBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/MappingBus.h index 9b66429572..6594ac9b80 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/MappingBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/GraphCanvas/MappingBus.h @@ -51,4 +51,4 @@ namespace ScriptCanvasEditor }; using SceneMemberMappingRequestBus = AZ::EBus<SceneMemberMappingRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Model/EntityMimeDataHandler.h b/Gems/ScriptCanvas/Code/Editor/Model/EntityMimeDataHandler.h index 497ce6cd87..d894cf7502 100644 --- a/Gems/ScriptCanvas/Code/Editor/Model/EntityMimeDataHandler.h +++ b/Gems/ScriptCanvas/Code/Editor/Model/EntityMimeDataHandler.h @@ -42,4 +42,4 @@ namespace ScriptCanvasEditor void Activate() override; void Deactivate() override; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Model/LibraryDataModel.h b/Gems/ScriptCanvas/Code/Editor/Model/LibraryDataModel.h index 767cfd2b66..2159fc87a7 100644 --- a/Gems/ScriptCanvas/Code/Editor/Model/LibraryDataModel.h +++ b/Gems/ScriptCanvas/Code/Editor/Model/LibraryDataModel.h @@ -57,4 +57,4 @@ namespace ScriptCanvasEditor DataSet m_data; }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp index c6ecac00f1..a903c9f885 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeDisplayUtils.cpp @@ -332,7 +332,8 @@ namespace ScriptCanvasEditor::Nodes contextGroup = TranslationContextGroup::ClassMethod; break; default: - AZ_Assert(false, "Invalid node type"); + AZ_Error("ScriptCanvas", false, "Invalid method node type, node creation failed. This node nodes to be deleted."); + break; } graphCanvasEntity->Init(); diff --git a/Gems/ScriptCanvas/Code/Editor/QtMetaTypes.h b/Gems/ScriptCanvas/Code/Editor/QtMetaTypes.h index c8fb6e9f28..f289b7d872 100644 --- a/Gems/ScriptCanvas/Code/Editor/QtMetaTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/QtMetaTypes.h @@ -22,4 +22,4 @@ AZ_POP_DISABLE_WARNING Q_DECLARE_METATYPE(AZ::Uuid); Q_DECLARE_METATYPE(AZ::Data::AssetId); Q_DECLARE_METATYPE(ScriptCanvas::Data::Type); -Q_DECLARE_METATYPE(ScriptCanvas::VariableId); \ No newline at end of file +Q_DECLARE_METATYPE(ScriptCanvas::VariableId); diff --git a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h index e8466f2567..74f363f569 100644 --- a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h +++ b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h @@ -129,4 +129,4 @@ namespace ScriptCanvasEditor } } -#include <ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl> \ No newline at end of file +#include <ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl> diff --git a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl index a2221a35fa..02941c4389 100644 --- a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl +++ b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.inl @@ -124,4 +124,4 @@ namespace ScriptCanvasEditor } return false; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Static/Source/View/EditCtrls/GenericLineEditCtrl.cpp b/Gems/ScriptCanvas/Code/Editor/Static/Source/View/EditCtrls/GenericLineEditCtrl.cpp index 836311c1e6..d66bed03bd 100644 --- a/Gems/ScriptCanvas/Code/Editor/Static/Source/View/EditCtrls/GenericLineEditCtrl.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Static/Source/View/EditCtrls/GenericLineEditCtrl.cpp @@ -92,4 +92,4 @@ namespace ScriptCanvasEditor } } -#include <Editor/Static/Include/ScriptCanvas/View/EditCtrls/moc_GenericLineEditCtrl.cpp> \ No newline at end of file +#include <Editor/Static/Include/ScriptCanvas/View/EditCtrls/moc_GenericLineEditCtrl.cpp> diff --git a/Gems/ScriptCanvas/Code/Editor/Utilities/Command.cpp b/Gems/ScriptCanvas/Code/Editor/Utilities/Command.cpp index 0e60a883c5..a6f5bfcc29 100644 --- a/Gems/ScriptCanvas/Code/Editor/Utilities/Command.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Utilities/Command.cpp @@ -16,4 +16,4 @@ namespace ScriptCanvasEditor { -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Utilities/Command.h b/Gems/ScriptCanvas/Code/Editor/Utilities/Command.h index 7181f872a8..39f005f1a4 100644 --- a/Gems/ScriptCanvas/Code/Editor/Utilities/Command.h +++ b/Gems/ScriptCanvas/Code/Editor/Utilities/Command.h @@ -30,4 +30,4 @@ namespace ScriptCanvasEditor AZStd::string m_category; AZStd::string m_iconPath; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.cpp b/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.cpp index dbe85117eb..300819d5b3 100644 --- a/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.cpp @@ -37,4 +37,4 @@ namespace ScriptCanvasEditor return resultValue; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.h b/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.h index cb16c2dd66..0e10096477 100644 --- a/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.h +++ b/Gems/ScriptCanvas/Code/Editor/Utilities/CommonSettingsConfigurations.h @@ -18,4 +18,4 @@ namespace ScriptCanvasEditor { AZStd::string GetEditingGameDataFolder(); -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerTypeLineEdit.h b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerTypeLineEdit.h index 3e6452723d..2bcf6a2f15 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerTypeLineEdit.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerTypeLineEdit.h @@ -153,4 +153,4 @@ namespace ScriptCanvasEditor GraphCanvas::StateSetter<bool> m_disableHidingStateSetter; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerWizard.h b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerWizard.h index e24720b79f..36db1c2f21 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerWizard.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/ContainerWizard/ContainerWizard.h @@ -125,4 +125,4 @@ namespace ScriptCanvasEditor AZStd::unique_ptr< Ui::ContainerWizard > m_ui; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.cpp b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.cpp index 68011c09c1..e0c4132f79 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.cpp @@ -53,4 +53,4 @@ namespace ScriptCanvasEditor } #include <Editor/View/Dialogs/moc_NewGraphDialog.cpp> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.h b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.h index f51bd96c87..f0ad04f0dd 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/NewGraphDialog.h @@ -43,4 +43,4 @@ namespace ScriptCanvasEditor Ui::NewGraphDialog* ui; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/SettingsDialog.h b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/SettingsDialog.h index c76548af79..f450082f9d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/SettingsDialog.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/SettingsDialog.h @@ -96,4 +96,4 @@ namespace ScriptCanvasEditor Ui::SettingsDialog* ui; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.cpp b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.cpp index bae1bfc3b5..05314398ef 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.cpp @@ -51,4 +51,4 @@ namespace ScriptCanvasEditor } #include <Editor/View/Dialogs/moc_UnsavedChangesDialog.cpp> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.h b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.h index d55415f714..bce8f006b0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Dialogs/UnsavedChangesDialog.h @@ -51,4 +51,4 @@ namespace ScriptCanvasEditor Ui::UnsavedChangesDialog* ui; UnsavedChangesOptions m_result = UnsavedChangesOptions::INVALID; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/AssetGraphSceneDataBus.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/AssetGraphSceneDataBus.h index d79dd4052c..c447ddf85e 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/AssetGraphSceneDataBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/AssetGraphSceneDataBus.h @@ -26,4 +26,4 @@ namespace ScriptCanvasEditor using AssetGraphSceneBus = AZ::EBus<AssetGraphScene>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.cpp index 6fa930ba34..19390de956 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.cpp @@ -79,15 +79,19 @@ namespace // Create the nodes in a horizontal list at the top of the canvas. - AZ::Vector2 pos(20.0f, -100.0f); + AZ::Vector2 pos(20.0f, 20.0f); for (const auto& index : ui->commandList->selectionModel()->selectedIndexes()) { - if (index.column() != CommandListDataModel::ColumnIndex::Command) + if (index.column() != CommandListDataModel::ColumnIndex::CommandIndex) { continue; } AZ::Uuid type = dataModel->data(index, CommandListDataModel::CustomRole::Types).value<AZ::Uuid>(); + if (type.IsNull()) + { + continue; + } [[maybe_unused]] const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(type); AZ_Assert(classData, "Failed to find ClassData for ID: %s", type.ToString<AZStd::string>().data()); @@ -115,6 +119,8 @@ namespace ScriptCanvasEditor ///////////////////////////////////////////////////////////////////////////////////////////// CommandListDataModel::CommandListDataModel([[maybe_unused]] QWidget* parent /*= nullptr*/) { + ScriptCanvasCommandLineRequestBus::Handler::BusConnect(); + AZ::SerializeContext* serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); @@ -138,12 +144,62 @@ namespace ScriptCanvasEditor if (add) { - m_nodeTypes.push_back(classData->m_typeId); + Entry entry; + entry.m_type = classData->m_typeId; + m_entries.emplace_back(entry); } } return true; } - ); + ); + + ScriptCanvasCommandLineRequestBus::Broadcast(&ScriptCanvasCommandLineRequests::AddCommand, "add_node", "Adds the specified node to the graph", + [serializeContext](const AZStd::vector<AZStd::string>& nodes) + { + AZ::Uuid nodeTypeToAdd = AZ::Uuid::CreateNull(); + if (nodes.size() > 0) + { + const AZStd::string& nodeName = *(nodes.begin()); + + serializeContext->EnumerateDerived<ScriptCanvas::Node>( + [&nodeName, &nodeTypeToAdd](const AZ::SerializeContext::ClassData* classData, [[maybe_unused]] const AZ::Uuid& classUuid) -> bool + { + if (classData && classData->m_editData) + { + if (nodeName.compare(classData->m_name) == 0) + { + nodeTypeToAdd = classData->m_typeId; + } + } + return true; + } + ); + + if (!nodeTypeToAdd.IsNull()) + { + ScriptCanvas::ScriptCanvasId scriptCanvasId; + ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(scriptCanvasId, &ScriptCanvasEditor::GeneralRequests::GetActiveScriptCanvasId); + + AZ::EntityId graphCanvasGraphId; + ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(graphCanvasGraphId, &ScriptCanvasEditor::GeneralRequests::GetActiveGraphCanvasGraphId); + + if (scriptCanvasId.IsValid() && graphCanvasGraphId.IsValid()) + { + ScriptCanvasEditor::Nodes::StyleConfiguration styleConfiguration; + + AZ::Vector2 pos(100.0f, 20.0f); + NodeIdPair nodePair = ScriptCanvasEditor::Nodes::CreateNode(nodeTypeToAdd, scriptCanvasId, styleConfiguration); + GraphCanvas::SceneRequestBus::Event(graphCanvasGraphId, &GraphCanvas::SceneRequests::AddNode, nodePair.m_graphCanvasId, pos, false); + } + } + } + } + ); + } + + CommandListDataModel::~CommandListDataModel() + { + ScriptCanvasCommandLineRequestBus::Handler::BusDisconnect(); } QModelIndex CommandListDataModel::index(int row, int column, const QModelIndex& parent /*= QModelIndex()*/) const @@ -162,7 +218,7 @@ namespace ScriptCanvasEditor int CommandListDataModel::rowCount([[maybe_unused]] const QModelIndex& parent /*= QModelIndex()*/) const { - return static_cast<int>(m_nodeTypes.size()); + return static_cast<int>(m_entries.size()); } int CommandListDataModel::columnCount([[maybe_unused]] const QModelIndex& parent /*= QModelIndex()*/) const @@ -190,19 +246,40 @@ namespace ScriptCanvasEditor } } - AZ::Uuid nodeType = m_nodeTypes[index.row()]; - const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(nodeType); - if (index.column() == ColumnIndex::Command) + AZ::Uuid nodeType = m_entries[index.row()].m_type; + if (nodeType.IsNull()) { - return QVariant(QString(classData->m_name)); + if (index.column() == ColumnIndex::CommandIndex) + { + return QVariant(QString(m_entries[index.row()].m_command.c_str())); + } + if (index.column() == ColumnIndex::DescriptionIndex) + { + AZStd::string command = m_entries[index.row()].m_command; + const auto& entry = m_commands.find(command); + if (entry != m_commands.end()) + { + return QVariant(QString(entry->second->GetDescription().c_str())); + } + } } - if (index.column() == ColumnIndex::Description) + else { - return QVariant(QString(classData->m_editData ? classData->m_editData->m_description : tr("No description provided."))); - } - if (index.column() == ColumnIndex::Trail) - { - return QVariant(QString("")); + if (const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(nodeType)) + { + if (index.column() == ColumnIndex::CommandIndex) + { + return QVariant(QString(classData->m_name)); + } + if (index.column() == ColumnIndex::DescriptionIndex) + { + return QVariant(QString(classData->m_editData ? classData->m_editData->m_description : tr("No description provided."))); + } + if (index.column() == ColumnIndex::TrailIndex) + { + return QVariant(QString("")); + } + } } } @@ -210,25 +287,42 @@ namespace ScriptCanvasEditor { case CustomRole::Types: { - AZ::Uuid nodeType = m_nodeTypes[index.row()]; + AZ::Uuid nodeType = m_entries[index.row()].m_type; return QVariant::fromValue<AZ::Uuid>(nodeType); } break; case CustomRole::Node: { - AZ::Uuid nodeType = m_nodeTypes[index.row()]; - const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(nodeType); - if (index.column() == ColumnIndex::Command) + AZ::Uuid nodeType = m_entries[index.row()].m_type; + if (nodeType.IsNull()) { - return QVariant(QString(classData->m_name)); + return QVariant(QString(m_entries[index.row()].m_command.c_str())); } - if (index.column() == ColumnIndex::Description) + else { - return QVariant(QString(classData->m_editData ? classData->m_editData->m_description : tr("No description provided."))); + if (const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(nodeType)) + { + if (index.column() == ColumnIndex::CommandIndex) + { + return QVariant(QString(classData->m_name)); + } + if (index.column() == ColumnIndex::DescriptionIndex) + { + return QVariant(QString(classData->m_editData ? classData->m_editData->m_description : tr("No description provided."))); + } + if (index.column() == ColumnIndex::TrailIndex) + { + return QVariant(QString("")); + } + } } - if (index.column() == ColumnIndex::Trail) + } + break; + case CustomRole::Commands: + { + if (index.column() == ColumnIndex::CommandIndex) { - return QVariant(QString("")); + return QVariant(QString(m_entries[index.row()].m_command.c_str())); } } break; @@ -250,21 +344,31 @@ namespace ScriptCanvasEditor AZ::SerializeContext* serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); - for (const auto& entry : m_nodeTypes) + for (const auto& entry : m_entries) { - const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(entry); - if (classData) + if (!entry.m_type.IsNull()) { - QString name = QString(classData->m_name); - if (name.startsWith(input.c_str(), Qt::CaseSensitivity::CaseInsensitive)) + if (const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(entry.m_type)) { - return true; + QString name = QString(classData->m_name); + if (name.startsWith(input.c_str(), Qt::CaseSensitivity::CaseInsensitive)) + { + return true; + } } } + else + { + QString commandName = entry.m_command.c_str(); + return (commandName.startsWith(input.c_str(), Qt::CaseSensitivity::CaseInsensitive)); + } } + return false; } + ScriptCanvasEditor::Widget::CommandRegistry CommandListDataModel::m_commands; + // CommandLineEdit ///////////////////////////////////////////////////////////////////////////////////////////// @@ -335,8 +439,25 @@ namespace ScriptCanvasEditor case Qt::Key_Return: { // Invoke the command - // TODO: trigger invoke - // CommandRequestBus::Broadcast(&CommandRequest::Invoke, text().toStdString().c_str()); + AZStd::string commandText = text().toStdString().c_str(); + AZStd::vector<AZStd::string> tokens; + AZ::StringFunc::Tokenize(commandText, tokens, " "); + if (tokens.size() == 1) + { + ScriptCanvasCommandLineRequestBus::Broadcast(&ScriptCanvasCommandLineRequests::Invoke, tokens.begin()->c_str()); + } + else if (tokens.size() > 1) + { + AZStd::string command = *(tokens.begin()); + AZStd::vector<AZStd::string> args; + for (auto it = tokens.begin() + 1; it != tokens.end(); ++it) + { + args.push_back(*it); + } + ScriptCanvasCommandLineRequestBus::Broadcast(&ScriptCanvasCommandLineRequests::InvokeWithArguments, command.c_str(), args); + } + + ResetState(); qobject_cast<QWidget*>(parent())->hide(); } @@ -376,20 +497,29 @@ namespace ScriptCanvasEditor // CommandListDataProxyModel ///////////////////////////////////////////////////////////////////////////////////////////// - CommandListDataProxyModel::CommandListDataProxyModel(QObject* parent /*= nullptr*/) + CommandListDataProxyModel::CommandListDataProxyModel(CommandListDataModel* commandListData, QObject* parent /*= nullptr*/) : QSortFilterProxyModel(parent) { - QStringList commands; + setSourceModel(commandListData); + + QStringList commandList; - CommandListDataModel* commandListData = new CommandListDataModel(); for (int i = 0; i < commandListData->rowCount(); ++i) { - QModelIndex index = commandListData->index(i, CommandListDataModel::ColumnIndex::Command); + QModelIndex index = commandListData->index(i, CommandListDataModel::ColumnIndex::CommandIndex); QString command = commandListData->data(index, CommandListDataModel::CustomRole::Node).toString(); - commands.push_back(command); + commandList.push_back(command); } - m_completer = new QCompleter(commands); + ScriptCanvasCommandLineRequests::CommandNameList commands; + ScriptCanvasCommandLineRequestBus::BroadcastResult(commands, &ScriptCanvasCommandLineRequests::GetCommands); + for (auto& command : commands) + { + QString commandName = command.first.c_str(); + commandList.push_back(commandName); + } + + m_completer = new QCompleter(commandList); m_completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); m_completer->setCaseSensitivity(Qt::CaseInsensitive); } @@ -421,7 +551,7 @@ namespace ScriptCanvasEditor } } - QModelIndex index = dataModel->index(sourceRow, CommandListDataModel::ColumnIndex::Command); + QModelIndex index = dataModel->index(sourceRow, CommandListDataModel::ColumnIndex::CommandIndex); QString sourceStr = dataModel->data(index).toString(); if (sourceRow > 0 && sourceStr.startsWith(m_input.c_str(), Qt::CaseSensitivity::CaseInsensitive)) @@ -450,8 +580,7 @@ namespace ScriptCanvasEditor ui->setupUi(this); CommandListDataModel* commandListDataModel = new CommandListDataModel(); - CommandListDataProxyModel* commandListDataProxyModel = new CommandListDataProxyModel(); - commandListDataProxyModel->setSourceModel(commandListDataModel); + CommandListDataProxyModel* commandListDataProxyModel = new CommandListDataProxyModel(commandListDataModel); ui->commandList->setModel(commandListDataProxyModel); @@ -460,8 +589,8 @@ namespace ScriptCanvasEditor connect(ui->commandText, &CommandLineEdit::onKeyReleased, this, &CommandLine::onEditKeyReleaseEvent); connect(ui->commandList, &CommandLineList::onKeyReleased, this, &CommandLine::onListKeyReleaseEvent); - ui->commandList->setColumnWidth(CommandListDataModel::ColumnIndex::Command, 250); - ui->commandList->setColumnWidth(CommandListDataModel::ColumnIndex::Description, 1000); + ui->commandList->setColumnWidth(CommandListDataModel::ColumnIndex::CommandIndex, 250); + ui->commandList->setColumnWidth(CommandListDataModel::ColumnIndex::DescriptionIndex, 1000); } void CommandLine::onTextChanged(const QString& text) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.h index ab9b115bde..28e3ce4671 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.h @@ -25,6 +25,7 @@ #include <AzCore/Memory/SystemAllocator.h> #include <AzCore/std/containers/vector.h> #include <AzCore/std/string/string.h> +#include <AzCore/Console/Console.h> #endif namespace Ui @@ -36,10 +37,49 @@ namespace ScriptCanvasEditor { namespace Widget { + class Command + { + public: + using Functor = AZStd::function<void(AZStd::vector<AZStd::string>)>; + + Command(const AZStd::string& name, const AZStd::string& description, Functor functor) + : m_name(name) + , m_description(description) + , m_functor(functor) + {} + + void operator()(const AZStd::vector<AZStd::string>& args) + { + m_functor(args); + } + + const AZStd::string& GetName() const { return m_name; } + const AZStd::string& GetDescription() const { return m_description; } + + private: + AZStd::string m_name; + AZStd::string m_description; + Functor m_functor; + }; + + using CommandRegistry = AZStd::unordered_map<AZStd::string, AZStd::unique_ptr<Command>>; + + struct ScriptCanvasCommandLineRequests : public AZ::EBusTraits + { + virtual void AddCommand(const AZStd::string commandName, const AZStd::string description, Command::Functor) = 0; + virtual void Invoke(const char* commandName) = 0; + virtual void InvokeWithArguments(const char* commandName, const AZStd::vector<AZStd::string>&) = 0; + + using CommandNameList = AZStd::list<AZStd::pair<AZStd::string, AZStd::string>>; + virtual CommandNameList GetCommands() = 0; + }; + using ScriptCanvasCommandLineRequestBus = AZ::EBus<ScriptCanvasCommandLineRequests>; + // TODO #lsempe: this deserves its own file // CommandListDataModel ///////////////////////////////////////////////////////////////////////////////////////////// class CommandListDataModel : public QAbstractTableModel + , ScriptCanvasCommandLineRequestBus::Handler { Q_OBJECT @@ -49,9 +89,9 @@ namespace ScriptCanvasEditor enum ColumnIndex { - Command, - Description, - Trail, + CommandIndex, + DescriptionIndex, + TrailIndex, Count }; @@ -65,6 +105,8 @@ namespace ScriptCanvasEditor }; CommandListDataModel(QWidget* parent = nullptr); + ~CommandListDataModel() override; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &child) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; @@ -75,10 +117,62 @@ namespace ScriptCanvasEditor bool HasMatches(const AZStd::string& input); + struct Entry + { + AZ::Uuid m_type; + AZStd::string m_command; + + Entry() + { + m_type = AZ::Uuid::CreateNull(); + } + }; + protected: - AZStd::vector<AZ::Uuid> m_nodeTypes; + AZStd::vector<Entry> m_entries; + static CommandRegistry m_commands; + + void AddCommand(const AZStd::string commandName, const AZStd::string description, Command::Functor f) override + { + if (m_commands.find(commandName) == m_commands.end()) + { + m_commands[commandName] = AZStd::make_unique<Command>(commandName, description, f); + Entry entry; + entry.m_command = commandName; + entry.m_type = AZ::Uuid::CreateNull(); + m_entries.emplace_back(entry); + } + } + + void Invoke(const char* commandName) override + { + auto command = m_commands.find(commandName); + if (command != m_commands.end()) + { + command->second->operator()({}); + } + } + + void InvokeWithArguments(const char* commandName, const AZStd::vector<AZStd::string>& args) override + { + auto command = m_commands.find(commandName); + if (command != m_commands.end()) + { + command->second->operator()(args); + } + } + + ScriptCanvasCommandLineRequests::CommandNameList GetCommands() override + { + ScriptCanvasCommandLineRequests::CommandNameList commands; + for (auto& command : m_commands) + { + commands.push_back(AZStd::make_pair(command.second->GetName(), command.second->GetDescription())); + } + return commands; + } }; class CommandListDataProxyModel : public QSortFilterProxyModel @@ -88,7 +182,7 @@ namespace ScriptCanvasEditor public: AZ_CLASS_ALLOCATOR(CommandListDataProxyModel, AZ::SystemAllocator, 0); - CommandListDataProxyModel(QObject* parent = nullptr); + CommandListDataProxyModel(CommandListDataModel* commandListData, QObject* parent = nullptr); bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; @@ -168,4 +262,4 @@ namespace ScriptCanvasEditor AZStd::unique_ptr<Ui::CommandLine> ui; }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.ui b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.ui index 54ff15260e..5facdcae2e 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CommandLine.ui @@ -121,4 +121,4 @@ <header>Editor/View/Widgets/CommandLine.h</header> </customwidget> </customwidgets> -</ui> \ No newline at end of file +</ui> diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LogPanel.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LogPanel.h index 1fe54ff16d..4d4f11b62f 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LogPanel.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LogPanel.h @@ -102,4 +102,4 @@ namespace ScriptCanvasEditor } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.cpp index 7e814b6d66..a5b1b005fa 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.cpp @@ -50,4 +50,4 @@ namespace ScriptCanvasEditor } #include <Editor/View/Widgets/LoggingPanel/AssetWindowSession/moc_LoggingAssetWindowSession.cpp> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.h index 0777aabcb5..66e057254d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetWindowSession.h @@ -41,4 +41,4 @@ namespace ScriptCanvasEditor LoggingAssetDataAggregator m_dataAggregator; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h index d119c79c51..9bc6c80772 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h @@ -140,4 +140,4 @@ namespace ScriptCanvasEditor ScriptCanvas::Debugger::Target m_targetConfiguration; AZStd::intrusive_ptr<LiveLoggingUserSettings> m_userSettings; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.cpp index bd01e83eb4..3718ff405b 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.cpp @@ -15,4 +15,4 @@ namespace ScriptCanvasEditor { -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.h index 70baa7c042..2d442a0eea 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingTypes.h @@ -31,4 +31,4 @@ namespace ScriptCanvasEditor typedef AZStd::unordered_multimap<AZ::NamedEntityId, ScriptCanvas::GraphIdentifier> LoggingEntityMap; typedef AZStd::unordered_set<ScriptCanvas::GraphIdentifier> LoggingAssetSet; typedef AZ::EntityId LoggingDataId; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.cpp index 469226f008..e7d2fe3147 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.cpp @@ -480,4 +480,4 @@ namespace ScriptCanvasEditor } #include <Editor/View/Widgets/LoggingPanel/moc_LoggingWindowSession.cpp> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.h index d8168dd47d..f7dfa4c0b7 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowSession.h @@ -145,4 +145,4 @@ namespace ScriptCanvasEditor AZ::Data::AssetId m_assetId; AZ::EntityId m_assetNodeId; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/EntityPivotTree/EntityPivotTree.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/EntityPivotTree/EntityPivotTree.h index 0335ad3c75..e5e9207e02 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/EntityPivotTree/EntityPivotTree.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/EntityPivotTree/EntityPivotTree.h @@ -121,4 +121,4 @@ namespace ScriptCanvasEditor public: EntityPivotTreeWidget(QWidget* parent); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/GraphPivotTree/GraphPivotTree.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/GraphPivotTree/GraphPivotTree.h index df2b4d4e93..6b0be7e032 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/GraphPivotTree/GraphPivotTree.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/GraphPivotTree/GraphPivotTree.h @@ -176,4 +176,4 @@ namespace ScriptCanvasEditor public: GraphPivotTreeWidget(QWidget* parent); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/PivotTreeWidget.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/PivotTreeWidget.h index b244de4811..eda538b478 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/PivotTreeWidget.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/PivotTree/PivotTreeWidget.h @@ -205,4 +205,4 @@ namespace ScriptCanvasEditor GraphCanvas::GraphCanvasTreeModel* m_treeModel; PivotTreeSortProxyModel* m_proxyModel; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.cpp index 1f3ea85a92..f22868c066 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.cpp @@ -43,4 +43,4 @@ namespace ScriptCanvasEditor } #include <Editor/View/Widgets/moc_MainWindowStatusWidget.cpp> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.h index f068c2b20b..e79dfdcb60 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/MainWindowStatusWidget.h @@ -52,4 +52,4 @@ namespace ScriptCanvasEditor private: AZStd::unique_ptr<Ui::MainWindowStatusWidget> m_ui; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/CreateNodeMimeEvent.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/CreateNodeMimeEvent.h index eff8f90cfa..c79a5cddf2 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/CreateNodeMimeEvent.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/CreateNodeMimeEvent.h @@ -76,4 +76,4 @@ namespace ScriptCanvasEditor virtual AZStd::vector< GraphCanvas::GraphCanvasMimeEvent* > CreateMimeEvents() const = 0; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/EBusNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/EBusNodePaletteTreeItemTypes.h index c795d94da0..b5181754c4 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/EBusNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/EBusNodePaletteTreeItemTypes.h @@ -163,4 +163,4 @@ namespace ScriptCanvasEditor }; // </EbusHandlerEvent> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp index 6d36236906..e1d02c2792 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.cpp @@ -41,11 +41,11 @@ namespace ScriptCanvasEditor if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext)) { serializeContext->Class<CreateFunctionMimeEvent, CreateNodeMimeEvent>() - ->Version(4) + ->Version(5) ->Field("AssetId", &CreateFunctionMimeEvent::m_assetId) + ->Field("sourceId", &CreateFunctionMimeEvent::m_sourceId) ; } - } CreateFunctionMimeEvent::CreateFunctionMimeEvent(const AZ::Data::AssetId& assetId, const AZ::Data::AssetType& assetType, const ScriptCanvas::Grammar::FunctionSourceId& sourceId) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/GeneralNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/GeneralNodePaletteTreeItemTypes.h index 81ff029d66..38a2be88f5 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/GeneralNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/GeneralNodePaletteTreeItemTypes.h @@ -150,4 +150,4 @@ namespace ScriptCanvasEditor }; // </CustomNode> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp index 4154c3982e..6028b284fa 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp @@ -57,7 +57,7 @@ namespace { if (excludeAttributeData) { - AZ::u64 exclusionFlags = AZ::Script::Attributes::ExcludeFlags::List | AZ::Script::Attributes::ExcludeFlags::ListOnly | AZ::ScriptCanvasAttributes::VariableCreationForbidden; + AZ::u64 exclusionFlags = AZ::Script::Attributes::ExcludeFlags::List | AZ::Script::Attributes::ExcludeFlags::ListOnly; if (typeId == AzToolsFramework::Components::EditorComponentBase::TYPEINFO_Uuid()) { @@ -136,18 +136,13 @@ namespace return; } - if (behaviorClass) + if (behaviorClass && !isOverloaded) { auto excludeMethodAttributeData = azdynamic_cast<const AZ::Edit::AttributeData<AZ::Script::Attributes::ExcludeFlags>*>(AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, method.m_attributes)); if (ShouldExcludeFromNodeList(excludeMethodAttributeData, behaviorClass->m_azRtti ? behaviorClass->m_azRtti->GetTypeId() : behaviorClass->m_typeId)) { return; } - - if (!ScriptCanvas::Data::IsAllowedBehaviorClassVariableType(behaviorClass->m_typeId)) - { - return; - } } const auto isExposableOutcome = ScriptCanvas::IsExposable(method); @@ -479,38 +474,24 @@ namespace continue; } - // Only bind Behavior Classes marked with the Scope type of Launcher + if (auto excludeFromPointer = AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, behaviorClass->m_attributes)) + { + AZ::Script::Attributes::ExcludeFlags excludeFlags{}; + AZ::AttributeReader(nullptr, excludeFromPointer).Read<AZ::Script::Attributes::ExcludeFlags>(excludeFlags); + + if ((excludeFlags & (AZ::Script::Attributes::ExcludeFlags::List | AZ::Script::Attributes::ExcludeFlags::ListOnly)) != 0) + { + continue; + } + } + if (!AZ::Internal::IsInScope(behaviorClass->m_attributes, AZ::Script::Attributes::ScopeFlags::Launcher)) { - continue; // skip this class + continue; } // Objects and Object methods { - bool canCreate = serializeContext->FindClassData(behaviorClass->m_typeId) != nullptr && - !HasAttribute(behaviorClass, AZ::ScriptCanvasAttributes::VariableCreationForbidden); - - // In order to create variables, the class must have full memory support - canCreate = canCreate && - (behaviorClass->m_allocate - && behaviorClass->m_cloner - && behaviorClass->m_mover - && behaviorClass->m_destructor - && behaviorClass->m_deallocate); - - if (canCreate) - { - // Do not allow variable creation for data that derives from AZ::Component - for (auto base : behaviorClass->m_baseClasses) - { - if (AZ::Component::TYPEINFO_Uuid() == base) - { - canCreate = false; - break; - } - } - } - AZStd::string categoryPath; AZStd::string translationContext = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, behaviorClass->m_name); @@ -530,17 +511,14 @@ namespace } } - if (canCreate) - { - auto dataRegistry = ScriptCanvas::GetDataRegistry(); - ScriptCanvas::Data::Type type = dataRegistry->m_typeIdTraitMap[ScriptCanvas::Data::eType::BehaviorContextObject].m_dataTraits.GetSCType(behaviorClass->m_typeId); + auto dataRegistry = ScriptCanvas::GetDataRegistry(); + ScriptCanvas::Data::Type type = dataRegistry->m_typeIdTraitMap[ScriptCanvas::Data::eType::BehaviorContextObject].m_dataTraits.GetSCType(behaviorClass->m_typeId); - if (type.IsValid()) + if (type.IsValid()) + { + if (dataRegistry->m_creatableTypes.contains(type)) { - if (!AZ::FindAttribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, behaviorClass->m_attributes)) - { - ScriptCanvasEditor::VariablePaletteRequestBus::Broadcast(&ScriptCanvasEditor::VariablePaletteRequests::RegisterVariableType, type); - } + ScriptCanvasEditor::VariablePaletteRequestBus::Broadcast(&ScriptCanvasEditor::VariablePaletteRequests::RegisterVariableType, type); } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModelBus.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModelBus.h index 51eda4b39c..f946b15392 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModelBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModelBus.h @@ -35,4 +35,4 @@ namespace ScriptCanvasEditor }; using NodePaletteModelNotificationBus = AZ::EBus<NodePaletteModelNotifications>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h index 4be06b87bd..1654f3f771 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h @@ -106,4 +106,4 @@ namespace ScriptCanvasEditor GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override; }; // </NodeGroup> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h index c7946aecbd..c49d4777ab 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h @@ -265,4 +265,4 @@ namespace ScriptCanvasEditor }; // </VariableNodePaletteTreeItem> -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/PropertyGridBus.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/PropertyGridBus.h index 75c13986b1..7017e34dae 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/PropertyGridBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/PropertyGridBus.h @@ -30,4 +30,4 @@ namespace ScriptCanvasEditor }; using PropertyGridRequestBus = AZ::EBus<PropertyGridRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.cpp index fb041ce8f5..a742b13ee2 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.cpp @@ -119,4 +119,4 @@ namespace ScriptCanvasEditor m_filter->SetHoveredIndex(QModelIndex()); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.h index adb93c3399..1298abe198 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/UnitTestPanel/UnitTestTreeView.h @@ -63,4 +63,4 @@ namespace ScriptCanvasEditor AzToolsFramework::AssetBrowser::AssetBrowserModel* m_model; UnitTestBrowserFilterModel* m_filter; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidgetBus.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidgetBus.h index ce8be3182e..af3c95fa50 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidgetBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ValidationPanel/GraphValidationDockWidgetBus.h @@ -27,4 +27,4 @@ namespace ScriptCanvasEditor }; using GraphValidatorDockWidgetNotificationBus = AZ::EBus<GraphValidatorDockWidgetNotifications>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp index d345778f71..e7090ea4a6 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/SlotTypeSelectorWidget.cpp @@ -80,6 +80,13 @@ namespace ScriptCanvasEditor QObject::connect(ui->slotName, &QLineEdit::returnPressed, this, &SlotTypeSelectorWidget::OnReturnPressed); QObject::connect(ui->slotName, &QLineEdit::textChanged, this, &SlotTypeSelectorWidget::OnNameChanged); QObject::connect(ui->variablePalette, &QTableView::clicked, this, [this]() { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); }); + QObject::connect(ui->variablePalette, &VariablePaletteTableView::CreateNamedVariable, this, [this](const AZStd::string& variableName, const ScriptCanvas::Data::Type& variableType) + { + // only emitted on container types + OnCreateVariable(variableType); + OnNameChanged(variableName.c_str()); + accept(); + }); // Tell the widget to auto create our context menu, for now setContextMenuPolicy(Qt::ActionsContextMenu); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.cpp index a05468d565..9bec796f53 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.cpp @@ -122,8 +122,8 @@ namespace ScriptCanvasEditor for (const AZ::Uuid& objectId : objectTypes) { - // Verify whether this is an allowed BC variable type - if (!ScriptCanvas::Data::IsAllowedBehaviorClassVariableType(objectId)) + ScriptCanvas::Data::Type type = dataRegistry->m_typeIdTraitMap[ScriptCanvas::Data::eType::BehaviorContextObject].m_dataTraits.GetSCType(objectId); + if (!type.IsValid() || !dataRegistry->m_creatableTypes.contains(type)) { continue; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h index ef8db64e66..0cbab008b0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h @@ -79,4 +79,4 @@ namespace ScriptCanvasEditor QCompleter* m_completer; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/WidgetBus.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/WidgetBus.h index 30f672a65e..2b4f98b4c7 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/WidgetBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/WidgetBus.h @@ -26,4 +26,4 @@ namespace ScriptCanvasEditor using WidgetNotificationBus = AZ::EBus<WidgetNotification>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/EBusHandlerActionMenu.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/EBusHandlerActionMenu.h index 5f7f08c3ae..5f9629d473 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/EBusHandlerActionMenu.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/EBusHandlerActionMenu.h @@ -122,4 +122,4 @@ namespace ScriptCanvasEditor EBusHandlerActionSourceModel* m_model; Ui::EBusHandlerActionListWidget* m_listWidget; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index 3f226e62e0..ee4d6d9371 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -595,7 +595,6 @@ namespace ScriptCanvasEditor m_commandLine = new Widget::CommandLine(this); m_commandLine->setBaseSize(QSize(size().width(), m_commandLine->size().height())); m_commandLine->setObjectName("CommandLine"); - m_commandLine->hide(); m_layout->addWidget(m_commandLine); m_layout->addWidget(m_emptyCanvas); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindowBus.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindowBus.h index 7d74c52755..82b7e3072d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindowBus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindowBus.h @@ -31,4 +31,4 @@ namespace ScriptCanvasEditor }; using MainWindowNotificationBus = AZ::EBus<MainWindowNotifications>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui b/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui index 40ba00bb31..3b3043a4a0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/mainwindow.ui @@ -244,7 +244,7 @@ <bool>false</bool> </property> <property name="visible"> - <bool>false</bool> + <bool>true</bool> </property> </action> <action name="action_ViewNodePalette"> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/ScriptCanvasAssetData.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/ScriptCanvasAssetData.h index b962136f72..650c568b53 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/ScriptCanvasAssetData.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Asset/ScriptCanvasAssetData.h @@ -15,4 +15,4 @@ namespace ScriptCanvas { -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja index b7394ef212..089e5fe6ff 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasGrammar_Header.jinja @@ -66,7 +66,7 @@ namespace {{attribute_Namespace}} {% set deprecationUuid = Class.attrib['DeprecationUUID'] %} -// The following will be injected directly into the source header file for which AzCodeGenerator is being run. +// The following will be injected directly into the source header file for which AZ AutoGen is being run. // You must #include the generated header into the source header #define SCRIPTCANVAS_NODE_{{ className }} \ public: \ @@ -168,4 +168,4 @@ struct {{ className | replace(' ','') }}Property {% endfor %} -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja index aa719336e4..202fad5b60 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Header.jinja @@ -102,4 +102,4 @@ public: \ {% endfor %} -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja index 7b873e1362..27498a2aec 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja @@ -158,7 +158,7 @@ return {{returnNames[0]}}; {% endfor %} {# ExecutionOuts #} // ExecutionOuts begin -{{ nodemacro.ExecutionOutDefinitions(Class, attribute_QualifiedName )}} +{{ nodemacro.ExecutionOutDefinitions(Class, attribute_QualifiedName)}} // ExecutionOuts end {# Reflect #} void {{attribute_QualifiedName}}::Reflect(AZ::ReflectContext* context) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja index 838f98d581..1d21ebd8d3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja @@ -307,4 +307,4 @@ AZStd::tuple<{{returnTypes|join(", ")}}> } #} } -{% endmacro -%} \ No newline at end of file +{% endmacro -%} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja index f66765004c..addd24f5d3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja @@ -307,41 +307,49 @@ AZStd::tuple<{{returns|join(", ")}}> {% for executionOut in Class.findall('Output') %} {{ ExecutionOutDeclaration(Class, executionOut) }} {%- endfor %} +size_t GetRequiredOutCount() const override; {% endmacro %} -{% macro ExecutionBranchDefinition(Class, qualifiedName, executionOut) %} +{% macro ExecutionBranchDefinition(Class, qualifiedName, executionOut, outIndexBranch) %} {% set outName = CleanName(executionOut.attrib['Name']) %} {% set returns = executionOut.findall('Parameter') %} {% set params = executionOut.findall('Return') %} -void {{qualifiedName}}::Call{{CleanName(outName)}}({{ExecutionOutReturnDefinition(returns)}}{{ExecutionOutParameterDefinition(returns, params)}}) { +void {{qualifiedName}}::Call{{outName}}({{ExecutionOutReturnDefinition(returns)}}{{ExecutionOutParameterDefinition(returns, params)}}) { {% if returns|length() == 0 %} - ExecutionOut(AZ_CRC_CE("{{ executionOut.attrib['Name'] }}"){% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}} {% endfor %} + ExecutionOut({{ outIndexBranch }}{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}}{% endfor %} {% else %} - OutResult(AZ_CRC_CE("{{ executionOut.attrib['Name'] }}"), result{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}} {% endfor %} -{% endif -%}); + ExecutionOutResult({{ outIndexBranch }}, result{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}}{% endfor %} +{% endif -%}); // {{ executionOut.attrib['Name'] }} } {% endmacro %} -{% macro ExecutionOutDefinition(Class, qualifiedName, executionOut) %} +{% macro ExecutionOutDefinition(Class, qualifiedName, executionOut, outIndexLatent) %} {% set outName = CleanName(executionOut.attrib['Name']) %} {% set returns = executionOut.findall('Return') %} {% set params = executionOut.findall('Parameter') %} void {{qualifiedName}}::Call{{CleanName(outName)}}({{ExecutionOutReturnDefinition(returns)}}{{ExecutionOutParameterDefinition(returns, params)}}) { {% if returns|length() == 0 %} - ExecutionOut(AZ_CRC_CE("{{ executionOut.attrib['Name'] }}"){% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}} {% endfor %} + ExecutionOut({{ outIndexLatent }}{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}}{% endfor %} {% else %} - OutResult(AZ_CRC_CE("{{ executionOut.attrib['Name'] }}"), result{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}} {% endfor %} -{% endif -%} ); + ExecutionOutResult({{ outIndexLatent }}, result{% for parameter in params %}, {{CleanName(parameter.attrib['Name'])}}{% endfor %} +{% endif -%}); // {{ executionOut.attrib['Name'] }} } {% endmacro %} {% macro ExecutionOutDefinitions(Class, qualifiedName) %} +{% set branches = [] %} {% for method in Class.findall('Input') %} {%- for branch in method.findall('Branch') %} - {{ ExecutionBranchDefinition(Class, qualifiedName, branch) }} +{% if branches.append(branch) %}{% endif %} {%- endfor %} -{% endfor %} -{%- for executionOut in Class.findall('Output') -%} - {{ ExecutionOutDefinition(Class, qualifiedName, executionOut) }} +{% endfor %} +{%- for branch in branches -%} + {{ ExecutionBranchDefinition(Class, qualifiedName, branch, loop.index0) }} {%- endfor %} -{% endmacro %} \ No newline at end of file +{%- for executionOut in Class.findall('Output') -%} + {{ ExecutionOutDefinition(Class, qualifiedName, executionOut, loop.index0 + branches|length) }} +{%- endfor %} + +size_t {{qualifiedName}}::GetRequiredOutCount() const { return {{Class.findall('Output')|length + branches|length}}; } + +{% endmacro %} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.cpp index b42ecee712..880e0d4d22 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.cpp @@ -176,4 +176,4 @@ namespace ScriptCanvas GraphRequestBus::Event(*GraphNotificationBus::GetCurrentBusId(), &GraphRequests::DisconnectById, GetEntityId()); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.h index 5760ad2bc5..155e5bb4c2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Connection.h @@ -75,4 +75,4 @@ namespace ScriptCanvas Endpoint m_targetEndpoint; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/ConnectionBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/ConnectionBus.h index 36326fbf38..a0813dc69c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/ConnectionBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/ConnectionBus.h @@ -37,4 +37,4 @@ namespace ScriptCanvas using ConnectionRequestBus = AZ::EBus<ConnectionRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Contracts/MathOperatorContract.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Contracts/MathOperatorContract.h index a4b8bf69b1..a7406451b4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Contracts/MathOperatorContract.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Contracts/MathOperatorContract.h @@ -49,4 +49,4 @@ namespace ScriptCanvas AZ::Outcome<void, AZStd::string> OnEvaluate(const Slot& sourceSlot, const Slot& targetSlot) const override; AZ::Outcome<void, AZStd::string> OnEvaluateForType(const Data::Type& dataType) const override; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h index e361e71415..781dcb9ed8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h @@ -208,7 +208,13 @@ namespace ScriptCanvas static const t_Value* Help(Datum& datum) { static_assert(!AZStd::is_pointer<t_Value>::value, "no pointer types in the Datum::GetAsHelper<t_Value, false>"); - if (datum.m_type.GetType() == Data::eType::BehaviorContextObject) + + if (datum.m_storage.empty()) + { + // rare, but can be caused by removals or problems with reflection to BehaviorContext, so must be checked + return nullptr; + } + else if (datum.m_type.GetType() == Data::eType::BehaviorContextObject) { return (*AZStd::any_cast<BehaviorContextObjectPtr>(&datum.m_storage))->CastConst<t_Value>(); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusHandler.cpp index 84e67c1215..804bb59e56 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusHandler.cpp @@ -88,17 +88,7 @@ namespace ScriptCanvas void EBusHandler::InitializeEBusHandling(AZStd::string_view busName, AZ::BehaviorContext* behaviorContext) { CreateHandler(busName, behaviorContext); - - const AZ::BehaviorEBusHandler::EventArray& events = m_handler->GetEvents(); - AZStd::vector<AZ::Crc32> eventKeys; - eventKeys.reserve(events.size()); - - for (int eventIndex(0); eventIndex < events.size(); ++eventIndex) - { - eventKeys.push_back(eventIndex); - } - - InitializeExecutionOuts(eventKeys); + InitializeExecutionOuts(m_handler->GetEvents().size()); } bool EBusHandler::IsConnected() const @@ -137,7 +127,7 @@ namespace ScriptCanvas void EBusHandler::OnEvent(const char* /*eventName*/, const int eventIndex, AZ::BehaviorValueParameter* result, const int numParameters, AZ::BehaviorValueParameter* parameters) { - CallOut(AZ::Crc32(eventIndex), result, parameters, numParameters); + CallOut(eventIndex, result, parameters, numParameters); } void EBusHandler::Reflect(AZ::ReflectContext* reflectContext) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusNodeBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusNodeBus.h index e1c0fe0f2d..d30aaf623e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusNodeBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/EBusNodeBus.h @@ -28,4 +28,4 @@ namespace ScriptCanvas }; using EBusHandlerNodeRequestBus = AZ::EBus<EBusHandlerNodeRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphScopedTypes.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphScopedTypes.h index 85533708d9..4eda680c7c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphScopedTypes.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/GraphScopedTypes.h @@ -81,4 +81,4 @@ namespace AZStd return seed; } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/MethodConfiguration.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/MethodConfiguration.cpp index 19b01c43cc..ab2f5ac8db 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/MethodConfiguration.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/MethodConfiguration.cpp @@ -57,7 +57,7 @@ namespace ScriptCanvas for (size_t resultIndex = 0; resultIndex < unpackedTypes.size(); ++resultIndex) { - const Data::Type outputType(Data::FromAZType(unpackedTypes[resultIndex])); + const Data::Type outputType = (unpackedTypes.size() == 1 && AZ::BehaviorContextHelper::IsStringParameter(*result)) ? Data::Type::String() : Data::FromAZType(unpackedTypes[resultIndex]); const AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).data())); SlotId addedSlotId; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NativeDatumNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NativeDatumNode.h index 142a25e0e5..0af235f935 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NativeDatumNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NativeDatumNode.h @@ -135,4 +135,4 @@ namespace ScriptCanvas } }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp index 23def4cb55..4a936c8824 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp @@ -3155,6 +3155,11 @@ namespace ScriptCanvas return {}; } + AZStd::optional<size_t> Node::GetEventIndex([[maybe_unused]] AZStd::string eventName) const + { + return AZStd::nullopt; + } + AZStd::vector<SlotId> Node::GetEventSlotIds() const { return {}; @@ -3404,6 +3409,45 @@ namespace ScriptCanvas return GetSlotByName("True"); } + size_t Node::GetOutIndex(const Slot& slot) const + { + size_t index = 0; + auto slotId = slot.GetId(); + + if (auto map = GetSlotExecutionMap()) + { + auto& ins = map->GetIns(); + for (auto& in : ins) + { + for (auto& out : in.outs) + { + // only count branches + if (in.outs.size() > 1) + { + if (out.slotId == slotId) + { + return index; + } + + ++index; + } + } + } + + for (auto& latent : map->GetLatents()) + { + if (latent.slotId == slotId) + { + return index; + } + + ++index; + } + } + + return std::numeric_limits<size_t>::max(); + } + AZ::Outcome<AZStd::string> Node::GetInternalOutKey(const Slot& slot) const { if (auto map = GetSlotExecutionMap()) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h index d51667764f..d3d36ae71b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h @@ -700,6 +700,8 @@ namespace ScriptCanvas // override if necessary, usually only when the node's execution topology dramatically alters at edit-time in a way that is not generally parseable ConstSlotsOutcome GetSlotsInExecutionThreadByType(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* executionChildSlot = nullptr) const; + size_t GetOutIndex(const Slot& slot) const; + // override if necessary, only used by NodeableNodes which can hide branched outs and rename them later virtual AZ::Outcome<AZStd::string> GetInternalOutKey(const Slot& slot) const; @@ -751,6 +753,8 @@ namespace ScriptCanvas virtual AZStd::string GetEBusName() const; + virtual AZStd::optional<size_t> GetEventIndex(AZStd::string eventName) const; + virtual AZStd::vector<SlotId> GetEventSlotIds() const; virtual AZStd::vector<SlotId> GetNonEventSlotIds() const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.cpp index ff8779319a..b642ef3889 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.cpp @@ -19,7 +19,7 @@ namespace NodeableOutCpp { - void NoOp(AZ::BehaviorValueParameter* /*result*/, AZ::BehaviorValueParameter* /*arguments*/, int /*numArguments*/) {} + void NoOp([[maybe_unused]] AZ::BehaviorValueParameter*, [[maybe_unused]] AZ::BehaviorValueParameter*, [[maybe_unused]] int) {} } namespace ScriptCanvas @@ -36,14 +36,14 @@ namespace ScriptCanvas {} #if !defined(RELEASE) - void Nodeable::CallOut(const AZ::Crc32 key, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const + void Nodeable::CallOut(size_t index, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const { - GetExecutionOutChecked(key)(resultBVP, argsBVPs, numArguments); + GetExecutionOutChecked(index)(resultBVP, argsBVPs, numArguments); } #else - void Nodeable::CallOut(const AZ::Crc32 key, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const + void Nodeable::CallOut(size_t index, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const { - GetExecutionOut(key)(resultBVP, argsBVPs, numArguments); + GetExecutionOut(index)(resultBVP, argsBVPs, numArguments); } #endif // !defined(RELEASE) @@ -62,11 +62,6 @@ namespace ScriptCanvas return m_executionState->GetEntityId(); } - AZ::EntityId Nodeable::GetScriptCanvasId() const - { - return m_executionState->GetScriptCanvasId(); - } - void Nodeable::Reflect(AZ::ReflectContext* reflectContext) { if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext)) @@ -77,9 +72,9 @@ namespace ScriptCanvas { editContext->Class<Nodeable>("Nodeable", "Nodeable") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::ContainerCanBeModified, false) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::ContainerCanBeModified, false) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; } } @@ -92,33 +87,45 @@ namespace ScriptCanvas ->Constructor<ExecutionStateWeakPtr>() ->Method("Deactivate", &Nodeable::Deactivate) ->Method("InitializeExecutionState", &Nodeable::InitializeExecutionState) + ->Method("InitializeExecutionOuts", &Nodeable::InitializeExecutionOuts) + ->Method("InitializeExecutionOutByRequiredCount", &Nodeable::InitializeExecutionOutByRequiredCount) ->Method("IsActive", &Nodeable::IsActive) ; } } - const FunctorOut& Nodeable::GetExecutionOut(AZ::Crc32 key) const + const FunctorOut& Nodeable::GetExecutionOut(size_t index) const { - auto iter = m_outs.find(key); - AZ_Assert(iter != m_outs.end(), "no out registered for key: %d", key); - AZ_Assert(iter->second, "null execution methods are not allowed, key: %d", key); - return iter->second; + AZ_Assert(index < m_outs.size(), "index out of range in Nodeable::m_outs"); + auto& iter = m_outs[index]; + AZ_Assert(iter, "null execution methods are not allowed, index: %zu", index); + return iter; } - const FunctorOut& Nodeable::GetExecutionOutChecked(AZ::Crc32 key) const + const FunctorOut& Nodeable::GetExecutionOutChecked(size_t index) const { - auto iter = m_outs.find(key); - - if (iter == m_outs.end()) - { - return m_noOpFunctor; - } - else if (!iter->second) + + if (index >= m_outs.size() && m_outs[index]) { return m_noOpFunctor; } - return iter->second; + return m_outs[index]; + } + + AZ::EntityId Nodeable::GetScriptCanvasId() const + { + return m_executionState->GetScriptCanvasId(); + } + + void Nodeable::InitializeExecutionOuts(size_t count) + { + m_outs.resize(count, m_noOpFunctor); + } + + void Nodeable::InitializeExecutionOutByRequiredCount() + { + InitializeExecutionOuts(GetRequiredOutCount()); } void Nodeable::InitializeExecutionState(ExecutionState* executionState) @@ -126,37 +133,23 @@ namespace ScriptCanvas AZ_Assert(executionState != nullptr, "execution state for nodeable must not be nullptr"); AZ_Assert(m_executionState == nullptr, "execution state already initialized"); m_executionState = executionState->WeakFromThis(); + OnInitializeExecutionState(); } - void Nodeable::InitializeExecutionOuts(const AZ::Crc32* begin, const AZ::Crc32* end) + void Nodeable::SetExecutionOut(size_t index, FunctorOut&& out) { - m_outs.reserve(end - begin); - - for (; begin != end; ++begin) - { - SetExecutionOut(*begin, AZStd::move(FunctorOut(&NodeableOutCpp::NoOp))); - } + AZ_Assert(out, "null executions methods are not allowed, index: %zu", index); + m_outs[index] = AZStd::move(out); } - void Nodeable::InitializeExecutionOuts(const AZStd::vector<AZ::Crc32>& keys) - { - InitializeExecutionOuts(keys.begin(), keys.end()); - } - - void Nodeable::SetExecutionOut(AZ::Crc32 key, FunctorOut&& out) - { - AZ_Assert(out, "null executions methods are not allowed, key: %d", key); - m_outs[key] = AZStd::move(out); - } - - void Nodeable::SetExecutionOutChecked(AZ::Crc32 key, FunctorOut&& out) + void Nodeable::SetExecutionOutChecked(size_t index, FunctorOut&& out) { if (!out) { - AZ_Error("ScriptCanvas", false, "null executions methods are not allowed, key: %d", key); + AZ_Error("ScriptCanvas", false, "null executions methods are not allowed, index: %zu", index); return; } - SetExecutionOut(key, AZStd::move(out)); + SetExecutionOut(index, AZStd::move(out)); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.h index 3695f3e9fa..963893ee3f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Nodeable.h @@ -29,6 +29,23 @@ namespace ScriptCanvas class SubgraphInterface; } + /* + Note: Many parts of AzAutoGen, compilation, and runtime depend on the order of declaration and addition of slots. + The display order can be manipulated in the editor, but it will always just be a change of view. + + Whenever in doubt, this is the order, in pseudo code + + for in : Ins do + somethingOrdered(in) + for branch : in.Branches do + somethingOrdered(branch) + end + end + for out : Outs do + somethingOrdered(out) + end + */ + // derive from this to make an object that when wrapped with a NodeableNode can be instantly turned into a node that is easily embedded in graphs, // and easily compiled in class Nodeable @@ -40,21 +57,23 @@ namespace ScriptCanvas // reflect nodeable class API static void Reflect(AZ::ReflectContext* reflectContext); + // the run-time constructor for non-EBus handlers Nodeable(); + // this constructor is used by EBus handlers only Nodeable(ExecutionStateWeakPtr executionState); virtual ~Nodeable() = default; - void CallOut(const AZ::Crc32 key, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const; + void CallOut(size_t index, AZ::BehaviorValueParameter* resultBVP, AZ::BehaviorValueParameter* argsBVPs, int numArguments) const; AZ::Data::AssetId GetAssetId() const; AZ::EntityId GetEntityId() const; - const Execution::FunctorOut& GetExecutionOut(AZ::Crc32 key) const; + const Execution::FunctorOut& GetExecutionOut(size_t index) const; - const Execution::FunctorOut& GetExecutionOutChecked(AZ::Crc32 key) const; + const Execution::FunctorOut& GetExecutionOutChecked(size_t index) const; virtual NodePropertyInterface* GetPropertyInterface(AZ::Crc32 /*propertyId*/) { return nullptr; } @@ -66,98 +85,97 @@ namespace ScriptCanvas // any would only be good if graphs could opt into it, and execution slots could annotate changing activity level virtual bool IsActive() const { return false; } - void InitializeExecutionOuts(const AZ::Crc32* begin, const AZ::Crc32* end); + void InitializeExecutionOuts(size_t count); - void InitializeExecutionOuts(const AZStd::vector<AZ::Crc32>& keys); + void SetExecutionOut(size_t index, Execution::FunctorOut&& out); - void SetExecutionOut(AZ::Crc32 key, Execution::FunctorOut&& out); - - void SetExecutionOutChecked(AZ::Crc32 key, Execution::FunctorOut&& out); + void SetExecutionOutChecked(size_t index, Execution::FunctorOut&& out); protected: + void InitializeExecutionOutByRequiredCount(); + void InitializeExecutionState(ExecutionState* executionState); + virtual void OnInitializeExecutionState() {} + virtual void OnDeactivate() {} - // all of these hooks are known at compile time, so no branching - // we will need with and without result calls for each time for method - // methods with result but no result requested, etc - - template<typename t_Return> - void OutResult(const AZ::Crc32 key, t_Return& result) const - { - // this is correct, it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) - AZ::BehaviorValueParameter resultBVP(&result); - - CallOut(key, &resultBVP, nullptr, 0); - -#if !defined(RELEASE) - if (!resultBVP.GetAsUnsafe<t_Return>()) - { - AZ_Error("ScriptCanvas", false, "%s:CallOut(%u) failed to provide a useable result", TYPEINFO_Name(), (AZ::u32)key); - return; - } -#endif - result = *resultBVP.GetAsUnsafe<t_Return>(); - } + virtual size_t GetRequiredOutCount() const { return 0; } // Required to decay array type to pointer type template<typename T> using decay_array = AZStd::conditional_t<AZStd::is_array_v<AZStd::remove_reference_t<T>>, std::remove_extent_t<AZStd::remove_reference_t<T>>*, T&&>; - template<typename t_Return, typename... t_Args> - void OutResult(const AZ::Crc32 key, t_Return& result, t_Args&&... args) const + // all of these hooks are known at compile time, so no branching + // we will need with and without result calls for each type of method + // methods with result but no result requested, etc + + template<typename... t_Args> + void ExecutionOut(size_t index, t_Args&&... args) const { - // this is correct, it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) + // it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) AZStd::tuple<decay_array<t_Args>...> lvalueWrapper(AZStd::forward<t_Args>(args)...); using BVPReserveArray = AZStd::array<AZ::BehaviorValueParameter, sizeof...(args)>; auto MakeBVPArrayFunction = [](auto&&... element) { return BVPReserveArray{ {AZ::BehaviorValueParameter{&element}...} }; }; - BVPReserveArray argsBVPs = AZStd::apply(MakeBVPArrayFunction, lvalueWrapper); - AZ::BehaviorValueParameter resultBVP(&result); - CallOut(key, &resultBVP, argsBVPs.data(), sizeof...(t_Args)); + BVPReserveArray argsBVPs = AZStd::apply(MakeBVPArrayFunction, lvalueWrapper); + CallOut(index, nullptr, argsBVPs.data(), sizeof...(t_Args)); + } + + void ExecutionOut(size_t index) const + { + // it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) + CallOut(index, nullptr, nullptr, 0); + } + template<typename t_Return> + void ExecutionOutResult(size_t index, t_Return& result) const + { + // It is up to the FunctorOut referenced by the index to decide what to do with these params (whether to modify or handle strings differently) + AZ::BehaviorValueParameter resultBVP(&result); + CallOut(index, &resultBVP, nullptr, 0); #if !defined(RELEASE) if (!resultBVP.GetAsUnsafe<t_Return>()) { - AZ_Error("ScriptCanvas", false, "%s:CallOut(%u) failed to provide a useable result", TYPEINFO_Name(), (AZ::u32)key); + AZ_Error("ScriptCanvas", false, "%s:CallOut(%zu) failed to provide a useable result", TYPEINFO_Name(), index); return; } #endif result = *resultBVP.GetAsUnsafe<t_Return>(); } - template<typename... t_Args> - void ExecutionOut(const AZ::Crc32 key, t_Args&&... args) const + template<typename t_Return, typename... t_Args> + void ExecutionOutResult(size_t index, t_Return& result, t_Args&&... args) const { - // this is correct, it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) + // it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) AZStd::tuple<decay_array<t_Args>...> lvalueWrapper(AZStd::forward<t_Args>(args)...); using BVPReserveArray = AZStd::array<AZ::BehaviorValueParameter, sizeof...(args)>; auto MakeBVPArrayFunction = [](auto&&... element) { return BVPReserveArray{ {AZ::BehaviorValueParameter{&element}...} }; }; + BVPReserveArray argsBVPs = AZStd::apply(MakeBVPArrayFunction, lvalueWrapper); + AZ::BehaviorValueParameter resultBVP(&result); + CallOut(index, &resultBVP, argsBVPs.data(), sizeof...(t_Args)); - CallOut(key, nullptr, argsBVPs.data(), sizeof...(t_Args)); +#if !defined(RELEASE) + if (!resultBVP.GetAsUnsafe<t_Return>()) + { + AZ_Error("ScriptCanvas", false, "%s:CallOut(%zu) failed to provide a useable result", TYPEINFO_Name(), index); + return; + } +#endif + result = *resultBVP.GetAsUnsafe<t_Return>(); } - void ExecutionOut(const AZ::Crc32 key) const - { - // this is correct, it is up to the FunctorOut referenced by key to decide what to do with these params (whether to modify or handle strings differently) - CallOut(key, nullptr, nullptr, 0); - } - private: - // keep this here, and don't even think about putting it back in the FunctorOuts by any method*, lambda capture or other. - // programmers will need this for internal node state debugging and who knows what other reasons - // * Lua execution is an exception ExecutionStateWeakPtr m_executionState = nullptr; Execution::FunctorOut m_noOpFunctor; - AZStd::unordered_map<AZ::Crc32, Execution::FunctorOut> m_outs; + AZStd::vector<Execution::FunctorOut> m_outs; }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp index 8fc582954a..c406a5c100 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.cpp @@ -91,19 +91,6 @@ namespace ScriptCanvas AZ_Error("ScriptCanvas", m_nodeable, "null Nodeable in NodeableNode::ConfigureSlots"); } - AZ::Outcome<AZStd::pair<size_t, size_t>> NodeableNode::FindMethodAndInputIndexOfSlot(const SlotId& slotID) const - { - if (auto thisSlot = GetSlot(slotID)) - { - if (thisSlot->GetType() == CombinedSlotType::DataIn) - { - return m_slotExecutionMap.FindInAndInputIndexOfSlot(slotID); - } - } - - return AZ::Failure(); - } - AZ::Outcome<const AZ::BehaviorClass*, AZStd::string> NodeableNode::GetBehaviorContextClass() const { AZ::BehaviorContext* behaviorContext = NodeableNodeCpp::GetBehaviorContext(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h index 60ad7d3273..0193641d97 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableNode.h @@ -73,8 +73,6 @@ namespace ScriptCanvas void ConfigureSlots() override; - AZ::Outcome<AZStd::pair<size_t, size_t>> FindMethodAndInputIndexOfSlot(const SlotId& slotID) const; - AZ::Outcome<const AZ::BehaviorClass*, AZStd::string> GetBehaviorContextClass() const; ConstSlotsOutcome GetBehaviorContextOutName(const Slot& inSlot) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableOut.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableOut.h index 22b9794c8a..208d53d5fd 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableOut.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/NodeableOut.h @@ -32,4 +32,4 @@ namespace ScriptCanvas using StackAllocatorType = AZStd::static_buffer_allocator<MaxNodeableOutStackSize, 32>; } // namespace Execution -} // namespace ScriptCanvas \ No newline at end of file +} // namespace ScriptCanvas diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/PureData.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/PureData.h index beb6750106..e34bdb1c71 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/PureData.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/PureData.h @@ -109,4 +109,4 @@ namespace ScriptCanvas template<> void PureData::AddDefaultInputAndOutputTypeSlot<Data::Type>(Data::Type&&) = delete; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurationDefaults.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurationDefaults.h index ef00a1769c..8bc2fd724b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurationDefaults.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurationDefaults.h @@ -40,4 +40,4 @@ namespace ScriptCanvas } }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.cpp index bc6445e6e3..17dd68c084 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotConfigurations.cpp @@ -105,11 +105,9 @@ namespace ScriptCanvas void DataSlotConfiguration::SetType(const AZ::BehaviorParameter& typeDesc) { - auto dataRegistry = GetDataRegistry(); Data::Type scType = !AZ::BehaviorContextHelper::IsStringParameter(typeDesc) ? Data::FromAZType(typeDesc.m_typeId) : Data::Type::String(); - auto typeIter = dataRegistry->m_creatableTypes.find(scType); - - if (typeIter != dataRegistry->m_creatableTypes.end()) + auto dataRegistry = GetDataRegistry(); + if (dataRegistry->IsUseableInSlot(scType)) { m_datum.SetType(scType); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.cpp index 34af917c96..05c5e0e5d7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.cpp @@ -152,22 +152,6 @@ namespace ScriptCanvas return nullptr; } - AZ::Outcome<AZStd::pair<size_t, size_t>> Map::FindInAndInputIndexOfSlot(const SlotId& slotID) const - { - for (const auto& in : m_ins) - { - auto inputIter = find_if(in.inputs, [&slotID](const Input& input) { return input.slotId == slotID; }); - if (inputIter != in.inputs.end()) - { - const size_t inIndex = &in - m_ins.begin(); - const size_t inputIndex = inputIter - in.inputs.begin(); - return AZ::Success(AZStd::make_pair(inIndex, inputIndex)); - } - } - - return AZ::Failure(); - } - const In* Map::FindInFromInputSlot(const SlotId& slotID) const { auto iter = find_if diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h index 25c237b138..9daf1d8eb9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotExecutionMap.h @@ -124,8 +124,6 @@ namespace ScriptCanvas Map(Outs&& latents); - AZ::Outcome<AZStd::pair<size_t, size_t>> FindInAndInputIndexOfSlot(const SlotId& slotID) const; - const In* FindInFromInputSlot(const SlotId& slotID) const; SlotId FindInputSlotIdBySource(VariableId inputSourceId, Grammar::FunctionSourceId inSourceId) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.cpp index e41ce27aa2..df59bcf3ee 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.cpp @@ -26,4 +26,4 @@ namespace ScriptCanvas ; } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.h index 1db107b30e..864a397ec3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotMetadata.h @@ -24,4 +24,4 @@ namespace ScriptCanvas SlotId m_slotId; Data::Type m_dataType; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotNames.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotNames.h index 51af3281e2..ee2e757445 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotNames.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SlotNames.h @@ -20,4 +20,4 @@ namespace ScriptCanvas AZ_INLINE AZStd::string_view GetOutputSlotName() { return "Out"; } AZ_INLINE AZStd::string_view GetSourceSlotName() { return "Source"; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp index 61ea74d011..2b063a8b22 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp @@ -127,7 +127,7 @@ namespace ScriptCanvas return false; } - if (!(datum == rhs.datum)) + if (!(datum.GetType() == rhs.datum.GetType())) { return false; } @@ -209,13 +209,18 @@ namespace ScriptCanvas m_latents.push_back(out); } - void SubgraphInterface::AddOutKey(const AZStd::string& name) + bool SubgraphInterface::AddOutKey(const AZStd::string& name) { const AZ::Crc32 key(name); if (AZStd::find(m_outKeys.begin(), m_outKeys.end(), key) == m_outKeys.end()) { m_outKeys.push_back(key); + return true; + } + else + { + return false; } } @@ -708,7 +713,7 @@ namespace ScriptCanvas } // Populates the list of out keys - void SubgraphInterface::Parse() + AZ::Outcome<void, AZStd::string> SubgraphInterface::Parse() { m_outKeys.clear(); @@ -716,14 +721,22 @@ namespace ScriptCanvas { for (const auto& out : in.outs) { - AddOutKey(out.displayName); + if (!AddOutKey(out.displayName)) + { + return AZ::Failure(AZStd::string::format("Out %s was already in the list", out.displayName.c_str())); + } } } for (const auto& latent : m_latents) { - AddOutKey(latent.displayName); + if (!AddOutKey(latent.displayName)) + { + return AZ::Failure(AZStd::string::format("Out %s was already in the list", latent.displayName.c_str())); + } } + + return AZ::Success(); } void SubgraphInterface::Reflect(AZ::ReflectContext* refectContext) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h index 3eea850666..069f3c84a2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.h @@ -232,7 +232,7 @@ namespace ScriptCanvas bool operator==(const SubgraphInterface& rhs) const; // Populates the list of out keys - void Parse(); + AZ::Outcome<void, AZStd::string> Parse(); bool RequiresConstructionParameters() const; @@ -266,7 +266,7 @@ namespace ScriptCanvas AZStd::vector<AZ::Crc32> m_outKeys; NamespacePath m_namespacePath; - void AddOutKey(const AZStd::string& name); + bool AddOutKey(const AZStd::string& name); const Out* FindImmediateOut(const AZStd::string& in, const AZStd::string& out) const; const In* FindIn(const AZStd::string& inSlotId) const; const Out* FindLatentOut(const AZStd::string& latent) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/BehaviorContextObjectPtr.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/BehaviorContextObjectPtr.cpp index 81a5371e80..3e2f5e7195 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/BehaviorContextObjectPtr.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/BehaviorContextObjectPtr.cpp @@ -40,4 +40,4 @@ namespace ScriptCanvas } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.cpp index e71c97e89a..2653b1495f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.cpp @@ -389,29 +389,6 @@ namespace ScriptCanvas return AZ::Utils::IsVectorContainerType(ToAZType(type)); } - bool IsAllowedBehaviorClassVariableType(const AZ::Uuid& id) - { - AZ::BehaviorContext* behaviorContext = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); - AZ_Assert(behaviorContext, "Unable to retrieve behavior context."); - - const auto& classIterator = behaviorContext->m_typeToClassMap.find(id); - if (classIterator != behaviorContext->m_typeToClassMap.end()) - { - AZ::BehaviorClass* behaviorClass = classIterator->second; - if (behaviorClass->FindAttribute(AZ::ScriptCanvasAttributes::VariableCreationForbidden)) - { - return false; - } - } - else - { - return false; - } - - return true; - } - bool IsSetContainerType(const AZ::Uuid& type) { return AZ::Utils::IsSetContainerType(type); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.h index 64dc8999f7..59530d934d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Data.h @@ -197,8 +197,6 @@ namespace ScriptCanvas bool IsVectorContainerType(const AZ::Uuid& type); bool IsVectorContainerType(const Type& type); - bool IsAllowedBehaviorClassVariableType(const AZ::Uuid& id); - AZStd::vector<AZ::Uuid> GetContainedTypes(const AZ::Uuid& type); AZStd::vector<Type> GetContainedTypes(const Type& type); AZStd::pair<AZ::Uuid, AZ::Uuid> GetOutcomeTypes(const AZ::Uuid& type); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.cpp index 85cdf56458..9068ba0172 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.cpp @@ -105,14 +105,24 @@ namespace ScriptCanvas AZ_Error("Script Canvas", it.second, "Cannot register a second Trait struct with the same ScriptCanvas type(%u)", it.first->first); } - void DataRegistry::RegisterType(const AZ::TypeId& typeId, TypeProperties typeProperties) + void DataRegistry::RegisterType(const AZ::TypeId& typeId, TypeProperties typeProperties, Createability registration) { Data::Type behaviorContextType = Data::FromAZType(typeId); if (behaviorContextType.GetType() == Data::eType::BehaviorContextObject && !behaviorContextType.GetAZType().IsNull()) { - if (m_creatableTypes.find(behaviorContextType) == m_creatableTypes.end()) + if (registration == Createability::SlotAndVariable) { - m_creatableTypes[behaviorContextType] = typeProperties; + if (m_creatableTypes.find(behaviorContextType) == m_creatableTypes.end()) + { + m_creatableTypes[behaviorContextType] = typeProperties; + } + } + else if (registration == Createability::SlotOnly) + { + if (m_slottableTypes.find(behaviorContextType) == m_slottableTypes.end()) + { + m_slottableTypes[behaviorContextType] = typeProperties; + } } } } @@ -125,4 +135,15 @@ namespace ScriptCanvas m_creatableTypes.erase(behaviorContextType); } } -} \ No newline at end of file + + bool DataRegistry::IsUseableInSlot(const Data::Type& scType) const + { + return m_creatableTypes.contains(scType) || m_slottableTypes.contains(scType); + } + + bool DataRegistry::IsUseableInSlot(const AZ::TypeId& typeId) const + { + Data::Type scType = Data::FromAZType(typeId); + return IsUseableInSlot(scType); + } +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.h index 57a67c79d9..c4837ebd27 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataRegistry.h @@ -34,11 +34,21 @@ namespace ScriptCanvas AZ_TYPE_INFO(DataRegistry, "{41049FA8-EA56-401F-9720-6FE9028A1C01}"); AZ_CLASS_ALLOCATOR(DataRegistry, AZ::SystemAllocator, 0); - void RegisterType(const AZ::TypeId& typeId, TypeProperties typeProperties); + enum class Createability + { + None, + SlotAndVariable, + SlotOnly, + }; + void RegisterType(const AZ::TypeId& typeId, TypeProperties typeProperties, Createability registration); void UnregisterType(const AZ::TypeId& typeId); + bool IsUseableInSlot(const AZ::TypeId& typeId) const; + bool IsUseableInSlot(const Data::Type& type) const; + AZStd::unordered_map<Data::eType, Data::TypeErasedTraits> m_typeIdTraitMap; // Creates a mapping of the Data::eType TypeId to the trait structure AZStd::unordered_map<Data::Type, TypeProperties> m_creatableTypes; + AZStd::unordered_map<Data::Type, TypeProperties> m_slottableTypes; }; void InitDataRegistry(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataTrait.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataTrait.cpp index d32395a71f..9413ffbd4f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataTrait.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/DataTrait.cpp @@ -28,4 +28,4 @@ namespace ScriptCanvas } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/PropertyTraits.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/PropertyTraits.cpp index ba2a1fc281..83c1b1458e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/PropertyTraits.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/PropertyTraits.cpp @@ -52,4 +52,4 @@ namespace ScriptCanvas return {}; } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Traits.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Traits.h index e42dfea877..9206dc0929 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Traits.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Data/Traits.h @@ -42,4 +42,4 @@ namespace ScriptCanvas return TypeErasedTraits(AZStd::integral_constant<eType, scTypeValue>{}); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.cpp index d526950fcc..7cce2c1db5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.cpp @@ -38,4 +38,4 @@ namespace ScriptCanvas return AZ::Success(); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.h index 9505b3a028..e674c553b9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/API.h @@ -52,4 +52,4 @@ namespace ScriptCanvas void ReflectNotifications(AZ::ReflectContext* context); void ReflectRequests(AZ::ReflectContext* context); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/APIArguments.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/APIArguments.h index 124bb25f95..8bd375985a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/APIArguments.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/APIArguments.h @@ -145,4 +145,4 @@ namespace ScriptCanvas }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/Messages/Request.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/Messages/Request.h index 400815b7fd..0e4633bac3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/Messages/Request.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/Messages/Request.h @@ -240,4 +240,4 @@ namespace ScriptCanvas }; } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h index 6f9104eadf..36bc444a6c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h @@ -95,4 +95,4 @@ namespace ScriptCanvas return "Unknown Source Endpoint"; } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationEvents.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationEvents.h index 382e78268b..2fea1926e9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationEvents.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationEvents.h @@ -11,4 +11,4 @@ */ #pragma once -#include <ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h> \ No newline at end of file +#include <ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationIds.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationIds.h index 6b1ace5691..107868bdbf 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationIds.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/ExecutionValidationIds.h @@ -18,4 +18,4 @@ namespace ScriptCanvas constexpr const char* UnusedNodeId = "EV-0001"; static const AZ::Crc32 UnusedNodeCrc = AZ_CRC(UnusedNodeId); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/GraphTranslationValidation/GraphTranslationValidationIds.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/GraphTranslationValidation/GraphTranslationValidationIds.h index 420f9ef4af..86fc55b5f9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/GraphTranslationValidation/GraphTranslationValidationIds.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/GraphTranslationValidation/GraphTranslationValidationIds.h @@ -19,4 +19,4 @@ namespace ScriptCanvas constexpr const char* InvalidFunctionCallNameId = "GT-0001"; static const AZ::Crc32 InvalidFunctionCallNameCrc = AZ_CRC(InvalidFunctionCallNameId); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h index 9e29527312..3d899ebcf6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h @@ -85,4 +85,4 @@ namespace ScriptCanvas }; using ValidationPtr = AZStd::intrusive_ptr<ValidationEvent>; using ValidationConstPtr = AZStd::intrusive_ptr<const ValidationEvent>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.cpp index c83c79aa50..0fed56f15f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.cpp @@ -47,4 +47,4 @@ namespace ScriptCanvas { } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.h index c24d690c4f..eb355e4764 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Deprecated/VariableHelpers.h @@ -37,4 +37,4 @@ namespace ScriptCanvas Data::Type m_dataType; }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ErrorBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ErrorBus.h index 32507837dc..4f84d8dff9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ErrorBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ErrorBus.h @@ -54,4 +54,4 @@ namespace ScriptCanvas #define SCRIPTCANVAS_RETURN_IF_ERROR_STATE(node)\ bool inErrorState = false;\ ScriptCanvas::ErrorReporterBus::EventResult(inErrorState, node.GetOwningScriptCanvasId(), &ScriptCanvas::ErrorReporter::IsInErrorState);\ - if (inErrorState) { return; } \ No newline at end of file + if (inErrorState) { return; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index 722328ff17..f0cea19645 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -508,11 +508,10 @@ namespace ScriptCanvas const int argsCount = lua_gettop(lua); AZ_Assert(argsCount >= 2, "CallExecutionOut: Error in compiled Lua file, not enough arguments"); AZ_Assert(lua_isuserdata(lua, 1), "CallExecutionOut: Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, 2), "CallExecutionOut: Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); + AZ_Assert(lua_isnumber(lua, 2), "CallExecutionOut: Error in compiled lua file, 2nd argument to SetExecutionOut is not a number"); Nodeable* nodeable = AZ::ScriptValue<Nodeable*>::StackRead(lua, 1); - const char* keyStr = AZ::ScriptValue<const char*>::StackRead(lua, 2); - AZ_Assert(keyStr, "CallExecutionOut: Failed to read key string"); - nodeable->CallOut(AZ::Crc32(keyStr), nullptr, nullptr, argsCount - 2); + size_t index = aznumeric_caster(lua_tointeger(lua, 2)); + nodeable->CallOut(index, nullptr, nullptr, argsCount - 2); // Lua: results... return lua_gettop(lua); } @@ -559,23 +558,14 @@ namespace ScriptCanvas int InitializeNodeableOutKeys(lua_State* lua) { using namespace ExecutionInterpretedAPICpp; - // Lua: usernodeable, outKeys... + // Lua: usernodeable, keyCount const int argsCount = lua_gettop(lua); - AZ_Assert(argsCount >= 2, "InitializeNodeableOutKeys: Error in compiled Lua file, not enough arguments"); - AZ_Assert((argsCount - 1) < k_MaxNodeableOuts, "InitializeNodeableOutKeys: Error in compiled Lua file, too many outs for nodeable out)"); + AZ_Assert(argsCount == 2, "InitializeNodeableOutKeys: Error in compiled Lua file, not enough arguments"); AZ_Assert(lua_isuserdata(lua, 1), "InitializeNodeableOutKeys: Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); Nodeable* nodeable = AZ::ScriptValue<Nodeable*>::StackRead(lua, 1); - const int keyCount = argsCount - 1; - - AZStd::array<AZ::Crc32, k_MaxNodeableOuts> keys; - - for (int argumentIndex = 2, sentinel = argsCount + 1; argumentIndex != sentinel; ++argumentIndex) - { - AZ_Assert(lua_isnumber(lua, argumentIndex), "InitializeNodeableOutKeys: Error in compiled lua file, argument at Lua index #%d was not an integer", argumentIndex); - keys[argumentIndex - 2] = static_cast<AZ::u32>(lua_tointeger(lua, argumentIndex)); - } - - nodeable->InitializeExecutionOuts(keys.begin(), keys.begin() + keyCount); + AZ_Assert(lua_isnumber(lua, 2), "InitializeNodeableOutKeys: Error in compiled lua file, 2nd argument was not an integer"); + const size_t keyCount = aznumeric_caster(lua_tointeger(lua, 2)); + nodeable->InitializeExecutionOuts(keyCount); return 0; } @@ -595,19 +585,18 @@ namespace ScriptCanvas // \see https://jira.agscollab.com/browse/LY-99750 AZ_Assert(lua_isuserdata(lua, -3), "Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); + AZ_Assert(lua_isnumber(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a number"); AZ_Assert(lua_isfunction(lua, -1), "Error in compiled lua file, 3rd argument to SetExecutionOut is not a function (lambda need to get around atypically routed arguments)"); Nodeable* nodeable = AZ::ScriptValue<Nodeable*>::StackRead(lua, -3); AZ_Assert(nodeable, "Failed to read nodeable"); - const char* keyStr = AZ::ScriptValue<const char*>::StackRead(lua, -2); - AZ_Assert(keyStr, "Failed to read key string"); - // Lua: nodeable, string, lambda + size_t index = aznumeric_caster(lua_tointeger(lua, -2)); + // Lua: nodeable, index, lambda lua_pushvalue(lua, -1); - // Lua: nodeable, string, lambda, lambda + // Lua: nodeable, index, lambda, lambda - nodeable->SetExecutionOut(AZ::Crc32(keyStr), OutInterpreted(lua)); - // Lua: nodeable, string, lambda + nodeable->SetExecutionOut(index, OutInterpreted(lua)); + // Lua: nodeable, index, lambda // \todo clear these immediately after they are not needed with an explicit call written by the translator return 0; @@ -618,20 +607,19 @@ namespace ScriptCanvas // \note Return values could become necessary. // \see https://jira.agscollab.com/browse/LY-99750 - AZ_Assert(lua_isuserdata(lua, -3), "Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); - AZ_Assert(lua_isfunction(lua, -1), "Error in compiled lua file, 3rd argument to SetExecutionOut is not a function (lambda need to get around atypically routed arguments)"); + AZ_Assert(lua_isuserdata(lua, -3), "Error in compiled lua file, 1st argument to SetExecutionOutResult is not userdata (Nodeable)"); + AZ_Assert(lua_isnumber(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOutResult is not a number"); + AZ_Assert(lua_isfunction(lua, -1), "Error in compiled lua file, 3rd argument to SetExecutionOutResult is not a function (lambda need to get around atypically routed arguments)"); Nodeable* nodeable = AZ::ScriptValue<Nodeable*>::StackRead(lua, -3); // this won't be a BCO, because BCOs won't be necessary in the interpreted mode...most likely AZ_Assert(nodeable, "Failed to read nodeable"); - const char* keyStr = AZ::ScriptValue<const char*>::StackRead(lua, -2); - AZ_Assert(keyStr, "Failed to read key string"); - // Lua: nodeable, string, lambda + size_t index = aznumeric_caster(lua_tointeger(lua, -2)); + // Lua: nodeable, index, lambda lua_pushvalue(lua, -1); - // Lua: nodeable, string, lambda, lambda + // Lua: nodeable, index, lambda, lambda - nodeable->SetExecutionOut(AZ::Crc32(keyStr), OutInterpretedResult(lua)); - // Lua: nodeable, string, lambda + nodeable->SetExecutionOut(index, OutInterpretedResult(lua)); + // Lua: nodeable, index, lambda // \todo clear these immediately after they are not needed with an explicit call written by the translator return 0; @@ -639,20 +627,19 @@ namespace ScriptCanvas int SetExecutionOutUserSubgraph(lua_State* lua) { - AZ_Assert(lua_isuserdata(lua, -3), "Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); - AZ_Assert(lua_isfunction(lua, -1), "Error in compiled lua file, 3rd argument to SetExecutionOut is not a function (lambda need to get around atypically routed arguments)"); + AZ_Assert(lua_isuserdata(lua, -3), "Error in compiled lua file, 1st argument to SetExecutionOutUserSubgraph is not userdata (Nodeable)"); + AZ_Assert(lua_isnumber(lua, -2), "Error in compiled lua file, 2nd argument to SetExecutionOutUserSubgraph is not a number"); + AZ_Assert(lua_isfunction(lua, -1), "Error in compiled lua file, 3rd argument to SetExecutionOutUserSubgraph is not a function (lambda need to get around atypically routed arguments)"); Nodeable* nodeable = AZ::ScriptValue<Nodeable*>::StackRead(lua, -3); AZ_Assert(nodeable, "Failed to read nodeable"); - const char* keyStr = AZ::ScriptValue<const char*>::StackRead(lua, -2); - AZ_Assert(keyStr, "Failed to read key string"); - // Lua: nodeable, string, lambda + size_t index = aznumeric_caster(lua_tointeger(lua, -2)); + // Lua: nodeable, index, lambda lua_pushvalue(lua, -1); - // Lua: nodeable, string, lambda, lambda + // Lua: nodeable, index, lambda, lambda - nodeable->SetExecutionOut(AZ::Crc32(keyStr), OutInterpretedUserSubgraph(lua)); - // Lua: nodeable, string, lambda + nodeable->SetExecutionOut(index, OutInterpretedUserSubgraph(lua)); + // Lua: nodeable, index, lambda // \todo clear these immediately after they are not needed with an explicit call written by the translator return 0; @@ -710,7 +697,7 @@ namespace ScriptCanvas AZ_Assert(lua_islightuserdata(lua, 2), "Error in compiled lua file, 2nd argument to UnpackDependencyArgs is not userdata (AZStd::vector<AZ::Data::Asset<RuntimeAsset>>*), but a :%s", lua_typename(lua, 2)); auto dependentAssets = reinterpret_cast<AZStd::vector<AZ::Data::Asset<RuntimeAsset>>*>(lua_touserdata(lua, 2)); AZ_Assert(lua_isinteger(lua, 3), "Error in compiled Lua file, 3rd argument to UnpackDependencyArgs is not a number"); - const size_t dependentAssetsIndex = lua_tointeger(lua, 3); + const size_t dependentAssetsIndex = aznumeric_caster(lua_tointeger(lua, 3)); return DependencyConstructionPack{ executionState, dependentAssets, dependentAssetsIndex, (*dependentAssets)[dependentAssetsIndex].Get()->m_runtimeData }; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp index 6612039c65..72b787213b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedEBusAPI.cpp @@ -83,7 +83,7 @@ namespace ScriptCanvas int EBusHandlerCreateAndConnectTo(lua_State* lua) { - // Lua: executionState, (event name) string, (address aztypeid) string, (address) ? + // Lua: executionState, (ebus name) string, (address aztypeid) string, (address) ? auto executionState = AZ::ScriptValue<ExecutionStateInterpreted*>::StackRead(lua, 1); auto ebusName = AZ::ScriptValue<const char*>::StackRead(lua, 2); EBusHandler* ebusHandler = aznew EBusHandler(executionState->WeakFromThis(), ebusName, AZ::ScriptContext::FromNativeContext(lua)->GetBoundContext()); @@ -96,7 +96,7 @@ namespace ScriptCanvas ebusHandler->ConnectTo(address); AZ::Internal::LuaClassToStack(lua, ebusHandler, azrtti_typeid<EBusHandler>(), AZ::ObjectToLua::ByReference, AZ::AcquisitionOnPush::ScriptAcquire); - // Lua: executionState, (event name) string, (address aztypeid) string, (address) ?, handler + // Lua: executionState, (ebus name) string, (address aztypeid) string, (address) ?, handler return 1; } @@ -114,27 +114,23 @@ namespace ScriptCanvas const int k_eventNameIndex = -2; const int k_lambdaIndex = -1; - AZ_Assert(lua_isuserdata(lua, k_nodeableIndex), "Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, k_eventNameIndex), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); - AZ_Assert(lua_isfunction(lua, k_lambdaIndex), "Error in compiled lua file, 3rd argument to SetExecutionOut is not a function (lambda need to get around atypically routed arguments)"); + AZ_Assert(lua_isuserdata(lua, k_nodeableIndex), "Error in compiled lua file, 1st argument to EBusHandlerHandleEvent is not userdata (EBusHandler)"); + AZ_Assert(lua_isnumber(lua, k_eventNameIndex), "Error in compiled lua file, 2nd argument to EBusHandlerHandleEvent is not a number"); + AZ_Assert(lua_isfunction(lua, k_lambdaIndex), "Error in compiled lua file, 3rd argument to EBusHandlerHandleEvent is not a function"); - auto nodeable = AZ::ScriptValue<EBusHandler*>::StackRead(lua, k_nodeableIndex); // this won't be a BCO, because BCOs won't be necessary in the interpreted mode...most likely + auto nodeable = AZ::ScriptValue<EBusHandler*>::StackRead(lua, k_nodeableIndex); AZ_Assert(nodeable, "Failed to read EBusHandler"); - const char* keyStr = lua_tostring(lua, k_eventNameIndex); - AZ_Assert(keyStr, "Failed to read key string"); - const int eventIndex = nodeable->GetEventIndex(keyStr); - AZ_Assert(eventIndex != -1, "Event index was not found for %s-%s", nodeable->GetEBusName().data(), keyStr); + const int eventIndex = lua_tointeger(lua, k_eventNameIndex); + AZ_Assert(eventIndex != -1, "Event index was not found for %s", nodeable->GetEBusName().data()); // install the generic hook for the event nodeable->HandleEvent(eventIndex); // Lua: nodeable, string, lambda - lua_pushvalue(lua, k_lambdaIndex); // Lua: nodeable, string, lambda, lambda // route the event handling to the lambda on the top of the stack nodeable->SetExecutionOut(AZ::Crc32(eventIndex), OutInterpreted(lua)); // Lua: nodeable, string, lambda - return 0; } @@ -145,16 +141,14 @@ namespace ScriptCanvas const int k_eventNameIndex = -2; const int k_lambdaIndex = -1; - AZ_Assert(lua_isuserdata(lua, k_nodeableIndex), "Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); - AZ_Assert(lua_isstring(lua, k_eventNameIndex), "Error in compiled lua file, 2nd argument to SetExecutionOut is not a string (Crc key)"); - AZ_Assert(lua_isfunction(lua, k_lambdaIndex), "Error in compiled lua file, 3rd argument to SetExecutionOut is not a function (lambda need to get around atypically routed arguments)"); + AZ_Assert(lua_isuserdata(lua, k_nodeableIndex), "Error in compiled lua file, 1st argument to EBusHandlerHandleEventResult is not userdata (EBusHandler)"); + AZ_Assert(lua_isnumber(lua, k_eventNameIndex), "Error in compiled lua file, 2nd argument to EBusHandlerHandleEventResult is not a number"); + AZ_Assert(lua_isfunction(lua, k_lambdaIndex), "Error in compiled lua file, 3rd argument to EBusHandlerHandleEventResult is not a function"); - auto nodeable = AZ::ScriptValue<EBusHandler*>::StackRead(lua, k_nodeableIndex); // this won't be a BCO, because BCOs won't be necessary in the interpreted mode...most likely + auto nodeable = AZ::ScriptValue<EBusHandler*>::StackRead(lua, k_nodeableIndex); AZ_Assert(nodeable, "Failed to read EBusHandler"); - const char* keyStr = lua_tostring(lua, k_eventNameIndex); - AZ_Assert(keyStr, "Failed to read key string"); - const int eventIndex = nodeable->GetEventIndex(keyStr); - AZ_Assert(eventIndex != -1, "Event index was not found for %s-%s", nodeable->GetEBusName().data(), keyStr); + const int eventIndex = lua_tointeger(lua, k_eventNameIndex); + AZ_Assert(eventIndex != -1, "Event index was not found for %s", nodeable->GetEBusName().data()); // install the generic hook for the event nodeable->HandleEvent(eventIndex); // Lua: nodeable, string, lambda @@ -165,7 +159,6 @@ namespace ScriptCanvas // route the event handling to the lambda on the top of the stack nodeable->SetExecutionOut(AZ::Crc32(eventIndex), OutInterpretedResult(lua)); // Lua: nodeable, string, lambda - return 0; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedSingleton.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedSingleton.h index 084a44991f..826883cb6e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedSingleton.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpretedSingleton.h @@ -25,4 +25,4 @@ namespace ScriptCanvas static void Reflect(AZ::ReflectContext* reflectContext); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.cpp index fad565d71c..716be0d73d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.cpp @@ -17,4 +17,4 @@ namespace ScriptCanvas RuntimeContext::RuntimeContext(AZ::EntityId graphId) : m_graphId(graphId) {} -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.h index 8e6bfa5ee3..976b88099f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDeclarations.h @@ -26,4 +26,4 @@ namespace ScriptCanvas protected: AZ::EntityId m_graphId; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.cpp index 1597f87831..85a50c69b7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.cpp @@ -66,4 +66,4 @@ namespace ScriptCanvas return false; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.h index 4ce0c45c81..ee002ce65a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NativeHostDefinitions.h @@ -25,4 +25,4 @@ namespace ScriptCanvas // this may never have to be necessary bool UnregisterNativeGraphStart(AZStd::string_view name); -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp index dbcaad635b..ba1d34fea0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp @@ -70,7 +70,7 @@ namespace ScriptCanvas void RuntimeComponent::Execute() { - AZ_PROFILE_SCOPE_DYNAMIC(AZ::Debug::ProfileCategory::ScriptCanvas, "RuntimeComponent::InitializeExecution (%s)", m_runtimeAsset.GetId().ToString<AZStd::string>().c_str()); + AZ_PROFILE_SCOPE_DYNAMIC(AZ::Debug::ProfileCategory::ScriptCanvas, "RuntimeComponent::Execute (%s)", m_runtimeAsset.GetId().ToString<AZStd::string>().c_str()); AZ_Assert(m_executionState, "RuntimeComponent::Execute called without an execution state"); SC_EXECUTION_TRACE_GRAPH_ACTIVATED(CreateActivationInfo()); SCRIPT_CANVAS_PERFORMANCE_SCOPE_EXECUTION(m_executionState->GetScriptCanvasId(), m_runtimeAsset.GetId()); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp index 8f7fa2263e..921613cea8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.cpp @@ -146,7 +146,10 @@ namespace ScriptCanvas for (auto iter : m_functions) { - AZStd::const_pointer_cast<ExecutionTree>(iter)->Clear(); + if (auto mutableIter = AZStd::const_pointer_cast<ExecutionTree>(iter)) + { + mutableIter->Clear(); + } } m_functions.clear(); @@ -155,24 +158,36 @@ namespace ScriptCanvas for (auto iter : m_ebusHandlingByNode) { - iter.second->Clear(); + if (iter.second) + { + iter.second->Clear(); + } } m_ebusHandlingByNode.clear(); for (auto iter : m_eventHandlingByNode) { - iter.second->Clear(); + if (iter.second) + { + iter.second->Clear(); + } } for (auto iter : m_nodeablesByNode) { - AZStd::const_pointer_cast<NodeableParse>(iter.second)->Clear(); + if (auto mutableIter = AZStd::const_pointer_cast<NodeableParse>(iter.second)) + { + mutableIter->Clear(); + } } m_nodeablesByNode.clear(); for (auto iter : m_variableWriteHandlingBySlot) { - AZStd::const_pointer_cast<VariableWriteHandling>(iter.second)->Clear(); + if (auto mutableIter = AZStd::const_pointer_cast<VariableWriteHandling>(iter.second)) + { + mutableIter->Clear(); + } } m_variableWriteHandlingBySlot.clear(); m_variableWriteHandlingByVariable.clear(); @@ -434,7 +449,7 @@ namespace ScriptCanvas if (!root->HasExplicitUserOutCalls()) { - // there is a single out call, default or not + // there is a single out, default or not Out out; if (outCalls.empty()) @@ -468,9 +483,7 @@ namespace ScriptCanvas } else { - // for now, all outs must return all the same output, - // if the UI changes, we'll need to track the output of each individual output - if (outCalls.empty()) + if (outCalls.size() < 2) { AddError(root->GetNodeId(), root, ScriptCanvas::ParseErrors::NotEnoughBranchesForReturn); return; @@ -503,6 +516,9 @@ namespace ScriptCanvas , returnValueVariable->m_sourceVariableId }); } + AZStd::const_pointer_cast<ExecutionTree>(outCall)->SetOutCallIndex(m_outIndexCount); + ++m_outIndexCount; + in.outs.push_back(AZStd::move(out)); } } @@ -543,6 +559,8 @@ namespace ScriptCanvas , returnValueVariable->m_sourceVariableId }); } + AZStd::const_pointer_cast<ExecutionTree>(outCall)->SetOutCallIndex(m_outIndexCount); + ++m_outIndexCount; m_subgraphInterface.AddLatent(AZStd::move(out)); } @@ -792,13 +810,6 @@ namespace ScriptCanvas } } - AZ_Assert(variables.size() == constructionNodeables.size() + constructionInputVariables.size() + entityIds.size() - , "ctor var size: %zu, nodeables: %zu, inputs: %zu, entity ids: %zu" - , variables.size() - , constructionNodeables.size() - , constructionInputVariables.size() - , entityIds.size()); - return variables; } @@ -908,6 +919,7 @@ namespace ScriptCanvas ebusHandling->m_startingAdress = startingAddress; } + ebusHandling->m_node = &node; m_ebusHandlingByNode.emplace(&node, ebusHandling); return true; } @@ -3245,13 +3257,21 @@ namespace ScriptCanvas return; } - execution->SetNodeable(iter->second->m_nodeable); + child->SetNodeable(iter->second->m_nodeable); for (auto& childOutSlot : childOutSlots) { AZ_Assert(childOutSlot, "null slot in child out slot list"); ExecutionTreePtr internalOut = OpenScope(child, node, childOutSlot); - internalOut->SetNodeable(execution->GetNodeable()); + + const size_t outIndex = node->GetOutIndex(*childOutSlot); + if (outIndex == std::numeric_limits<size_t>::max()) + { + AddError(execution, aznew Internal::ParseError(node->GetEntityId(), AZStd::string::format("Missing internal out key for slot %s", childOutSlot->GetName().c_str()))); + return; + } + + internalOut->SetOutCallIndex(outIndex); internalOut->MarkInternalOut(); internalOut->SetSymbol(Symbol::FunctionDefinition); auto outNameOutcome = node->GetInternalOutKey(*childOutSlot); @@ -3893,6 +3913,14 @@ namespace ScriptCanvas auto latentOutKeyOutcome = node.GetLatentOutKey(*slot); if (latentOutKeyOutcome.IsSuccess()) { + const size_t outIndex = node.GetOutIndex(*slot); + if (outIndex == std::numeric_limits<size_t>::max()) + { + AddError(outRoot, aznew Internal::ParseError(node.GetEntityId(), AZStd::string::format("Missing internal out key for slot %s", slot->GetName().c_str()))); + return; + } + + outRoot->SetOutCallIndex(outIndex); outRoot->SetName(latentOutKeyOutcome.GetValue().data()); AZStd::const_pointer_cast<NodeableParse>(nodeableParseIter->second)->m_latents.emplace_back(outRoot->GetName(), outRoot); } @@ -4622,7 +4650,13 @@ namespace ScriptCanvas m_userInsThatRequireTopology.clear(); ParseUserOuts(); - m_subgraphInterface.Parse(); + + auto parseOutcome = m_subgraphInterface.Parse(); + + if (!parseOutcome.IsSuccess()) + { + AddError(nullptr, aznew Internal::ParseError(AZ::EntityId(), AZStd::string::format("Subgraph interface failed to parse: %s", parseOutcome.GetError().c_str()).c_str())); + } } void AbstractCodeModel::ParseUserIn(ExecutionTreePtr root, const Nodes::Core::FunctionDefinitionNode* nodeling) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h index 6eef1b6934..f1ad7b986b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/AbstractCodeModel.h @@ -507,6 +507,7 @@ namespace ScriptCanvas static UserInParseTopologyResult ParseUserInTolopology(size_t nodelingsOutCount, size_t leavesWithoutNodelingsCount); + size_t m_outIndexCount = 0; ExecutionTreePtr m_start; AZStd::vector<const Nodes::Core::Start*> m_startNodes; ScopePtr m_graphScope; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionIterator.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionIterator.h index d23771c855..f70d84fb69 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionIterator.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ExecutionIterator.h @@ -87,4 +87,4 @@ namespace ScriptCanvas } // namespace Parser -} // namepsace ScriptCanvas \ No newline at end of file +} // namepsace ScriptCanvas diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/GrammarContextBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/GrammarContextBus.h index e3910bd7c6..4123696eb7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/GrammarContextBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/GrammarContextBus.h @@ -37,4 +37,4 @@ namespace ScriptCanvas using EventBus = AZ::EBus<EventTraits>; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Parser.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Parser.h index 3353966fc3..ae82aea62c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Parser.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Parser.h @@ -105,4 +105,4 @@ namespace ScriptCanvas }; } // namespace Grammar -} // namespace ScriptCanvas} \ No newline at end of file +} // namespace ScriptCanvas} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp index ab467127c1..a5a98b5444 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.cpp @@ -1057,6 +1057,13 @@ namespace ScriptCanvas && azrtti_istypeof<const ScriptCanvas::Nodes::Core::FunctionCallNode*>(execution->GetId().m_node); } + bool IsUserFunctionCallPure(const ExecutionTreeConstPtr& execution) + { + return (execution->GetSymbol() == Symbol::FunctionCall) + && azrtti_istypeof<const ScriptCanvas::Nodes::Core::FunctionCallNode*>(execution->GetId().m_node) + && azrtti_cast<const ScriptCanvas::Nodes::Core::FunctionCallNode*>(execution->GetId().m_node)->IsPure(); + } + bool IsUserFunctionDefinition(const ExecutionTreeConstPtr& execution) { auto nodeling = azrtti_cast<const ScriptCanvas::Nodes::Core::FunctionDefinitionNode*>(execution->GetId().m_node); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h index 7bdfa39c7c..1e2d102d2d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/ParsingUtilities.h @@ -163,6 +163,8 @@ namespace ScriptCanvas bool IsUserFunctionCall(const ExecutionTreeConstPtr& execution); + bool IsUserFunctionCallPure(const ExecutionTreeConstPtr& execution); + bool IsUserFunctionDefinition(const ExecutionTreeConstPtr& execution); const ScriptCanvas::Nodes::Core::FunctionDefinitionNode* IsUserOutNode(const Node* node); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.cpp index bbde312ef3..672375f29b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.cpp @@ -82,7 +82,10 @@ namespace ScriptCanvas { for (auto& iter : m_events) { - AZStd::const_pointer_cast<ExecutionTree>(iter.second)->Clear(); + if (auto event = AZStd::const_pointer_cast<ExecutionTree>(iter.second)) + { + event->Clear(); + } } } @@ -90,7 +93,10 @@ namespace ScriptCanvas { m_eventNode = nullptr; m_eventSlot = nullptr; - AZStd::const_pointer_cast<ExecutionTree>(m_eventHandlerFunction)->Clear(); + if (auto function = AZStd::const_pointer_cast<ExecutionTree>(m_eventHandlerFunction)) + { + function->Clear(); + } } void FunctionPrototype::Clear() @@ -152,7 +158,10 @@ namespace ScriptCanvas for (auto& iter : m_latents) { - AZStd::const_pointer_cast<ExecutionTree>(iter.second)->Clear(); + if (auto latent = AZStd::const_pointer_cast<ExecutionTree>(iter.second)) + { + latent->Clear(); + } } m_latents.clear(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h index 68856325d0..c2605dce45 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/Primitives.h @@ -90,11 +90,11 @@ namespace ScriptCanvas AZ_CLASS_ALLOCATOR(EBusHandling, AZ::SystemAllocator, 0); bool m_isAddressed = false; + const Node* m_node = nullptr; VariableConstPtr m_startingAdress; AZStd::string m_ebusName; AZStd::string m_handlerName; AZStd::vector<AZStd::pair<AZStd::string, ExecutionTreeConstPtr>> m_events; - void Clear(); }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h index 72449ebc6d..bcfcccbaca 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h @@ -110,7 +110,7 @@ namespace ScriptCanvas constexpr const char* k_InitializeStaticsName = "InitializeStatics"; constexpr const char* k_InitializeNodeableOutKeys = "InitializeNodeableOutKeys"; - + constexpr const char* k_InitializeExecutionOutByRequiredCountName = "InitializeExecutionOutByRequiredCount"; constexpr const char* k_InterpretedConfigurationPerformance = "SCRIPT_CANVAS_GLOBAL_PERFORMANCE"; constexpr const char* k_InterpretedConfigurationRelease = "SCRIPT_CANVAS_GLOBAL_RELEASE"; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp index e1e46d231e..ed61d7e838 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.cpp @@ -72,7 +72,10 @@ namespace ScriptCanvas for (auto returnValue : m_returnValues) { - AZStd::const_pointer_cast<ReturnValue>(returnValue.second)->Clear(); + if (auto returnValuePtr = AZStd::const_pointer_cast<ReturnValue>(returnValue.second)) + { + returnValuePtr->Clear(); + } } m_returnValues.clear(); @@ -260,6 +263,11 @@ namespace ScriptCanvas return m_nodeable; } + AZStd::optional<size_t> ExecutionTree::GetOutCallIndex() const + { + return m_outCallIndex != std::numeric_limits<size_t>::max() ? AZStd::optional<size_t>(m_outCallIndex) : AZStd::nullopt; + } + ExecutionTreeConstPtr ExecutionTree::GetParent() const { return m_parent; @@ -559,6 +567,11 @@ namespace ScriptCanvas m_lexicalScope = lexicalScope; } + void ExecutionTree::SetOutCallIndex(size_t index) + { + m_outCallIndex = index; + } + void ExecutionTree::SetParent(ExecutionTreePtr parent) { m_parent = parent; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h index 518b1ba7f1..3d0d75b313 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesExecution.h @@ -170,6 +170,8 @@ namespace ScriptCanvas VariableConstPtr GetNodeable() const; + AZStd::optional<size_t> GetOutCallIndex() const; + ExecutionTreeConstPtr GetParent() const; ExecutionTreeConstPtr GetRoot() const; @@ -252,15 +254,14 @@ namespace ScriptCanvas void SetNodeable(VariableConstPtr nodeable); + void SetOutCallIndex(size_t index); + void SetParent(ExecutionTreePtr parent); void SetScope(ScopePtr scope); void SetSymbol(Symbol val); - protected: - VariableConstPtr m_nodeable; - private: // the (possible) slot(s) through which execution exited, along with associated output AZStd::vector<ExecutionChild> m_children; @@ -286,6 +287,8 @@ namespace ScriptCanvas bool m_hasExplicitUserOutCalls = false; + size_t m_outCallIndex = std::numeric_limits<size_t>::max(); + // The node and the activation slot. The execution in, or the event or latent out slot. ExecutionId m_in; @@ -310,6 +313,8 @@ namespace ScriptCanvas Symbol m_symbol = Symbol::FunctionCall; + VariableConstPtr m_nodeable; + size_t FindIndexOfChild(ExecutionTreeConstPtr child) const; }; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.ScriptCanvasNodeable.xml index a1f4094eda..e7b8476ddd 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.ScriptCanvasNodeable.xml @@ -30,4 +30,4 @@ </Property> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.cpp index 881d087a3d..a23575693e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodeables/BaseTimer.cpp @@ -66,7 +66,7 @@ namespace ScriptCanvas break; } - while (m_timerCounter > m_timerDuration) + while (m_timerCounter >= m_timerDuration) { if (!m_isActive) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml index 3aed82be77..695bb76927 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/BaseTimerNode.ScriptCanvasGrammar.xml @@ -20,4 +20,4 @@ <EditProperty UiHandler="AZ::Edit::UIHandlers::Default" FieldName="m_tickOrder" Name="m_tickOrder" > </EditProperty> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml index 27baebc8f5..0a52a51af0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/ExpressionNodeBase.ScriptCanvasGrammar.xml @@ -19,4 +19,4 @@ <EditAttribute Key="AZ::Edit::Attributes::StringLineEditingCompleteNotify" Value="&ExpressionNodeBase::SignalFormatChanged"/> </EditProperty> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml index 1f9803db14..6647fda136 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.ScriptCanvasGrammar.xml @@ -26,4 +26,4 @@ <EditAttribute Key="AZ::Edit::Attributes::Max" Value="24"/> </EditProperty> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/Comparison.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/Comparison.h index 7865f9a3f3..18eb0a0870 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/Comparison.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/Comparison.h @@ -39,4 +39,4 @@ namespace ScriptCanvas static AZStd::vector<AZ::ComponentDescriptor*> GetComponentDescriptors(); }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/ComparisonFunctions.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/ComparisonFunctions.h index a45ccd1ff0..6fdc3797c2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/ComparisonFunctions.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Comparison/ComparisonFunctions.h @@ -388,4 +388,4 @@ namespace ScriptCanvas } } -#endif // EXPRESSION_TEMPLATES_ENABLED \ No newline at end of file +#endif // EXPRESSION_TEMPLATES_ENABLED diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml index 447ed1a23b..66903964ba 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/AzEventHandler.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ <Out Name="On Disconnected" Description="Signaled when this event handler is disconnected."/> <SerializedProperty Name="m_azEventEntry" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.h index 8b4b30d47d..09306ff26a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/BehaviorContextObjectNode.h @@ -75,4 +75,4 @@ namespace ScriptCanvas }; } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml index c5855edb0c..b3179ed2e4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.ScriptCanvasGrammar.xml @@ -24,4 +24,4 @@ <SerializedProperty Name="m_busId" /> <SerializedProperty Name="m_autoConnectToGraphOwner" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp index cd57cb6608..0fc40bceee 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp @@ -393,6 +393,11 @@ namespace ScriptCanvas return false; } + AZStd::optional<size_t> EBusEventHandler::GetEventIndex(AZStd::string eventName) const + { + return m_handler->GetFunctionIndex(eventName.c_str()); + } + const EBusEventEntry* EBusEventHandler::FindEvent(const AZStd::string& name) const { AZ::Crc32 key = AZ::Crc32(name.c_str()); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h index 890b50a9e4..be624d608d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h @@ -115,6 +115,7 @@ namespace ScriptCanvas AZ::Outcome<AZStd::string, void> GetFunctionCallName(const Slot* /*slot*/) const override; bool IsEBusAddressed() const override; + AZStd::optional<size_t> GetEventIndex(AZStd::string eventName) const; const EBusEventEntry* FindEvent(const AZStd::string& name) const; AZStd::string GetEBusName() const override; bool IsAutoConnected() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml index 06186ba0e9..ac841f6685 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ExtractProperty.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ <SerializedProperty Name="m_dataType" /> <SerializedProperty Name="m_propertyAccounts" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml index 256b95152c..e1a660f1a9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ForEach.ScriptCanvasGrammar.xml @@ -20,4 +20,4 @@ <SerializedProperty Name="m_previousTypeId" /> <SerializedProperty Name="m_propertySlots" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionBus.h index 018dbd5b45..7272c4aa82 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionBus.h @@ -52,4 +52,4 @@ namespace ScriptCanvas }; using FunctionNodeRequestBus = AZ::EBus<FunctionNodeRequests>; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml index c3b125c692..6276522331 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionCallNode.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ <SerializedProperty Name="m_slotExecutionMap" /> <SerializedProperty Name="m_slotExecutionMapSourceInterface" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml index 95060b88ce..8baf5b3088 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/FunctionDefinitionNode.ScriptCanvasGrammar.xml @@ -15,4 +15,4 @@ Description="Represents either an execution entry or exit node."> <SerializedProperty Name="m_isExecutionEntry" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml index 990fe94853..2b00445496 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/GetVariable.ScriptCanvasGrammar.xml @@ -20,4 +20,4 @@ <EditAttribute Key="AZ::Edit::Attributes::PostChangeNotify" Value="&GetVariableNode::OnIdChanged"/> </EditProperty> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp index 1a69dbb25e..836c3facab 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp @@ -249,22 +249,48 @@ namespace ScriptCanvas return; } - if (className.empty()) + if (!InitializeOverloaded(namespaces, className, methodName)) { - InitializeFree(namespaces, methodName); - } - else if (auto ebusIterator = behaviorContext->m_ebuses.find(className); ebusIterator == behaviorContext->m_ebuses.end()) - { - InitializeClass(namespaces, className, methodName); - } - else - { - InitializeEvent(namespaces, className, methodName); + if (className.empty()) + { + InitializeFree(namespaces, methodName); + } + else if (auto ebusIterator = behaviorContext->m_ebuses.find(className); ebusIterator == behaviorContext->m_ebuses.end()) + { + InitializeClass(namespaces, className, methodName); + } + else + { + InitializeEvent(namespaces, className, methodName); + } } PopulateNodeType(); } + bool Method::InitializeOverloaded([[maybe_unused]] const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName) + { + const AZ::BehaviorMethod* method{}; + const AZ::BehaviorClass* bcClass{}; + AZStd::string prettyClassName; + + if (IsMethodOverloaded() && BehaviorContextUtils::FindExplicitOverload(method, bcClass, className, methodName, &prettyClassName)) + { + MethodConfiguration config(*method, MethodType::Member); + config.m_class = bcClass; + config.m_namespaces = &m_namespaces; + config.m_className = &className; + config.m_lookupName = &methodName; + config.m_prettyClassName = prettyClassName; + InitializeMethod(config); + return true; + } + else + { + return false; + } + } + void Method::InitializeClass(const NamespacePath&, AZStd::string_view className, AZStd::string_view methodName) { AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex); @@ -273,8 +299,7 @@ namespace ScriptCanvas const AZ::BehaviorClass* bcClass{}; AZStd::string prettyClassName; - if ((IsMethodOverloaded() && BehaviorContextUtils::FindExplicitOverload(method, bcClass, className, methodName, &prettyClassName)) - || BehaviorContextUtils::FindClass(method, bcClass, className, methodName, &prettyClassName)) + if (BehaviorContextUtils::FindClass(method, bcClass, className, methodName, &prettyClassName)) { MethodConfiguration config(*method, MethodType::Member); config.m_class = bcClass; @@ -308,6 +333,7 @@ namespace ScriptCanvas AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex); const AZ::BehaviorMethod* method{}; + if (BehaviorContextUtils::FindFree(method, methodName)) { MethodConfiguration config(*method, MethodType::Free); @@ -525,6 +551,17 @@ namespace ScriptCanvas m_method = &method; m_class = bcClass; + AZ::BehaviorContext* behaviorContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); + + if (bcClass && behaviorContext) + { + if (auto prettyNameAttribute = AZ::FindAttribute(AZ::ScriptCanvasAttributes::PrettyName, bcClass->m_attributes)) + { + AZ::AttributeReader operatorAttrReader(nullptr, prettyNameAttribute); + operatorAttrReader.Read<AZStd::string>(m_classNamePretty, *behaviorContext); + } + } if (m_classNamePretty.empty()) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h index 7af2c15e82..b03e3aefd8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h @@ -86,8 +86,6 @@ namespace ScriptCanvas bool IsObjectClass(AZStd::string_view objectClass) const { return objectClass.compare(m_className) == 0; } - - //! Attempts to initialize node with a BehaviorContext BehaviorMethod //! If the className is empty, then the methodName is searched on the BehaviorContext //! If className is not empty the className is used to look for a registered BehaviorEBus in the BehaviorContext @@ -102,6 +100,8 @@ namespace ScriptCanvas void InitializeFree(const NamespacePath& namespaces, AZStd::string_view methodName); + bool InitializeOverloaded(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName); + AZ_INLINE bool IsValid() const { return m_method != nullptr; } bool HasBusID() const { return (m_method == nullptr) ? false : m_method->HasBusId(); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml index 789da81739..c4e628d89f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Nodeling.ScriptCanvasGrammar.xml @@ -14,4 +14,4 @@ <SerializedProperty Name="m_displayName" /> <SerializedProperty Name="m_identifier" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml index 527bdec6f6..50874f161c 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ <Out Name="OnFailure" Description="Signaled when it is not possible to connect this handler."/> <SerializedProperty Name="m_autoConnectToGraphOwner" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp index 962ee3e515..a7dc586a94 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp @@ -548,6 +548,11 @@ namespace ScriptCanvas return EBusEventHandlerProperty::GetDisconnectSlot(this); } + AZStd::optional<size_t> ReceiveScriptEvent::GetEventIndex(AZStd::string eventName) const + { + return m_handler->GetFunctionIndex(eventName.c_str());; + } + AZStd::vector<SlotId> ReceiveScriptEvent::GetEventSlotIds() const { AZStd::vector<SlotId> eventSlotIds; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h index 3f2425cd4a..dcf1bca50e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h @@ -57,6 +57,7 @@ namespace ScriptCanvas AZ::Outcome<AZStd::string> GetInternalOutKey(const Slot& slot) const override; const Slot* GetEBusConnectSlot() const override; const Slot* GetEBusDisconnectSlot() const override; + AZStd::optional<size_t> GetEventIndex(AZStd::string eventName) const override; AZStd::vector<SlotId> GetEventSlotIds() const override; AZStd::vector<SlotId> GetNonEventSlotIds() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml index ccd00a0b6e..d9db8d3c91 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Repeater.ScriptCanvasGrammar.xml @@ -24,4 +24,4 @@ <OutLatent Name="Complete" Description="Signaled upon node exit"/> <OutLatent Name="Action" Description="The signal that will be repeated"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml index d00739ea43..2bf9f2cf40 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml @@ -25,4 +25,4 @@ <PropertyInterface Property="m_timeUnitsInterface" Name="Units" Type="Input" Description="Units to represent the time in."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml index 8bdae01378..dc5d0bff7b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvas.xml @@ -18,4 +18,4 @@ <SerializedProperty Name="m_scriptEventAssetId" /> <SerializedProperty Name="m_asset" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml index 8bdae01378..dc5d0bff7b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ScriptEventBase.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ <SerializedProperty Name="m_scriptEventAssetId" /> <SerializedProperty Name="m_asset" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml index 225e415a8a..18064698b2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SendScriptEvent.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ <In Name="In" Description="Fires the specified ScriptEvent when signaled"/> <Out Name="Out" Description="Trigged after the ScriptEvent has been signaled and returns"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml index 139220bccf..7581022cde 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/SetVariable.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ <EditAttribute Key="AZ::Edit::Attributes::PostChangeNotify" Value="&SetVariableNode::OnIdChanged"/> </EditProperty> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml index c536289e4e..db30b4c1cf 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Start.ScriptCanvasGrammar.xml @@ -14,4 +14,4 @@ Description="Starts executing the graph when the entity that owns the graph is fully activated."> <Out Name="Out" Description="Signaled when the entity that owns this graph is fully activated."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/EntityIDNode.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/EntityIDNode.h index e443e055c5..ac424e1300 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/EntityIDNode.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/EntityIDNode.h @@ -49,4 +49,4 @@ namespace ScriptCanvas }; } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.cpp index 604051fa86..224c893ea8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.cpp @@ -29,4 +29,4 @@ namespace ScriptCanvas } } -#include <Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.generated.cpp> \ No newline at end of file +#include <Include/ScriptCanvas/Libraries/Entity/FindTaggedEntities.generated.cpp> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml index 0f29c3b548..0b2c5714d7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Entity/Rotate.ScriptCanvasGrammar.xml @@ -26,4 +26,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Libraries.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Libraries.cpp index 42c2b06763..641bdca8f7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Libraries.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Libraries.cpp @@ -105,4 +105,4 @@ namespace ScriptCanvas return libraryDescriptors; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml index 581c36277d..c8e854640d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Any.ScriptCanvasGrammar.xml @@ -12,4 +12,4 @@ Description="Will trigger the Out pin whenever any of the In pins get triggered"> <Out Name="Out" Description="Signaled when the node receives a signal from the selected index"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml index a685637dc4..cee71544d7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Break.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ <In Name="In" Description=""/> <Out Name="Out 0" Description="Output 0"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml index d5a2d849e3..54fdb65712 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ <In Name="In" Description=""/> <Out Name="Out 0" Description="Output 0"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml index 2e020e3c2d..49671fc439 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Gate.ScriptCanvasGrammar.xml @@ -19,4 +19,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml index 035b9e1ab4..6fa465a280 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Indexer.ScriptCanvasGrammar.xml @@ -20,4 +20,4 @@ <In Name="In7" Description="Input 7"/> <Out Name="Out" Description="Signaled when the node is triggered."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml index 18e54b8abb..e019b69ea8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.ScriptCanvasGrammar.xml @@ -14,4 +14,4 @@ <Out Name="True" Description="Signaled if the reference provided is null."/> <Out Name="False" Description="Signaled if the reference provided is not null."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml index 4058be4d80..15dbbc0674 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Multiplexer.ScriptCanvasGrammar.xml @@ -24,4 +24,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml index fa61e35976..a1b6d21906 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Once.ScriptCanvasGrammar.xml @@ -15,4 +15,4 @@ <Out Name="Out" Description="Output signal"/> <Out Name="On Reset" Description ="Triggered when Reset"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml index 1d8a0946c1..32ca51f0a5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ <In Name="In" Description=""/> <Out Name="Out 0" Description="Output 0"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml index c5082e9083..f075b1a6e4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Sequencer.ScriptCanvasGrammar.xml @@ -30,4 +30,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml index 2e3e3bacee..d532bebdb5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.ScriptCanvasGrammar.xml @@ -17,4 +17,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml index 11c708831f..079420e8bf 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ <In Name="In" Description="Input signal"/> <SerializedProperty Name="m_weightedPairings" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml index 434574c59c..160c8755c2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/While.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.cpp index d5696f1002..f551fd2085 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.cpp @@ -139,4 +139,4 @@ namespace ScriptCanvas } } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.h index 47c331074c..35d771c8e6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/BinaryOperation.h @@ -47,4 +47,4 @@ namespace ScriptCanvas }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml index 7d624ce46a..5c29ecfb86 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/MathExpression.ScriptCanvasGrammar.xml @@ -20,4 +20,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml index fa5de4c1cc..d2f3aede03 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Math/Random.ScriptCanvasGrammar.xml @@ -31,4 +31,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml index 6417e77e2e..bb5bc0c546 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorAt.ScriptCanvasGrammar.xml @@ -15,4 +15,4 @@ Description="Returns the element at the specified Index or Key"> <Out Name="Key Not Found" Description="Triggered if the specified key was not found"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml index 99510d0256..267b72bb74 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorBack.ScriptCanvasGrammar.xml @@ -12,4 +12,4 @@ DeprecationUUID="{C1E3C9D0-42E3-4D00-AE73-2A881E7E76A8}" Description="Get Last Element"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml index 5b4a99d98b..5a7b86c660 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorClear.ScriptCanvasGrammar.xml @@ -27,4 +27,4 @@ ConnectionType="ScriptCanvas::ConnectionType::Output" DynamicType="ScriptCanvas::DynamicDataType::Container" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml index d244284424..77fe5ee9b0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorEmpty.ScriptCanvasGrammar.xml @@ -28,4 +28,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml index 8bc5f08abf..2fa06a7bd1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorErase.ScriptCanvasGrammar.xml @@ -15,4 +15,4 @@ Description="Erase the element at the specified Index or with the specified Key"> <Out Name="Element Not Found" Description="Triggered if the specified element was not found"/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml index 032ef71252..103c1db110 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorFront.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ ReplacementMethodName="Get First Element" Description="Retrieves the first element in the container"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml index dfa14c955f..98ee8141b3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorInsert.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ ReplacementMethodName="Insert" Description="Inserts an element into the container at the specified Index or Key"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml index 83db86b6df..e0165f5603 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorPushBack.ScriptCanvasGrammar.xml @@ -13,4 +13,4 @@ ReplacementMethodName="Add Element at End" Description="Adds the provided element at the end of the container"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml index d1b236e12b..47e3535283 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Containers/OperatorSize.ScriptCanvasGrammar.xml @@ -26,4 +26,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml index d2006dd306..5fa8ec90c1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorAdd.ScriptCanvasGrammar.xml @@ -10,4 +10,4 @@ Version="0" Description="Adds two or more values"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml index 2ae5ca07de..5aa7b738a4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorArithmetic.ScriptCanvasGrammar.xml @@ -23,4 +23,4 @@ Version="0" Description=""> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml index c5a5befa46..498b19b165 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDiv.ScriptCanvasGrammar.xml @@ -10,4 +10,4 @@ Version="0" Description="Divides two or more values"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml index aab61f2280..044aab3baa 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorDivideByNumber.ScriptCanvasGrammar.xml @@ -35,4 +35,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml index 5575ecf59d..0a07921fa5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLength.ScriptCanvasGrammar.xml @@ -28,4 +28,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml index abb3d861c4..2dd2474ee8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerp.ScriptCanvasGrammar.xml @@ -51,4 +51,4 @@ IsOutput="True" /> <SerializedProperty Name="m_displayType" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.h index 157f086fca..4b4bd59dc9 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorLerpNodeable.h @@ -136,16 +136,21 @@ namespace ScriptCanvas } protected: + size_t GetRequiredOutCount() const override + { + return 2; + } + void Lerp(float t) { const t_Operand step = m_start + (m_difference * t); // make a release note that the lerp complete and tick slot are two different execution threads - ExecutionOut(AZ_CRC_CE("Tick"), step, t); + ExecutionOut(0, step, t); if (AZ::IsClose(t, 1.0f, AZ::Constants::FloatEpsilon)) { StopLerp(); - ExecutionOut(AZ_CRC_CE("Lerp Complete")); + ExecutionOut(1); } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml index 864c8b37a2..b4d91f9b2e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorMul.ScriptCanvasGrammar.xml @@ -10,4 +10,4 @@ Version="0" Description="Multiplies two of more values"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml index de808c5db6..3453049fc5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Math/OperatorSub.ScriptCanvasGrammar.xml @@ -10,4 +10,4 @@ Version="0" Description="Subtracts two of more elements"> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml index 1458a8b7b5..e69b23365e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Operators/Operator.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ <SerializedProperty Name="m_outputSlots" /> <SerializedProperty Name="m_inputSlots" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml index 736c56654b..30bf685a00 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Contains.ScriptCanvasGrammar.xml @@ -46,4 +46,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml index 100921efac..12b86f5ac0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Format.ScriptCanvasGrammar.xml @@ -18,4 +18,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml index 77c07ff711..8d1ccc6dd3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Print.ScriptCanvasGrammar.xml @@ -12,4 +12,4 @@ EditAttributes="AZ::Edit::Attributes::CategoryStyle@.string;ScriptCanvas::Attributes::Node::TitlePaletteOverride@StringNodeTitlePalette" Description="Formats and prints the provided text in the debug console.\nAny word within {} will create a data pin on this node."> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml index 6ac8839af1..6f6b6c9e39 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Replace.ScriptCanvasGrammar.xml @@ -43,4 +43,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml index ca5292f5fc..9e03073b40 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/String/Utilities.ScriptCanvasGrammar.xml @@ -131,4 +131,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml index 1cc1775525..8773803aca 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Countdown.ScriptCanvasGrammar.xml @@ -74,4 +74,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DateTime.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DateTime.h index 62be2f2a19..b4bc2660f6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DateTime.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DateTime.h @@ -83,4 +83,4 @@ namespace ScriptCanvas } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DelayNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DelayNodeable.ScriptCanvasNodeable.xml index e6a08a764e..c40fa1f7e8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DelayNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DelayNodeable.ScriptCanvasNodeable.xml @@ -26,4 +26,4 @@ <Parameter Name="Elapsed" Type="Data::NumberType" Description="The amount of time that has elapsed since the delay began."/> </Output> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml index c15a1a3d79..ac97b49c6a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Duration.ScriptCanvasGrammar.xml @@ -26,4 +26,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DurationNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DurationNodeable.ScriptCanvasNodeable.xml index 85eee134e8..0c813e05dc 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DurationNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/DurationNodeable.ScriptCanvasNodeable.xml @@ -21,4 +21,4 @@ <Output Name="Done" Description="Signaled after waiting for the specified amount of times." /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml index 8f61f2117b..614a2f676a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeat.ScriptCanvasGrammar.xml @@ -16,4 +16,4 @@ <In Name="Stop" Description=""/> <OutLatent Name="Pulse" Description=""/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.ScriptCanvasNodeable.xml index 06674c3afb..4e51642483 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/HeartBeatNodeable.ScriptCanvasNodeable.xml @@ -22,4 +22,4 @@ <PropertyInterface Property="m_timeUnitsInterface" Name="Units" Type="Input" Description="Units to represent the time in."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.ScriptCanvasNodeable.xml index 6f2b0c4d33..41cefb8f63 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimeDelayNodeable.ScriptCanvasNodeable.xml @@ -20,4 +20,4 @@ <PropertyInterface Property="m_timeUnitsInterface" Name="Units" Type="Input" Description="Units to represent the time in."/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml index ff274aceed..21adecb8fe 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/Timer.ScriptCanvasGrammar.xml @@ -25,4 +25,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml index db00609956..00f0227b89 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Time/TimerNodeable.ScriptCanvasNodeable.xml @@ -20,4 +20,4 @@ </Output> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml index 6b9feb9303..c71fe1f045 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddFailure.ScriptCanvasGrammar.xml @@ -23,4 +23,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml index 19226be6d6..f860f22b8a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/AddSuccess.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml index 1149993f3a..1a7f38e5bc 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/Checkpoint.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml index b2efdb7e6f..c416b6666a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectEqual.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml index ed5f8ae779..682533f548 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectFalse.ScriptCanvasGrammar.xml @@ -27,4 +27,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml index d074d0eba3..dec211eb9f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThan.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml index 58358466bf..64ae8e2906 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectGreaterThanEqual.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml index 69d52f570a..70ab6d97fd 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThan.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml index 9fdff37155..7272ac145d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectLessThanEqual.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml index 615e5688e2..5c45133976 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectNotEqual.ScriptCanvasGrammar.xml @@ -32,4 +32,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml index 153706ba7b..972d600923 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/ExpectTrue.ScriptCanvasGrammar.xml @@ -27,4 +27,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml index 6111ade264..b0510a0f94 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/MarkComplete.ScriptCanvasGrammar.xml @@ -21,4 +21,4 @@ IsInput="True" IsOutput="False" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSender.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSender.cpp index e6ab482ef4..9cac7bd021 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSender.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/UnitTesting/UnitTestBusSender.cpp @@ -388,9 +388,8 @@ namespace ScriptCanvas { AZ::ScriptCanvasAttributes::HiddenIndices uniqueIdIndex = { 0 }; - auto builder = behaviorContext->Class<EventSender>("Unit Testing") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ; + auto builder = behaviorContext->Class<EventSender>("Unit Testing"); + builder->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common); builder->Method("Add Failure", &EventSender::AddFailure, { { {"", "", behaviorContext->MakeDefaultValue(UniqueId)}, {"Report", "additional notes for the test report"} } }) ->Attribute(AZ::ScriptCanvasAttributes::HiddenParameterIndex, uniqueIdIndex) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.cpp index 586fd394a2..43511f74e0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.cpp @@ -16,4 +16,4 @@ namespace ScriptCanvas { } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.h index ecbcd55092..f7bafd87c4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Aggregator.h @@ -16,4 +16,4 @@ namespace ScriptCanvas { } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Driller.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Driller.cpp index 822d03fff4..e08f6ca1df 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Driller.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/Driller.cpp @@ -33,4 +33,4 @@ namespace ScriptCanvas m_output->EndTag(AZ_CRC("ScriptCanvasGraphDriller", 0xb161ccb2)); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.cpp index 586fd394a2..43511f74e0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.cpp @@ -16,4 +16,4 @@ namespace ScriptCanvas { } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.h index 3a2f6f89ca..66c89f0bf0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Profiler/DrillerEvents.h @@ -31,4 +31,4 @@ namespace ScriptCanvas } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h index b15ec596f9..3c00562505 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h @@ -22,6 +22,7 @@ #include <ScriptCanvas/Core/ScriptCanvasBus.h> #include <ScriptCanvas/Variable/VariableCore.h> #include <ScriptCanvas/PerformanceTracker.h> +#include <ScriptCanvas/Data/DataRegistry.h> namespace AZ { @@ -65,6 +66,8 @@ namespace ScriptCanvas inline bool IsAnyScriptInterpreted() const { return true; } + AZStd::pair<DataRegistry::Createability, TypeProperties> GetCreatibility(AZ::SerializeContext* serializeContext, AZ::BehaviorClass* behaviorClass); + // SystemRequestBus::Handler... bool IsScriptUnitTestingInProgress() override; void MarkScriptUnitTestBegin() override; @@ -100,7 +103,7 @@ namespace ScriptCanvas using LockType = AZStd::lock_guard<MutexType>; AZStd::unordered_map<const void*, BehaviorContextObject*> m_ownedObjectsByAddress; MutexType m_ownedObjectsByAddressMutex; - int m_infiniteLoopDetectionMaxIterations = 3000; + int m_infiniteLoopDetectionMaxIterations = 1000000; int m_maxHandlerStackDepth = 50; static void SafeRegisterPerformanceTracker(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/AbstractModelTranslator.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/AbstractModelTranslator.h index 57d3bccb0a..b6f397816a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/AbstractModelTranslator.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/AbstractModelTranslator.h @@ -35,4 +35,4 @@ namespace ScriptCanvas } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToCPlusPlus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToCPlusPlus.h index 5bdbc4b499..4970f225ce 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToCPlusPlus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToCPlusPlus.h @@ -61,4 +61,4 @@ namespace ScriptCanvas }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp index bd583cb43d..128ef95b63 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.cpp @@ -582,7 +582,7 @@ namespace ScriptCanvas void GraphToLua::TranslateExecutionTreeFunctionCall(Grammar::ExecutionTreeConstPtr execution) { - TranslateNodeableOuts(execution); + TranslateNodeableOuts(execution->GetNodeable(), execution); WriteDebugInfoIn(execution, "TranslateExecutionTreeFunctionCall begin"); m_dotLua.WriteIndent(); WriteLocalOutputInitialization(execution); @@ -689,8 +689,16 @@ namespace ScriptCanvas void GraphToLua::TranslateExecutionTreeUserOutCall(Grammar::ExecutionTreeConstPtr execution) { - // \todo revisit with per-entity run time storage that keeps execution out calls - m_dotLua.WriteIndented("%s(self, \"%s\"", Grammar::k_NodeableCallInterpretedOut, execution->GetName().data()); + auto outCallIndexOptional = execution->GetOutCallIndex(); + if (!outCallIndexOptional) + { + AddError(nullptr, aznew Internal::ParseError(execution->GetNodeId(), "Execution did not return required out call index")); + return; + } + + const size_t outIndex = *outCallIndexOptional; + + m_dotLua.WriteIndented("%s(self, %zu", Grammar::k_NodeableCallInterpretedOut, outIndex); if (execution->GetInputCount() > 0) { @@ -698,7 +706,7 @@ namespace ScriptCanvas WriteFunctionCallInput(execution); } - m_dotLua.WriteLine(")"); + m_dotLua.WriteLine(") -- %s", execution->GetName().data()); } void GraphToLua::TranslateFunction(Grammar::ExecutionTreeConstPtr execution, IsNamed lex) @@ -861,14 +869,23 @@ namespace ScriptCanvas const bool hasResults = eventThread->HasReturnValues(); + AZStd::optional<size_t> eventIndex = ebusHandling->m_node->GetEventIndex(nameAndEventThread.first); + if (!eventIndex) + { + AddError(nullptr, aznew Internal::ParseError(ebusHandling->m_node->GetEntityId(), AZStd::string::format("EBus handler did not return a valid index for event %s", nameAndEventThread.first.c_str()))); + return; + } + m_dotLua.WriteNewLine(); - m_dotLua.WriteLineIndented("%s(%s%s, '%s'," + m_dotLua.WriteLineIndented("%s(%s%s, %zu, -- %s" , hasResults ? Grammar::k_EBusHandlerHandleEventResultName : Grammar::k_EBusHandlerHandleEventName , leftValue.data() , ebusHandling->m_handlerName.data() + , *eventIndex , eventThread->GetName().data()); m_dotLua.Indent(); + TranslateFunction(eventThread, IsNamed::No); m_dotLua.WriteLine(")"); @@ -938,7 +955,7 @@ namespace ScriptCanvas for (auto& out : nodeAndParse->m_latents) { m_dotLua.WriteNewLine(); - TranslateNodeableOut(out.second); + TranslateNodeableOut(nodeAndParse->m_nodeable, out.second); } if (!nodeAndParse->m_latents.empty()) @@ -983,14 +1000,7 @@ namespace ScriptCanvas const auto& outKeys = m_model.GetInterface().GetOutKeys(); if (!outKeys.empty()) { - m_dotLua.WriteIndented("%s(self", Grammar::k_InitializeNodeableOutKeys); - - for (auto& key : outKeys) - { - m_dotLua.Write(", %u", AZ::u32(key)); - } - - m_dotLua.WriteLine(")"); + m_dotLua.WriteLineIndented("%s(self, %zu)", Grammar::k_InitializeNodeableOutKeys, outKeys.size()); } } else @@ -1007,17 +1017,28 @@ namespace ScriptCanvas m_dotLua.WriteNewLine(); } - void GraphToLua::TranslateNodeableOut(Grammar::ExecutionTreeConstPtr execution) + void GraphToLua::TranslateNodeableOut(Grammar::VariableConstPtr host, Grammar::ExecutionTreeConstPtr execution) { + auto outCallIndexOptional = execution->GetOutCallIndex(); + if (!outCallIndexOptional) + { + AddError(nullptr, aznew Internal::ParseError(execution->GetNodeId(), "Execution did not return required out call index")); + return; + } + + const size_t outIndex = *outCallIndexOptional; + + // #functions2 remove-execution-out-hash const auto setExecutionOutName = Grammar::IsUserFunctionDefinition(execution) ? Grammar::k_NodeableSetExecutionOutUserSubgraphName : execution->HasReturnValues() ? Grammar::k_NodeableSetExecutionOutResultName : Grammar::k_NodeableSetExecutionOutName; - m_dotLua.WriteLineIndented("%s(self.%s, '%s'," + m_dotLua.WriteLineIndented("%s(self.%s, %zu, -- %s" , setExecutionOutName - , execution->GetNodeable()->m_name.data() + , host->m_name.data() + , outIndex , execution->GetName().data()); m_dotLua.Indent(); @@ -1027,14 +1048,14 @@ namespace ScriptCanvas m_dotLua.Outdent(); } - void GraphToLua::TranslateNodeableOuts(Grammar::ExecutionTreeConstPtr execution) + void GraphToLua::TranslateNodeableOuts(Grammar::VariableConstPtr host, Grammar::ExecutionTreeConstPtr execution) { const auto outs = execution->GetInternalOuts(); for (const auto& out : outs) { m_dotLua.WriteNewLine(); - TranslateNodeableOut(out); + TranslateNodeableOut(host, out); } if (!outs.empty()) @@ -1050,7 +1071,6 @@ namespace ScriptCanvas return; } - m_dotLua.WriteIndented("function %s.%s(self, ", m_tableName.c_str(), Grammar::k_InitializeStaticsName); WriteStaticInitializerInput(IsLeadingCommaRequired::No); m_dotLua.WriteLine(")"); @@ -1078,7 +1098,7 @@ namespace ScriptCanvas continue; } - if (variable->m_datum.GetType().GetAZType() == azrtti_typeid<Nodeable>()) + if (m_model.IsUserNodeable(variable)) { auto nodeableName = variable->m_name; if (nodeableName.starts_with(Grammar::k_memberNamePrefix)) @@ -1104,7 +1124,7 @@ namespace ScriptCanvas // indexInfo->second.requiresCtorParamsForDependencies // self.nonLeafDependency = NonLeafDependency.new(executionState, UnpackDependencyArgs(executionState, dependentAssets, 7)) // -- has more dependencies, index, known from compile time, pushes the correct asset further down construction - m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %s))" + m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %zu))" , leftValue.data() , variable->m_name.data() , nodeableName.data() @@ -1112,7 +1132,7 @@ namespace ScriptCanvas , Grammar::k_UnpackDependencyConstructionArgsFunctionName , Grammar::k_executionStateVariableName , Grammar::k_DependentAssetsArgName - , AZStd::to_string(indexInfo->first).data()); + , indexInfo->first); } else // vs. @@ -1120,7 +1140,7 @@ namespace ScriptCanvas // !indexInfo->second.hasMoreDependencies // self.leafDependency = LeafDependency.new(executionState, UnpackDependencyArgsLeaf(executionState, dependentAssets, 10)) // -- has NO more dependencies, index, known from compile time - m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %s))" + m_dotLua.WriteLineIndented("%s%s = %s.new(%s, %s(%s, %s, %zu))" , leftValue.data() , variable->m_name.data() , nodeableName.data() @@ -1128,7 +1148,7 @@ namespace ScriptCanvas , Grammar::k_UnpackDependencyConstructionArgsLeafFunctionName , Grammar::k_executionStateVariableName , Grammar::k_DependentAssetsArgName - , AZStd::to_string(indexInfo->first).data()); + , indexInfo->first); } } else @@ -1158,6 +1178,7 @@ namespace ScriptCanvas case Grammar::VariableConstructionRequirement::InputNodeable: m_dotLua.WriteLineIndented("%s:InitializeExecutionState(%s)", variable->m_name.data(), Grammar::k_executionStateVariableName); + m_dotLua.WriteLineIndented("%s:%s()", variable->m_name.c_str(), Grammar::k_InitializeExecutionOutByRequiredCountName); m_dotLua.WriteLineIndented("%s%s = %s", leftValue.data(), variable->m_name.data(), variable->m_name.data()); break; @@ -1227,9 +1248,7 @@ namespace ScriptCanvas void GraphToLua::WriteConstructionDependencyArgs() { - auto& dependencyArgs = m_model.GetOrderedDependencies().orderedAssetIds; - - if (!dependencyArgs.empty()) + if (m_model.GetInterface().RequiresConstructionParametersForDependencies()) { m_dotLua.Write(", %s", Grammar::k_DependentAssetsArgName); } @@ -1740,7 +1759,7 @@ namespace ScriptCanvas size_t GraphToLua::WriteFunctionCallInputThisPointer(Grammar::ExecutionTreeConstPtr execution) { - if (IsUserFunctionCall(execution) && execution->GetRoot()->IsPure()) + if (IsUserFunctionCallPure(execution)) { m_dotLua.Write("%s", Grammar::k_executionStateVariableName); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h index ab80627944..3d4379d98d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLua.h @@ -111,8 +111,8 @@ namespace ScriptCanvas void TranslateFunctionBlock(Grammar::ExecutionTreeConstPtr execution, FunctionBlockConfig functionBlockConfig, IsNamed lex); void TranslateFunctionDefinition(Grammar::ExecutionTreeConstPtr execution, IsNamed lex); void TranslateInheritance(); - void TranslateNodeableOut(Grammar::ExecutionTreeConstPtr execution); - void TranslateNodeableOuts(Grammar::ExecutionTreeConstPtr execution); + void TranslateNodeableOut(Grammar::VariableConstPtr host, Grammar::ExecutionTreeConstPtr execution); + void TranslateNodeableOuts(Grammar::VariableConstPtr host, Grammar::ExecutionTreeConstPtr execution); void TranslateNodeableParse(); void TranslateStaticInitialization(); void TranslateVariableInitialization(AZStd::string_view leftValue); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLuaUtility.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLuaUtility.h index 41b6bed1b1..d340912d96 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLuaUtility.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/GraphToLuaUtility.h @@ -41,4 +41,4 @@ namespace ScriptCanvas AZStd::string ToValueString(const Datum& datum, const Configuration& config); } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationContextBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationContextBus.h index a9f80f17da..09a1530e98 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationContextBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Translation/TranslationContextBus.h @@ -40,4 +40,4 @@ namespace ScriptCanvas } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/DataUtils.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/DataUtils.h index a66b1c0667..3cce3c394b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/DataUtils.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Utils/DataUtils.h @@ -24,4 +24,4 @@ namespace ScriptCanvas static bool MatchesDynamicDataType(const DynamicDataType& dynamicDataType, const Data::Type& dataType); static AZ::Outcome<void, AZStd::string> MatchesDynamicDataTypeOutcome(const DynamicDataType& dynamicDataType, const Data::Type& dataType); }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableMarshal.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableMarshal.cpp index 115080d6e1..8d8db1d876 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableMarshal.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableMarshal.cpp @@ -242,4 +242,4 @@ namespace ScriptCanvas { m_isDirty = false; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableNetBindings.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableNetBindings.cpp index ff4cdc7ae4..e30cb95255 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableNetBindings.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/GraphVariableNetBindings.cpp @@ -178,4 +178,4 @@ namespace ScriptCanvas dataSet.GetMarshaler().SetNetBindingTable(this); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.cpp index 140eedd56e..663af6f426 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.cpp @@ -38,4 +38,4 @@ namespace ScriptCanvas } } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.h index a38312acfa..bb4655dc08 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Variable/VariableCore.h @@ -93,4 +93,4 @@ namespace AZStd return AZStd::hash<AZ::Uuid>()(ref.GetDatumId()); } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvas/Code/Source/ScriptCanvasGem.cpp b/Gems/ScriptCanvas/Code/Source/ScriptCanvasGem.cpp index 678ace2a1f..a111a65cec 100644 --- a/Gems/ScriptCanvas/Code/Source/ScriptCanvasGem.cpp +++ b/Gems/ScriptCanvas/Code/Source/ScriptCanvasGem.cpp @@ -58,4 +58,4 @@ namespace ScriptCanvas AZ_DECLARE_MODULE_CLASS(Gem_ScriptCanvas, ScriptCanvas::ScriptCanvasModule) -#endif // !SCRIPTCANVAS_EDITOR \ No newline at end of file +#endif // !SCRIPTCANVAS_EDITOR diff --git a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp index 315d786712..dd0c340357 100644 --- a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp @@ -23,7 +23,6 @@ #include <ScriptCanvas/Core/Node.h> #include <ScriptCanvas/Core/Nodeable.h> #include <ScriptCanvas/Core/Slot.h> -#include <ScriptCanvas/Data/DataRegistry.h> #include <ScriptCanvas/Execution/ExecutionPerformanceTimer.h> #include <ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h> #include <ScriptCanvas/Execution/RuntimeComponent.h> @@ -37,10 +36,10 @@ namespace ScriptCanvasSystemComponentCpp { #if !defined(_RELEASE) && !defined(PERFORMANCE_BUILD) - const int k_infiniteLoopDetectionMaxIterations = 3000; + const int k_infiniteLoopDetectionMaxIterations = 1000000; const int k_maxHandlerStackDepth = 25; #else - const int k_infiniteLoopDetectionMaxIterations = 10000; + const int k_infiniteLoopDetectionMaxIterations = 10000000; const int k_maxHandlerStackDepth = 100; #endif @@ -285,6 +284,72 @@ namespace ScriptCanvas m_ownedObjectsByAddress.erase(object); } + AZStd::pair<DataRegistry::Createability, TypeProperties> SystemComponent::GetCreatibility(AZ::SerializeContext* serializeContext, AZ::BehaviorClass* behaviorClass) + { + TypeProperties typeProperties; + + bool canCreate{}; + // BehaviorContext classes with the ExcludeFrom attribute with a value of the ExcludeFlags::List is not creatable + const AZ::u64 exclusionFlags = AZ::Script::Attributes::ExcludeFlags::List; + auto excludeClassAttributeData = azrtti_cast<const AZ::Edit::AttributeData<AZ::Script::Attributes::ExcludeFlags>*>(AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, behaviorClass->m_attributes)); + + const AZ::u64 flags = excludeClassAttributeData ? excludeClassAttributeData->Get(nullptr) : 0; + bool listOnly = ((flags & AZ::Script::Attributes::ExcludeFlags::ListOnly) == AZ::Script::Attributes::ExcludeFlags::ListOnly); // ListOnly exclusions may create variables + canCreate = listOnly || (!excludeClassAttributeData || (!(flags & exclusionFlags))); + canCreate = canCreate && (serializeContext->FindClassData(behaviorClass->m_typeId)); + canCreate = canCreate && !ScriptCanvasSystemComponentCpp::IsDeprecated(behaviorClass->m_attributes); + + if (canCreate) + { + for (auto base : behaviorClass->m_baseClasses) + { + if (AZ::Component::TYPEINFO_Uuid() == base) + { + canCreate = false; + break; // only out of the for : base classes loop. DO NOT break out of the parent loop. + } + } + } + + // Assets are not safe enough for variable creation, yet. They can be created with one Az type (Data::Asset<T>), but set to nothing. + // When read back in, they will (if lucky) just be Data::Asset<Data>, which breaks type safety at best, and requires a lot of sanity checking. + // This is NOT blacked at the createable types or BehaviorContext level, since they could be used to at least pass information through, + // and may be used other scripting contexts. + AZ::IRttiHelper* rttiHelper = behaviorClass->m_azRtti; + if (rttiHelper && rttiHelper->GetGenericTypeId() == azrtti_typeid<AZ::Data::Asset>()) + { + canCreate = false; + } + + if (AZ::FindAttribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, behaviorClass->m_attributes)) + { + canCreate = true; + typeProperties.m_isTransient = true; + } + + // create able variables must have full memory support + canCreate = canCreate && + (behaviorClass->m_allocate + && behaviorClass->m_cloner + && behaviorClass->m_mover + && behaviorClass->m_destructor + && behaviorClass->m_deallocate) && + AZStd::none_of(behaviorClass->m_baseClasses.begin(), behaviorClass->m_baseClasses.end(), [](const AZ::TypeId& base) { return azrtti_typeid<AZ::Component>() == base; }); + + if (!canCreate) + { + return { DataRegistry::Createability::None , TypeProperties{} }; + } + else if (!AZ::FindAttribute(AZ::ScriptCanvasAttributes::VariableCreationForbidden, behaviorClass->m_attributes)) + { + return { DataRegistry::Createability::SlotAndVariable, typeProperties }; + } + else + { + return { DataRegistry::Createability::SlotOnly, typeProperties }; + } + } + void SystemComponent::RegisterCreatableTypes() { AZ::SerializeContext* serializeContext{}; @@ -297,40 +362,11 @@ namespace ScriptCanvas auto dataRegistry = ScriptCanvas::GetDataRegistry(); for (const auto& classIter : behaviorContext->m_classes) { - TypeProperties typeProperties; - - bool canCreate{}; - const AZ::BehaviorClass* behaviorClass = classIter.second; - // BehaviorContext classes with the ExcludeFrom attribute with a value of the ExcludeFlags::List is not creatable - const AZ::u64 exclusionFlags = AZ::Script::Attributes::ExcludeFlags::List; - auto excludeClassAttributeData = azrtti_cast<const AZ::Edit::AttributeData<AZ::Script::Attributes::ExcludeFlags>*>(AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, behaviorClass->m_attributes)); - - const AZ::u64 flags = excludeClassAttributeData ? excludeClassAttributeData->Get(nullptr) : 0; - bool listOnly = ((flags & AZ::Script::Attributes::ExcludeFlags::ListOnly) == AZ::Script::Attributes::ExcludeFlags::ListOnly); // ListOnly exclusions may create variables - - canCreate = listOnly || (!excludeClassAttributeData || (!(flags & exclusionFlags))); - canCreate = canCreate && (serializeContext->FindClassData(behaviorClass->m_typeId)); - canCreate = canCreate && !ScriptCanvasSystemComponentCpp::IsDeprecated(behaviorClass->m_attributes); - - if (AZ::FindAttribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, behaviorClass->m_attributes)) - { - canCreate = true; - typeProperties.m_isTransient = true; - } - - // create able variables must have full memory support - canCreate = canCreate && - ( behaviorClass->m_allocate - && behaviorClass->m_cloner - && behaviorClass->m_mover - && behaviorClass->m_destructor - && behaviorClass->m_deallocate) && - AZStd::none_of(behaviorClass->m_baseClasses.begin(), behaviorClass->m_baseClasses.end(), [](const AZ::TypeId& base) { return azrtti_typeid<AZ::Component>() == base; }); - - if (canCreate) - { - dataRegistry->RegisterType(behaviorClass->m_typeId, typeProperties); - } + auto createability = GetCreatibility(serializeContext, classIter.second); + if (createability.first != DataRegistry::Createability::None) + { + dataRegistry->RegisterType(classIter.second->m_typeId, createability.second, createability.first); + } } } @@ -339,33 +375,19 @@ namespace ScriptCanvas auto dataRegistry = ScriptCanvas::GetDataRegistry(); if (!dataRegistry) { + AZ_Warning("ScriptCanvas", false, "Data registry not available. Can't register new class."); + return; } + AZ::SerializeContext* serializeContext{}; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); - AZ_Assert(serializeContext, "Serialize Context should not be missing at this point"); + AZ_Assert(serializeContext, "Serialize Context missing. Can't register new class."); - TypeProperties typeProperties; - - // BehaviorContext classes with the ExcludeFrom attribute with a value of the ExcludeFlags::List is not creatable - const AZ::u64 exclusionFlags = AZ::Script::Attributes::ExcludeFlags::List; - auto excludeClassAttributeData = azrtti_cast<const AZ::Edit::AttributeData<AZ::Script::Attributes::ExcludeFlags>*>(AZ::FindAttribute(AZ::Script::Attributes::ExcludeFrom, behaviorClass->m_attributes)); - bool canCreate = !excludeClassAttributeData || !(excludeClassAttributeData->Get(nullptr) & exclusionFlags); - canCreate = canCreate && (serializeContext->FindClassData(behaviorClass->m_typeId) || AZ::FindAttribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, behaviorClass->m_attributes)); - canCreate = canCreate && !ScriptCanvasSystemComponentCpp::IsDeprecated(behaviorClass->m_attributes); - - // create able variables must have full memory support - canCreate = canCreate && - (behaviorClass->m_allocate - && behaviorClass->m_cloner - && behaviorClass->m_mover - && behaviorClass->m_destructor - && behaviorClass->m_deallocate) && - AZStd::none_of(behaviorClass->m_baseClasses.begin(), behaviorClass->m_baseClasses.end(), [](const AZ::TypeId& base) { return azrtti_typeid<AZ::Component>() == base; }); - - if (canCreate) + auto createability = GetCreatibility(serializeContext, behaviorClass); + if (createability.first != DataRegistry::Createability::None) { - dataRegistry->RegisterType(behaviorClass->m_typeId, typeProperties); + dataRegistry->RegisterType(behaviorClass->m_typeId, createability.second, createability.first); } } diff --git a/Gems/ScriptCanvas/gem.json b/Gems/ScriptCanvas/gem.json index 4c44350cc7..df3be75ab9 100644 --- a/Gems/ScriptCanvas/gem.json +++ b/Gems/ScriptCanvas/gem.json @@ -27,4 +27,4 @@ "_comment": "ExpressionEvaluation" } ] -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h index 6518b0c1b8..9f578c10f7 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h @@ -141,4 +141,4 @@ namespace ScriptCanvasDeveloper AZStd::vector<SlotId> m_pendingConfigRemovals; }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/MockBus.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/MockBus.h index 80a2c3eb32..07172cc160 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/MockBus.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/MockBus.h @@ -39,4 +39,4 @@ namespace ScriptCanvasDeveloper using MockDescriptorNotificationBus = AZ::EBus<MockDescriptorNotifications>; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h index 20f5d7670e..52a89e31e7 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h @@ -66,4 +66,4 @@ namespace ScriptCanvasDeveloper AZStd::unordered_map< GraphCanvas::NodeId, AZ::EntityId > m_graphCanvasMapping; }; } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/Developer.cpp b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/Developer.cpp index d0793b5875..4b5d247834 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/Developer.cpp +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/Developer.cpp @@ -54,4 +54,4 @@ namespace ScriptCanvasDeveloper }); } } -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasDeveloper/Code/Tests/ScriptCanvasDeveloperTest.cpp b/Gems/ScriptCanvasDeveloper/Code/Tests/ScriptCanvasDeveloperTest.cpp index 3185220132..f23fc9f6cb 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Tests/ScriptCanvasDeveloperTest.cpp +++ b/Gems/ScriptCanvasDeveloper/Code/Tests/ScriptCanvasDeveloperTest.cpp @@ -41,4 +41,4 @@ TEST_F(ScriptCanvasDeveloperTest, Sanity_Pass) } -AZ_UNIT_TEST_HOOK(); \ No newline at end of file +AZ_UNIT_TEST_HOOK(); diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp b/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp index 07c726331b..6fdd7bdc45 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.cpp @@ -10,4 +10,4 @@ * */ -#include "precompiled.h" \ No newline at end of file +#include "precompiled.h" diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h b/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h index 084566c0ca..01688d8dc7 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/Source/precompiled.h @@ -25,4 +25,4 @@ #else -#endif \ No newline at end of file +#endif diff --git a/Gems/ScriptCanvasDiagnosticLibrary/Code/Tests/ScriptCanvasDiagnosticLibraryTest.cpp b/Gems/ScriptCanvasDiagnosticLibrary/Code/Tests/ScriptCanvasDiagnosticLibraryTest.cpp index da45b187f8..4052b9dee4 100644 --- a/Gems/ScriptCanvasDiagnosticLibrary/Code/Tests/ScriptCanvasDiagnosticLibraryTest.cpp +++ b/Gems/ScriptCanvasDiagnosticLibrary/Code/Tests/ScriptCanvasDiagnosticLibraryTest.cpp @@ -41,4 +41,4 @@ TEST_F(ScriptCanvasDiagnosticLibraryTest, Sanity_Pass) } -AZ_UNIT_TEST_HOOK(); \ No newline at end of file +AZ_UNIT_TEST_HOOK(); diff --git a/Gems/ScriptCanvasPhysics/Code/Source/PhysicsNodeLibrary.h b/Gems/ScriptCanvasPhysics/Code/Source/PhysicsNodeLibrary.h index 3a0d650d16..c618dad3c4 100644 --- a/Gems/ScriptCanvasPhysics/Code/Source/PhysicsNodeLibrary.h +++ b/Gems/ScriptCanvasPhysics/Code/Source/PhysicsNodeLibrary.h @@ -31,4 +31,4 @@ namespace ScriptCanvasPhysics static void InitNodeRegistry(ScriptCanvas::NodeRegistry& nodeRegistry); static AZStd::vector<AZ::ComponentDescriptor*> GetComponentDescriptors(); }; -} // namespace ScriptCanvasPhysics \ No newline at end of file +} // namespace ScriptCanvasPhysics diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionCycle10.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionCycle10.scriptcanvas new file mode 100644 index 0000000000..81af42910c --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionCycle10.scriptcanvas @@ -0,0 +1,3216 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24034832917361" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_ExecutionCycle10" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6571535133870744578" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24039127884657" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="231457506464632010" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{39108B6D-FD0C-4699-9ABA-2DD5948AC134}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{686D6185-BBD8-40D2-8742-11A084917794}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{D49B6BBD-54A4-4F98-A6CB-2D8954842DD9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24043422851953" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="300012501469391999" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6D1636C0-842F-489E-9FC9-E2288430AE18}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B080372D-CF11-4306-8FA0-74A30AAB34D4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{EC97EF9A-9A1F-4D5F-A628-FB81A80B9E19}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Cycle)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Cycle" field="element" type="{974258F5-EE1B-4AEE-B956-C7B303801847}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4962443026073947036" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1811D879-4DAA-4360-AA43-98F4A217D3B7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5DF41C1C-D0BE-4AB1-80AF-780B473F54F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Output 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9312B1FD-6623-4F35-B7EA-A1A0AB052E21}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3CEB28EE-83E9-4611-BC3E-220AD2EBB363}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7B128BF2-1294-44C5-AD7B-52342F27BA64}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BA15F2E5-D81B-4D31-A41C-EB2220FBADAF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D97F156-780A-4B55-92A3-078BB91B96A0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{774E7DA4-735F-474C-A460-ED102A2933FB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9DE7971F-0FA6-4C7F-898F-51D5F11078CC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{38023ED5-2ABC-422D-8D5A-79F2200C7CBC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9A3FBC4-43A9-4F74-B528-8663E2391371}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out 9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1020632324" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24052012786545" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13472499544374311683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FBB98497-D520-40A6-B6EA-C192483423B2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2576CB5F-613C-455A-88A2-1C7AE304B299}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{C5F2BDD5-DB4E-46BB-AC18-C12D63053CB5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24056307753841" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="17138225739278384487" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D75C993F-6E77-442D-B294-C8115CA68ADE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{94D7E689-4A71-45E8-B9CE-F41DF1DF75A5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="New Input" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{F23F2E68-E248-4B64-867F-AFEAE1C5F410}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24060602721137" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13599030359755569927" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D692CDA0-4DAE-45FA-B4E0-82A441003C5B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7B44D940-9148-4B45-80D7-7291122741B9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{7488E694-CF0F-466D-A35C-D9029E6E1CAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24064897688433" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7395027362843708591" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{03E23FB0-EBD5-4ECA-A2BC-4842E2456F6E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{93F72CDE-B2BC-422D-9EF8-577346D46597}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{560B0EE1-2AF2-4853-ABC8-8E5F6AE9EF69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24069192655729" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="17707596372115241930" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F27E0AE8-9FB6-4F66-9493-027612795894}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C6537112-56F2-401A-BF37-42EBD81EB551}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{36EC80A4-2D4C-489F-9AE1-EA92603AA3AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24073487623025" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6591042316409852095" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{77552F75-B57E-42A0-BC7D-6695E0BD33D9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{97ABE1CC-9AB0-48E0-BD6D-5A73941AF9B9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{B53A7403-3F29-4A72-B4FE-856357AF0CA1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24077782590321" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15487157420376638056" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E1388F05-3EC4-4109-B288-CA9107656D44}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{534C6E04-4BA5-41C6-8CEF-B215D46EBACB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{5197B195-9847-4696-8171-C11EA8783E2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24082077557617" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4651505437919141318" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F5A5D7C7-7F0C-41D7-A0D4-944A65007B68}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D89796B5-7A19-465B-BC0D-D78621AD5032}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{2B4D20B6-6AC0-4710-945E-E127622D22DB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24086372524913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(OperatorAdd)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="OperatorAdd" field="element" type="{C1B42FEC-0545-4511-9FAC-11E0387FEDF0}"> + <Class name="OperatorArithmetic" field="BaseClass1" version="1" type="{FE0589B0-F835-4CD5-BBD3-86510CBB985B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="286972003137058640" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C79314E-431B-45FB-AF1F-DC4BC037CBB4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A5E2EEB6-56D7-4492-A696-C14B9C6F4DAA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6D07D071-5078-4937-9D25-4198BCA06AA5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="An operand to use in performing the specified Operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{4EA64DC2-6CE4-4971-BF81-73FC9E38C501}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{77614E16-4395-4CB0-A10E-5357B3F09451}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="An operand to use in performing the specified Operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{45973CC1-E836-453A-9155-1C43453AE4E6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Result" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="The result of the specified operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{4EA64DC2-6CE4-4971-BF81-73FC9E38C501}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24090667492209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1619858450106398240" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{621E0C48-B944-46CB-A0DE-CE8FBA21A6AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{09337D6B-E5EF-4001-81A8-41284B8287F8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Cycle : Out 8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{3B6A8103-75CA-474E-80D1-8F6D55AE4536}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24094962459505" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 0), destEndpoint=(Cycle : Out 0: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3949217833837904520" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5DF41C1C-D0BE-4AB1-80AF-780B473F54F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24082077557617" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F5A5D7C7-7F0C-41D7-A0D4-944A65007B68}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24099257426801" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 1), destEndpoint=(Cycle : Out 1: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1821559268027891028" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9312B1FD-6623-4F35-B7EA-A1A0AB052E21}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24073487623025" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{77552F75-B57E-42A0-BC7D-6695E0BD33D9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24103552394097" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 2), destEndpoint=(Cycle : Out 2: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11555589687672866993" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3CEB28EE-83E9-4611-BC3E-220AD2EBB363}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24039127884657" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{39108B6D-FD0C-4699-9ABA-2DD5948AC134}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24107847361393" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 3), destEndpoint=(Cycle : Out 3: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16439354976112058676" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7B128BF2-1294-44C5-AD7B-52342F27BA64}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24043422851953" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6D1636C0-842F-489E-9FC9-E2288430AE18}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24112142328689" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 4), destEndpoint=(Cycle : Out 4: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10870245039772806165" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BA15F2E5-D81B-4D31-A41C-EB2220FBADAF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24052012786545" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FBB98497-D520-40A6-B6EA-C192483423B2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24116437295985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 5), destEndpoint=(Cycle : Out 5: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14582087168292455360" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D97F156-780A-4B55-92A3-078BB91B96A0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24060602721137" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D692CDA0-4DAE-45FA-B4E0-82A441003C5B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24120732263281" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 6), destEndpoint=(Cycle : Out 6: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8762272658681556522" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{774E7DA4-735F-474C-A460-ED102A2933FB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24064897688433" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{03E23FB0-EBD5-4ECA-A2BC-4842E2456F6E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24125027230577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 7), destEndpoint=(Cycle : Out 7: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15082870043040884105" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9DE7971F-0FA6-4C7F-898F-51D5F11078CC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24077782590321" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E1388F05-3EC4-4109-B288-CA9107656D44}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24129322197873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 8), destEndpoint=(Cycle : Out 8: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1577668504035211787" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{38023ED5-2ABC-422D-8D5A-79F2200C7CBC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24090667492209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{621E0C48-B944-46CB-A0DE-CE8FBA21A6AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24133617165169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Cycle: Out 9), destEndpoint=(Cycle : Out 9: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11401813353737964711" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9A3FBC4-43A9-4F74-B528-8663E2391371}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24069192655729" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F27E0AE8-9FB6-4F66-9493-027612795894}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24137912132465" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(New Input: ), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15811979562692611686" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24056307753841" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{94D7E689-4A71-45E8-B9CE-F41DF1DF75A5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24086372524913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C79314E-431B-45FB-AF1F-DC4BC037CBB4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24142207099761" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Add (+): Out), destEndpoint=(Cycle: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15140392189412230076" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24086372524913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A5E2EEB6-56D7-4492-A696-C14B9C6F4DAA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1811D879-4DAA-4360-AA43-98F4A217D3B7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-E7EF-7F5FD03954FC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24077782590321" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1200.0000000 740.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{2F080428-9539-496E-9BBE-35E0AF6DE6C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24047717819249" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="580.0000000 240.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="LogicNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{D7141549-3918-4190-99CF-86D6AE865C14}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24034832917361" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="0.6640885" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="281.5889893" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="99.3843460" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24064897688433" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1320.0000000 620.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{96E90B40-85E5-4C5C-8D18-EECD1C17BB84}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24090667492209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1060.0000000 860.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{F2F2BFC9-9324-4D5C-A5B7-39055FAF8769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24060602721137" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1320.0000000 500.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{0BEA3925-18BA-47CF-8701-0AC972E52C87}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24069192655729" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="760.0000000 880.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{3498A512-65E5-4EF8-9CEE-CCBF785F9D9A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24039127884657" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1320.0000000 160.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{DE30BA79-D528-4D68-8CD9-C3CFDE6CC8CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24056307753841" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-40.0000000 40.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{5D0F81CD-D6BF-4D5C-AAC0-6D711B68A6C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24086372524913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{8F515C6F-1A0F-406F-B602-063F76FEC3AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MathNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-40.0000000 240.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24052012786545" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1340.0000000 400.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{F48934F3-E0D3-470C-BC58-72684CAC342E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24082077557617" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="740.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{56A1924A-8148-45A4-8E84-43B069331533}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24043422851953" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1340.0000000 280.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{42683FEF-14C3-409C-BDE6-E4125DDCC270}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="24073487623025" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1040.0000000 120.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{358E7881-FAD1-48C1-8531-083C41FC0452}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="11" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="1244476766431948410" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="17170567245090241616" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15689091942531117650" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{4EA64DC2-6CE4-4971-BF81-73FC9E38C501}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="count" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{4EA64DC2-6CE4-4971-BF81-73FC9E38C501}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="count" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionOutPerformance.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionOutPerformance.scriptcanvas new file mode 100644 index 0000000000..9ec8c01d35 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_ExecutionOutPerformance.scriptcanvas @@ -0,0 +1,5753 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34286919852913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_ExecutionOutPerformance" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14798455556932944677" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34291214820209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC Node(SetVariable)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="SetVariableNode" field="element" version="1" type="{5EFD2942-AFF9-4137-939C-023AEAA72EB0}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7309622534718952288" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6B05913B-6D9D-41BA-B350-B2ED7FA5BDC8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="When signaled sends the variable referenced by this node to a Data Output slot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A3C477A5-714B-45EF-B482-6BD95AFB82DD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled after the referenced variable has been pushed to the Data Output slot" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E8053413-636A-4E29-BDAB-C85BB1E54755}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Boolean" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{685B866F-FE2A-40E3-B827-F632CAD77901}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Boolean" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Boolean" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="VariableId" field="m_variableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{E0FC20D3-23FD-42DF-ADA5-B0EBAC4D5309}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_variableDataInSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E8053413-636A-4E29-BDAB-C85BB1E54755}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_variableDataOutSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{685B866F-FE2A-40E3-B827-F632CAD77901}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_propertyAccounts" type="{3BEC267E-B4D3-588E-B183-954A20D83BDD}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34295509787505" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare8)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14919024213595562113" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{630B3F95-22C6-46E8-8417-7F154EE2E294}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{75E009FF-35A3-4D61-A076-EE412BD399CB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34299804754801" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Start" field="element" version="2" type="{F200B22A-5903-483A-BF63-5241BC03632B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="18438668922672769349" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2156CEDC-A88C-4E32-9BAA-8B21C93A432C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when the entity that owns this graph is fully activated." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34304099722097" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare1)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12011826511803795247" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C7B398BB-37BD-4D6E-B584-DC29E0198807}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CD1D00C1-42C6-4D1C-AB7F-D985EE114158}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34308394689393" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Mark Complete)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8801483587718085462" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7210046F-CDF8-4313-847D-0B91CA38EB46}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{EA8C75AD-E94E-4271-870B-BFFC557C1A00}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9AD7C840-2D7A-454E-84FB-98B688FF7D2E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{46938C11-A85C-4663-B6A0-44950A6BCBF0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Mark Complete" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34312689656689" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare0)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7237459212439082899" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{42CC4859-6565-402C-8AFA-729BEEBDF249}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4522D3E3-B785-4C38-9A59-9AB60A18D508}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(OperatorAdd)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="OperatorAdd" field="element" type="{C1B42FEC-0545-4511-9FAC-11E0387FEDF0}"> + <Class name="OperatorArithmetic" field="BaseClass1" version="1" type="{FE0589B0-F835-4CD5-BBD3-86510CBB985B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4061757306078902625" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{37EF5A16-FAFD-467A-A685-E6701BF80DF0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A7C3FCC0-DFE0-4920-8A1A-18B0A82FE743}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="An operand to use in performing the specified Operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{36654436-671D-4F4A-9287-AA639201DE8B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E3843799-5626-4196-B47F-1A2EC7DA01BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="An operand to use in performing the specified Operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5CDBB06B-CC31-4BE3-9265-031422444518}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="MathOperatorContract" field="element" version="1" type="{17B1AEA6-B36B-4EE5-83E9-4563CAC79889}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="AZStd::string" field="OperatorType" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::unordered_set" field="NativeTypes" type="{2A8293DA-3587-5E58-8D7A-FA303290D99F}"> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="6" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="11" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="15" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="14" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="10" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="8" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Type" field="element" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="12" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Result" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="The result of the specified operation" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1114760223" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{36654436-671D-4F4A-9287-AA639201DE8B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34321279591281" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare2)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7510401417958133790" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7B71BA2D-1213-421A-BBF7-21667894FE40}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D71780FE-FBC5-43FA-B4BD-048CD9E6F829}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34325574558577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(EqualTo)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="EqualTo" field="element" type="{02A3A3E6-9D80-432B-8AF5-F3AF24CF6959}"> + <Class name="EqualityExpression" field="BaseClass1" type="{78D20EB6-BA07-4071-B646-7C2D68A0A4A6}"> + <Class name="BooleanExpression" field="BaseClass1" type="{36C69825-CFF8-4F70-8F3B-1A9227E8BEEA}"> + <Class name="BinaryOperator" field="BaseClass1" type="{5BD0E8C7-9B0A-42F5-9EB0-199E6EC8FA99}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="2095343925933247030" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2EB5EAFE-45C3-4AB1-AAD8-4C66B93940E7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Result" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4ADEE9CC-DEA4-4630-9EAE-3CB4FCC279DC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signal to perform the evaluation when desired." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8C1FB727-B330-4176-A0A6-3B0B731D5204}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is true." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D61F299-D8F0-4B76-A53F-D8614E2C2BCC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is false." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5984247B-1B28-4B3C-9D3E-38EE7874307A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{36654436-671D-4F4A-9287-AA639201DE8B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{ABA36E1A-FE2E-4B32-AE8D-D966DF02DFAE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{C2417605-B90A-47DF-A5D6-FC79C5D4B5C5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="EBusEventHandler" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="EBusEventHandler" field="element" version="5" type="{33E12915-EFCA-4AA7-A188-D694DAD58980}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5377446763920135448" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FFEEA3ED-5317-4A63-9EA0-62885FC5B349}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Connect" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Connect this event handler to the specified entity." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{64413DEE-1BE7-4210-80FE-3768F372C283}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Disconnect" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Disconnect this event handler." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{04538BE3-6660-4E62-BD52-5F99FC61CD64}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="OnConnected" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when a connection has taken place." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A9CFC76E-8F0C-4164-ADBE-96E7DB09BF35}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="OnDisconnected" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when this event handler is disconnected." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6E8C95CC-BA63-4699-B467-749265E1419F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="OnFailure" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when it is not possible to connect this handler." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5476A290-120E-4624-B979-2C07177C01A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6880DECD-1220-4BC1-8414-B0C5C31E73A6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7E4791CB-B140-447C-97BE-BC5BDD14AFA4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A6F9BF49-F845-4C1A-B358-BB2971F6DACE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4CB231A0-7F71-49D4-AA76-F93D22A188B6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E18E493-3964-44D2-8D44-3381C44E118A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{46377097-E4D4-47BB-8577-F34A34BD5B21}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{131D3154-632A-47D3-BC1F-85E5285FC2AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D369EB94-DD8E-4F65-A516-A0FDBDBB9545}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F2FCBB0D-9450-46D2-B79B-16CECE2AAE73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="ExecutionSlot:ForceStringCompare9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::map" field="m_eventMap" type="{E3F40B9E-9589-5736-8135-A35819EB700E}"> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="155513494" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="155513494" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A6F9BF49-F845-4C1A-B358-BB2971F6DACE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="237581967" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="237581967" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{131D3154-632A-47D3-BC1F-85E5285FC2AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2033059353" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2033059353" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{46377097-E4D4-47BB-8577-F34A34BD5B21}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2118369792" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2118369792" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7E4791CB-B140-447C-97BE-BC5BDD14AFA4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2421007148" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2421007148" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5476A290-120E-4624-B979-2C07177C01A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2535483189" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2535483189" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4CB231A0-7F71-49D4-AA76-F93D22A188B6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2660641566" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2660641566" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D369EB94-DD8E-4F65-A516-A0FDBDBB9545}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3760674723" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3760674723" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E18E493-3964-44D2-8D44-3381C44E118A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3880424378" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3880424378" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6880DECD-1220-4BC1-8414-B0C5C31E73A6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{220A15CE-9196-5EEA-A8CF-72AF80F1F6A9}"> + <Class name="Crc32" field="value1" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3918601096" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="EBusEventEntry" field="value2" version="1" type="{92A20C1B-A54A-4583-97DB-A894377ACE21}"> + <Class name="AZStd::string" field="m_eventName" value="ForceStringCompare9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_eventId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3918601096" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotId" field="m_eventSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F2FCBB0D-9450-46D2-B79B-16CECE2AAE73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="m_resultSlotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="m_parameterSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"/> + <Class name="int" field="m_numExpectedArguments" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="m_resultEvaluated" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_ebusName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Crc32" field="m_busId" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="678608116" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="bool" field="m_autoConnectToGraphOwner" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="62140919384716312" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0D4F915-A8E0-4020-B848-400BA7CE9EED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="New Input" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33C19124-3E10-4C70-88DD-339D1B018DFB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3B50C804-20EB-4D21-B608-23E3A305D001}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E6A883A8-16FD-4032-AD07-6A8823AA5F69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E7AF4354-E597-4BF1-9541-021A5D392AFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3A82D8B4-B77D-4A94-A4F5-1B330C28EDA7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5DD61551-9A73-47B6-9F66-D62A8F7440A2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3309BD23-83FF-4777-9B72-B49230933EFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1EBDD2B5-E9D1-47AF-A57A-AAF069F2B65D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E1114E94-FFE6-4A18-B897-BD7403FAFEF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CD6D8267-7A38-4BB0-9E08-C61DE4E705E4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Cycle : Out 9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3670724126" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{F09EC8A3-FB7F-0000-8C46-2ECA30FC71AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={11009E3D-639A-5C9F-96BC-0AE99251D844}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_executioncycle10.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0D4F915-A8E0-4020-B848-400BA7CE9EED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33C19124-3E10-4C70-88DD-339D1B018DFB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{2B4D20B6-6AC0-4710-945E-E127622D22DB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3B50C804-20EB-4D21-B608-23E3A305D001}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{B53A7403-3F29-4A72-B4FE-856357AF0CA1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E6A883A8-16FD-4032-AD07-6A8823AA5F69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{D49B6BBD-54A4-4F98-A6CB-2D8954842DD9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E7AF4354-E597-4BF1-9541-021A5D392AFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{EC97EF9A-9A1F-4D5F-A628-FB81A80B9E19}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3A82D8B4-B77D-4A94-A4F5-1B330C28EDA7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{C5F2BDD5-DB4E-46BB-AC18-C12D63053CB5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5DD61551-9A73-47B6-9F66-D62A8F7440A2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{7488E694-CF0F-466D-A35C-D9029E6E1CAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3309BD23-83FF-4777-9B72-B49230933EFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{560B0EE1-2AF2-4853-ABC8-8E5F6AE9EF69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1EBDD2B5-E9D1-47AF-A57A-AAF069F2B65D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{5197B195-9847-4696-8171-C11EA8783E2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E1114E94-FFE6-4A18-B897-BD7403FAFEF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{3B6A8103-75CA-474E-80D1-8F6D55AE4536}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CD6D8267-7A38-4BB0-9E08-C61DE4E705E4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Cycle : Out 9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{36EC80A4-2D4C-489F-9AE1-EA92603AA3AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="NewInput_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{F23F2E68-E248-4B64-867F-AFEAE1C5F410}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="New Input" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="NewInput_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{2B4D20B6-6AC0-4710-945E-E127622D22DB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{B53A7403-3F29-4A72-B4FE-856357AF0CA1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut2" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{D49B6BBD-54A4-4F98-A6CB-2D8954842DD9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{EC97EF9A-9A1F-4D5F-A628-FB81A80B9E19}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{C5F2BDD5-DB4E-46BB-AC18-C12D63053CB5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{7488E694-CF0F-466D-A35C-D9029E6E1CAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{560B0EE1-2AF2-4853-ABC8-8E5F6AE9EF69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{5197B195-9847-4696-8171-C11EA8783E2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut8" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{3B6A8103-75CA-474E-80D1-8F6D55AE4536}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Cycle : Out 9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="CycleOut9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{36EC80A4-2D4C-489F-9AE1-EA92603AA3AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{F23F2E68-E248-4B64-867F-AFEAE1C5F410}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1146643095" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="861884929" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2857763771" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3713086253" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1127589518" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="875730456" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2906376098" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3661428532" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1250159269" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1032116787" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="scriptcanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="unittests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="ly_sc_unittest_executioncycle10_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34338459460465" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare6)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7229110679494214936" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DA4AE0CC-EEBB-4F57-AD89-A32CD7BB00A0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{433A333D-87F5-48FE-B7D4-02DFFDB1E743}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare6" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34342754427761" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare3)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12707656951406144988" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{52F30833-B756-43EA-B893-762996BAD754}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C5418C94-3B19-4FF0-81E2-A31905FBEA1F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34347049395057" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare4)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="2733418282104887234" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{32D46258-870D-4E6A-8717-38EB82562346}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{58F8AD2A-8C72-4E67-AF1C-22BA14CF4BF5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare4" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34351344362353" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(While)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="While" field="element" type="{C5BDF392-9669-4928-A0F5-F55B8A5B3BAC}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16262960001195467277" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A0F294EF-0648-4A6B-B572-01045DE05FE2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Condition" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="While this condition is true, Loop will signal, otherwise, Out will." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{E0FC20D3-23FD-42DF-ADA5-B0EBAC4D5309}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F7B40A90-A55A-4C8E-B1CA-0136CCE60DE5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{048D670E-9F1E-4A5E-98EF-EA47C6C06F26}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signalled if the condition is false, or if the loop calls the break node" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FC0611F6-AA87-48A4-8011-13B399D592B5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Loop" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signalled if the condition is true, and every time the last node of 'Loop' finishes" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Condition" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34355639329649" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare9)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16764550162392525836" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8C4F92C-B02C-49BE-B7AC-4920D7994B73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CAD7621D-FB03-4718-A235-CF957C12472A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare9" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34359934296945" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare7)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15256176343563112317" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5A72A911-6F8F-4FBA-9BFF-16AE9EEE3BF1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DBF9AE50-A94F-4306-8EC0-DCC7E1DEB077}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare7" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34364229264241" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(ForceStringCompare5)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6356770533381444073" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BD81D837-B9DC-44C0-8408-5B2B03668338}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{95EF4B8F-654E-4294-8783-AD123C7052B0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="ForceStringCompare5" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="PerformanceStressEBus" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34368524231537" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(On Graph Start: Out), destEndpoint=(While: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13350740475277789897" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34299804754801" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2156CEDC-A88C-4E32-9BAA-8B21C93A432C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34351344362353" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F7B40A90-A55A-4C8E-B1CA-0136CCE60DE5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34372819198833" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Add (+): Out), destEndpoint=(Equal To (==): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13437218436462898844" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{37EF5A16-FAFD-467A-A685-E6701BF80DF0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34325574558577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4ADEE9CC-DEA4-4630-9EAE-3CB4FCC279DC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34377114166129" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): True), destEndpoint=(Set Variable: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5105874669677142148" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34325574558577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8C1FB727-B330-4176-A0A6-3B0B731D5204}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34291214820209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6B05913B-6D9D-41BA-B350-B2ED7FA5BDC8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34381409133425" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(While: Out), destEndpoint=(Mark Complete: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7294768134060640692" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34351344362353" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{048D670E-9F1E-4A5E-98EF-EA47C6C06F26}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34308394689393" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9AD7C840-2D7A-454E-84FB-98B688FF7D2E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34385704100721" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare3), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="908119725739496297" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A6F9BF49-F845-4C1A-B358-BB2971F6DACE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34389999068017" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare7), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10158649226418371822" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{131D3154-632A-47D3-BC1F-85E5285FC2AE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34394294035313" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare6), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="477165002842784159" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{46377097-E4D4-47BB-8577-F34A34BD5B21}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34398589002609" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare2), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5227385701130505004" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7E4791CB-B140-447C-97BE-BC5BDD14AFA4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34402883969905" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare0), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16999799460204066187" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5476A290-120E-4624-B979-2C07177C01A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34407178937201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare4), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5540021479805551085" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4CB231A0-7F71-49D4-AA76-F93D22A188B6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34411473904497" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare8), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="18243034122605890757" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D369EB94-DD8E-4F65-A516-A0FDBDBB9545}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34415768871793" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare5), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11262933789558327723" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E18E493-3964-44D2-8D44-3381C44E118A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34420063839089" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare1), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4693971132318181726" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6880DECD-1220-4BC1-8414-B0C5C31E73A6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34424358806385" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(PerformanceStressEBus Handler: ExecutionSlot:ForceStringCompare9), destEndpoint=(Add (+): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12265280187133221365" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F2FCBB0D-9450-46D2-B79B-16CECE2AAE73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FEED16A-E8E4-4404-8252-BFB828717CE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34428653773681" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(While: Loop), destEndpoint=(Function Call Node: New Input)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="2759172179355450754" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34351344362353" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FC0611F6-AA87-48A4-8011-13B399D592B5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0D4F915-A8E0-4020-B848-400BA7CE9EED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34432948740977" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 0), destEndpoint=(ForceStringCompare0: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10755161076559491356" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33C19124-3E10-4C70-88DD-339D1B018DFB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34312689656689" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{42CC4859-6565-402C-8AFA-729BEEBDF249}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34437243708273" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 1), destEndpoint=(ForceStringCompare1: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7239062801293922356" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3B50C804-20EB-4D21-B608-23E3A305D001}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34304099722097" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C7B398BB-37BD-4D6E-B584-DC29E0198807}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34441538675569" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 2), destEndpoint=(ForceStringCompare2: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="932703222647348506" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E6A883A8-16FD-4032-AD07-6A8823AA5F69}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34321279591281" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7B71BA2D-1213-421A-BBF7-21667894FE40}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34445833642865" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 3), destEndpoint=(ForceStringCompare3: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3107975971700931932" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E7AF4354-E597-4BF1-9541-021A5D392AFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34342754427761" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{52F30833-B756-43EA-B893-762996BAD754}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34450128610161" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 4), destEndpoint=(ForceStringCompare4: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="18345521779661708124" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3A82D8B4-B77D-4A94-A4F5-1B330C28EDA7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34347049395057" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{32D46258-870D-4E6A-8717-38EB82562346}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34454423577457" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 5), destEndpoint=(ForceStringCompare5: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16700397200035393421" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5DD61551-9A73-47B6-9F66-D62A8F7440A2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34364229264241" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BD81D837-B9DC-44C0-8408-5B2B03668338}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34458718544753" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 6), destEndpoint=(ForceStringCompare6: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9495194248285446603" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3309BD23-83FF-4777-9B72-B49230933EFE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34338459460465" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DA4AE0CC-EEBB-4F57-AD89-A32CD7BB00A0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34463013512049" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 7), destEndpoint=(ForceStringCompare7: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4343848055614846617" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1EBDD2B5-E9D1-47AF-A57A-AAF069F2B65D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34359934296945" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5A72A911-6F8F-4FBA-9BFF-16AE9EEE3BF1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34467308479345" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 8), destEndpoint=(ForceStringCompare8: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8710192160495269590" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E1114E94-FFE6-4A18-B897-BD7403FAFEF8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34295509787505" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{630B3F95-22C6-46E8-8417-7F154EE2E294}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34471603446641" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Cycle : Out 9), destEndpoint=(ForceStringCompare9: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1051839336573017066" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CD6D8267-7A38-4BB0-9E08-C61DE4E705E4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34355639329649" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8C4F92C-B02C-49BE-B7AC-4920D7994B73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-7D22-2F3E60F855FC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34342754427761" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{083F4500-27AA-440E-8BF3-153C54560D63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 -80.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34312689656689" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{36A2A3BC-506C-47B0-91D8-832DF10F2C5A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 -440.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34334164493169" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{CF11AEBE-1F69-4E49-AF60-4C86F8004218}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="460.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34304099722097" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{7691F68A-A22D-4EA5-9861-5420EC5373F5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 -320.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34364229264241" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{DC494E1E-9945-4039-AF2D-56F932E47224}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 160.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34338459460465" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{366628F4-C521-4663-9A26-05C280DED85C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 280.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34308394689393" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{8282C736-99AD-46D3-8E97-9EA40065B71A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="460.0000000 -160.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34329869525873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{9E81C95F-89C0-4476-8E82-63CCC4E52E04}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="EBusHandlerNodeDescriptorSaveData" field="value2" version="2" type="{9E81C95F-89C0-4476-8E82-63CCC4E52E04}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="bool" field="DisplayConnections" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="EventIds" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2421007148" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3880424378" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2118369792" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="155513494" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2535483189" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3760674723" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2033059353" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="237581967" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2660641566" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3918601096" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="460.0000000 500.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{16096FB4-5CA7-4BD8-BCF9-EB077FA8A1B4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34299804754801" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-60.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{330D4156-D8BD-4360-9235-97B85642402F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34359934296945" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{77ADFABC-DFCB-4713-94EA-65A5162BE629}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 400.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34295509787505" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{5D5D2AFC-A90D-41A6-85D3-F2A1CE8107FF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 520.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34325574558577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{EBCFB37A-8CDE-4DDC-9F9F-06B292040D3C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MathNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1600.0000000 860.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34355639329649" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{C98A34B9-367E-48D2-A344-C9A05A60109A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 640.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34286919852913" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0440125" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="389.8420715" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="129.3087921" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34316984623985" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{1E31679C-92D4-422A-8A3F-B867B4A1E540}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MathNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="960.0000000 840.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34347049395057" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{D0981542-1CDD-4DB8-ABBA-3B1C73DC28CA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 40.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34291214820209" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{ED9E8EBA-C31C-4055-AE9E-6142B4CCA235}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="SetVariableNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".setVariable" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="2080.0000000 840.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34321279591281" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{C4B3FDC5-553D-471C-9486-F24656E1BC42}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="920.0000000 -200.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="34351344362353" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="100.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="LogicNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{6239A4D3-0D2F-44F7-8335-468FDD07488E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516250201531530" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117487324689374" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516248669651698" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516250163207356" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516250316216471" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516212078506904" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117487509911543" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117487089405954" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117486815238396" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516211896532867" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516248435436590" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117485093389172" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117484910167917" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117489890992528" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7721683751185626951" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="3117476785392655547" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117486940689419" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4199610336680704683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516249359345721" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117487896388729" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6840657073857873079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="2902967532902889342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="5842117489928120422" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="10002527926881348873" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516249211876368" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="13774516248856973085" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="1244476766431948410" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12152097629303315968" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{36654436-671D-4F4A-9287-AA639201DE8B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="count" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{36654436-671D-4F4A-9287-AA639201DE8B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="count" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{E0FC20D3-23FD-42DF-ADA5-B0EBAC4D5309}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="counting" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{E0FC20D3-23FD-42DF-ADA5-B0EBAC4D5309}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="counting" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{C2417605-B90A-47DF-A5D6-FC79C5D4B5C5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="10000.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{C2417605-B90A-47DF-A5D6-FC79C5D4B5C5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="limit" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputFunction.scriptcanvas new file mode 100644 index 0000000000..b09c192e66 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputFunction.scriptcanvas @@ -0,0 +1,2370 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6059817462454" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_FunctionContainerInputFunction" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3038816695528949663" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6064112429750" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Mark Complete)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7260187670941564987" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F45BA3EB-8279-448C-A257-2DBBD96605EA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DD25E78B-CF47-40A2-9B1D-637C68E90190}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E7F72BA6-8AB8-4413-914C-0A6AFFE876BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D7C4EB00-3DD6-4A55-A807-6A838C61E993}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Mark Complete" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6068407397046" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Expect Equal)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="MethodOverloaded" field="element" version="6" type="{C1E3C9D0-42E3-4D00-AE73-2A881E7E76A8}"> + <Class name="Method" field="BaseClass1" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6137291480067022542" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{993B2831-3D74-4E06-8D6F-D7CD1BA84637}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Candidate" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="left of ==" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{251F4783-43F8-4FEB-B675-FDA90313844C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="right of ==" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D9A3E7D6-2AC6-488B-B322-EDE27F45184C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9EEA3AD-9D65-468E-93DD-11D4FD52D5CB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{672721C4-E184-40F1-BDDB-E127B9EF1B94}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Candidate" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="Cool" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Expect Equal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::vector" field="orderedInputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{993B2831-3D74-4E06-8D6F-D7CD1BA84637}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{251F4783-43F8-4FEB-B675-FDA90313844C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D9A3E7D6-2AC6-488B-B322-EDE27F45184C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="outputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Get Element)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="MethodOverloaded" field="element" version="6" type="{C1E3C9D0-42E3-4D00-AE73-2A881E7E76A8}"> + <Class name="Method" field="BaseClass1" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="18344183000402995044" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{0001F647-D2D3-4F69-B986-C981537CF4C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Array<String>: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{90F25E4F-9ECD-44C6-B24A-79349CDF3190}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Index" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="The index to read from" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4153AE62-C3FE-488E-878F-83730F852978}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{97F70DF4-8101-4B91-9C9C-FB7223CCF5AA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9ED78D0F-F675-4A6B-AFCE-230D822A3D2C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Key Not Found" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F3A0688-C38E-41DA-83EE-11B9C2A89B2B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Array<String>: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Index" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Get Element" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="AZStd::vector<AZStd::basic_string<char, AZStd::char_traits<char>, allocator>, allocator>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Array<String>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::vector" field="orderedInputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{0001F647-D2D3-4F69-B986-C981537CF4C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{90F25E4F-9ECD-44C6-B24A-79349CDF3190}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="outputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F3A0688-C38E-41DA-83EE-11B9C2A89B2B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Get First Element)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="MethodOverloaded" field="element" version="6" type="{C1E3C9D0-42E3-4D00-AE73-2A881E7E76A8}"> + <Class name="Method" field="BaseClass1" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6216396150852133045" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{47BCA468-64E2-4FC5-A922-7814358C01D5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Array<String>: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DE3185C1-0D78-4169-B06B-EA0D2DAEE132}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F8E31432-B98E-4025-82EB-DA7CD8947015}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{455A58E1-3F08-4CBF-8CCB-A7C1EE0A302B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Empty" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F8E2C73-CCF9-44C8-AE02-84733D6C58C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Array<String>: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Get First Element" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="AZStd::vector<AZStd::basic_string<char, AZStd::char_traits<char>, allocator>, allocator>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Array<String>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::vector" field="orderedInputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{47BCA468-64E2-4FC5-A922-7814358C01D5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="outputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F8E2C73-CCF9-44C8-AE02-84733D6C58C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6081292298934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Expect Equal)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="MethodOverloaded" field="element" version="6" type="{C1E3C9D0-42E3-4D00-AE73-2A881E7E76A8}"> + <Class name="Method" field="BaseClass1" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6137291480067022542" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{993B2831-3D74-4E06-8D6F-D7CD1BA84637}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Candidate" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="left of ==" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{251F4783-43F8-4FEB-B675-FDA90313844C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="OverloadContract" field="element" type="{45622160-13C5-46E3-94D9-AE2EAFE6AC64}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="right of ==" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D9A3E7D6-2AC6-488B-B322-EDE27F45184C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9EEA3AD-9D65-468E-93DD-11D4FD52D5CB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{672721C4-E184-40F1-BDDB-E127B9EF1B94}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Candidate" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="Sweet" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Reference" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Expect Equal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::vector" field="orderedInputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{993B2831-3D74-4E06-8D6F-D7CD1BA84637}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{251F4783-43F8-4FEB-B675-FDA90313844C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D9A3E7D6-2AC6-488B-B322-EDE27F45184C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="outputSlotIds" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6085587266230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5801831009389123991" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2469CFC2-02A3-465C-83DB-58595F807A42}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C8DE6751-630D-48E2-B59B-5FFD08041B73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D977F75-8BFD-47D6-B6DE-0A2A47774EDE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="TwoStrings" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="452080683" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2343239484" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{9EB1BA2F-A076-4E98-8843-3298249B8B16}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6089882233526" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Get First Element: Out), destEndpoint=(Expect Equal: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1203992348289566577" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F8E31432-B98E-4025-82EB-DA7CD8947015}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6081292298934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9EEA3AD-9D65-468E-93DD-11D4FD52D5CB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6094177200822" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Get First Element: Value), destEndpoint=(Expect Equal: Candidate)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="18171747144727539352" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F8E2C73-CCF9-44C8-AE02-84733D6C58C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6081292298934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6098472168118" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Expect Equal: Out), destEndpoint=(Get Element: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4076927667817118481" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6081292298934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{672721C4-E184-40F1-BDDB-E127B9EF1B94}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4153AE62-C3FE-488E-878F-83730F852978}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6102767135414" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Get Element: Out), destEndpoint=(Expect Equal: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3264265243162800449" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{97F70DF4-8101-4B91-9C9C-FB7223CCF5AA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6068407397046" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9EEA3AD-9D65-468E-93DD-11D4FD52D5CB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6107062102710" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Get Element: Value), destEndpoint=(Expect Equal: Candidate)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="249516957592736692" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8F3A0688-C38E-41DA-83EE-11B9C2A89B2B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6068407397046" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A8EB0CC9-18E6-44FC-AC26-AC8EEB17F3BA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6111357070006" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Expect Equal: Out), destEndpoint=(Mark Complete: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1707053221356660973" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6068407397046" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{672721C4-E184-40F1-BDDB-E127B9EF1B94}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6064112429750" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E7F72BA6-8AB8-4413-914C-0A6AFFE876BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6115652037302" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(New Input 1: ), destEndpoint=(Get First Element: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15909489611560753697" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6085587266230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C8DE6751-630D-48E2-B59B-5FFD08041B73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{DE3185C1-0D78-4169-B06B-EA0D2DAEE132}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6119947004598" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(New Input 1: TwoStrings), destEndpoint=(Get First Element: Array<String>: 0)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="999751578871873791" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6085587266230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D977F75-8BFD-47D6-B6DE-0A2A47774EDE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{47BCA468-64E2-4FC5-A922-7814358C01D5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6124241971894" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(New Input 1: TwoStrings), destEndpoint=(Get Element: Array<String>: 0)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9513545746711795599" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6085587266230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D977F75-8BFD-47D6-B6DE-0A2A47774EDE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{0001F647-D2D3-4F69-B986-C981537CF4C1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-0000-0000D0D762D8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="9" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6059817462454" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="0.7353542" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="429.7249146" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-291.0162354" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6072702364342" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="500.0000000 20.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{834073BC-8A17-475B-81C6-CD739D319653}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6085587266230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-400.0000000 20.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{BF12F5DF-DE03-4181-8A68-688AD52F8FAE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6076997331638" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-180.0000000 20.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{B9E7F63F-A789-4145-98F8-C197F9A1FAD3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6081292298934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="180.0000000 20.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{1CB02E3D-4C25-437E-95FA-1E4C06E41B3E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6068407397046" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="820.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{AEF522DB-8032-4989-A8BD-67ECE6CDE9D3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="6064112429750" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1140.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{C219B571-4EF4-484B-9D4A-B96A091525EA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6840657073857873079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4053150093067829293" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6085082255528869526" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="2132390995794010980" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15760920460852482896" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{57E79B79-0CA8-4208-96B2-4C42A2692964}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::vector" field="m_data" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Array<String>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{57E79B79-0CA8-4208-96B2-4C42A2692964}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="TwoStrings" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="2" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputTest.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputTest.scriptcanvas new file mode 100644 index 0000000000..55605f684f --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_FunctionContainerInputTest.scriptcanvas @@ -0,0 +1,567 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23932320617243" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_FunctionContainerInputTest" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3038816695528949663" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23936615584539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Start" field="element" version="2" type="{F200B22A-5903-483A-BF63-5241BC03632B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5997007499607139380" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{29A7EA49-1E9F-4EA0-9FEB-182CA4513385}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when the entity that owns this graph is fully activated." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23940910551835" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8507359226232004165" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D64E21F2-DB93-4083-9097-175C030CE23A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="756956357" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8AD9C45A-2C79-412C-B5A6-7345D5C874CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="TwoStrings" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="756956357" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{613FF258-EE61-4B4B-A859-71529C793A86}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{573AA2ED-7A0B-4AED-9515-975C09034AF3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="756956357" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::vector" field="m_data" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="TwoStrings" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{9EB1BA2F-A076-4E98-8843-3298249B8B16}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={BE2463C7-E9F3-5545-A44C-0548D2AF7C7F}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_functioncontainerinputfunction.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D64E21F2-DB93-4083-9097-175C030CE23A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"> + <Class name="Input" field="element" type="{4E52A04D-C9FC-477F-8065-35F96A972CD6}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8AD9C45A-2C79-412C-B5A6-7345D5C874CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="VariableId" field="_interfaceSourceId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{573AA2ED-7A0B-4AED-9515-975C09034AF3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{9EB1BA2F-A076-4E98-E720-CF3AE720CF3A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="NewInput1_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{9EB1BA2F-A076-4E98-8843-3298249B8B16}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="NewInput1_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"> + <Class name="Input" field="element" type="{627448C3-D018-422E-B133-A1169BB44306}"> + <Class name="AZStd::string" field="displayName" value="TwoStrings" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="TwoStrings_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Datum" field="datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::vector" field="m_data" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="VariableId" field="sourceID" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="New Input 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="NewInput1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{9EB1BA2F-A076-4E98-E720-CF3AE720CF3A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{9EB1BA2F-A076-4E98-8843-3298249B8B16}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="756956357" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="scriptcanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="unittests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="ly_sc_unittest_functioncontainerinputfunction_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23945205519131" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(On Graph Start: Out), destEndpoint=(Function Call Node: New Input 1)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9452717911445906062" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23936615584539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{29A7EA49-1E9F-4EA0-9FEB-182CA4513385}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23940910551835" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D64E21F2-DB93-4083-9097-175C030CE23A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-0000-0000703B00A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23932320617243" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="379.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="45.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23936615584539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="500.0000000 220.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{B596CF69-DAFD-4C88-BAC1-78EB7D36D7B4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="23940910551835" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{8DE27A94-F02C-43B7-BB3D-5611D319E41B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="700.0000000 240.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4199610336680704683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7721683751185626951" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15760920460852482896" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{613FF258-EE61-4B4B-A859-71529C793A86}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="4" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::intrusive_ptr" field="m_data" type="{2349F1C2-6C74-54C9-8B7E-CBE24DDE8850}"> + <Class name="BehaviorContextObject" field="element" type="{B735214D-5182-4536-B748-61EC83C1F007}"> + <Class name="unsigned int" field="m_flags" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="any" field="m_object" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::vector" field="m_data" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="Sweet" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="Cool" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Array<String>" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{613FF258-EE61-4B4B-A859-71529C793A86}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="Variable 3" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunction.scriptcanvas new file mode 100644 index 0000000000..36be46edc9 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunction.scriptcanvas @@ -0,0 +1,628 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7502347485766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="HelloWorld" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9052377962154227383" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7506642453062" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12477281170783134906" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6BD6DD55-A040-4323-A6A1-671A45593FED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8599B85F-2657-4E02-B2F0-2CC3DF2F9CC3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="Hello, world!" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"/> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="Hello, world!" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7510937420358" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6253414662616905213" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{18D19F1C-2F6E-4C90-A2BE-466C4CE87963}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A153F445-5192-46F2-BB1F-7708711C88C3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7515232387654" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11396419963012713497" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{645D4BAA-1541-4DD6-A80A-C50980E98916}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AFF912AE-890A-4C0D-B1E2-BDDC2B008FA1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7519527354950" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print : In: ), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5288914408229439479" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7510937420358" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A153F445-5192-46F2-BB1F-7708711C88C3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7506642453062" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6BD6DD55-A040-4323-A6A1-671A45593FED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7523822322246" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14264987585494436513" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7506642453062" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8599B85F-2657-4E02-B2F0-2CC3DF2F9CC3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7515232387654" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{645D4BAA-1541-4DD6-A80A-C50980E98916}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-E7EF-7F5FE0D9D9E8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7502347485766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="0.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7506642453062" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="480.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{96F5E83F-7D91-4DB0-9D24-83AB3B904691}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7510937420358" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-40.0000000 80.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{2587A848-1232-4166-9D1E-0CE74FEF46A1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7515232387654" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="780.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{921DBB72-7E8E-4B5F-ACC9-4FCA3DC32824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="10684225535275896474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3854067922352095961" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"/> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunctionNotPure.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunctionNotPure.scriptcanvas new file mode 100644 index 0000000000..2e6439c95b --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_HelloWorldFunctionNotPure.scriptcanvas @@ -0,0 +1,733 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10199586947654" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="HelloWorld" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9052377962154227383" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10203881914950" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12477281170783134906" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6BD6DD55-A040-4323-A6A1-671A45593FED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AE2400F7-9090-467E-BC98-7DCE3C4576BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Value which replaces instances of {Value} in the resulting string." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1015031923" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{52EFC6D7-937B-4D05-BC78-A5B995D415CD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8599B85F-2657-4E02-B2F0-2CC3DF2F9CC3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="Hello, world!{Value}" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"> + <Class name="AZStd::pair" field="element" type="{F7CB29A1-551D-5BAD-9B38-B2279A75B957}"> + <Class name="AZ::u64" field="value1" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AE2400F7-9090-467E-BC98-7DCE3C4576BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="Hello, world!" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"> + <Class name="AZStd::pair" field="element" type="{A17FF4ED-B460-5612-99F4-90D2832CF8F5}"> + <Class name="AZStd::string" field="value1" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AE2400F7-9090-467E-BC98-7DCE3C4576BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10208176882246" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6253414662616905213" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{18D19F1C-2F6E-4C90-A2BE-466C4CE87963}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A153F445-5192-46F2-BB1F-7708711C88C3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10212471849542" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11396419963012713497" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{645D4BAA-1541-4DD6-A80A-C50980E98916}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AFF912AE-890A-4C0D-B1E2-BDDC2B008FA1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10216766816838" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print : In: ), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5288914408229439479" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10208176882246" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A153F445-5192-46F2-BB1F-7708711C88C3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10203881914950" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{6BD6DD55-A040-4323-A6A1-671A45593FED}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10221061784134" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14264987585494436513" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10203881914950" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8599B85F-2657-4E02-B2F0-2CC3DF2F9CC3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10212471849542" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{645D4BAA-1541-4DD6-A80A-C50980E98916}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-E7EF-7F5FE0D9D9E8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10199586947654" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-232.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="2.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10203881914950" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="400.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{96F5E83F-7D91-4DB0-9D24-83AB3B904691}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10208176882246" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-40.0000000 80.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{2587A848-1232-4166-9D1E-0CE74FEF46A1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="10212471849542" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="740.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{921DBB72-7E8E-4B5F-ACC9-4FCA3DC32824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="10684225535275896474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3854067922352095961" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{52EFC6D7-937B-4D05-BC78-A5B995D415CD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="blerp" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="String" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{52EFC6D7-937B-4D05-BC78-A5B995D415CD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="Variable 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsOneFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsOneFunction.scriptcanvas new file mode 100644 index 0000000000..72cc8fa4a0 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsOneFunction.scriptcanvas @@ -0,0 +1,1677 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7334423199973" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_IsZeroFunction" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11272452614447405463" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7338718167269" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13940460933427889908" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8F8145C-CF4A-4937-A215-5F799D95DF97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BCC71E68-A438-4621-80C3-EB0BAC016A40}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7343013134565" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="17371485502320280176" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C5E8634-F6CE-4A8E-A620-498E516ECA2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F3EFFD1A-2614-4ABC-95C3-70C795AC1B30}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7347308101861" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1090546246199758171" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Value which replaces instances of {Value} in the resulting string." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1015031923" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="In Function True: {Value}" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"> + <Class name="AZStd::pair" field="element" type="{F7CB29A1-551D-5BAD-9B38-B2279A75B957}"> + <Class name="AZ::u64" field="value1" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="In Function True: " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"> + <Class name="AZStd::pair" field="element" type="{A17FF4ED-B460-5612-99F4-90D2832CF8F5}"> + <Class name="AZStd::string" field="value1" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(EqualTo)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="EqualTo" field="element" type="{02A3A3E6-9D80-432B-8AF5-F3AF24CF6959}"> + <Class name="EqualityExpression" field="BaseClass1" type="{78D20EB6-BA07-4071-B646-7C2D68A0A4A6}"> + <Class name="BooleanExpression" field="BaseClass1" type="{36C69825-CFF8-4F70-8F3B-1A9227E8BEEA}"> + <Class name="BinaryOperator" field="BaseClass1" type="{5BD0E8C7-9B0A-42F5-9EB0-199E6EC8FA99}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10892072486447941986" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Result" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9D51F77C-6A24-4FCD-9D0F-DAB0048931F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signal to perform the evaluation when desired." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A3D30613-0A91-46B5-BAC3-655A22C08FAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is true." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{124BD3C0-DF57-4FC9-A345-637A116AC1A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is false." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E48519D-3FA3-4807-87BF-0EF9452237E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B71B091B-1DA4-49E7-870B-7E648AAC5FE5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7355898036453" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4778543193105032534" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{45D7348B-D743-4B18-800A-885955F3DA89}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{62BC9B1C-5890-4B3D-9A4C-C29F2360077D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FBD6FFE-3376-4A91-9C9A-F266521B34C6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="452080683" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2343239484" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Is Equal to 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7360193003749" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1090546246199758171" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Value which replaces instances of {Value} in the resulting string." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1015031923" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="In Functions False: {Value}" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"> + <Class name="AZStd::pair" field="element" type="{F7CB29A1-551D-5BAD-9B38-B2279A75B957}"> + <Class name="AZ::u64" field="value1" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="In Functions False: " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"> + <Class name="AZStd::pair" field="element" type="{A17FF4ED-B460-5612-99F4-90D2832CF8F5}"> + <Class name="AZStd::string" field="value1" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7364487971045" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Is Equal to 0: ), destEndpoint=(Equal To (==): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13613892843389619079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7355898036453" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{62BC9B1C-5890-4B3D-9A4C-C29F2360077D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9D51F77C-6A24-4FCD-9D0F-DAB0048931F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7368782938341" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Is Equal to 0: Value), destEndpoint=(Equal To (==): Value A)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7920625701362617973" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7355898036453" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FBD6FFE-3376-4A91-9C9A-F266521B34C6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E48519D-3FA3-4807-87BF-0EF9452237E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7373077905637" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): True), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7840551042612259224" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A3D30613-0A91-46B5-BAC3-655A22C08FAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7347308101861" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7377372872933" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): False), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8525823719174861735" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{124BD3C0-DF57-4FC9-A345-637A116AC1A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7360193003749" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7381667840229" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): Result), destEndpoint=(Print: Value)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16701878847168166017" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7347308101861" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7385962807525" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): Result), destEndpoint=(Print: Value)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4282214504303842192" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7360193003749" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7390257774821" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1706253599102218136" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7347308101861" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7338718167269" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8F8145C-CF4A-4937-A215-5F799D95DF97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7394552742117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14360685366172895450" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7360193003749" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7343013134565" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C5E8634-F6CE-4A8E-A620-498E516ECA2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-FD7F-000050DB3AA0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7343013134565" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{1C921028-F4D7-4D2F-91A0-9A909EF04387}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1020.0000000 340.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7334423199973" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-128.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7338718167269" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{2D7FDDEC-C492-469F-BD14-E94725E6C2EA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="980.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7351603069157" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{C557514B-501B-42E6-8AE1-F2D64641B0FE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MathNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="320.0000000 140.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7360193003749" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="720.0000000 340.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{8DB01DDF-13A3-4574-B163-49565111322D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7355898036453" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{10AC54C4-C293-47C4-86AA-5EC03594D80D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="140.0000000 140.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7347308101861" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{79DFFF86-F059-48EB-B6BC-18B76D33EB5C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="680.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="10684225535275896474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="3117476785392655547" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13229830129540693674" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{2195BC05-1098-4A0E-9FCA-A40B123BA4CF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{2195BC05-1098-4A0E-9FCA-A40B123BA4CF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="2" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsZeroFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsZeroFunction.scriptcanvas new file mode 100644 index 0000000000..081a45c63a --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_IsZeroFunction.scriptcanvas @@ -0,0 +1,1677 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4584910872033" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="IsEqualToFunction" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="11272452614447405463" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4589205839329" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1090546246199758171" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Value which replaces instances of {Value} in the resulting string." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1015031923" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="In Functions False: {Value}" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"> + <Class name="AZStd::pair" field="element" type="{F7CB29A1-551D-5BAD-9B38-B2279A75B957}"> + <Class name="AZ::u64" field="value1" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="In Functions False: " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"> + <Class name="AZStd::pair" field="element" type="{A17FF4ED-B460-5612-99F4-90D2832CF8F5}"> + <Class name="AZStd::string" field="value1" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4593500806625" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4778543193105032534" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{45D7348B-D743-4B18-800A-885955F3DA89}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{62BC9B1C-5890-4B3D-9A4C-C29F2360077D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FBD6FFE-3376-4A91-9C9A-F266521B34C6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="452080683" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2343239484" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="Is Equal to 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(EqualTo)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="EqualTo" field="element" type="{02A3A3E6-9D80-432B-8AF5-F3AF24CF6959}"> + <Class name="EqualityExpression" field="BaseClass1" type="{78D20EB6-BA07-4071-B646-7C2D68A0A4A6}"> + <Class name="BooleanExpression" field="BaseClass1" type="{36C69825-CFF8-4F70-8F3B-1A9227E8BEEA}"> + <Class name="BinaryOperator" field="BaseClass1" type="{5BD0E8C7-9B0A-42F5-9EB0-199E6EC8FA99}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10892072486447941986" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Result" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9D51F77C-6A24-4FCD-9D0F-DAB0048931F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signal to perform the evaluation when desired." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A3D30613-0A91-46B5-BAC3-655A22C08FAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is true." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{124BD3C0-DF57-4FC9-A345-637A116AC1A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled if the result of the operation is false." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E48519D-3FA3-4807-87BF-0EF9452237E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B71B091B-1DA4-49E7-870B-7E648AAC5FE5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3545012108" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value A" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value B" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4602090741217" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Print)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Print" field="element" type="{E1940FB4-83FE-4594-9AFF-375FF7603338}"> + <Class name="StringFormatted" field="BaseClass1" version="1" type="{0B1577E0-339D-4573-93D1-6C311AD12A13}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1090546246199758171" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Input signal" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Value which replaces instances of {Value} in the resulting string." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1015031923" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="bool" field="m_data" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_format" value="In Function True: {Value}" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="m_numericPrecision" value="4" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::map" field="m_arrayBindingMap" type="{B3879B66-F836-5380-B4C8-4D519373E77E}"> + <Class name="AZStd::pair" field="element" type="{F7CB29A1-551D-5BAD-9B38-B2279A75B957}"> + <Class name="AZ::u64" field="value1" value="1" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="m_unresolvedString" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="In Function True: " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::map" field="m_formatSlotMap" type="{8E9FB38C-2A95-5DC6-B051-90FF0BA8567F}"> + <Class name="AZStd::pair" field="element" type="{A17FF4ED-B460-5612-99F4-90D2832CF8F5}"> + <Class name="AZStd::string" field="value1" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="SlotId" field="value2" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4606385708513" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="17371485502320280176" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C5E8634-F6CE-4A8E-A620-498E516ECA2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F3EFFD1A-2614-4ABC-95C3-70C795AC1B30}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4610680675809" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(FunctionDefinitionNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionDefinitionNode" field="element" version="1" type="{4EE28D9F-67FB-4E61-B777-5DC5B059710F}"> + <Class name="Nodeling" field="BaseClass1" version="1" type="{4413EEA0-8D81-4D61-A1E1-3C1A437F3643}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13940460933427889908" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8F8145C-CF4A-4937-A215-5F799D95DF97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisallowReentrantExecutionContract" field="element" type="{8B476D16-D11C-4274-BE61-FA9B34BF54A3}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BCC71E68-A438-4621-80C3-EB0BAC016A40}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="DisplayGroupConnectedSlotLimitContract" field="element" type="{71E55CC5-6212-48C2-973E-1AC9E20A4481}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + <Class name="unsigned int" field="limit" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZStd::string" field="displayGroup" value="NodelingSlotDisplayGroup" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="errorMessage" value="Execution nodes can only be connected to either the Input or Output, and not both at the same time." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value=" " type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3992535411" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::string" field="m_displayName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="m_identifier" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="m_isExecutionEntry" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4614975643105" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Is Equal to 0: ), destEndpoint=(Equal To (==): In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13613892843389619079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4593500806625" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{62BC9B1C-5890-4B3D-9A4C-C29F2360077D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9D51F77C-6A24-4FCD-9D0F-DAB0048931F0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4619270610401" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Is Equal to 0: Value), destEndpoint=(Equal To (==): Value A)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7920625701362617973" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4593500806625" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3FBD6FFE-3376-4A91-9C9A-F266521B34C6}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E48519D-3FA3-4807-87BF-0EF9452237E2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4623565577697" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): True), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="7840551042612259224" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A3D30613-0A91-46B5-BAC3-655A22C08FAC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4602090741217" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4627860544993" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): False), destEndpoint=(Print: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8525823719174861735" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{124BD3C0-DF57-4FC9-A345-637A116AC1A8}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4589205839329" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{33F8E2FF-363F-4C6A-98A5-09C1AEA7BC63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4632155512289" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): Result), destEndpoint=(Print: Value)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16701878847168166017" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4602090741217" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4636450479585" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Equal To (==): Result), destEndpoint=(Print: Value)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="4282214504303842192" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{1D797ECA-9A5F-4E2D-BA91-7CF0D3644ED4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4589205839329" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4BFD8E55-59F3-410B-B8FA-E7ED2D64E769}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4640745446881" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1706253599102218136" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4602090741217" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4610680675809" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D8F8145C-CF4A-4937-A215-5F799D95DF97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4645040414177" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Print: Out), destEndpoint=(Print : Out: )" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14360685366172895450" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4589205839329" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2E0CEE71-7C2D-43A1-8CC3-B0CE1B416DE0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4606385708513" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5C5E8634-F6CE-4A8E-A620-498E516ECA2A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-FD7F-0000E079C694}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4602090741217" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="680.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{79DFFF86-F059-48EB-B6BC-18B76D33EB5C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4593500806625" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="140.0000000 140.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{10AC54C4-C293-47C4-86AA-5EC03594D80D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4589205839329" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{8DB01DDF-13A3-4574-B163-49565111322D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="StringNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="720.0000000 340.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4597795773921" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="320.0000000 140.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MathNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{C557514B-501B-42E6-8AE1-F2D64641B0FE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4610680675809" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="980.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{2D7FDDEC-C492-469F-BD14-E94725E6C2EA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4584910872033" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-70.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-92.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4606385708513" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1020.0000000 340.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".nodeling" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="NodelingTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{1C921028-F4D7-4D2F-91A0-9A909EF04387}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7011818094993955847" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="3" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="10684225535275896474" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="3117476785392655547" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13229830129540693674" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"> + <Class name="AZStd::pair" field="element" type="{E64D2110-EB38-5AE1-9B1D-3C06A10C7D6A}"> + <Class name="VariableId" field="value1" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{2195BC05-1098-4A0E-9FCA-A40B123BA4CF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="GraphVariable" field="value2" version="4" type="{5BDC128B-8355-479C-8FA8-4BFFAB6915A8}"> + <Class name="Datum" field="Datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Number" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Crc32" field="InputControlVisibility" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2755429085" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="AZStd::string" field="ExposureCategory" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="int" field="SortPriority" value="-1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="ReplicaNetworkProperties" field="ReplicaNetProps" version="1" type="{4F055551-DD75-4877-93CE-E80C844FC155}"> + <Class name="bool" field="m_isSynchronized" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="VariableId" field="VariableId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{2195BC05-1098-4A0E-9FCA-A40B123BA4CF}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="VariableName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="unsigned char" field="Scope" value="2" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="unsigned char" field="InitialValueSource" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfNotPureUserFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfNotPureUserFunction.scriptcanvas new file mode 100644 index 0000000000..e9c05c3831 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfNotPureUserFunction.scriptcanvas @@ -0,0 +1,1047 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7437740330467" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_LatentCallOfNotPureUserFunction" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6571535133870744578" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7442035297763" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Start" field="element" version="2" type="{F200B22A-5903-483A-BF63-5241BC03632B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15193913073954065552" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0566322-ABB1-4DE3-BF2D-4ED1ED64E114}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when the entity that owns this graph is fully activated." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7446330265059" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(TimeDelayNodeableNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="TimeDelayNodeableNode" field="element" type="{D3629902-02E9-AE59-0424-F366D342B433}"> + <Class name="NodeableNode" field="BaseClass1" type="{80351020-5778-491A-B6CA-C78364C19499}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1053952827100754458" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{357C23C8-2A4C-49F1-BE4B-939734B6F05B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Delay" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="The amount of time to delay before the Done is signalled." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AEBF8386-4C3B-4A58-904B-30907580EADA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="On Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Done" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled after waiting for the specified amount of times." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="271442091" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="3.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Delay" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::unique_ptr" field="nodeable" type="{8115FDE2-2859-5710-B2C6-72C11F9CFFF0}"> + <Class name="TimeDelayNodeable" field="element" type="{0B46D60A-EFCD-D8FD-8510-390C8E939FF6}"> + <Class name="BaseTimer" field="BaseClass1" type="{64814C82-DAE5-9B04-B375-5E47D51ECD26}"> + <Class name="Nodeable" field="BaseClass1" type="{C8195695-423A-4960-A090-55B2E94E0B25}"/> + <Class name="int" field="m_timeUnits" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="m_tickOrder" value="1000" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="Map" field="slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"> + <Class name="Input" field="element" type="{4E52A04D-C9FC-477F-8065-35F96A972CD6}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{357C23C8-2A4C-49F1-BE4B-939734B6F05B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="VariableId" field="_interfaceSourceId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AEBF8386-4C3B-4A58-904B-30907580EADA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="On Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{00000000-0000-0080-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{B0889881-5902-0000-9625-123BF87F0000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Done" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{F06B71D1-FF7F-0000-2000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7450625232355" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8173632389711398098" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8BF89FFE-4D6F-4A53-9CFB-1E9D32E20AD0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1609338446" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F12F8492-EDE6-4F0B-8A31-EC7944F1C779}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1609338446" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{F09ED5CE-FF7F-0000-8C46-2ECA30FC71AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={601A64F0-3CFD-5B7D-A0B4-FA7E4485AA72}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_helloworldfunctionnotpure.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8BF89FFE-4D6F-4A53-9CFB-1E9D32E20AD0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F12F8492-EDE6-4F0B-8A31-EC7944F1C779}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="In_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="In_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3119148441" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="ScriptCanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="UnitTests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="LY_SC_UnitTest_HelloWorldFunctionNotPure_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7454920199651" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Mark Complete)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="8809084234328280515" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F603FD67-A8D0-468E-8480-00E8F2B5C317}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{E0505AE1-737C-4B80-803C-A4364A240CD2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BEF85627-1015-4B13-BC06-F1063DB4D4DC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8BC6BC59-538A-430E-AE1D-C0CA2DF9216B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Mark Complete" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7459215166947" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(On Graph Start: Out), destEndpoint=(TimeDelay: Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1596432431347764630" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7442035297763" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0566322-ABB1-4DE3-BF2D-4ED1ED64E114}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7446330265059" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7463510134243" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(TimeDelay: Done), destEndpoint=(Function Call Node: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3568626474031118159" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7446330265059" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7450625232355" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{8BF89FFE-4D6F-4A53-9CFB-1E9D32E20AD0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7467805101539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Out), destEndpoint=(Mark Complete: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="9654104828115164517" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7450625232355" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{F12F8492-EDE6-4F0B-8A31-EC7944F1C779}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7454920199651" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BEF85627-1015-4B13-BC06-F1063DB4D4DC}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-E7EF-7F5F8014E487}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7454920199651" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{23A951FB-B4B8-40AD-9375-A16C015A2A61}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="900.0000000 200.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7437740330467" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="0.9191536" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-170.8093109" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-195.8323364" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7446330265059" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="20.0000000 20.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{BB5065C3-D90F-4D53-93E8-794C17FF1940}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7442035297763" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{E9C674F1-C34C-4CE6-A7A4-081EF8BA834A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="-180.0000000 0.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="7450625232355" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="360.0000000 220.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{7BED9343-8F8D-4C4C-BF13-CF0E81082975}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4199610336680704683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6462358712820489356" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="17189374120869440743" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6840657073857873079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15689091942531117650" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"/> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfPureUserFunction.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfPureUserFunction.scriptcanvas new file mode 100644 index 0000000000..bd570e3ec2 --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_LatentCallOfPureUserFunction.scriptcanvas @@ -0,0 +1,1047 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4792040476131" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_LatentCallOfPureUserFunction" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="6571535133870744578" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4796335443427" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Start" field="element" version="2" type="{F200B22A-5903-483A-BF63-5241BC03632B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15193913073954065552" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0566322-ABB1-4DE3-BF2D-4ED1ED64E114}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when the entity that owns this graph is fully activated." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4800630410723" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(TimeDelayNodeableNode)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="TimeDelayNodeableNode" field="element" type="{D3629902-02E9-AE59-0424-F366D342B433}"> + <Class name="NodeableNode" field="BaseClass1" type="{80351020-5778-491A-B6CA-C78364C19499}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1053952827100754458" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{357C23C8-2A4C-49F1-BE4B-939734B6F05B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Delay" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="The amount of time to delay before the Done is signalled." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AEBF8386-4C3B-4A58-904B-30907580EADA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="On Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2675529103" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Done" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled after waiting for the specified amount of times." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="271442091" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="3.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Delay" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::unique_ptr" field="nodeable" type="{8115FDE2-2859-5710-B2C6-72C11F9CFFF0}"> + <Class name="TimeDelayNodeable" field="element" type="{0B46D60A-EFCD-D8FD-8510-390C8E939FF6}"> + <Class name="BaseTimer" field="BaseClass1" type="{64814C82-DAE5-9B04-B375-5E47D51ECD26}"> + <Class name="Nodeable" field="BaseClass1" type="{C8195695-423A-4960-A090-55B2E94E0B25}"/> + <Class name="int" field="m_timeUnits" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="m_tickOrder" value="1000" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="Map" field="slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"> + <Class name="Input" field="element" type="{4E52A04D-C9FC-477F-8065-35F96A972CD6}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{357C23C8-2A4C-49F1-BE4B-939734B6F05B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="VariableId" field="_interfaceSourceId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{AEBF8386-4C3B-4A58-904B-30907580EADA}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="On Start" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{00000000-0000-0080-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{B0889881-5902-0000-9625-123BF87F0000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Done" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{F06B71D1-FF7F-0000-2000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4804925378019" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="16811267658047538831" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9BCC3F2-0B3B-448A-9535-1BEC67F90BEE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1609338446" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D5A170D-0E7D-43C1-957D-FAA97B9E0907}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="1609338446" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={D1D3EB5E-1541-53D9-90F0-0F39BCEBB30C}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_helloworldfunction.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9BCC3F2-0B3B-448A-9535-1BEC67F90BEE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D5A170D-0E7D-43C1-957D-FAA97B9E0907}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="In_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="In_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{1EDB5858-BF68-4C06-81BE-C4C6C18500C2}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{C54DF87A-22B0-4B5F-A3A5-32C7461C7824}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3119148441" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="ScriptCanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="UnitTests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="LY_SC_UnitTest_HelloWorldFunction_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4809220345315" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Mark Complete)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1417761892103721732" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{7F333623-93C2-44E7-9589-48B78A9E99E9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{233D398C-67B5-472A-BCF6-FC6C4E67C16A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{77092888-66FF-41B7-9FA4-929734197818}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3E9C52F2-24C3-42AA-ACE6-05766F30BA4F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Mark Complete" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4813515312611" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(On Graph Start: Out), destEndpoint=(TimeDelay: Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="1596432431347764630" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4796335443427" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{D0566322-ABB1-4DE3-BF2D-4ED1ED64E114}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4800630410723" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{98881463-93EA-4134-B167-7570F78F526D}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4817810279907" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(TimeDelay: Done), destEndpoint=(Function Call Node: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="2452595094640216734" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4800630410723" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{2042EA06-6AE4-49EA-B162-4C1EEB7C6F7A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4804925378019" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{B9BCC3F2-0B3B-448A-9535-1BEC67F90BEE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4822105247203" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: Out), destEndpoint=(Mark Complete: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15803796564312159315" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4804925378019" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{3D5A170D-0E7D-43C1-957D-FAA97B9E0907}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4809220345315" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{77092888-66FF-41B7-9FA4-929734197818}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-E7EF-7F5F90A3C087}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4804925378019" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="640.0000000 200.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{A9407C52-FC80-4F58-B489-D37FF5871277}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4809220345315" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{81B5C756-BF90-4CD6-8BC9-0D4CF8DB9D2E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="980.0000000 240.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4792040476131" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="0.9191536" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-3.2638724" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-82.6847687" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4800630410723" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="320.0000000 100.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{BB5065C3-D90F-4D53-93E8-794C17FF1940}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4796335443427" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{E9C674F1-C34C-4CE6-A7A4-081EF8BA834A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="120.0000000 80.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4199610336680704683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6462358712820489356" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="214951534038835990" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6840657073857873079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15689091942531117650" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"/> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UserBranchSanityCheck.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UserBranchSanityCheck.scriptcanvas new file mode 100644 index 0000000000..d8d26dbdbb --- /dev/null +++ b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_UserBranchSanityCheck.scriptcanvas @@ -0,0 +1,1248 @@ +<ObjectStream version="3"> + <Class name="ScriptCanvasData" version="4" type="{1072E894-0C67-4091-8B64-F7DB324AD13C}"> + <Class name="AZStd::unique_ptr" field="m_scriptCanvas" type="{8FFB6D85-994F-5262-BA1C-D0082A7F65C5}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11148354158821" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="LY_SC_UnitTest_UserBranchSanityCheck" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Graph" field="element" version="8" type="{4D755CA9-AB92-462C-B24F-0B3376F19967}"> + <Class name="Graph" field="BaseClass1" version="17" type="{C3267D77-EEDC-490E-9E42-F1D1F473E184}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="10409069444039114457" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="GraphData" field="m_graphData" version="4" type="{ADCB5EB5-8D3F-42ED-8F65-EAB58A82C381}"> + <Class name="AZStd::unordered_set" field="m_nodes" type="{27BF7BD3-6E17-5619-9363-3FC3D9A5369D}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11152649126117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Mark Complete)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Method" field="element" version="5" type="{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14019768888511661167" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{47D25662-04FF-46C8-93AF-1884D1BE004A}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="EntityID: 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A9B89895-DF95-4BD6-B25F-D9347D8481CD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="additional notes for the test report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C15FFF5B-D2F3-4163-9D6C-F794C2C0FD02}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="In" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{5A3EA962-8FD6-4C47-B2BD-C7B0E9B29F15}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="1" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="EntityId" field="m_data" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="4276206253" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="5" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="AZStd::string" field="m_data" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Report" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="int" field="methodType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::string" field="methodName" value="Mark Complete" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="className" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="namespaces" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"/> + <Class name="AZStd::vector" field="resultSlotIDs" type="{D0B13803-101B-54D8-914C-0DA49FDFA268}"> + <Class name="SlotId" field="element" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="prettyClassName" value="Unit Testing" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11156944093413" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="SC-Node(Start)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Start" field="element" version="2" type="{F200B22A-5903-483A-BF63-5241BC03632B}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5092228561330169545" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{568C93C9-04D2-49FB-8D93-E044892351CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Out" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="Signaled when the entity that owns this graph is fully activated." type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"/> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11161239060709" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="15452656825033611682" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FC89DF24-CC8A-4344-BA29-DBE33A298295}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Is Equal to 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2538009995" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{816A68C3-F885-4268-8F5B-D2D459B028BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2538009995" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BA99CEA5-3CAA-4FFA-860E-4D3B75BB2C77}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2538009995" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A671A66F-4C10-4C2F-BC0F-40912F68724E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="2538009995" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{9C648BF3-FD7F-0000-8C46-2ECA30FC71AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={0D0A8CAF-9DAD-56D0-A022-59CBD55B2852}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_isonefunction.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FC89DF24-CC8A-4344-BA29-DBE33A298295}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"> + <Class name="Input" field="element" type="{4E52A04D-C9FC-477F-8065-35F96A972CD6}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{816A68C3-F885-4268-8F5B-D2D459B028BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="VariableId" field="_interfaceSourceId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{BA99CEA5-3CAA-4FFA-860E-4D3B75BB2C77}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A671A66F-4C10-4C2F-BC0F-40912F68724E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="IsEqualto1_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="Is Equal to 1" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="IsEqualto1_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"> + <Class name="Input" field="element" type="{627448C3-D018-422E-B133-A1169BB44306}"> + <Class name="AZStd::string" field="displayName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="Value_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Datum" field="datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="VariableId" field="sourceID" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="4261170317" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="734881840" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="scriptcanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="unittests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="ly_sc_unittest_isonefunction_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11165534028005" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="FunctionCallNode" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="FunctionCallNode" field="element" version="6" type="{ECFDD30E-A16D-4435-97B7-B2A4DF3C543A}"> + <Class name="Node" field="BaseClass1" version="14" type="{52B454AE-FA7E-4FE9-87D3-A1CAB235C691}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="14784556468833030954" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::list" field="Slots" type="{E01B3091-9B44-571A-A87B-7D0E2768D774}"> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CDF46D57-EA31-48F9-BB5D-BF4669DFFAA0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Is Equal to 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3762406685" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9CD13D64-0F8B-4C48-A59B-F7BED9E900E9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="ExclusivePureDataContract" field="element" type="{E48A0B26-B6B7-4AF3-9341-9E5C5C1F0DE8}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3762406685" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{80D8B5F1-01FA-4FF9-84EB-578DB17FF92B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3762406685" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="Slot" field="element" version="21" type="{FBFE0F02-4C26-475F-A28B-18D3A533C13C}"> + <Class name="bool" field="IsOverload" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isVisibile" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="id" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4D2453D6-EE05-42FB-9D4F-DF7D3EB21A63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="DynamicTypeOverride" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="AZStd::vector" field="contracts" type="{C87136AF-3259-590C-9519-D1C4C75F1C86}"> + <Class name="AZStd::unique_ptr" field="element" type="{75F9EC0D-D8D6-5410-BD79-960E22076B03}"> + <Class name="SlotTypeContract" field="element" type="{084B4F2A-AB34-4931-9269-E3614FC1CDFA}"> + <Class name="Contract" field="BaseClass1" type="{93846E60-BD7E-438A-B970-5C4AA591CF93}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::string" field="slotName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="toolTip" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Type" field="DisplayDataType" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="2" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Crc32" field="DisplayGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="3762406685" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="SlotDescriptor" field="Descriptor" version="1" type="{FBF1C3A7-AA74-420F-BBE4-29F78D6EA262}"> + <Class name="int" field="ConnectionType" value="2" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="int" field="SlotType" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="bool" field="IsLatent" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Crc32" field="DynamicGroup" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="int" field="DataType" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="bool" field="IsReference" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="VariableId" field="VariableReference" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="bool" field="IsUserAdded" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::list" field="Datums" type="{36259B04-FAAB-5E8A-B7BF-A5E2EA5A9B3A}"> + <Class name="Datum" field="element" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="int" field="NodeDisabledFlag" value="0" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZ::Uuid" field="m_sourceId" value="{E0649912-FE7F-0000-8C46-2ECA30FC71AD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="Asset" field="m_asset" value="id={E302C9BE-B05A-50E1-BAB0-30F2A87098C6}:dfe6dc72,type={E22967AC-7673-4778-9125-AF49D82CAF9F},hint={scriptcanvas/unittests/ly_sc_unittest_iszerofunction.scriptcanvas_fn_compiled},loadBehavior=2" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> + <Class name="Map" field="m_slotExecutionMap" version="1" type="{BAA81EAF-E35A-4F19-B73A-699B91DB113C}"> + <Class name="AZStd::vector" field="ins" type="{733E7AAD-19AD-5FAE-A634-B3B6EB0D3ED3}"> + <Class name="In" field="element" version="1" type="{4AAAEB0B-6367-46E5-B05D-E76EF884E16F}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CDF46D57-EA31-48F9-BB5D-BF4669DFFAA0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::vector" field="_inputs" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"> + <Class name="Input" field="element" type="{4E52A04D-C9FC-477F-8065-35F96A972CD6}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{9CD13D64-0F8B-4C48-A59B-F7BED9E900E9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="VariableId" field="_interfaceSourceId" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="_outs" type="{5970B601-529F-5E37-99F2-942F34360771}"> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{80D8B5F1-01FA-4FF9-84EB-578DB17FF92B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{DD3D2547-868C-40DF-A37C-F60BE06FFFBA}"> + <Class name="SlotId" field="_slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{4D2453D6-EE05-42FB-9D4F-DF7D3EB21A63}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="AZStd::string" field="_name" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="_outputs" type="{275A1212-6B40-5045-BA6D-39FF976D6634}"/> + <Class name="Return" field="_returnValues" version="1" type="{8CD09346-BF99-4B34-91EA-C553549F7639}"> + <Class name="AZStd::vector" field="_values" type="{ED971363-ECC9-5B7D-A9E7-C70BEF283BC0}"/> + </Class> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::string" field="_parsedName" value="IsEqualto0_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZ::Uuid" field="_interfaceSourceId" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{5970B601-529F-5E37-99F2-942F34360771}"/> + </Class> + <Class name="SubgraphInterface" field="m_slotExecutionMapSourceInterface" version="7" type="{52B27A11-8294-4A6F-BFCF-6C1582649DB2}"> + <Class name="bool" field="areAllChildrenPure" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="hasOnGraphStart" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="isActiveDefaultObject" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::vector" field="ins" type="{16DA1AFC-705E-559D-8CF0-2E939187BB4B}"> + <Class name="In" field="element" version="1" type="{DFDA32F7-41D2-45BB-8ADF-876679053836}"> + <Class name="AZStd::string" field="displayName" value="Is Equal to 0" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="IsEqualto0_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="inputs" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"> + <Class name="Input" field="element" type="{627448C3-D018-422E-B133-A1169BB44306}"> + <Class name="AZStd::string" field="displayName" value="Value" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="Value_scvm" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="Datum" field="datum" version="6" type="{8B836FC0-98A8-4A81-8651-35C7CA125451}"> + <Class name="bool" field="m_isUntypedStorage" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="Type" field="m_type" version="2" type="{0EADF8F5-8AB8-42E9-9C50-F5C78255C817}"> + <Class name="unsigned int" field="m_type" value="3" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="AZ::Uuid" field="m_azType" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="int" field="m_originality" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + <Class name="any" field="m_datumStorage" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> + <Class name="double" field="m_data" value="0.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + </Class> + <Class name="AZStd::string" field="m_datumLabel" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="VariableId" field="sourceID" type="{CA57A57B-E510-4C09-B952-1F43742166AE}"> + <Class name="AZ::Uuid" field="m_id" value="{00000000-0000-0000-0000-000000000000}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + <Class name="AZStd::vector" field="outs" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="True" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{07377CE7-1027-4BB7-95EC-09E72CF1A084}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + <Class name="Out" field="element" version="1" type="{6175D897-C06D-48B5-8775-388B232D429D}"> + <Class name="AZStd::string" field="displayName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="parsedName" value="False" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="outputs" type="{5457916A-40A0-5DF0-9742-1DEECFEE5C48}"/> + <Class name="AZStd::vector" field="returnValues" type="{A7E036E1-781C-5FF3-B5E2-5F7CCA518624}"/> + <Class name="AZ::Uuid" field="sourceID" value="{017C8942-5701-44D8-A737-8EA18552E1C0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="bool" field="isPure" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZ::Uuid" field="sourceID" value="{7DA9A117-E49B-46C2-BED4-F9F5BC6BD9E5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="latents" type="{CA41DC3D-DBB4-5EA5-A9AA-91EC2056766E}"/> + <Class name="AZStd::vector" field="outKeys" type="{287CEE87-6FF3-52FC-9D32-38255E2C7FE9}"> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="4261170317" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + <Class name="Crc32" field="element" type="{9F4E062E-06A0-46D4-85DF-E0DA96467D3A}"> + <Class name="unsigned int" field="Value" value="734881840" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="namespacePath" type="{99DAD0BC-740E-5E82-826B-8FC7968CC02C}"> + <Class name="AZStd::string" field="element" value="ScriptCanvas" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="UnitTests" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::string" field="element" value="LY_SC_UnitTest_IsZeroFunction_VM" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + <Class name="unsigned int" field="executionCharacteristics" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="requiresConstructionParameters" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="requiresConstructionParametersForDependencies" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::vector" field="m_connections" type="{21786AF0-2606-5B9A-86EB-0892E2820E6C}"> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11169828995301" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(On Graph Start: Out), destEndpoint=(Function Call Node: Is Equal to 0)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="12880878295112518352" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11156944093413" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{568C93C9-04D2-49FB-8D93-E044892351CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11165534028005" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{CDF46D57-EA31-48F9-BB5D-BF4669DFFAA0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11174123962597" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: True), destEndpoint=(Function Call Node: Is Equal to 1)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="3053062920809627937" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11165534028005" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{80D8B5F1-01FA-4FF9-84EB-578DB17FF92B}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11161239060709" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{FC89DF24-CC8A-4344-BA29-DBE33A298295}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + <Class name="AZ::Entity" field="element" version="2" type="{75651658-8663-478D-9090-2432DFCAFA44}"> + <Class name="EntityId" field="Id" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11178418929893" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="AZStd::string" field="Name" value="srcEndpoint=(Function Call Node: False), destEndpoint=(Mark Complete: In)" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + <Class name="AZStd::vector" field="Components" type="{13D58FF9-1088-5C69-9A1F-C2A144B57B78}"> + <Class name="Connection" field="element" type="{64CA5016-E803-4AC4-9A36-BDA2C890C6EB}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="13598630265666477575" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="Endpoint" field="sourceEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11161239060709" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{A671A66F-4C10-4C2F-BC0F-40912F68724E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="Endpoint" field="targetEndpoint" version="1" type="{91D4ADAC-56FE-4D82-B9AF-6975D21435C8}"> + <Class name="EntityId" field="nodeId" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11152649126117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="SlotId" field="slotId" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{C15FFF5B-D2F3-4163-9D6C-F794C2C0FD02}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="m_dependentAssets" type="{1BC78FA9-1D82-5F17-BD28-C35D1F4FA737}"/> + <Class name="AZStd::vector" field="m_scriptEventAssets" type="{479100D9-6931-5E23-8494-5A28EF2FCD8A}"/> + </Class> + <Class name="unsigned char" field="executionMode" value="0" type="{72B9409A-7D1A-4831-9CFE-FCB3FADD3426}"/> + <Class name="AZ::Uuid" field="m_assetType" value="{3E2AC8CD-713F-453E-967F-29517F331784}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="bool" field="isFunctionGraph" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="SlotId" field="versionData" version="2" type="{14C629F6-467B-46FE-8B63-48FDFCA42175}"> + <Class name="AZ::Uuid" field="m_id" value="{01000000-0100-0000-DA04-0000D02D6FB3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="unsigned int" field="m_variableCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + <Class name="bool" field="m_saveFormatConverted" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="AZStd::unordered_map" field="GraphCanvasData" type="{0005D26C-B35A-5C30-B60C-5716482946CB}"> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11161239060709" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{7965A90B-459A-499C-B577-6135F57217F5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="660.0000000 180.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11165534028005" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{9FEA9B39-EF2F-43F1-9EC6-B6D1D18DD38E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="340.0000000 180.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11152649126117" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{7A0A8635-D65D-4B2C-BA05-B1FF6542D818}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="MethodNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value=".method" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="1020.0000000 220.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11148354158821" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{5F84B500-8C45-40D1-8EFC-A5306B241444}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="SceneComponentSaveData" field="value2" version="3" type="{5F84B500-8C45-40D1-8EFC-A5306B241444}"> + <Class name="AZStd::vector" field="Constructs" type="{60BF495A-9BEF-5429-836B-37ADEA39CEA0}"/> + <Class name="ViewParams" field="ViewParams" version="1" type="{D016BF86-DFBB-4AF0-AD26-27F6AB737740}"> + <Class name="double" field="Scale" value="1.0000000" type="{110C4B14-11A8-4E9D-8638-5051013A56AC}"/> + <Class name="float" field="AnchorX" value="-31.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + <Class name="float" field="AnchorY" value="-130.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> + </Class> + <Class name="unsigned int" field="BookmarkCounter" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{22EBF919-A826-58E5-8EF6-15CA70D620BB}"> + <Class name="EntityId" field="value1" version="1" type="{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}"> + <Class name="AZ::u64" field="id" value="11156944093413" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="EntitySaveDataContainer" field="value2" version="2" type="{DCCDA882-AF72-49C3-9AAD-BA601322BFBC}"> + <Class name="AZStd::unordered_map" field="ComponentData" type="{318313BB-1036-5630-AFC4-FCBD54818E6D}"> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="NodeSaveData" field="value2" version="1" type="{24CB38BB-1705-4EC5-8F63-B574571B4DCD}"> + <Class name="bool" field="HideUnusedSlots" value="false" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeometrySaveData" field="value2" version="1" type="{7CC444B1-F9B3-41B5-841B-0C4F2179F111}"> + <Class name="Vector2" field="Position" value="120.0000000 140.0000000" type="{3D80F623-C85C-4741-90D0-E4E66164E6BF}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="StylingComponentSaveData" field="value2" version="1" type="{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="SubStyle" value="" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{328FF15C-C302-458F-A43D-E1794DE0904E}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="GeneralNodeTitleComponentSaveData" field="value2" version="1" type="{328FF15C-C302-458F-A43D-E1794DE0904E}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZStd::string" field="PaletteOverride" value="TimeNodeTitlePalette" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> + </Class> + </Class> + <Class name="AZStd::pair" field="element" type="{CE78FEBD-1B9D-5A3E-9B95-BD8DD8CCCD4B}"> + <Class name="AZ::Uuid" field="value1" value="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + <Class name="PersistentIdComponentSaveData" field="value2" version="1" type="{B1F49A35-8408-40DA-B79E-F1E3B64322CE}"> + <Class name="ComponentSaveData" field="BaseClass1" version="1" type="{359ACEC7-D0FA-4FC0-8B59-3755BB1A9836}"/> + <Class name="AZ::Uuid" field="PersistentId" value="{48C80809-1232-4B7A-8A4D-238696A5F492}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> + </Class> + </Class> + </Class> + </Class> + </Class> + </Class> + <Class name="AZStd::unordered_map" field="CRCCacheMap" type="{2376BDB0-D7B6-586B-A603-42BE703EB2C9}"/> + <Class name="GraphStatisticsHelper" field="StatisticsHelper" version="1" type="{7D5B7A65-F749-493E-BA5C-6B8724791F03}"> + <Class name="AZStd::unordered_map" field="InstanceCounter" type="{9EC84E0A-F296-5212-8B69-4DE48E695D61}"> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="6840657073857873079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="4199610336680704683" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="7721683751185626951" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="AZStd::pair" field="element" type="{0CE5EF6F-834D-519F-B2EC-C2763B8BB99C}"> + <Class name="AZ::u64" field="value1" value="790578704591500384" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + <Class name="int" field="value2" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + </Class> + </Class> + <Class name="int" field="GraphCanvasSaveVersion" value="1" type="{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}"/> + </Class> + <Class name="EditorGraphVariableManagerComponent" field="element" type="{86B7CC96-9830-4BD1-85C3-0C0BD0BFBEE7}"> + <Class name="GraphVariableManagerComponent" field="BaseClass1" version="3" type="{825DC28D-667D-43D0-AF11-73681351DD2F}"> + <Class name="AZ::Component" field="BaseClass1" type="{EDFCB2CF-F75D-43BE-B26B-F35821B29247}"> + <Class name="AZ::u64" field="Id" value="5145984927981759269" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> + </Class> + <Class name="VariableData" field="m_variableData" version="3" type="{4F80659A-CD11-424E-BF04-AF02ABAC06B0}"> + <Class name="AZStd::unordered_map" field="m_nameVariableMap" type="{6C3A5734-6C27-5033-B033-D5CAD11DE55A}"/> + </Class> + <Class name="AZStd::unordered_map" field="CopiedVariableRemapping" type="{723F81A5-0980-50C7-8B1F-BE646339362B}"/> + </Class> + </Class> + </Class> + <Class name="bool" field="IsDependencyReady" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + <Class name="bool" field="IsRuntimeActive" value="true" type="{A0CA880C-AFE4-43CB-926C-59AC48496112}"/> + </Class> + </Class> + </Class> +</ObjectStream> + diff --git a/Gems/ScriptCanvasTesting/Code/Platform/Common/Clang/scriptcanvastesting_editor_tests_clang.cmake b/Gems/ScriptCanvasTesting/Code/Platform/Common/Clang/scriptcanvastesting_editor_tests_clang.cmake index a6510a297f..4d5680a30d 100644 --- a/Gems/ScriptCanvasTesting/Code/Platform/Common/Clang/scriptcanvastesting_editor_tests_clang.cmake +++ b/Gems/ScriptCanvasTesting/Code/Platform/Common/Clang/scriptcanvastesting_editor_tests_clang.cmake @@ -7,4 +7,4 @@ # or, if provided, by the license below or the license accompanying this file. Do not # remove or modify any license notices. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# \ No newline at end of file +# diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.cpp b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.cpp index deaf44e689..dfead4c96d 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.cpp +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestFixture.cpp @@ -19,4 +19,4 @@ namespace ScriptCanvasTests UnitTest::AllocatorsBase ScriptCanvasTestFixture::s_allocatorSetup = {}; AZStd::atomic_bool ScriptCanvasTestFixture::s_asyncOperationActive = {}; bool ScriptCanvasTestFixture::s_setupSucceeded = false; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestVerify.h b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestVerify.h index 7f734aa370..02e3a704ab 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestVerify.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestVerify.h @@ -20,4 +20,4 @@ namespace ScriptCanvasTests ScriptCanvasEditor::UnitTestResult VerifyReporterEditor(const ScriptCanvasEditor::Reporter& reporter); -} // ScriptCanvasTests \ No newline at end of file +} // ScriptCanvasTests diff --git a/Gems/ScriptCanvasTesting/Code/Source/Nodes/BehaviorContextObjectTestNode.h b/Gems/ScriptCanvasTesting/Code/Source/Nodes/BehaviorContextObjectTestNode.h index e710cfecf8..2460d37c02 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Nodes/BehaviorContextObjectTestNode.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Nodes/BehaviorContextObjectTestNode.h @@ -77,4 +77,4 @@ namespace ScriptCanvasTestingNodes AZStd::string m_string; }; -} \ No newline at end of file +} diff --git a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp index 34df10fdea..39f6479c12 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp +++ b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp @@ -24,6 +24,7 @@ namespace ScriptCanvasTesting { ScriptCanvasTesting::GlobalBusTraits::Reflect(context); ScriptCanvasTesting::LocalBusTraits::Reflect(context); + ScriptCanvasTesting::PerformanceStressBusTraits::Reflect(context); ScriptCanvasTesting::NativeHandlingOnlyBusTraits::Reflect(context); ScriptCanvasTesting::TestTupleMethods::Reflect(context); @@ -130,6 +131,87 @@ namespace ScriptCanvasTesting } } + class PerformanceStressEBusHandler + : public PerformanceStressEBus::Handler + , public AZ::BehaviorEBusHandler + { + public: + AZ_EBUS_BEHAVIOR_BINDER( + PerformanceStressEBusHandler, "{EAE36675-F06B-4755-B3A5-CEC9495DC92E}", AZ::SystemAllocator + , ForceStringCompare0 + , ForceStringCompare1 + , ForceStringCompare2 + , ForceStringCompare3 + , ForceStringCompare4 + , ForceStringCompare5 + , ForceStringCompare6 + , ForceStringCompare7 + , ForceStringCompare8 + , ForceStringCompare9 + ); + + void ForceStringCompare0() override + { + Call(FN_ForceStringCompare0); + } + void ForceStringCompare1() override + { + Call(FN_ForceStringCompare1); + } + void ForceStringCompare2() override + { + Call(FN_ForceStringCompare2); + } + void ForceStringCompare3() override + { + Call(FN_ForceStringCompare3); + } + void ForceStringCompare4() override + { + Call(FN_ForceStringCompare4); + } + void ForceStringCompare5() override + { + Call(FN_ForceStringCompare5); + } + void ForceStringCompare6() override + { + Call(FN_ForceStringCompare6); + } + void ForceStringCompare7() override + { + Call(FN_ForceStringCompare7); + } + void ForceStringCompare8() override + { + Call(FN_ForceStringCompare8); + } + void ForceStringCompare9() override + { + Call(FN_ForceStringCompare9); + } + }; + + void PerformanceStressBusTraits::Reflect(AZ::ReflectContext* context) + { + if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) + { + behaviorContext->EBus<PerformanceStressEBus>("PerformanceStressEBus") + ->Handler<PerformanceStressEBusHandler>() + ->Event("ForceStringCompare0", &PerformanceStressEBus::Events::ForceStringCompare0) + ->Event("ForceStringCompare1", &PerformanceStressEBus::Events::ForceStringCompare1) + ->Event("ForceStringCompare2", &PerformanceStressEBus::Events::ForceStringCompare2) + ->Event("ForceStringCompare3", &PerformanceStressEBus::Events::ForceStringCompare3) + ->Event("ForceStringCompare4", &PerformanceStressEBus::Events::ForceStringCompare4) + ->Event("ForceStringCompare5", &PerformanceStressEBus::Events::ForceStringCompare5) + ->Event("ForceStringCompare6", &PerformanceStressEBus::Events::ForceStringCompare6) + ->Event("ForceStringCompare7", &PerformanceStressEBus::Events::ForceStringCompare7) + ->Event("ForceStringCompare8", &PerformanceStressEBus::Events::ForceStringCompare8) + ->Event("ForceStringCompare9", &PerformanceStressEBus::Events::ForceStringCompare9) + ; + } + } + class LocalEBusHandler : public LocalEBus::Handler , public AZ::BehaviorEBusHandler diff --git a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.h b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.h index c31627f9fb..5aa8c3c3ec 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.h +++ b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.h @@ -46,6 +46,27 @@ namespace ScriptCanvasTesting }; using GlobalEBus = AZ::EBus<GlobalBusTraits>; + class PerformanceStressBusTraits : public AZ::EBusTraits + { + public: + AZ_TYPE_INFO(PerformanceStressBusTraits, "{68AF0B81-70F4-4822-8127-AAC442D924C7}"); + + static void Reflect(AZ::ReflectContext* context); + + virtual void ForceStringCompare0() = 0; + virtual void ForceStringCompare1() = 0; + virtual void ForceStringCompare2() = 0; + virtual void ForceStringCompare3() = 0; + virtual void ForceStringCompare4() = 0; + virtual void ForceStringCompare5() = 0; + virtual void ForceStringCompare6() = 0; + virtual void ForceStringCompare7() = 0; + virtual void ForceStringCompare8() = 0; + virtual void ForceStringCompare9() = 0; + }; + using PerformanceStressEBus = AZ::EBus<PerformanceStressBusTraits>; + + class LocalBusTraits : public AZ::EBusTraits { public: diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp index 9e6f7aa051..3e727ca3db 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp @@ -100,6 +100,11 @@ TEST_F(ScriptCanvasTestFixture, InterpretedReadEnumConstant) RunUnitTestGraph("LY_SC_UnitTest_ReadEnumConstant"); } +TEST_F(ScriptCanvasTestFixture, UserBranchSanityCheck) +{ + RunUnitTestGraph("LY_SC_UnitTest_UserBranchSanityCheck"); +} + TEST_F(ScriptCanvasTestFixture, InterpretedEventHandlerNoDisconnect) { GlobalHandler handler; @@ -130,6 +135,11 @@ TEST_F(ScriptCanvasTestFixture, InterpretedEventHandlerDisconnect) RunUnitTestGraph("LY_SC_UnitTest_EventHandlerDisconnect", runSpec); } +TEST_F(ScriptCanvasTestFixture, FunctionContainerInputTest) +{ + RunUnitTestGraph("LY_SC_UnitTest_FunctionContainerInputTest"); +} + TEST_F(ScriptCanvasTestFixture, InterpretedFixBoundMultipleResults) { RunUnitTestGraph("LY_SC_UnitTest_FixBoundMultipleResults"); @@ -283,6 +293,16 @@ TEST_F(ScriptCanvasTestFixture, NodeableDurationFunction) ExpectParse("LY_SC_UnitTest_NodeableDurationFunction"); } +TEST_F(ScriptCanvasTestFixture, LatentCallOfPureUserFunction) +{ + RunUnitTestGraph("LY_SC_UnitTest_LatentCallOfPureUserFunction", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); +} + +TEST_F(ScriptCanvasTestFixture, LatentCallOfNotPureUserFunction) +{ + RunUnitTestGraph("LY_SC_UnitTest_LatentCallOfNotPureUserFunction", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); +} + TEST_F(ScriptCanvasTestFixture, NodeableDurationSubgraph) { RunUnitTestGraph("LY_SC_UnitTest_NodeableDurationSubgraph", ExecutionMode::Interpreted, DurationSpec::Ticks(3)); @@ -887,6 +907,11 @@ TEST_F(ScriptCanvasTestFixture, InterpretedNodeableInputMethodSharedDataSlot) RunUnitTestGraph("LY_SC_UnitTest_NodeableInputMethodSharedDataSlot", ExecutionMode::Interpreted); } +TEST_F(ScriptCanvasTestFixture, InterpretedExecutionOutPerformance) +{ + RunUnitTestGraph("LY_SC_UnitTest_ExecutionOutPerformance", ExecutionMode::Interpreted); +} + #if defined(FUNCTION_LEGACY_SUPPORT_ENABLED) TEST_F(ScriptCanvasTestFixture, InterpretedSubgraph_UserNodeable) diff --git a/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake b/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake index 5e02bec82b..90cda4aa60 100644 --- a/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake +++ b/Gems/ScriptCanvasTesting/Code/scriptcanvastesting_autogen_files.cmake @@ -16,4 +16,4 @@ set(FILES ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvasNodeable_Source.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Macros.jinja ${LY_ROOT_FOLDER}/Gems/ScriptCanvas/Code/Include/ScriptCanvas/AutoGen/ScriptCanvas_Nodeable_Macros.jinja -) \ No newline at end of file +) diff --git a/Gems/ScriptEvents/Code/Source/precompiled.cpp b/Gems/ScriptEvents/Code/Source/precompiled.cpp index 07c726331b..6fdd7bdc45 100644 --- a/Gems/ScriptEvents/Code/Source/precompiled.cpp +++ b/Gems/ScriptEvents/Code/Source/precompiled.cpp @@ -10,4 +10,4 @@ * */ -#include "precompiled.h" \ No newline at end of file +#include "precompiled.h" diff --git a/Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp b/Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp index 59e80894c0..b703032f54 100644 --- a/Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp +++ b/Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp @@ -34,4 +34,4 @@ TEST_F(ScriptEventsEditorTests, StubTest) ASSERT_TRUE(true); } -AZ_UNIT_TEST_HOOK(); \ No newline at end of file +AZ_UNIT_TEST_HOOK(); diff --git a/Gems/ScriptedEntityTweener/Assets/Scripts/ScriptedEntityTweener/ScriptedEntityTweener.lua b/Gems/ScriptedEntityTweener/Assets/Scripts/ScriptedEntityTweener/ScriptedEntityTweener.lua index f1dd53bb79..eafbc57fb9 100644 --- a/Gems/ScriptedEntityTweener/Assets/Scripts/ScriptedEntityTweener/ScriptedEntityTweener.lua +++ b/Gems/ScriptedEntityTweener/Assets/Scripts/ScriptedEntityTweener/ScriptedEntityTweener.lua @@ -746,4 +746,4 @@ function ScriptedEntityTweener:OnTimelineAnimationStart(timelineId, animUuid, ad end end -return ScriptedEntityTweener \ No newline at end of file +return ScriptedEntityTweener diff --git a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerMath.h b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerMath.h index fc63ffa1c1..35ee2ac079 100644 --- a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerMath.h +++ b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerMath.h @@ -489,4 +489,4 @@ namespace ScriptedEntityTweener } } }; -} \ No newline at end of file +} diff --git a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerTask.h b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerTask.h index 8d157d95aa..afcd6215d5 100644 --- a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerTask.h +++ b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerTask.h @@ -161,4 +161,4 @@ namespace ScriptedEntityTweener void ExecuteCallbacks(const AZStd::set<CallbackData>& callbacks); void ClearCallbacks(const AnimationProperties& animationProperties); }; -} \ No newline at end of file +} diff --git a/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/OffsetPosition.h b/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/OffsetPosition.h index 7aac332d6c..606d02e757 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/OffsetPosition.h +++ b/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/OffsetPosition.h @@ -45,4 +45,4 @@ namespace Camera AZ::Vector3 m_positionalOffset = AZ::Vector3::CreateZero(); bool m_isRelativeOffset = false; }; -} // namespace Camera \ No newline at end of file +} // namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/SlideAlongAxisBasedOnAngle.h b/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/SlideAlongAxisBasedOnAngle.h index e68a5a2249..d8d5532cad 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/SlideAlongAxisBasedOnAngle.h +++ b/Gems/StartingPointCamera/Code/Source/CameraLookAtBehaviors/SlideAlongAxisBasedOnAngle.h @@ -51,4 +51,4 @@ namespace Camera float m_maximumPositiveSlideDistance = 0.0f; float m_maximumNegativeSlideDistance = 0.0f; }; -} // namespace Camera \ No newline at end of file +} // namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByEntityId.h b/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByEntityId.h index ada3a44480..17e17bb56f 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByEntityId.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByEntityId.h @@ -49,4 +49,4 @@ namespace Camera bool m_shouldUseTargetRotation = true; bool m_shouldUseTargetPosition = true; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByTag.h b/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByTag.h index b7af45c52f..4618cae498 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByTag.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTargetAcquirers/AcquireByTag.h @@ -59,4 +59,4 @@ namespace Camera // Private Data AZStd::vector<AZ::EntityId> m_targets; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FaceTarget.h b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FaceTarget.h index eb34b1d43c..b761201f93 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FaceTarget.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FaceTarget.h @@ -42,4 +42,4 @@ namespace Camera private: }; -} \ No newline at end of file +} diff --git a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FollowTargetFromAngle.h b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FollowTargetFromAngle.h index cd60834256..7ab3e4d80a 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FollowTargetFromAngle.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/FollowTargetFromAngle.h @@ -44,4 +44,4 @@ namespace Camera EulerAngleType m_rotationType = EulerAngleType::Pitch; float m_distanceFromTarget = 1.0f; }; -} //namespace Camera \ No newline at end of file +} //namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/OffsetCameraPosition.h b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/OffsetCameraPosition.h index ff2c95d77b..b8f2bf2822 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/OffsetCameraPosition.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/OffsetCameraPosition.h @@ -41,4 +41,4 @@ namespace Camera AZ::Vector3 m_offset = AZ::Vector3::CreateZero(); bool m_isRelativeOffset = false; }; -} // namespace Camera \ No newline at end of file +} // namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/Rotate.h b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/Rotate.h index e86d5593c6..603cc4a219 100644 --- a/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/Rotate.h +++ b/Gems/StartingPointCamera/Code/Source/CameraTransformBehaviors/Rotate.h @@ -42,4 +42,4 @@ namespace Camera float m_angleInDegrees = 0.f; AxisOfRotation m_axisType = X_Axis; }; -} // namespace Camera \ No newline at end of file +} // namespace Camera diff --git a/Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.cpp b/Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.cpp index 9937d08885..79702ea5f2 100644 --- a/Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.cpp +++ b/Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "StartingPointCamera_precompiled.h" \ No newline at end of file +#include "StartingPointCamera_precompiled.h" diff --git a/Gems/StartingPointInput/Assets/Editor/Icons/Components/InputConfig.svg b/Gems/StartingPointInput/Assets/Editor/Icons/Components/InputConfig.svg index 8c0a595aaa..4bed49745e 100644 --- a/Gems/StartingPointInput/Assets/Editor/Icons/Components/InputConfig.svg +++ b/Gems/StartingPointInput/Assets/Editor/Icons/Components/InputConfig.svg @@ -12,4 +12,4 @@ </mask> <use id="Page-1" fill="#65C98C" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/StartingPointInput/Assets/Scripts/Input/held.lua b/Gems/StartingPointInput/Assets/Scripts/Input/held.lua index b8200109c4..f43d82dbfe 100644 --- a/Gems/StartingPointInput/Assets/Scripts/Input/held.lua +++ b/Gems/StartingPointInput/Assets/Scripts/Input/held.lua @@ -42,4 +42,4 @@ function held:OnDeactivate() self.inputBus:Disconnect() end -return held \ No newline at end of file +return held diff --git a/Gems/StartingPointInput/Assets/Scripts/Input/pressed.lua b/Gems/StartingPointInput/Assets/Scripts/Input/pressed.lua index f9dad511db..c1241ce387 100644 --- a/Gems/StartingPointInput/Assets/Scripts/Input/pressed.lua +++ b/Gems/StartingPointInput/Assets/Scripts/Input/pressed.lua @@ -40,4 +40,4 @@ function pressed:OnDeactivate() self.inputBus:Disconnect() end -return pressed \ No newline at end of file +return pressed diff --git a/Gems/StartingPointInput/Assets/Scripts/Input/released.lua b/Gems/StartingPointInput/Assets/Scripts/Input/released.lua index e26dcb2ee0..bb943bd5cf 100644 --- a/Gems/StartingPointInput/Assets/Scripts/Input/released.lua +++ b/Gems/StartingPointInput/Assets/Scripts/Input/released.lua @@ -40,4 +40,4 @@ function released:OnDeactivate() self.inputBus:Disconnect() end -return released \ No newline at end of file +return released diff --git a/Gems/StartingPointInput/Assets/Scripts/Input/vectorized_combination.lua b/Gems/StartingPointInput/Assets/Scripts/Input/vectorized_combination.lua index 3c6fc761d9..6eb578c9cb 100644 --- a/Gems/StartingPointInput/Assets/Scripts/Input/vectorized_combination.lua +++ b/Gems/StartingPointInput/Assets/Scripts/Input/vectorized_combination.lua @@ -141,4 +141,4 @@ function vectorized_combination:DeprecatedUpdateZ(floatValue) end ------------------------------------------------------------------------- -return vectorized_combination \ No newline at end of file +return vectorized_combination diff --git a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml index 88f7c4cc69..d0b472d2d5 100644 --- a/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml +++ b/Gems/StartingPointInput/Code/Source/InputHandlerNodeable.ScriptCanvasNodeable.xml @@ -25,4 +25,4 @@ <Parameter Name="Event Name" Type="AZStd::string" Description="Event name as defined in an input binding asset. Example 'Fireball'."/> </Input>/> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml b/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml index f301ad723d..82c3eefcb3 100644 --- a/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml +++ b/Gems/StartingPointInput/Code/Source/InputNode.ScriptCanvasGrammar.xml @@ -25,4 +25,4 @@ IsInput="False" IsOutput="True" /> </Class> -</ScriptCanvas> \ No newline at end of file +</ScriptCanvas> diff --git a/Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.cpp b/Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.cpp index 988937c167..e4c7581b08 100644 --- a/Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.cpp +++ b/Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "StartingPointInput_precompiled.h" \ No newline at end of file +#include "StartingPointInput_precompiled.h" diff --git a/Gems/StartingPointMovement/Assets/Scripts/Components/AddPhysicsImpulse.lua b/Gems/StartingPointMovement/Assets/Scripts/Components/AddPhysicsImpulse.lua index d44678bd3b..1e785c3722 100644 --- a/Gems/StartingPointMovement/Assets/Scripts/Components/AddPhysicsImpulse.lua +++ b/Gems/StartingPointMovement/Assets/Scripts/Components/AddPhysicsImpulse.lua @@ -55,4 +55,4 @@ function AddPhysicsImpulse:OnDeactivate() self.gameplayBus:Disconnect() end -return AddPhysicsImpulse \ No newline at end of file +return AddPhysicsImpulse diff --git a/Gems/StartingPointMovement/Assets/Scripts/Components/EntityLookAt.lua b/Gems/StartingPointMovement/Assets/Scripts/Components/EntityLookAt.lua index ef5886630c..61834f01d6 100644 --- a/Gems/StartingPointMovement/Assets/Scripts/Components/EntityLookAt.lua +++ b/Gems/StartingPointMovement/Assets/Scripts/Components/EntityLookAt.lua @@ -85,4 +85,4 @@ function EntityLookAt:OnDeactivate() self.targetTransform = nil end -return EntityLookAt \ No newline at end of file +return EntityLookAt diff --git a/Gems/StartingPointMovement/Assets/Scripts/Components/MoveEntity.lua b/Gems/StartingPointMovement/Assets/Scripts/Components/MoveEntity.lua index 999df3dcf1..cb4432d389 100644 --- a/Gems/StartingPointMovement/Assets/Scripts/Components/MoveEntity.lua +++ b/Gems/StartingPointMovement/Assets/Scripts/Components/MoveEntity.lua @@ -55,4 +55,4 @@ function MoveEntity:OnDeactivate() self.gameplayBus:Disconnect() end -return MoveEntity \ No newline at end of file +return MoveEntity diff --git a/Gems/StartingPointMovement/Assets/Scripts/Components/RotateEntity.lua b/Gems/StartingPointMovement/Assets/Scripts/Components/RotateEntity.lua index b76a666ee3..0b3e2b9c41 100644 --- a/Gems/StartingPointMovement/Assets/Scripts/Components/RotateEntity.lua +++ b/Gems/StartingPointMovement/Assets/Scripts/Components/RotateEntity.lua @@ -65,4 +65,4 @@ function RotateEntity:OnDeactivate() self.gameplayBus:Disconnect() end -return RotateEntity \ No newline at end of file +return RotateEntity diff --git a/Gems/StartingPointMovement/Code/Include/StartingPointMovement/StartingPointMovementConstants.h b/Gems/StartingPointMovement/Code/Include/StartingPointMovement/StartingPointMovementConstants.h index dc7c5c3017..bb49d0f142 100644 --- a/Gems/StartingPointMovement/Code/Include/StartingPointMovement/StartingPointMovementConstants.h +++ b/Gems/StartingPointMovement/Code/Include/StartingPointMovement/StartingPointMovementConstants.h @@ -22,4 +22,4 @@ namespace Movement Y_Axis = 1, Z_Axis = 2 }; -} //namespace Movement \ No newline at end of file +} //namespace Movement diff --git a/Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.cpp b/Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.cpp index 6497334325..7027e2ede1 100644 --- a/Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.cpp +++ b/Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "StartingPointMovement_precompiled.h" \ No newline at end of file +#include "StartingPointMovement_precompiled.h" diff --git a/Gems/SurfaceData/Assets/Editor/Icons/Components/SurfaceData.svg b/Gems/SurfaceData/Assets/Editor/Icons/Components/SurfaceData.svg index 072b1d4939..090bacd5c1 100644 --- a/Gems/SurfaceData/Assets/Editor/Icons/Components/SurfaceData.svg +++ b/Gems/SurfaceData/Assets/Editor/Icons/Components/SurfaceData.svg @@ -6,4 +6,4 @@ <g id="icon-/-Environmental-/-Surface-Data" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M21.1504022,17.0250283 L22.9351306,22.0770469 L16.4632938,22.0770469 L16.1316327,20.0578353 L19.698235,20.0578353 L18.7976296,17.0250283 L21.1504022,17.0250283 Z M3.16484007,17.001392 L5.51761265,17.001392 L4.7567612,20.1085151 L8.56424139,20.1085151 L7.87245518,22.0770469 L1.06486942,22.0770469 L3.16484007,17.001392 Z M10.4834055,14.0030191 L10.7637653,14.6480401 C9.67541949,14.8495321 8.933732,15.2501196 8.933732,15.7114 C8.933732,16.3751943 10.4696146,16.9133059 12.3642218,16.9133059 C14.258829,16.9133059 15.7947116,16.3751943 15.7947116,15.7114 C15.7947116,15.2594563 15.0827451,14.8657735 14.0303362,14.6605187 L14.2964069,14.0030191 L16.1776104,14.0030191 L17.8709488,18.97694 L6.59798017,18.97694 L8.43727058,14.0030191 L10.4834055,14.0030191 Z M20.7168545,14.9545929 L18.2970728,14.9545929 L17.4743641,13.0514453 L20.0296152,13.0514453 L20.7168545,14.9545929 Z M3.72206852,14.9545929 L4.83035055,13.0514453 L7.38560161,13.0514453 L6.14185022,14.9545929 L3.72206852,14.9545929 Z M4.2856351,7.15493845 L5.12956162,7.4959069 L3.01588623,9.36165503 L2.79149296,6.55126584 L3.72665459,6.92909567 C4.39921197,5.40846002 5.44793029,3.60960289 6.39905176,3.10967934 C7.81993244,2.36284336 9.53420368,2.5839193 10.5186736,3.77314285 C11.254953,4.66255634 11.6422812,6.13536824 12.2022328,7.87218297 C12.2022328,5.90802867 12.2778036,3.87076362 13.6958635,2.53160517 C15.2015649,1.10968164 17.4613298,1.24808271 19.0776668,2.23852946 L19.8082418,1.33634448 L20.9744868,3.90315426 L18.221292,3.29606434 L18.8145883,2.56340443 C17.3271124,1.97349977 15.9573931,2.32981632 14.8192094,3.77314285 C13.8679242,4.97946412 13.5218004,7.25683912 13.4144313,9.43732972 C14.2672555,7.29959901 15.329817,6.20527797 16.1166241,5.85432911 C17.9533306,5.0350813 19.7229549,6.77109418 20.1616243,8.88013833 L21.460831,8.74358621 L20.3068849,11.8193051 L18.5386774,9.05071692 L19.6566524,8.93321302 C18.9375592,7.65276929 17.6234316,7.39000755 16.7252772,7.7061777 C14.3292213,8.54964228 14.0552947,11.0169601 12.9878205,15.3062633 C12.9878205,15.3103183 12.1359876,15.3103183 11.9036786,15.3062633 L11.9069618,15.2887223 C11.679267,15.2892791 11.4660593,15.2951261 11.3753538,15.3062633 C11.3753538,14.4823645 11.4929889,14.6752979 11.1704344,13.418079 C10.84788,12.1608601 10.239422,10.5052322 8.69987023,11.4550865 L8.69987023,10.7464725 C10.0026807,9.83397556 10.7272318,10.8221221 11.3753538,11.9728705 C10.9863971,9.83397556 10.2980196,9.27588785 9.64305323,8.47611675 C8.88748351,7.55350014 8.19517876,7.11360366 7.48766824,7.63988233 L8.18215464,8.33436872 L5.50750032,9.22592016 L6.39905176,6.55126584 L7.08548907,7.23770316 C7.68411556,6.46361352 8.53546795,6.23491918 9.57450971,7.06572569 C10.0757529,7.46651433 10.489265,7.84488785 10.8750712,8.36621315 C10.5206001,7.04193732 10.144264,6.12548665 9.74606291,5.61686114 C8.99472791,4.65717488 8.08338892,3.78707723 6.32118079,4.5725635 C5.34730044,5.00666072 4.75549362,6.14014111 4.2856351,7.15493845 L4.2856351,7.15493845 Z" id="Shape" fill="#8BDD15"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/SurfaceData/Assets/Editor/Icons/Components/Viewport/SurfaceData.svg b/Gems/SurfaceData/Assets/Editor/Icons/Components/Viewport/SurfaceData.svg index afcc4aeb72..6771b1254d 100644 --- a/Gems/SurfaceData/Assets/Editor/Icons/Components/Viewport/SurfaceData.svg +++ b/Gems/SurfaceData/Assets/Editor/Icons/Components/Viewport/SurfaceData.svg @@ -22,4 +22,4 @@ </g> <path d="M21.1504022,17.0250283 L22.9351306,22.0770469 L16.4632938,22.0770469 L16.1316327,20.0578353 L19.698235,20.0578353 L18.7976296,17.0250283 L21.1504022,17.0250283 Z M3.16484007,17.001392 L5.51761265,17.001392 L4.7567612,20.1085151 L8.56424139,20.1085151 L7.87245518,22.0770469 L1.06486942,22.0770469 L3.16484007,17.001392 Z M10.4834055,14.0030191 L10.7637653,14.6480401 C9.67541949,14.8495321 8.933732,15.2501196 8.933732,15.7114 C8.933732,16.3751943 10.4696146,16.9133059 12.3642218,16.9133059 C14.258829,16.9133059 15.7947116,16.3751943 15.7947116,15.7114 C15.7947116,15.2594563 15.0827451,14.8657735 14.0303362,14.6605187 L14.2964069,14.0030191 L16.1776104,14.0030191 L17.8709488,18.97694 L6.59798017,18.97694 L8.43727058,14.0030191 L10.4834055,14.0030191 Z M20.7168545,14.9545929 L18.2970728,14.9545929 L17.4743641,13.0514453 L20.0296152,13.0514453 L20.7168545,14.9545929 Z M3.72206852,14.9545929 L4.83035055,13.0514453 L7.38560161,13.0514453 L6.14185022,14.9545929 L3.72206852,14.9545929 Z M4.2856351,7.15493845 L5.12956162,7.4959069 L3.01588623,9.36165503 L2.79149296,6.55126584 L3.72665459,6.92909567 C4.39921197,5.40846002 5.44793029,3.60960289 6.39905176,3.10967934 C7.81993244,2.36284336 9.53420368,2.5839193 10.5186736,3.77314285 C11.254953,4.66255634 11.6422812,6.13536824 12.2022328,7.87218297 C12.2022328,5.90802867 12.2778036,3.87076362 13.6958635,2.53160517 C15.2015649,1.10968164 17.4613298,1.24808271 19.0776668,2.23852946 L19.8082418,1.33634448 L20.9744868,3.90315426 L18.221292,3.29606434 L18.8145883,2.56340443 C17.3271124,1.97349977 15.9573931,2.32981632 14.8192094,3.77314285 C13.8679242,4.97946412 13.5218004,7.25683912 13.4144313,9.43732972 C14.2672555,7.29959901 15.329817,6.20527797 16.1166241,5.85432911 C17.9533306,5.0350813 19.7229549,6.77109418 20.1616243,8.88013833 L21.460831,8.74358621 L20.3068849,11.8193051 L18.5386774,9.05071692 L19.6566524,8.93321302 C18.9375592,7.65276929 17.6234316,7.39000755 16.7252772,7.7061777 C14.3292213,8.54964228 14.0552947,11.0169601 12.9878205,15.3062633 C12.9878205,15.3103183 12.1359876,15.3103183 11.9036786,15.3062633 L11.9069618,15.2887223 C11.679267,15.2892791 11.4660593,15.2951261 11.3753538,15.3062633 C11.3753538,14.4823645 11.4929889,14.6752979 11.1704344,13.418079 C10.84788,12.1608601 10.239422,10.5052322 8.69987023,11.4550865 L8.69987023,10.7464725 C10.0026807,9.83397556 10.7272318,10.8221221 11.3753538,11.9728705 C10.9863971,9.83397556 10.2980196,9.27588785 9.64305323,8.47611675 C8.88748351,7.55350014 8.19517876,7.11360366 7.48766824,7.63988233 L8.18215464,8.33436872 L5.50750032,9.22592016 L6.39905176,6.55126584 L7.08548907,7.23770316 C7.68411556,6.46361352 8.53546795,6.23491918 9.57450971,7.06572569 C10.0757529,7.46651433 10.489265,7.84488785 10.8750712,8.36621315 C10.5206001,7.04193732 10.144264,6.12548665 9.74606291,5.61686114 C8.99472791,4.65717488 8.08338892,3.78707723 6.32118079,4.5725635 C5.34730044,5.00666072 4.75549362,6.14014111 4.2856351,7.15493845 L4.2856351,7.15493845 Z" id="Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataConstants.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataConstants.h index c3581ca6eb..c57ab39cfc 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataConstants.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataConstants.h @@ -33,4 +33,4 @@ namespace SurfaceData s_terrainTagName, }; } -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataModifierRequestBus.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataModifierRequestBus.h index 4c9bd7ebde..e0f30ea864 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataModifierRequestBus.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataModifierRequestBus.h @@ -39,4 +39,4 @@ namespace SurfaceData }; typedef AZ::EBus<SurfaceDataModifierRequests> SurfaceDataModifierRequestBus; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataProviderRequestBus.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataProviderRequestBus.h index 9238f163a9..5db65add4a 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataProviderRequestBus.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataProviderRequestBus.h @@ -38,4 +38,4 @@ namespace SurfaceData }; typedef AZ::EBus<SurfaceDataProviderRequests> SurfaceDataProviderRequestBus; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagEnumeratorRequestBus.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagEnumeratorRequestBus.h index 987a74218b..1fcac325eb 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagEnumeratorRequestBus.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagEnumeratorRequestBus.h @@ -32,4 +32,4 @@ namespace SurfaceData }; typedef AZ::EBus<SurfaceDataTagEnumeratorRequests> SurfaceDataTagEnumeratorRequestBus; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagProviderRequestBus.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagProviderRequestBus.h index b856eded75..e90d16b6f7 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagProviderRequestBus.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTagProviderRequestBus.h @@ -38,4 +38,4 @@ namespace SurfaceData }; typedef AZ::EBus<SurfaceDataTagProviderRequests> SurfaceDataTagProviderRequestBus; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h index caba930753..8691f8fa5c 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h @@ -49,4 +49,4 @@ namespace SurfaceData using SurfaceDataRegistryHandle = AZ::u32; const SurfaceDataRegistryHandle InvalidSurfaceDataRegistryHandle = 0; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h index 11cff4987a..0e116b3535 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h @@ -82,4 +82,4 @@ namespace SurfaceData { return static_cast<AZ::u32>(m_surfaceTagCrc); } -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.cpp b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.cpp index 36d30304e0..4e131ce52c 100644 --- a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.cpp +++ b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.cpp @@ -24,4 +24,4 @@ namespace SurfaceData { BaseClassType::ReflectSubClass<EditorSurfaceDataShapeComponent, BaseClassType>(context, 2, &LmbrCentral::EditorWrappedComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType,2>); } -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.h b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.h index e17957bb43..752c953bac 100644 --- a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.h +++ b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceDataShapeComponent.h @@ -35,4 +35,4 @@ namespace SurfaceData static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/SurfaceData.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/surfacedata/shape-surface-tag-emitter"; }; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.cpp b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.cpp index c381ad17a9..f889e2ed14 100644 --- a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.cpp +++ b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.cpp @@ -41,4 +41,4 @@ namespace SurfaceData } } } -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.h b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.h index adf2066b00..bc719345dd 100644 --- a/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.h +++ b/Gems/SurfaceData/Code/Source/Editor/EditorSurfaceTagListAsset.h @@ -35,4 +35,4 @@ namespace SurfaceData AZStd::vector<AZStd::string> m_surfaceTagNames; }; -} // namespace SurfaceData \ No newline at end of file +} // namespace SurfaceData diff --git a/Gems/SurfaceData/Code/Source/SurfaceDataEditorModule.h b/Gems/SurfaceData/Code/Source/SurfaceDataEditorModule.h index b13e5060b8..d0f111564a 100644 --- a/Gems/SurfaceData/Code/Source/SurfaceDataEditorModule.h +++ b/Gems/SurfaceData/Code/Source/SurfaceDataEditorModule.h @@ -28,4 +28,4 @@ namespace SurfaceData AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/SurfaceData/Code/Source/SurfaceDataModule.h b/Gems/SurfaceData/Code/Source/SurfaceDataModule.h index 97866dd19c..f32e66c57b 100644 --- a/Gems/SurfaceData/Code/Source/SurfaceDataModule.h +++ b/Gems/SurfaceData/Code/Source/SurfaceDataModule.h @@ -28,4 +28,4 @@ namespace SurfaceData AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/Twitch/Code/Source/Platform/Android/Twitch_Traits_Platform.h b/Gems/Twitch/Code/Source/Platform/Android/Twitch_Traits_Platform.h index bb03826d6b..1a46ce9e4a 100644 --- a/Gems/Twitch/Code/Source/Platform/Android/Twitch_Traits_Platform.h +++ b/Gems/Twitch/Code/Source/Platform/Android/Twitch_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <Twitch_Traits_Android.h> \ No newline at end of file +#include <Twitch_Traits_Android.h> diff --git a/Gems/Twitch/Code/Source/Platform/Linux/Twitch_Traits_Platform.h b/Gems/Twitch/Code/Source/Platform/Linux/Twitch_Traits_Platform.h index 531241c80b..412cd91622 100644 --- a/Gems/Twitch/Code/Source/Platform/Linux/Twitch_Traits_Platform.h +++ b/Gems/Twitch/Code/Source/Platform/Linux/Twitch_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <Twitch_Traits_Linux.h> \ No newline at end of file +#include <Twitch_Traits_Linux.h> diff --git a/Gems/Twitch/Code/Source/Platform/Mac/Twitch_Traits_Platform.h b/Gems/Twitch/Code/Source/Platform/Mac/Twitch_Traits_Platform.h index 0c2cd66569..02f8de2ac8 100644 --- a/Gems/Twitch/Code/Source/Platform/Mac/Twitch_Traits_Platform.h +++ b/Gems/Twitch/Code/Source/Platform/Mac/Twitch_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <Twitch_Traits_Mac.h> \ No newline at end of file +#include <Twitch_Traits_Mac.h> diff --git a/Gems/Twitch/Code/Source/Platform/Windows/Twitch_Traits_Platform.h b/Gems/Twitch/Code/Source/Platform/Windows/Twitch_Traits_Platform.h index 1d2e5a99b7..20ca2acbba 100644 --- a/Gems/Twitch/Code/Source/Platform/Windows/Twitch_Traits_Platform.h +++ b/Gems/Twitch/Code/Source/Platform/Windows/Twitch_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <Twitch_Traits_Windows.h> \ No newline at end of file +#include <Twitch_Traits_Windows.h> diff --git a/Gems/Twitch/Code/Source/Platform/iOS/Twitch_Traits_Platform.h b/Gems/Twitch/Code/Source/Platform/iOS/Twitch_Traits_Platform.h index 00d58837c0..377294b493 100644 --- a/Gems/Twitch/Code/Source/Platform/iOS/Twitch_Traits_Platform.h +++ b/Gems/Twitch/Code/Source/Platform/iOS/Twitch_Traits_Platform.h @@ -11,4 +11,4 @@ */ #pragma once -#include <Twitch_Traits_iOS.h> \ No newline at end of file +#include <Twitch_Traits_iOS.h> diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Normal.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Pressed.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Pressed.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Selected.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Selected.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Selected.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Sliced_Selected.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Normal.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Normal.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Normal.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Normal.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Pressed.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Pressed.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Selected.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Selected.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Selected.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Button_Stretched_Selected.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Checkered.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Checkered.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Checkered.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Checkered.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Normal.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Normal.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Normal.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Normal.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Pressed.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Pressed.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Selected.tif.exportsettings b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Selected.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Selected.tif.exportsettings +++ b/Gems/UiBasics/Assets/Textures/Basic/Text_Input_Sliced_Selected.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/Vegetation.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/Vegetation.svg index dfdd4cb16a..26f0021c46 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/Vegetation.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/Vegetation.svg @@ -12,4 +12,4 @@ </mask> <use id="icon" fill="#8BDD15" transform="translate(11.749278, 12.008946) scale(-1, -1) rotate(94.000000) translate(-11.749278, -12.008946) " xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationFilter.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationFilter.svg index 2e729d8cf0..5a8735c811 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationFilter.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationFilter.svg @@ -6,4 +6,4 @@ <g id="icon-/-Environmental-/-Vegetation-filters" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M13.2757249,5.61266942 C14.6700344,4.32663901 16.7464514,3.1136198 19.5049758,1.97361179 C18.3308935,3.31114352 17.6946873,4.38470302 17.596357,5.19429027 C17.5206795,5.81736916 17.6284482,6.37562598 17.7009931,6.97894984 L12.0698529,6.97894984 L11.5889016,6.97853336 C11.5889016,5.85534988 10.6580513,4.53822635 8.79635054,3.02716276 C10.2243756,4.82473963 10.7142904,6.14186316 10.266095,6.97853336 L6.17467181,6.97853336 C6.79143854,5.72352806 7.4993654,4.69837542 7.4993654,3.64516341 C7.4993654,2.94302207 6.74883823,2.09979724 5.2477839,1.11548892 C8.7911085,0.973906153 11.4670888,2.47296632 13.2757249,5.61266942 L13.2757249,5.61266942 Z M6.16453499,20.1138223 L18.3275942,20.1138223 C19.4956716,20.1138223 20.3247501,20.6196731 20.3247501,22.1240911 L4.25931167,22.1240911 C4.25931167,20.6469803 5.16453499,20.1138223 6.16453499,20.1138223 Z M2.04920553,8.0011215 L22.0775707,8.0011215 L22.0775707,8.97528384 L2.05567026,8.97528384 L2.04920553,8.0011215 Z M1.7435383,11.3791831 C2.20983101,11.5033627 2.86824101,11.6904961 3.7187683,11.9405833 C4.11517516,12.0532272 4.34521048,12.4658943 4.23256658,12.8623012 C4.11850369,13.2600935 3.70534891,13.4891089 3.30927035,13.3755352 L1.7435383,12.9222724 C1.26597505,12.7840221 1.03120556,12.5516997 1.03120556,11.9405833 C1.03120556,11.3294668 1.54712312,11.3268752 1.7435383,11.3791831 Z M22.3037139,11.383563 C22.500129,11.3312552 23.0160466,11.3338468 23.0160466,11.9449632 C23.0160466,12.5560796 22.7812771,12.7884021 22.3037139,12.9266523 L20.7379818,13.3799152 C20.3419033,13.4934889 19.9287485,13.2644734 19.8146856,12.8666812 C19.7020417,12.4702743 19.932077,12.0576071 20.3284839,11.9449632 C21.1790111,11.6948761 21.8374211,11.5077427 22.3037139,11.383563 Z M7.29967181,19.0872707 C4.64630495,19.0872707 3.07906125,17.4572111 2.30384853,13.700619 L3.26583414,14.013187 C3.83801539,14.1991 4.70017038,14.0994649 4.9302508,13.0226812 C5.16033122,11.9458975 4.56128656,11.5399211 3.98910531,11.3540082 L2.02143013,10.7146717 C2.01573865,10.7128225 2.01004298,10.7110226 2.00434357,10.7092718 C2.00423668,10.6998187 2.0041827,10.6907598 2.0041827,10.6821093 C2.0041827,10.2464567 2.00880935,10.1362133 2.0041827,10.0119151 L12.1664366,10.0119151 L22.0430695,10.0162951 C22.0384428,10.1405932 22.0430695,10.2508366 22.0430695,10.6864893 C22.0430695,10.6951397 22.0430155,10.7041987 22.0429086,10.7136518 C22.0372092,10.7154025 22.0315135,10.7172024 22.025822,10.7190517 L20.0581469,11.3583881 C19.4859656,11.5443011 18.8869209,11.9502775 19.1170014,13.0270612 C19.3470818,14.1038449 20.2092368,14.20348 20.781418,14.017567 L21.7434036,13.7049989 C20.9681909,17.4615911 19.7717625,19.0916506 17.1183956,19.0916506 L11.9969138,19.0916506 L7.29967181,19.0872707 Z M7.67135054,12.9407833 C8.29267088,12.9407833 8.79635054,12.4371036 8.79635054,11.8157833 C8.79635054,11.1944629 8.29267088,10.6907833 7.67135054,10.6907833 C7.05003019,10.6907833 6.54635054,11.1944629 6.54635054,11.8157833 C6.54635054,12.4371036 7.05003019,12.9407833 7.67135054,12.9407833 Z M12.0633881,12.9407833 C12.6847085,12.9407833 13.1883881,12.4371036 13.1883881,11.8157833 C13.1883881,11.1944629 12.6847085,10.6907833 12.0633881,10.6907833 C11.4420678,10.6907833 10.9383881,11.1944629 10.9383881,11.8157833 C10.9383881,12.4371036 11.4420678,12.9407833 12.0633881,12.9407833 Z M16.4554257,12.9407833 C17.0767461,12.9407833 17.5804257,12.4371036 17.5804257,11.8157833 C17.5804257,11.1944629 17.0767461,10.6907833 16.4554257,10.6907833 C15.8341054,10.6907833 15.3304257,11.1944629 15.3304257,11.8157833 C15.3304257,12.4371036 15.8341054,12.9407833 16.4554257,12.9407833 Z M6.17467181,15.5245306 C6.79599216,15.5245306 7.29967181,15.020851 7.29967181,14.3995306 C7.29967181,13.7782103 6.79599216,13.2745306 6.17467181,13.2745306 C5.55335147,13.2745306 5.04967181,13.7782103 5.04967181,14.3995306 C5.04967181,15.020851 5.55335147,15.5245306 6.17467181,15.5245306 Z M10.0582239,15.5245306 C10.6795443,15.5245306 11.1832239,15.020851 11.1832239,14.3995306 C11.1832239,13.7782103 10.6795443,13.2745306 10.0582239,13.2745306 C9.43690359,13.2745306 8.93322394,13.7782103 8.93322394,14.3995306 C8.93322394,15.020851 9.43690359,15.5245306 10.0582239,15.5245306 Z M13.9417761,15.5245306 C14.5630964,15.5245306 15.0667761,15.020851 15.0667761,14.3995306 C15.0667761,13.7782103 14.5630964,13.2745306 13.9417761,13.2745306 C13.3204557,13.2745306 12.8167761,13.7782103 12.8167761,14.3995306 C12.8167761,15.020851 13.3204557,15.5245306 13.9417761,15.5245306 Z M17.8253282,15.5245306 C18.4466485,15.5245306 18.9503282,15.020851 18.9503282,14.3995306 C18.9503282,13.7782103 18.4466485,13.2745306 17.8253282,13.2745306 C17.2040078,13.2745306 16.7003282,13.7782103 16.7003282,14.3995306 C16.7003282,15.020851 17.2040078,15.5245306 17.8253282,15.5245306 Z M7.73047982,18.1082779 C8.35180017,18.1082779 8.85547982,17.6045983 8.85547982,16.9832779 C8.85547982,16.3619576 8.35180017,15.8582779 7.73047982,15.8582779 C7.10915948,15.8582779 6.60547982,16.3619576 6.60547982,16.9832779 C6.60547982,17.6045983 7.10915948,18.1082779 7.73047982,18.1082779 Z M12.0633881,18.1082779 C12.6847085,18.1082779 13.1883881,17.6045983 13.1883881,16.9832779 C13.1883881,16.3619576 12.6847085,15.8582779 12.0633881,15.8582779 C11.4420678,15.8582779 10.9383881,16.3619576 10.9383881,16.9832779 C10.9383881,17.6045983 11.4420678,18.1082779 12.0633881,18.1082779 Z M16.3962964,18.1082779 C17.0176168,18.1082779 17.5212964,17.6045983 17.5212964,16.9832779 C17.5212964,16.3619576 17.0176168,15.8582779 16.3962964,15.8582779 C15.7749761,15.8582779 15.2712964,16.3619576 15.2712964,16.9832779 C15.2712964,17.6045983 15.7749761,18.1082779 16.3962964,18.1082779 Z" id="Shape" fill="#8BDD15"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationModifier.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationModifier.svg index 572a09fe34..76f7bc976d 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationModifier.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/VegetationModifier.svg @@ -6,4 +6,4 @@ <g id="icon-/-Environmental-/-Vegetation-modifier" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M12.2342715,17.9336346 L10.9975676,17.9336346 C10.9826226,18.4103557 10.9405406,18.8281587 10.8713217,19.1870438 C10.7592574,19.7680732 10.4944473,20.1828113 9.45886306,20.1828113 C8.99185102,20.1828113 8.64473292,20.0842179 8.16842489,19.9083617 C7.47064668,19.6507371 7.04291891,19.5940875 6.92149675,20.0357075 C6.79238675,20.5052887 7.21776518,20.990044 7.92438389,21.2435639 C8.30644741,21.3806402 9.14410197,21.7176351 10.1033875,21.5684116 C10.9589703,21.4353198 11.3485441,21.2418913 11.6154058,20.8640344 C11.882187,21.2445117 12.2715342,21.4404622 13.1284516,21.5684116 C13.772976,21.6646479 14.7201204,21.4748192 15.3074552,21.2435639 C16.0056217,20.96867 16.4394524,20.5052887 16.3103424,20.0357075 C16.1889202,19.5940875 15.7611924,19.6507371 15.0634142,19.9083617 C14.5871062,20.0842179 14.2399881,20.1828113 13.772976,20.1828113 C12.7373918,20.1828113 12.4725817,19.7680732 12.3605174,19.1870438 C12.2912985,18.8281587 12.2492165,18.4103557 12.2342715,17.9336346 Z M10.4503822,8.90834362 C10.3476619,8.49061427 10.2701881,8.19283295 10.2179608,8.01499969 C10.1600503,7.81781535 9.8932144,7.36060341 9.60929492,6.90349273 C9.57554936,6.91713931 9.53912599,6.93180764 9.49959795,6.94772627 C7.18638684,7.95218811 6.01998307,7.28290301 5.31395443,6.29907895 C4.6079258,5.31525489 5.09977947,4.06531012 3.90917836,3.26803092 C3.11544429,2.73651146 2.3843444,2.37818828 1.7158787,2.19306139 C3.57999468,1.41915602 5.2886087,1.27124415 7.08881269,1.93461026 C8.58931404,2.48753745 9.82639635,3.30183741 10.0816143,4.48981762 C10.1681319,4.89253733 10.4456691,5.66991 10.3805725,6.47600915 L10.3583633,6.4918275 C10.5773424,6.84884639 10.9018762,7.20147149 10.9636533,7.25901665 C11.3214371,7.07389866 11.5500469,6.90584907 11.8893312,6.65066354 C11.9614359,6.59643153 12.1262494,6.45716852 12.3202215,6.28861319 C12.7209457,4.19458887 13.4747642,3.39693565 14.9673537,2.94486368 C16.5502709,2.4654335 17.3775843,4.11948644 18.6103654,3.64152055 C19.4322195,3.32287662 20.0900099,2.95990922 20.5837368,2.55261832 C20.1820966,4.37124519 19.2541756,5.78536903 17.7999739,6.79498986 C16.5878714,7.63652639 15.7448358,7.936971 14.6264599,7.8591207 C14.2075426,7.82995981 13.4217609,7.43093914 12.7986274,7.04678285 C12.6981862,7.13347766 12.6134971,7.20739467 12.5558439,7.25901665 C12.0650873,7.69843422 11.4395113,7.92179585 11.593059,8.27879831 C11.6315048,8.36818603 11.7012363,8.57803447 11.8022533,8.90834362 L15.4058551,8.90834362 C15.7723427,8.90834362 16.0041586,9.06339708 16.0041586,9.46644598 C16.0041586,9.86949487 15.7466133,10.0110776 15.4058551,10.0110776 L14.9321198,10.0110776 L14.9321198,13.9218667 C16.8518864,16.6773769 18.0000615,18.2639277 18.3766451,18.6815193 C18.9415205,19.3079066 19.2045476,19.8923642 19.2045476,21.0248377 C19.2045476,22.1573111 18.2111371,22.9818284 17.0878277,22.9818284 L6.22106659,22.9818284 C5.10512726,22.9818284 4.00469865,22.2585958 4.00469865,21.0248377 C4.00469865,19.7910795 4.33008665,19.4182823 4.78830025,18.792392 C5.09377599,18.3751318 6.12247175,16.7516234 7.87438754,13.9218667 L7.87438754,9.9084028 L7.24306009,9.9084028 C6.97965601,9.9084028 6.75013678,9.75897236 6.75013678,9.49453544 C6.75013678,8.87909992 7.07790467,8.90834362 7.3431061,8.90834362 L10.4503822,8.90834362 Z M13.9565218,9.92323333 L12.011359,9.92323333 C12.2380969,11.0079268 12.3514658,11.7561863 12.3514658,12.1680117 C12.3514658,12.5798372 12.3575699,14.1530986 12.3697782,16.8877959 L15.8941569,16.8877959 L13.9565218,14.3078205 L13.9565218,9.92323333 Z M8.98109858,9.94390162 L9.01723528,14.1935372 L7.24986315,16.8569769 L10.9563644,16.8569769 C10.9563644,14.0367789 10.9563644,12.4522075 10.9563644,12.1032627 C10.9563644,11.754318 10.8844396,11.0374988 10.7405899,9.95280533 L8.98109858,9.94390162 Z" id="Shape" fill="#8BDD15"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/Vegetation.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/Vegetation.svg index b1e81a1bbd..7ebd8706e1 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/Vegetation.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/Vegetation.svg @@ -22,4 +22,4 @@ </g> <path d="M16.8640145,20.5860528 C14.1067456,21.2957922 10.4856492,19.9760208 9.44951806,16.9086684 C8.41338693,13.841316 9.7019912,10.5900752 7.28107823,7.62089465 C5.66713626,5.64144095 4.07795128,4.15377841 2.51352331,3.15790702 C7.88467524,2.63634834 12.6123672,3.927226 16.6965992,7.03054 C20.1008777,9.61720622 21.6278746,12.3633058 21.3517796,15.6002502 C21.2581848,16.6975591 20.5089184,17.8549148 19.1039807,19.0723173 C18.8754014,16.3493626 18.2367843,14.2790229 17.1881294,12.861298 C16.1394744,11.4435731 14.5458286,10.0248741 12.4071919,8.60520077 C15.2667968,11.7596771 16.8604426,14.3719313 17.1881294,16.4419634 C17.5158161,18.5119955 17.4077779,19.8933587 16.8640145,20.5860528 Z" id="icon" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationFilter.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationFilter.svg index 51f30925f6..481b2a9568 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationFilter.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationFilter.svg @@ -22,4 +22,4 @@ </g> <path d="M13.2757249,5.61266942 C14.6700344,4.32663901 16.7464514,3.1136198 19.5049758,1.97361179 C18.3308935,3.31114352 17.6946873,4.38470302 17.596357,5.19429027 C17.5206795,5.81736916 17.6284482,6.37562598 17.7009931,6.97894984 L12.0698529,6.97894984 L11.5889016,6.97853336 C11.5889016,5.85534988 10.6580513,4.53822635 8.79635054,3.02716276 C10.2243756,4.82473963 10.7142904,6.14186316 10.266095,6.97853336 L6.17467181,6.97853336 C6.79143854,5.72352806 7.4993654,4.69837542 7.4993654,3.64516341 C7.4993654,2.94302207 6.74883823,2.09979724 5.2477839,1.11548892 C8.7911085,0.973906153 11.4670888,2.47296632 13.2757249,5.61266942 L13.2757249,5.61266942 Z M6.16453499,20.1138223 L18.3275942,20.1138223 C19.4956716,20.1138223 20.3247501,20.6196731 20.3247501,22.1240911 L4.25931167,22.1240911 C4.25931167,20.6469803 5.16453499,20.1138223 6.16453499,20.1138223 Z M2.04920553,8.0011215 L22.0775707,8.0011215 L22.0775707,8.97528384 L2.05567026,8.97528384 L2.04920553,8.0011215 Z M1.7435383,11.3791831 C2.20983101,11.5033627 2.86824101,11.6904961 3.7187683,11.9405833 C4.11517516,12.0532272 4.34521048,12.4658943 4.23256658,12.8623012 C4.11850369,13.2600935 3.70534891,13.4891089 3.30927035,13.3755352 L1.7435383,12.9222724 C1.26597505,12.7840221 1.03120556,12.5516997 1.03120556,11.9405833 C1.03120556,11.3294668 1.54712312,11.3268752 1.7435383,11.3791831 Z M22.3037139,11.383563 C22.500129,11.3312552 23.0160466,11.3338468 23.0160466,11.9449632 C23.0160466,12.5560796 22.7812771,12.7884021 22.3037139,12.9266523 L20.7379818,13.3799152 C20.3419033,13.4934889 19.9287485,13.2644734 19.8146856,12.8666812 C19.7020417,12.4702743 19.932077,12.0576071 20.3284839,11.9449632 C21.1790111,11.6948761 21.8374211,11.5077427 22.3037139,11.383563 Z M7.29967181,19.0872707 C4.64630495,19.0872707 3.07906125,17.4572111 2.30384853,13.700619 L3.26583414,14.013187 C3.83801539,14.1991 4.70017038,14.0994649 4.9302508,13.0226812 C5.16033122,11.9458975 4.56128656,11.5399211 3.98910531,11.3540082 L2.02143013,10.7146717 C2.01573865,10.7128225 2.01004298,10.7110226 2.00434357,10.7092718 C2.00423668,10.6998187 2.0041827,10.6907598 2.0041827,10.6821093 C2.0041827,10.2464567 2.00880935,10.1362133 2.0041827,10.0119151 L12.1664366,10.0119151 L22.0430695,10.0162951 C22.0384428,10.1405932 22.0430695,10.2508366 22.0430695,10.6864893 C22.0430695,10.6951397 22.0430155,10.7041987 22.0429086,10.7136518 C22.0372092,10.7154025 22.0315135,10.7172024 22.025822,10.7190517 L20.0581469,11.3583881 C19.4859656,11.5443011 18.8869209,11.9502775 19.1170014,13.0270612 C19.3470818,14.1038449 20.2092368,14.20348 20.781418,14.017567 L21.7434036,13.7049989 C20.9681909,17.4615911 19.7717625,19.0916506 17.1183956,19.0916506 L11.9969138,19.0916506 L7.29967181,19.0872707 Z M7.67135054,12.9407833 C8.29267088,12.9407833 8.79635054,12.4371036 8.79635054,11.8157833 C8.79635054,11.1944629 8.29267088,10.6907833 7.67135054,10.6907833 C7.05003019,10.6907833 6.54635054,11.1944629 6.54635054,11.8157833 C6.54635054,12.4371036 7.05003019,12.9407833 7.67135054,12.9407833 Z M12.0633881,12.9407833 C12.6847085,12.9407833 13.1883881,12.4371036 13.1883881,11.8157833 C13.1883881,11.1944629 12.6847085,10.6907833 12.0633881,10.6907833 C11.4420678,10.6907833 10.9383881,11.1944629 10.9383881,11.8157833 C10.9383881,12.4371036 11.4420678,12.9407833 12.0633881,12.9407833 Z M16.4554257,12.9407833 C17.0767461,12.9407833 17.5804257,12.4371036 17.5804257,11.8157833 C17.5804257,11.1944629 17.0767461,10.6907833 16.4554257,10.6907833 C15.8341054,10.6907833 15.3304257,11.1944629 15.3304257,11.8157833 C15.3304257,12.4371036 15.8341054,12.9407833 16.4554257,12.9407833 Z M6.17467181,15.5245306 C6.79599216,15.5245306 7.29967181,15.020851 7.29967181,14.3995306 C7.29967181,13.7782103 6.79599216,13.2745306 6.17467181,13.2745306 C5.55335147,13.2745306 5.04967181,13.7782103 5.04967181,14.3995306 C5.04967181,15.020851 5.55335147,15.5245306 6.17467181,15.5245306 Z M10.0582239,15.5245306 C10.6795443,15.5245306 11.1832239,15.020851 11.1832239,14.3995306 C11.1832239,13.7782103 10.6795443,13.2745306 10.0582239,13.2745306 C9.43690359,13.2745306 8.93322394,13.7782103 8.93322394,14.3995306 C8.93322394,15.020851 9.43690359,15.5245306 10.0582239,15.5245306 Z M13.9417761,15.5245306 C14.5630964,15.5245306 15.0667761,15.020851 15.0667761,14.3995306 C15.0667761,13.7782103 14.5630964,13.2745306 13.9417761,13.2745306 C13.3204557,13.2745306 12.8167761,13.7782103 12.8167761,14.3995306 C12.8167761,15.020851 13.3204557,15.5245306 13.9417761,15.5245306 Z M17.8253282,15.5245306 C18.4466485,15.5245306 18.9503282,15.020851 18.9503282,14.3995306 C18.9503282,13.7782103 18.4466485,13.2745306 17.8253282,13.2745306 C17.2040078,13.2745306 16.7003282,13.7782103 16.7003282,14.3995306 C16.7003282,15.020851 17.2040078,15.5245306 17.8253282,15.5245306 Z M7.73047982,18.1082779 C8.35180017,18.1082779 8.85547982,17.6045983 8.85547982,16.9832779 C8.85547982,16.3619576 8.35180017,15.8582779 7.73047982,15.8582779 C7.10915948,15.8582779 6.60547982,16.3619576 6.60547982,16.9832779 C6.60547982,17.6045983 7.10915948,18.1082779 7.73047982,18.1082779 Z M12.0633881,18.1082779 C12.6847085,18.1082779 13.1883881,17.6045983 13.1883881,16.9832779 C13.1883881,16.3619576 12.6847085,15.8582779 12.0633881,15.8582779 C11.4420678,15.8582779 10.9383881,16.3619576 10.9383881,16.9832779 C10.9383881,17.6045983 11.4420678,18.1082779 12.0633881,18.1082779 Z M16.3962964,18.1082779 C17.0176168,18.1082779 17.5212964,17.6045983 17.5212964,16.9832779 C17.5212964,16.3619576 17.0176168,15.8582779 16.3962964,15.8582779 C15.7749761,15.8582779 15.2712964,16.3619576 15.2712964,16.9832779 C15.2712964,17.6045983 15.7749761,18.1082779 16.3962964,18.1082779 Z" id="Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationModifier.svg b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationModifier.svg index e09569c2c4..64ba81e648 100644 --- a/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationModifier.svg +++ b/Gems/Vegetation/Assets/Editor/Icons/Components/Viewport/VegetationModifier.svg @@ -22,4 +22,4 @@ </g> <path d="M13.0844638,17.9336346 L11.8477599,17.9336346 C11.8328149,18.4103557 11.7907329,18.8281587 11.721514,19.1870438 C11.6094496,19.7680732 11.3446396,20.1828113 10.3090553,20.1828113 C9.84204329,20.1828113 9.4949252,20.0842179 9.01861716,19.9083617 C8.32083896,19.6507371 7.89311118,19.5940875 7.77168902,20.0357075 C7.64257902,20.5052887 8.06795746,20.990044 8.77457616,21.2435639 C9.15663968,21.3806402 9.99429424,21.7176351 10.9535798,21.5684116 C11.8091626,21.4353198 12.1987364,21.2418913 12.4655981,20.8640344 C12.7323793,21.2445117 13.1217264,21.4404622 13.9786438,21.5684116 C14.6231683,21.6646479 15.5703127,21.4748192 16.1576475,21.2435639 C16.8558139,20.96867 17.2896446,20.5052887 17.1605346,20.0357075 C17.0391125,19.5940875 16.6113847,19.6507371 15.9136065,19.9083617 C15.4372984,20.0842179 15.0901804,20.1828113 14.6231683,20.1828113 C13.5875841,20.1828113 13.322774,19.7680732 13.2107096,19.1870438 C13.1414907,18.8281587 13.0994088,18.4103557 13.0844638,17.9336346 Z M11.3005745,8.90834362 C11.1978542,8.49061427 11.1203804,8.19283295 11.0681531,8.01499969 C11.0102426,7.81781535 10.7434067,7.36060341 10.4594872,6.90349273 C10.4257416,6.91713931 10.3893183,6.93180764 10.3497902,6.94772627 C8.03657911,7.95218811 6.87017534,7.28290301 6.16414671,6.29907895 C5.45811807,5.31525489 5.94997174,4.06531012 4.75937063,3.26803092 C3.96563656,2.73651146 3.23453668,2.37818828 2.56607097,2.19306139 C4.43018695,1.41915602 6.13880097,1.27124415 7.93900496,1.93461026 C9.43950632,2.48753745 10.6765886,3.30183741 10.9318065,4.48981762 C11.0183242,4.89253733 11.2958613,5.66991 11.2307648,6.47600915 L11.2085556,6.4918275 C11.4275347,6.84884639 11.7520685,7.20147149 11.8138455,7.25901665 C12.1716294,7.07389866 12.4002391,6.90584907 12.7395235,6.65066354 C12.8116282,6.59643153 12.9764417,6.45716852 13.1704137,6.28861319 C13.571138,4.19458887 14.3249564,3.39693565 15.817546,2.94486368 C17.4004631,2.4654335 18.2277766,4.11948644 19.4605577,3.64152055 C20.2824118,3.32287662 20.9402022,2.95990922 21.433929,2.55261832 C21.0322888,4.37124519 20.1043679,5.78536903 18.6501661,6.79498986 C17.4380637,7.63652639 16.5950281,7.936971 15.4766522,7.8591207 C15.0577349,7.82995981 14.2719532,7.43093914 13.6488197,7.04678285 C13.5483784,7.13347766 13.4636894,7.20739467 13.4060362,7.25901665 C12.9152796,7.69843422 12.2897036,7.92179585 12.4432512,8.27879831 C12.4816971,8.36818603 12.5514286,8.57803447 12.6524456,8.90834362 L16.2560474,8.90834362 C16.622535,8.90834362 16.8543509,9.06339708 16.8543509,9.46644598 C16.8543509,9.86949487 16.5968055,10.0110776 16.2560474,10.0110776 L15.782312,10.0110776 L15.782312,13.9218667 C17.7020787,16.6773769 18.8502538,18.2639277 19.2268374,18.6815193 C19.7917128,19.3079066 20.0547399,19.8923642 20.0547399,21.0248377 C20.0547399,22.1573111 19.0613294,22.9818284 17.93802,22.9818284 L7.07125886,22.9818284 C5.95531953,22.9818284 4.85489092,22.2585958 4.85489092,21.0248377 C4.85489092,19.7910795 5.18027892,19.4182823 5.63849252,18.792392 C5.94396826,18.3751318 6.97266402,16.7516234 8.72457981,13.9218667 L8.72457981,9.9084028 L8.09325237,9.9084028 C7.82984828,9.9084028 7.60032905,9.75897236 7.60032905,9.49453544 C7.60032905,8.87909992 7.92809694,8.90834362 8.19329838,8.90834362 L11.3005745,8.90834362 Z M14.8067141,9.92323333 L12.8615513,9.92323333 C13.0882891,11.0079268 13.2016581,11.7561863 13.2016581,12.1680117 C13.2016581,12.5798372 13.2077622,14.1530986 13.2199704,16.8877959 L16.7443492,16.8877959 L14.8067141,14.3078205 L14.8067141,9.92323333 Z M9.83129085,9.94390162 L9.86742755,14.1935372 L8.10005542,16.8569769 L11.8065567,16.8569769 C11.8065567,14.0367789 11.8065567,12.4522075 11.8065567,12.1032627 C11.8065567,11.754318 11.7346319,11.0374988 11.5907821,9.95280533 L9.83129085,9.94390162 Z" id="Shape" fill="#FFFFFF"></path> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Vegetation/Assets/readme.txt b/Gems/Vegetation/Assets/readme.txt index 8c22c3f710..08cfb84ec6 100644 --- a/Gems/Vegetation/Assets/readme.txt +++ b/Gems/Vegetation/Assets/readme.txt @@ -1 +1 @@ -This folder represents sample dynamic vegetation assets, slices, and tutorials. \ No newline at end of file +This folder represents sample dynamic vegetation assets, slices, and tutorials. diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaBlenderRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaBlenderRequestBus.h index b870a05a8f..07a8bd3ac8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaBlenderRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaBlenderRequestBus.h @@ -41,4 +41,4 @@ namespace Vegetation }; using AreaBlenderRequestBus = AZ::EBus<AreaBlenderRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaConfigRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaConfigRequestBus.h index 18d90d175f..9adaaa2032 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaConfigRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaConfigRequestBus.h @@ -34,4 +34,4 @@ namespace Vegetation virtual AZ::u32 GetAreaProductCount() const = 0; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaDebugBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaDebugBus.h index 13f965ac3f..d5e5a5e0c7 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaDebugBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaDebugBus.h @@ -44,4 +44,4 @@ namespace Vegetation }; typedef AZ::EBus<AreaDebugRequests> AreaDebugBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaInfoBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaInfoBus.h index 08618ee1da..80780879d8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaInfoBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaInfoBus.h @@ -43,4 +43,4 @@ namespace Vegetation }; typedef AZ::EBus<AreaInfoRequests> AreaInfoBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaNotificationBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaNotificationBus.h index 0c27c154ba..714f6da3cb 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaNotificationBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaNotificationBus.h @@ -51,4 +51,4 @@ namespace Vegetation }; typedef AZ::EBus<AreaNotifications> AreaNotificationBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaRequestBus.h index cbcc4fe300..13b4f70e76 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/AreaRequestBus.h @@ -98,4 +98,4 @@ namespace Vegetation }; typedef AZ::EBus<AreaRequests> AreaRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/BlockerRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/BlockerRequestBus.h index b026082a0a..d911f33eed 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/BlockerRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/BlockerRequestBus.h @@ -32,4 +32,4 @@ namespace Vegetation }; using BlockerRequestBus = AZ::EBus<BlockerRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DependencyRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DependencyRequestBus.h index e8b7aefd68..dc224ee8f8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DependencyRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DependencyRequestBus.h @@ -33,4 +33,4 @@ namespace Vegetation }; typedef AZ::EBus<DependencyRequests> DependencyRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListCombinerRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListCombinerRequestBus.h index 1654a8de58..fffe8f1edf 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListCombinerRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListCombinerRequestBus.h @@ -35,4 +35,4 @@ namespace Vegetation }; using DescriptorListCombinerRequestBus = AZ::EBus<DescriptorListCombinerRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListRequestBus.h index 5aea56227b..36fb3c1de8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorListRequestBus.h @@ -48,4 +48,4 @@ namespace Vegetation }; using DescriptorListRequestBus = AZ::EBus<DescriptorListRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorProviderRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorProviderRequestBus.h index df7e2ea913..72549f5f25 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorProviderRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorProviderRequestBus.h @@ -31,4 +31,4 @@ namespace Vegetation }; typedef AZ::EBus<DescriptorProviderRequests> DescriptorProviderRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorSelectorRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorSelectorRequestBus.h index 77cb5b24c9..708006877f 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorSelectorRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorSelectorRequestBus.h @@ -38,4 +38,4 @@ namespace Vegetation }; typedef AZ::EBus<DescriptorSelectorRequests> DescriptorSelectorRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorWeightSelectorRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorWeightSelectorRequestBus.h index de6ac9211b..db95640c57 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorWeightSelectorRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DescriptorWeightSelectorRequestBus.h @@ -43,4 +43,4 @@ namespace Vegetation }; using DescriptorWeightSelectorRequestBus = AZ::EBus<DescriptorWeightSelectorRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistanceBetweenFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistanceBetweenFilterRequestBus.h index d35568dae0..9ed835e809 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistanceBetweenFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistanceBetweenFilterRequestBus.h @@ -37,4 +37,4 @@ namespace Vegetation }; using DistanceBetweenFilterRequestBus = AZ::EBus<DistanceBetweenFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistributionFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistributionFilterRequestBus.h index c25e283c01..4ea43e668e 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistributionFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/DistributionFilterRequestBus.h @@ -37,4 +37,4 @@ namespace Vegetation }; using DistributionFilterRequestBus = AZ::EBus<DistributionFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/FilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/FilterRequestBus.h index eb56bf50c5..1d5dca6906 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/FilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/FilterRequestBus.h @@ -44,4 +44,4 @@ namespace Vegetation }; typedef AZ::EBus<FilterRequests> FilterRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/InstanceSystemRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/InstanceSystemRequestBus.h index ba9ba8e93c..108a8b60d8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/InstanceSystemRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/InstanceSystemRequestBus.h @@ -15,8 +15,6 @@ #include <AzCore/Component/ComponentBus.h> #include <Vegetation/Descriptor.h> -struct IRenderNode; - namespace Vegetation { struct InstanceData; @@ -48,12 +46,6 @@ namespace Vegetation virtual void DestroyAllInstances() = 0; virtual void Cleanup() = 0; - - // Notify the instance system whenever a merged mesh instance is created / destroyed. - // This is necessary because we only want to refresh a full merged mesh once per set of - // changes, not once per instance change. - virtual void RegisterMergedMeshInstance(InstancePtr instance, IRenderNode* mergedMeshNode) = 0; - virtual void ReleaseMergedMeshInstance(InstancePtr instance) = 0; }; using InstanceSystemRequestBus = AZ::EBus<InstanceSystemRequests>; diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/LevelSettingsRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/LevelSettingsRequestBus.h index 4a21b54404..f2e52ec68e 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/LevelSettingsRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/LevelSettingsRequestBus.h @@ -35,4 +35,4 @@ namespace Vegetation }; using LevelSettingsRequestBus = AZ::EBus<LevelSettingsRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/MeshBlockerRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/MeshBlockerRequestBus.h index db2d257dce..0c02d8a5fd 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/MeshBlockerRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/MeshBlockerRequestBus.h @@ -41,4 +41,4 @@ namespace Vegetation }; using MeshBlockerRequestBus = AZ::EBus<MeshBlockerRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ModifierRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ModifierRequestBus.h index 26ea4bd624..5bf52758d3 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ModifierRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ModifierRequestBus.h @@ -56,4 +56,4 @@ namespace Vegetation }; typedef AZ::EBus<ModifierRequests> ModifierRequestBus; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/PositionModifierRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/PositionModifierRequestBus.h index 15654c69e5..28b3701ecd 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/PositionModifierRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/PositionModifierRequestBus.h @@ -47,4 +47,4 @@ namespace Vegetation }; using PositionModifierRequestBus = AZ::EBus<PositionModifierRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ReferenceShapeRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ReferenceShapeRequestBus.h index 877cc6027d..2d5860d263 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ReferenceShapeRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ReferenceShapeRequestBus.h @@ -32,4 +32,4 @@ namespace Vegetation }; using ReferenceShapeRequestBus = AZ::EBus<ReferenceShapeRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/RotationModifierRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/RotationModifierRequestBus.h index 8c7e8636b5..6ae3637520 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/RotationModifierRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/RotationModifierRequestBus.h @@ -42,4 +42,4 @@ namespace Vegetation }; using RotationModifierRequestBus = AZ::EBus<RotationModifierRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ScaleModifierRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ScaleModifierRequestBus.h index 7d0588e03f..3c3ba3eaa1 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ScaleModifierRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ScaleModifierRequestBus.h @@ -40,4 +40,4 @@ namespace Vegetation }; using ScaleModifierRequestBus = AZ::EBus<ScaleModifierRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ShapeIntersectionFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ShapeIntersectionFilterRequestBus.h index 2767ee78ae..75eb0ce0e6 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ShapeIntersectionFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/ShapeIntersectionFilterRequestBus.h @@ -32,4 +32,4 @@ namespace Vegetation }; using ShapeIntersectionFilterRequestBus = AZ::EBus<ShapeIntersectionFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SlopeAlignmentModifierRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SlopeAlignmentModifierRequestBus.h index 3af7c15bef..1c4ce256f0 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SlopeAlignmentModifierRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SlopeAlignmentModifierRequestBus.h @@ -40,4 +40,4 @@ namespace Vegetation }; using SlopeAlignmentModifierRequestBus = AZ::EBus<SlopeAlignmentModifierRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SpawnerRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SpawnerRequestBus.h index 9894b2d1d6..f59bf40415 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SpawnerRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SpawnerRequestBus.h @@ -38,4 +38,4 @@ namespace Vegetation }; using SpawnerRequestBus = AZ::EBus<SpawnerRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceAltitudeFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceAltitudeFilterRequestBus.h index fa636756d5..0a15e0b4f1 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceAltitudeFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceAltitudeFilterRequestBus.h @@ -40,4 +40,4 @@ namespace Vegetation }; using SurfaceAltitudeFilterRequestBus = AZ::EBus<SurfaceAltitudeFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskDepthFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskDepthFilterRequestBus.h index 33beb2624d..3d33ce434f 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskDepthFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskDepthFilterRequestBus.h @@ -42,4 +42,4 @@ namespace Vegetation }; using SurfaceMaskDepthFilterRequestBus = AZ::EBus<SurfaceMaskDepthFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskFilterRequestBus.h index e3743f3c37..1c9159fbcb 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceMaskFilterRequestBus.h @@ -54,4 +54,4 @@ namespace Vegetation }; using SurfaceMaskFilterRequestBus = AZ::EBus<SurfaceMaskFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceSlopeFilterRequestBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceSlopeFilterRequestBus.h index dfe1932ef4..8ded95c9cd 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceSlopeFilterRequestBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SurfaceSlopeFilterRequestBus.h @@ -37,4 +37,4 @@ namespace Vegetation }; using SurfaceSlopeFilterRequestBus = AZ::EBus<SurfaceSlopeFilterRequests>; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SystemConfigurationBus.h b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SystemConfigurationBus.h index 08d5d34ce7..61c7f98d43 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SystemConfigurationBus.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Ebuses/SystemConfigurationBus.h @@ -46,4 +46,4 @@ namespace Vegetation using SystemConfigurationRequestBus = AZ::EBus<SystemConfigurationRequests>; -} // namespace Vegetation \ No newline at end of file +} // namespace Vegetation diff --git a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h index 77f2b62457..8057f78dd1 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h @@ -92,4 +92,4 @@ namespace Vegetation } // namespace Vegetation -#include "EditorAreaComponentBase.inl" \ No newline at end of file +#include "EditorAreaComponentBase.inl" diff --git a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h index 93c95abb79..3ad20b8f6a 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h @@ -62,4 +62,4 @@ namespace Vegetation }; } // namespace Vegetation -#include "EditorVegetationComponentBase.inl" \ No newline at end of file +#include "EditorVegetationComponentBase.inl" diff --git a/Gems/Vegetation/Code/Source/Components/AreaBlenderComponent.h b/Gems/Vegetation/Code/Source/Components/AreaBlenderComponent.h index 540e6b6f39..e6d49ca28d 100644 --- a/Gems/Vegetation/Code/Source/Components/AreaBlenderComponent.h +++ b/Gems/Vegetation/Code/Source/Components/AreaBlenderComponent.h @@ -108,4 +108,4 @@ namespace Vegetation void SetupDependencies(); }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/DescriptorListCombinerComponent.h b/Gems/Vegetation/Code/Source/Components/DescriptorListCombinerComponent.h index 2b789982ec..b8546edfdc 100644 --- a/Gems/Vegetation/Code/Source/Components/DescriptorListCombinerComponent.h +++ b/Gems/Vegetation/Code/Source/Components/DescriptorListCombinerComponent.h @@ -97,4 +97,4 @@ namespace Vegetation void SetupDependencies(); }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/DescriptorWeightSelectorComponent.h b/Gems/Vegetation/Code/Source/Components/DescriptorWeightSelectorComponent.h index d0c3a58966..14aa52cd91 100644 --- a/Gems/Vegetation/Code/Source/Components/DescriptorWeightSelectorComponent.h +++ b/Gems/Vegetation/Code/Source/Components/DescriptorWeightSelectorComponent.h @@ -82,4 +82,4 @@ namespace Vegetation DescriptorWeightSelectorConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/DistanceBetweenFilterComponent.h b/Gems/Vegetation/Code/Source/Components/DistanceBetweenFilterComponent.h index f1a0578279..1cfcffdbe2 100644 --- a/Gems/Vegetation/Code/Source/Components/DistanceBetweenFilterComponent.h +++ b/Gems/Vegetation/Code/Source/Components/DistanceBetweenFilterComponent.h @@ -90,4 +90,4 @@ namespace Vegetation AZ::Aabb GetInstanceBounds(const InstanceData& instanceData) const; DistanceBetweenFilterConfig m_configuration; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/PositionModifierComponent.h b/Gems/Vegetation/Code/Source/Components/PositionModifierComponent.h index 4ab139d200..f76466a857 100644 --- a/Gems/Vegetation/Code/Source/Components/PositionModifierComponent.h +++ b/Gems/Vegetation/Code/Source/Components/PositionModifierComponent.h @@ -118,4 +118,4 @@ namespace Vegetation //point vector reserved for reuse mutable SurfaceData::SurfacePointList m_points; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/RotationModifierComponent.h b/Gems/Vegetation/Code/Source/Components/RotationModifierComponent.h index 54a272231a..c274fde1d9 100644 --- a/Gems/Vegetation/Code/Source/Components/RotationModifierComponent.h +++ b/Gems/Vegetation/Code/Source/Components/RotationModifierComponent.h @@ -98,4 +98,4 @@ namespace Vegetation RotationModifierConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/ScaleModifierComponent.h b/Gems/Vegetation/Code/Source/Components/ScaleModifierComponent.h index 0e02df64b3..98738b4970 100644 --- a/Gems/Vegetation/Code/Source/Components/ScaleModifierComponent.h +++ b/Gems/Vegetation/Code/Source/Components/ScaleModifierComponent.h @@ -89,4 +89,4 @@ namespace Vegetation ScaleModifierConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/ShapeIntersectionFilterComponent.h b/Gems/Vegetation/Code/Source/Components/ShapeIntersectionFilterComponent.h index 71f3193c93..08396746c9 100644 --- a/Gems/Vegetation/Code/Source/Components/ShapeIntersectionFilterComponent.h +++ b/Gems/Vegetation/Code/Source/Components/ShapeIntersectionFilterComponent.h @@ -84,4 +84,4 @@ namespace Vegetation void SetupDependencyMonitor(); }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/SlopeAlignmentModifierComponent.h b/Gems/Vegetation/Code/Source/Components/SlopeAlignmentModifierComponent.h index 9855d7a910..48d87c76cc 100644 --- a/Gems/Vegetation/Code/Source/Components/SlopeAlignmentModifierComponent.h +++ b/Gems/Vegetation/Code/Source/Components/SlopeAlignmentModifierComponent.h @@ -87,4 +87,4 @@ namespace Vegetation SlopeAlignmentModifierConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/SurfaceAltitudeFilterComponent.h b/Gems/Vegetation/Code/Source/Components/SurfaceAltitudeFilterComponent.h index 62779adb6c..dc9b56af25 100644 --- a/Gems/Vegetation/Code/Source/Components/SurfaceAltitudeFilterComponent.h +++ b/Gems/Vegetation/Code/Source/Components/SurfaceAltitudeFilterComponent.h @@ -92,4 +92,4 @@ namespace Vegetation SurfaceAltitudeFilterConfig m_configuration; LmbrCentral::DependencyMonitor m_dependencyMonitor; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Components/SurfaceSlopeFilterComponent.h b/Gems/Vegetation/Code/Source/Components/SurfaceSlopeFilterComponent.h index 9616311933..24e4e15ace 100644 --- a/Gems/Vegetation/Code/Source/Components/SurfaceSlopeFilterComponent.h +++ b/Gems/Vegetation/Code/Source/Components/SurfaceSlopeFilterComponent.h @@ -85,4 +85,4 @@ namespace Vegetation private: SurfaceSlopeFilterConfig m_configuration; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/DebugSystemComponent.cpp b/Gems/Vegetation/Code/Source/DebugSystemComponent.cpp index f746545149..c62905766e 100644 --- a/Gems/Vegetation/Code/Source/DebugSystemComponent.cpp +++ b/Gems/Vegetation/Code/Source/DebugSystemComponent.cpp @@ -77,4 +77,4 @@ namespace Vegetation DebugSystemDataBus::Handler::BusDisconnect(); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Debugger/AreaDebugComponent.h b/Gems/Vegetation/Code/Source/Debugger/AreaDebugComponent.h index 2c033eee53..014e45249a 100644 --- a/Gems/Vegetation/Code/Source/Debugger/AreaDebugComponent.h +++ b/Gems/Vegetation/Code/Source/Debugger/AreaDebugComponent.h @@ -90,4 +90,4 @@ namespace Vegetation AreaDebugConfig m_configuration; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.cpp b/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.cpp index 158b35a4e7..bf942f78c4 100644 --- a/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.cpp +++ b/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.cpp @@ -29,4 +29,4 @@ namespace Vegetation { EditorVegetationComponentBase::ReflectSubClass<EditorAreaDebugComponent, BaseClassType>(context); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.h b/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.h index 04a1eb7077..2c4e7ee78e 100644 --- a/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.h +++ b/Gems/Vegetation/Code/Source/Debugger/EditorAreaDebugComponent.h @@ -32,4 +32,4 @@ namespace Vegetation static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/Vegetation.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/vegetation/vegetation-layer-debug"; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.cpp index 5ff1e2d6e3..bbd116b091 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.cpp @@ -23,4 +23,4 @@ namespace Vegetation { ReflectSubClass<DerivedClassType, BaseClassType>(context, 1, &EditorAreaComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.h b/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.h index 9bc18b9c20..31e57a503a 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.h +++ b/Gems/Vegetation/Code/Source/Editor/EditorBlockerComponent.h @@ -34,4 +34,4 @@ namespace Vegetation static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/Vegetation.png"; static constexpr const char* const s_helpUrl = "https://docs.aws.amazon.com/console/lumberyard/vegetation/vegetation-layer-blocker"; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListCombinerComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListCombinerComponent.cpp index d22e609490..ade8121b06 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListCombinerComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListCombinerComponent.cpp @@ -20,4 +20,4 @@ namespace Vegetation { ReflectSubClass<EditorDescriptorListCombinerComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListComponent.cpp index d4f80e2926..51ecc03c5a 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorListComponent.cpp @@ -49,4 +49,4 @@ namespace Vegetation SetDirty(); } } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorWeightSelectorComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorWeightSelectorComponent.cpp index d0911c5239..1c23745831 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorDescriptorWeightSelectorComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorDescriptorWeightSelectorComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorDescriptorWeightSelectorComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorDistanceBetweenFilterComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorDistanceBetweenFilterComponent.cpp index 217ac14009..ea6ab5eec1 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorDistanceBetweenFilterComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorDistanceBetweenFilterComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorDistanceBetweenFilterComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorDistributionFilterComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorDistributionFilterComponent.cpp index cc219ed33a..8ea0acb78d 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorDistributionFilterComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorDistributionFilterComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorDistributionFilterComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.cpp index b4de00cdb6..fe519877e2 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.cpp @@ -87,4 +87,4 @@ namespace Vegetation m_component.m_meshBoundsForIntersection.GetMax()); } } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.h b/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.h index e209003ee5..1fdc5218cf 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.h +++ b/Gems/Vegetation/Code/Source/Editor/EditorMeshBlockerComponent.h @@ -50,4 +50,4 @@ namespace Vegetation private: bool m_drawDebugBounds = false; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorPositionModifierComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorPositionModifierComponent.cpp index 13f4368a63..14ae748168 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorPositionModifierComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorPositionModifierComponent.cpp @@ -31,4 +31,4 @@ namespace Vegetation BaseClassType::Activate(); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorReferenceShapeComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorReferenceShapeComponent.cpp index a88e1a7829..5f3225e23d 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorReferenceShapeComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorReferenceShapeComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorReferenceShapeComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorRotationModifierComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorRotationModifierComponent.cpp index 800935f419..8d81ff1dae 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorRotationModifierComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorRotationModifierComponent.cpp @@ -31,4 +31,4 @@ namespace Vegetation BaseClassType::Activate(); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorScaleModifierComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorScaleModifierComponent.cpp index 8a0a065a08..d6dc70a523 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorScaleModifierComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorScaleModifierComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorScaleModifierComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorShapeIntersectionFilterComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorShapeIntersectionFilterComponent.cpp index 9f3332ef36..93e5f41c75 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorShapeIntersectionFilterComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorShapeIntersectionFilterComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorShapeIntersectionFilterComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorSlopeAlignmentModifierComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorSlopeAlignmentModifierComponent.cpp index 3d4a901b85..6002787404 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorSlopeAlignmentModifierComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorSlopeAlignmentModifierComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorSlopeAlignmentModifierComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorSpawnerComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorSpawnerComponent.cpp index cdce14b134..9dd393e124 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorSpawnerComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorSpawnerComponent.cpp @@ -23,4 +23,4 @@ namespace Vegetation { ReflectSubClass<DerivedClassType, BaseClassType>(context, 1, &EditorAreaComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorSurfaceAltitudeFilterComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorSurfaceAltitudeFilterComponent.cpp index 9e0dadba86..6e46241b83 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorSurfaceAltitudeFilterComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorSurfaceAltitudeFilterComponent.cpp @@ -28,4 +28,4 @@ namespace Vegetation BaseClassType::ConfigurationChanged(); return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/Editor/EditorSurfaceSlopeFilterComponent.cpp b/Gems/Vegetation/Code/Source/Editor/EditorSurfaceSlopeFilterComponent.cpp index b255155aee..5b0868566d 100644 --- a/Gems/Vegetation/Code/Source/Editor/EditorSurfaceSlopeFilterComponent.cpp +++ b/Gems/Vegetation/Code/Source/Editor/EditorSurfaceSlopeFilterComponent.cpp @@ -22,4 +22,4 @@ namespace Vegetation { ReflectSubClass<EditorSurfaceSlopeFilterComponent, BaseClassType>(context, 1, &EditorVegetationComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType, typename BaseClassType::WrappedConfigType>); } -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/InstanceSystemComponent.cpp b/Gems/Vegetation/Code/Source/InstanceSystemComponent.cpp index 7987615fb9..4aaf0a0b49 100644 --- a/Gems/Vegetation/Code/Source/InstanceSystemComponent.cpp +++ b/Gems/Vegetation/Code/Source/InstanceSystemComponent.cpp @@ -21,10 +21,7 @@ #include <LmbrCentral/Rendering/MaterialAsset.h> #include <LmbrCentral/Rendering/MeshAsset.h> -#include <MathConversion.h> -#include <I3DEngine.h> -#include <ISystem.h> -#include <Tarray.h> + #include <Vegetation/Ebuses/AreaInfoBus.h> #include <Vegetation/Ebuses/AreaSystemRequestBus.h> #include <Vegetation/Ebuses/DebugNotificationBus.h> @@ -41,33 +38,6 @@ namespace Vegetation static const int s_minTaskBatchSize = 1; static const int s_maxTaskBatchSize = 2000; //prevents user from reserving excessive space as batches are processed faster than they can be filled } - - void ApplyConfigurationToConsoleVars(ISystem* system, const InstanceSystemConfig& config) - { - if (!system) - { - return; - } - - auto* console = system->GetIConsole(); - if (!console) - { - return; - } - - if (console && console->GetCVar("e_MergedMeshesLodRatio")) - { - console->GetCVar("e_MergedMeshesLodRatio")->Set(config.m_mergedMeshesLodRatio); - } - if (console && console->GetCVar("e_MergedMeshesViewDistRatio")) - { - console->GetCVar("e_MergedMeshesViewDistRatio")->Set(config.m_mergedMeshesViewDistanceRatio); - } - if (console && console->GetCVar("e_MergedMeshesInstanceDist")) - { - console->GetCVar("e_MergedMeshesInstanceDist")->Set(config.m_mergedMeshesInstanceDistance); - } - } }; ////////////////////////////////////////////////////////////////////////// @@ -78,12 +48,9 @@ namespace Vegetation if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { serializeContext->Class<InstanceSystemConfig, AZ::ComponentConfig>() - ->Version(2) + ->Version(3) ->Field("MaxInstanceProcessTimeMicroseconds", &InstanceSystemConfig::m_maxInstanceProcessTimeMicroseconds) ->Field("MaxInstanceTaskBatchSize", &InstanceSystemConfig::m_maxInstanceTaskBatchSize) - ->Field("MergedMeshesLodRatio", &InstanceSystemConfig::m_mergedMeshesLodRatio) - ->Field("MergedMeshesViewDistanceRatio", &InstanceSystemConfig::m_mergedMeshesViewDistanceRatio) - ->Field("MergedMeshesInstanceDistance", &InstanceSystemConfig::m_mergedMeshesInstanceDistance) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) @@ -98,23 +65,6 @@ namespace Vegetation ->DataElement(0, &InstanceSystemConfig::m_maxInstanceTaskBatchSize, "Max Instance Task Batch Size", "Maximum number of instance management tasks that can be batch processed together") ->Attribute(AZ::Edit::Attributes::Min, InstanceSystemUtil::Constants::s_minTaskBatchSize) ->Attribute(AZ::Edit::Attributes::Max, InstanceSystemUtil::Constants::s_maxTaskBatchSize) - ->ClassElement(AZ::Edit::ClassElements::Group, "Merged Meshes") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(0, &InstanceSystemConfig::m_mergedMeshesLodRatio, "LOD Distance Ratio", "Controls the distance where the merged mesh vegetation use less detailed models") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, std::numeric_limits<float>::max()) - ->Attribute(AZ::Edit::Attributes::SoftMin, 1.0f) - ->Attribute(AZ::Edit::Attributes::SoftMax, 1024.0f) - ->DataElement(0, &InstanceSystemConfig::m_mergedMeshesViewDistanceRatio, "View Distance Ratio", "Controls the maximum view distance for merged mesh vegetation instances") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, std::numeric_limits<float>::max()) - ->Attribute(AZ::Edit::Attributes::SoftMin, 1.0f) - ->Attribute(AZ::Edit::Attributes::SoftMax, 1024.0f) - ->DataElement(0, &InstanceSystemConfig::m_mergedMeshesInstanceDistance, "Instance Animation Distance", "Relates to the distance at which animated vegetation will be processed") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, std::numeric_limits<float>::max()) - ->Attribute(AZ::Edit::Attributes::SoftMin, 1.0f) - ->Attribute(AZ::Edit::Attributes::SoftMax, 1024.0f) ; } } @@ -185,36 +135,20 @@ namespace Vegetation void InstanceSystemComponent::Activate() { - m_system = GetISystem(); - m_engine = m_system ? m_system->GetI3DEngine() : nullptr; Cleanup(); AZ::TickBus::Handler::BusConnect(); InstanceSystemRequestBus::Handler::BusConnect(); InstanceSystemStatsRequestBus::Handler::BusConnect(); - InstanceStatObjEventBus::Handler::BusConnect(); SystemConfigurationRequestBus::Handler::BusConnect(); - CrySystemEventBus::Handler::BusConnect(); - - InstanceSystemUtil::ApplyConfigurationToConsoleVars(m_system, m_configuration); } void InstanceSystemComponent::Deactivate() { - auto environment = m_system ? m_system->GetGlobalEnvironment() : nullptr; - if (environment) - { - environment->SetDynamicMergedMeshGenerationEnabled(environment->IsEditor()); - } - - InstanceStatObjEventBus::Handler::BusDisconnect(); AZ::TickBus::Handler::BusDisconnect(); InstanceSystemRequestBus::Handler::BusDisconnect(); InstanceSystemStatsRequestBus::Handler::BusDisconnect(); SystemConfigurationRequestBus::Handler::BusDisconnect(); - CrySystemEventBus::Handler::BusDisconnect(); Cleanup(); - m_system = nullptr; - m_engine = nullptr; } bool InstanceSystemComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) @@ -466,15 +400,9 @@ namespace Vegetation GarbageCollectUniqueDescriptors(); } - void InstanceSystemComponent::ReleaseData() - { - DestroyAllInstances(); - } - void InstanceSystemComponent::UpdateSystemConfig(const AZ::ComponentConfig* baseConfig) { ReadInConfig(baseConfig); - InstanceSystemUtil::ApplyConfigurationToConsoleVars(m_system, m_configuration); } void InstanceSystemComponent::GetSystemConfig(AZ::ComponentConfig* outBaseConfig) const @@ -482,29 +410,6 @@ namespace Vegetation WriteOutConfig(outBaseConfig); } - void InstanceSystemComponent::OnCrySystemInitialized(ISystem& system, [[maybe_unused]] const SSystemInitParams& systemInitParams) - { - auto environment = system.GetGlobalEnvironment(); - if (environment) - { - environment->SetDynamicMergedMeshGenerationEnabled(true); - } - m_system = &system; - m_engine = m_system ? m_system->GetI3DEngine() : nullptr; - } - - void InstanceSystemComponent::OnCrySystemShutdown(ISystem& system) - { - auto environment = system.GetGlobalEnvironment(); - if (environment) - { - environment->SetDynamicMergedMeshGenerationEnabled(environment->IsEditor()); - } - Cleanup(); - m_system = nullptr; - m_engine = nullptr; - } - InstanceId InstanceSystemComponent::CreateInstanceId() { AZStd::lock_guard<decltype(m_instanceIdMutex)> scopedLock(m_instanceIdMutex); @@ -549,12 +454,6 @@ namespace Vegetation { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Entity); - if (!m_engine) - { - AZ_Error("vegetation", m_engine, "Could not acquire I3DEngine!"); - return; - } - if (IsInstanceSkippable(instanceData)) { return; @@ -592,63 +491,6 @@ namespace Vegetation } } - void InstanceSystemComponent::RegisterMergedMeshInstance(InstancePtr instance, IRenderNode* mergedMeshNode) - { - if (instance && mergedMeshNode) - { - //merged mesh nodes should only refresh once for a batch of instances - m_instanceNodeToMergedMeshNodeRegistrationMap[instance] = mergedMeshNode; - } - } - - void InstanceSystemComponent::ReleaseMergedMeshInstance(InstancePtr instance) - { - //stop tracking this node for registration - m_instanceNodeToMergedMeshNodeRegistrationMap.erase(instance); - } - - void InstanceSystemComponent::CreateInstanceNodeBegin() - { - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Entity); - - AZ_Error("vegetation", m_instanceNodeToMergedMeshNodeRegistrationMap.empty(), "m_instanceNodeToMergedMeshNodeRegistrationMap should be empty!"); - m_instanceNodeToMergedMeshNodeRegistrationMap.clear(); - } - - void InstanceSystemComponent::CreateInstanceNodeEnd() - { - AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Entity); - - if (!m_engine) - { - AZ_Error("vegetation", m_engine, "Could not acquire I3DEngine!"); - m_instanceNodeToMergedMeshNodeRegistrationMap.clear(); - return; - } - - //gather all unique mesh nodes to re-register - m_mergedMeshNodeRegistrationSet.clear(); - m_mergedMeshNodeRegistrationSet.reserve(m_instanceNodeToMergedMeshNodeRegistrationMap.size()); - - for (auto nodePair : m_instanceNodeToMergedMeshNodeRegistrationMap) - { - InstancePtr instanceNode = nodePair.first; - IRenderNode* mergedMeshNode = nodePair.second; - if (instanceNode && mergedMeshNode) - { - m_mergedMeshNodeRegistrationSet.insert(mergedMeshNode); - } - } - m_instanceNodeToMergedMeshNodeRegistrationMap.clear(); - - //re-register final merged mesh nodes - for (auto mergedMeshNode : m_mergedMeshNodeRegistrationSet) - { - m_engine->UnRegisterEntityAsJob(mergedMeshNode); - m_engine->RegisterEntity(mergedMeshNode); - } - } - void InstanceSystemComponent::ReleaseInstanceNode(InstanceId instanceId) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Entity); @@ -752,9 +594,7 @@ namespace Vegetation { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Entity); - CreateInstanceNodeBegin(); ExecuteTasks(); - CreateInstanceNodeEnd(); } } diff --git a/Gems/Vegetation/Code/Source/InstanceSystemComponent.h b/Gems/Vegetation/Code/Source/InstanceSystemComponent.h index fb81cec10a..711cf530ca 100644 --- a/Gems/Vegetation/Code/Source/InstanceSystemComponent.h +++ b/Gems/Vegetation/Code/Source/InstanceSystemComponent.h @@ -28,9 +28,6 @@ #include <Vegetation/Ebuses/InstanceSystemRequestBus.h> #include <Vegetation/Ebuses/SystemConfigurationBus.h> -#include <StatObjBus.h> -#include <CrySystemBus.h> - namespace AZ { class Aabb; @@ -39,10 +36,6 @@ namespace AZ class EntityId; } -struct IRenderNode; -struct ISystem; -struct I3DEngine; - ////////////////////////////////////////////////////////////////////////// namespace Vegetation @@ -63,11 +56,6 @@ namespace Vegetation // maximum number of instance management tasks that can be batch processed together int m_maxInstanceTaskBatchSize = 100; - - // merged mesh visual features - float m_mergedMeshesViewDistanceRatio = 100.0f; - float m_mergedMeshesLodRatio = 3.0f; - float m_mergedMeshesInstanceDistance = 4.5f; }; /** @@ -78,9 +66,7 @@ namespace Vegetation , private InstanceSystemRequestBus::Handler , private InstanceSystemStatsRequestBus::Handler , private AZ::TickBus::Handler - , private InstanceStatObjEventBus::Handler , private SystemConfigurationRequestBus::Handler - , private CrySystemEventBus::Handler { friend class EditorInstanceSystemComponent; @@ -116,9 +102,6 @@ namespace Vegetation void DestroyAllInstances() override; void Cleanup() override; - void RegisterMergedMeshInstance(InstancePtr instance, IRenderNode* mergedMeshNode) override; - void ReleaseMergedMeshInstance(InstancePtr instance) override; - // InstanceSystemStatsRequestBus AZ::u32 GetInstanceCount() const override; AZ::u32 GetTotalTaskCount() const override; @@ -128,19 +111,11 @@ namespace Vegetation // AZ::TickBus void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; - // InstanceStatObjEventBus - void ReleaseData() override; - ////////////////////////////////////////////////////////////////// // SystemConfigurationRequestBus void UpdateSystemConfig(const AZ::ComponentConfig* config) override; void GetSystemConfig(AZ::ComponentConfig* config) const override; - //////////////////////////////////////////////////////////////////////////// - // CrySystemEvents - void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& systemInitParams) override; - void OnCrySystemShutdown(ISystem& system) override; - //////////////////////////////////////////////////////////////// // vegetation instance id management InstanceId CreateInstanceId(); @@ -155,9 +130,6 @@ namespace Vegetation bool IsInstanceSkippable(const InstanceData& instanceData) const; void CreateInstanceNode(const InstanceData& instanceData); - void CreateInstanceNodeBegin(); - void CreateInstanceNodeEnd(); - void ReleaseInstanceNode(InstanceId instanceId); mutable AZStd::recursive_mutex m_instanceMapMutex; @@ -192,15 +164,6 @@ namespace Vegetation AZStd::map<DescriptorPtr, DescriptorDetails> m_uniqueDescriptors; AZStd::map<DescriptorPtr, DescriptorDetails> m_uniqueDescriptorsToDelete; - //refresh events can queue the creation and deletion of the same node in the same frame - //this map is used to track which nodes remain after all tasks have executed for the frame - //registration will only be done on the final set each frame - AZStd::unordered_map<InstancePtr, IRenderNode*> m_instanceNodeToMergedMeshNodeRegistrationMap; - AZStd::unordered_set<IRenderNode*> m_mergedMeshNodeRegistrationSet; - - ISystem* m_system = nullptr; - I3DEngine* m_engine = nullptr; - AZStd::atomic_int m_instanceCount{ 0 }; AZStd::atomic_int m_createTaskCount{ 0 }; AZStd::atomic_int m_destroyTaskCount{ 0 }; diff --git a/Gems/Vegetation/Code/Source/VegetationEditorModule.h b/Gems/Vegetation/Code/Source/VegetationEditorModule.h index f90e7ad46d..76e409f0b5 100644 --- a/Gems/Vegetation/Code/Source/VegetationEditorModule.h +++ b/Gems/Vegetation/Code/Source/VegetationEditorModule.h @@ -31,4 +31,4 @@ namespace Vegetation */ AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Source/VegetationModule.h b/Gems/Vegetation/Code/Source/VegetationModule.h index b9a984e8a2..0b36eb3856 100644 --- a/Gems/Vegetation/Code/Source/VegetationModule.h +++ b/Gems/Vegetation/Code/Source/VegetationModule.h @@ -31,4 +31,4 @@ namespace Vegetation */ AZ::ComponentTypeList GetRequiredSystemComponents() const override; }; -} \ No newline at end of file +} diff --git a/Gems/Vegetation/Code/Tests/VegetationMocks.h b/Gems/Vegetation/Code/Tests/VegetationMocks.h index 449e5284bb..7cf971e082 100644 --- a/Gems/Vegetation/Code/Tests/VegetationMocks.h +++ b/Gems/Vegetation/Code/Tests/VegetationMocks.h @@ -165,10 +165,6 @@ namespace UnitTest void DestroyAllInstances() override {} void Cleanup() override {} - - void RegisterMergedMeshInstance([[maybe_unused]] Vegetation::InstancePtr instance, [[maybe_unused]] IRenderNode* mergedMeshNode) override {} - void ReleaseMergedMeshInstance([[maybe_unused]] Vegetation::InstancePtr instance) override {} - }; struct MockGradientRequestHandler @@ -511,7 +507,7 @@ namespace UnitTest } AZ::Data::Asset<AZ::RPI::ModelAsset> m_GetMeshAssetOutput; - const AZ::Data::Asset<AZ::RPI::ModelAsset>& GetModelAsset() const override + AZ::Data::Asset<const AZ::RPI::ModelAsset> GetModelAsset() const override { return m_GetMeshAssetOutput; } @@ -546,7 +542,7 @@ namespace UnitTest return m_modelAssetPathOutput; } - const AZ::Data::Instance<AZ::RPI::Model> GetModel() const override + AZ::Data::Instance<AZ::RPI::Model> GetModel() const override { return AZ::Data::Instance<AZ::RPI::Model>(); } diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings index aaaf14a9fe..25a6d5d697 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Reflectance /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Reflectance /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings index 8933859ccd..c47c60591e 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings index 277fd55766..612e3d6260 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,0,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings index c45dbd653a..f646798932 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,50,0,0,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,50,0,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings index 535c260f46..1fa63072ac 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings index 5517ee4351..c1e54599df 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,0,0,0,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,0,0,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings index 88406dc69a..96f3ff5a02 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings index 4fce213cec..2e8334a855 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=sigma-six /preset=Detail_MergedAlbedoNormalsSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=sigma-six /preset=Detail_MergedAlbedoNormalsSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings index f69daeb5b2..9f2f74b20f 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings index 432dd0d1ce..79d1c5dd92 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings index 8933859ccd..c47c60591e 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings index f8126cdc0c..fa55f75e2d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings index a90d724812..0159b6ca02 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings index 432dd0d1ce..79d1c5dd92 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings index 432dd0d1ce..79d1c5dd92 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings index 432dd0d1ce..79d1c5dd92 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings index 10f3182ac9..4709125fa0 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings index 535c260f46..1fa63072ac 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings index 2d1dccbf99..44cd6187b1 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings index 8933859ccd..c47c60591e 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings index 8933859ccd..c47c60591e 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings index f8126cdc0c..fa55f75e2d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings index 4eeacce656..d1103c9959 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /preset=Normals /reduce=0 \ No newline at end of file +/autooptimizefile=0 /preset=Normals /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings index a46be045d0..749595194d 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings index 8177b5abe6..d3713274e6 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings index 432dd0d1ce..79d1c5dd92 100644 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings +++ b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 \ No newline at end of file +/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_pressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_pressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_unpressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_unpressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_unpressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_a_unpressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_pressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_pressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_unpressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_unpressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_unpressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_b_unpressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_pressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_pressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_unpressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_unpressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_unpressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_x_unpressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_pressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_pressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_pressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_pressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_unpressed.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_unpressed.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_unpressed.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_button_y_unpressed.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_centre.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_centre.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_centre.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_centre.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_radial.tif.exportsettings b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_radial.tif.exportsettings index da6edf7038..1415bea891 100644 --- a/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_radial.tif.exportsettings +++ b/Gems/VirtualGamepad/Assets/UI/Textures/VirtualGamepad/virtual_gamepad_thumbstick_radial.tif.exportsettings @@ -1 +1 @@ -/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 \ No newline at end of file +/autooptimizefile=0 /dns=1 /preset=ReferenceImage_Linear /reduce=0 /ser=0 diff --git a/Gems/Visibility/Assets/Editor/Icons/Components/OccluderArea.svg b/Gems/Visibility/Assets/Editor/Icons/Components/OccluderArea.svg index a79d746b89..aa8840a798 100644 --- a/Gems/Visibility/Assets/Editor/Icons/Components/OccluderArea.svg +++ b/Gems/Visibility/Assets/Editor/Icons/Components/OccluderArea.svg @@ -12,4 +12,4 @@ </mask> <use id="Shape" fill="#B29EDF" fill-rule="nonzero" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Visibility/Assets/Editor/Icons/Components/Portal.svg b/Gems/Visibility/Assets/Editor/Icons/Components/Portal.svg index e005fd2abb..967a891222 100644 --- a/Gems/Visibility/Assets/Editor/Icons/Components/Portal.svg +++ b/Gems/Visibility/Assets/Editor/Icons/Components/Portal.svg @@ -12,4 +12,4 @@ </mask> <use id="Combined-Shape" fill="#B29EDF" fill-rule="nonzero" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Visibility/Assets/Editor/Icons/Components/VisArea.svg b/Gems/Visibility/Assets/Editor/Icons/Components/VisArea.svg index 8090719466..389f4cf35d 100644 --- a/Gems/Visibility/Assets/Editor/Icons/Components/VisArea.svg +++ b/Gems/Visibility/Assets/Editor/Icons/Components/VisArea.svg @@ -12,4 +12,4 @@ </mask> <use id="Combined-Shape" fill="#B29EDF" fill-rule="nonzero" xlink:href="#path-1"></use> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/Visibility/Code/Include/EditorOccluderAreaComponentBus.h b/Gems/Visibility/Code/Include/EditorOccluderAreaComponentBus.h index 43192588b7..f2714691cb 100644 --- a/Gems/Visibility/Code/Include/EditorOccluderAreaComponentBus.h +++ b/Gems/Visibility/Code/Include/EditorOccluderAreaComponentBus.h @@ -51,4 +51,4 @@ namespace Visibility /// Type to inherit to implement EditorOccluderAreaNotifications. using EditorOccluderAreaNotificationBus = AZ::EBus<EditorOccluderAreaNotifications>; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Include/EditorPortalComponentBus.h b/Gems/Visibility/Code/Include/EditorPortalComponentBus.h index 7faab98c1f..c4ab43d8a0 100644 --- a/Gems/Visibility/Code/Include/EditorPortalComponentBus.h +++ b/Gems/Visibility/Code/Include/EditorPortalComponentBus.h @@ -57,4 +57,4 @@ namespace Visibility /// Type to inherit to implement EditorPortalNotifications. using EditorPortalNotificationBus = AZ::EBus<EditorPortalNotifications>; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Include/EditorVisAreaComponentBus.h b/Gems/Visibility/Code/Include/EditorVisAreaComponentBus.h index 878f43201e..6803ea77a6 100644 --- a/Gems/Visibility/Code/Include/EditorVisAreaComponentBus.h +++ b/Gems/Visibility/Code/Include/EditorVisAreaComponentBus.h @@ -63,4 +63,4 @@ namespace Visibility /// Type to inherit to implement EditorVisAreaComponentNotifications. using EditorVisAreaComponentNotificationBus = AZ::EBus<EditorVisAreaComponentNotifications>; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Include/OccluderAreaComponentBus.h b/Gems/Visibility/Code/Include/OccluderAreaComponentBus.h index 4ede998fcd..21b66c14c1 100644 --- a/Gems/Visibility/Code/Include/OccluderAreaComponentBus.h +++ b/Gems/Visibility/Code/Include/OccluderAreaComponentBus.h @@ -34,4 +34,4 @@ namespace Visibility /// Type to inherit to implement OccluderAreaRequests. using OccluderAreaRequestBus = AZ::EBus<OccluderAreaRequests, AZ::ComponentBus>; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Include/VisAreaComponentBus.h b/Gems/Visibility/Code/Include/VisAreaComponentBus.h index 36d72f9a68..632e68ffc5 100644 --- a/Gems/Visibility/Code/Include/VisAreaComponentBus.h +++ b/Gems/Visibility/Code/Include/VisAreaComponentBus.h @@ -35,4 +35,4 @@ namespace Visibility /// Type to inherit to implement VisAreaComponentRequests. using VisAreaComponentRequestBus = AZ::EBus<VisAreaComponentRequests, AZ::ComponentBus>; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.cpp b/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.cpp index 84c5d62334..0ab51d362a 100644 --- a/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.cpp +++ b/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.cpp @@ -82,4 +82,4 @@ namespace Visibility { return m_vertexSelection.HandleMouse(mouseInteraction); } -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.h b/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.h index 846106a2fc..babef3bccc 100644 --- a/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.h +++ b/Gems/Visibility/Code/Source/EditorOccluderAreaComponentMode.h @@ -50,4 +50,4 @@ namespace Visibility AzToolsFramework::EditorVertexSelectionFixed<AZ::Vector3> m_vertexSelection; ///< Handles all manipulator interactions with vertices. }; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Source/EditorPortalComponentMode.cpp b/Gems/Visibility/Code/Source/EditorPortalComponentMode.cpp index 45a1209a2d..5d9b089c65 100644 --- a/Gems/Visibility/Code/Source/EditorPortalComponentMode.cpp +++ b/Gems/Visibility/Code/Source/EditorPortalComponentMode.cpp @@ -82,4 +82,4 @@ namespace Visibility { return m_vertexSelection.HandleMouse(mouseInteraction); } -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Source/EditorPortalComponentMode.h b/Gems/Visibility/Code/Source/EditorPortalComponentMode.h index 2c22e85e8f..633c3a1ba8 100644 --- a/Gems/Visibility/Code/Source/EditorPortalComponentMode.h +++ b/Gems/Visibility/Code/Source/EditorPortalComponentMode.h @@ -50,4 +50,4 @@ namespace Visibility AzToolsFramework::EditorVertexSelectionFixed<AZ::Vector3> m_vertexSelection; ///< Handles all manipulator interactions with vertices. }; -} // namespace Visibility \ No newline at end of file +} // namespace Visibility diff --git a/Gems/Visibility/Code/Source/OccluderAreaComponent.cpp b/Gems/Visibility/Code/Source/OccluderAreaComponent.cpp index 9f1c8782b9..947bc3a38b 100644 --- a/Gems/Visibility/Code/Source/OccluderAreaComponent.cpp +++ b/Gems/Visibility/Code/Source/OccluderAreaComponent.cpp @@ -112,4 +112,4 @@ namespace Visibility return m_config.m_doubleSide; } -} //namespace Visibility \ No newline at end of file +} //namespace Visibility diff --git a/Gems/Visibility/Code/Source/PortalComponent.cpp b/Gems/Visibility/Code/Source/PortalComponent.cpp index 2cbad4f615..9f1f618607 100644 --- a/Gems/Visibility/Code/Source/PortalComponent.cpp +++ b/Gems/Visibility/Code/Source/PortalComponent.cpp @@ -179,4 +179,4 @@ namespace Visibility return m_config.m_lightBlendValue; } -} //namespace Visibility \ No newline at end of file +} //namespace Visibility diff --git a/Gems/Visibility/Code/Source/VisAreaComponent.cpp b/Gems/Visibility/Code/Source/VisAreaComponent.cpp index e9f5be0806..7db60f1688 100644 --- a/Gems/Visibility/Code/Source/VisAreaComponent.cpp +++ b/Gems/Visibility/Code/Source/VisAreaComponent.cpp @@ -134,4 +134,4 @@ namespace Visibility { return m_config.m_oceanIsVisible; } -} //namespace Visibility \ No newline at end of file +} //namespace Visibility diff --git a/Gems/Visibility/Code/Source/VisibilityGem.h b/Gems/Visibility/Code/Source/VisibilityGem.h index 8c6a298698..1abc1b8901 100644 --- a/Gems/Visibility/Code/Source/VisibilityGem.h +++ b/Gems/Visibility/Code/Source/VisibilityGem.h @@ -24,4 +24,4 @@ public: AZ_RTTI(VisibilityGem, "{5138F2B6-EDFB-490E-AB3E-B82E43263A20}"); VisibilityGem(); -}; \ No newline at end of file +}; diff --git a/Gems/Visibility/Code/Source/Visibility_precompiled.cpp b/Gems/Visibility/Code/Source/Visibility_precompiled.cpp index 0922e180ee..6d32d0ea69 100644 --- a/Gems/Visibility/Code/Source/Visibility_precompiled.cpp +++ b/Gems/Visibility/Code/Source/Visibility_precompiled.cpp @@ -9,4 +9,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ -#include "Visibility_precompiled.h" \ No newline at end of file +#include "Visibility_precompiled.h" diff --git a/Gems/Visibility/gem.json b/Gems/Visibility/gem.json index c03716e29a..3e8eca471b 100644 --- a/Gems/Visibility/gem.json +++ b/Gems/Visibility/gem.json @@ -10,4 +10,4 @@ "Tags": ["Untagged"], "IconPath": "preview.png", "EditorModule": true -} \ No newline at end of file +} diff --git a/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox.svg b/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox.svg index b608bede16..4c15e9e56c 100644 --- a/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox.svg +++ b/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox.svg @@ -13,4 +13,4 @@ <polygon id="Path-Copy-13" points="13.7671372 6.95665174 20.2670168 9.83072189 20.2670168 11.1874622 18.8384453 11.9660025 18.8384453 10.5820615 13.7361408 8.37348836 9.08474184 10.4526917 9.08474184 12.1167079 13.6297133 14.2223402 20.2670168 11.1874622 20.2670168 12.7590024 13.6297133 15.7107886 7.33745898 12.7061276 7.33745898 9.83072189"></polygon> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox_collider.svg b/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox_collider.svg index 59e948c0f9..59f353b377 100644 --- a/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox_collider.svg +++ b/Gems/WhiteBox/Assets/editor/icons/components/WhiteBox_collider.svg @@ -16,4 +16,4 @@ <polygon id="Path-70" fill-rule="nonzero" transform="translate(17.502016, 7.895715) rotate(7.000000) translate(-17.502016, -7.895715) " points="16.3235972 6.61844483 17.757074 6.1766936 18.6804342 9.17298496 17.2469574 9.61473619"></polygon> </g> </g> -</svg> \ No newline at end of file +</svg> diff --git a/Gems/WhiteBox/Code/Source/Platform/Windows/platform_windows_tools.cmake b/Gems/WhiteBox/Code/Source/Platform/Windows/platform_windows_tools.cmake index 561ab67600..ef25fb2f63 100644 --- a/Gems/WhiteBox/Code/Source/Platform/Windows/platform_windows_tools.cmake +++ b/Gems/WhiteBox/Code/Source/Platform/Windows/platform_windows_tools.cmake @@ -10,6 +10,9 @@ # if(PAL_TRAIT_BUILD_HOST_TOOLS) + + ly_associate_package(PACKAGE_NAME OpenMesh-8.1-rev1-windows TARGETS OpenMesh PACKAGE_HASH 1c1df639358526c368e790dfce40c45cbdfcfb1c9a041b9d7054a8949d88ee77) + set(LY_BUILD_DEPENDENCIES PRIVATE 3rdParty::OpenMesh) diff --git a/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxBuffer.h b/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxBuffer.h index bea6de5898..9d8f327616 100644 --- a/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxBuffer.h +++ b/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxBuffer.h @@ -105,7 +105,7 @@ namespace WhiteBox // create the buffer with the specified data AZ::RPI::BufferAssetCreator bufferAssetCreator; bufferAssetCreator.Begin(AZ::Uuid::CreateRandom()); - bufferAssetCreator.SetUseCommonPool(AZ::RPI::CommonBufferPoolType::DynamicInputAssembly); + bufferAssetCreator.SetUseCommonPool(AZ::RPI::CommonBufferPoolType::StaticInputAssembly); bufferAssetCreator.SetBuffer(data.data(), bufferDescriptor.m_byteCount, bufferDescriptor); bufferAssetCreator.SetBufferViewDescriptor(m_bufferViewDescriptor); diff --git a/Gems/WhiteBox/Editor/Scripts/Cylinder.py b/Gems/WhiteBox/Editor/Scripts/Cylinder.py index cc97bdb127..fdc1151309 100755 --- a/Gems/WhiteBox/Editor/Scripts/Cylinder.py +++ b/Gems/WhiteBox/Editor/Scripts/Cylinder.py @@ -87,4 +87,4 @@ if __name__ == "__main__": create_cylinder(whiteBoxMesh, args.sides, args.size) # update whiteBoxMesh - init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) \ No newline at end of file + init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) diff --git a/Gems/WhiteBox/Editor/Scripts/Icosahedron.py b/Gems/WhiteBox/Editor/Scripts/Icosahedron.py index 3dbba5214f..422fad2c19 100755 --- a/Gems/WhiteBox/Editor/Scripts/Icosahedron.py +++ b/Gems/WhiteBox/Editor/Scripts/Icosahedron.py @@ -110,4 +110,4 @@ if __name__ == "__main__": create_icosahedron(whiteBoxMesh, args.radius) # update whiteBoxMesh - init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) \ No newline at end of file + init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) diff --git a/Gems/WhiteBox/Editor/Scripts/Sphere.py b/Gems/WhiteBox/Editor/Scripts/Sphere.py index 15303dc57d..5d4004c2d0 100755 --- a/Gems/WhiteBox/Editor/Scripts/Sphere.py +++ b/Gems/WhiteBox/Editor/Scripts/Sphere.py @@ -95,4 +95,4 @@ if __name__ == "__main__": create_sphere(whiteBoxMesh, args.subdivisions, args.radius) # update whiteBoxMesh - init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) \ No newline at end of file + init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) diff --git a/Gems/WhiteBox/Editor/Scripts/Staircase.py b/Gems/WhiteBox/Editor/Scripts/Staircase.py index e53a86f6af..816d1ba7fa 100755 --- a/Gems/WhiteBox/Editor/Scripts/Staircase.py +++ b/Gems/WhiteBox/Editor/Scripts/Staircase.py @@ -100,4 +100,4 @@ if __name__ == "__main__": create_staircase_from_white_box_mesh(whiteBoxMesh, args.num_steps, args.depth, args.height, args.width) # update whiteBoxMesh - init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) \ No newline at end of file + init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) diff --git a/Gems/WhiteBox/Editor/Scripts/Tetrahedron.py b/Gems/WhiteBox/Editor/Scripts/Tetrahedron.py index 57411af4b1..340b153811 100755 --- a/Gems/WhiteBox/Editor/Scripts/Tetrahedron.py +++ b/Gems/WhiteBox/Editor/Scripts/Tetrahedron.py @@ -67,4 +67,4 @@ if __name__ == "__main__": create_tetrahedron(whiteBoxMesh, args.radius) # update whiteBoxMesh - init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) \ No newline at end of file + init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent) diff --git a/Tools/ConCom.exe b/Tools/ConCom.exe deleted file mode 100644 index 4ad6d22b0d..0000000000 --- a/Tools/ConCom.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:839988d8bedc9a8ec7abf52c34886bd8560bf0a70cfe30d2be362d74bd28851b -size 45568 diff --git a/Tools/Crashpad/LICENSE b/Tools/Crashpad/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/Tools/Crashpad/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libbase.a b/Tools/Crashpad/bin/mac/Debug_x64/libbase.a deleted file mode 100644 index 0701c2a9ec..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libbase.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb76d30a6782e42737778d75d67192eff8770745a327c7f0bcb172478bbee693 -size 3334464 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_client.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_client.a deleted file mode 100644 index a392638ff7..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_client.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60ae111931f84ebfd0fb477f894c16193f2b661448610ef28dadb6e25669f6b6 -size 2307704 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_handler_lib.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_handler_lib.a deleted file mode 100644 index 3918508de5..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_handler_lib.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b77a7b85064278b9550fb4926ede40486401023fa0aa3791e26c5b54c89ed065 -size 3076056 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_minidump.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_minidump.a deleted file mode 100644 index b0e539f27c..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_minidump.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d84217997c2c29c46e2df33883a9e869ba3a65f22dd014b858dee25cc75f199 -size 11129296 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_snapshot.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_snapshot.a deleted file mode 100644 index 71345a07be..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_snapshot.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b43625a00c5e82b21ffbd3f76b15a02b556497a11dea64a70bae065dc6db383a -size 9991040 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_tool_support.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_tool_support.a deleted file mode 100644 index df88fd5acd..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_tool_support.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36d6797b5180e458a04f39ebc7ccc4e9a077f94161aa6a1aa500a6dd2532f677 -size 76256 diff --git a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_util.a b/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_util.a deleted file mode 100644 index 473b5db188..0000000000 --- a/Tools/Crashpad/bin/mac/Debug_x64/libcrashpad_util.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a976d5ae4e58c41b1203c37c0538ce9b690bfd2c7bd41602c29bb628a4bed12 -size 10371432 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libbase.a b/Tools/Crashpad/bin/mac/Release_x64/libbase.a deleted file mode 100644 index 20c4c11d77..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libbase.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d7a99dd8cf3b1cadb7e638ede71bf143e787189352800cebe18b6148748497d -size 2312800 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_client.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_client.a deleted file mode 100644 index 4c94113647..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_client.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7721d60e9c15dc07c63b0c457047f359dcd21de08ca1a1c858cb20799be83d6d -size 1802480 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_handler_lib.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_handler_lib.a deleted file mode 100644 index 7e74206a91..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_handler_lib.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:307a8ac4a2bfc08ff98e10063b503ce7f7dbc8c45bfa3eeb1459f28fced0a69a -size 2532480 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_minidump.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_minidump.a deleted file mode 100644 index 0bbd3bf9a6..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_minidump.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f8e32c3fabea8c59f5afc7df2643ad70539aa3db10c2dae97cf3e9281507bf8 -size 8205936 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_snapshot.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_snapshot.a deleted file mode 100644 index b5c5430938..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_snapshot.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36ed8253faf1600d136923bf86ef52a812490e43c9caadee61ae28f2ecf1995b -size 7803856 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_tool_support.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_tool_support.a deleted file mode 100644 index beb086069a..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_tool_support.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3123a5553a578b8494cc9453ab039a3198cfa564f3b8b9ccef4a8a593caffa1c -size 77256 diff --git a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_util.a b/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_util.a deleted file mode 100644 index 67aa51650b..0000000000 --- a/Tools/Crashpad/bin/mac/Release_x64/libcrashpad_util.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7fd642b088929e74140930107ce9a4f06099eaa8e78dc9c024b98db3201f9fe -size 7588096 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.cc.pdb deleted file mode 100644 index 5ab13ea0e2..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6507de8507e07f3a3a3c216392951dd04cb8303d3c851cee3b6f8ef2615ccbb0 -size 536576 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.lib b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.lib deleted file mode 100644 index e64fd3652b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faf9b73e55eb744a6a672444affcf29338552623bd24400fb858b17242b3ab90 -size 2987702 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.cc.pdb deleted file mode 100644 index b87712773f..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0877dd0586810f9f376a712ad9240ee73a35358fa32c7eb74e16f020772f9b51 -size 790528 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.lib deleted file mode 100644 index 56fe8cbfe6..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad8c021cd42687428b312cac1ad233f6101708e49437ef817959c303f5e69f37 -size 3481946 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.cc.pdb deleted file mode 100644 index e4fba84562..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:631d2c813cd5f3b258555013db4dc90d57a692df60d3dad5398fce14fd2e69a7 -size 1265664 diff --git a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.lib deleted file mode 100644 index f10144feb1..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Debug_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b1e018c8571ab9e1b06c9e3a5750038a9589c2442563678815ae37a47512c80 -size 10799690 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.cc.pdb deleted file mode 100644 index 0ef01d8df6..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49e77aeba8ff229ed1df999af9ef55fd3beaffe57b3f498036be4445809f5c6f -size 512000 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.lib b/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.lib deleted file mode 100644 index e4b8713573..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d58e0c4a46398a0feaf922c2325b57650f7b80947075ed024f5317c0101e0ebf -size 2604980 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.cc.pdb deleted file mode 100644 index 63ff75fff6..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb5c38028547b3834b92fcd5f5381b893bd9e5e9f7b3946ae3616f8d5209fbbd -size 733184 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.lib deleted file mode 100644 index a81d7ee8a2..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2157bd0d5f2408074879ba68027bf78ad4585b97eac469281a8c2159f10c0fa -size 3024914 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.cc.pdb b/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.cc.pdb deleted file mode 100644 index 2cbb95208b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e477cfcc3433eb2311e4b4349ad9690f61a658298d0a82acb68f53bec086b56c -size 1191936 diff --git a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.lib deleted file mode 100644 index 0b1cbcd4b0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2013/Release_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e7f0c899275be00dc64474d0880f9bbd67989f2df9cd69bd1fc6b6ef36f194b -size 9327612 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.cc.pdb deleted file mode 100644 index 01af8cfd30..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5eeba748c1c424bf1d354a51b1e804aa37874bb6113a28a80138e1a88df9eef -size 610304 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.lib deleted file mode 100644 index 14460afd47..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5a31ccb663c6becbcc2d479a659f51891465c8664a5d70cf6ebf9a881eaabb0 -size 2279968 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.cc.pdb deleted file mode 100644 index b641cd41b1..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76458fdb9688fd8ec6d01cd127e480c0807a599df4442d83e3d0d5700203b169 -size 995328 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.lib deleted file mode 100644 index 7115fc716c..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e5b56aa6a11ecb0f0bf20ed52600c2783bb51192609e058942f6ecddb6f29a7 -size 3872018 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.cc.pdb deleted file mode 100644 index d3f8dd301a..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:158bec9dec5eb5b9e0bda8a3c6eb20413726ec5e2c32254acc1b7e5d63e884fb -size 77824 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.lib deleted file mode 100644 index db959bc6b0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_compat.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f749466487567392cb530d5b6adf104f607f3c665781fe5d28ad402366da453 -size 10570 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.cc.pdb deleted file mode 100644 index 241f04444d..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:811d32c5432a78abe224ebbfa8f05c3cd970264147fde83d31af286bc0bd7ad1 -size 1478656 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.lib deleted file mode 100644 index c8573fa0e7..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_handler_lib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:997162e154b9cb76cbad70f8e6ce40060309ba6b481d146405fd41bc4ef433a2 -size 3713948 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.cc.pdb deleted file mode 100644 index 4f463b3ca9..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f8e52266f2bf35d924559f5b84cbef8f5418ea393edd4a538b3c515c2f5b5f0 -size 2068480 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.lib deleted file mode 100644 index bf6e3be321..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_minidump.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d998572e0831aba01ab666f2db70ad728f6fc3ee681ccb5b843d4b5d5c42b46 -size 17842252 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.cc.pdb deleted file mode 100644 index ac2289b38f..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6ffe73a6ab9b9255588c674715d20aabdf0e8af1e6cc27fb0308aed059eea4d -size 1961984 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.lib deleted file mode 100644 index af8fd630a8..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_snapshot.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb734f4bc60eaa336af62ab42567fec79dbb0223ed96af6dec6ea3cc3226ea6 -size 15449366 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.cc.pdb deleted file mode 100644 index f05e897ed8..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5baba8a9eb72453324f8175ab5f2dd25ee981a6177b66982b010a55af87263ef -size 446464 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.lib deleted file mode 100644 index e40a81202a..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_tool_support.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8f330beadc180fe3f29061d743e0025c3725bf5051adcca55f199cdffbaa1f8 -size 330198 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.cc.pdb deleted file mode 100644 index 0675bb8c21..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97c7247ce76fabf3857e9a8dcc2d913d8dbc67bd5df8e3578050d447837f571f -size 1601536 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.lib deleted file mode 100644 index fb6afc5fdb..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bafac5994b2d7a5ecd062cc64f28c09be45a0cd805bcd3c4c4204d278d61bca -size 11807818 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.cc.pdb deleted file mode 100644 index 5ef03ecd9b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5af26522ab427c4ec2ea9dbe0c41eca46bb31475b8b87ab47c513e56839ba763 -size 86016 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.lib deleted file mode 100644 index 2c42ac90b0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/getopt.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd974c961c1a1443414bc21cfa10440ed1367c7cfa15fd9608ca431631917a65 -size 22644 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.c.pdb b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.c.pdb deleted file mode 100644 index 58c4ab5305..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.c.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76c990a27c549c0428095bdbe97060a40d33c3a897587ddd06e2ee8db15d4770 -size 102400 diff --git a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.lib b/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.lib deleted file mode 100644 index 0b3dab07d7..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Debug_x64/third_party/zlib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78cbbb2b947e55fb13b3f97366d759d22e828ccf2588f2a412b924fcbd2524d8 -size 350630 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.cc.pdb deleted file mode 100644 index 897a49ed6a..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:146c69b75db404f36b7d980559d3c055cd87349d7ec7505c6813b85dd139f93d -size 577536 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.lib deleted file mode 100644 index 425894ece4..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3771477293933cf29951aa4a6de64018e051a9edfde878a7cc00af0531ecf0f9 -size 1733068 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.cc.pdb deleted file mode 100644 index b78b277aaf..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ba035d4d229d0ec21aa1aa3ce56771e0b190437ea6e4cf3e5f5670cc5eadb06 -size 946176 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.lib deleted file mode 100644 index bb9a8a29f2..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83ad7341f5e86ce67bdc317f9c5e317bb86167cfef95edd1f2ff334df0c9dec2 -size 3152942 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.cc.pdb deleted file mode 100644 index e78ef129f5..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf7040092ebad18ba2460b4688fe44420d78c7c22dccb6fc929ec90f07d7fc77 -size 77824 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.lib deleted file mode 100644 index 8b156f977e..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_compat.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd56d961d1bc5674e98a3bd17ecca53f96bfd2d9f65c3f37c580fbe9e49ee3fb -size 9974 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.cc.pdb deleted file mode 100644 index 38425e2b20..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a63732692819a559de517c7b7c8fcf974a3120055f2fd14b0a1429a543ff6b3b -size 1413120 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.lib deleted file mode 100644 index 664dfbec5b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_handler_lib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e76377c0ee89df91327dcc7f62813cb4391d9856fdb2583962b0e18e3cc348c -size 2894530 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.cc.pdb deleted file mode 100644 index 309cdfd390..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9d3ade234934995bea6e0f9ca047e0356593cffa0c7a044829452c955c71fa -size 1904640 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.lib deleted file mode 100644 index 89770393fe..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_minidump.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43a46db4050f95aa4f18587115573bee354241950a91349327ac183ebdca6e99 -size 13470898 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.cc.pdb deleted file mode 100644 index 5617dec7c2..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b34cc8a085cce244ebd8eec546b6fe8c65d8b7f60f4d329588d403aa17411d7f -size 1789952 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.lib deleted file mode 100644 index d32ffb8486..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_snapshot.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1c4293d8e391406f2eb7c35d54e39ae1aaf10c96e17739741c2eb554c5ef9de -size 11151442 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.cc.pdb deleted file mode 100644 index 4bd52125c0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3acf84a1adf173c3dac27ba68265b5e264d81733063c062a95661bdf75b890b -size 421888 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.lib deleted file mode 100644 index a670e739f4..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_tool_support.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:700e7c1ec69bcbb12109e689d46dabb9c83ff6f311be54142eb143dd4ffe1b0a -size 246684 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.cc.pdb deleted file mode 100644 index f4a24c9ab9..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:887b5d2083179234e07ad7478a0f0533134ab929aaad204a54a3dc4ce27d153f -size 1511424 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.lib deleted file mode 100644 index d3f1017c19..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d342aa57bea9070e5ca768418f8b3fd0a36f735c8c5160a636ad4912a64505c0 -size 9416408 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.cc.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.cc.pdb deleted file mode 100644 index 5976aa378d..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d154da0553fd94ec3e5059503a41db03f1d68fffed12fc76ab4902ec75f6298e -size 86016 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.lib deleted file mode 100644 index cf8a5cb625..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/getopt.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f8b36cf3305d9d10e97ebac28d53cf3f6c8cf117d8fc8bac3312c65c8e48d77 -size 29408 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.c.pdb b/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.c.pdb deleted file mode 100644 index 9d6836d135..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.c.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97f469e3a535f77fc242040bb80d36f8883182868bb070c33fec041722605259 -size 102400 diff --git a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.lib b/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.lib deleted file mode 100644 index b755b2ce8c..0000000000 --- a/Tools/Crashpad/bin/windows/vs2015/Release_x64/third_party/zlib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5f1d98d742d61d430c0bbc73eeb4ab9dc7afb6adaa8bdde7570fe28a3a4aac8 -size 388862 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base.lib deleted file mode 100644 index 5f9059e1d7..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:626086670063e2d25c747e4532fba8b070122b63cfd119da97ff96b13a6c3d6e -size 2094438 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base_cc.pdb deleted file mode 100644 index 88de799261..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/base_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270034ee51a53ef434d0383765f951910319b7045867d10e66fb7bc5e5a8f380 -size 831488 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client.lib deleted file mode 100644 index fe4eaddad1..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:302ef869aad53a2ea5681ee1c5a96e198e5d521165bd6a9027d09ffd7df38fa5 -size 3914060 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client_cc.pdb deleted file mode 100644 index f93a003b98..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_client_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45020f9f0b490f1c001e6cc8bf1c45a29d678611c4655f85074fe23fa6c5ddd1 -size 1175552 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat.lib deleted file mode 100644 index 3f4d33f8b9..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:004901f966fc28e9ae6aecc8086302592cb43208ec31a7c074f699533d84c2db -size 8978 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat_cc.pdb deleted file mode 100644 index 03f989686b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_compat_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3aa1cba7cd1564df06777f4dcb4057f8bd2fcbc176ec8a494b17f7277e44a4d -size 77824 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context.lib deleted file mode 100644 index 5652923545..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36acc956e8ecf13ed164d4c416bcc92f0f31db5f30f3d1e7beb33e398a41443b -size 63796 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context_cc.pdb deleted file mode 100644 index 35c42abfea..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_context_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f97ecc158d23e273367171dc032ce3ed7feeec7b7221ccf10e36d304ee467b7e -size 454656 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler.lib deleted file mode 100644 index c9f32e4272..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5ed7b8a7193e75ff9588e6c7d06e2a3c0afda514a620dd275c1338ba6acd161 -size 3054554 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler_cc.pdb deleted file mode 100644 index 1328fd6d03..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_handler_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65903b1d9275b9268bdf7af1e4c2f2de46cd8dcc83eae4bfa64c2f5b38edbc57 -size 2887680 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump.lib deleted file mode 100644 index 3796a0478e..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0e78280364d17a23a8feb819d71fb830f67ca40b7c932467263740cb2917ead -size 13044588 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump_cc.pdb deleted file mode 100644 index 4c58046197..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_minidump_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5885d9f72f86181199e6b2f1e7fb96419982209fe7e2c8f7b06b7c77c332c836 -size 2289664 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot.lib deleted file mode 100644 index f8b4588ed5..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fb181c40f80438d0b50f79b093a3503c853a43db8e92f7d5ddfd5bb13793b16 -size 12965800 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot_cc.pdb deleted file mode 100644 index 992891a75f..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_snapshot_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27ab636cdc02fe86b73c40961c289d810f4f31be9c59c61e7c5300f0e9168fe9 -size 2355200 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support.lib deleted file mode 100644 index 330ad9beee..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f00b8108a7849e92d4711a0106b94931eced1859fb0281a423ad5179cacdf399 -size 240574 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support_cc.pdb deleted file mode 100644 index ff5ecf71a6..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_tool_support_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:026ca665e79cf98df13477abe84201dd1bdba7a0068b3b411b89eaf9cc8c1711 -size 446464 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util.lib deleted file mode 100644 index 78b3281e6c..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3a6cd014d7a1096ab492ea62061c8eac341ffe97a856710b2dd65e183fe9248 -size 11636150 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util_cc.pdb deleted file mode 100644 index 1f51fdbfd5..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/crashpad_util_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4c2b7e7ca514f1f5e768e4c7f5ec341f04b5f1e5fe82a8885476d1e1ed833f4 -size 2363392 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.cc.pdb deleted file mode 100644 index 5ef03ecd9b..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5af26522ab427c4ec2ea9dbe0c41eca46bb31475b8b87ab47c513e56839ba763 -size 86016 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.lib deleted file mode 100644 index 2c42ac90b0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/getopt.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd974c961c1a1443414bc21cfa10440ed1367c7cfa15fd9608ca431631917a65 -size 22644 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.c.pdb b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.c.pdb deleted file mode 100644 index 58c4ab5305..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.c.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76c990a27c549c0428095bdbe97060a40d33c3a897587ddd06e2ee8db15d4770 -size 102400 diff --git a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.lib b/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.lib deleted file mode 100644 index 0b3dab07d7..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Debug_x64/third_party/zlib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78cbbb2b947e55fb13b3f97366d759d22e828ccf2588f2a412b924fcbd2524d8 -size 350630 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/base.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/base.lib deleted file mode 100644 index ab843e4478..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/base.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07139d47140d27876fff382036637bab1e22ae8c65b5ceaf37f92fcd347587a7 -size 1124438 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/base_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/base_cc.pdb deleted file mode 100644 index 366ca528e2..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/base_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b09045400a4ee55542916a915c111072a4f8b27be77378cb52f1597fd87d8150 -size 806912 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client.lib deleted file mode 100644 index 027348705d..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4cbb4e87fe52a5b85739cb2cc562cc9da718b8a2d62df74428d40ccdf62cce2 -size 1696870 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client_cc.pdb deleted file mode 100644 index 5a66efa3bf..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_client_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae28bf771c2788a34bf642ab95ba102e5d6c7b8e22b23742a93b8092b5c5e687 -size 1085440 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat.lib deleted file mode 100644 index 7cf7f10d4c..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0803ce1fe7b23397997d6cc160803e44c7c172616223004ee5f17a5ae41d165 -size 8734 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat_cc.pdb deleted file mode 100644 index bee40682a0..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_compat_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69f1497cdf145f98a04d05cc4bae8f7c60e98de3faafab46c9dacc95d4557fb5 -size 77824 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context.lib deleted file mode 100644 index 8699928d13..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8a96c249ee9af8ddd9d9f66b93cd7ec5edb45dc5e0e012645917490a80897e3 -size 49100 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context_cc.pdb deleted file mode 100644 index c92e68adbd..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_context_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fd31008151c0e7cb2dc6f3547d391ba69aeb4741b8b5b5e76abd83b6415e100 -size 430080 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler.lib deleted file mode 100644 index e2d8a48531..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c9099859046bf4dafcf6455c39accfefe5ca389d8bfdc86fe2209c5e4b8804f -size 1157858 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler_cc.pdb deleted file mode 100644 index 49e5c1d8b1..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_handler_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca7cc3c846da2017736d813e56e32071d9e720319dc8fd636372923a3c25d223 -size 2527232 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump.lib deleted file mode 100644 index 4ef4c8ae40..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3430726856c3b68f422614166ed64e7249b2246363c27fd2d63e63f668c2e47d -size 5155320 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump_cc.pdb deleted file mode 100644 index 4a2457000f..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_minidump_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae7f896e3613565161bc41b90dc45aed9539c82261d9b5c2ed9c5a3a0b8f31b9 -size 2052096 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot.lib deleted file mode 100644 index 698f891924..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c1ca49c6246323d9d4f854f4e8767735fdd51b0cc3faa7ce3d5a985e65db1a5 -size 4598666 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot_cc.pdb deleted file mode 100644 index 01de39bbf7..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_snapshot_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eac108b65d4b45ffc08d11f457274c25e9c7aba978b79cdcccd0894a07f679c -size 2134016 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support.lib deleted file mode 100644 index 64786f1069..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:232322c240867a6a781784c754ac69a5e5452ff7bf6ac582ace35e9b1f68aada -size 95970 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support_cc.pdb deleted file mode 100644 index ec48eeab69..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_tool_support_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a2b9b1d36c94c189d9c5ea821a2b819b01c4db449fa6b6a574e19efc2600978 -size 413696 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util.lib deleted file mode 100644 index 4c346532a8..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6bf62815ecf6591fda46ba72b3636df660d5ceaa6571d55dec0f4b306d69cb1 -size 5704098 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util_cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util_cc.pdb deleted file mode 100644 index bd5f778e18..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/crashpad_util_cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e30478f7aa319924d5b2578ec038cd58f93d9be726e918dc6693964b9550532 -size 2256896 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.cc.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.cc.pdb deleted file mode 100644 index 5976aa378d..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.cc.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d154da0553fd94ec3e5059503a41db03f1d68fffed12fc76ab4902ec75f6298e -size 86016 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.lib deleted file mode 100644 index cf8a5cb625..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/getopt.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f8b36cf3305d9d10e97ebac28d53cf3f6c8cf117d8fc8bac3312c65c8e48d77 -size 29408 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.c.pdb b/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.c.pdb deleted file mode 100644 index 9d6836d135..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.c.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97f469e3a535f77fc242040bb80d36f8883182868bb070c33fec041722605259 -size 102400 diff --git a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.lib b/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.lib deleted file mode 100644 index b755b2ce8c..0000000000 --- a/Tools/Crashpad/bin/windows/vs2019/Release_x64/third_party/zlib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5f1d98d742d61d430c0bbc73eeb4ab9dc7afb6adaa8bdde7570fe28a3a4aac8 -size 388862 diff --git a/Tools/Crashpad/building/README.txt b/Tools/Crashpad/building/README.txt deleted file mode 100644 index 05e6de2629..0000000000 --- a/Tools/Crashpad/building/README.txt +++ /dev/null @@ -1,110 +0,0 @@ -Base instructions for building crashpad live at https://chromium.googlesource.com/crashpad/crashpad/+/HEAD/doc/developing.md - -This document is intended to cover changes from the base instructions for building Lumberyard's crashpad libraries. - -depot_tools runs its own copy of the git client which is not granted a Cylance exclusion so you may run into issues and need to do manual git pulls (I did). - -Lumberyard currently builds a 2013 and 2015 version of Crashpad. Crashpad stopped supporting 2013 in December 2016 so it is necessary to checkout an earlier version for this build. To get the correct build: - -Crashpad clone - git fetch crashpad -Crashpad sync to "good" december version for 2013 - git checkout 556c4e - -Crashpad has its own set of 3rdParty libraries which are handled by depot_tools - in the case of mini_chromium it is necessary to sync to the same checkout as above when building for 2013. - -Clone mini_chromium to 2013 version: -delete third_party/mini_chromium/mini_chromium/build/common -git clone https://chromium.googlesource.com/chromium/mini_chromium -Sync to good (pre december) Cl - (from within mini_chromium dir) git checkout ca7f42a - -Make sure to copy over third_party/mini_chromium/mini_chromium.gyp -make .gypi changes from mini_chromium/mini_chromium/build and crashpad/build - -RuntimeLibraries and ITERATOR_DEBUG settings need to match with Lumberyard Settings: - -Added to build\crashpad.gypi - - 'configurations': { - 'Debug': { - 'msvs_settings': { - 'VCCLCompilerTool' : { - 'RuntimeLibrary': '3' /MDd - } - } - }, - 'Debug_x64': { - 'msvs_settings': { - 'VCCLCompilerTool' : { - 'RuntimeLibrary': '3' /MDd - } - } - }, - 'Release': { - 'msvs_settings': { - 'VCCLCompilerTool' : { - 'RuntimeLibrary': '2' /MD - } - }, - 'defines': [ - '_ITERATOR_DEBUG_LEVEL=0' - ] - }, - 'Release_x64': { - 'msvs_settings': { - 'VCCLCompilerTool' : { - 'RuntimeLibrary': '2' /MD - } - }, - 'defines': [ - '_ITERATOR_DEBUG_LEVEL=0' - - } - -mini_chromium base settings live in third_party/mini_chromium/mini_chromium/build/common.gypi - switch RuntimeLibrary in debug from 1 to 3 there - -The ninja build system doesn't seem to have a great way to force a full rebuild (Their stated goal is to build as little as possible as quickly as possible), so when from time to time you find you need to force a full rebuild: -Cleaning (from crashpad/crashpad): -del /s /q *.obj -del /s /q *.lib - -I made minor modifications to the crash report uploader so a confirmation dialog could be displayed to the user. The file is checked in perforce as dev/Tools/Crashpad/handler/src/crash_report_upload_thread.cc which should be copied over the existing copy from git which lives in crashpad\handler or the changes can be merged in if necessary. The new block is in ProcessPendingReport and currently looks like: - -// Amazon - Handle giving the user the option of whether or not to send the report. -#if defined(OS_WIN) - std::wstring sendDialogMessage{ L"Lumberyard has encountered a fatal error. We're sorry for the inconvenience.\n\nA Lumberyard Editor crash debugging file has been created at:\n" }; - sendDialogMessage += report.file_path.value(); - sendDialogMessage += L"\n\nIf you are willing to submit this file to Amazon it will help us improve the Lumberyard experience. We will treat this report as confidential.\n\nWould you like to send the error report?"; - - int msgboxID = MessageBox( - NULL, - sendDialogMessage.data(), - L"Send Error Report", - (MB_ICONEXCLAMATION | MB_YESNO | MB_SYSTEMMODAL) - ); - - if (msgboxID == IDNO) - { - database_->SkipReportUpload(report.uuid, - Metrics::CrashSkippedReason::kUploadsDisabled); - database_->DeleteReport(report.uuid); - return; - } -#endif - -Currently we build the Debug_x64 and Release_x64 variant for both 2015 and 2013. -Build output goes to out\<buildtypefromabove>\obj\ - -The libraries we use are: - -crashpad_client.lib from client (Also include crashpad_client.cc.pdb) -base.lib from third_party\mini_chromium\mini_chromium\base (and base.cc.pdb) -crashpad_util.lib from util (and crashpad_util.cc.pdb) - -All sit together in dev\Tools\Crashpad\bin\windows\vs2015\Debug_x64 (Or whichever is the corresponding compiler/build target you're making) - -Each have some include headers that need to go into dev\Tools\Crashpad\include - there are about 15 or so total and hopefully don't need changing from the time of this writing, but if you build with a newer version of Crashpad for 2015 than I did (which was around April 1 2017) you may need to make some updates. - -The 2013 headers have their own directory at Crashpad\include\vs2013. - -Then the handler exe is crashpad_handler.exe which goes in dev\tools\Crashpad\handler. We only need one of those, I used the Release_x64 variant for 2015. - -Use the python in (root)/dev/python to do building. \ No newline at end of file diff --git a/Tools/Crashpad/handler/crashpad_handler.exe b/Tools/Crashpad/handler/crashpad_handler.exe deleted file mode 100644 index 958cfa0bf7..0000000000 --- a/Tools/Crashpad/handler/crashpad_handler.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b4e80690178401311f2bb1ba98da4ba668682a10561a3399f085557a18af79a -size 1029632 diff --git a/Tools/Crashpad/handler/src/crash_report_upload_thread.cc b/Tools/Crashpad/handler/src/crash_report_upload_thread.cc deleted file mode 100644 index ccb1512e24..0000000000 --- a/Tools/Crashpad/handler/src/crash_report_upload_thread.cc +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "handler/crash_report_upload_thread.h" - -#include <errno.h> -#include <time.h> - -#include <algorithm> -#include <map> -#include <memory> -#include <vector> - -#include "base/logging.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "build/build_config.h" -#include "client/settings.h" -#include "handler/minidump_to_upload_parameters.h" -#include "snapshot/minidump/process_snapshot_minidump.h" -#include "snapshot/module_snapshot.h" -#include "util/file/file_reader.h" -#include "util/misc/metrics.h" -#include "util/misc/uuid.h" -#include "util/net/http_body.h" -#include "util/net/http_multipart_builder.h" -#include "util/net/http_transport.h" -#include "util/net/url.h" -#include "util/stdlib/map_insert.h" - -#if defined(OS_MACOSX) -#include "handler/mac/file_limit_annotation.h" -#endif // OS_MACOSX - -// Amazon - Handle giving the user the option of whether or not to send the report. -namespace O3de -{ - bool CheckConfirmation(const crashpad::CrashReportDatabase::Report& report); - bool AddAttachments(crashpad::HTTPMultipartBuilder& multipartBuilder); - bool UpdateHttpTransport(std::unique_ptr<crashpad::HTTPTransport>& httpTransport, const std::string& baseURL); -} - -namespace crashpad { - -namespace { - -// Calls CrashReportDatabase::RecordUploadAttempt() with |successful| set to -// false upon destruction unless disarmed by calling Fire() or Disarm(). Fire() -// triggers an immediate call. Armed upon construction. -class CallRecordUploadAttempt { - public: - CallRecordUploadAttempt(CrashReportDatabase* database, - const CrashReportDatabase::Report* report) - : database_(database), - report_(report) { - } - - ~CallRecordUploadAttempt() { - Fire(); - } - - void Fire() { - if (report_) { - database_->RecordUploadAttempt(report_, false, std::string()); - } - - Disarm(); - } - - void Disarm() { - report_ = nullptr; - } - - private: - CrashReportDatabase* database_; // weak - const CrashReportDatabase::Report* report_; // weak - - DISALLOW_COPY_AND_ASSIGN(CallRecordUploadAttempt); -}; - -} // namespace - -CrashReportUploadThread::CrashReportUploadThread(CrashReportDatabase* database, - const std::string& url, - const Options& options) - : options_(options), - url_(url), - // When watching for pending reports, check every 15 minutes, even in the - // absence of a signal from the handler thread. This allows for failed - // uploads to be retried periodically, and for pending reports written by - // other processes to be recognized. - thread_(options.watch_pending_reports ? 15 * 60.0 - : WorkerThread::kIndefiniteWait, - this), - known_pending_report_uuids_(), - database_(database) {} - -CrashReportUploadThread::~CrashReportUploadThread() { -} - -void CrashReportUploadThread::Start() { - thread_.Start( - options_.watch_pending_reports ? 0.0 : WorkerThread::kIndefiniteWait); -} - -void CrashReportUploadThread::Stop() { - thread_.Stop(); -} - -void CrashReportUploadThread::ReportPending(const UUID& report_uuid) { - known_pending_report_uuids_.PushBack(report_uuid); - thread_.DoWorkNow(); -} - -void CrashReportUploadThread::ProcessPendingReports() { - std::vector<UUID> known_report_uuids = known_pending_report_uuids_.Drain(); - for (const UUID& report_uuid : known_report_uuids) { - CrashReportDatabase::Report report; - if (database_->LookUpCrashReport(report_uuid, &report) != - CrashReportDatabase::kNoError) { - continue; - } - - ProcessPendingReport(report); - - // Respect Stop() being called after at least one attempt to process a - // report. - if (!thread_.is_running()) { - return; - } - } - - // Known pending reports are always processed (above). The rest of this - // function is concerned with scanning for pending reports not already known - // to this thread. - if (!options_.watch_pending_reports) { - return; - } - - std::vector<CrashReportDatabase::Report> reports; - if (database_->GetPendingReports(&reports) != CrashReportDatabase::kNoError) { - // The database is sick. It might be prudent to stop trying to poke it from - // this thread by abandoning the thread altogether. On the other hand, if - // the problem is transient, it might be possible to talk to it again on the - // next pass. For now, take the latter approach. - return; - } - - for (const CrashReportDatabase::Report& report : reports) { - if (std::find(known_report_uuids.begin(), - known_report_uuids.end(), - report.uuid) != known_report_uuids.end()) { - // An attempt to process the report already occurred above. The report is - // still pending, so upload must have failed. Don’t retry it immediately, - // it can wait until at least the next pass through this method. - continue; - } - - ProcessPendingReport(report); - - // Respect Stop() being called after at least one attempt to process a - // report. - if (!thread_.is_running()) { - return; - } - } -} - -void CrashReportUploadThread::ProcessPendingReport( - const CrashReportDatabase::Report& report) { -#if defined(OS_MACOSX) - RecordFileLimitAnnotation(); -#endif // OS_MACOSX - - Settings* const settings = database_->GetSettings(); - - bool uploads_enabled; - if (url_.empty() || - (!report.upload_explicitly_requested && - (!settings->GetUploadsEnabled(&uploads_enabled) || !uploads_enabled))) { - // Don’t attempt an upload if there’s no URL to upload to. Allow upload if - // it has been explicitly requested by the user, otherwise, respect the - // upload-enabled state stored in the database’s settings. - database_->SkipReportUpload(report.uuid, - Metrics::CrashSkippedReason::kUploadsDisabled); - return; - } - - // Amazon - Handle giving the user the option of whether or not to send the report. - if (!O3DE::CheckConfirmation(report)) - { - database_->SkipReportUpload(report.uuid, - Metrics::CrashSkippedReason::kUploadsDisabled); - database_->DeleteReport(report.uuid); - return; - } - - // This currently implements very simplistic rate-limiting, compatible with - // the Breakpad client, where the strategy is to permit one upload attempt per - // hour, and retire reports that would exceed this limit or for which the - // upload fails on the first attempt. - // - // If upload was requested explicitly (i.e. by user action), we do not - // throttle the upload. - // - // TODO(mark): Provide a proper rate-limiting strategy and allow for failed - // upload attempts to be retried. - if (!report.upload_explicitly_requested && options_.rate_limit) { - time_t last_upload_attempt_time; - if (settings->GetLastUploadAttemptTime(&last_upload_attempt_time)) { - time_t now = time(nullptr); - if (now >= last_upload_attempt_time) { - // If the most recent upload attempt occurred within the past hour, - // don’t attempt to upload the new report. If it happened longer ago, - // attempt to upload the report. - constexpr int kUploadAttemptIntervalSeconds = 60 * 60; // 1 hour - if (now - last_upload_attempt_time < kUploadAttemptIntervalSeconds) { - database_->SkipReportUpload( - report.uuid, Metrics::CrashSkippedReason::kUploadThrottled); - return; - } - } else { - // The most recent upload attempt purportedly occurred in the future. If - // it “happened†at least one day in the future, assume that the last - // upload attempt time is bogus, and attempt to upload the report. If - // the most recent upload time is in the future but within one day, - // accept it and don’t attempt to upload the report. - constexpr int kBackwardsClockTolerance = 60 * 60 * 24; // 1 day - if (last_upload_attempt_time - now < kBackwardsClockTolerance) { - database_->SkipReportUpload( - report.uuid, Metrics::CrashSkippedReason::kUnexpectedTime); - return; - } - } - } - } - - const CrashReportDatabase::Report* upload_report; - CrashReportDatabase::OperationStatus status = - database_->GetReportForUploading(report.uuid, &upload_report); - switch (status) { - case CrashReportDatabase::kNoError: - break; - - case CrashReportDatabase::kBusyError: - case CrashReportDatabase::kReportNotFound: - // Someone else may have gotten to it first. If they’re working on it now, - // this will be kBusyError. If they’ve already finished with it, it’ll be - // kReportNotFound. - return; - - case CrashReportDatabase::kFileSystemError: - case CrashReportDatabase::kDatabaseError: - // In these cases, SkipReportUpload() might not work either, but it’s best - // to at least try to get the report out of the way. - database_->SkipReportUpload(report.uuid, - Metrics::CrashSkippedReason::kDatabaseError); - return; - - case CrashReportDatabase::kCannotRequestUpload: - NOTREACHED(); - return; - } - - CallRecordUploadAttempt call_record_upload_attempt(database_, upload_report); - - std::string response_body; - UploadResult upload_result = UploadReport(upload_report, &response_body); - switch (upload_result) { - case UploadResult::kSuccess: - call_record_upload_attempt.Disarm(); - database_->RecordUploadAttempt(upload_report, true, response_body); - break; - case UploadResult::kPermanentFailure: - case UploadResult::kRetry: - call_record_upload_attempt.Fire(); - - // TODO(mark): Deal with retries properly: don’t call SkipReportUplaod() - // if the result was kRetry and the report hasn’t already been retried - // too many times. - database_->SkipReportUpload(report.uuid, - Metrics::CrashSkippedReason::kUploadFailed); - break; - } -} - -CrashReportUploadThread::UploadResult CrashReportUploadThread::UploadReport( - const CrashReportDatabase::Report* report, - std::string* response_body) { - std::map<std::string, std::string> parameters; - - FileReader minidump_file_reader; - if (!minidump_file_reader.Open(report->file_path)) { - // If the minidump file can’t be opened, all hope is lost. - return UploadResult::kPermanentFailure; - } - - FileOffset start_offset = minidump_file_reader.SeekGet(); - if (start_offset < 0) { - return UploadResult::kPermanentFailure; - } - - // Ignore any errors that might occur when attempting to interpret the - // minidump file. This may result in its being uploaded with few or no - // parameters, but as long as there’s a dump file, the server can decide what - // to do with it. - ProcessSnapshotMinidump minidump_process_snapshot; - if (minidump_process_snapshot.Initialize(&minidump_file_reader)) { - parameters = - BreakpadHTTPFormParametersFromMinidump(&minidump_process_snapshot); - } - - if (!minidump_file_reader.SeekSet(start_offset)) { - return UploadResult::kPermanentFailure; - } - - HTTPMultipartBuilder http_multipart_builder; - http_multipart_builder.SetGzipEnabled(options_.upload_gzip); - - static constexpr char kMinidumpKey[] = "upload_file_minidump"; - - for (const auto& kv : parameters) { - if (kv.first == kMinidumpKey) { - LOG(WARNING) << "reserved key " << kv.first << ", discarding value " - << kv.second; - } else { - http_multipart_builder.SetFormData(kv.first, kv.second); - } - } - - http_multipart_builder.SetFileAttachment( - kMinidumpKey, -#if defined(OS_WIN) - base::UTF16ToUTF8(report->file_path.BaseName().value()), -#else - report->file_path.BaseName().value(), -#endif - &minidump_file_reader, - "application/octet-stream"); - - // Amazon - O3de::AddAttachments(http_multipart_builder); - - std::unique_ptr<HTTPTransport> http_transport(HTTPTransport::Create()); - HTTPHeaders content_headers; - - http_multipart_builder.PopulateContentHeaders(&content_headers); - - for (const auto& content_header : content_headers) { - http_transport->SetHeader(content_header.first, content_header.second); - } - http_transport->SetBodyStream(http_multipart_builder.GetBodyStream()); - // TODO(mark): The timeout should be configurable by the client. - http_transport->SetTimeout(60.0); // 1 minute. - - std::string url = url_; - if (options_.identify_client_via_url) { - // Add parameters to the URL which identify the client to the server. - static constexpr struct { - const char* key; - const char* url_field_name; - } kURLParameterMappings[] = { - {"prod", "product"}, - {"ver", "version"}, - {"guid", "guid"}, - }; - - for (const auto& parameter_mapping : kURLParameterMappings) { - const auto it = parameters.find(parameter_mapping.key); - if (it != parameters.end()) { - url.append( - base::StringPrintf("%c%s=%s", - url.find('?') == std::string::npos ? '?' : '&', - parameter_mapping.url_field_name, - URLEncode(it->second).c_str())); - } - } - } - http_transport->SetURL(url); - - // Amazon - O3de::UpdateHttpTransport(http_transport, url); - - if (!http_transport->ExecuteSynchronously(response_body)) { - return UploadResult::kRetry; - } - - return UploadResult::kSuccess; -} - -void CrashReportUploadThread::DoWork(const WorkerThread* thread) { - ProcessPendingReports(); -} - -} // namespace crashpad diff --git a/Tools/Crashpad/include/client/annotation.h b/Tools/Crashpad/include/client/annotation.h deleted file mode 100644 index c7d92d80c5..0000000000 --- a/Tools/Crashpad/include/client/annotation.h +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_ANNOTATION_H_ -#define CRASHPAD_CLIENT_ANNOTATION_H_ - -#include <algorithm> -#include <atomic> - -#include <stdint.h> -#include <string.h> -#include <sys/types.h> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/numerics/safe_conversions.h" -#include "base/strings/string_piece.h" -#include "build/build_config.h" - -namespace crashpad { - -class AnnotationList; - -//! \brief Base class for an annotation, which records a name-value pair of -//! arbitrary data when set. -//! -//! After an annotation is declared, its `value_ptr_` will not be captured in a -//! crash report until a call to \a SetSize() specifies how much data from the -//! value should be recorded. -//! -//! Annotations should be declared with static storage duration. -//! -//! An example declaration and usage: -//! -//! \code -//! // foo.cc: -//! -//! namespace { -//! char g_buffer[1024]; -//! crashpad::Annotation g_buffer_annotation( -//! crashpad::Annotation::Type::kString, "buffer_head", g_buffer); -//! } // namespace -//! -//! void OnBufferProduced(size_t n) { -//! // Capture the head of the buffer, in case we crash when parsing it. -//! g_buffer_annotation.SetSize(std::min(64, n)); -//! -//! // Start parsing the header. -//! Frobinate(g_buffer, n); -//! } -//! \endcode -//! -//! Annotation objects are not inherently thread-safe. To manipulate them -//! from multiple threads, external synchronization must be used. -//! -//! Annotation objects should never be destroyed. Once they are Set(), they -//! are permanently referenced by a global object. -class Annotation { - public: - //! \brief The maximum length of an annotation’s name, in bytes. - static constexpr size_t kNameMaxLength = 64; - - //! \brief The maximum size of an annotation’s value, in bytes. - static constexpr size_t kValueMaxSize = 2048; - - //! \brief The type used for \a SetSize(). - using ValueSizeType = uint32_t; - - //! \brief The type of data stored in the annotation. - enum class Type : uint16_t { - //! \brief An invalid annotation. Reserved for internal use. - kInvalid = 0, - - //! \brief A `NUL`-terminated C-string. - kString = 1, - - //! \brief Clients may declare their own custom types by using values - //! greater than this. - kUserDefinedStart = 0x8000, - }; - - //! \brief Creates a user-defined Annotation::Type. - //! - //! This exists to remove the casting overhead of `enum class`. - //! - //! \param[in] value A value used to create a user-defined type. - //! - //! \returns The value added to Type::kUserDefinedStart and casted. - constexpr static Type UserDefinedType(uint16_t value) { - using UnderlyingType = std::underlying_type<Type>::type; - // MSVS 2015 doesn't have full C++14 support and complains about local - // variables defined in a constexpr function, which is valid. Avoid them - // and the also-problematic DCHECK until all the infrastructure is updated: - // https://crbug.com/crashpad/201. -#if !defined(OS_WIN) || (defined(_MSC_VER) && _MSC_VER >= 1910) - const UnderlyingType start = - static_cast<UnderlyingType>(Type::kUserDefinedStart); - const UnderlyingType user_type = start + value; - DCHECK(user_type > start) << "User-defined Type is 0 or overflows"; - return static_cast<Type>(user_type); -#else - return static_cast<Type>( - static_cast<UnderlyingType>(Type::kUserDefinedStart) + value); -#endif - } - - //! \brief Constructs a new annotation. - //! - //! Upon construction, the annotation will not be included in any crash - //! reports until \sa SetSize() is called with a value greater than `0`. - //! - //! \param[in] type The data type of the value of the annotation. - //! \param[in] name A `NUL`-terminated C-string name for the annotation. Names - //! do not have to be unique, though not all crash processors may handle - //! Annotations with the same name. Names should be constexpr data with - //! static storage duration. - //! \param[in] value_ptr A pointer to the value for the annotation. The - //! pointer may not be changed once associated with an annotation, but - //! the data may be mutated. - constexpr Annotation(Type type, const char name[], void* const value_ptr) - : link_node_(nullptr), - name_(name), - value_ptr_(value_ptr), - size_(0), - type_(type) {} - - //! \brief Specifies the number of bytes in \a value_ptr_ to include when - //! generating a crash report. - //! - //! A size of `0` indicates that no value should be recorded and is the - //! equivalent of calling \sa Clear(). - //! - //! This method does not mutate the data referenced by the annotation, it - //! merely updates the annotation system's bookkeeping. - //! - //! Subclasses of this base class that provide additional Set methods to - //! mutate the value of the annotation must call always call this method. - //! - //! \param[in] size The number of bytes. - void SetSize(ValueSizeType size); - - //! \brief Marks the annotation as cleared, indicating the \a value_ptr_ - //! should not be included in a crash report. - //! - //! This method does not mutate the data referenced by the annotation, it - //! merely updates the annotation system's bookkeeping. - void Clear(); - - //! \brief Tests whether the annotation has been set. - bool is_set() const { return size_ > 0; } - - Type type() const { return type_; } - ValueSizeType size() const { return size_; } - const char* name() const { return name_; } - const void* value() const { return value_ptr_; } - - protected: - friend class AnnotationList; - - std::atomic<Annotation*>& link_node() { return link_node_; } - - private: - //! \brief Linked list next-node pointer. Accessed only by \sa AnnotationList. - //! - //! This will be null until the first call to \sa SetSize(), after which the - //! presence of the pointer will prevent the node from being added to the - //! list again. - std::atomic<Annotation*> link_node_; - - const char* const name_; - void* const value_ptr_; - ValueSizeType size_; - const Type type_; - - DISALLOW_COPY_AND_ASSIGN(Annotation); -}; - -//! \brief An \sa Annotation that stores a `NUL`-terminated C-string value. -//! -//! The storage for the value is allocated by the annotation and the template -//! parameter \a MaxSize controls the maxmium length for the value. -//! -//! It is expected that the string value be valid UTF-8, although this is not -//! validated. -template <Annotation::ValueSizeType MaxSize> -class StringAnnotation : public Annotation { - public: - //! \brief A constructor tag that enables braced initialization in C arrays. - //! - //! \sa StringAnnotation() - enum class Tag { kArray }; - - //! \brief Constructs a new StringAnnotation with the given \a name. - //! - //! \param[in] name The Annotation name. - constexpr explicit StringAnnotation(const char name[]) - : Annotation(Type::kString, name, value_), value_() {} - - //! \brief Constructs a new StringAnnotation with the given \a name. - //! - //! This constructor takes the ArrayInitializerTag for use when - //! initializing a C array of annotations. The main constructor is - //! explicit and cannot be brace-initialized. As an example: - //! - //! \code - //! static crashpad::StringAnnotation<32> annotations[] = { - //! {"name-1", crashpad::StringAnnotation<32>::Tag::kArray}, - //! {"name-2", crashpad::StringAnnotation<32>::Tag::kArray}, - //! {"name-3", crashpad::StringAnnotation<32>::Tag::kArray}, - //! }; - //! \endcode - //! - //! \param[in] name The Annotation name. - //! \param[in] tag A constructor tag. - constexpr StringAnnotation(const char name[], Tag tag) - : StringAnnotation(name) {} - - //! \brief Sets the Annotation's string value. - //! - //! \param[in] value The `NUL`-terminated C-string value. - void Set(const char* value) { - strncpy(value_, value, MaxSize); - SetSize( - std::min(MaxSize, base::saturated_cast<ValueSizeType>(strlen(value)))); - } - - //! \brief Sets the Annotation's string value. - //! - //! \param[in] string The string value. - void Set(base::StringPiece string) { - Annotation::ValueSizeType size = - std::min(MaxSize, base::saturated_cast<ValueSizeType>(string.size())); - memcpy(value_, string.data(), size); - // Check for no embedded `NUL` characters. - DCHECK(!memchr(value_, '\0', size)) << "embedded NUL"; - SetSize(size); - } - - const base::StringPiece value() const { - return base::StringPiece(value_, size()); - } - - private: - // This value is not `NUL`-terminated, since the size is stored by the base - // annotation. - char value_[MaxSize]; - - DISALLOW_COPY_AND_ASSIGN(StringAnnotation); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_ANNOTATION_H_ diff --git a/Tools/Crashpad/include/client/annotation_list.h b/Tools/Crashpad/include/client/annotation_list.h deleted file mode 100644 index 9485c46c4a..0000000000 --- a/Tools/Crashpad/include/client/annotation_list.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_ANNOTATION_LIST_H_ -#define CRASHPAD_CLIENT_ANNOTATION_LIST_H_ - -#include "base/macros.h" -#include "client/annotation.h" - -namespace crashpad { - -//! \brief A list that contains all the currently set annotations. -//! -//! An instance of this class must be registered on the \a CrashpadInfo -//! structure in order to use the annotations system. Once a list object has -//! been registered on the CrashpadInfo, a different instance should not -//! be used instead. -class AnnotationList { - public: - AnnotationList(); - ~AnnotationList(); - - //! \brief Returns the instance of the list that has been registered on the - //! CrashapdInfo structure. - static AnnotationList* Get(); - - //! \brief Returns the instace of the list, creating and registering - //! it if one is not already set on the CrashapdInfo structure. - static AnnotationList* Register(); - - //! \brief Adds \a annotation to the global list. This method does not need - //! to be called by clients directly. The Annotation object will do so - //! automatically. - //! - //! Once an annotation is added to the list, it is not removed. This is - //! because the AnnotationList avoids the use of locks/mutexes, in case it is - //! being manipulated in a compromised context. Instead, an Annotation keeps - //! track of when it has been cleared, which excludes it from a crash report. - //! This design also avoids linear scans of the list when repeatedly setting - //! and/or clearing the value. - void Add(Annotation* annotation); - - //! \brief An InputIterator for the AnnotationList. - class Iterator { - public: - ~Iterator(); - - Annotation* operator*() const; - Iterator& operator++(); - bool operator==(const Iterator& other) const; - bool operator!=(const Iterator& other) const { return !(*this == other); } - - private: - friend class AnnotationList; - Iterator(Annotation* head, const Annotation* tail); - - Annotation* curr_; - const Annotation* const tail_; - - // Copy and assign are required. - }; - - //! \brief Returns an iterator to the first element of the annotation list. - Iterator begin(); - - //! \brief Returns an iterator past the last element of the annotation list. - Iterator end(); - - private: - // To make it easier for the handler to locate the dummy tail node, store the - // pointer. Placed first for packing. - const Annotation* const tail_pointer_; - - // Dummy linked-list head and tail elements of \a Annotation::Type::kInvalid. - Annotation head_; - Annotation tail_; - - DISALLOW_COPY_AND_ASSIGN(AnnotationList); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_ANNOTATION_LIST_H_ diff --git a/Tools/Crashpad/include/client/capture_context_mac.h b/Tools/Crashpad/include/client/capture_context_mac.h deleted file mode 100644 index 74e440edb1..0000000000 --- a/Tools/Crashpad/include/client/capture_context_mac.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CAPTURE_CONTEXT_MAC_H_ -#define CRASHPAD_CLIENT_CAPTURE_CONTEXT_MAC_H_ - -#include <mach/mach.h> - -#include "build/build_config.h" - -namespace crashpad { - -#if defined(ARCH_CPU_X86_FAMILY) -using NativeCPUContext = x86_thread_state; -#endif - -//! \brief Saves the CPU context. -//! -//! The CPU context will be captured as accurately and completely as possible, -//! containing an atomic snapshot at the point of this function’s return. This -//! function does not modify any registers. -//! -//! \param[out] cpu_context The structure to store the context in. -//! -//! \note On x86_64, the value for `%%rdi` will be populated with the address of -//! this function’s argument, as mandated by the ABI. If the value of -//! `%%rdi` prior to calling this function is needed, it must be obtained -//! separately prior to calling this function. For example: -//! \code -//! uint64_t rdi; -//! asm("movq %%rdi, %0" : "=m"(rdi)); -//! \endcode -void CaptureContext(NativeCPUContext* cpu_context); - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CAPTURE_CONTEXT_MAC_H_ diff --git a/Tools/Crashpad/include/client/crash_report_database.h b/Tools/Crashpad/include/client/crash_report_database.h deleted file mode 100644 index 6211789923..0000000000 --- a/Tools/Crashpad/include/client/crash_report_database.h +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ -#define CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ - -#include <time.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/misc/metrics.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -class Settings; - -//! \brief An interface for managing a collection of crash report files and -//! metadata associated with the crash reports. -//! -//! All Report objects that are returned by this class are logically const. -//! They are snapshots of the database at the time the query was run, and the -//! data returned is liable to change after the query is executed. -//! -//! The lifecycle of a crash report has three stages: -//! -//! 1. New: A crash report is created with PrepareNewCrashReport(), the -//! the client then writes the report, and then calls -//! FinishedWritingCrashReport() to make the report Pending. -//! 2. Pending: The report has been written but has not been locally -//! processed, or it was has been brought back from 'Completed' state by -//! user request. -//! 3. Completed: The report has been locally processed, either by uploading -//! it to a collection server and calling RecordUploadAttempt(), or by -//! calling SkipReportUpload(). -class CrashReportDatabase { - public: - //! \brief A crash report record. - //! - //! This represents the metadata for a crash report, as well as the location - //! of the report itself. A CrashReportDatabase maintains at least this - //! information. - struct Report { - Report(); - - //! A unique identifier by which this report will always be known to the - //! database. - UUID uuid; - - //! The current location of the crash report on the client’s filesystem. - //! The location of a crash report may change over time, so the UUID should - //! be used as the canonical identifier. - base::FilePath file_path; - - //! An identifier issued to this crash report by a collection server. - std::string id; - - //! The time at which the report was generated. - time_t creation_time; - - //! Whether this crash report was successfully uploaded to a collection - //! server. - bool uploaded; - - //! The last timestamp at which an attempt was made to submit this crash - //! report to a collection server. If this is zero, then the report has - //! never been uploaded. If #uploaded is true, then this timestamp is the - //! time at which the report was uploaded, and no other attempts to upload - //! this report will be made. - time_t last_upload_attempt_time; - - //! The number of times an attempt was made to submit this report to - //! a collection server. If this is more than zero, then - //! #last_upload_attempt_time will be set to the timestamp of the most - //! recent attempt. - int upload_attempts; - - //! Whether this crash report was explicitly requested by user to be - //! uploaded. This can be true only if report is in the 'pending' state. - bool upload_explicitly_requested; - }; - - //! \brief A crash report that is in the process of being written. - //! - //! An instance of this struct should be created via PrepareNewCrashReport() - //! and destroyed with FinishedWritingCrashReport(). - struct NewReport { - //! The file handle to which the report should be written. - FileHandle handle; - - //! A unique identifier by which this report will always be known to the - //! database. - UUID uuid; - - //! The path to the crash report being written. - base::FilePath path; - }; - - //! \brief A scoper to cleanly handle the interface requirement imposed by - //! PrepareNewCrashReport(). - //! - //! Calls ErrorWritingCrashReport() upon destruction unless disarmed by - //! calling Disarm(). Armed upon construction. - class CallErrorWritingCrashReport { - public: - //! \brief Arms the object to call ErrorWritingCrashReport() on \a database - //! with an argument of \a new_report on destruction. - CallErrorWritingCrashReport(CrashReportDatabase* database, - NewReport* new_report); - - //! \brief Calls ErrorWritingCrashReport() if the object is armed. - ~CallErrorWritingCrashReport(); - - //! \brief Disarms the object so that CallErrorWritingCrashReport() will not - //! be called upon destruction. - void Disarm(); - - private: - CrashReportDatabase* database_; // weak - NewReport* new_report_; // weak - - DISALLOW_COPY_AND_ASSIGN(CallErrorWritingCrashReport); - }; - - //! \brief The result code for operations performed on a database. - enum OperationStatus { - //! \brief No error occurred. - kNoError = 0, - - //! \brief The report that was requested could not be located. - //! - //! This may occur when the report is present in the database but not in a - //! state appropriate for the requested operation, for example, if - //! GetReportForUploading() is called to obtain report that’s already in the - //! completed state. - kReportNotFound, - - //! \brief An error occured while performing a file operation on a crash - //! report. - //! - //! A database is responsible for managing both the metadata about a report - //! and the actual crash report itself. This error is returned when an - //! error occurred when managing the report file. Additional information - //! will be logged. - kFileSystemError, - - //! \brief An error occured while recording metadata for a crash report or - //! database-wide settings. - //! - //! A database is responsible for managing both the metadata about a report - //! and the actual crash report itself. This error is returned when an - //! error occurred when managing the metadata about a crash report or - //! database-wide settings. Additional information will be logged. - kDatabaseError, - - //! \brief The operation could not be completed because a concurrent - //! operation affecting the report is occurring. - kBusyError, - - //! \brief The report cannot be uploaded by user request as it has already - //! been uploaded. - kCannotRequestUpload, - }; - - virtual ~CrashReportDatabase() {} - - //! \brief Opens a database of crash reports, possibly creating it. - //! - //! \param[in] path A path to the database to be created or opened. If the - //! database does not yet exist, it will be created if possible. Note that - //! for databases implemented as directory structures, existence refers - //! solely to the outermost directory. - //! - //! \return A database object on success, `nullptr` on failure with an error - //! logged. - //! - //! \sa InitializeWithoutCreating - static std::unique_ptr<CrashReportDatabase> Initialize( - const base::FilePath& path); - - //! \brief Opens an existing database of crash reports. - //! - //! \param[in] path A path to the database to be opened. If the database does - //! not yet exist, it will not be created. Note that for databases - //! implemented as directory structures, existence refers solely to the - //! outermost directory. On such databases, as long as the outermost - //! directory is present, this method will create the inner structure. - //! - //! \return A database object on success, `nullptr` on failure with an error - //! logged. - //! - //! \sa Initialize - static std::unique_ptr<CrashReportDatabase> InitializeWithoutCreating( - const base::FilePath& path); - - //! \brief Returns the Settings object for this database. - //! - //! \return A weak pointer to the Settings object, which is owned by the - //! database. - virtual Settings* GetSettings() = 0; - - //! \brief Creates a record of a new crash report. - //! - //! Callers can then write the crash report using the file handle provided. - //! The caller does not own the new crash report record or its file handle, - //! both of which must be explicitly disposed of by calling - //! FinishedWritingCrashReport() or ErrorWritingCrashReport(). - //! - //! To arrange to call ErrorWritingCrashReport() during any early return, use - //! CallErrorWritingCrashReport. - //! - //! \param[out] report A NewReport object containing a file handle to which - //! the crash report data should be written. Only valid if this returns - //! #kNoError. The caller must not delete the NewReport object or close - //! the file handle within. - //! - //! \return The operation status code. - virtual OperationStatus PrepareNewCrashReport(NewReport** report) = 0; - - //! \brief Informs the database that a crash report has been written. - //! - //! After calling this method, the database is permitted to move and rename - //! the file at NewReport::path. - //! - //! \param[in] report A NewReport obtained with PrepareNewCrashReport(). The - //! NewReport object and file handle within will be invalidated as part of - //! this call. - //! \param[out] uuid The UUID of this crash report. - //! - //! \return The operation status code. - virtual OperationStatus FinishedWritingCrashReport(NewReport* report, - UUID* uuid) = 0; - - //! \brief Informs the database that an error occurred while attempting to - //! write a crash report, and that any resources associated with it should - //! be cleaned up. - //! - //! After calling this method, the database is permitted to remove the file at - //! NewReport::path. - //! - //! \param[in] report A NewReport obtained with PrepareNewCrashReport(). The - //! NewReport object and file handle within will be invalidated as part of - //! this call. - //! - //! \return The operation status code. - virtual OperationStatus ErrorWritingCrashReport(NewReport* report) = 0; - - //! \brief Returns the crash report record for the unique identifier. - //! - //! \param[in] uuid The crash report record unique identifier. - //! \param[out] report A crash report record. Only valid if this returns - //! #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus LookUpCrashReport(const UUID& uuid, - Report* report) = 0; - - //! \brief Returns a list of crash report records that have not been uploaded. - //! - //! \param[out] reports A list of crash report record objects. This must be - //! empty on entry. Only valid if this returns #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetPendingReports(std::vector<Report>* reports) = 0; - - //! \brief Returns a list of crash report records that have been completed, - //! either by being uploaded or by skipping upload. - //! - //! \param[out] reports A list of crash report record objects. This must be - //! empty on entry. Only valid if this returns #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetCompletedReports(std::vector<Report>* reports) = 0; - - //! \brief Obtains a report object for uploading to a collection server. - //! - //! The file at Report::file_path should be uploaded by the caller, and then - //! the returned Report object must be disposed of via a call to - //! RecordUploadAttempt(). - //! - //! A subsequent call to this method with the same \a uuid is illegal until - //! RecordUploadAttempt() has been called. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! \param[out] report A crash report record for the report to be uploaded. - //! The caller does not own this object. Only valid if this returns - //! #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetReportForUploading(const UUID& uuid, - const Report** report) = 0; - - //! \brief Adjusts a crash report record’s metadata to account for an upload - //! attempt, and updates the last upload attempt time as returned by - //! Settings::GetLastUploadAttemptTime(). - //! - //! After calling this method, the database is permitted to move and rename - //! the file at Report::file_path. - //! - //! \param[in] report The report object obtained from - //! GetReportForUploading(). This object is invalidated after this call. - //! \param[in] successful Whether the upload attempt was successful. - //! \param[in] id The identifier assigned to this crash report by the - //! collection server. Must be empty if \a successful is `false`; may be - //! empty if it is `true`. - //! - //! \return The operation status code. - virtual OperationStatus RecordUploadAttempt(const Report* report, - bool successful, - const std::string& id) = 0; - - //! \brief Moves a report from the pending state to the completed state, but - //! without the report being uploaded. - //! - //! This can be used if the user has disabled crash report collection, but - //! crash generation is still enabled in the product. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! \param[in] reason The reason the report upload is being skipped for - //! metrics tracking purposes. - //! - //! \return The operation status code. - virtual OperationStatus SkipReportUpload( - const UUID& uuid, - Metrics::CrashSkippedReason reason) = 0; - - //! \brief Deletes a crash report file and its associated metadata. - //! - //! \param[in] uuid The UUID of the report to delete. - //! - //! \return The operation status code. - virtual OperationStatus DeleteReport(const UUID& uuid) = 0; - - //! \brief Marks a crash report as explicitly requested to be uploaded by the - //! user and moves it to 'pending' state. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! - //! \return The operation status code. - virtual OperationStatus RequestUpload(const UUID& uuid) = 0; - - protected: - CrashReportDatabase() {} - - private: - DISALLOW_COPY_AND_ASSIGN(CrashReportDatabase); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ diff --git a/Tools/Crashpad/include/client/crashpad_client.h b/Tools/Crashpad/include/client/crashpad_client.h deleted file mode 100644 index c452cdbb68..0000000000 --- a/Tools/Crashpad/include/client/crashpad_client.h +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ -#define CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ - -#include <map> -#include <string> -#include <vector> - -#include <stdint.h> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include "base/mac/scoped_mach_port.h" -#elif defined(OS_WIN) -#include <windows.h> -#include "util/win/scoped_handle.h" -#endif - -namespace crashpad { - -//! \brief The primary interface for an application to have Crashpad monitor -//! it for crashes. -class CrashpadClient { - public: - CrashpadClient(); - ~CrashpadClient(); - - //! \brief Starts a Crashpad handler process, performing any necessary - //! handshake to configure it. - //! - //! This method directs crashes to the Crashpad handler. On macOS, this is - //! applicable to this process and all subsequent child processes. On Windows, - //! child processes must also register by using SetHandlerIPCPipe(). - //! - //! On macOS, this method starts a Crashpad handler and obtains a Mach send - //! right corresponding to a receive right held by the handler process. The - //! handler process runs an exception server on this port. This method sets - //! the task’s exception port for `EXC_CRASH`, `EXC_RESOURCE`, and `EXC_GUARD` - //! exceptions to the Mach send right obtained. The handler will be installed - //! with behavior `EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES` and thread - //! state flavor `MACHINE_THREAD_STATE`. Exception ports are inherited, so a - //! Crashpad handler started here will remain the handler for any child - //! processes created after StartHandler() is called. These child processes do - //! not need to call StartHandler() or be aware of Crashpad in any way. The - //! Crashpad handler will receive crashes from child processes that have - //! inherited it as their exception handler even after the process that called - //! StartHandler() exits. - //! - //! On Windows, if \a asynchronous_start is `true`, this function will not - //! directly call `CreateProcess()`, making it suitable for use in a - //! `DllMain()`. In that case, the handler is started from a background - //! thread, deferring the handler's startup. Nevertheless, regardless of the - //! value of \a asynchronous_start, after calling this method, the global - //! unhandled exception filter is set up, and all crashes will be handled by - //! Crashpad. Optionally, use WaitForHandlerStart() to join with the - //! background thread and retrieve the status of handler startup. - //! - //! \param[in] handler The path to a Crashpad handler executable. - //! \param[in] database The path to a Crashpad database. The handler will be - //! started with this path as its `--database` argument. - //! \param[in] metrics_dir The path to an already existing directory where - //! metrics files can be stored. The handler will be started with this - //! path as its `--metrics-dir` argument. - //! \param[in] url The URL of an upload server. The handler will be started - //! with this URL as its `--url` argument. - //! \param[in] annotations Process annotations to set in each crash report. - //! The handler will be started with an `--annotation` argument for each - //! element in this map. - //! \param[in] arguments Additional arguments to pass to the Crashpad handler. - //! Arguments passed in other parameters and arguments required to perform - //! the handshake are the responsibility of this method, and must not be - //! specified in this parameter. - //! \param[in] restartable If `true`, the handler will be restarted if it - //! dies, if this behavior is supported. This option is not available on - //! all platforms, and does not function on all OS versions. If it is - //! not supported, it will be ignored. - //! \param[out] asynchronous_start If `true`, the handler will be started from - //! a background thread. Optionally, WaitForHandlerStart() can be used at - //! a suitable time to retreive the result of background startup. This - //! option is only used on Windows. - //! \param[in] attachments Vector that stores file paths that should be - //! captured with each report at the time of the crash. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool StartHandler(const base::FilePath& handler, - const base::FilePath& database, - const base::FilePath& metrics_dir, - const std::string& url, - const std::map<std::string, std::string>& annotations, - const std::vector<std::string>& arguments, - bool restartable, - bool asynchronous_start, - const std::vector<base::FilePath>& attachments = {}); - -#if defined(OS_MACOSX) || DOXYGEN - //! \brief Sets the process’ crash handler to a Mach service registered with - //! the bootstrap server. - //! - //! This method is only defined on macOS. - //! - //! See StartHandler() for more detail on how the port and handler are - //! configured. - //! - //! \param[in] service_name The service name of a Crashpad exception handler - //! service previously registered with the bootstrap server. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool SetHandlerMachService(const std::string& service_name); - - //! \brief Sets the process’ crash handler to a Mach port. - //! - //! This method is only defined on macOS. - //! - //! See StartHandler() for more detail on how the port and handler are - //! configured. - //! - //! \param[in] exception_port An `exception_port_t` corresponding to a - //! Crashpad exception handler service. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool SetHandlerMachPort(base::mac::ScopedMachSendRight exception_port); - - //! \brief Retrieves a send right to the process’ crash handler Mach port. - //! - //! This method is only defined on macOS. - //! - //! This method can be used to obtain the crash handler Mach port when a - //! Crashpad client process wishes to provide a send right to this port to - //! another process. The IPC mechanism used to convey the right is under the - //! application’s control. If the other process wishes to become a client of - //! the same crash handler, it can provide the transferred right to - //! SetHandlerMachPort(). - //! - //! See StartHandler() for more detail on how the port and handler are - //! configured. - //! - //! \return The Mach port set by SetHandlerMachPort(), possibly indirectly by - //! a call to another method such as StartHandler() or - //! SetHandlerMachService(). This method must only be called after a - //! successful call to one of those methods. `MACH_PORT_NULL` on failure - //! with a message logged. - base::mac::ScopedMachSendRight GetHandlerMachPort() const; -#endif - -#if defined(OS_WIN) || DOXYGEN - //! \brief Sets the IPC pipe of a presumably-running Crashpad handler process - //! which was started with StartHandler() or by other compatible means - //! and does an IPC message exchange to register this process with the - //! handler. Crashes will be serviced once this method returns. - //! - //! This method is only defined on Windows. - //! - //! This method sets the unhandled exception handler to a local - //! function that when reached will "signal and wait" for the crash handler - //! process to create the dump. - //! - //! \param[in] ipc_pipe The full name of the crash handler IPC pipe. This is - //! a string of the form `"\\.\pipe\NAME"`. - //! - //! \return `true` on success and `false` on failure. - bool SetHandlerIPCPipe(const std::wstring& ipc_pipe); - - //! \brief Retrieves the IPC pipe name used to register with the Crashpad - //! handler. - //! - //! This method is only defined on Windows. - //! - //! This method retrieves the IPC pipe name set by SetHandlerIPCPipe(), or a - //! suitable IPC pipe name chosen by StartHandler(). It must only be called - //! after a successful call to one of those methods. It is intended to be used - //! to obtain the IPC pipe name so that it may be passed to other processes, - //! so that they may register with an existing Crashpad handler by calling - //! SetHandlerIPCPipe(). - //! - //! \return The full name of the crash handler IPC pipe, a string of the form - //! `"\\.\pipe\NAME"`. - std::wstring GetHandlerIPCPipe() const; - - //! \brief When `asynchronous_start` is used with StartHandler(), this method - //! can be used to block until the handler launch has been completed to - //! retrieve status information. - //! - //! This method should not be used unless `asynchronous_start` was `true`. - //! - //! \param[in] timeout_ms The number of milliseconds to wait for a result from - //! the background launch, or `0xffffffff` to block indefinitely. - //! - //! \return `true` if the hander startup succeeded, `false` otherwise, and an - //! error message will have been logged. - bool WaitForHandlerStart(unsigned int timeout_ms); - - //! \brief Requests that the handler capture a dump even though there hasn't - //! been a crash. - //! - //! \param[in] context A `CONTEXT`, generally captured by CaptureContext() or - //! similar. - static void DumpWithoutCrash(const CONTEXT& context); - - //! \brief Requests that the handler capture a dump using the given \a - //! exception_pointers to get the `EXCEPTION_RECORD` and `CONTEXT`. - //! - //! This function is not necessary in general usage as an unhandled exception - //! filter is installed by StartHandler() or SetHandlerIPCPipe(). - //! - //! \param[in] exception_pointers An `EXCEPTION_POINTERS`, as would generally - //! passed to an unhandled exception filter. - static void DumpAndCrash(EXCEPTION_POINTERS* exception_pointers); - - //! \brief Requests that the handler capture a dump of a different process. - //! - //! The target process must be an already-registered Crashpad client. An - //! exception will be triggered in the target process, and the regular dump - //! mechanism used. This function will block until the exception in the target - //! process has been handled by the Crashpad handler. - //! - //! This function is unavailable when running on Windows XP and will return - //! `false`. - //! - //! \param[in] process A `HANDLE` identifying the process to be dumped. - //! \param[in] blame_thread If non-null, a `HANDLE` valid in the caller's - //! process, referring to a thread in the target process. If this is - //! supplied, instead of the exception referring to the location where the - //! exception was injected, an exception record will be fabricated that - //! refers to the current location of the given thread. - //! \param[in] exception_code If \a blame_thread is non-null, this will be - //! used as the exception code in the exception record. - //! - //! \return `true` if the exception was triggered successfully. - bool DumpAndCrashTargetProcess(HANDLE process, - HANDLE blame_thread, - DWORD exception_code) const; - - enum : uint32_t { - //! \brief The exception code (roughly "Client called") used when - //! DumpAndCrashTargetProcess() triggers an exception in a target - //! process. - //! - //! \note This value does not have any bits of the top nibble set, to avoid - //! confusion with real exception codes which tend to have those bits - //! set. - kTriggeredExceptionCode = 0xcca11ed, - }; -#endif - -#if defined(OS_MACOSX) || DOXYGEN - //! \brief Configures the process to direct its crashes to the default handler - //! for the operating system. - //! - //! On macOS, this sets the task’s exception port as in SetHandlerMachPort(), - //! but the exception handler used is obtained from - //! SystemCrashReporterHandler(). If the system’s crash reporter handler - //! cannot be determined or set, the task’s exception ports for crash-type - //! exceptions are cleared. - //! - //! Use of this function is strongly discouraged. - //! - //! \warning After a call to this function, Crashpad will no longer monitor - //! the process for crashes until a subsequent call to - //! SetHandlerMachPort(). - //! - //! \note This is provided as a static function to allow it to be used in - //! situations where a CrashpadClient object is not otherwise available. - //! This may be useful when a child process inherits its parent’s Crashpad - //! handler, but wants to sever this tie. - static void UseSystemDefaultHandler(); -#endif - - private: -#if defined(OS_MACOSX) - base::mac::ScopedMachSendRight exception_port_; -#elif defined(OS_WIN) - std::wstring ipc_pipe_; - ScopedKernelHANDLE handler_start_thread_; -#endif // OS_MACOSX - - DISALLOW_COPY_AND_ASSIGN(CrashpadClient); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ diff --git a/Tools/Crashpad/include/client/crashpad_info.h b/Tools/Crashpad/include/client/crashpad_info.h deleted file mode 100644 index 5db9a6cdff..0000000000 --- a/Tools/Crashpad/include/client/crashpad_info.h +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CRASHPAD_INFO_H_ -#define CRASHPAD_CLIENT_CRASHPAD_INFO_H_ - -#include <stdint.h> - -#include "base/macros.h" -#include "build/build_config.h" -#include "client/annotation_list.h" -#include "client/simple_address_range_bag.h" -#include "client/simple_string_dictionary.h" -#include "util/misc/tri_state.h" - -#if defined(OS_WIN) -#include <windows.h> -#endif // OS_WIN - -namespace crashpad { - -namespace internal { - -//! \brief A linked list of blocks representing custom streams in the minidump, -//! with addresses (and size) stored as uint64_t to simplify reading from -//! the handler process. -struct UserDataMinidumpStreamListEntry { - //! \brief The address of the next entry in the linked list. - uint64_t next; - - //! \brief The base address of the memory block in the target process' address - //! space that represents the user data stream. - uint64_t base_address; - - //! \brief The size of memory block in the target process' address space that - //! represents the user data stream. - uint64_t size; - - //! \brief The stream type identifier. - uint32_t stream_type; -}; - -} // namespace internal - -//! \brief A structure that can be used by a Crashpad-enabled program to -//! provide information to the Crashpad crash handler. -//! -//! It is possible for one CrashpadInfo structure to appear in each loaded code -//! module in a process, but from the perspective of the user of the client -//! interface, there is only one global CrashpadInfo structure, located in the -//! module that contains the client interface code. -struct CrashpadInfo { - public: - //! \brief Returns the global CrashpadInfo structure. - static CrashpadInfo* GetCrashpadInfo(); - - CrashpadInfo(); - - //! \brief Sets the bag of extra memory ranges to be included in the snapshot. - //! - //! Extra memory ranges may exist in \a address_range_bag at the time that - //! this method is called, or they may be added, removed, or modified in \a - //! address_range_bag after this method is called. - //! - //! TODO(scottmg) This is currently only supported on Windows. - //! - //! \param[in] address_range_bag A bag of address ranges. The CrashpadInfo - //! object does not take ownership of the SimpleAddressRangeBag object. - //! It is the caller’s responsibility to ensure that this pointer remains - //! valid while it is in effect for a CrashpadInfo object. - void set_extra_memory_ranges(SimpleAddressRangeBag* address_range_bag) { - extra_memory_ranges_ = address_range_bag; - } - - //! \brief Sets the simple annotations dictionary. - //! - //! Simple annotations set on a CrashpadInfo structure are interpreted by - //! Crashpad as module-level annotations. - //! - //! Annotations may exist in \a simple_annotations at the time that this - //! method is called, or they may be added, removed, or modified in \a - //! simple_annotations after this method is called. - //! - //! \param[in] simple_annotations A dictionary that maps string keys to string - //! values. The CrashpadInfo object does not take ownership of the - //! SimpleStringDictionary object. It is the caller’s responsibility to - //! ensure that this pointer remains valid while it is in effect for a - //! CrashpadInfo object. - //! - //! \sa simple_annotations() - void set_simple_annotations(SimpleStringDictionary* simple_annotations) { - simple_annotations_ = simple_annotations; - } - - //! \return The simple annotations dictionary. - //! - //! \sa set_simple_annotations() - SimpleStringDictionary* simple_annotations() const { - return simple_annotations_; - } - - //! \brief Sets the annotations list. - //! - //! Unlike the \a simple_annotations structure, the \a annotations can - //! typed data and it is not limited to a dictionary form. Annotations are - //! interpreted by Crashpad as module-level annotations. - //! - //! Annotations may exist in \a list at the time that this method is called, - //! or they may be added, removed, or modified in \a list after this method is - //! called. - //! - //! \param[in] list A list of set Annotation objects that maintain arbitrary, - //! typed key-value state. The CrashpadInfo object does not take ownership - //! of the AnnotationsList object. It is the caller’s responsibility to - //! ensure that this pointer remains valid while it is in effect for a - //! CrashpadInfo object. - //! - //! \sa annotations_list() - //! \sa AnnotationList::Register() - void set_annotations_list(AnnotationList* list) { annotations_list_ = list; } - - //! \return The annotations list. - //! - //! \sa set_annotations_list() - //! \sa AnnotationList::Get() - //! \sa AnnotationList::Register() - AnnotationList* annotations_list() const { return annotations_list_; } - - //! \brief Enables or disables Crashpad handler processing. - //! - //! When handling an exception, the Crashpad handler will scan all modules in - //! a process. The first one that has a CrashpadInfo structure populated with - //! a value other than #kUnset for this field will dictate whether the handler - //! is functional or not. If all modules with a CrashpadInfo structure specify - //! #kUnset, the handler will be enabled. If disabled, the Crashpad handler - //! will still run and receive exceptions, but will not take any action on an - //! exception on its own behalf, except for the action necessary to determine - //! that it has been disabled. - //! - //! The Crashpad handler should not normally be disabled. More commonly, it - //! is appropriate to disable crash report upload by calling - //! Settings::SetUploadsEnabled(). - void set_crashpad_handler_behavior(TriState crashpad_handler_behavior) { - crashpad_handler_behavior_ = crashpad_handler_behavior; - } - - //! \brief Enables or disables Crashpad forwarding of exceptions to the - //! system’s crash reporter. - //! - //! When handling an exception, the Crashpad handler will scan all modules in - //! a process. The first one that has a CrashpadInfo structure populated with - //! a value other than #kUnset for this field will dictate whether the - //! exception is forwarded to the system’s crash reporter. If all modules with - //! a CrashpadInfo structure specify #kUnset, forwarding will be enabled. - //! Unless disabled, forwarding may still occur if the Crashpad handler is - //! disabled by SetCrashpadHandlerState(). Even when forwarding is enabled, - //! the Crashpad handler may choose not to forward all exceptions to the - //! system’s crash reporter in cases where it has reason to believe that the - //! system’s crash reporter would not normally have handled the exception in - //! Crashpad’s absence. - void set_system_crash_reporter_forwarding( - TriState system_crash_reporter_forwarding) { - system_crash_reporter_forwarding_ = system_crash_reporter_forwarding; - } - - //! \brief Enables or disables Crashpad capturing indirectly referenced memory - //! in the minidump. - //! - //! When handling an exception, the Crashpad handler will scan all modules in - //! a process. The first one that has a CrashpadInfo structure populated with - //! a value other than #kUnset for this field will dictate whether the extra - //! memory is captured. - //! - //! This causes Crashpad to include pages of data referenced by locals or - //! other stack memory. Turning this on can increase the size of the minidump - //! significantly. - //! - //! \param[in] gather_indirectly_referenced_memory Whether extra memory should - //! be gathered. - //! \param[in] limit The amount of memory in bytes after which no more - //! indirectly gathered memory should be captured. This value is only used - //! when \a gather_indirectly_referenced_memory is TriState::kEnabled. - void set_gather_indirectly_referenced_memory( - TriState gather_indirectly_referenced_memory, - uint32_t limit) { - gather_indirectly_referenced_memory_ = gather_indirectly_referenced_memory; - indirectly_referenced_memory_cap_ = limit; - } - - //! \brief Adds a custom stream to the minidump. - //! - //! The memory block referenced by \a data and \a size will added to the - //! minidump as separate stream with type \a stream_type. The memory referred - //! to by \a data and \a size is owned by the caller and must remain valid - //! while it is in effect for the CrashpadInfo object. - //! - //! Note that streams will appear in the minidump in the reverse order to - //! which they are added. - //! - //! TODO(scottmg) This is currently only supported on Windows. - //! - //! \param[in] stream_type The stream type identifier to use. This should be - //! normally be larger than `MINIDUMP_STREAM_TYPE::LastReservedStream` - //! which is `0xffff`. - //! \param[in] data The base pointer of the stream data. - //! \param[in] size The size of the stream data. - void AddUserDataMinidumpStream(uint32_t stream_type, - const void* data, - size_t size); - - enum : uint32_t { - kSignature = 'CPad', - }; - - private: - // The compiler won’t necessarily see anyone using these fields, but it - // shouldn’t warn about that. These fields aren’t intended for use by the - // process they’re found in, they’re supposed to be read by the crash - // reporting process. -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-private-field" -#endif - - // Fields present in version 1, subject to a check of the size_ field: - uint32_t signature_; // kSignature - uint32_t size_; // The size of the entire CrashpadInfo structure. - uint32_t version_; // kCrashpadInfoVersion - uint32_t indirectly_referenced_memory_cap_; - uint32_t padding_0_; - TriState crashpad_handler_behavior_; - TriState system_crash_reporter_forwarding_; - TriState gather_indirectly_referenced_memory_; - uint8_t padding_1_; - SimpleAddressRangeBag* extra_memory_ranges_; // weak - SimpleStringDictionary* simple_annotations_; // weak - internal::UserDataMinidumpStreamListEntry* user_data_minidump_stream_head_; - AnnotationList* annotations_list_; // weak - - // It’s generally safe to add new fields without changing - // kCrashpadInfoVersion, because readers should check size_ and ignore fields - // that aren’t present, as well as unknown fields. - // - // Adding fields? Consider snapshot/crashpad_info_size_test_module.cc too. - -#if defined(__clang__) -#pragma clang diagnostic pop -#endif - - DISALLOW_COPY_AND_ASSIGN(CrashpadInfo); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CRASHPAD_INFO_H_ diff --git a/Tools/Crashpad/include/client/prune_crash_reports.h b/Tools/Crashpad/include/client/prune_crash_reports.h deleted file mode 100644 index 6dac5f3002..0000000000 --- a/Tools/Crashpad/include/client/prune_crash_reports.h +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_PRUNE_CRASH_REPORTS_H_ -#define CRASHPAD_CLIENT_PRUNE_CRASH_REPORTS_H_ - -#include <sys/types.h> -#include <time.h> - -#include <memory> - -#include "base/macros.h" -#include "client/crash_report_database.h" - -namespace crashpad { - -class PruneCondition; - -//! \brief Deletes crash reports from \a database that match \a condition. -//! -//! This function can be used to remove old or large reports from the database. -//! The \a condition will be evaluated against each report in the \a database, -//! sorted in descending order by CrashReportDatabase::Report::creation_time. -//! This guarantee allows conditions to be stateful. -//! -//! \param[in] database The database from which crash reports will be deleted. -//! \param[in] condition The condition against which all reports in the database -//! will be evaluated. -void PruneCrashReportDatabase(CrashReportDatabase* database, - PruneCondition* condition); - -std::unique_ptr<PruneCondition> GetDefaultDatabasePruneCondition(); - -//! \brief An abstract base class for evaluating crash reports for deletion. -//! -//! When passed to PruneCrashReportDatabase(), each crash report in the -//! database will be evaluated according to ShouldPruneReport(). The reports -//! are evaluated serially in descending sort order by -//! CrashReportDatabase::Report::creation_time. -class PruneCondition { - public: - //! \brief Returns a sensible default condition for removing obsolete crash - //! reports. - //! - //! The default is to keep reports for one year or a maximum database size - //! of 128 MB. - //! - //! \return A PruneCondition for use with PruneCrashReportDatabase(). - static std::unique_ptr<PruneCondition> GetDefault(); - - virtual ~PruneCondition() {} - - //! \brief Evaluates a crash report for deletion. - //! - //! \param[in] report The crash report to evaluate. - //! - //! \return `true` if the crash report should be deleted, `false` if it - //! should be kept. - virtual bool ShouldPruneReport(const CrashReportDatabase::Report& report) = 0; -}; - -//! \brief A PruneCondition that deletes reports older than the specified number -//! days. -class AgePruneCondition final : public PruneCondition { - public: - //! \brief Creates a PruneCondition based on Report::creation_time. - //! - //! \param[in] max_age_in_days Reports created more than this many days ago - //! will be deleted. - explicit AgePruneCondition(int max_age_in_days); - ~AgePruneCondition(); - - bool ShouldPruneReport(const CrashReportDatabase::Report& report) override; - - private: - const time_t oldest_report_time_; - - DISALLOW_COPY_AND_ASSIGN(AgePruneCondition); -}; - -//! \brief A PruneCondition that deletes older reports to keep the total -//! Crashpad database size under the specified limit. -class DatabaseSizePruneCondition final : public PruneCondition { - public: - //! \brief Creates a PruneCondition that will keep newer reports, until the - //! sum of the size of all reports is not smaller than \a max_size_in_kb. - //! After the limit is reached, older reports will be pruned. - //! - //! \param[in] max_size_in_kb The maximum number of kilobytes that all crash - //! reports should consume. - explicit DatabaseSizePruneCondition(size_t max_size_in_kb); - ~DatabaseSizePruneCondition(); - - bool ShouldPruneReport(const CrashReportDatabase::Report& report) override; - - private: - const size_t max_size_in_kb_; - size_t measured_size_in_kb_; - - DISALLOW_COPY_AND_ASSIGN(DatabaseSizePruneCondition); -}; - -//! \brief A PruneCondition that conjoins two other PruneConditions. -class BinaryPruneCondition final : public PruneCondition { - public: - enum Operator { - AND, - OR, - }; - - //! \brief Evaluates two sub-conditions according to the specified logical - //! operator. - //! - //! This implements left-to-right evaluation. For Operator::AND, this means - //! if the \a lhs is `false`, the \a rhs will not be consulted. Similarly, - //! with Operator::OR, if the \a lhs is `true`, the \a rhs will not be - //! consulted. - //! - //! \param[in] op The logical operator to apply on \a lhs and \a rhs. - //! \param[in] lhs The left-hand side of \a op. This class takes ownership. - //! \param[in] rhs The right-hand side of \a op. This class takes ownership. - BinaryPruneCondition(Operator op, PruneCondition* lhs, PruneCondition* rhs); - ~BinaryPruneCondition(); - - bool ShouldPruneReport(const CrashReportDatabase::Report& report) override; - - private: - const Operator op_; - std::unique_ptr<PruneCondition> lhs_; - std::unique_ptr<PruneCondition> rhs_; - - DISALLOW_COPY_AND_ASSIGN(BinaryPruneCondition); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_PRUNE_CRASH_REPORTS_H_ diff --git a/Tools/Crashpad/include/client/settings.h b/Tools/Crashpad/include/client/settings.h deleted file mode 100644 index b64f74fbaf..0000000000 --- a/Tools/Crashpad/include/client/settings.h +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SETTINGS_H_ -#define CRASHPAD_CLIENT_SETTINGS_H_ - -#include <time.h> - -#include <string> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/scoped_generic.h" -#include "util/file/file_io.h" -#include "util/misc/initialization_state.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -namespace internal { - -struct ScopedLockedFileHandleTraits { - static FileHandle InvalidValue() { return kInvalidFileHandle; } - static void Free(FileHandle handle); -}; - -} // namespace internal - -//! \brief An interface for accessing and modifying the settings of a -//! CrashReportDatabase. -//! -//! This class must not be instantiated directly, but rather an instance of it -//! should be retrieved via CrashReportDatabase::GetSettings(). -class Settings { - public: - explicit Settings(const base::FilePath& file_path); - ~Settings(); - - bool Initialize(); - - //! \brief Retrieves the immutable identifier for this client, which is used - //! on a server to locate all crash reports from a specific Crashpad - //! database. - //! - //! This is automatically initialized when the database is created. - //! - //! \param[out] client_id The unique client identifier. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetClientID(UUID* client_id); - - //! \brief Retrieves the user’s preference for submitting crash reports to a - //! collection server. - //! - //! The default value is `false`. - //! - //! \param[out] enabled Whether crash reports should be uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetUploadsEnabled(bool* enabled); - - //! \brief Sets the user’s preference for submitting crash reports to a - //! collection server. - //! - //! \param[in] enabled Whether crash reports should be uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool SetUploadsEnabled(bool enabled); - - //! \brief Retrieves the last time at which a report was attempted to be - //! uploaded. - //! - //! The default value is `0` if it has never been set before. - //! - //! \param[out] time The last time at which a report was uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetLastUploadAttemptTime(time_t* time); - - //! \brief Sets the last time at which a report was attempted to be uploaded. - //! - //! This is only meant to be used internally by the CrashReportDatabase. - //! - //! \param[in] time The last time at which a report was uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool SetLastUploadAttemptTime(time_t time); - - private: - struct Data; - - // This must be constructed with MakeScopedLockedFileHandle(). It both unlocks - // and closes the file on destruction. - using ScopedLockedFileHandle = - base::ScopedGeneric<FileHandle, internal::ScopedLockedFileHandleTraits>; - static ScopedLockedFileHandle MakeScopedLockedFileHandle(FileHandle file, - FileLocking locking); - - // Opens the settings file for reading. On error, logs a message and returns - // the invalid handle. - ScopedLockedFileHandle OpenForReading(); - - // Opens the settings file for reading and writing. On error, logs a message - // and returns the invalid handle. |mode| determines how the file will be - // opened. |mode| must not be FileWriteMode::kTruncateOrCreate. - // - // If |log_open_error| is false, nothing will be logged for an error - // encountered when attempting to open the file, but this method will still - // return false. This is intended to be used to suppress error messages when - // attempting to create a new settings file when multiple attempts are made. - ScopedLockedFileHandle OpenForReadingAndWriting(FileWriteMode mode, - bool log_open_error); - - // Opens the settings file and reads the data. If that fails, an error will - // be logged and the settings will be recovered and re-initialized. If that - // also fails, returns false with additional log data from recovery. - bool OpenAndReadSettings(Data* out_data); - - // Opens the settings file for writing and reads the data. If reading fails, - // recovery is attempted. Returns the opened file handle on success, or the - // invalid file handle on failure, with an error logged. - ScopedLockedFileHandle OpenForWritingAndReadSettings(Data* out_data); - - // Reads the settings from |handle|. Logs an error and returns false on - // failure. This does not perform recovery. - // - // |handle| must be the result of OpenForReading() or - // OpenForReadingAndWriting(). - // - // If |log_read_error| is false, nothing will be logged for a read error, but - // this method will still return false. This is intended to be used to - // suppress error messages when attempting to read a newly created settings - // file. - bool ReadSettings(FileHandle handle, Data* out_data, bool log_read_error); - - // Writes the settings to |handle|. Logs an error and returns false on - // failure. This does not perform recovery. - // - // |handle| must be the result of OpenForReadingAndWriting(). - bool WriteSettings(FileHandle handle, const Data& data); - - // Recovers the settings file by re-initializing the data. If |handle| is the - // invalid handle, this will open the file; if it is not, then it must be the - // result of OpenForReadingAndWriting(). If the invalid handle is passed, the - // caller must not be holding the handle. The new settings data are stored in - // |out_data|. Returns true on success and false on failure, with an error - // logged. - bool RecoverSettings(FileHandle handle, Data* out_data); - - // Initializes a settings file and writes the data to |handle|. Returns true - // on success and false on failure, with an error logged. - // - // |handle| must be the result of OpenForReadingAndWriting(). - bool InitializeSettings(FileHandle handle); - - const base::FilePath& file_path() const { return file_path_; } - - base::FilePath file_path_; - - InitializationState initialized_; - - DISALLOW_COPY_AND_ASSIGN(Settings); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_SETTINGS_H_ diff --git a/Tools/Crashpad/include/client/simple_address_range_bag.h b/Tools/Crashpad/include/client/simple_address_range_bag.h deleted file mode 100644 index c69fa5afd8..0000000000 --- a/Tools/Crashpad/include/client/simple_address_range_bag.h +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SIMPLE_ADDRESS_RANGE_BAG_H_ -#define CRASHPAD_CLIENT_SIMPLE_ADDRESS_RANGE_BAG_H_ - -#include <stdint.h> - -#include <type_traits> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/numerics/safe_conversions.h" -#include "util/misc/from_pointer_cast.h" -#include "util/numeric/checked_range.h" - -namespace crashpad { - -//! \brief A bag implementation using a fixed amount of storage, so that it does -//! not perform any dynamic allocations for its operations. -//! -//! The actual bag storage (TSimpleAddressRangeBag::Entry) is POD, so that it -//! can be transmitted over various IPC mechanisms. -template <size_t NumEntries = 64> -class TSimpleAddressRangeBag { - public: - //! Constant and publicly accessible version of the template parameter. - static const size_t num_entries = NumEntries; - - //! \brief A single entry in the bag. - struct Entry { - //! \brief The base address of the range. - uint64_t base; - - //! \brief The size of the range in bytes. - uint64_t size; - - //! \brief Returns the validity of the entry. - //! - //! If #base and #size are both zero, the entry is considered inactive, and - //! this method returns `false`. Otherwise, returns `true`. - bool is_active() const { - return base != 0 || size != 0; - } - }; - - //! \brief An iterator to traverse all of the active entries in a - //! TSimpleAddressRangeBag. - class Iterator { - public: - explicit Iterator(const TSimpleAddressRangeBag& bag) - : bag_(bag), - current_(0) { - } - - //! \brief Returns the next entry in the bag, or `nullptr` if at the end of - //! the collection. - const Entry* Next() { - while (current_ < bag_.num_entries) { - const Entry* entry = &bag_.entries_[current_++]; - if (entry->is_active()) { - return entry; - } - } - return nullptr; - } - - private: - const TSimpleAddressRangeBag& bag_; - size_t current_; - - DISALLOW_COPY_AND_ASSIGN(Iterator); - }; - - TSimpleAddressRangeBag() - : entries_() { - } - - TSimpleAddressRangeBag(const TSimpleAddressRangeBag& other) { - *this = other; - } - - TSimpleAddressRangeBag& operator=(const TSimpleAddressRangeBag& other) { - memcpy(entries_, other.entries_, sizeof(entries_)); - return *this; - } - - //! \brief Returns the number of active entries. The upper limit for this is - //! \a NumEntries. - size_t GetCount() const { - size_t count = 0; - for (size_t i = 0; i < num_entries; ++i) { - if (entries_[i].is_active()) { - ++count; - } - } - return count; - } - - //! \brief Inserts the given range into the bag. Duplicates and overlapping - //! ranges are supported and allowed, but not coalesced. - //! - //! \param[in] range The range to be inserted. The range must have either a - //! non-zero base address or size. - //! - //! \return `true` if there was space to insert the range into the bag, - //! otherwise `false` with an error logged. - bool Insert(CheckedRange<uint64_t> range) { - DCHECK(range.base() != 0 || range.size() != 0); - - for (size_t i = 0; i < num_entries; ++i) { - if (!entries_[i].is_active()) { - entries_[i].base = range.base(); - entries_[i].size = range.size(); - return true; - } - } - - LOG(ERROR) << "no space available to insert range"; - return false; - } - - //! \brief Inserts the given range into the bag. Duplicates and overlapping - //! ranges are supported and allowed, but not coalesced. - //! - //! \param[in] base The base of the range to be inserted. May not be null. - //! \param[in] size The size of the range to be inserted. May not be zero. - //! - //! \return `true` if there was space to insert the range into the bag, - //! otherwise `false` with an error logged. - bool Insert(void* base, size_t size) { - DCHECK(base != nullptr); - DCHECK_NE(0u, size); - return Insert(CheckedRange<uint64_t>(FromPointerCast<uint64_t>(base), - base::checked_cast<uint64_t>(size))); - } - - //! \brief Removes the given range from the bag. - //! - //! \param[in] range The range to be removed. The range must have either a - //! non-zero base address or size. - //! - //! \return `true` if the range was found and removed, otherwise `false` with - //! an error logged. - bool Remove(CheckedRange<uint64_t> range) { - DCHECK(range.base() != 0 || range.size() != 0); - - for (size_t i = 0; i < num_entries; ++i) { - if (entries_[i].base == range.base() && - entries_[i].size == range.size()) { - entries_[i].base = entries_[i].size = 0; - return true; - } - } - - LOG(ERROR) << "did not find range to remove"; - return false; - } - - //! \brief Removes the given range from the bag. - //! - //! \param[in] base The base of the range to be removed. May not be null. - //! \param[in] size The size of the range to be removed. May not be zero. - //! - //! \return `true` if the range was found and removed, otherwise `false` with - //! an error logged. - bool Remove(void* base, size_t size) { - DCHECK(base != nullptr); - DCHECK_NE(0u, size); - return Remove(CheckedRange<uint64_t>(FromPointerCast<uint64_t>(base), - base::checked_cast<uint64_t>(size))); - } - - - private: - Entry entries_[NumEntries]; -}; - -//! \brief A TSimpleAddressRangeBag with default template parameters. -using SimpleAddressRangeBag = TSimpleAddressRangeBag<64>; - -static_assert(std::is_standard_layout<SimpleAddressRangeBag>::value, - "SimpleAddressRangeBag must be standard layout"); - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_SIMPLE_ADDRESS_RANGE_BAG_H_ diff --git a/Tools/Crashpad/include/client/simple_string_dictionary.h b/Tools/Crashpad/include/client/simple_string_dictionary.h deleted file mode 100644 index 0e97736163..0000000000 --- a/Tools/Crashpad/include/client/simple_string_dictionary.h +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SIMPLE_STRING_DICTIONARY_H_ -#define CRASHPAD_CLIENT_SIMPLE_STRING_DICTIONARY_H_ - -#include <string.h> -#include <sys/types.h> - -#include <algorithm> -#include <type_traits> - -#include "base/logging.h" -#include "base/macros.h" -#include "base/strings/string_piece.h" -#include "util/misc/implicit_cast.h" - -namespace crashpad { - -//! \brief A map/dictionary collection implementation using a fixed amount of -//! storage, so that it does not perform any dynamic allocations for its -//! operations. -//! -//! The actual map storage (TSimpleStringDictionary::Entry) is guaranteed to be -//! POD, so that it can be transmitted over various IPC mechanisms. -//! -//! The template parameters control the amount of storage used for the key, -//! value, and map. The \a KeySize and \a ValueSize are measured in bytes, not -//! glyphs, and include space for a trailing `NUL` byte. This gives space for -//! `KeySize - 1` and `ValueSize - 1` characters in an entry. \a NumEntries is -//! the total number of entries that will fit in the map. -template <size_t KeySize = 256, size_t ValueSize = 256, size_t NumEntries = 64> -class TSimpleStringDictionary { - public: - //! \brief Constant and publicly accessible versions of the template - //! parameters. - //! \{ - static const size_t key_size = KeySize; - static const size_t value_size = ValueSize; - static const size_t num_entries = NumEntries; - //! \} - - //! \brief A single entry in the map. - struct Entry { - //! \brief The entry’s key. - //! - //! This string is always `NUL`-terminated. If this is a 0-length - //! `NUL`-terminated string, the entry is inactive. - char key[KeySize]; - - //! \brief The entry’s value. - //! - //! This string is always `NUL`-terminated. - char value[ValueSize]; - - //! \brief Returns the validity of the entry. - //! - //! If #key is an empty string, the entry is considered inactive, and this - //! method returns `false`. Otherwise, returns `true`. - bool is_active() const { - return key[0] != '\0'; - } - }; - - //! \brief An iterator to traverse all of the active entries in a - //! TSimpleStringDictionary. - class Iterator { - public: - explicit Iterator(const TSimpleStringDictionary& map) - : map_(map), - current_(0) { - } - - //! \brief Returns the next entry in the map, or `nullptr` if at the end of - //! the collection. - const Entry* Next() { - while (current_ < map_.num_entries) { - const Entry* entry = &map_.entries_[current_++]; - if (entry->is_active()) { - return entry; - } - } - return nullptr; - } - - private: - const TSimpleStringDictionary& map_; - size_t current_; - - DISALLOW_COPY_AND_ASSIGN(Iterator); - }; - - TSimpleStringDictionary() - : entries_() { - } - - TSimpleStringDictionary(const TSimpleStringDictionary& other) { - *this = other; - } - - TSimpleStringDictionary& operator=(const TSimpleStringDictionary& other) { - memcpy(entries_, other.entries_, sizeof(entries_)); - return *this; - } - - //! \brief Returns the number of active key/value pairs. The upper limit for - //! this is \a NumEntries. - size_t GetCount() const { - size_t count = 0; - for (size_t i = 0; i < num_entries; ++i) { - if (entries_[i].is_active()) { - ++count; - } - } - return count; - } - - //! \brief Given \a key, returns its corresponding value. - //! - //! \param[in] key The key to look up. This must not be `nullptr`, nor an - //! empty string. It must not contain embedded `NUL`s. - //! - //! \return The corresponding value for \a key, or if \a key is not found, - //! `nullptr`. - const char* GetValueForKey(base::StringPiece key) const { - DCHECK(key.data()); - DCHECK(key.size()); - DCHECK_EQ(key.find('\0', 0), base::StringPiece::npos); - if (!key.data() || !key.size()) { - return nullptr; - } - - const Entry* entry = GetConstEntryForKey(key); - if (!entry) { - return nullptr; - } - - return entry->value; - } - - //! \brief Stores \a value into \a key, replacing the existing value if \a key - //! is already present. - //! - //! If \a key is not yet in the map and the map is already full (containing - //! \a NumEntries active entries), this operation silently fails. - //! - //! \param[in] key The key to store. This must not be `nullptr`, nor an empty - //! string. It must not contain embedded `NUL`s. - //! \param[in] value The value to store. If `nullptr`, \a key is removed from - //! the map. Must not contain embedded `NUL`s. - void SetKeyValue(base::StringPiece key, base::StringPiece value) { - if (!value.data()) { - RemoveKey(key); - return; - } - - DCHECK(key.data()); - DCHECK(key.size()); - DCHECK_EQ(key.find('\0', 0), base::StringPiece::npos); - if (!key.data() || !key.size()) { - return; - } - - // |key| must not be an empty string. - DCHECK_NE(key[0], '\0'); - if (key[0] == '\0') { - return; - } - - // |value| must not contain embedded NULs. - DCHECK_EQ(value.find('\0', 0), base::StringPiece::npos); - - Entry* entry = GetEntryForKey(key); - - // If it does not yet exist, attempt to insert it. - if (!entry) { - for (size_t i = 0; i < num_entries; ++i) { - if (!entries_[i].is_active()) { - entry = &entries_[i]; - SetFromStringPiece(key, entry->key, key_size); - break; - } - } - } - - // If the map is out of space, |entry| will be nullptr. - if (!entry) { - return; - } - -#ifndef NDEBUG - // Sanity check that the key only appears once. - int count = 0; - for (size_t i = 0; i < num_entries; ++i) { - if (EntryKeyEquals(key, entries_[i])) { - ++count; - } - } - DCHECK_EQ(count, 1); -#endif - - SetFromStringPiece(value, entry->value, value_size); - } - - //! \brief Removes \a key from the map. - //! - //! If \a key is not found, this is a no-op. - //! - //! \param[in] key The key of the entry to remove. This must not be `nullptr`, - //! nor an empty string. It must not contain embedded `NUL`s. - void RemoveKey(base::StringPiece key) { - DCHECK(key.data()); - DCHECK(key.size()); - DCHECK_EQ(key.find('\0', 0), base::StringPiece::npos); - if (!key.data() || !key.size()) { - return; - } - - Entry* entry = GetEntryForKey(key); - if (entry) { - entry->key[0] = '\0'; - entry->value[0] = '\0'; - } - - DCHECK_EQ(GetEntryForKey(key), implicit_cast<Entry*>(nullptr)); - } - - private: - static void SetFromStringPiece(base::StringPiece src, - char* dst, - size_t dst_size) { - size_t copy_len = std::min(dst_size - 1, src.size()); - src.copy(dst, copy_len); - dst[copy_len] = '\0'; - } - - static bool EntryKeyEquals(base::StringPiece key, const Entry& entry) { - if (key.size() >= KeySize) - return false; - - // Test for a NUL terminator and early out if it's absent. - if (entry.key[key.size()] != '\0') - return false; - - // As there's a NUL terminator at the right position in the entries - // string, strncmp can do the rest. - return strncmp(key.data(), entry.key, key.size()) == 0; - } - - const Entry* GetConstEntryForKey(base::StringPiece key) const { - for (size_t i = 0; i < num_entries; ++i) { - if (EntryKeyEquals(key, entries_[i])) { - return &entries_[i]; - } - } - return nullptr; - } - - Entry* GetEntryForKey(base::StringPiece key) { - return const_cast<Entry*>(GetConstEntryForKey(key)); - } - - Entry entries_[NumEntries]; -}; - -//! \brief A TSimpleStringDictionary with default template parameters. -//! -//! For historical reasons this specialized version is available with the same -//! size factors as a previous implementation. -using SimpleStringDictionary = TSimpleStringDictionary<256, 256, 64>; - -static_assert(std::is_standard_layout<SimpleStringDictionary>::value, - "SimpleStringDictionary must be standard layout"); - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_SIMPLE_STRING_DICTIONARY_H_ diff --git a/Tools/Crashpad/include/client/simulate_crash.h b/Tools/Crashpad/include/client/simulate_crash.h deleted file mode 100644 index 299fe97cf5..0000000000 --- a/Tools/Crashpad/include/client/simulate_crash.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SIMULATE_CRASH_H_ -#define CRASHPAD_CLIENT_SIMULATE_CRASH_H_ - -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include "client/simulate_crash_mac.h" -#elif defined(OS_WIN) -#include "client/simulate_crash_win.h" -#endif - -#endif // CRASHPAD_CLIENT_SIMULATE_CRASH_H_ diff --git a/Tools/Crashpad/include/client/simulate_crash_mac.h b/Tools/Crashpad/include/client/simulate_crash_mac.h deleted file mode 100644 index e14db3c9b4..0000000000 --- a/Tools/Crashpad/include/client/simulate_crash_mac.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SIMULATE_CRASH_MAC_H_ -#define CRASHPAD_CLIENT_SIMULATE_CRASH_MAC_H_ - -#include <mach/mach.h> - -#include "client/capture_context_mac.h" - -//! \file - -namespace crashpad { - -//! \brief Simulates a exception without crashing. -//! -//! This function searches for an `EXC_CRASH` handler in the same manner that -//! the kernel does, and sends it an exception message to that handler in the -//! format that the handler expects, considering the behavior and thread state -//! flavor that are registered for it. The exception sent to the handler will be -//! ::kMachExceptionSimulated, not `EXC_CRASH`. -//! -//! Typically, the CRASHPAD_SIMULATE_CRASH() macro will be used in preference to -//! this function, because it combines the context-capture operation with the -//! raising of a simulated exception. -//! -//! This function returns normally after the exception message is processed. If -//! no valid handler was found, or no handler processed the exception -//! successfully, a warning will be logged, but these conditions are not -//! considered fatal. -//! -//! \param[in] cpu_context The thread state to pass to the exception handler as -//! the exception context, provided that it is compatible with the thread -//! state flavor that the exception handler accepts. If it is not -//! compatible, the correct thread state for the handler will be obtained by -//! calling `thread_get_state()`. -void SimulateCrash(const NativeCPUContext& cpu_context); - -} // namespace crashpad - -//! \brief Captures the CPU context and simulates an exception without crashing. -#define CRASHPAD_SIMULATE_CRASH() \ - do { \ - crashpad::NativeCPUContext cpu_context; \ - crashpad::CaptureContext(&cpu_context); \ - crashpad::SimulateCrash(cpu_context); \ - } while (false) - -#endif // CRASHPAD_CLIENT_SIMULATE_CRASH_MAC_H_ diff --git a/Tools/Crashpad/include/client/simulate_crash_win.h b/Tools/Crashpad/include/client/simulate_crash_win.h deleted file mode 100644 index a20f3dad62..0000000000 --- a/Tools/Crashpad/include/client/simulate_crash_win.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SIMULATE_CRASH_WIN_H_ -#define CRASHPAD_CLIENT_SIMULATE_CRASH_WIN_H_ - -#include <windows.h> - -#include "client/crashpad_client.h" -#include "util/win/capture_context.h" - -//! \file - -//! \brief Captures the CPU context and captures a dump without an exception. -#define CRASHPAD_SIMULATE_CRASH() \ - do { \ - CONTEXT context; \ - crashpad::CaptureContext(&context); \ - crashpad::CrashpadClient::DumpWithoutCrash(context); \ - } while (false) - -#endif // CRASHPAD_CLIENT_SIMULATE_CRASH_WIN_H_ diff --git a/Tools/Crashpad/include/compat/android/dlfcn_internal.h b/Tools/Crashpad/include/compat/android/dlfcn_internal.h deleted file mode 100644 index ed4083dbc8..0000000000 --- a/Tools/Crashpad/include/compat/android/dlfcn_internal.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_DLFCN_INTERNAL_H_ -#define CRASHPAD_COMPAT_ANDROID_DLFCN_INTERNAL_H_ - -namespace crashpad { -namespace internal { - -//! \brief Provide a wrapper for `dlsym`. -//! -//! dlsym on Android KitKat (4.4.*) raises SIGFPE when searching for a -//! non-existent symbol. This wrapper avoids crashing in this circumstance. -//! https://code.google.com/p/android/issues/detail?id=61799 -//! -//! The parameters and return value for this function are the same as for -//! `dlsym`, but a return value for `dlerror` may not be set in the event of an -//! error. -void* Dlsym(void* handle, const char* symbol); - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_COMPAT_ANDROID_DLFCN_INTERNAL_H_ diff --git a/Tools/Crashpad/include/compat/android/elf.h b/Tools/Crashpad/include/compat/android/elf.h deleted file mode 100644 index 9fa923875b..0000000000 --- a/Tools/Crashpad/include/compat/android/elf.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_ELF_H_ -#define CRASHPAD_COMPAT_ANDROID_ELF_H_ - -#include_next <elf.h> - -#include <android/api-level.h> - -#if !defined(ELF32_ST_VISIBILITY) -#define ELF32_ST_VISIBILITY(other) ((other) & 0x3) -#endif - -#if !defined(ELF64_ST_VISIBILITY) -#define ELF64_ST_VISIBILITY(other) ELF32_ST_VISIBILITY(other) -#endif - -// Android 5.0.0 (API 21) NDK - -#if !defined(STT_COMMON) -#define STT_COMMON 5 -#endif - -#if !defined(STT_TLS) -#define STT_TLS 6 -#endif - -// ELF note header types are normally provided by <linux/elf.h>. While unified -// headers include <linux/elf.h> in <elf.h>, traditional headers do not, prior -// to API 21. <elf.h> and <linux/elf.h> can't both be included in the same -// translation unit due to collisions, so we provide these types here. -#if __ANDROID_API__ < 21 && !defined(__ANDROID_API_N__) -typedef struct { - Elf32_Word n_namesz; - Elf32_Word n_descsz; - Elf32_Word n_type; -} Elf32_Nhdr; - -typedef struct { - Elf64_Word n_namesz; - Elf64_Word n_descsz; - Elf64_Word n_type; -} Elf64_Nhdr; -#endif // __ANDROID_API__ < 21 && !defined(NT_PRSTATUS) - -#endif // CRASHPAD_COMPAT_ANDROID_ELF_H_ diff --git a/Tools/Crashpad/include/compat/android/linux/elf.h b/Tools/Crashpad/include/compat/android/linux/elf.h deleted file mode 100644 index e65d15327c..0000000000 --- a/Tools/Crashpad/include/compat/android/linux/elf.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_LINUX_ELF_H_ -#define CRASHPAD_COMPAT_ANDROID_LINUX_ELF_H_ - -#include_next <linux/elf.h> - -// Android 5.0.0 (API 21) NDK - -#if defined(__i386__) || defined(__x86_64__) -#if !defined(NT_386_TLS) -#define NT_386_TLS 0x200 -#endif -#endif // __i386__ || __x86_64__ - -#if defined(__ARMEL__) || defined(__aarch64__) -#if !defined(NT_ARM_VFP) -#define NT_ARM_VFP 0x400 -#endif - -#if !defined(NT_ARM_TLS) -#define NT_ARM_TLS 0x401 -#endif -#endif // __ARMEL__ || __aarch64__ - -#endif // CRASHPAD_COMPAT_ANDROID_LINUX_ELF_H_ diff --git a/Tools/Crashpad/include/compat/android/linux/prctl.h b/Tools/Crashpad/include/compat/android/linux/prctl.h deleted file mode 100644 index 046f900f0a..0000000000 --- a/Tools/Crashpad/include/compat/android/linux/prctl.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_LINUX_PRCTL_H_ -#define CRASHPAD_COMPAT_ANDROID_LINUX_PRCTL_H_ - -#include_next <linux/prctl.h> - -// Android 5.0.0 (API 21) NDK -#if !defined(PR_SET_PTRACER) -#define PR_SET_PTRACER 0x59616d61 -#endif - -#endif // CRASHPAD_COMPAT_ANDROID_LINUX_PRCTL_H_ diff --git a/Tools/Crashpad/include/compat/android/linux/ptrace.h b/Tools/Crashpad/include/compat/android/linux/ptrace.h deleted file mode 100644 index 7db46aa3f1..0000000000 --- a/Tools/Crashpad/include/compat/android/linux/ptrace.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_ -#define CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_ - -#include_next <linux/ptrace.h> - -// Android 5.0.0 (API 21) NDK -#if !defined(PTRACE_GETREGSET) -#define PTRACE_GETREGSET 0x4204 -#endif - -#endif // CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_ diff --git a/Tools/Crashpad/include/compat/android/sched.h b/Tools/Crashpad/include/compat/android/sched.h deleted file mode 100644 index c4a027ae48..0000000000 --- a/Tools/Crashpad/include/compat/android/sched.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_SCHED_H_ -#define CRASHPAD_COMPAT_ANDROID_SCHED_H_ - -#include_next <sched.h> - -// Android 5.0.0 (API 21) NDK - -#if !defined(SCHED_BATCH) -#define SCHED_BATCH 3 -#endif - -#if !defined(SCHED_IDLE) -#define SCHED_IDLE 5 -#endif - -#endif // CRASHPAD_COMPAT_ANDROID_SCHED_H_ diff --git a/Tools/Crashpad/include/compat/android/sys/epoll.h b/Tools/Crashpad/include/compat/android/sys/epoll.h deleted file mode 100644 index 387813e6a5..0000000000 --- a/Tools/Crashpad/include/compat/android/sys/epoll.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_SYS_EPOLL_H_ -#define CRASHPAD_COMPAT_ANDROID_SYS_EPOLL_H_ - -#include_next <sys/epoll.h> - -#include <android/api-level.h> -#include <fcntl.h> - -// This is missing from traditional headers before API 21. -#if !defined(EPOLLRDHUP) -#define EPOLLRDHUP 0x00002000 -#endif - -// EPOLL_CLOEXEC is undefined in traditional headers before API 21 and removed -// from unified headers at API levels < 21 as a means to indicate that -// epoll_create1 is missing from the C library, but the raw system call should -// still be available. -#if !defined(EPOLL_CLOEXEC) -#define EPOLL_CLOEXEC O_CLOEXEC -#endif - -#if __ANDROID_API__ < 21 - -#ifdef __cplusplus -extern "C" { -#endif - -int epoll_create1(int flags); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // __ANDROID_API__ < 21 - -#endif // CRASHPAD_COMPAT_ANDROID_SYS_EPOLL_H_ diff --git a/Tools/Crashpad/include/compat/android/sys/mman.h b/Tools/Crashpad/include/compat/android/sys/mman.h deleted file mode 100644 index 5e7cd69f18..0000000000 --- a/Tools/Crashpad/include/compat/android/sys/mman.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_SYS_MMAN_H_ -#define CRASHPAD_COMPAT_ANDROID_SYS_MMAN_H_ - -#include_next <sys/mman.h> - -#include <android/api-level.h> -#include <sys/cdefs.h> - -// There’s no mmap() wrapper compatible with a 64-bit off_t for 32-bit code -// until API 21 (Android 5.0/“Lollipopâ€). A custom mmap() wrapper is provided -// here. Note that this scenario is only possible with NDK unified headers. -// -// https://android.googlesource.com/platform/bionic/+/0bfcbaf4d069e005d6e959d97f8d11c77722b70d/docs/32-bit-abi.md#is-32_bit-1 - -#if defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 21 - -#ifdef __cplusplus -extern "C" { -#endif - -void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 21 - -#endif // CRASHPAD_COMPAT_ANDROID_SYS_MMAN_H_ diff --git a/Tools/Crashpad/include/compat/android/sys/syscall.h b/Tools/Crashpad/include/compat/android/sys/syscall.h deleted file mode 100644 index facce20f79..0000000000 --- a/Tools/Crashpad/include/compat/android/sys/syscall.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_SYS_SYSCALL_H_ -#define CRASHPAD_COMPAT_ANDROID_SYS_SYSCALL_H_ - -#include_next <sys/syscall.h> - -// Android 5.0.0 (API 21) NDK - -#if !defined(SYS_epoll_create1) -#define SYS_epoll_create1 __NR_epoll_create1 -#endif - -#if !defined(SYS_gettid) -#define SYS_gettid __NR_gettid -#endif - -#if !defined(SYS_timer_create) -#define SYS_timer_create __NR_timer_create -#endif - -#if !defined(SYS_timer_getoverrun) -#define SYS_timer_getoverrun __NR_timer_getoverrun -#endif - -#if !defined(SYS_timer_settime) -#define SYS_timer_settime __NR_timer_settime -#endif - -#endif // CRASHPAD_COMPAT_ANDROID_SYS_SYSCALL_H_ diff --git a/Tools/Crashpad/include/compat/android/sys/user.h b/Tools/Crashpad/include/compat/android/sys/user.h deleted file mode 100644 index 4352a20677..0000000000 --- a/Tools/Crashpad/include/compat/android/sys/user.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_ANDROID_SYS_USER_H_ -#define CRASHPAD_COMPAT_ANDROID_SYS_USER_H_ - -// This is needed for traditional headers. -#include <sys/types.h> - -#include_next <sys/user.h> - -#endif // CRASHPAD_COMPAT_ANDROID_SYS_USER_H_ diff --git a/Tools/Crashpad/include/compat/linux/signal.h b/Tools/Crashpad/include/compat/linux/signal.h deleted file mode 100644 index 62b9c08636..0000000000 --- a/Tools/Crashpad/include/compat/linux/signal.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_LINUX_SIGNAL_H_ -#define CRASHPAD_COMPAT_LINUX_SIGNAL_H_ - -#include_next <signal.h> - -// Missing from glibc and bionic-x86_64 -#if defined(__x86_64__) || defined(__i386__) -#if !defined(X86_FXSR_MAGIC) -#define X86_FXSR_MAGIC 0x0000 -#endif -#endif // __x86_64__ || __i386__ - -#endif // CRASHPAD_COMPAT_LINUX_SIGNAL_H_ diff --git a/Tools/Crashpad/include/compat/linux/sys/ptrace.h b/Tools/Crashpad/include/compat/linux/sys/ptrace.h deleted file mode 100644 index e68125b5b1..0000000000 --- a/Tools/Crashpad/include/compat/linux/sys/ptrace.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_LINUX_SYS_PTRACE_H_ -#define CRASHPAD_COMPAT_LINUX_SYS_PTRACE_H_ - -#include_next <sys/ptrace.h> - -#include <sys/cdefs.h> - -// https://sourceware.org/bugzilla/show_bug.cgi?id=22433 -#if !defined(PTRACE_GET_THREAD_AREA) && \ - defined(__GLIBC__) && (defined(__i386__) || defined(__x86_64__)) -static constexpr __ptrace_request PTRACE_GET_THREAD_AREA = - static_cast<__ptrace_request>(25); -#define PTRACE_GET_THREAD_AREA PTRACE_GET_THREAD_AREA -#endif // !PTRACE_GET_THREAD_AREA && __GLIBC__ && (__i386__ || __x86_64__) - -#endif // CRASHPAD_COMPAT_LINUX_SYS_PTRACE_H_ diff --git a/Tools/Crashpad/include/compat/mac/AvailabilityMacros.h b/Tools/Crashpad/include/compat/mac/AvailabilityMacros.h deleted file mode 100644 index f105f944e3..0000000000 --- a/Tools/Crashpad/include/compat/mac/AvailabilityMacros.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_AVAILABILITYMACROS_H_ -#define CRASHPAD_COMPAT_MAC_AVAILABILITYMACROS_H_ - -#include_next <AvailabilityMacros.h> - -// 10.7 SDK - -#ifndef MAC_OS_X_VERSION_10_7 -#define MAC_OS_X_VERSION_10_7 1070 -#endif - -// 10.8 SDK - -#ifndef MAC_OS_X_VERSION_10_8 -#define MAC_OS_X_VERSION_10_8 1080 -#endif - -// 10.9 SDK - -#ifndef MAC_OS_X_VERSION_10_9 -#define MAC_OS_X_VERSION_10_9 1090 -#endif - -// 10.10 SDK - -#ifndef MAC_OS_X_VERSION_10_10 -#define MAC_OS_X_VERSION_10_10 101000 -#endif - -// 10.11 SDK - -#ifndef MAC_OS_X_VERSION_10_11 -#define MAC_OS_X_VERSION_10_11 101100 -#endif - -// 10.12 SDK - -#ifndef MAC_OS_X_VERSION_10_12 -#define MAC_OS_X_VERSION_10_12 101200 -#endif - -// 10.13 SDK - -#ifndef MAC_OS_X_VERSION_10_13 -#define MAC_OS_X_VERSION_10_13 101300 -#endif - -#endif // CRASHPAD_COMPAT_MAC_AVAILABILITYMACROS_H_ diff --git a/Tools/Crashpad/include/compat/mac/kern/exc_resource.h b/Tools/Crashpad/include/compat/mac/kern/exc_resource.h deleted file mode 100644 index ca8943d37d..0000000000 --- a/Tools/Crashpad/include/compat/mac/kern/exc_resource.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_KERN_EXC_RESOURCE_H_ -#define CRASHPAD_COMPAT_MAC_KERN_EXC_RESOURCE_H_ - -#if __has_include_next(<kern/exc_resource.h>) -#include_next <kern/exc_resource.h> -#endif - -// 10.9 SDK - -#ifndef EXC_RESOURCE_DECODE_RESOURCE_TYPE -#define EXC_RESOURCE_DECODE_RESOURCE_TYPE(code) (((code) >> 61) & 0x7ull) -#endif - -#ifndef EXC_RESOURCE_DECODE_FLAVOR -#define EXC_RESOURCE_DECODE_FLAVOR(code) (((code) >> 58) & 0x7ull) -#endif - -#ifndef RESOURCE_TYPE_CPU -#define RESOURCE_TYPE_CPU 1 -#endif - -#ifndef RESOURCE_TYPE_WAKEUPS -#define RESOURCE_TYPE_WAKEUPS 2 -#endif - -#ifndef RESOURCE_TYPE_MEMORY -#define RESOURCE_TYPE_MEMORY 3 -#endif - -#ifndef FLAVOR_CPU_MONITOR -#define FLAVOR_CPU_MONITOR 1 -#endif - -#ifndef FLAVOR_WAKEUPS_MONITOR -#define FLAVOR_WAKEUPS_MONITOR 1 -#endif - -#ifndef FLAVOR_HIGH_WATERMARK -#define FLAVOR_HIGH_WATERMARK 1 -#endif - -// 10.10 SDK - -#ifndef FLAVOR_CPU_MONITOR_FATAL -#define FLAVOR_CPU_MONITOR_FATAL 2 -#endif - -// 10.12 SDK - -#ifndef RESOURCE_TYPE_IO -#define RESOURCE_TYPE_IO 4 -#endif - -#ifndef FLAVOR_IO_PHYSICAL_WRITES -#define FLAVOR_IO_PHYSICAL_WRITES 1 -#endif - -#ifndef FLAVOR_IO_LOGICAL_WRITES -#define FLAVOR_IO_LOGICAL_WRITES 2 -#endif - -#endif // CRASHPAD_COMPAT_MAC_KERN_EXC_RESOURCE_H_ diff --git a/Tools/Crashpad/include/compat/mac/mach-o/loader.h b/Tools/Crashpad/include/compat/mac/mach-o/loader.h deleted file mode 100644 index 95a735747f..0000000000 --- a/Tools/Crashpad/include/compat/mac/mach-o/loader.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_MACH_O_LOADER_H_ -#define CRASHPAD_COMPAT_MAC_MACH_O_LOADER_H_ - -#include_next <mach-o/loader.h> - -// 10.7 SDK - -#ifndef S_THREAD_LOCAL_ZEROFILL -#define S_THREAD_LOCAL_ZEROFILL 0x12 -#endif - -// 10.8 SDK - -#ifndef LC_SOURCE_VERSION -#define LC_SOURCE_VERSION 0x2a -#endif - -#endif // CRASHPAD_COMPAT_MAC_MACH_O_LOADER_H_ diff --git a/Tools/Crashpad/include/compat/mac/mach/i386/thread_state.h b/Tools/Crashpad/include/compat/mac/mach/i386/thread_state.h deleted file mode 100644 index de744d64de..0000000000 --- a/Tools/Crashpad/include/compat/mac/mach/i386/thread_state.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_MACH_I386_THREAD_STATE_H_ -#define CRASHPAD_COMPAT_MAC_MACH_I386_THREAD_STATE_H_ - -#include_next <mach/i386/thread_state.h> - -// 10.13 SDK -// -// This was defined as 244 in the 10.7 through 10.12 SDKs, and 144 previously. -#if I386_THREAD_STATE_MAX < 614 -#undef I386_THREAD_STATE_MAX -#define I386_THREAD_STATE_MAX (614) -#endif - -#endif // CRASHPAD_COMPAT_MAC_MACH_I386_THREAD_STATE_H_ diff --git a/Tools/Crashpad/include/compat/mac/mach/mach.h b/Tools/Crashpad/include/compat/mac/mach/mach.h deleted file mode 100644 index 55f5fdd2e2..0000000000 --- a/Tools/Crashpad/include/compat/mac/mach/mach.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_MACH_MACH_H_ -#define CRASHPAD_COMPAT_MAC_MACH_MACH_H_ - -#include_next <mach/mach.h> - -// <mach/exception_types.h> - -// 10.8 SDK - -#ifndef EXC_RESOURCE -#define EXC_RESOURCE 11 -#endif - -#ifndef EXC_MASK_RESOURCE -#define EXC_MASK_RESOURCE (1 << EXC_RESOURCE) -#endif - -// 10.9 SDK - -#ifndef EXC_GUARD -#define EXC_GUARD 12 -#endif - -#ifndef EXC_MASK_GUARD -#define EXC_MASK_GUARD (1 << EXC_GUARD) -#endif - -// 10.11 SDK - -#ifndef EXC_CORPSE_NOTIFY -#define EXC_CORPSE_NOTIFY 13 -#endif - -#ifndef EXC_MASK_CORPSE_NOTIFY -#define EXC_MASK_CORPSE_NOTIFY (1 << EXC_CORPSE_NOTIFY) -#endif - -// Don’t expose EXC_MASK_ALL at all, because its definition varies with SDK, and -// older kernels will reject values that they don’t understand. Instead, use -// crashpad::ExcMaskAll(), which computes the correct value of EXC_MASK_ALL for -// the running system. -#undef EXC_MASK_ALL - -#if defined(__i386__) || defined(__x86_64__) - -// <mach/i386/exception.h> - -// 10.11 SDK - -#if EXC_TYPES_COUNT > 14 // Definition varies with SDK -#error Update this file for new exception types -#elif EXC_TYPES_COUNT != 14 -#undef EXC_TYPES_COUNT -#define EXC_TYPES_COUNT 14 -#endif - -// <mach/i386/thread_status.h> - -// 10.6 SDK -// -// Earlier versions of this SDK didn’t have AVX definitions. They didn’t appear -// until the version of the 10.6 SDK that shipped with Xcode 4.2, although -// versions of this SDK appeared with Xcode releases as early as Xcode 3.2. -// Similarly, the kernel didn’t handle AVX state until Mac OS X 10.6.8 -// (xnu-1504.15.3) and presumably the hardware-specific versions of Mac OS X -// 10.6.7 intended to run on processors with AVX. - -#ifndef x86_AVX_STATE32 -#define x86_AVX_STATE32 16 -#endif - -#ifndef x86_AVX_STATE64 -#define x86_AVX_STATE64 17 -#endif - -// 10.8 SDK - -#ifndef x86_AVX_STATE -#define x86_AVX_STATE 18 -#endif - -// 10.13 SDK - -#ifndef x86_AVX512_STATE32 -#define x86_AVX512_STATE32 19 -#endif - -#ifndef x86_AVX512_STATE64 -#define x86_AVX512_STATE64 20 -#endif - -#ifndef x86_AVX512_STATE -#define x86_AVX512_STATE 21 -#endif - -#endif // defined(__i386__) || defined(__x86_64__) - -// <mach/thread_status.h> - -// 10.8 SDK - -#ifndef THREAD_STATE_FLAVOR_LIST_10_9 -#define THREAD_STATE_FLAVOR_LIST_10_9 129 -#endif - -#endif // CRASHPAD_COMPAT_MAC_MACH_MACH_H_ diff --git a/Tools/Crashpad/include/compat/mac/sys/resource.h b/Tools/Crashpad/include/compat/mac/sys/resource.h deleted file mode 100644 index 0697e169b5..0000000000 --- a/Tools/Crashpad/include/compat/mac/sys/resource.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_MAC_SYS_RESOURCE_H_ -#define CRASHPAD_COMPAT_MAC_SYS_RESOURCE_H_ - -#include_next <sys/resource.h> - -// 10.9 SDK - -#ifndef WAKEMON_MAKE_FATAL -#define WAKEMON_MAKE_FATAL 0x10 -#endif - -#endif // CRASHPAD_COMPAT_MAC_SYS_RESOURCE_H_ diff --git a/Tools/Crashpad/include/compat/non_mac/mach/mach.h b/Tools/Crashpad/include/compat/non_mac/mach/mach.h deleted file mode 100644 index f33bb10f38..0000000000 --- a/Tools/Crashpad/include/compat/non_mac/mach/mach.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_MAC_MACH_MACH_H_ -#define CRASHPAD_COMPAT_NON_MAC_MACH_MACH_H_ - -//! \file - -// <mach/exception_types.h> - -//! \anchor EXC_x -//! \name EXC_* -//! -//! \brief Mach exception type definitions. -//! \{ -#define EXC_BAD_ACCESS 1 -#define EXC_BAD_INSTRUCTION 2 -#define EXC_ARITHMETIC 3 -#define EXC_EMULATION 4 -#define EXC_SOFTWARE 5 -#define EXC_BREAKPOINT 6 -#define EXC_SYSCALL 7 -#define EXC_MACH_SYSCALL 8 -#define EXC_RPC_ALERT 9 -#define EXC_CRASH 10 -#define EXC_RESOURCE 11 -#define EXC_GUARD 12 -#define EXC_CORPSE_NOTIFY 13 - -#define EXC_TYPES_COUNT 14 -//! \} - -#endif // CRASHPAD_COMPAT_NON_MAC_MACH_MACH_H_ diff --git a/Tools/Crashpad/include/compat/non_win/dbghelp.h b/Tools/Crashpad/include/compat/non_win/dbghelp.h deleted file mode 100644 index 5ce88b886b..0000000000 --- a/Tools/Crashpad/include/compat/non_win/dbghelp.h +++ /dev/null @@ -1,1106 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ -#define CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ - -#include <stdint.h> - -#include "base/strings/string16.h" -#include "compat/non_win/timezoneapi.h" -#include "compat/non_win/verrsrc.h" -#include "compat/non_win/winnt.h" - -//! \file - -//! \brief The magic number for a minidump file, stored in -//! MINIDUMP_HEADER::Signature. -//! -//! A hex dump of a little-endian minidump file will begin with the string -//! “MDMPâ€. -#define MINIDUMP_SIGNATURE ('PMDM') // 0x4d444d50 - -//! \brief The version of a minidump file, stored in MINIDUMP_HEADER::Version. -#define MINIDUMP_VERSION (42899) - -//! \brief An offset within a minidump file, relative to the start of its -//! MINIDUMP_HEADER. -//! -//! RVA stands for “relative virtual addressâ€. Within a minidump file, RVAs are -//! used as pointers to link structures together. -//! -//! \sa MINIDUMP_LOCATION_DESCRIPTOR -typedef uint32_t RVA; - -//! \brief A pointer to a structure or union within a minidump file. -struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR { - //! \brief The size of the referenced structure or union, in bytes. - uint32_t DataSize; - - //! \brief The relative virtual address of the structure or union within the - //! minidump file. - RVA Rva; -}; - -//! \brief A pointer to a snapshot of a region of memory contained within a -//! minidump file. -//! -//! \sa MINIDUMP_MEMORY_LIST -struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_DESCRIPTOR { - //! \brief The base address of the memory region in the address space of the - //! process that the minidump file contains a snapshot of. - uint64_t StartOfMemoryRange; - - //! \brief The contents of the memory region. - MINIDUMP_LOCATION_DESCRIPTOR Memory; -}; - -//! \brief The top-level structure identifying a minidump file. -//! -//! This structure contains a pointer to the stream directory, a second-level -//! structure which in turn contains pointers to third-level structures -//! (“streamsâ€) containing the data within the minidump file. This structure -//! also contains the minidump file’s magic numbers, and other bookkeeping data. -//! -//! This structure must be present at the beginning of a minidump file (at ::RVA -//! 0). -struct __attribute__((packed, aligned(4))) MINIDUMP_HEADER { - //! \brief The minidump file format magic number, ::MINIDUMP_SIGNATURE. - uint32_t Signature; - - //! \brief The minidump file format version number, ::MINIDUMP_VERSION. - uint32_t Version; - - //! \brief The number of MINIDUMP_DIRECTORY elements present in the directory - //! referenced by #StreamDirectoryRva. - uint32_t NumberOfStreams; - - //! \brief A pointer to an array of MINIDUMP_DIRECTORY structures that - //! identify all of the streams within this minidump file. The array has - //! #NumberOfStreams elements present. - RVA StreamDirectoryRva; - - //! \brief The minidump file’s checksum. This can be `0`, and in practice, `0` - //! is the only value that has ever been seen in this field. - uint32_t CheckSum; - - //! \brief The time that the minidump file was generated, in `time_t` format, - //! the number of seconds since the POSIX epoch. - uint32_t TimeDateStamp; - - //! \brief A bitfield containing members of ::MINIDUMP_TYPE, describing the - //! types of data carried within this minidump file. - uint64_t Flags; -}; - -//! \brief A pointer to a stream within a minidump file. -//! -//! Each stream present in a minidump file will have a corresponding -//! MINIDUMP_DIRECTORY entry in the stream directory referenced by -//! MINIDUMP_HEADER::StreamDirectoryRva. -struct __attribute__((packed, aligned(4))) MINIDUMP_DIRECTORY { - //! \brief The type of stream referenced, a value of ::MINIDUMP_STREAM_TYPE. - uint32_t StreamType; - - //! \brief A pointer to the stream data within the minidump file. - MINIDUMP_LOCATION_DESCRIPTOR Location; -}; - -//! \brief A variable-length UTF-16-encoded string carried within a minidump -//! file. -//! -//! The UTF-16 string is stored as UTF-16LE or UTF-16BE according to the byte -//! ordering of the minidump file itself. -//! -//! \sa crashpad::MinidumpUTF8String -struct __attribute__((packed, aligned(4))) MINIDUMP_STRING { - //! \brief The length of the #Buffer field in bytes, not including the `NUL` - //! terminator. - //! - //! \note This field is interpreted as a byte count, not a count of UTF-16 - //! code units or Unicode code points. - uint32_t Length; - - //! \brief The string, encoded in UTF-16, and terminated with a UTF-16 `NUL` - //! code unit (two `NUL` bytes). - base::char16 Buffer[0]; -}; - -//! \brief Minidump stream type values for MINIDUMP_DIRECTORY::StreamType. Each -//! stream structure has a corresponding stream type value to identify it. -//! -//! \sa crashpad::MinidumpStreamType -enum MINIDUMP_STREAM_TYPE { - //! \brief The stream type for MINIDUMP_THREAD_LIST. - ThreadListStream = 3, - - //! \brief The stream type for MINIDUMP_MODULE_LIST. - ModuleListStream = 4, - - //! \brief The stream type for MINIDUMP_MEMORY_LIST. - MemoryListStream = 5, - - //! \brief The stream type for MINIDUMP_EXCEPTION_STREAM. - ExceptionStream = 6, - - //! \brief The stream type for MINIDUMP_SYSTEM_INFO. - SystemInfoStream = 7, - - //! \brief The stream contains information about active `HANDLE`s. - HandleDataStream = 12, - - //! \brief The stream type for MINIDUMP_UNLOADED_MODULE_LIST. - UnloadedModuleListStream = 14, - - //! \brief The stream type for MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, - //! MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4, and MINIDUMP_MISC_INFO_5. - //! - //! More recent versions of this stream are supersets of earlier versions. - //! - //! The exact version of the stream that is present is implied by the stream’s - //! size. Furthermore, this stream contains a field, - //! MINIDUMP_MISC_INFO::Flags1, that indicates which data is present and - //! valid. - MiscInfoStream = 15, - - //! \brief The stream type for MINIDUMP_MEMORY_INFO_LIST. - MemoryInfoListStream = 16, - - //! \brief Values greater than this value will not be used by the system - //! and can be used for custom user data streams. - LastReservedStream = 0xffff, -}; - -//! \brief Information about the CPU (or CPUs) that ran the process that the -//! minidump file contains a snapshot of. -//! -//! This union only appears as MINIDUMP_SYSTEM_INFO::Cpu. Its interpretation is -//! controlled by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. -union __attribute__((packed, aligned(4))) CPU_INFORMATION { - //! \brief Information about 32-bit x86 CPUs, or x86_64 CPUs when running - //! 32-bit x86 processes. - struct __attribute__((packed, aligned(4))) { - //! \brief The CPU’s vendor identification string as encoded in `cpuid 0` - //! `ebx`, `edx`, and `ecx`, represented as it appears in these - //! registers. - //! - //! For Intel CPUs, `[0]` will encode “Genuâ€, `[1]` will encode “ineIâ€, and - //! `[2]` will encode “ntelâ€, for a vendor ID string “GenuineIntelâ€. - //! - //! \note The Windows documentation incorrectly states that these fields are - //! to be interpreted as `cpuid 0` `eax`, `ebx`, and `ecx`. - uint32_t VendorId[3]; - - //! \brief Family, model, and stepping ID values as encoded in `cpuid 1` - //! `eax`. - uint32_t VersionInformation; - - //! \brief A bitfield containing supported CPU capabilities as encoded in - //! `cpuid 1` `edx`. - uint32_t FeatureInformation; - - //! \brief A bitfield containing supported CPU capabalities as encoded in - //! `cpuid 0x80000001` `edx`. - //! - //! This field is only valid if #VendorId identifies the CPU vendor as - //! “AuthenticAMDâ€. - uint32_t AMDExtendedCpuFeatures; - } X86CpuInfo; - - //! \brief Information about non-x86 CPUs, and x86_64 CPUs when not running - //! 32-bit x86 processes. - struct __attribute__((packed, aligned(4))) { - //! \brief Bitfields containing supported CPU capabilities as identified by - //! bits corresponding to \ref PF_x "PF_*" values passed to - //! `IsProcessorFeaturePresent()`. - uint64_t ProcessorFeatures[2]; - } OtherCpuInfo; -}; - -//! \brief Information about the system that hosted the process that the -//! minidump file contains a snapshot of. -struct __attribute__((packed, aligned(4))) MINIDUMP_SYSTEM_INFO { - // The next 4 fields are from the SYSTEM_INFO structure returned by - // GetSystemInfo(). - - //! \brief The system’s CPU architecture. This may be a \ref - //! PROCESSOR_ARCHITECTURE_x "PROCESSOR_ARCHITECTURE_*" value, or a member - //! of crashpad::MinidumpCPUArchitecture. - //! - //! In some cases, a system may be able to run processes of multiple specific - //! architecture types. For example, systems based on 64-bit architectures - //! such as x86_64 are often able to run 32-bit code of another architecture - //! in the same family, such as 32-bit x86. On these systems, this field will - //! identify the architecture of the process that the minidump file contains a - //! snapshot of. - uint16_t ProcessorArchitecture; - - //! \brief General CPU version information. - //! - //! The precise interpretation of this field is specific to each CPU - //! architecture. For x86-family CPUs (including x86_64 and 32-bit x86), this - //! field contains the CPU family ID value from `cpuid 1` `eax`, adjusted to - //! take the extended family ID into account. - uint16_t ProcessorLevel; - - //! \brief Specific CPU version information. - //! - //! The precise interpretation of this field is specific to each CPU - //! architecture. For x86-family CPUs (including x86_64 and 32-bit x86), this - //! field contains values obtained from `cpuid 1` `eax`: the high byte - //! contains the CPU model ID value adjusted to take the extended model ID - //! into account, and the low byte contains the CPU stepping ID value. - uint16_t ProcessorRevision; - - //! \brief The total number of CPUs present in the system. - uint8_t NumberOfProcessors; - - // The next 7 fields are from the OSVERSIONINFOEX structure returned by - // GetVersionEx(). - - //! \brief The system’s operating system type, which distinguishes between - //! “desktop†or “workstation†systems and “server†systems. This may be a - //! \ref VER_NT_x "VER_NT_*" value, or a member of - //! crashpad::MinidumpOSType. - uint8_t ProductType; - - //! \brief The system’s operating system version number’s first (major) - //! component. - //! - //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `6`. - //! - For macOS 10.12.1, this would be `10`. - uint32_t MajorVersion; - - //! \brief The system’s operating system version number’s second (minor) - //! component. - //! - //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `1`. - //! - For macOS 10.12.1, this would be `12`. - uint32_t MinorVersion; - - //! \brief The system’s operating system version number’s third (build or - //! patch) component. - //! - //! - For Windows 7 (NT 6.1) SP1, version 6.1.7601, this would be `7601`. - //! - For macOS 10.12.1, this would be `1`. - uint32_t BuildNumber; - - //! \brief The system’s operating system family. This may be a \ref - //! VER_PLATFORM_x "VER_PLATFORM_*" value, or a member of - //! crashpad::MinidumpOS. - uint32_t PlatformId; - - //! \brief ::RVA of a MINIDUMP_STRING containing operating system-specific - //! version information. - //! - //! This field further identifies an operating system version beyond its - //! version number fields. Historically, “CSD†stands for “corrective service - //! diskette.†- //! - //! - On Windows, this is the name of the installed operating system service - //! pack, such as “Service Pack 1â€. If no service pack is installed, this - //! field references an empty string. - //! - On macOS, this is the operating system build number from `sw_vers - //! -buildVersion`. For macOS 10.12.1 on most hardware types, this would - //! be `16B2657`. - //! - On Linux and other Unix-like systems, this is the kernel version from - //! `uname -srvm`, possibly with additional information appended. On - //! Android, the `ro.build.fingerprint` system property is appended. - RVA CSDVersionRva; - - //! \brief A bitfield identifying products installed on the system. This is - //! composed of \ref VER_SUITE_x "VER_SUITE_*" values. - //! - //! This field is Windows-specific, and has no meaning on other operating - //! systems. - uint16_t SuiteMask; - - uint16_t Reserved2; - - //! \brief Information about the system’s CPUs. - //! - //! This field is a union. Which of its members should be expressed is - //! controlled by the #ProcessorArchitecture field. If it is set to - //! crashpad::kMinidumpCPUArchitectureX86, the CPU_INFORMATION::X86CpuInfo - //! field is expressed. Otherwise, the CPU_INFORMATION::OtherCpuInfo field is - //! expressed. - //! - //! \note Older Breakpad implementations produce minidump files that express - //! CPU_INFORMATION::X86CpuInfo when #ProcessorArchitecture is set to - //! crashpad::kMinidumpCPUArchitectureAMD64. Minidump files produced by - //! `dbghelp.dll` on Windows express CPU_INFORMATION::OtherCpuInfo in this - //! case. - CPU_INFORMATION Cpu; -}; - -//! \brief Information about a specific thread within the process. -//! -//! \sa MINIDUMP_THREAD_LIST -struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD { - //! \brief The thread’s ID. This may be referenced by - //! MINIDUMP_EXCEPTION_STREAM::ThreadId. - uint32_t ThreadId; - - //! \brief The thread’s suspend count. - //! - //! This field will be `0` if the thread is schedulable (not suspended). - uint32_t SuspendCount; - - //! \brief The thread’s priority class. - //! - //! On Windows, this is a `*_PRIORITY_CLASS` value. `NORMAL_PRIORITY_CLASS` - //! has value `0x20`; higher priority classes have higher values. - uint32_t PriorityClass; - - //! \brief The thread’s priority level. - //! - //! On Windows, this is a `THREAD_PRIORITY_*` value. `THREAD_PRIORITY_NORMAL` - //! has value `0`; higher priorities have higher values, and lower priorities - //! have lower (negative) values. - uint32_t Priority; - - //! \brief The address of the thread’s thread environment block in the address - //! space of the process that the minidump file contains a snapshot of. - //! - //! The thread environment block contains thread-local data. - //! - //! A MINIDUMP_MEMORY_DESCRIPTOR may be present in the MINIDUMP_MEMORY_LIST - //! stream containing the thread-local data pointed to by this field. - uint64_t Teb; - - //! \brief A snapshot of the thread’s stack. - //! - //! A MINIDUMP_MEMORY_DESCRIPTOR may be present in the MINIDUMP_MEMORY_LIST - //! stream containing a pointer to the same memory range referenced by this - //! field. - MINIDUMP_MEMORY_DESCRIPTOR Stack; - - //! \brief A pointer to a CPU-specific CONTEXT structure containing the - //! thread’s context at the time the snapshot was taken. - //! - //! If the minidump file was generated as a result of an exception taken on - //! this thread, this field may identify a different context than the - //! exception context. For these minidump files, a MINIDUMP_EXCEPTION_STREAM - //! stream will be present, and the context contained within that stream will - //! be the exception context. - //! - //! The interpretation of the context structure is dependent on the CPU - //! architecture identified by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. - //! For crashpad::kMinidumpCPUArchitectureX86, this will be - //! crashpad::MinidumpContextX86. For crashpad::kMinidumpCPUArchitectureAMD64, - //! this will be crashpad::MinidumpContextAMD64. - MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; -}; - -//! \brief Information about all threads within the process. -struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_LIST { - //! \brief The number of threads present in the #Threads array. - uint32_t NumberOfThreads; - - //! \brief Structures identifying each thread within the process. - MINIDUMP_THREAD Threads[0]; -}; - -//! \brief Information about an exception that occurred in the process. -struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION { - //! \brief The top-level exception code identifying the exception, in - //! operating system-specific values. - //! - //! For macOS minidumps, this will be an \ref EXC_x "EXC_*" exception type, - //! such as `EXC_BAD_ACCESS`. `EXC_CRASH` will not appear here for exceptions - //! processed as `EXC_CRASH` when generated from another preceding exception: - //! the original exception code will appear instead. The exception type as it - //! was received will appear at index 0 of #ExceptionInformation. - //! - //! For Windows minidumps, this will be an `EXCEPTION_*` exception type, such - //! as `EXCEPTION_ACCESS_VIOLATION`. - //! - //! \note This field is named ExceptionCode, but what is known as the - //! “exception code†on macOS/Mach is actually stored in the - //! #ExceptionFlags field of a minidump file. - //! - //! \todo Document the possible values by OS. There may be OS-specific enums - //! in minidump_extensions.h. - uint32_t ExceptionCode; - - //! \brief Additional exception flags that further identify the exception, in - //! operating system-specific values. - //! - //! For macOS minidumps, this will be the value of the exception code at index - //! 0 as received by a Mach exception handler, except: - //! * For exception type `EXC_CRASH` generated from another preceding - //! exception, the original exception code will appear here, not the code - //! as received by the Mach exception handler. - //! * For exception types `EXC_RESOURCE` and `EXC_GUARD`, the high 32 bits of - //! the code received by the Mach exception handler will appear here. - //! - //! In all cases for macOS minidumps, the code as it was received by the Mach - //! exception handler will appear at index 1 of #ExceptionInformation. - //! - //! For Windows minidumps, this will either be `0` if the exception is - //! continuable, or `EXCEPTION_NONCONTINUABLE` to indicate a noncontinuable - //! exception. - //! - //! \todo Document the possible values by OS. There may be OS-specific enums - //! in minidump_extensions.h. - uint32_t ExceptionFlags; - - //! \brief An address, in the address space of the process that this minidump - //! file contains a snapshot of, of another MINIDUMP_EXCEPTION. This field - //! is used for nested exceptions. - uint64_t ExceptionRecord; - - //! \brief The address that caused the exception. - //! - //! This may be the address that caused a fault on data access, or it may be - //! the instruction pointer that contained an offending instruction. - uint64_t ExceptionAddress; - - //! \brief The number of valid elements in #ExceptionInformation. - uint32_t NumberParameters; - - uint32_t __unusedAlignment; - - //! \brief Additional information about the exception, specific to the - //! operating system and possibly the #ExceptionCode. - //! - //! For macOS minidumps, this will contain the exception type as received by a - //! Mach exception handler and the values of the `codes[0]` and `codes[1]` - //! (exception code and subcode) parameters supplied to the Mach exception - //! handler. Unlike #ExceptionCode and #ExceptionFlags, the values received by - //! a Mach exception handler are used directly here even for the `EXC_CRASH`, - //! `EXC_RESOURCE`, and `EXC_GUARD` exception types. - - //! For Windows, these are additional arguments (if any) as provided to - //! `RaiseException()`. - uint64_t ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -}; - -//! \brief Information about the exception that triggered a minidump file’s -//! generation. -struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION_STREAM { - //! \brief The ID of the thread that caused the exception. - //! - //! \sa MINIDUMP_THREAD::ThreadId - uint32_t ThreadId; - - uint32_t __alignment; - - //! \brief Information about the exception. - MINIDUMP_EXCEPTION ExceptionRecord; - - //! \brief A pointer to a CPU-specific CONTEXT structure containing the - //! thread’s context at the time the exception was caused. - //! - //! The interpretation of the context structure is dependent on the CPU - //! architecture identified by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. - //! For crashpad::kMinidumpCPUArchitectureX86, this will be - //! crashpad::MinidumpContextX86. For crashpad::kMinidumpCPUArchitectureAMD64, - //! this will be crashpad::MinidumpContextAMD64. - MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; -}; - -//! \brief Information about a specific module loaded within the process at the -//! time the snapshot was taken. -//! -//! A module may be the main executable, a shared library, or a loadable module. -//! -//! \sa MINIDUMP_MODULE_LIST -struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE { - //! \brief The base address of the loaded module in the address space of the - //! process that the minidump file contains a snapshot of. - uint64_t BaseOfImage; - - //! \brief The size of the loaded module. - uint32_t SizeOfImage; - - //! \brief The loaded module’s checksum, or `0` if unknown. - //! - //! On Windows, this field comes from the `CheckSum` field of the module’s - //! `IMAGE_OPTIONAL_HEADER` structure, if present. It reflects the checksum at - //! the time the module was linked. - uint32_t CheckSum; - - //! \brief The module’s timestamp, in `time_t` units, seconds since the POSIX - //! epoch, or `0` if unknown. - //! - //! On Windows, this field comes from the `TimeDateStamp` field of the - //! module’s `IMAGE_FILE_HEADER` structure. It reflects the timestamp at the - //! time the module was linked. - uint32_t TimeDateStamp; - - //! \brief ::RVA of a MINIDUMP_STRING containing the module’s path or file - //! name. - RVA ModuleNameRva; - - //! \brief The module’s version information. - VS_FIXEDFILEINFO VersionInfo; - - //! \brief A pointer to the module’s CodeView record, typically a link to its - //! debugging information in crashpad::CodeViewRecordPDB70 format. - //! - //! The specific format of the CodeView record is indicated by its signature, - //! the first 32-bit value in the structure. For links to debugging - //! information in contemporary usage, this is normally a - //! crashpad::CodeViewRecordPDB70 structure, but may be a - //! crashpad::CodeViewRecordPDB20 structure instead. These structures identify - //! a link to debugging data within a `.pdb` (Program Database) file. See <a - //! href="http://www.debuginfo.com/articles/debuginfomatch.html#pdbfiles">Matching - //! Debug Information</a>, PDB Files. - //! - //! On Windows, it is also possible for the CodeView record to contain - //! debugging information itself, as opposed to a link to a `.pdb` file. See - //! <a - //! href="http://pierrelib.pagesperso-orange.fr/exec_formats/MS_Symbol_Type_v1.0.pdf#page=71">Microsoft - //! Symbol and Type Information</a>, section 7.2, “Debug Information Format†- //! for a list of debug information formats, and <i>Undocumented Windows 2000 - //! Secrets</i>, Windows 2000 Debugging Support/Microsoft Symbol File - //! Internals/CodeView Subsections for an in-depth description of the CodeView - //! 4.1 format. Signatures seen in the wild include “NB09†(0x3930424e) for - //! CodeView 4.1 and “NB11†(0x3131424e) for CodeView 5.0. This form of - //! debugging information within the module, as opposed to a link to an - //! external `.pdb` file, is chosen by building with `/Z7` in Visual Studio - //! 6.0 (1998) and earlier. This embedded form of debugging information is now - //! considered obsolete. - //! - //! On Windows, the CodeView record is taken from a module’s - //! IMAGE_DEBUG_DIRECTORY entry whose Type field has the value - //! IMAGE_DEBUG_TYPE_CODEVIEW (`2`), if any. Records in - //! crashpad::CodeViewRecordPDB70 format are generated by Visual Studio .NET - //! (2002) (version 7.0) and later. - //! - //! When the CodeView record is not present, the fields of this - //! MINIDUMP_LOCATION_DESCRIPTOR will be `0`. - MINIDUMP_LOCATION_DESCRIPTOR CvRecord; - - //! \brief A pointer to the module’s miscellaneous debugging record, a - //! structure of type IMAGE_DEBUG_MISC. - //! - //! This field is Windows-specific, and has no meaning on other operating - //! systems. It is largely obsolete on Windows, where it was used to link to - //! debugging information stored in a `.dbg` file. `.dbg` files have been - //! superseded by `.pdb` files. - //! - //! On Windows, the miscellaneous debugging record is taken from module’s - //! IMAGE_DEBUG_DIRECTORY entry whose Type field has the value - //! IMAGE_DEBUG_TYPE_MISC (`4`), if any. - //! - //! When the miscellaneous debugging record is not present, the fields of this - //! MINIDUMP_LOCATION_DESCRIPTOR will be `0`. - //! - //! \sa #CvRecord - MINIDUMP_LOCATION_DESCRIPTOR MiscRecord; - - uint64_t Reserved0; - uint64_t Reserved1; -}; - -//! \brief Information about all modules loaded within the process at the time -//! the snapshot was taken. -struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE_LIST { - //! \brief The number of modules present in the #Modules array. - uint32_t NumberOfModules; - - //! \brief Structures identifying each module present in the minidump file. - MINIDUMP_MODULE Modules[0]; -}; - -//! \brief Information about memory regions within the process. -//! -//! Typically, a minidump file will not contain a snapshot of a process’ entire -//! memory image. For minidump files identified as ::MiniDumpNormal in -//! MINIDUMP_HEADER::Flags, memory regions are limited to those referenced by -//! MINIDUMP_THREAD::Stack fields, and a small number of others possibly related -//! to the exception that triggered the snapshot to be taken. -struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_LIST { - //! \brief The number of memory regions present in the #MemoryRanges array. - uint32_t NumberOfMemoryRanges; - - //! \brief Structures identifying each memory region present in the minidump - //! file. - MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges[0]; -}; - -//! \brief Contains the state of an individual system handle at the time the -//! snapshot was taken. This structure is Windows-specific. -//! -//! \sa MINIDUMP_HANDLE_DESCRIPTOR_2 -struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR { - //! \brief The Windows `HANDLE` value. - uint64_t Handle; - - //! \brief An RVA to a MINIDUMP_STRING structure that specifies the object - //! type of the handle. This member can be zero. - RVA TypeNameRva; - - //! \brief An RVA to a MINIDUMP_STRING structure that specifies the object - //! name of the handle. This member can be zero. - RVA ObjectNameRva; - - //! \brief The attributes for the handle, this corresponds to `OBJ_INHERIT`, - //! `OBJ_CASE_INSENSITIVE`, etc. - uint32_t Attributes; - - //! \brief The `ACCESS_MASK` for the handle. - uint32_t GrantedAccess; - - //! \brief This is the number of open handles to the object that this handle - //! refers to. - uint32_t HandleCount; - - //! \brief This is the number kernel references to the object that this - //! handle refers to. - uint32_t PointerCount; -}; - -//! \brief Contains the state of an individual system handle at the time the -//! snapshot was taken. This structure is Windows-specific. -//! -//! \sa MINIDUMP_HANDLE_DESCRIPTOR -struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR_2 - : public MINIDUMP_HANDLE_DESCRIPTOR { - //! \brief An RVA to a MINIDUMP_HANDLE_OBJECT_INFORMATION structure that - //! specifies object-specific information. This member can be zero if - //! there is no extra information. - RVA ObjectInfoRva; - - //! \brief Must be zero. - uint32_t Reserved0; -}; - -//! \brief Represents the header for a handle data stream. -//! -//! A list of MINIDUMP_HANDLE_DESCRIPTOR or MINIDUMP_HANDLE_DESCRIPTOR_2 -//! structures will immediately follow in the stream. -struct __attribute((packed, aligned(4))) MINIDUMP_HANDLE_DATA_STREAM { - //! \brief The size of the header information for the stream, in bytes. This - //! value is `sizeof(MINIDUMP_HANDLE_DATA_STREAM)`. - uint32_t SizeOfHeader; - - //! \brief The size of a descriptor in the stream, in bytes. This value is - //! `sizeof(MINIDUMP_HANDLE_DESCRIPTOR)` or - //! `sizeof(MINIDUMP_HANDLE_DESCRIPTOR_2)`. - uint32_t SizeOfDescriptor; - - //! \brief The number of descriptors in the stream. - uint32_t NumberOfDescriptors; - - //! \brief Must be zero. - uint32_t Reserved; -}; - -//! \brief Information about a specific module that was recorded as being -//! unloaded at the time the snapshot was taken. -//! -//! An unloaded module may be a shared library or a loadable module. -//! -//! \sa MINIDUMP_UNLOADED_MODULE_LIST -struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE { - //! \brief The base address where the module was loaded in the address space - //! of the process that the minidump file contains a snapshot of. - uint64_t BaseOfImage; - - //! \brief The size of the unloaded module. - uint32_t SizeOfImage; - - //! \brief The module’s checksum, or `0` if unknown. - //! - //! On Windows, this field comes from the `CheckSum` field of the module’s - //! `IMAGE_OPTIONAL_HEADER` structure, if present. It reflects the checksum at - //! the time the module was linked. - uint32_t CheckSum; - - //! \brief The module’s timestamp, in `time_t` units, seconds since the POSIX - //! epoch, or `0` if unknown. - //! - //! On Windows, this field comes from the `TimeDateStamp` field of the - //! module’s `IMAGE_FILE_HEADER` structure. It reflects the timestamp at the - //! time the module was linked. - uint32_t TimeDateStamp; - - //! \brief ::RVA of a MINIDUMP_STRING containing the module’s path or file - //! name. - RVA ModuleNameRva; -}; - -//! \brief Information about all modules recorded as unloaded when the snapshot -//! was taken. -//! -//! A list of MINIDUMP_UNLOADED_MODULE structures will immediately follow in the -//! stream. -struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE_LIST { - //! \brief The size of the header information for the stream, in bytes. This - //! value is `sizeof(MINIDUMP_UNLOADED_MODULE_LIST)`. - uint32_t SizeOfHeader; - - //! \brief The size of a descriptor in the stream, in bytes. This value is - //! `sizeof(MINIDUMP_UNLOADED_MODULE)`. - uint32_t SizeOfEntry; - - //! \brief The number of entries in the stream. - uint32_t NumberOfEntries; -}; - -//! \brief Information about XSAVE-managed state stored within CPU-specific -//! context structures. -struct __attribute__((packed, aligned(4))) XSTATE_CONFIG_FEATURE_MSC_INFO { - //! \brief The size of this structure, in bytes. This value is - //! `sizeof(XSTATE_CONFIG_FEATURE_MSC_INFO)`. - uint32_t SizeOfInfo; - - //! \brief The size of a CPU-specific context structure carrying all XSAVE - //! state components described by this structure. - //! - //! Equivalent to the value returned by `InitializeContext()` in \a - //! ContextLength. - uint32_t ContextSize; - - //! \brief The XSAVE state-component bitmap, XSAVE_BV. - //! - //! See Intel Software Developer’s Manual, Volume 1: Basic Architecture - //! (253665-060), 13.4.2 “XSAVE Headerâ€. - uint64_t EnabledFeatures; - - //! \brief The location of each state component within a CPU-specific context - //! structure. - //! - //! This array is indexed by bit position numbers used in #EnabledFeatures. - XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; -}; - -//! \anchor MINIDUMP_MISCx -//! \name MINIDUMP_MISC* -//! -//! \brief Field validity flag values for MINIDUMP_MISC_INFO::Flags1. -//! \{ - -//! \brief MINIDUMP_MISC_INFO::ProcessId is valid. -#define MINIDUMP_MISC1_PROCESS_ID 0x00000001 - -//! \brief The time-related fields in MINIDUMP_MISC_INFO are valid. -//! -//! The following fields are valid: -//! - MINIDUMP_MISC_INFO::ProcessCreateTime -//! - MINIDUMP_MISC_INFO::ProcessUserTime -//! - MINIDUMP_MISC_INFO::ProcessKernelTime -#define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002 - -//! \brief The CPU-related fields in MINIDUMP_MISC_INFO_2 are valid. -//! -//! The following fields are valid: -//! - MINIDUMP_MISC_INFO_2::ProcessorMaxMhz -//! - MINIDUMP_MISC_INFO_2::ProcessorCurrentMhz -//! - MINIDUMP_MISC_INFO_2::ProcessorMhzLimit -//! - MINIDUMP_MISC_INFO_2::ProcessorMaxIdleState -//! - MINIDUMP_MISC_INFO_2::ProcessorCurrentIdleState -//! -//! \note This macro should likely have been named -//! MINIDUMP_MISC2_PROCESSOR_POWER_INFO. -#define MINIDUMP_MISC1_PROCESSOR_POWER_INFO 0x00000004 - -//! \brief MINIDUMP_MISC_INFO_3::ProcessIntegrityLevel is valid. -#define MINIDUMP_MISC3_PROCESS_INTEGRITY 0x00000010 - -//! \brief MINIDUMP_MISC_INFO_3::ProcessExecuteFlags is valid. -#define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS 0x00000020 - -//! \brief The time zone-related fields in MINIDUMP_MISC_INFO_3 are valid. -//! -//! The following fields are valid: -//! - MINIDUMP_MISC_INFO_3::TimeZoneId -//! - MINIDUMP_MISC_INFO_3::TimeZone -#define MINIDUMP_MISC3_TIMEZONE 0x00000040 - -//! \brief MINIDUMP_MISC_INFO_3::ProtectedProcess is valid. -#define MINIDUMP_MISC3_PROTECTED_PROCESS 0x00000080 - -//! \brief The build string-related fields in MINIDUMP_MISC_INFO_4 are valid. -//! -//! The following fields are valid: -//! - MINIDUMP_MISC_INFO_4::BuildString -//! - MINIDUMP_MISC_INFO_4::DbgBldStr -#define MINIDUMP_MISC4_BUILDSTRING 0x00000100 - -//! \brief MINIDUMP_MISC_INFO_5::ProcessCookie is valid. -#define MINIDUMP_MISC5_PROCESS_COOKIE 0x00000200 - -//! \} - -//! \brief Information about the process that the minidump file contains a -//! snapshot of, as well as the system that hosted that process. -//! -//! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" -//! \sa MINIDUMP_MISC_INFO_2 -//! \sa MINIDUMP_MISC_INFO_3 -//! \sa MINIDUMP_MISC_INFO_4 -//! \sa MINIDUMP_MISC_INFO_5 -//! \sa MINIDUMP_MISC_INFO_N -struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO { - //! \brief The size of the structure. - //! - //! This field can be used to distinguish between different versions of this - //! structure: MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, MINIDUMP_MISC_INFO_3, - //! and MINIDUMP_MISC_INFO_4. - //! - //! \sa Flags1 - uint32_t SizeOfInfo; - - //! \brief A bit field of \ref MINIDUMP_MISCx "MINIDUMP_MISC*" values - //! indicating which fields of this structure contain valid data. - uint32_t Flags1; - - //! \brief The process ID of the process. - uint32_t ProcessId; - - //! \brief The time that the process started, in `time_t` units, seconds since - //! the POSIX epoch. - uint32_t ProcessCreateTime; - - //! \brief The amount of user-mode CPU time used by the process, in seconds, - //! at the time of the snapshot. - uint32_t ProcessUserTime; - - //! \brief The amount of system-mode (kernel) CPU time used by the process, in - //! seconds, at the time of the snapshot. - uint32_t ProcessKernelTime; -}; - -//! \brief Information about the process that the minidump file contains a -//! snapshot of, as well as the system that hosted that process. -//! -//! This structure variant is used on Windows Vista (NT 6.0) and later. -//! -//! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" -//! \sa MINIDUMP_MISC_INFO -//! \sa MINIDUMP_MISC_INFO_3 -//! \sa MINIDUMP_MISC_INFO_4 -//! \sa MINIDUMP_MISC_INFO_5 -//! \sa MINIDUMP_MISC_INFO_N -struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_2 - : public MINIDUMP_MISC_INFO { - //! \brief The maximum clock rate of the system’s CPU or CPUs, in MHz. - uint32_t ProcessorMaxMhz; - - //! \brief The clock rate of the system’s CPU or CPUs, in MHz, at the time of - //! the snapshot. - uint32_t ProcessorCurrentMhz; - - //! \brief The maximum clock rate of the system’s CPU or CPUs, in MHz, reduced - //! by any thermal limitations, at the time of the snapshot. - uint32_t ProcessorMhzLimit; - - //! \brief The maximum idle state of the system’s CPU or CPUs. - uint32_t ProcessorMaxIdleState; - - //! \brief The idle state of the system’s CPU or CPUs at the time of the - //! snapshot. - uint32_t ProcessorCurrentIdleState; -}; - -//! \brief Information about the process that the minidump file contains a -//! snapshot of, as well as the system that hosted that process. -//! -//! This structure variant is used on Windows 7 (NT 6.1) and later. -//! -//! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" -//! \sa MINIDUMP_MISC_INFO -//! \sa MINIDUMP_MISC_INFO_2 -//! \sa MINIDUMP_MISC_INFO_4 -//! \sa MINIDUMP_MISC_INFO_5 -//! \sa MINIDUMP_MISC_INFO_N -struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_3 - : public MINIDUMP_MISC_INFO_2 { - //! \brief The process’ integrity level. - //! - //! Windows typically uses `SECURITY_MANDATORY_MEDIUM_RID` (0x2000) for - //! processes belonging to normal authenticated users and - //! `SECURITY_MANDATORY_HIGH_RID` (0x3000) for elevated processes. - //! - //! This field is Windows-specific, and has no meaning on other operating - //! systems. - uint32_t ProcessIntegrityLevel; - - //! \brief The process’ execute flags. - //! - //! On Windows, this appears to be returned by `NtQueryInformationProcess()` - //! with an argument of `ProcessExecuteFlags` (34). - //! - //! This field is Windows-specific, and has no meaning on other operating - //! systems. - uint32_t ProcessExecuteFlags; - - //! \brief Whether the process is protected. - //! - //! This field is Windows-specific, and has no meaning on other operating - //! systems. - uint32_t ProtectedProcess; - - //! \brief Whether daylight saving time was being observed in the system’s - //! location at the time of the snapshot. - //! - //! This field can contain the following values: - //! - `0` if the location does not observe daylight saving time at all. The - //! TIME_ZONE_INFORMATION::StandardName field of #TimeZoneId contains the - //! time zone name. - //! - `1` if the location observes daylight saving time, but standard time - //! was in effect at the time of the snapshot. The - //! TIME_ZONE_INFORMATION::StandardName field of #TimeZoneId contains the - //! time zone name. - //! - `2` if the location observes daylight saving time, and it was in effect - //! at the time of the snapshot. The TIME_ZONE_INFORMATION::DaylightName - //! field of #TimeZoneId contains the time zone name. - //! - //! \sa #TimeZone - uint32_t TimeZoneId; - - //! \brief Information about the time zone at the system’s location. - //! - //! \sa #TimeZoneId - TIME_ZONE_INFORMATION TimeZone; -}; - -//! \brief Information about the process that the minidump file contains a -//! snapshot of, as well as the system that hosted that process. -//! -//! This structure variant is used on Windows 8 (NT 6.2) and later. -//! -//! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" -//! \sa MINIDUMP_MISC_INFO -//! \sa MINIDUMP_MISC_INFO_2 -//! \sa MINIDUMP_MISC_INFO_3 -//! \sa MINIDUMP_MISC_INFO_5 -//! \sa MINIDUMP_MISC_INFO_N -struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_4 - : public MINIDUMP_MISC_INFO_3 { - //! \brief The operating system’s “build stringâ€, a string identifying a - //! specific build of the operating system. - //! - //! This string is UTF-16-encoded and terminated by a UTF-16 `NUL` code unit. - //! - //! On Windows 8.1 (NT 6.3), this is “6.3.9600.17031 - //! (winblue_gdr.140221-1952)â€. - base::char16 BuildString[260]; - - //! \brief The minidump producer’s “build stringâ€, a string identifying the - //! module that produced a minidump file. - //! - //! This string is UTF-16-encoded and terminated by a UTF-16 `NUL` code unit. - //! - //! On Windows 8.1 (NT 6.3), this may be “dbghelp.i386,6.3.9600.16520†or - //! “dbghelp.amd64,6.3.9600.16520†depending on CPU architecture. - base::char16 DbgBldStr[40]; -}; - -//! \brief Information about the process that the minidump file contains a -//! snapshot of, as well as the system that hosted that process. -//! -//! This structure variant is used on Windows 10 and later. -//! -//! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" -//! \sa MINIDUMP_MISC_INFO -//! \sa MINIDUMP_MISC_INFO_2 -//! \sa MINIDUMP_MISC_INFO_3 -//! \sa MINIDUMP_MISC_INFO_4 -//! \sa MINIDUMP_MISC_INFO_N -struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_5 - : public MINIDUMP_MISC_INFO_4 { - //! \brief Information about XSAVE-managed state stored within CPU-specific - //! context structures. - //! - //! This information can be used to locate state components within - //! CPU-specific context structures. - XSTATE_CONFIG_FEATURE_MSC_INFO XStateData; - - uint32_t ProcessCookie; -}; - -//! \brief The latest known version of the MINIDUMP_MISC_INFO structure. -typedef MINIDUMP_MISC_INFO_5 MINIDUMP_MISC_INFO_N; - -//! \brief Describes a region of memory. -struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO { - //! \brief The base address of the region of pages. - uint64_t BaseAddress; - - //! \brief The base address of a range of pages in this region. The page is - //! contained within this memory region. - uint64_t AllocationBase; - - //! \brief The memory protection when the region was initially allocated. This - //! member can be one of the memory protection options (such as - //! \ref PAGE_x "PAGE_EXECUTE", \ref PAGE_x "PAGE_NOACCESS", etc.), along - //! with \ref PAGE_x "PAGE_GUARD" or \ref PAGE_x "PAGE_NOCACHE", as - //! needed. - uint32_t AllocationProtect; - - uint32_t __alignment1; - - //! \brief The size of the region beginning at the base address in which all - //! pages have identical attributes, in bytes. - uint64_t RegionSize; - - //! \brief The state of the pages in the region. This can be one of - //! \ref MEM_x "MEM_COMMIT", \ref MEM_x "MEM_FREE", or \ref MEM_x - //! "MEM_RESERVE". - uint32_t State; - - //! \brief The access protection of the pages in the region. This member is - //! one of the values listed for the #AllocationProtect member. - uint32_t Protect; - - //! \brief The type of pages in the region. This can be one of \ref MEM_x - //! "MEM_IMAGE", \ref MEM_x "MEM_MAPPED", or \ref MEM_x "MEM_PRIVATE". - uint32_t Type; - - uint32_t __alignment2; -}; - -//! \brief Contains a list of memory regions. -struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO_LIST { - //! \brief The size of the header data for the stream, in bytes. This is - //! generally sizeof(MINIDUMP_MEMORY_INFO_LIST). - uint32_t SizeOfHeader; - - //! \brief The size of each entry following the header, in bytes. This is - //! generally sizeof(MINIDUMP_MEMORY_INFO). - uint32_t SizeOfEntry; - - //! \brief The number of entries in the stream. These are generally - //! MINIDUMP_MEMORY_INFO structures. The entries follow the header. - uint64_t NumberOfEntries; -}; - -//! \brief Minidump file type values for MINIDUMP_HEADER::Flags. These bits -//! describe the types of data carried within a minidump file. -enum MINIDUMP_TYPE { - //! \brief A minidump file without any additional data. - //! - //! This type of minidump file contains: - //! - A MINIDUMP_SYSTEM_INFO stream. - //! - A MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, MINIDUMP_MISC_INFO_3, or - //! MINIDUMP_MISC_INFO_4 stream, depending on which fields are present. - //! - A MINIDUMP_THREAD_LIST stream. All threads are present, along with a - //! snapshot of each thread’s stack memory sufficient to obtain backtraces. - //! - If the minidump file was generated as a result of an exception, a - //! MINIDUMP_EXCEPTION_STREAM describing the exception. - //! - A MINIDUMP_MODULE_LIST stream. All loaded modules are present. - //! - Typically, a MINIDUMP_MEMORY_LIST stream containing duplicate pointers - //! to the stack memory regions also referenced by the MINIDUMP_THREAD_LIST - //! stream. This type of minidump file also includes a - //! MINIDUMP_MEMORY_DESCRIPTOR containing the 256 bytes centered around - //! the exception address or the instruction pointer. - MiniDumpNormal = 0x00000000, -}; - -#endif // CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ diff --git a/Tools/Crashpad/include/compat/non_win/minwinbase.h b/Tools/Crashpad/include/compat/non_win/minwinbase.h deleted file mode 100644 index 2761b1cccd..0000000000 --- a/Tools/Crashpad/include/compat/non_win/minwinbase.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_WIN_MINWINBASE_H_ -#define CRASHPAD_COMPAT_NON_WIN_MINWINBASE_H_ - -#include <stdint.h> - -//! \brief Represents a date and time. -struct SYSTEMTIME { - //! \brief The year, represented fully. - //! - //! The year 2014 would be represented in this field as `2014`. - uint16_t wYear; - - //! \brief The month of the year, `1` for January and `12` for December. - uint16_t wMonth; - - //! \brief The day of the week, `0` for Sunday and `6` for Saturday. - uint16_t wDayOfWeek; - - //! \brief The day of the month, `1` through `31`. - uint16_t wDay; - - //! \brief The hour of the day, `0` through `23`. - uint16_t wHour; - - //! \brief The minute of the hour, `0` through `59`. - uint16_t wMinute; - - //! \brief The second of the minute, `0` through `60`. - uint16_t wSecond; - - //! \brief The millisecond of the second, `0` through `999`. - uint16_t wMilliseconds; -}; - -#endif // CRASHPAD_COMPAT_NON_WIN_MINWINBASE_H_ diff --git a/Tools/Crashpad/include/compat/non_win/timezoneapi.h b/Tools/Crashpad/include/compat/non_win/timezoneapi.h deleted file mode 100644 index 59efae286d..0000000000 --- a/Tools/Crashpad/include/compat/non_win/timezoneapi.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_WIN_TIMEZONEAPI_H_ -#define CRASHPAD_COMPAT_NON_WIN_TIMEZONEAPI_H_ - -#include <stdint.h> - -#include "base/strings/string16.h" -#include "compat/non_win/minwinbase.h" - -//! \brief Information about a time zone and its daylight saving rules. -struct TIME_ZONE_INFORMATION { - //! \brief The number of minutes west of UTC. - int32_t Bias; - - //! \brief The UTF-16-encoded name of the time zone when observing standard - //! time. - base::char16 StandardName[32]; - - //! \brief The date and time to switch from daylight saving time to standard - //! time. - //! - //! This can be a specific time, or with SYSTEMTIME::wYear set to `0`, it can - //! reflect an annual recurring transition. In that case, SYSTEMTIME::wDay in - //! the range `1` to `5` is interpreted as the given occurrence of - //! SYSTEMTIME::wDayOfWeek within the month, `1` being the first occurrence - //! and `5` being the last (even if there are fewer than 5). - SYSTEMTIME StandardDate; - - //! \brief The bias relative to #Bias to be applied when observing standard - //! time. - int32_t StandardBias; - - //! \brief The UTF-16-encoded name of the time zone when observing daylight - //! saving time. - base::char16 DaylightName[32]; - - //! \brief The date and time to switch from standard time to daylight saving - //! time. - //! - //! This field is specified in the same manner as #StandardDate. - SYSTEMTIME DaylightDate; - - //! \brief The bias relative to #Bias to be applied when observing daylight - //! saving time. - int32_t DaylightBias; -}; - -#endif // CRASHPAD_COMPAT_NON_WIN_TIMEZONEAPI_H_ diff --git a/Tools/Crashpad/include/compat/non_win/verrsrc.h b/Tools/Crashpad/include/compat/non_win/verrsrc.h deleted file mode 100644 index 70f5344240..0000000000 --- a/Tools/Crashpad/include/compat/non_win/verrsrc.h +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_WIN_VERRSRC_H_ -#define CRASHPAD_COMPAT_NON_WIN_VERRSRC_H_ - -#include <stdint.h> - -//! \file - -//! \brief The magic number for a VS_FIXEDFILEINFO structure, stored in -//! VS_FIXEDFILEINFO::dwSignature. -#define VS_FFI_SIGNATURE 0xfeef04bd - -//! \brief The version of a VS_FIXEDFILEINFO structure, stored in -//! VS_FIXEDFILEINFO::dwStrucVersion. -#define VS_FFI_STRUCVERSION 0x00010000 - -//! \anchor VS_FF_x -//! \name VS_FF_* -//! -//! \brief File attribute values for VS_FIXEDFILEINFO::dwFileFlags and -//! VS_FIXEDFILEINFO::dwFileFlagsMask. -//! \{ -#define VS_FF_DEBUG 0x00000001 -#define VS_FF_PRERELEASE 0x00000002 -#define VS_FF_PATCHED 0x00000004 -#define VS_FF_PRIVATEBUILD 0x00000008 -#define VS_FF_INFOINFERRED 0x00000010 -#define VS_FF_SPECIALBUILD 0x00000020 -//! \} - -//! \anchor VOS_x -//! \name VOS_* -//! -//! \brief Operating system values for VS_FIXEDFILEINFO::dwFileOS. -//! \{ -#define VOS_UNKNOWN 0x00000000 -#define VOS_DOS 0x00010000 -#define VOS_OS216 0x00020000 -#define VOS_OS232 0x00030000 -#define VOS_NT 0x00040000 -#define VOS_WINCE 0x00050000 -#define VOS__BASE 0x00000000 -#define VOS__WINDOWS16 0x00000001 -#define VOS__PM16 0x00000002 -#define VOS__PM32 0x00000003 -#define VOS__WINDOWS32 0x00000004 -#define VOS_DOS_WINDOWS16 0x00010001 -#define VOS_DOS_WINDOWS32 0x00010004 -#define VOS_OS216_PM16 0x00020002 -#define VOS_OS232_PM32 0x00030003 -#define VOS_NT_WINDOWS32 0x00040004 -//! \} - -//! \anchor VFT_x -//! \name VFT_* -//! -//! \brief File type values for VS_FIXEDFILEINFO::dwFileType. -//! \{ -#define VFT_UNKNOWN 0x00000000 -#define VFT_APP 0x00000001 -#define VFT_DLL 0x00000002 -#define VFT_DRV 0x00000003 -#define VFT_FONT 0x00000004 -#define VFT_VXD 0x00000005 -#define VFT_STATIC_LIB 0x00000007 -//! \} - -//! \anchor VFT2_x -//! \name VFT2_* -//! -//! \brief File subtype values for VS_FIXEDFILEINFO::dwFileSubtype. -//! \{ -#define VFT2_UNKNOWN 0x00000000 -#define VFT2_DRV_PRINTER 0x00000001 -#define VFT2_DRV_KEYBOARD 0x00000002 -#define VFT2_DRV_LANGUAGE 0x00000003 -#define VFT2_DRV_DISPLAY 0x00000004 -#define VFT2_DRV_MOUSE 0x00000005 -#define VFT2_DRV_NETWORK 0x00000006 -#define VFT2_DRV_SYSTEM 0x00000007 -#define VFT2_DRV_INSTALLABLE 0x00000008 -#define VFT2_DRV_SOUND 0x00000009 -#define VFT2_DRV_COMM 0x0000000A -#define VFT2_DRV_INPUTMETHOD 0x0000000B -#define VFT2_DRV_VERSIONED_PRINTER 0x0000000C -#define VFT2_FONT_RASTER 0x00000001 -#define VFT2_FONT_VECTOR 0x00000002 -#define VFT2_FONT_TRUETYPE 0x00000003 -//! \} - -//! \brief Version information for a file. -//! -//! On Windows, this information is derived from a file’s version information -//! resource, and is obtained by calling `VerQueryValue()` with an `lpSubBlock` -//! argument of `"\"` (a single backslash). -struct VS_FIXEDFILEINFO { - //! \brief The structure’s magic number, ::VS_FFI_SIGNATURE. - uint32_t dwSignature; - - //! \brief The structure’s version, ::VS_FFI_STRUCVERSION. - uint32_t dwStrucVersion; - - //! \brief The more-significant portion of the file’s version number. - //! - //! This field contains the first two components of a four-component version - //! number. For a file whose version is 1.2.3.4, this field would be - //! `0x00010002`. - //! - //! \sa dwFileVersionLS - uint32_t dwFileVersionMS; - - //! \brief The less-significant portion of the file’s version number. - //! - //! This field contains the last two components of a four-component version - //! number. For a file whose version is 1.2.3.4, this field would be - //! `0x00030004`. - //! - //! \sa dwFileVersionMS - uint32_t dwFileVersionLS; - - //! \brief The more-significant portion of the product’s version number. - //! - //! This field contains the first two components of a four-component version - //! number. For a product whose version is 1.2.3.4, this field would be - //! `0x00010002`. - //! - //! \sa dwProductVersionLS - uint32_t dwProductVersionMS; - - //! \brief The less-significant portion of the product’s version number. - //! - //! This field contains the last two components of a four-component version - //! number. For a product whose version is 1.2.3.4, this field would be - //! `0x00030004`. - //! - //! \sa dwProductVersionMS - uint32_t dwProductVersionLS; - - //! \brief A bitmask of \ref VS_FF_x "VS_FF_*" values indicating which bits in - //! #dwFileFlags are valid. - uint32_t dwFileFlagsMask; - - //! \brief A bitmask of \ref VS_FF_x "VS_FF_*" values identifying attributes - //! of the file. Only bits present in #dwFileFlagsMask are valid. - uint32_t dwFileFlags; - - //! \brief The file’s intended operating system, a value of \ref VOS_x - //! "VOS_*". - uint32_t dwFileOS; - - //! \brief The file’s type, a value of \ref VFT_x "VFT_*". - uint32_t dwFileType; - - //! \brief The file’s subtype, a value of \ref VFT2_x "VFT2_*" corresponding - //! to its #dwFileType, if the file type has subtypes. - uint32_t dwFileSubtype; - - //! \brief The more-significant portion of the file’s creation date. - //! - //! The intended encoding of this field is unknown. This field is unused and - //! always has the value `0`. - uint32_t dwFileDateMS; - - //! \brief The less-significant portion of the file’s creation date. - //! - //! The intended encoding of this field is unknown. This field is unused and - //! always has the value `0`. - uint32_t dwFileDateLS; -}; - -#endif // CRASHPAD_COMPAT_NON_WIN_VERRSRC_H_ diff --git a/Tools/Crashpad/include/compat/non_win/windows.h b/Tools/Crashpad/include/compat/non_win/windows.h deleted file mode 100644 index 4577451493..0000000000 --- a/Tools/Crashpad/include/compat/non_win/windows.h +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// dbghelp.h on Windows requires inclusion of windows.h before it. To avoid -// cluttering all inclusions of dbghelp.h with #ifdefs, always include windows.h -// and have an empty one on non-Windows platforms. diff --git a/Tools/Crashpad/include/compat/non_win/winnt.h b/Tools/Crashpad/include/compat/non_win/winnt.h deleted file mode 100644 index f2ed6ace07..0000000000 --- a/Tools/Crashpad/include/compat/non_win/winnt.h +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_NON_WIN_WINNT_H_ -#define CRASHPAD_COMPAT_NON_WIN_WINNT_H_ - -#include <stdint.h> - -//! \file - -//! \anchor VER_SUITE_x -//! \name VER_SUITE_* -//! -//! \brief Installable product values for MINIDUMP_SYSTEM_INFO::SuiteMask. -//! \{ -#define VER_SUITE_SMALLBUSINESS 0x0001 -#define VER_SUITE_ENTERPRISE 0x0002 -#define VER_SUITE_BACKOFFICE 0x0004 -#define VER_SUITE_COMMUNICATIONS 0x0008 -#define VER_SUITE_TERMINAL 0x0010 -#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x0020 -#define VER_SUITE_EMBEDDEDNT 0x0040 -#define VER_SUITE_DATACENTER 0x0080 -#define VER_SUITE_SINGLEUSERTS 0x0100 -#define VER_SUITE_PERSONAL 0x0200 -#define VER_SUITE_BLADE 0x0400 -#define VER_SUITE_EMBEDDED_RESTRICTED 0x0800 -#define VER_SUITE_SECURITY_APPLIANCE 0x1000 -#define VER_SUITE_STORAGE_SERVER 0x2000 -#define VER_SUITE_COMPUTE_SERVER 0x4000 -#define VER_SUITE_WH_SERVER 0x8000 -//! \} - -//! \brief The maximum number of exception parameters present in the -//! MINIDUMP_EXCEPTION::ExceptionInformation array. -#define EXCEPTION_MAXIMUM_PARAMETERS 15 - -//! \anchor PROCESSOR_ARCHITECTURE_x -//! \name PROCESSOR_ARCHITECTURE_* -//! -//! \brief CPU type values for MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. -//! -//! \sa crashpad::MinidumpCPUArchitecture -//! \{ -#define PROCESSOR_ARCHITECTURE_INTEL 0 -#define PROCESSOR_ARCHITECTURE_MIPS 1 -#define PROCESSOR_ARCHITECTURE_ALPHA 2 -#define PROCESSOR_ARCHITECTURE_PPC 3 -#define PROCESSOR_ARCHITECTURE_SHX 4 -#define PROCESSOR_ARCHITECTURE_ARM 5 -#define PROCESSOR_ARCHITECTURE_IA64 6 -#define PROCESSOR_ARCHITECTURE_ALPHA64 7 -#define PROCESSOR_ARCHITECTURE_MSIL 8 -#define PROCESSOR_ARCHITECTURE_AMD64 9 -#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 -#define PROCESSOR_ARCHITECTURE_NEUTRAL 11 -#define PROCESSOR_ARCHITECTURE_ARM64 12 -#define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 -#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xffff -//! \} - -//! \anchor PF_x -//! \name PF_* -//! -//! \brief CPU feature values for \ref CPU_INFORMATION::ProcessorFeatures -//! "CPU_INFORMATION::OtherCpuInfo::ProcessorFeatures". -//! -//! \{ -#define PF_FLOATING_POINT_PRECISION_ERRATA 0 -#define PF_FLOATING_POINT_EMULATED 1 -#define PF_COMPARE_EXCHANGE_DOUBLE 2 -#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 -#define PF_PPC_MOVEMEM_64BIT_OK 4 -#define PF_ALPHA_BYTE_INSTRUCTIONS 5 -#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 -#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 -#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 -#define PF_PAE_ENABLED 9 -#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 -#define PF_SSE_DAZ_MODE_AVAILABLE 11 -#define PF_NX_ENABLED 12 -#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 -#define PF_COMPARE_EXCHANGE128 14 -#define PF_COMPARE64_EXCHANGE128 15 -#define PF_CHANNELS_ENABLED 16 -#define PF_XSAVE_ENABLED 17 -#define PF_ARM_VFP_32_REGISTERS_AVAILABLE 18 -#define PF_ARM_NEON_INSTRUCTIONS_AVAILABLE 19 -#define PF_SECOND_LEVEL_ADDRESS_TRANSLATION 20 -#define PF_VIRT_FIRMWARE_ENABLED 21 -#define PF_RDWRFSGSBASE_AVAILABLE 22 -#define PF_FASTFAIL_AVAILABLE 23 -#define PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE 24 -#define PF_ARM_64BIT_LOADSTORE_ATOMIC 25 -#define PF_ARM_EXTERNAL_CACHE_AVAILABLE 26 -#define PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE 27 -#define PF_RDRAND_INSTRUCTION_AVAILABLE 28 -#define PF_ARM_V8_INSTRUCTIONS_AVAILABLE 29 -#define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30 -#define PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE 31 -#define PF_RDTSCP_INSTRUCTION_AVAILABLE 32 -//! \} - -//! \anchor PAGE_x -//! \name PAGE_* -//! -//! \brief Memory protection constants for MINIDUMP_MEMORY_INFO::Protect and -//! MINIDUMP_MEMORY_INFO::AllocationProtect. -//! \{ -#define PAGE_NOACCESS 0x1 -#define PAGE_READONLY 0x2 -#define PAGE_READWRITE 0x4 -#define PAGE_WRITECOPY 0x8 -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 -//! \} - -//! \anchor MEM_x -//! \name MEM_* -//! -//! \brief Memory state and type constants for MINIDUMP_MEMORY_INFO::State and -//! MINIDUMP_MEMORY_INFO::Type. -//! \{ -#define MEM_COMMIT 0x1000 -#define MEM_RESERVE 0x2000 -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 -#define MEM_FREE 0x10000 -#define MEM_PRIVATE 0x20000 -#define MEM_MAPPED 0x40000 -#define MEM_RESET 0x80000 -//! \} - -//! \brief The maximum number of distinct identifiable features that could -//! possibly be carried in an XSAVE area. -//! -//! This corresponds to the number of bits in the XSAVE state-component bitmap, -//! XSAVE_BV. See Intel Software Developer’s Manual, Volume 1: Basic -//! Architecture (253665-060), 13.4.2 “XSAVE Headerâ€. -#define MAXIMUM_XSTATE_FEATURES (64) - -//! \brief The location of a single state component within an XSAVE area. -struct XSTATE_FEATURE { - //! \brief The location of a state component within a CPU-specific context - //! structure. - //! - //! This is equivalent to the difference (`ptrdiff_t`) between the return - //! value of `LocateXStateFeature()` and its \a Context argument. - uint32_t Offset; - - //! \brief The size of a state component with a CPU-specific context - //! structure. - //! - //! This is equivalent to the size returned by `LocateXStateFeature()` in \a - //! Length. - uint32_t Size; -}; - -//! \anchor IMAGE_DEBUG_MISC_x -//! \name IMAGE_DEBUG_MISC_* -//! -//! Data type values for IMAGE_DEBUG_MISC::DataType. -//! \{ - -//! \brief A pointer to a `.dbg` file. -//! -//! IMAGE_DEBUG_MISC::Data will contain the path or file name of the `.dbg` file -//! associated with the module. -#define IMAGE_DEBUG_MISC_EXENAME 1 - -//! \} - -//! \brief Miscellaneous debugging record. -//! -//! This structure is referenced by MINIDUMP_MODULE::MiscRecord. It is obsolete, -//! superseded by the CodeView record. -struct IMAGE_DEBUG_MISC { - //! \brief The type of data carried in the #Data field. - //! - //! This is a value of \ref IMAGE_DEBUG_MISC_x "IMAGE_DEBUG_MISC_*". - uint32_t DataType; - - //! \brief The length of this structure in bytes, including the entire #Data - //! field and its `NUL` terminator. - //! - //! \note The Windows documentation states that this field is rounded up to - //! nearest nearest 4-byte multiple. - uint32_t Length; - - //! \brief The encoding of the #Data field. - //! - //! If this field is `0`, #Data contains narrow or multibyte character data. - //! If this field is `1`, #Data is UTF-16-encoded. - //! - //! On Windows, with this field set to `0`, #Data will be encoded in the code - //! page of the system that linked the module. On other operating systems, - //! UTF-8 may be used. - uint8_t Unicode; - - uint8_t Reserved[3]; - - //! \brief The data carried within this structure. - //! - //! For string data, this field will be `NUL`-terminated. If #Unicode is `1`, - //! this field is UTF-16-encoded, and will be terminated by a UTF-16 `NUL` - //! code unit (two `NUL` bytes). - uint8_t Data[1]; -}; - -//! \anchor VER_NT_x -//! \name VER_NT_* -//! -//! \brief Operating system type values for MINIDUMP_SYSTEM_INFO::ProductType. -//! -//! \sa crashpad::MinidumpOSType -//! \{ -#define VER_NT_WORKSTATION 1 -#define VER_NT_DOMAIN_CONTROLLER 2 -#define VER_NT_SERVER 3 -//! \} - -//! \anchor VER_PLATFORM_x -//! \name VER_PLATFORM_* -//! -//! \brief Operating system family values for MINIDUMP_SYSTEM_INFO::PlatformId. -//! -//! \sa crashpad::MinidumpOS -//! \{ -#define VER_PLATFORM_WIN32s 0 -#define VER_PLATFORM_WIN32_WINDOWS 1 -#define VER_PLATFORM_WIN32_NT 2 -//! \} - -#endif // CRASHPAD_COMPAT_NON_WIN_WINNT_H_ diff --git a/Tools/Crashpad/include/compat/win/getopt.h b/Tools/Crashpad/include/compat/win/getopt.h deleted file mode 100644 index 45fcbccc39..0000000000 --- a/Tools/Crashpad/include/compat/win/getopt.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_GETOPT_H_ -#define CRASHPAD_COMPAT_WIN_GETOPT_H_ - -#include "third_party/getopt/getopt.h" - -#endif // CRASHPAD_COMPAT_WIN_GETOPT_H_ diff --git a/Tools/Crashpad/include/compat/win/strings.h b/Tools/Crashpad/include/compat/win/strings.h deleted file mode 100644 index 50360b16d7..0000000000 --- a/Tools/Crashpad/include/compat/win/strings.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_STRINGS_H_ -#define CRASHPAD_COMPAT_WIN_STRINGS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -int strcasecmp(const char* s1, const char* s2); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // CRASHPAD_COMPAT_WIN_STRINGS_H_ diff --git a/Tools/Crashpad/include/compat/win/sys/time.h b/Tools/Crashpad/include/compat/win/sys/time.h deleted file mode 100644 index 71ddcdc21f..0000000000 --- a/Tools/Crashpad/include/compat/win/sys/time.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_SYS_TIME_H_ -#define CRASHPAD_COMPAT_WIN_SYS_TIME_H_ - -#include <winsock2.h> - -#endif // CRASHPAD_COMPAT_WIN_SYS_TIME_H_ diff --git a/Tools/Crashpad/include/compat/win/sys/types.h b/Tools/Crashpad/include/compat/win/sys/types.h deleted file mode 100644 index e8fae88f4a..0000000000 --- a/Tools/Crashpad/include/compat/win/sys/types.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_SYS_TYPES_H_ -#define CRASHPAD_COMPAT_WIN_SYS_TYPES_H_ - -// This is intended to be roughly equivalent to #include_next. -#include <../ucrt/sys/types.h> - -#include <stdint.h> - -#endif // CRASHPAD_COMPAT_WIN_SYS_TYPES_H_ diff --git a/Tools/Crashpad/include/compat/win/time.h b/Tools/Crashpad/include/compat/win/time.h deleted file mode 100644 index 37048daf71..0000000000 --- a/Tools/Crashpad/include/compat/win/time.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_TIME_H_ -#define CRASHPAD_COMPAT_WIN_TIME_H_ - -// This is intended to be roughly equivalent to #include_next. -#include <../ucrt/time.h> - -#ifdef __cplusplus -extern "C" { -#endif - -struct tm* gmtime_r(const time_t* timep, struct tm* result); - -struct tm* localtime_r(const time_t* timep, struct tm* result); - -const char* strptime(const char* buf, const char* format, struct tm* tm); - -time_t timegm(struct tm* tm); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // CRASHPAD_COMPAT_WIN_TIME_H_ diff --git a/Tools/Crashpad/include/compat/win/winbase.h b/Tools/Crashpad/include/compat/win/winbase.h deleted file mode 100644 index ffd850bf28..0000000000 --- a/Tools/Crashpad/include/compat/win/winbase.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_WINBASE_H_ -#define CRASHPAD_COMPAT_WIN_WINBASE_H_ - -// include_next <winbase.h> -#include <../um/winbase.h> - -// 10.0.15063.0 SDK - -#ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE -#define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE (0x2) -#endif - -#endif // CRASHPAD_COMPAT_WIN_WINBASE_H_ diff --git a/Tools/Crashpad/include/compat/win/winnt.h b/Tools/Crashpad/include/compat/win/winnt.h deleted file mode 100644 index 34ea80f91c..0000000000 --- a/Tools/Crashpad/include/compat/win/winnt.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_WINNT_H_ -#define CRASHPAD_COMPAT_WIN_WINNT_H_ - -// include_next <winnt.h> -#include <../um/winnt.h> - -// https://msdn.microsoft.com/library/aa373184.aspx: "Note that this structure -// definition was accidentally omitted from WinNT.h." -struct PROCESSOR_POWER_INFORMATION { - ULONG Number; - ULONG MaxMhz; - ULONG CurrentMhz; - ULONG MhzLimit; - ULONG MaxIdleState; - ULONG CurrentIdleState; -}; - -// 10.0.10240.0 SDK - -#ifndef PROCESSOR_ARCHITECTURE_ARM64 -#define PROCESSOR_ARCHITECTURE_ARM64 12 -#endif - -#ifndef PF_ARM_V8_INSTRUCTIONS_AVAILABLE -#define PF_ARM_V8_INSTRUCTIONS_AVAILABLE 29 -#endif - -#ifndef PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE -#define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30 -#endif - -#ifndef PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE -#define PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE 31 -#endif - -#ifndef PF_RDTSCP_INSTRUCTION_AVAILABLE -#define PF_RDTSCP_INSTRUCTION_AVAILABLE 32 -#endif - -// 10.0.14393.0 SDK - -#ifndef PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 -#define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 -#endif - -#endif // CRASHPAD_COMPAT_WIN_WINNT_H_ diff --git a/Tools/Crashpad/include/compat/win/winternl.h b/Tools/Crashpad/include/compat/win/winternl.h deleted file mode 100644 index ee4f53c654..0000000000 --- a/Tools/Crashpad/include/compat/win/winternl.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_COMPAT_WIN_WINTERNL_H_ -#define CRASHPAD_COMPAT_WIN_WINTERNL_H_ - -// include_next <winternl.h> -#include <../um/winternl.h> - -// 10.0.16299.0 SDK - -typedef struct _CLIENT_ID CLIENT_ID; - -#endif // CRASHPAD_COMPAT_WIN_WINTERNL_H_ diff --git a/Tools/Crashpad/include/handler/crash_report_upload_thread.h b/Tools/Crashpad/include/handler/crash_report_upload_thread.h deleted file mode 100644 index cdd1502b7e..0000000000 --- a/Tools/Crashpad/include/handler/crash_report_upload_thread.h +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ -#define CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ - -#include <memory> -#include <string> - -#include "base/macros.h" -#include "client/crash_report_database.h" -#include "util/misc/uuid.h" -#include "util/stdlib/thread_safe_vector.h" -#include "util/thread/worker_thread.h" - -namespace crashpad { - -//! \brief A thread that processes pending crash reports in a -//! CrashReportDatabase by uploading them or marking them as completed -//! without upload, as desired. -//! -//! A producer of crash reports should notify an object of this class that a new -//! report has been added to the database by calling ReportPending(). -//! -//! Independently of being triggered by ReportPending(), objects of this class -//! can periodically examine the database for pending reports. This allows -//! failed upload attempts for reports left in the pending state to be retried. -//! It also catches reports that are added without a ReportPending() signal -//! being caught. This may happen if crash reports are added to the database by -//! other processes. -class CrashReportUploadThread : public WorkerThread::Delegate { - public: - //! \brief Options to be passed to the CrashReportUploadThread constructor. - struct Options { - //! Whether client identifying parameters like product name or version - //! should be added to the URL. - bool identify_client_via_url; - - //! Whether uploads should be throttled to a (currently hardcoded) rate. - bool rate_limit; - - //! Whether uploads should use `gzip` compression. - bool upload_gzip; - - //! Whether to periodically check for new pending reports not already known - //! to exist. When `false`, only an initial upload attempt will be made for - //! reports known to exist by having been added by the ReportPending() - //! method. No scans for new pending reports will be conducted. - bool watch_pending_reports; - }; - - //! \brief Constructs a new object. - //! - //! \param[in] database The database to upload crash reports from. - //! \param[in] url The URL of the server to upload crash reports to. - //! \param[in] options Options for the report uploads. - CrashReportUploadThread(CrashReportDatabase* database, - const std::string& url, - const Options& options); - ~CrashReportUploadThread(); - - //! \brief Starts a dedicated upload thread, which executes ThreadMain(). - //! - //! This method may only be be called on a newly-constructed object or after - //! a call to Stop(). - void Start(); - - //! \brief Stops the upload thread. - //! - //! The upload thread will terminate after completing whatever task it is - //! performing. If it is not performing any task, it will terminate - //! immediately. This method blocks while waiting for the upload thread to - //! terminate. - //! - //! This method must only be called after Start(). If Start() has been called, - //! this method must be called before destroying an object of this class. - //! - //! This method may be called from any thread other than the upload thread. - //! It is expected to only be called from the same thread that called Start(). - void Stop(); - - //! \brief Informs the upload thread that a new pending report has been added - //! to the database. - //! - //! \param[in] report_uuid The unique identifier of the newly added pending - //! report. - //! - //! This method may be called from any thread. - void ReportPending(const UUID& report_uuid); - - private: - //! \brief The result code from UploadReport(). - enum class UploadResult { - //! \brief The crash report was uploaded successfully. - kSuccess, - - //! \brief The crash report upload failed in such a way that recovery is - //! impossible. - //! - //! No further upload attempts should be made for the report. - kPermanentFailure, - - //! \brief The crash report upload failed, but it might succeed again if - //! retried in the future. - //! - //! If the report has not already been retried too many times, the caller - //! may arrange to call UploadReport() for the report again in the future, - //! after a suitable delay. - kRetry, - }; - - //! \brief Calls ProcessPendingReport() on pending reports. - //! - //! Assuming Stop() has not been called, this will process reports that the - //! object has been made aware of in ReportPending(). Additionally, if the - //! object was constructed with \a watch_pending_reports, it will also scan - //! the crash report database for other pending reports, and process those as - //! well. - void ProcessPendingReports(); - - //! \brief Processes a single pending report from the database. - //! - //! \param[in] report The crash report to process. - //! - //! If report upload is enabled, this method attempts to upload \a report by - //! calling UplaodReport(). If the upload is successful, the report will be - //! marked as “completed†in the database. If the upload fails and more - //! retries are desired, the report’s upload-attempt count and - //! last-upload-attempt time will be updated in the database and it will - //! remain in the “pending†state. If the upload fails and no more retries are - //! desired, or report upload is disabled, it will be marked as “completed†in - //! the database without ever having been uploaded. - void ProcessPendingReport(const CrashReportDatabase::Report& report); - - //! \brief Attempts to upload a crash report. - //! - //! \param[in] report The report to upload. The caller is responsible for - //! calling CrashReportDatabase::GetReportForUploading() before calling - //! this method, and for calling - //! CrashReportDatabase::RecordUploadAttempt() after calling this method. - //! \param[out] response_body If the upload attempt is successful, this will - //! be set to the response body sent by the server. Breakpad-type servers - //! provide the crash ID assigned by the server in the response body. - //! - //! \return A member of UploadResult indicating the result of the upload - //! attempt. - UploadResult UploadReport(const CrashReportDatabase::Report* report, - std::string* response_body); - - // WorkerThread::Delegate: - //! \brief Calls ProcessPendingReports() in response to ReportPending() having - //! been called on any thread, as well as periodically on a timer. - void DoWork(const WorkerThread* thread) override; - - const Options options_; - const std::string url_; - WorkerThread thread_; - ThreadSafeVector<UUID> known_pending_report_uuids_; - CrashReportDatabase* database_; // weak - - DISALLOW_COPY_AND_ASSIGN(CrashReportUploadThread); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ diff --git a/Tools/Crashpad/include/handler/fuchsia/crash_report_exception_handler.h b/Tools/Crashpad/include/handler/fuchsia/crash_report_exception_handler.h deleted file mode 100644 index c987a5dc22..0000000000 --- a/Tools/Crashpad/include/handler/fuchsia/crash_report_exception_handler.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ -#define CRASHPAD_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ - -#include <map> -#include <string> - -#include "base/macros.h" -#include "client/crash_report_database.h" -#include "handler/crash_report_upload_thread.h" -#include "handler/user_stream_data_source.h" - -namespace crashpad { - -//! \brief An exception handler that writes crash reports for exception messages -//! to a CrashReportDatabase. This class is not yet implemented. -class CrashReportExceptionHandler { - public: - //! \brief Creates a new object that will store crash reports in \a database. - //! - //! \param[in] database The database to store crash reports in. Weak. - //! \param[in] upload_thread The upload thread to notify when a new crash - //! report is written into \a database. - //! \param[in] process_annotations A map of annotations to insert as - //! process-level annotations into each crash report that is written. Do - //! not confuse this with module-level annotations, which are under the - //! control of the crashing process, and are used to implement Chrome's - //! "crash keys." Process-level annotations are those that are beyond the - //! control of the crashing process, which must reliably be set even if - //! the process crashes before it’s able to establish its own annotations. - //! To interoperate with Breakpad servers, the recommended practice is to - //! specify values for the `"prod"` and `"ver"` keys as process - //! annotations. - //! \param[in] user_stream_data_sources Data sources to be used to extend - //! crash reports. For each crash report that is written, the data sources - //! are called in turn. These data sources may contribute additional - //! minidump streams. `nullptr` if not required. - CrashReportExceptionHandler( - CrashReportDatabase* database, - CrashReportUploadThread* upload_thread, - const std::map<std::string, std::string>* process_annotations, - const UserStreamDataSources* user_stream_data_sources); - - ~CrashReportExceptionHandler(); - - private: - DISALLOW_COPY_AND_ASSIGN(CrashReportExceptionHandler); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ diff --git a/Tools/Crashpad/include/handler/fuchsia/exception_handler_server.h b/Tools/Crashpad/include/handler/fuchsia/exception_handler_server.h deleted file mode 100644 index b998ba9cf0..0000000000 --- a/Tools/Crashpad/include/handler/fuchsia/exception_handler_server.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ -#define CRASHPAD_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ - -#include "base/macros.h" - -namespace crashpad { - -class CrashReportExceptionHandler; - -//! \brief Runs the main exception-handling server in Crashpad's handler -//! process. This class is not yet implemented. -class ExceptionHandlerServer { - public: - //! \brief Constructs an ExceptionHandlerServer object. - ExceptionHandlerServer(); - ~ExceptionHandlerServer(); - - //! \brief Runs the exception-handling server. - //! - //! \param[in] handler The handler to which the exceptions are delegated when - //! they are caught in Run(). Ownership is not transferred. - void Run(CrashReportExceptionHandler* handler); - - private: - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ diff --git a/Tools/Crashpad/include/handler/handler_main.h b/Tools/Crashpad/include/handler/handler_main.h deleted file mode 100644 index af01dbe735..0000000000 --- a/Tools/Crashpad/include/handler/handler_main.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_HANDLER_MAIN_H_ -#define CRASHPAD_HANDLER_HANDLER_MAIN_H_ - -#include "handler/user_stream_data_source.h" - -namespace crashpad { - -//! \brief The `main()` of the `crashpad_handler` binary. -//! -//! This is exposed so that `crashpad_handler` can be embedded into another -//! binary, but called and used as if it were a standalone executable. -//! -//! \param[in] argc \a argc as passed to `main()`. -//! \param[in] argv \a argv as passed to `main()`. -//! \param[in] user_stream_sources An optional vector containing the -//! extensibility data sources to call on crash. Each time a minidump is -//! created, the sources are called in turn. Any streams returned are added -//! to the minidump. -int HandlerMain(int argc, - char* argv[], - const UserStreamDataSources* user_stream_sources); - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_HANDLER_MAIN_H_ diff --git a/Tools/Crashpad/include/handler/linux/exception_handler_server.h b/Tools/Crashpad/include/handler/linux/exception_handler_server.h deleted file mode 100644 index fcafb887a1..0000000000 --- a/Tools/Crashpad/include/handler/linux/exception_handler_server.h +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_LINUX_EXCEPTION_HANDLER_SERVER_H_ -#define CRASHPAD_HANDLER_LINUX_EXCEPTION_HANDLER_SERVER_H_ - -#include <stdint.h> -#include <sys/socket.h> - -#include <memory> -#include <unordered_map> - -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/linux/exception_handler_protocol.h" -#include "util/misc/address_types.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Abstract base class for deciding how the handler should `ptrace` a -//! client. -class PtraceStrategyDecider { - public: - virtual ~PtraceStrategyDecider() = default; - - //! \brief The possible return values for ChooseStrategy(). - enum class Strategy { - //! \brief An error occurred, with a message logged. - kError, - - //! \brief Ptrace cannot be used. - kNoPtrace, - - //! \brief The handler should `ptrace`-attach the client directly. - kDirectPtrace, - - //! \brief The client should `fork` a PtraceBroker for the handler. - kForkBroker, - }; - - //! \brief Chooses an appropriate `ptrace` strategy. - //! - //! \param[in] sock A socket conncted to a ExceptionHandlerClient. - //! \param[in] client_credentials The credentials for the connected client. - //! \return the chosen #Strategy. - virtual Strategy ChooseStrategy(int sock, - const ucred& client_credentials) = 0; - - protected: - PtraceStrategyDecider() = default; -}; - -//! \brief Runs the main exception-handling server in Crashpad’s handler -//! process. -class ExceptionHandlerServer { - public: - class Delegate { - public: - //! \brief Called on receipt of a crash dump request from a client. - //! - //! \param[in] client_process_id The process ID of the crashing client. - //! \param[in] exception_information_address The address in the client's - //! address space of an ExceptionInformation struct. - //! \return `true` on success. `false` on failure with a message logged. - virtual bool HandleException(pid_t client_process_id, - VMAddress exception_information_address) = 0; - - //! \brief Called on the receipt of a crash dump request from a client for a - //! crash that should be mediated by a PtraceBroker. - //! - //! \param[in] client_process_id The process ID of the crashing client. - //! \param[in] exception_information_address The address in the client's - //! address space of an ExceptionInformation struct. - //! \param[in] broker_sock A socket connected to the PtraceBroker. - //! \return `true` on success. `false` on failure with a message logged. - virtual bool HandleExceptionWithBroker( - pid_t client_process_id, - VMAddress exception_information_address, - int broker_sock) = 0; - - protected: - ~Delegate() {} - }; - - ExceptionHandlerServer(); - ~ExceptionHandlerServer(); - - //! \brief Sets the handler's PtraceStrategyDecider. - //! - //! If this method is not called, a default PtraceStrategyDecider will be - //! used. - void SetPtraceStrategyDecider(std::unique_ptr<PtraceStrategyDecider> decider); - - //! \brief Initializes this object. - //! - //! This method must be successfully called before Run(). - //! - //! \param[in] sock A socket on which to receive client requests. - //! \return `true` on success. `false` on failure with a message logged. - bool InitializeWithClient(ScopedFileHandle sock); - - //! \brief Runs the exception-handling server. - //! - //! This method must only be called once on an ExceptionHandlerServer object. - //! This method returns when there are no more client connections or Stop() - //! has been called. - //! - //! \param[in] delegate An object to send exceptions to. - void Run(Delegate* delegate); - - //! \brief Stops a running exception-handling server. - //! - //! Stop() may be called at any time, and may be called from a signal handler. - //! If Stop() is called before Run() it will cause Run() to return as soon as - //! it is called. It is harmless to call Stop() after Run() has already - //! returned, or to call Stop() after it has already been called. - void Stop(); - - private: - struct Event; - - void HandleEvent(Event* event, uint32_t event_type); - bool InstallClientSocket(ScopedFileHandle socket); - bool UninstallClientSocket(Event* event); - bool ReceiveClientMessage(Event* event); - bool HandleCrashDumpRequest(const msghdr& msg, - const ClientInformation& client_info, - int client_sock); - - std::unordered_map<int, std::unique_ptr<Event>> clients_; - std::unique_ptr<Event> shutdown_event_; - std::unique_ptr<PtraceStrategyDecider> strategy_decider_; - Delegate* delegate_; - ScopedFileHandle pollfd_; - bool keep_running_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_LINUX_EXCEPTION_HANDLER_SERVER_H_ diff --git a/Tools/Crashpad/include/handler/mac/crash_report_exception_handler.h b/Tools/Crashpad/include/handler/mac/crash_report_exception_handler.h deleted file mode 100644 index cc314f1fc9..0000000000 --- a/Tools/Crashpad/include/handler/mac/crash_report_exception_handler.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_MAC_CRASH_REPORT_EXCEPTION_HANDLER_H_ -#define CRASHPAD_HANDLER_MAC_CRASH_REPORT_EXCEPTION_HANDLER_H_ - -#include <mach/mach.h> - -#include <map> -#include <string> - -#include "base/macros.h" -#include "client/crash_report_database.h" -#include "handler/crash_report_upload_thread.h" -#include "handler/user_stream_data_source.h" -#include "util/mach/exc_server_variants.h" - -namespace crashpad { - -//! \brief An exception handler that writes crash reports for exception messages -//! to a CrashReportDatabase. -class CrashReportExceptionHandler : public UniversalMachExcServer::Interface { - public: - //! \brief Creates a new object that will store crash reports in \a database. - //! - //! \param[in] database The database to store crash reports in. Weak. - //! \param[in] upload_thread The upload thread to notify when a new crash - //! report is written into \a database. - //! \param[in] process_annotations A map of annotations to insert as - //! process-level annotations into each crash report that is written. Do - //! not confuse this with module-level annotations, which are under the - //! control of the crashing process, and are used to implement Chrome’s - //! “crash keys.†Process-level annotations are those that are beyond the - //! control of the crashing process, which must reliably be set even if - //! the process crashes before it’s able to establish its own annotations. - //! To interoperate with Breakpad servers, the recommended practice is to - //! specify values for the `"prod"` and `"ver"` keys as process - //! annotations. - //! \param[in] user_stream_data_sources Data sources to be used to extend - //! crash reports. For each crash report that is written, the data sources - //! are called in turn. These data sources may contribute additional - //! minidump streams. `nullptr` if not required. - CrashReportExceptionHandler( - CrashReportDatabase* database, - CrashReportUploadThread* upload_thread, - const std::map<std::string, std::string>* process_annotations, - const UserStreamDataSources* user_stream_data_sources); - - ~CrashReportExceptionHandler(); - - // UniversalMachExcServer::Interface: - - //! \brief Processes an exception message by writing a crash report to this - //! object’s CrashReportDatabase. - kern_return_t CatchMachException( - exception_behavior_t behavior, - exception_handler_t exception_port, - thread_t thread, - task_t task, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t* flavor, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count, - thread_state_t new_state, - mach_msg_type_number_t* new_state_count, - const mach_msg_trailer_t* trailer, - bool* destroy_complex_request) override; - - private: - CrashReportDatabase* database_; // weak - CrashReportUploadThread* upload_thread_; // weak - const std::map<std::string, std::string>* process_annotations_; // weak - const UserStreamDataSources* user_stream_data_sources_; // weak - - DISALLOW_COPY_AND_ASSIGN(CrashReportExceptionHandler); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_MAC_CRASH_REPORT_EXCEPTION_HANDLER_H_ diff --git a/Tools/Crashpad/include/handler/mac/exception_handler_server.h b/Tools/Crashpad/include/handler/mac/exception_handler_server.h deleted file mode 100644 index 272cf76244..0000000000 --- a/Tools/Crashpad/include/handler/mac/exception_handler_server.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_ -#define CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_ - -#include <mach/mach.h> - -#include "base/mac/scoped_mach_port.h" -#include "base/macros.h" -#include "util/mach/exc_server_variants.h" - -namespace crashpad { - -//! \brief Runs the main exception-handling server in Crashpad’s handler -//! process. -class ExceptionHandlerServer { - public: - //! \brief Constructs an ExceptionHandlerServer object. - //! - //! \param[in] receive_port The port that exception messages and no-senders - //! notifications will be received on. - //! \param[in] launchd If `true`, the exception handler is being run from - //! launchd. \a receive_port is not monitored for no-senders - //! notifications, and instead, Stop() must be called to provide a “quit†- //! signal. - ExceptionHandlerServer(base::mac::ScopedMachReceiveRight receive_port, - bool launchd); - ~ExceptionHandlerServer(); - - //! \brief Runs the exception-handling server. - //! - //! \param[in] exception_interface An object to send exception messages to. - //! - //! This method monitors the receive port for exception messages and, if - //! not being run by launchd, no-senders notifications. It continues running - //! until it has no more clients, indicated by the receipt of a no-senders - //! notification, or until Stop() is called. When not being run by launchd, it - //! is important to assure that a send right exists in a client (or has been - //! queued by `mach_msg()` to be sent to a client) prior to calling this - //! method, or it will detect that it is sender-less and return immediately. - //! - //! All exception messages will be passed to \a exception_interface. - //! - //! This method must only be called once on an ExceptionHandlerServer object. - //! - //! If an unexpected condition that prevents this method from functioning is - //! encountered, it will log a message and terminate execution. Receipt of an - //! invalid message on the receive port will cause a message to be logged, but - //! this method will continue running normally. - void Run(UniversalMachExcServer::Interface* exception_interface); - - //! \brief Stops a running exception-handling server. - //! - //! Stop() may be called at any time, and may be called from a signal handler. - //! If Stop() is called before Run() it will cause Run() to return as soon as - //! it is called. It is harmless to call Stop() after Run() has already - //! returned, or to call Stop() after it has already been called. - void Stop(); - - private: - base::mac::ScopedMachReceiveRight receive_port_; - base::mac::ScopedMachReceiveRight notify_port_; - bool launchd_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_ diff --git a/Tools/Crashpad/include/handler/mac/file_limit_annotation.h b/Tools/Crashpad/include/handler/mac/file_limit_annotation.h deleted file mode 100644 index 1131986e63..0000000000 --- a/Tools/Crashpad/include/handler/mac/file_limit_annotation.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_MAC_FILE_LIMIT_ANNOTATION_H_ -#define CRASHPAD_HANDLER_MAC_FILE_LIMIT_ANNOTATION_H_ - -namespace crashpad { - -//! \brief Records a `"file-limits"` simple annotation for the process. -//! -//! This annotation will be used to confirm the theory that certain crashes are -//! caused by systems at or near their file descriptor table size limits. -//! -//! The format of the annotation is four comma-separated values: the system-wide -//! `kern.num_files` and `kern.maxfiles` values from `sysctl()`, and the -//! process-specific current and maximum file descriptor limits from -//! `getrlimit(RLIMIT_NOFILE, …)`. -//! -//! See https://crashpad.chromium.org/bug/180. -//! -//! TODO(mark): Remove this annotation after sufficient data has been collected -//! for analysis. -void RecordFileLimitAnnotation(); - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_MAC_FILE_LIMIT_ANNOTATION_H_ diff --git a/Tools/Crashpad/include/handler/minidump_to_upload_parameters.h b/Tools/Crashpad/include/handler/minidump_to_upload_parameters.h deleted file mode 100644 index 41056f7033..0000000000 --- a/Tools/Crashpad/include/handler/minidump_to_upload_parameters.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef HANDLER_MINIDUMP_TO_UPLOAD_PARAMETERS_H_ -#define HANDLER_MINIDUMP_TO_UPLOAD_PARAMETERS_H_ - -#include <map> -#include <string> - -#include "snapshot/process_snapshot.h" - -namespace crashpad { - -//! \brief Given a ProcessSnapshot, returns a map of key-value pairs to use as -//! HTTP form parameters for upload to a Breakpad crash report colleciton -//! server. -//! -//! The map is built by combining the process simple annotations map with -//! each module’s simple annotations map and annotation objects. -//! -//! In the case of duplicate simple map keys or annotation names, the map will -//! retain the first value found for any key, and will log a warning about -//! discarded values. The precedence rules for annotation names are: the two -//! reserved keys discussed below, process simple annotations, module simple -//! annotations, and module annotation objects. -//! -//! For annotation objects, only ones of that are Annotation::Type::kString are -//! included. -//! -//! Each module’s annotations vector is also examined and built into a single -//! string value, with distinct elements separated by newlines, and stored at -//! the key named “list_annotationsâ€, which supersedes any other key found by -//! that name. -//! -//! The client ID stored in the minidump is converted to a string and stored at -//! the key named “guidâ€, which supersedes any other key found by that name. -//! -//! In the event of an error reading the minidump file, a message will be -//! logged. -//! -//! \param[in] process_snapshot The process snapshot from which annotations -//! will be extracted. -//! -//! \returns A string map of the annotations. -std::map<std::string, std::string> BreakpadHTTPFormParametersFromMinidump( - const ProcessSnapshot* process_snapshot); - -} // namespace crashpad - -#endif // HANDLER_MINIDUMP_TO_UPLOAD_PARAMETERS_H_ diff --git a/Tools/Crashpad/include/handler/prune_crash_reports_thread.h b/Tools/Crashpad/include/handler/prune_crash_reports_thread.h deleted file mode 100644 index 72b69fc640..0000000000 --- a/Tools/Crashpad/include/handler/prune_crash_reports_thread.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_ -#define CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_ - -#include <memory> - -#include "base/macros.h" -#include "util/thread/worker_thread.h" - -namespace crashpad { - -class CrashReportDatabase; -class PruneCondition; - -//! \brief A thread that periodically prunes crash reports from the database -//! using the specified condition. -//! -//! After the thread is started, the database is pruned using the condition -//! every 24 hours. Upon calling Start(), the thread waits 10 minutes before -//! performing the initial prune operation. -class PruneCrashReportThread : public WorkerThread::Delegate { - public: - //! \brief Constructs a new object. - //! - //! \param[in] database The database to prune crash reports from. - //! \param[in] condition The condition used to evaluate crash reports for - //! pruning. - PruneCrashReportThread(CrashReportDatabase* database, - std::unique_ptr<PruneCondition> condition); - ~PruneCrashReportThread(); - - //! \brief Starts a dedicated pruning thread. - //! - //! The thread waits before running the initial prune, so as to not interfere - //! with any startup-related IO performed by the client. - //! - //! This method may only be be called on a newly-constructed object or after - //! a call to Stop(). - void Start(); - - //! \brief Stops the pruning thread. - //! - //! This method must only be called after Start(). If Start() has been called, - //! this method must be called before destroying an object of this class. - //! - //! This method may be called from any thread other than the pruning thread. - //! It is expected to only be called from the same thread that called Start(). - void Stop(); - - private: - // WorkerThread::Delegate: - void DoWork(const WorkerThread* thread) override; - - WorkerThread thread_; - std::unique_ptr<PruneCondition> condition_; - CrashReportDatabase* database_; // weak - - DISALLOW_COPY_AND_ASSIGN(PruneCrashReportThread); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_ diff --git a/Tools/Crashpad/include/handler/user_stream_data_source.h b/Tools/Crashpad/include/handler/user_stream_data_source.h deleted file mode 100644 index 11bb9c3d47..0000000000 --- a/Tools/Crashpad/include/handler/user_stream_data_source.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_USER_STREAM_DATA_SOURCE_H_ -#define CRASHPAD_HANDLER_USER_STREAM_DATA_SOURCE_H_ - -#include <memory> -#include <vector> - -namespace crashpad { - -class MinidumpFileWriter; -class MinidumpUserExtensionStreamDataSource; -class ProcessSnapshot; - -//! \brief Extensibility interface for embedders who wish to add custom streams -//! to minidumps. -class UserStreamDataSource { - public: - virtual ~UserStreamDataSource() {} - - //! \brief Produce the contents for an extension stream for a crashed program. - //! - //! Called after \a process_snapshot has been initialized for the crashed - //! process to (optionally) produce the contents of a user extension stream - //! that will be attached to the minidump. - //! - //! \param[in] process_snapshot An initialized snapshot for the crashed - //! process. - //! - //! \return A new data source for the stream to add to the minidump or - //! `nullptr` on failure or to opt out of adding a stream. - virtual std::unique_ptr<MinidumpUserExtensionStreamDataSource> - ProduceStreamData(ProcessSnapshot* process_snapshot) = 0; -}; - -using UserStreamDataSources = - std::vector<std::unique_ptr<UserStreamDataSource>>; - -//! \brief Adds user extension streams to a minidump. -//! -//! Dispatches to each source in \a user_stream_data_sources and adds returned -//! extension streams to \a minidump_file_writer. -//! -//! \param[in] user_stream_data_sources A pointer to the data sources, or -//! `nullptr`. -//! \param[in] process_snapshot An initialized snapshot to the crashing process. -//! \param[in] minidump_file_writer Any extension streams will be added to this -//! minidump. -void AddUserExtensionStreams( - const UserStreamDataSources* user_stream_data_sources, - ProcessSnapshot* process_snapshot, - MinidumpFileWriter* minidump_file_writer); - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_USER_STREAM_DATA_SOURCE_H_ diff --git a/Tools/Crashpad/include/handler/win/crash_report_exception_handler.h b/Tools/Crashpad/include/handler/win/crash_report_exception_handler.h deleted file mode 100644 index e1fb725d0d..0000000000 --- a/Tools/Crashpad/include/handler/win/crash_report_exception_handler.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_HANDLER_WIN_CRASH_REPORT_EXCEPTION_HANDLER_H_ -#define CRASHPAD_HANDLER_WIN_CRASH_REPORT_EXCEPTION_HANDLER_H_ - -#include <windows.h> - -#include <map> -#include <string> - -#include "base/macros.h" -#include "handler/user_stream_data_source.h" -#include "util/win/exception_handler_server.h" - -namespace crashpad { - -class CrashReportDatabase; -class CrashReportUploadThread; - -//! \brief An exception handler that writes crash reports for exception messages -//! to a CrashReportDatabase. -class CrashReportExceptionHandler : public ExceptionHandlerServer::Delegate { - public: - //! \brief Creates a new object that will store crash reports in \a database. - //! - //! \param[in] database The database to store crash reports in. Weak. - //! \param[in] upload_thread The upload thread to notify when a new crash - //! report is written into \a database. - //! \param[in] process_annotations A map of annotations to insert as - //! process-level annotations into each crash report that is written. Do - //! not confuse this with module-level annotations, which are under the - //! control of the crashing process, and are used to implement Chrome's - //! "crash keys." Process-level annotations are those that are beyond the - //! control of the crashing process, which must reliably be set even if - //! the process crashes before it's able to establish its own annotations. - //! To interoperate with Breakpad servers, the recommended practice is to - //! specify values for the `"prod"` and `"ver"` keys as process - //! annotations. - //! \param[in] user_stream_data_sources Data sources to be used to extend - //! crash reports. For each crash report that is written, the data sources - //! are called in turn. These data sources may contribute additional - //! minidump streams. `nullptr` if not required. - CrashReportExceptionHandler( - CrashReportDatabase* database, - CrashReportUploadThread* upload_thread, - const std::map<std::string, std::string>* process_annotations, - const UserStreamDataSources* user_stream_data_sources); - - ~CrashReportExceptionHandler(); - - // ExceptionHandlerServer::Delegate: - - //! \brief Processes an exception message by writing a crash report to this - //! object's CrashReportDatabase. - void ExceptionHandlerServerStarted() override; - unsigned int ExceptionHandlerServerException( - HANDLE process, - WinVMAddress exception_information_address, - WinVMAddress debug_critical_section_address) override; - - private: - CrashReportDatabase* database_; // weak - CrashReportUploadThread* upload_thread_; // weak - const std::map<std::string, std::string>* process_annotations_; // weak - const UserStreamDataSources* user_stream_data_sources_; // weak - - DISALLOW_COPY_AND_ASSIGN(CrashReportExceptionHandler); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_WIN_CRASH_REPORT_EXCEPTION_HANDLER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_annotation_writer.h b/Tools/Crashpad/include/minidump/minidump_annotation_writer.h deleted file mode 100644 index fc30dbc3a4..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_annotation_writer.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_ANNOTATION_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_ANNOTATION_WRITER_H_ - -#include <memory> -#include <vector> - -#include "minidump/minidump_byte_array_writer.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_string_writer.h" -#include "minidump/minidump_writable.h" -#include "snapshot/annotation_snapshot.h" - -namespace crashpad { - -//! \brief The writer for a MinidumpAnnotation object in a minidump file. -//! -//! Because MinidumpAnnotation objects only appear as elements -//! of MinidumpAnnotationList objects, this class does not write any -//! data on its own. It makes its MinidumpAnnotation data available to its -//! MinidumpAnnotationList parent, which writes it as part of a -//! MinidumpAnnotationList. -class MinidumpAnnotationWriter final : public internal::MinidumpWritable { - public: - MinidumpAnnotationWriter(); - ~MinidumpAnnotationWriter(); - - //! \brief Initializes the annotation writer with data from an - //! AnnotationSnapshot. - void InitializeFromSnapshot(const AnnotationSnapshot& snapshot); - - //! \brief Initializes the annotation writer with data values. - void InitializeWithData(const std::string& name, - uint16_t type, - const std::vector<uint8_t>& data); - - //! \brief Returns the MinidumpAnnotation referencing this object’s data. - const MinidumpAnnotation* minidump_annotation() const { return &annotation_; } - - protected: - // MinidumpWritable: - - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<internal::MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MinidumpAnnotation annotation_; - internal::MinidumpUTF8StringWriter name_; - MinidumpByteArrayWriter value_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpAnnotationWriter); -}; - -//! \brief The writer for a MinidumpAnnotationList object in a minidump file, -//! containing a list of MinidumpAnnotation objects. -class MinidumpAnnotationListWriter final : public internal::MinidumpWritable { - public: - MinidumpAnnotationListWriter(); - ~MinidumpAnnotationListWriter(); - - //! \brief Initializes the annotation list writer with a list of - //! AnnotationSnapshot objects. - void InitializeFromList(const std::vector<AnnotationSnapshot>& list); - - //! \brief Adds a single MinidumpAnnotationWriter to the list to be written. - void AddObject(std::unique_ptr<MinidumpAnnotationWriter> annotation_writer); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying entries would be - //! considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - protected: - // MinidumpWritable: - - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<internal::MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - std::unique_ptr<MinidumpAnnotationList> minidump_list_; - std::vector<std::unique_ptr<MinidumpAnnotationWriter>> objects_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpAnnotationListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_ANNOTATION_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_byte_array_writer.h b/Tools/Crashpad/include/minidump/minidump_byte_array_writer.h deleted file mode 100644 index c399f0358d..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_byte_array_writer.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_BYTE_ARRAY_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_BYTE_ARRAY_WRITER_H_ - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -//! \brief Writes a variable-length byte array for a minidump into a -//! \sa MinidumpByteArray. -class MinidumpByteArrayWriter final : public internal::MinidumpWritable { - public: - MinidumpByteArrayWriter(); - ~MinidumpByteArrayWriter() override; - - //! \brief Sets the data to be written. - //! - //! \note Valid in #kStateMutable. - void set_data(const std::vector<uint8_t>& data) { data_ = data; } - - //! \brief Sets the data to be written. - //! - //! \note Valid in #kStateMutable. - void set_data(const uint8_t* data, size_t size); - - //! \brief Gets the data to be written. - //! - //! \note Valid in any state. - const std::vector<uint8_t>& data() const { return data_; } - - protected: - // MinidumpWritable: - - bool Freeze() override; - size_t SizeOfObject() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - std::unique_ptr<MinidumpByteArray> minidump_array_; - std::vector<uint8_t> data_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpByteArrayWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_BYTE_ARRAY_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_context.h b/Tools/Crashpad/include/minidump/minidump_context.h deleted file mode 100644 index 1226b654aa..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_context.h +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ - -#include <stdint.h> - -#include "base/compiler_specific.h" -#include "snapshot/cpu_context.h" -#include "util/numeric/int128.h" - -namespace crashpad { - -//! \brief Architecture-independent flags for `context_flags` fields in Minidump -//! context structures. -// -// https://zachsaw.blogspot.com/2010/11/wow64-bug-getthreadcontext-may-return.html#c5639760895973344002 -enum MinidumpContextFlags : uint32_t { - //! \brief The thread was executing a trap handler in kernel mode - //! (`CONTEXT_EXCEPTION_ACTIVE`). - //! - //! If this bit is set, it indicates that the context is from a thread that - //! was executing a trap handler in the kernel. This bit is only valid when - //! ::kMinidumpContextExceptionReporting is also set. This bit is only used on - //! Windows. - kMinidumpContextExceptionActive = 0x08000000, - - //! \brief The thread was executing a system call in kernel mode - //! (`CONTEXT_SERVICE_ACTIVE`). - //! - //! If this bit is set, it indicates that the context is from a thread that - //! was executing a system call in the kernel. This bit is only valid when - //! ::kMinidumpContextExceptionReporting is also set. This bit is only used on - //! Windows. - kMinidumpContextServiceActive = 0x10000000, - - //! \brief Kernel-mode state reporting is desired - //! (`CONTEXT_EXCEPTION_REQUEST`). - //! - //! This bit is not used in context structures containing snapshots of thread - //! CPU context. It used when calling `GetThreadContext()` on Windows to - //! specify that kernel-mode state reporting - //! (::kMinidumpContextExceptionReporting) is desired in the returned context - //! structure. - kMinidumpContextExceptionRequest = 0x40000000, - - //! \brief Kernel-mode state reporting is provided - //! (`CONTEXT_EXCEPTION_REPORTING`). - //! - //! If this bit is set, it indicates that the bits indicating how the thread - //! had entered kernel mode (::kMinidumpContextExceptionActive and - //! ::kMinidumpContextServiceActive) are valid. This bit is only used on - //! Windows. - kMinidumpContextExceptionReporting = 0x80000000, -}; - -//! \brief 32-bit x86-specifc flags for MinidumpContextX86::context_flags. -enum MinidumpContextX86Flags : uint32_t { - //! \brief Identifies the context structure as 32-bit x86. This is the same as - //! `CONTEXT_i386` and `CONTEXT_i486` on Windows for this architecture. - kMinidumpContextX86 = 0x00010000, - - //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`). - //! - //! The `ebp`, `eip`, `cs`, `eflags`, `esp`, and `ss` fields are valid. - kMinidumpContextX86Control = kMinidumpContextX86 | 0x00000001, - - //! \brief Indicates the validity of non-control integer registers - //! (`CONTEXT_INTEGER`). - //! - //! The `edi`, `esi`, `ebx`, `edx`, `ecx, and `eax` fields are valid. - kMinidumpContextX86Integer = kMinidumpContextX86 | 0x00000002, - - //! \brief Indicates the validity of non-control segment registers - //! (`CONTEXT_SEGMENTS`). - //! - //! The `gs`, `fs`, `es`, and `ds` fields are valid. - kMinidumpContextX86Segment = kMinidumpContextX86 | 0x00000004, - - //! \brief Indicates the validity of floating-point state - //! (`CONTEXT_FLOATING_POINT`). - //! - //! The `fsave` field is valid. The `float_save` field is included in this - //! definition, but its members have no practical use asdie from `fsave`. - kMinidumpContextX86FloatingPoint = kMinidumpContextX86 | 0x00000008, - - //! \brief Indicates the validity of debug registers - //! (`CONTEXT_DEBUG_REGISTERS`). - //! - //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid. - kMinidumpContextX86Debug = kMinidumpContextX86 | 0x00000010, - - //! \brief Indicates the validity of extended registers in `fxsave` format - //! (`CONTEXT_EXTENDED_REGISTERS`). - //! - //! The `extended_registers` field is valid and contains `fxsave` data. - kMinidumpContextX86Extended = kMinidumpContextX86 | 0x00000020, - - //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`). - //! - //! The context contains `xsave` data. This is used with an extended context - //! structure not currently defined here. - kMinidumpContextX86Xstate = kMinidumpContextX86 | 0x00000040, - - //! \brief Indicates the validity of control, integer, and segment registers. - //! (`CONTEXT_FULL`). - kMinidumpContextX86Full = kMinidumpContextX86Control | - kMinidumpContextX86Integer | - kMinidumpContextX86Segment, - - //! \brief Indicates the validity of all registers except `xsave` data. - //! (`CONTEXT_ALL`). - kMinidumpContextX86All = kMinidumpContextX86Full | - kMinidumpContextX86FloatingPoint | - kMinidumpContextX86Debug | - kMinidumpContextX86Extended, -}; - -//! \brief A 32-bit x86 CPU context (register state) carried in a minidump file. -//! -//! This is analogous to the `CONTEXT` structure on Windows when targeting -//! 32-bit x86, and the `WOW64_CONTEXT` structure when targeting an x86-family -//! CPU, either 32- or 64-bit. This structure is used instead of `CONTEXT` or -//! `WOW64_CONTEXT` to make it available when targeting other architectures. -//! -//! \note This structure doesn’t carry `dr4` or `dr5`, which are obsolete and -//! normally alias `dr6` and `dr7`, respectively. See Intel Software -//! Developer’s Manual, Volume 3B: System Programming, Part 2 (253669-052), -//! 17.2.2 “Debug Registers DR4 and DR5â€. -struct MinidumpContextX86 { - //! \brief A bitfield composed of values of #MinidumpContextFlags and - //! #MinidumpContextX86Flags. - //! - //! This field identifies the context structure as a 32-bit x86 CPU context, - //! and indicates which other fields in the structure are valid. - uint32_t context_flags; - - uint32_t dr0; - uint32_t dr1; - uint32_t dr2; - uint32_t dr3; - uint32_t dr6; - uint32_t dr7; - - // CPUContextX86::Fsave has identical layout to what the x86 CONTEXT structure - // places here. - CPUContextX86::Fsave fsave; - union { - uint32_t spare_0; // As in the native x86 CONTEXT structure since Windows 8 - uint32_t cr0_npx_state; // As in WOW64_CONTEXT and older SDKs’ x86 CONTEXT - } float_save; - - uint32_t gs; - uint32_t fs; - uint32_t es; - uint32_t ds; - - uint32_t edi; - uint32_t esi; - uint32_t ebx; - uint32_t edx; - uint32_t ecx; - uint32_t eax; - - uint32_t ebp; - uint32_t eip; - uint32_t cs; - uint32_t eflags; - uint32_t esp; - uint32_t ss; - - // CPUContextX86::Fxsave has identical layout to what the x86 CONTEXT - // structure places here. - CPUContextX86::Fxsave fxsave; -}; - -//! \brief x86_64-specific flags for MinidumpContextAMD64::context_flags. -enum MinidumpContextAMD64Flags : uint32_t { - //! \brief Identifies the context structure as x86_64. This is the same as - //! `CONTEXT_AMD64` on Windows for this architecture. - kMinidumpContextAMD64 = 0x00100000, - - //! \brief Indicates the validity of control registers (`CONTEXT_CONTROL`). - //! - //! The `cs`, `ss`, `eflags`, `rsp`, and `rip` fields are valid. - kMinidumpContextAMD64Control = kMinidumpContextAMD64 | 0x00000001, - - //! \brief Indicates the validity of non-control integer registers - //! (`CONTEXT_INTEGER`). - //! - //! The `rax`, `rcx`, `rdx`, `rbx`, `rbp`, `rsi`, `rdi`, and `r8` through - //! `r15` fields are valid. - kMinidumpContextAMD64Integer = kMinidumpContextAMD64 | 0x00000002, - - //! \brief Indicates the validity of non-control segment registers - //! (`CONTEXT_SEGMENTS`). - //! - //! The `ds`, `es`, `fs`, and `gs` fields are valid. - kMinidumpContextAMD64Segment = kMinidumpContextAMD64 | 0x00000004, - - //! \brief Indicates the validity of floating-point state - //! (`CONTEXT_FLOATING_POINT`). - //! - //! The `xmm0` through `xmm15` fields are valid. - kMinidumpContextAMD64FloatingPoint = kMinidumpContextAMD64 | 0x00000008, - - //! \brief Indicates the validity of debug registers - //! (`CONTEXT_DEBUG_REGISTERS`). - //! - //! The `dr0` through `dr3`, `dr6`, and `dr7` fields are valid. - kMinidumpContextAMD64Debug = kMinidumpContextAMD64 | 0x00000010, - - //! \brief Indicates the validity of `xsave` data (`CONTEXT_XSTATE`). - //! - //! The context contains `xsave` data. This is used with an extended context - //! structure not currently defined here. - kMinidumpContextAMD64Xstate = kMinidumpContextAMD64 | 0x00000040, - - //! \brief Indicates the validity of control, integer, and floating-point - //! registers (`CONTEXT_FULL`). - kMinidumpContextAMD64Full = kMinidumpContextAMD64Control | - kMinidumpContextAMD64Integer | - kMinidumpContextAMD64FloatingPoint, - - //! \brief Indicates the validity of all registers except `xsave` data - //! (`CONTEXT_ALL`). - kMinidumpContextAMD64All = kMinidumpContextAMD64Full | - kMinidumpContextAMD64Segment | - kMinidumpContextAMD64Debug, -}; - -//! \brief An x86_64 (AMD64) CPU context (register state) carried in a minidump -//! file. -//! -//! This is analogous to the `CONTEXT` structure on Windows when targeting -//! x86_64. This structure is used instead of `CONTEXT` to make it available -//! when targeting other architectures. -//! -//! \note This structure doesn’t carry `dr4` or `dr5`, which are obsolete and -//! normally alias `dr6` and `dr7`, respectively. See Intel Software -//! Developer’s Manual, Volume 3B: System Programming, Part 2 (253669-052), -//! 17.2.2 “Debug Registers DR4 and DR5â€. -struct alignas(16) MinidumpContextAMD64 { - //! \brief Register parameter home address. - //! - //! On Windows, this field may contain the “home†address (on-stack, in the - //! shadow area) of a parameter passed by register. This field is present for - //! convenience but is not necessarily populated, even if a corresponding - //! parameter was passed by register. - //! - //! \{ - uint64_t p1_home; - uint64_t p2_home; - uint64_t p3_home; - uint64_t p4_home; - uint64_t p5_home; - uint64_t p6_home; - //! \} - - //! \brief A bitfield composed of values of #MinidumpContextFlags and - //! #MinidumpContextAMD64Flags. - //! - //! This field identifies the context structure as an x86_64 CPU context, and - //! indicates which other fields in the structure are valid. - uint32_t context_flags; - - uint32_t mx_csr; - - uint16_t cs; - uint16_t ds; - uint16_t es; - uint16_t fs; - uint16_t gs; - uint16_t ss; - - uint32_t eflags; - - uint64_t dr0; - uint64_t dr1; - uint64_t dr2; - uint64_t dr3; - uint64_t dr6; - uint64_t dr7; - - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsp; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t rip; - - // CPUContextX86_64::Fxsave has identical layout to what the x86_64 CONTEXT - // structure places here. - CPUContextX86_64::Fxsave fxsave; - - uint128_struct vector_register[26]; - uint64_t vector_control; - - //! \brief Model-specific debug extension register. - //! - //! See Intel Software Developer’s Manual, Volume 3B: System Programming, Part - //! 2 (253669-051), 17.4 “Last Branch, Interrupt, and Exception Recording - //! Overviewâ€, and AMD Architecture Programmer’s Manual, Volume 2: System - //! Programming (24593-3.24), 13.1.6 “Control-Transfer Breakpoint Featuresâ€. - //! - //! \{ - uint64_t debug_control; - uint64_t last_branch_to_rip; - uint64_t last_branch_from_rip; - uint64_t last_exception_to_rip; - uint64_t last_exception_from_rip; - //! \} -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_context_writer.h b/Tools/Crashpad/include/minidump/minidump_context_writer.h deleted file mode 100644 index 25d717e585..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_context_writer.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_ - -#include <sys/types.h> - -#include <memory> - -#include "base/macros.h" -#include "minidump/minidump_context.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -struct CPUContext; -struct CPUContextX86; -struct CPUContextX86_64; - -//! \brief The base class for writers of CPU context structures in minidump -//! files. -class MinidumpContextWriter : public internal::MinidumpWritable { - public: - ~MinidumpContextWriter() override; - - //! \brief Creates a MinidumpContextWriter based on \a context_snapshot. - //! - //! \param[in] context_snapshot The context snapshot to use as source data. - //! - //! \return A MinidumpContextWriter subclass, such as MinidumpContextWriterX86 - //! or MinidumpContextWriterAMD64, appropriate to the CPU type of \a - //! context_snapshot. The returned object is initialized using the source - //! data in \a context_snapshot. If \a context_snapshot is an unknown CPU - //! type’s context, logs a message and returns `nullptr`. - static std::unique_ptr<MinidumpContextWriter> CreateFromSnapshot( - const CPUContext* context_snapshot); - - protected: - MinidumpContextWriter() : MinidumpWritable() {} - - //! \brief Returns the size of the context structure that this object will - //! write. - //! - //! \note This method will only be called in #kStateFrozen or a subsequent - //! state. - virtual size_t ContextSize() const = 0; - - // MinidumpWritable: - size_t SizeOfObject() final; - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpContextWriter); -}; - -//! \brief The writer for a MinidumpContextX86 structure in a minidump file. -class MinidumpContextX86Writer final : public MinidumpContextWriter { - public: - MinidumpContextX86Writer(); - ~MinidumpContextX86Writer() override; - - //! \brief Initializes the MinidumpContextX86 based on \a context_snapshot. - //! - //! \param[in] context_snapshot The context snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutation of context() may be done before - //! calling this method, and it is not normally necessary to alter - //! context() after calling this method. - void InitializeFromSnapshot(const CPUContextX86* context_snapshot); - - //! \brief Returns a pointer to the context structure that this object will - //! write. - //! - //! \attention This returns a non-`const` pointer to this object’s private - //! data so that a caller can populate the context structure directly. - //! This is done because providing setter interfaces to each field in the - //! context structure would be unwieldy and cumbersome. Care must be taken - //! to populate the context structure correctly. The context structure - //! must only be modified while this object is in the #kStateMutable - //! state. - MinidumpContextX86* context() { return &context_; } - - protected: - // MinidumpWritable: - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpContextWriter: - size_t ContextSize() const override; - - private: - MinidumpContextX86 context_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpContextX86Writer); -}; - -//! \brief The writer for a MinidumpContextAMD64 structure in a minidump file. -class MinidumpContextAMD64Writer final : public MinidumpContextWriter { - public: - MinidumpContextAMD64Writer(); - ~MinidumpContextAMD64Writer() override; - - // Ensure proper alignment of heap-allocated objects. This should not be - // necessary in C++17. - static void* operator new(size_t size); - static void operator delete(void* ptr); - - // Prevent unaligned heap-allocated arrays. Provisions could be made to allow - // these if necessary, but there is currently no use for them. - static void* operator new[](size_t size) = delete; - static void operator delete[](void* ptr) = delete; - - //! \brief Initializes the MinidumpContextAMD64 based on \a context_snapshot. - //! - //! \param[in] context_snapshot The context snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutation of context() may be done before - //! calling this method, and it is not normally necessary to alter - //! context() after calling this method. - void InitializeFromSnapshot(const CPUContextX86_64* context_snapshot); - - //! \brief Returns a pointer to the context structure that this object will - //! write. - //! - //! \attention This returns a non-`const` pointer to this object’s private - //! data so that a caller can populate the context structure directly. - //! This is done because providing setter interfaces to each field in the - //! context structure would be unwieldy and cumbersome. Care must be taken - //! to populate the context structure correctly. The context structure - //! must only be modified while this object is in the #kStateMutable - //! state. - MinidumpContextAMD64* context() { return &context_; } - - protected: - // MinidumpWritable: - size_t Alignment() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpContextWriter: - size_t ContextSize() const override; - - private: - MinidumpContextAMD64 context_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpContextAMD64Writer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_crashpad_info_writer.h b/Tools/Crashpad/include/minidump/minidump_crashpad_info_writer.h deleted file mode 100644 index 4624b24d23..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_crashpad_info_writer.h +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_CRASHPAD_INFO_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_CRASHPAD_INFO_WRITER_H_ - -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_stream_writer.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -class MinidumpModuleCrashpadInfoListWriter; -class MinidumpSimpleStringDictionaryWriter; -class ProcessSnapshot; - -//! \brief The writer for a MinidumpCrashpadInfo stream in a minidump file. -class MinidumpCrashpadInfoWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpCrashpadInfoWriter(); - ~MinidumpCrashpadInfoWriter() override; - - //! \brief Initializes MinidumpCrashpadInfo based on \a process_snapshot. - //! - //! This method may add additional structures to the minidump file as children - //! of the MinidumpCrashpadInfo stream. To do so, it may obtain other - //! snapshot information from \a process_snapshot, such as a list of - //! ModuleSnapshot objects used to initialize - //! MinidumpCrashpadInfo::module_list. Only data that is considered useful - //! will be included. For module information, usefulness is determined by - //! MinidumpModuleCrashpadInfoListWriter::IsUseful(). - //! - //! \param[in] process_snapshot The process snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ProcessSnapshot* process_snapshot); - - //! \brief Sets MinidumpCrashpadInfo::report_id. - void SetReportID(const UUID& report_id); - - //! \brief Sets MinidumpCrashpadInfo::client_id. - void SetClientID(const UUID& client_id); - - //! \brief Arranges for MinidumpCrashpadInfo::simple_annotations to point to - //! the MinidumpSimpleStringDictionaryWriter object to be written by \a - //! simple_annotations. - //! - //! This object takes ownership of \a simple_annotations and becomes its - //! parent in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetSimpleAnnotations( - std::unique_ptr<MinidumpSimpleStringDictionaryWriter> simple_annotations); - - //! \brief Arranges for MinidumpCrashpadInfo::module_list to point to the - //! MinidumpModuleCrashpadInfoList object to be written by \a - //! module_list. - //! - //! This object takes ownership of \a module_list and becomes its parent in - //! the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetModuleList( - std::unique_ptr<MinidumpModuleCrashpadInfoListWriter> module_list); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying children would be - //! considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - MinidumpCrashpadInfo crashpad_info_; - std::unique_ptr<MinidumpSimpleStringDictionaryWriter> simple_annotations_; - std::unique_ptr<MinidumpModuleCrashpadInfoListWriter> module_list_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpCrashpadInfoWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_CRASHPAD_INFO_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_exception_writer.h b/Tools/Crashpad/include/minidump/minidump_exception_writer.h deleted file mode 100644 index cc8c6bef04..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_exception_writer.h +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_EXCEPTION_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_EXCEPTION_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_thread_id_map.h" - -namespace crashpad { - -class ExceptionSnapshot; -class MinidumpContextWriter; -class MinidumpMemoryListWriter; - -//! \brief The writer for a MINIDUMP_EXCEPTION_STREAM stream in a minidump file. -class MinidumpExceptionWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpExceptionWriter(); - ~MinidumpExceptionWriter() override; - - //! \brief Initializes the MINIDUMP_EXCEPTION_STREAM based on \a - //! exception_snapshot. - //! - //! \param[in] exception_snapshot The exception snapshot to use as source - //! data. - //! \param[in] thread_id_map A MinidumpThreadIDMap to be consulted to - //! determine the 32-bit minidump thread ID to use for the thread - //! identified by \a exception_snapshot. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ExceptionSnapshot* exception_snapshot, - const MinidumpThreadIDMap& thread_id_map); - - //! \brief Arranges for MINIDUMP_EXCEPTION_STREAM::ThreadContext to point to - //! the CPU context to be written by \a context. - //! - //! A context is required in all MINIDUMP_EXCEPTION_STREAM objects. - //! - //! This object takes ownership of \a context and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetContext(std::unique_ptr<MinidumpContextWriter> context); - - //! \brief Sets MINIDUMP_EXCEPTION_STREAM::ThreadId. - void SetThreadID(uint32_t thread_id) { exception_.ThreadId = thread_id; } - - //! \brief Sets MINIDUMP_EXCEPTION::ExceptionCode. - void SetExceptionCode(uint32_t exception_code) { - exception_.ExceptionRecord.ExceptionCode = exception_code; - } - - //! \brief Sets MINIDUMP_EXCEPTION::ExceptionFlags. - void SetExceptionFlags(uint32_t exception_flags) { - exception_.ExceptionRecord.ExceptionFlags = exception_flags; - } - - //! \brief Sets MINIDUMP_EXCEPTION::ExceptionRecord. - void SetExceptionRecord(uint64_t exception_record) { - exception_.ExceptionRecord.ExceptionRecord = exception_record; - } - - //! \brief Sets MINIDUMP_EXCEPTION::ExceptionAddress. - void SetExceptionAddress(uint64_t exception_address) { - exception_.ExceptionRecord.ExceptionAddress = exception_address; - } - - //! \brief Sets MINIDUMP_EXCEPTION::ExceptionInformation and - //! MINIDUMP_EXCEPTION::NumberParameters. - //! - //! MINIDUMP_EXCEPTION::NumberParameters is set to the number of elements in - //! \a exception_information. The elements of - //! MINIDUMP_EXCEPTION::ExceptionInformation are set to the elements of \a - //! exception_information. Unused elements in - //! MINIDUMP_EXCEPTION::ExceptionInformation are set to `0`. - //! - //! \a exception_information must have no more than - //! #EXCEPTION_MAXIMUM_PARAMETERS elements. - //! - //! \note Valid in #kStateMutable. - void SetExceptionInformation( - const std::vector<uint64_t>& exception_information); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - MINIDUMP_EXCEPTION_STREAM exception_; - std::unique_ptr<MinidumpContextWriter> context_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpExceptionWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_EXCEPTION_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_extensions.h b/Tools/Crashpad/include/minidump/minidump_extensions.h deleted file mode 100644 index 4ddab3bfee..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_extensions.h +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_EXTENSIONS_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_EXTENSIONS_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <winnt.h> - -#include "base/compiler_specific.h" -#include "build/build_config.h" -#include "util/misc/pdb_structures.h" -#include "util/misc/uuid.h" - -// C4200 is "nonstandard extension used : zero-sized array in struct/union". -// We would like to globally disable this warning, but unfortunately, the -// compiler is buggy and only supports disabling it with a pragma, so we can't -// disable it with other silly warnings in build/common.gypi. See: -// https://connect.microsoft.com/VisualStudio/feedback/details/1114440 -MSVC_PUSH_DISABLE_WARNING(4200); - -#if defined(COMPILER_MSVC) -#define PACKED -#pragma pack(push, 1) -#else -#define PACKED __attribute__((packed)) -#endif // COMPILER_MSVC - -namespace crashpad { - -//! \brief Minidump stream type values for MINIDUMP_DIRECTORY::StreamType. Each -//! stream structure has a corresponding stream type value to identify it. -//! -//! \sa MINIDUMP_STREAM_TYPE -enum MinidumpStreamType : uint32_t { - //! \brief The stream type for MINIDUMP_THREAD_LIST. - //! - //! \sa ThreadListStream - kMinidumpStreamTypeThreadList = ThreadListStream, - - //! \brief The stream type for MINIDUMP_MODULE_LIST. - //! - //! \sa ModuleListStream - kMinidumpStreamTypeModuleList = ModuleListStream, - - //! \brief The stream type for MINIDUMP_MEMORY_LIST. - //! - //! \sa MemoryListStream - kMinidumpStreamTypeMemoryList = MemoryListStream, - - //! \brief The stream type for MINIDUMP_EXCEPTION_STREAM. - //! - //! \sa ExceptionStream - kMinidumpStreamTypeException = ExceptionStream, - - //! \brief The stream type for MINIDUMP_SYSTEM_INFO. - //! - //! \sa SystemInfoStream - kMinidumpStreamTypeSystemInfo = SystemInfoStream, - - //! \brief The stream type for MINIDUMP_HANDLE_DATA_STREAM. - //! - //! \sa HandleDataStream - kMinidumpStreamTypeHandleData = HandleDataStream, - - //! \brief The stream type for MINIDUMP_UNLOADED_MODULE_LIST. - //! - //! \sa UnloadedModuleListStream - kMinidumpStreamTypeUnloadedModuleList = UnloadedModuleListStream, - - //! \brief The stream type for MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, - //! MINIDUMP_MISC_INFO_3, and MINIDUMP_MISC_INFO_4. - //! - //! \sa MiscInfoStream - kMinidumpStreamTypeMiscInfo = MiscInfoStream, - - //! \brief The stream type for MINIDUMP_MEMORY_INFO_LIST. - //! - //! \sa MemoryInfoListStream - kMinidumpStreamTypeMemoryInfoList = MemoryInfoListStream, - - // 0x4350 = "CP" - - //! \brief The stream type for MinidumpCrashpadInfo. - kMinidumpStreamTypeCrashpadInfo = 0x43500001, -}; - -//! \brief A variable-length UTF-8-encoded string carried within a minidump -//! file. -//! -//! \sa MINIDUMP_STRING -struct ALIGNAS(4) PACKED MinidumpUTF8String { - // The field names do not conform to typical style, they match the names used - // in MINIDUMP_STRING. This makes it easier to operate on MINIDUMP_STRING (for - // UTF-16 strings) and MinidumpUTF8String using templates. - - //! \brief The length of the #Buffer field in bytes, not including the `NUL` - //! terminator. - //! - //! \note This field is interpreted as a byte count, not a count of Unicode - //! code points. - uint32_t Length; - - //! \brief The string, encoded in UTF-8, and terminated with a `NUL` byte. - uint8_t Buffer[0]; -}; - -//! \brief A variable-length array of bytes carried within a minidump file. -//! The data have no intrinsic type and should be interpreted according -//! to their referencing context. -struct ALIGNAS(4) PACKED MinidumpByteArray { - //! \brief The length of the #data field. - uint32_t length; - - //! \brief The bytes of data. - uint8_t data[0]; -}; - -//! \brief CPU type values for MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. -//! -//! \sa \ref PROCESSOR_ARCHITECTURE_x "PROCESSOR_ARCHITECTURE_*" -enum MinidumpCPUArchitecture : uint16_t { - //! \brief 32-bit x86. - //! - //! These systems identify their CPUs generically as “x86†or “ia32â€, or with - //! more specific names such as “i386â€, “i486â€, “i586â€, and “i686â€. - kMinidumpCPUArchitectureX86 = PROCESSOR_ARCHITECTURE_INTEL, - - kMinidumpCPUArchitectureMIPS = PROCESSOR_ARCHITECTURE_MIPS, - kMinidumpCPUArchitectureAlpha = PROCESSOR_ARCHITECTURE_ALPHA, - - //! \brief 32-bit PowerPC. - //! - //! These systems identify their CPUs generically as “ppcâ€, or with more - //! specific names such as “ppc6xxâ€, “ppc7xxâ€, and “ppc74xxâ€. - kMinidumpCPUArchitecturePPC = PROCESSOR_ARCHITECTURE_PPC, - - kMinidumpCPUArchitectureSHx = PROCESSOR_ARCHITECTURE_SHX, - - //! \brief 32-bit ARM. - //! - //! These systems identify their CPUs generically as “armâ€, or with more - //! specific names such as “armv6†and “armv7â€. - kMinidumpCPUArchitectureARM = PROCESSOR_ARCHITECTURE_ARM, - - kMinidumpCPUArchitectureIA64 = PROCESSOR_ARCHITECTURE_IA64, - kMinidumpCPUArchitectureAlpha64 = PROCESSOR_ARCHITECTURE_ALPHA64, - kMinidumpCPUArchitectureMSIL = PROCESSOR_ARCHITECTURE_MSIL, - - //! \brief 64-bit x86. - //! - //! These systems identify their CPUs as “x86_64â€, “amd64â€, or “x64â€. - kMinidumpCPUArchitectureAMD64 = PROCESSOR_ARCHITECTURE_AMD64, - - //! \brief A 32-bit x86 process running on IA-64 (Itanium). - //! - //! \note This value is not used in minidump files for 32-bit x86 processes - //! running on a 64-bit-capable x86 CPU and operating system. In that - //! configuration, #kMinidumpCPUArchitectureX86 is used instead. - kMinidumpCPUArchitectureX86Win64 = PROCESSOR_ARCHITECTURE_IA32_ON_WIN64, - - kMinidumpCPUArchitectureNeutral = PROCESSOR_ARCHITECTURE_NEUTRAL, - - //! \brief 64-bit ARM. - //! - //! These systems identify their CPUs generically as “arm64†or “aarch64â€, or - //! with more specific names such as “armv8â€. - //! - //! \sa #kMinidumpCPUArchitectureARM64Breakpad - kMinidumpCPUArchitectureARM64 = PROCESSOR_ARCHITECTURE_ARM64, - - kMinidumpCPUArchitectureARM32Win64 = PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64, - kMinidumpCPUArchitectureSPARC = 0x8001, - - //! \brief 64-bit PowerPC. - //! - //! These systems identify their CPUs generically as “ppc64â€, or with more - //! specific names such as “ppc970â€. - kMinidumpCPUArchitecturePPC64 = 0x8002, - - //! \brief Used by Breakpad for 64-bit ARM. - //! - //! \deprecated Use #kMinidumpCPUArchitectureARM64 instead. - kMinidumpCPUArchitectureARM64Breakpad = 0x8003, - - //! \brief Unknown CPU architecture. - kMinidumpCPUArchitectureUnknown = PROCESSOR_ARCHITECTURE_UNKNOWN, -}; - -//! \brief Operating system type values for MINIDUMP_SYSTEM_INFO::ProductType. -//! -//! \sa \ref VER_NT_x "VER_NT_*" -enum MinidumpOSType : uint8_t { - //! \brief A “desktop†or “workstation†system. - kMinidumpOSTypeWorkstation = VER_NT_WORKSTATION, - - //! \brief A “domain controller†system. Windows-specific. - kMinidumpOSTypeDomainController = VER_NT_DOMAIN_CONTROLLER, - - //! \brief A “server†system. - kMinidumpOSTypeServer = VER_NT_SERVER, -}; - -//! \brief Operating system family values for MINIDUMP_SYSTEM_INFO::PlatformId. -//! -//! \sa \ref VER_PLATFORM_x "VER_PLATFORM_*" -enum MinidumpOS : uint32_t { - //! \brief Windows 3.1. - kMinidumpOSWin32s = VER_PLATFORM_WIN32s, - - //! \brief Windows 95, Windows 98, and Windows Me. - kMinidumpOSWin32Windows = VER_PLATFORM_WIN32_WINDOWS, - - //! \brief Windows NT, Windows 2000, and later. - kMinidumpOSWin32NT = VER_PLATFORM_WIN32_NT, - - kMinidumpOSUnix = 0x8000, - - //! \brief macOS, Darwin for traditional systems. - kMinidumpOSMacOSX = 0x8101, - - //! \brief iOS, Darwin for mobile devices. - kMinidumpOSiOS = 0x8102, - - //! \brief Linux, not including Android. - kMinidumpOSLinux = 0x8201, - - kMinidumpOSSolaris = 0x8202, - - //! \brief Android. - kMinidumpOSAndroid = 0x8203, - - kMinidumpOSLegacy = 0x8204, - - //! \brief Native Client (NaCl). - kMinidumpOSNaCl = 0x8205, - - //! \brief Unknown operating system. - kMinidumpOSUnknown = 0xffffffff, -}; - - -//! \brief A list of ::RVA pointers. -struct ALIGNAS(4) PACKED MinidumpRVAList { - //! \brief The number of children present in the #children array. - uint32_t count; - - //! \brief Pointers to other structures in the minidump file. - RVA children[0]; -}; - -//! \brief A key-value pair. -struct ALIGNAS(4) PACKED MinidumpSimpleStringDictionaryEntry { - //! \brief ::RVA of a MinidumpUTF8String containing the key of a key-value - //! pair. - RVA key; - - //! \brief ::RVA of a MinidumpUTF8String containing the value of a key-value - //! pair. - RVA value; -}; - -//! \brief A list of key-value pairs. -struct ALIGNAS(4) PACKED MinidumpSimpleStringDictionary { - //! \brief The number of key-value pairs present. - uint32_t count; - - //! \brief A list of MinidumpSimpleStringDictionaryEntry entries. - MinidumpSimpleStringDictionaryEntry entries[0]; -}; - -//! \brief A typed annotation object. -struct ALIGNAS(4) PACKED MinidumpAnnotation { - //! \brief ::RVA of a MinidumpUTF8String containing the name of the - //! annotation. - RVA name; - - //! \brief The type of data stored in the \a value of the annotation. This - //! may correspond to an \a Annotation::Type or it may be user-defined. - uint16_t type; - - //! \brief This field is always `0`. - uint16_t reserved; - - //! \brief ::RVA of a MinidumpByteArray to the data for the annotation. - RVA value; -}; - -//! \brief A list of annotation objects. -struct ALIGNAS(4) PACKED MinidumpAnnotationList { - //! \brief The number of annotation objects present. - uint32_t count; - - //! \brief A list of MinidumpAnnotation objects. - MinidumpAnnotation objects[0]; -}; - -//! \brief Additional Crashpad-specific information about a module carried -//! within a minidump file. -//! -//! This structure augments the information provided by MINIDUMP_MODULE. The -//! minidump file must contain a module list stream -//! (::kMinidumpStreamTypeModuleList) in order for this structure to appear. -//! -//! This structure is versioned. When changing this structure, leave the -//! existing structure intact so that earlier parsers will be able to understand -//! the fields they are aware of, and make additions at the end of the -//! structure. Revise #kVersion and document each field’s validity based on -//! #version, so that newer parsers will be able to determine whether the added -//! fields are valid or not. -//! -//! \sa MinidumpModuleCrashpadInfoList -struct ALIGNAS(4) PACKED MinidumpModuleCrashpadInfo { - //! \brief The structure’s currently-defined version number. - //! - //! \sa version - static constexpr uint32_t kVersion = 1; - - //! \brief The structure’s version number. - //! - //! Readers can use this field to determine which other fields in the - //! structure are valid. Upon encountering a value greater than #kVersion, a - //! reader should assume that the structure’s layout is compatible with the - //! structure defined as having value #kVersion. - //! - //! Writers may produce values less than #kVersion in this field if there is - //! no need for any fields present in later versions. - uint32_t version; - - //! \brief A MinidumpRVAList pointing to MinidumpUTF8String objects. The - //! module controls the data that appears here. - //! - //! These strings correspond to ModuleSnapshot::AnnotationsVector() and do not - //! duplicate anything in #simple_annotations or #annotation_objects. - //! - //! This field is present when #version is at least `1`. - MINIDUMP_LOCATION_DESCRIPTOR list_annotations; - - //! \brief A MinidumpSimpleStringDictionary pointing to strings interpreted as - //! key-value pairs. The module controls the data that appears here. - //! - //! These key-value pairs correspond to - //! ModuleSnapshot::AnnotationsSimpleMap() and do not duplicate anything in - //! #list_annotations or #annotation_objects. - //! - //! This field is present when #version is at least `1`. - MINIDUMP_LOCATION_DESCRIPTOR simple_annotations; - - //! \brief A MinidumpAnnotationList object containing the annotation objects - //! stored within the module. The module controls the data that appears - //! here. - //! - //! These key-value pairs correspond to ModuleSnapshot::AnnotationObjects() - //! and do not duplicate anything in #list_annotations or #simple_annotations. - //! - //! This field may be present when #version is at least `1`. - MINIDUMP_LOCATION_DESCRIPTOR annotation_objects; -}; - -//! \brief A link between a MINIDUMP_MODULE structure and additional -//! Crashpad-specific information about a module carried within a minidump -//! file. -struct ALIGNAS(4) PACKED MinidumpModuleCrashpadInfoLink { - //! \brief A link to a MINIDUMP_MODULE structure in the module list stream. - //! - //! This field is an index into MINIDUMP_MODULE_LIST::Modules. This field’s - //! value must be in the range of MINIDUMP_MODULE_LIST::NumberOfEntries. - uint32_t minidump_module_list_index; - - //! \brief A link to a MinidumpModuleCrashpadInfo structure. - //! - //! MinidumpModuleCrashpadInfo structures are accessed indirectly through - //! MINIDUMP_LOCATION_DESCRIPTOR pointers to allow for future growth of the - //! MinidumpModuleCrashpadInfo structure. - MINIDUMP_LOCATION_DESCRIPTOR location; -}; - -//! \brief Additional Crashpad-specific information about modules carried within -//! a minidump file. -//! -//! This structure augments the information provided by -//! MINIDUMP_MODULE_LIST. The minidump file must contain a module list stream -//! (::kMinidumpStreamTypeModuleList) in order for this structure to appear. -//! -//! MinidumpModuleCrashpadInfoList::count may be less than the value of -//! MINIDUMP_MODULE_LIST::NumberOfModules because not every MINIDUMP_MODULE -//! structure carried within the minidump file will necessarily have -//! Crashpad-specific information provided by a MinidumpModuleCrashpadInfo -//! structure. -struct ALIGNAS(4) PACKED MinidumpModuleCrashpadInfoList { - //! \brief The number of children present in the #modules array. - uint32_t count; - - //! \brief Crashpad-specific information about modules, along with links to - //! MINIDUMP_MODULE structures that contain module information - //! traditionally carried within minidump files. - MinidumpModuleCrashpadInfoLink modules[0]; -}; - -//! \brief Additional Crashpad-specific information carried within a minidump -//! file. -//! -//! This structure is versioned. When changing this structure, leave the -//! existing structure intact so that earlier parsers will be able to understand -//! the fields they are aware of, and make additions at the end of the -//! structure. Revise #kVersion and document each field’s validity based on -//! #version, so that newer parsers will be able to determine whether the added -//! fields are valid or not. -struct ALIGNAS(4) PACKED MinidumpCrashpadInfo { - // UUID has a constructor, which makes it non-POD, which makes this structure - // non-POD. In order for the default constructor to zero-initialize other - // members, an explicit constructor must be provided. - MinidumpCrashpadInfo() - : version(), - report_id(), - client_id(), - simple_annotations(), - module_list() { - } - - //! \brief The structure’s currently-defined version number. - //! - //! \sa version - static constexpr uint32_t kVersion = 1; - - //! \brief The structure’s version number. - //! - //! Readers can use this field to determine which other fields in the - //! structure are valid. Upon encountering a value greater than #kVersion, a - //! reader should assume that the structure’s layout is compatible with the - //! structure defined as having value #kVersion. - //! - //! Writers may produce values less than #kVersion in this field if there is - //! no need for any fields present in later versions. - uint32_t version; - - //! \brief A %UUID identifying an individual crash report. - //! - //! This provides a stable identifier for a crash even as the report is - //! converted to different formats, provided that all formats support storing - //! a crash report ID. - //! - //! If no identifier is available, this field will contain zeroes. - //! - //! This field is present when #version is at least `1`. - UUID report_id; - - //! \brief A %UUID identifying the client that crashed. - //! - //! Client identification is within the scope of the application, but it is - //! expected that the identifier will be unique for an instance of Crashpad - //! monitoring an application or set of applications for a user. The - //! identifier shall remain stable over time. - //! - //! If no identifier is available, this field will contain zeroes. - //! - //! This field is present when #version is at least `1`. - UUID client_id; - - //! \brief A MinidumpSimpleStringDictionary pointing to strings interpreted as - //! key-value pairs. - //! - //! These key-value pairs correspond to - //! ProcessSnapshot::AnnotationsSimpleMap(). - //! - //! This field is present when #version is at least `1`. - MINIDUMP_LOCATION_DESCRIPTOR simple_annotations; - - //! \brief A pointer to a MinidumpModuleCrashpadInfoList structure. - //! - //! This field is present when #version is at least `1`. - MINIDUMP_LOCATION_DESCRIPTOR module_list; -}; - -#if defined(COMPILER_MSVC) -#pragma pack(pop) -#endif // COMPILER_MSVC -#undef PACKED - -MSVC_POP_WARNING(); // C4200 - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_EXTENSIONS_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_file_writer.h b/Tools/Crashpad/include/minidump/minidump_file_writer.h deleted file mode 100644 index ce2f1d75a5..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_file_writer.h +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_FILE_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_FILE_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <sys/types.h> - -#include <memory> -#include <set> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" -#include "util/file/file_io.h" - -namespace crashpad { - -class ProcessSnapshot; -class MinidumpUserExtensionStreamDataSource; - -//! \brief The root-level object in a minidump file. -//! -//! This object writes a MINIDUMP_HEADER and list of MINIDUMP_DIRECTORY entries -//! to a minidump file. -class MinidumpFileWriter final : public internal::MinidumpWritable { - public: - MinidumpFileWriter(); - ~MinidumpFileWriter() override; - - //! \brief Initializes the MinidumpFileWriter and populates it with - //! appropriate child streams based on \a process_snapshot. - //! - //! This method will add additional streams to the minidump file as children - //! of the MinidumpFileWriter object and as pointees of the top-level - //! MINIDUMP_DIRECTORY. To do so, it will obtain other snapshot information - //! from \a process_snapshot, such as a SystemSnapshot, lists of - //! ThreadSnapshot and ModuleSnapshot objects, and, if available, an - //! ExceptionSnapshot. - //! - //! The streams are added in the order that they are expected to be most - //! useful to minidump readers, to improve data locality and minimize seeking. - //! The streams are added in this order: - //! - kMinidumpStreamTypeSystemInfo - //! - kMinidumpStreamTypeMiscInfo - //! - kMinidumpStreamTypeThreadList - //! - kMinidumpStreamTypeException (if present) - //! - kMinidumpStreamTypeModuleList - //! - kMinidumpStreamTypeUnloadedModuleList (if present) - //! - kMinidumpStreamTypeCrashpadInfo (if present) - //! - kMinidumpStreamTypeMemoryInfoList (if present) - //! - kMinidumpStreamTypeHandleData (if present) - //! - User streams (if present) - //! - kMinidumpStreamTypeMemoryList - //! - //! \param[in] process_snapshot The process snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ProcessSnapshot* process_snapshot); - - //! \brief Sets MINIDUMP_HEADER::Timestamp. - //! - //! \note Valid in #kStateMutable. - void SetTimestamp(time_t timestamp); - - //! \brief Adds a stream to the minidump file and arranges for a - //! MINIDUMP_DIRECTORY entry to point to it. - //! - //! This object takes ownership of \a stream and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! At most one object of each stream type (as obtained from - //! internal::MinidumpStreamWriter::StreamType()) may be added to a - //! MinidumpFileWriter object. If an attempt is made to add a stream whose - //! type matches an existing stream’s type, this method discards the new - //! stream. - //! - //! \note Valid in #kStateMutable. - //! - //! \return `true` on success. `false` on failure, as occurs when an attempt - //! is made to add a stream whose type matches an existing stream’s type, - //! with a message logged. - bool AddStream(std::unique_ptr<internal::MinidumpStreamWriter> stream); - - //! \brief Adds a user extension stream to the minidump file and arranges for - //! a MINIDUMP_DIRECTORY entry to point to it. - //! - //! This object takes ownership of \a user_extension_stream_data. - //! - //! At most one object of each stream type (as obtained from - //! internal::MinidumpStreamWriter::StreamType()) may be added to a - //! MinidumpFileWriter object. If an attempt is made to add a stream whose - //! type matches an existing stream’s type, this method discards the new - //! stream. - //! - //! \param[in] user_extension_stream_data The stream data to add to the - //! minidump file. Note that the buffer this object points to must be valid - //! through WriteEverything(). - //! - //! \note Valid in #kStateMutable. - //! - //! \return `true` on success. `false` on failure, as occurs when an attempt - //! is made to add a stream whose type matches an existing stream’s type, - //! with a message logged. - bool AddUserExtensionStream( - std::unique_ptr<MinidumpUserExtensionStreamDataSource> - user_extension_stream_data); - - // MinidumpWritable: - - //! \copydoc internal::MinidumpWritable::WriteEverything() - //! - //! This method does not initially write the final value for - //! MINIDUMP_HEADER::Signature. After all child objects have been written, it - //! rewinds to the beginning of the file and writes the correct value for this - //! field. This prevents incompletely-written minidump files from being - //! mistaken for valid ones. - bool WriteEverything(FileWriterInterface* file_writer) override; - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WillWriteAtOffsetImpl(FileOffset offset) override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MINIDUMP_HEADER header_; - std::vector<std::unique_ptr<internal::MinidumpStreamWriter>> streams_; - - // Protects against multiple streams with the same ID being added. - std::set<MinidumpStreamType> stream_types_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpFileWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_handle_writer.h b/Tools/Crashpad/include/minidump/minidump_handle_writer.h deleted file mode 100644 index f8eaeef941..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_handle_writer.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_HANDLE_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_HANDLE_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <sys/types.h> - -#include <map> -#include <string> -#include <vector> - -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_string_writer.h" -#include "minidump/minidump_writable.h" -#include "snapshot/handle_snapshot.h" - -namespace crashpad { - -//! \brief The writer for a MINIDUMP_HANDLE_DATA_STREAM stream in a minidump -//! and its contained MINIDUMP_HANDLE_DESCRIPTOR s. -//! -//! As we currently do not track any data beyond what MINIDUMP_HANDLE_DESCRIPTOR -//! supports, we only write that type of record rather than the newer -//! MINIDUMP_HANDLE_DESCRIPTOR_2. -//! -//! Note that this writer writes both the header (MINIDUMP_HANDLE_DATA_STREAM) -//! and the list of objects (MINIDUMP_HANDLE_DESCRIPTOR), which is different -//! from some of the other list writers. -class MinidumpHandleDataWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpHandleDataWriter(); - ~MinidumpHandleDataWriter() override; - - //! \brief Adds a MINIDUMP_HANDLE_DESCRIPTOR for each handle in \a - //! handle_snapshot to the MINIDUMP_HANDLE_DATA_STREAM. - //! - //! \param[in] handle_snapshots The handle snapshots to use as source data. - //! - //! \note Valid in #kStateMutable. - void InitializeFromSnapshot( - const std::vector<HandleSnapshot>& handle_snapshots); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - MINIDUMP_HANDLE_DATA_STREAM handle_data_stream_base_; - std::vector<MINIDUMP_HANDLE_DESCRIPTOR> handle_descriptors_; - std::map<std::string, internal::MinidumpUTF16StringWriter*> strings_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpHandleDataWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_HANDLE_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_memory_info_writer.h b/Tools/Crashpad/include/minidump/minidump_memory_info_writer.h deleted file mode 100644 index ec66019703..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_memory_info_writer.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_INFO_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_INFO_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> - -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class MemoryMapRegionSnapshot; -class MinidumpContextWriter; -class MinidumpMemoryListWriter; -class MinidumpMemoryWriter; - -//! \brief The writer for a MINIDUMP_MEMORY_INFO_LIST stream in a minidump file, -//! containing a list of MINIDUMP_MEMORY_INFO objects. -class MinidumpMemoryInfoListWriter final - : public internal::MinidumpStreamWriter { - public: - MinidumpMemoryInfoListWriter(); - ~MinidumpMemoryInfoListWriter() override; - - //! \brief Initializes a MINIDUMP_MEMORY_INFO_LIST based on \a memory_map. - //! - //! \param[in] memory_map The vector of memory map region snapshots to use as - //! source data. - //! - //! \note Valid in #kStateMutable. - void InitializeFromSnapshot( - const std::vector<const MemoryMapRegionSnapshot*>& memory_map); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<internal::MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - MINIDUMP_MEMORY_INFO_LIST memory_info_list_base_; - std::vector<MINIDUMP_MEMORY_INFO> items_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMemoryInfoListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_INFO_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_memory_writer.h b/Tools/Crashpad/include/minidump/minidump_memory_writer.h deleted file mode 100644 index 955209076c..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_memory_writer.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" -#include "snapshot/memory_snapshot.h" -#include "util/file/file_io.h" - -namespace crashpad { - -//! \brief The base class for writers of memory ranges pointed to by -//! MINIDUMP_MEMORY_DESCRIPTOR objects in a minidump file. -class SnapshotMinidumpMemoryWriter : public internal::MinidumpWritable, - public MemorySnapshot::Delegate { - public: - explicit SnapshotMinidumpMemoryWriter(const MemorySnapshot* memory_snapshot); - ~SnapshotMinidumpMemoryWriter() override; - - //! \brief Returns a MINIDUMP_MEMORY_DESCRIPTOR referencing the data that this - //! object writes. - //! - //! This method is expected to be called by a MinidumpMemoryListWriter in - //! order to obtain a MINIDUMP_MEMORY_DESCRIPTOR to include in its list. - //! - //! \note Valid in #kStateWritable. - const MINIDUMP_MEMORY_DESCRIPTOR* MinidumpMemoryDescriptor() const; - - //! \brief Registers a memory descriptor as one that should point to the - //! object on which this method is called. - //! - //! This method is expected to be called by objects of other classes, when - //! those other classes have their own memory descriptors that need to point - //! to memory ranges within a minidump file. MinidumpThreadWriter is one such - //! class. This method is public for this reason, otherwise it would suffice - //! to be private. - //! - //! \note Valid in #kStateFrozen or any preceding state. - void RegisterMemoryDescriptor(MINIDUMP_MEMORY_DESCRIPTOR* memory_descriptor); - - private: - // MemorySnapshot::Delegate: - bool MemorySnapshotDelegateRead(void* data, size_t size) override; - - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() final; - bool WriteObject(FileWriterInterface* file_writer) override; - - //! \brief Returns the object’s desired byte-boundary alignment. - //! - //! Memory regions are aligned to a 16-byte boundary. The actual alignment - //! requirements of any data within the memory region are unknown, and may be - //! more or less strict than this depending on the platform. - //! - //! \return `16`. - //! - //! \note Valid in #kStateFrozen or any subsequent state. - size_t Alignment() override; - - bool WillWriteAtOffsetImpl(FileOffset offset) override; - - //! \brief Returns the object’s desired write phase. - //! - //! Memory regions are written at the end of minidump files, because it is - //! expected that unlike most other data in a minidump file, the contents of - //! memory regions will be accessed sparsely. - //! - //! \return #kPhaseLate. - //! - //! \note Valid in any state. - Phase WritePhase() final; - - //! \brief Gets the underlying memory snapshot that the memory writer will - //! write to the minidump. - const MemorySnapshot& UnderlyingSnapshot() const { return *memory_snapshot_; } - - MINIDUMP_MEMORY_DESCRIPTOR memory_descriptor_; - - // weak - std::vector<MINIDUMP_MEMORY_DESCRIPTOR*> registered_memory_descriptors_; - const MemorySnapshot* memory_snapshot_; - FileWriterInterface* file_writer_; - - DISALLOW_COPY_AND_ASSIGN(SnapshotMinidumpMemoryWriter); -}; - -//! \brief The writer for a MINIDUMP_MEMORY_LIST stream in a minidump file, -//! containing a list of MINIDUMP_MEMORY_DESCRIPTOR objects. -class MinidumpMemoryListWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpMemoryListWriter(); - ~MinidumpMemoryListWriter() override; - - //! \brief Adds a concrete initialized SnapshotMinidumpMemoryWriter for each - //! memory snapshot in \a memory_snapshots to the MINIDUMP_MEMORY_LIST. - //! - //! Memory snapshots are added in the fashion of AddMemory(). - //! - //! \param[in] memory_snapshots The memory snapshots to use as source data. - //! - //! \note Valid in #kStateMutable. - void AddFromSnapshot( - const std::vector<const MemorySnapshot*>& memory_snapshots); - - //! \brief Adds a SnapshotMinidumpMemoryWriter to the MINIDUMP_MEMORY_LIST. - //! - //! This object takes ownership of \a memory_writer and becomes its parent in - //! the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void AddMemory(std::unique_ptr<SnapshotMinidumpMemoryWriter> memory_writer); - - //! \brief Adds a SnapshotMinidumpMemoryWriter that’s a child of another - //! internal::MinidumpWritable object to the MINIDUMP_MEMORY_LIST. - //! - //! \a memory_writer does not become a child of this object, but the - //! MINIDUMP_MEMORY_LIST will still contain a MINIDUMP_MEMORY_DESCRIPTOR for - //! it. \a memory_writer must be a child of another object in the - //! internal::MinidumpWritable tree. - //! - //! This method exists to be called by objects that have their own - //! SnapshotMinidumpMemoryWriter children but wish for them to also appear in - //! the minidump file’s MINIDUMP_MEMORY_LIST. MinidumpThreadWriter, which has - //! a SnapshotMinidumpMemoryWriter for thread stack memory, is an example. - //! - //! \note Valid in #kStateMutable. - void AddExtraMemory(SnapshotMinidumpMemoryWriter* memory_writer); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - std::vector<SnapshotMinidumpMemoryWriter*> memory_writers_; // weak - std::vector<std::unique_ptr<SnapshotMinidumpMemoryWriter>> children_; - MINIDUMP_MEMORY_LIST memory_list_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMemoryListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_MEMORY_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_misc_info_writer.h b/Tools/Crashpad/include/minidump/minidump_misc_info_writer.h deleted file mode 100644 index ee90b0eac0..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_misc_info_writer.h +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_MISC_INFO_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_MISC_INFO_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> -#include <time.h> - -#include <string> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class ProcessSnapshot; - -namespace internal { - -//! \brief Returns the string to set in MINIDUMP_MISC_INFO_4::DbgBldStr. -//! -//! dbghelp produces strings like `"dbghelp.i386,6.3.9600.16520"` and -//! `"dbghelp.amd64,6.3.9600.16520"`. This function mimics that format, and adds -//! the OS that wrote the minidump along with any relevant platform-specific -//! data describing the compilation environment. -//! -//! This function is an implementation detail of -//! MinidumpMiscInfoWriter::InitializeFromSnapshot() and is only exposed for -//! testing purposes. -std::string MinidumpMiscInfoDebugBuildString(); - -} // namespace internal - -//! \brief The writer for a stream in the MINIDUMP_MISC_INFO family in a -//! minidump file. -//! -//! The actual stream written will be a MINIDUMP_MISC_INFO, -//! MINIDUMP_MISC_INFO_2, MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4, or -//! MINIDUMP_MISC_INFO_5 stream. Later versions of MINIDUMP_MISC_INFO are -//! supersets of earlier versions. The earliest version that supports all of the -//! information that an object of this class contains will be used. -class MinidumpMiscInfoWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpMiscInfoWriter(); - ~MinidumpMiscInfoWriter() override; - - //! \brief Initializes MINIDUMP_MISC_INFO_N based on \a process_snapshot. - //! - //! \param[in] process_snapshot The process snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ProcessSnapshot* process_snapshot); - - //! \brief Sets the field referenced by #MINIDUMP_MISC1_PROCESS_ID. - void SetProcessID(uint32_t process_id); - - //! \brief Sets the fields referenced by #MINIDUMP_MISC1_PROCESS_TIMES. - void SetProcessTimes(time_t process_create_time, - uint32_t process_user_time, - uint32_t process_kernel_time); - - //! \brief Sets the fields referenced by #MINIDUMP_MISC1_PROCESSOR_POWER_INFO. - void SetProcessorPowerInfo(uint32_t processor_max_mhz, - uint32_t processor_current_mhz, - uint32_t processor_mhz_limit, - uint32_t processor_max_idle_state, - uint32_t processor_current_idle_state); - - //! \brief Sets the field referenced by #MINIDUMP_MISC3_PROCESS_INTEGRITY. - void SetProcessIntegrityLevel(uint32_t process_integrity_level); - - //! \brief Sets the field referenced by #MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS. - void SetProcessExecuteFlags(uint32_t process_execute_flags); - - //! \brief Sets the field referenced by #MINIDUMP_MISC3_PROTECTED_PROCESS. - void SetProtectedProcess(uint32_t protected_process); - - //! \brief Sets the fields referenced by #MINIDUMP_MISC3_TIMEZONE. - void SetTimeZone(uint32_t time_zone_id, - int32_t bias, - const std::string& standard_name, - const SYSTEMTIME& standard_date, - int32_t standard_bias, - const std::string& daylight_name, - const SYSTEMTIME& daylight_date, - int32_t daylight_bias); - - //! \brief Sets the fields referenced by #MINIDUMP_MISC4_BUILDSTRING. - void SetBuildString(const std::string& build_string, - const std::string& debug_build_string); - - // TODO(mark): Provide a better interface than this. Don’t force callers to - // build their own XSTATE_CONFIG_FEATURE_MSC_INFO structure. - // - //! \brief Sets MINIDUMP_MISC_INFO_5::XStateData. - void SetXStateData(const XSTATE_CONFIG_FEATURE_MSC_INFO& xstate_data); - - //! \brief Sets the field referenced by #MINIDUMP_MISC5_PROCESS_COOKIE. - void SetProcessCookie(uint32_t process_cookie); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - bool WriteObject(FileWriterInterface* file_writer) override; - MinidumpStreamType StreamType() const override; - - private: - //! \brief Returns the size of the object to be written based on - //! MINIDUMP_MISC_INFO_N::Flags1. - //! - //! The smallest defined structure type in the MINIDUMP_MISC_INFO family that - //! can hold all of the data that has been populated will be used. - size_t CalculateSizeOfObjectFromFlags() const; - - MINIDUMP_MISC_INFO_N misc_info_; - bool has_xstate_data_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpMiscInfoWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_MISC_INFO_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_module_crashpad_info_writer.h b/Tools/Crashpad/include/minidump/minidump_module_crashpad_info_writer.h deleted file mode 100644 index 850db04038..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_module_crashpad_info_writer.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_MODULE_CRASHPAD_INFO_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_MODULE_CRASHPAD_INFO_WRITER_H_ - -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_string_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class MinidumpAnnotationListWriter; -class MinidumpSimpleStringDictionaryWriter; -class ModuleSnapshot; - -//! \brief The writer for a MinidumpModuleCrashpadInfo object in a minidump -//! file. -class MinidumpModuleCrashpadInfoWriter final - : public internal::MinidumpWritable { - public: - MinidumpModuleCrashpadInfoWriter(); - ~MinidumpModuleCrashpadInfoWriter() override; - - //! \brief Initializes MinidumpModuleCrashpadInfo based on \a module_snapshot. - //! - //! Only data in \a module_snapshot that is considered useful will be - //! included. For simple annotations, usefulness is determined by - //! MinidumpSimpleStringDictionaryWriter::IsUseful(). - //! - //! \param[in] module_snapshot The module snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ModuleSnapshot* module_snapshot); - - //! \brief Arranges for MinidumpModuleCrashpadInfo::list_annotations to point - //! to the internal::MinidumpUTF8StringListWriter object to be written by - //! \a list_annotations. - //! - //! This object takes ownership of \a simple_annotations and becomes its - //! parent in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetListAnnotations( - std::unique_ptr<MinidumpUTF8StringListWriter> list_annotations); - - //! \brief Arranges for MinidumpModuleCrashpadInfo::simple_annotations to - //! point to the MinidumpSimpleStringDictionaryWriter object to be written - //! by \a simple_annotations. - //! - //! This object takes ownership of \a simple_annotations and becomes its - //! parent in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetSimpleAnnotations( - std::unique_ptr<MinidumpSimpleStringDictionaryWriter> simple_annotations); - - //! \brief Arranges for MinidumpModuleCrashpadInfo::annotation_objects to - //! point to the MinidumpAnnotationListWriter object to be written by - //! \a annotation_objects. - //! - //! This object takes ownership of \a annotation_objects and becomes its - //! parent in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetAnnotationObjects( - std::unique_ptr<MinidumpAnnotationListWriter> annotation_objects); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying list annotations or - //! simple annotations would be considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MinidumpModuleCrashpadInfo module_; - std::unique_ptr<MinidumpUTF8StringListWriter> list_annotations_; - std::unique_ptr<MinidumpSimpleStringDictionaryWriter> simple_annotations_; - std::unique_ptr<MinidumpAnnotationListWriter> annotation_objects_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCrashpadInfoWriter); -}; - -//! \brief The writer for a MinidumpModuleCrashpadInfoList object in a minidump -//! file, containing a list of MinidumpModuleCrashpadInfo objects. -class MinidumpModuleCrashpadInfoListWriter final - : public internal::MinidumpWritable { - public: - MinidumpModuleCrashpadInfoListWriter(); - ~MinidumpModuleCrashpadInfoListWriter() override; - - //! \brief Adds an initialized MinidumpModuleCrashpadInfo for modules in \a - //! module_snapshots to the MinidumpModuleCrashpadInfoList. - //! - //! Only modules in \a module_snapshots that would produce a useful - //! MinidumpModuleCrashpadInfo structure are included. Usefulness is - //! determined by MinidumpModuleCrashpadInfoWriter::IsUseful(). - //! - //! \param[in] module_snapshots The module snapshots to use as source data. - //! - //! \note Valid in #kStateMutable. AddModule() may not be called before this - //! method, and it is not normally necessary to call AddModule() after - //! this method. - void InitializeFromSnapshot( - const std::vector<const ModuleSnapshot*>& module_snapshots); - - //! \brief Adds a MinidumpModuleCrashpadInfo to the - //! MinidumpModuleCrashpadInfoList. - //! - //! \param[in] module_crashpad_info Extended Crashpad-specific information - //! about the module. This object takes ownership of \a - //! module_crashpad_info and becomes its parent in the overall tree of - //! internal::MinidumpWritable objects. - //! \param[in] minidump_module_list_index The index of the MINIDUMP_MODULE in - //! the minidump file’s MINIDUMP_MODULE_LIST stream that corresponds to \a - //! module_crashpad_info. - //! - //! \note Valid in #kStateMutable. - void AddModule( - std::unique_ptr<MinidumpModuleCrashpadInfoWriter> module_crashpad_info, - size_t minidump_module_list_index); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying children would be - //! considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - std::vector<std::unique_ptr<MinidumpModuleCrashpadInfoWriter>> - module_crashpad_infos_; - std::vector<MinidumpModuleCrashpadInfoLink> module_crashpad_info_links_; - MinidumpModuleCrashpadInfoList module_crashpad_info_list_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCrashpadInfoListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_MODULE_CRASHPAD_INFO_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_module_writer.h b/Tools/Crashpad/include/minidump/minidump_module_writer.h deleted file mode 100644 index 555c41157f..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_module_writer.h +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> -#include <time.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "base/strings/string16.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class ModuleSnapshot; - -namespace internal { -class MinidumpUTF16StringWriter; -} // namespace internal - -//! \brief The base class for writers of CodeView records referenced by -//! MINIDUMP_MODULE::CvRecord in minidump files. -class MinidumpModuleCodeViewRecordWriter : public internal::MinidumpWritable { - public: - ~MinidumpModuleCodeViewRecordWriter() override; - - protected: - MinidumpModuleCodeViewRecordWriter() : MinidumpWritable() {} - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordWriter); -}; - -namespace internal { - -//! \brief The base class for writers of CodeView records that serve as links to -//! `.pdb` (program database) files. -template <typename CodeViewRecordType> -class MinidumpModuleCodeViewRecordPDBLinkWriter - : public MinidumpModuleCodeViewRecordWriter { - public: - //! \brief Sets the name of the `.pdb` file being linked to. - void SetPDBName(const std::string& pdb_name) { pdb_name_ = pdb_name; } - - protected: - MinidumpModuleCodeViewRecordPDBLinkWriter(); - ~MinidumpModuleCodeViewRecordPDBLinkWriter() override; - - // MinidumpWritable: - size_t SizeOfObject() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - //! \brief Returns a pointer to the raw CodeView record’s data. - //! - //! Subclasses can use this to set fields in their codeview records other than - //! the `pdb_name` field. - CodeViewRecordType* codeview_record() { return &codeview_record_; } - - private: - CodeViewRecordType codeview_record_; - std::string pdb_name_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDBLinkWriter); -}; - -} // namespace internal - -//! \brief The writer for a CodeViewRecordPDB20 object in a minidump file. -//! -//! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead. -class MinidumpModuleCodeViewRecordPDB20Writer final - : public internal::MinidumpModuleCodeViewRecordPDBLinkWriter< - CodeViewRecordPDB20> { - public: - MinidumpModuleCodeViewRecordPDB20Writer() - : internal::MinidumpModuleCodeViewRecordPDBLinkWriter< - CodeViewRecordPDB20>() {} - - ~MinidumpModuleCodeViewRecordPDB20Writer() override; - - //! \brief Sets CodeViewRecordPDB20::timestamp and CodeViewRecordPDB20::age. - void SetTimestampAndAge(time_t timestamp, uint32_t age); - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDB20Writer); -}; - -//! \brief The writer for a CodeViewRecordPDB70 object in a minidump file. -class MinidumpModuleCodeViewRecordPDB70Writer final - : public internal::MinidumpModuleCodeViewRecordPDBLinkWriter< - CodeViewRecordPDB70> { - public: - MinidumpModuleCodeViewRecordPDB70Writer() - : internal::MinidumpModuleCodeViewRecordPDBLinkWriter< - CodeViewRecordPDB70>() {} - - ~MinidumpModuleCodeViewRecordPDB70Writer() override; - - //! \brief Initializes the CodeViewRecordPDB70 based on \a module_snapshot. - //! - //! \param[in] module_snapshot The module snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ModuleSnapshot* module_snapshot); - - //! \brief Sets CodeViewRecordPDB70::uuid and CodeViewRecordPDB70::age. - void SetUUIDAndAge(const UUID& uuid, uint32_t age) { - codeview_record()->uuid = uuid; - codeview_record()->age = age; - } - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDB70Writer); -}; - -//! \brief The writer for an IMAGE_DEBUG_MISC object in a minidump file. -//! -//! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead. -class MinidumpModuleMiscDebugRecordWriter final - : public internal::MinidumpWritable { - public: - MinidumpModuleMiscDebugRecordWriter(); - ~MinidumpModuleMiscDebugRecordWriter() override; - - //! \brief Sets IMAGE_DEBUG_MISC::DataType. - void SetDataType(uint32_t data_type) { - image_debug_misc_.DataType = data_type; - } - - //! \brief Sets IMAGE_DEBUG_MISC::Data, IMAGE_DEBUG_MISC::Length, and - //! IMAGE_DEBUG_MISC::Unicode. - //! - //! If \a utf16 is `true`, \a data will be treated as UTF-8 data and will be - //! converted to UTF-16, and IMAGE_DEBUG_MISC::Unicode will be set to `1`. - //! Otherwise, \a data will be used as-is and IMAGE_DEBUG_MISC::Unicode will - //! be set to `0`. - void SetData(const std::string& data, bool utf16); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - IMAGE_DEBUG_MISC image_debug_misc_; - std::string data_; - base::string16 data_utf16_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleMiscDebugRecordWriter); -}; - -//! \brief The writer for a MINIDUMP_MODULE object in a minidump file. -//! -//! Because MINIDUMP_MODULE objects only appear as elements of -//! MINIDUMP_MODULE_LIST objects, this class does not write any data on its own. -//! It makes its MINIDUMP_MODULE data available to its MinidumpModuleListWriter -//! parent, which writes it as part of a MINIDUMP_MODULE_LIST. -class MinidumpModuleWriter final : public internal::MinidumpWritable { - public: - MinidumpModuleWriter(); - ~MinidumpModuleWriter() override; - - //! \brief Initializes the MINIDUMP_MODULE based on \a module_snapshot. - //! - //! \param[in] module_snapshot The module snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ModuleSnapshot* module_snapshot); - - //! \brief Returns a MINIDUMP_MODULE referencing this object’s data. - //! - //! This method is expected to be called by a MinidumpModuleListWriter in - //! order to obtain a MINIDUMP_MODULE to include in its list. - //! - //! \note Valid in #kStateWritable. - const MINIDUMP_MODULE* MinidumpModule() const; - - //! \brief Arranges for MINIDUMP_MODULE::ModuleNameRva to point to a - //! MINIDUMP_STRING containing \a name. - //! - //! A name is required in all MINIDUMP_MODULE objects. - //! - //! \note Valid in #kStateMutable. - void SetName(const std::string& name); - - //! \brief Arranges for MINIDUMP_MODULE::CvRecord to point to a CodeView - //! record to be written by \a codeview_record. - //! - //! This object takes ownership of \a codeview_record and becomes its parent - //! in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetCodeViewRecord( - std::unique_ptr<MinidumpModuleCodeViewRecordWriter> codeview_record); - - //! \brief Arranges for MINIDUMP_MODULE::MiscRecord to point to an - //! IMAGE_DEBUG_MISC object to be written by \a misc_debug_record. - //! - //! This object takes ownership of \a misc_debug_record and becomes its parent - //! in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetMiscDebugRecord( - std::unique_ptr<MinidumpModuleMiscDebugRecordWriter> misc_debug_record); - - //! \brief Sets IMAGE_DEBUG_MISC::BaseOfImage. - void SetImageBaseAddress(uint64_t image_base_address) { - module_.BaseOfImage = image_base_address; - } - - //! \brief Sets IMAGE_DEBUG_MISC::SizeOfImage. - void SetImageSize(uint32_t image_size) { module_.SizeOfImage = image_size; } - - //! \brief Sets IMAGE_DEBUG_MISC::CheckSum. - void SetChecksum(uint32_t checksum) { module_.CheckSum = checksum; } - - //! \brief Sets IMAGE_DEBUG_MISC::TimeDateStamp. - //! - //! \note Valid in #kStateMutable. - void SetTimestamp(time_t timestamp); - - //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileVersionMS - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileVersionMS" and \ref - //! VS_FIXEDFILEINFO::dwFileVersionLS - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileVersionLS". - //! - //! \note Valid in #kStateMutable. - void SetFileVersion(uint16_t version_0, - uint16_t version_1, - uint16_t version_2, - uint16_t version_3); - - //! \brief Sets \ref VS_FIXEDFILEINFO::dwProductVersionMS - //! "IMAGE_DEBUG_MISC::VersionInfo::dwProductVersionMS" and \ref - //! VS_FIXEDFILEINFO::dwProductVersionLS - //! "IMAGE_DEBUG_MISC::VersionInfo::dwProductVersionLS". - //! - //! \note Valid in #kStateMutable. - void SetProductVersion(uint16_t version_0, - uint16_t version_1, - uint16_t version_2, - uint16_t version_3); - - //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileFlags - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileFlags" and \ref - //! VS_FIXEDFILEINFO::dwFileFlagsMask - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileFlagsMask". - //! - //! \note Valid in #kStateMutable. - void SetFileFlagsAndMask(uint32_t file_flags, uint32_t file_flags_mask); - - //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileOS - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileOS". - void SetFileOS(uint32_t file_os) { module_.VersionInfo.dwFileOS = file_os; } - - //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileType - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileType" and \ref - //! VS_FIXEDFILEINFO::dwFileSubtype - //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileSubtype". - void SetFileTypeAndSubtype(uint32_t file_type, uint32_t file_subtype) { - module_.VersionInfo.dwFileType = file_type; - module_.VersionInfo.dwFileSubtype = file_subtype; - } - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MINIDUMP_MODULE module_; - std::unique_ptr<internal::MinidumpUTF16StringWriter> name_; - std::unique_ptr<MinidumpModuleCodeViewRecordWriter> codeview_record_; - std::unique_ptr<MinidumpModuleMiscDebugRecordWriter> misc_debug_record_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleWriter); -}; - -//! \brief The writer for a MINIDUMP_MODULE_LIST stream in a minidump file, -//! containing a list of MINIDUMP_MODULE objects. -class MinidumpModuleListWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpModuleListWriter(); - ~MinidumpModuleListWriter() override; - - //! \brief Adds an initialized MINIDUMP_MODULE for each module in \a - //! module_snapshots to the MINIDUMP_MODULE_LIST. - //! - //! \param[in] module_snapshots The module snapshots to use as source data. - //! - //! \note Valid in #kStateMutable. AddModule() may not be called before this - //! method, and it is not normally necessary to call AddModule() after - //! this method. - void InitializeFromSnapshot( - const std::vector<const ModuleSnapshot*>& module_snapshots); - - //! \brief Adds a MinidumpModuleWriter to the MINIDUMP_MODULE_LIST. - //! - //! This object takes ownership of \a module and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void AddModule(std::unique_ptr<MinidumpModuleWriter> module); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - std::vector<std::unique_ptr<MinidumpModuleWriter>> modules_; - MINIDUMP_MODULE_LIST module_list_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpModuleListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_rva_list_writer.h b/Tools/Crashpad/include/minidump/minidump_rva_list_writer.h deleted file mode 100644 index af584f13cc..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_rva_list_writer.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_RVA_LIST_WRITER_H_ -#define CRASHPAD_MINIDUMP_RVA_LIST_WRITER_H_ - -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { -namespace internal { - -//! \brief The writer for a MinidumpRVAList object in a minidump file, -//! containing a list of ::RVA pointers. -class MinidumpRVAListWriter : public MinidumpWritable { - protected: - MinidumpRVAListWriter(); - ~MinidumpRVAListWriter() override; - - //! \brief Adds an ::RVA referencing an MinidumpWritable to the - //! MinidumpRVAList. - //! - //! This object takes ownership of \a child and becomes its parent in the - //! overall tree of MinidumpWritable objects. - //! - //! To provide type-correctness, subclasses are expected to provide a public - //! method that accepts a `scoped_ptr`-wrapped argument of the proper - //! MinidumpWritable subclass, and call this method with that argument. - //! - //! \note Valid in #kStateMutable. - void AddChild(std::unique_ptr<MinidumpWritable> child); - - //! \brief Returns `true` if no child objects have been added by AddChild(), - //! and `false` if child objects are present. - bool IsEmpty() const { return children_.empty(); } - - //! \brief Returns an object’s ::RVA objects referencing its children. - //! - //! \note The returned vector will be empty until the object advances to - //! #kStateFrozen or beyond. - const std::vector<RVA>& child_rvas() const { return child_rvas_; } - - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - std::unique_ptr<MinidumpRVAList> rva_list_base_; - std::vector<std::unique_ptr<MinidumpWritable>> children_; - std::vector<RVA> child_rvas_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpRVAListWriter); -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_RVA_LIST_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_simple_string_dictionary_writer.h b/Tools/Crashpad/include/minidump/minidump_simple_string_dictionary_writer.h deleted file mode 100644 index f2662bccff..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_simple_string_dictionary_writer.h +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_SIMPLE_STRING_DICTIONARY_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_SIMPLE_STRING_DICTIONARY_WRITER_H_ - -#include <sys/types.h> - -#include <map> -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_string_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -//! \brief The writer for a MinidumpSimpleStringDictionaryEntry object in a -//! minidump file. -//! -//! Because MinidumpSimpleStringDictionaryEntry objects only appear as elements -//! of MinidumpSimpleStringDictionary objects, this class does not write any -//! data on its own. It makes its MinidumpSimpleStringDictionaryEntry data -//! available to its MinidumpSimpleStringDictionaryWriter parent, which writes -//! it as part of a MinidumpSimpleStringDictionary. -class MinidumpSimpleStringDictionaryEntryWriter final - : public internal::MinidumpWritable { - public: - MinidumpSimpleStringDictionaryEntryWriter(); - ~MinidumpSimpleStringDictionaryEntryWriter() override; - - //! \brief Returns a MinidumpSimpleStringDictionaryEntry referencing this - //! object’s data. - //! - //! This method is expected to be called by a - //! MinidumpSimpleStringDictionaryWriter in order to obtain a - //! MinidumpSimpleStringDictionaryEntry to include in its list. - //! - //! \note Valid in #kStateWritable. - const MinidumpSimpleStringDictionaryEntry* - GetMinidumpSimpleStringDictionaryEntry() const; - - //! \brief Sets the strings to be written as the entry object’s key and value. - //! - //! \note Valid in #kStateMutable. - void SetKeyValue(const std::string& key, const std::string& value); - - //! \brief Retrieves the key to be written. - //! - //! \note Valid in any state. - const std::string& Key() const { return key_.UTF8(); } - - protected: - // MinidumpWritable: - - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - struct MinidumpSimpleStringDictionaryEntry entry_; - internal::MinidumpUTF8StringWriter key_; - internal::MinidumpUTF8StringWriter value_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpSimpleStringDictionaryEntryWriter); -}; - -//! \brief The writer for a MinidumpSimpleStringDictionary object in a minidump -//! file, containing a list of MinidumpSimpleStringDictionaryEntry objects. -//! -//! Because this class writes a representatin of a dictionary, the order of -//! entries is insignificant. Entries may be written in any order. -class MinidumpSimpleStringDictionaryWriter final - : public internal::MinidumpWritable { - public: - MinidumpSimpleStringDictionaryWriter(); - ~MinidumpSimpleStringDictionaryWriter() override; - - //! \brief Adds an initialized MinidumpSimpleStringDictionaryEntryWriter for - //! each key-value pair in \a map to the MinidumpSimpleStringDictionary. - //! - //! \param[in] map The map to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromMap(const std::map<std::string, std::string>& map); - - //! \brief Adds a MinidumpSimpleStringDictionaryEntryWriter to the - //! MinidumpSimpleStringDictionary. - //! - //! This object takes ownership of \a entry and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! If the key contained in \a entry duplicates the key of an entry already - //! present in the MinidumpSimpleStringDictionary, the new \a entry will - //! replace the previous one. - //! - //! \note Valid in #kStateMutable. - void AddEntry( - std::unique_ptr<MinidumpSimpleStringDictionaryEntryWriter> entry); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying entries would be - //! considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - protected: - // MinidumpWritable: - - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - // This object owns the MinidumpSimpleStringDictionaryEntryWriter objects. - std::map<std::string, MinidumpSimpleStringDictionaryEntryWriter*> entries_; - - std::unique_ptr<MinidumpSimpleStringDictionary> - simple_string_dictionary_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpSimpleStringDictionaryWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_SIMPLE_STRING_DICTIONARY_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_stream_writer.h b/Tools/Crashpad/include/minidump/minidump_stream_writer.h deleted file mode 100644 index 894889ae8d..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_stream_writer.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_STREAM_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_STREAM_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { -namespace internal { - -//! \brief The base class for all second-level objects (“streamsâ€) in a minidump -//! file. -//! -//! Instances of subclasses of this class are children of the root-level -//! MinidumpFileWriter object. -class MinidumpStreamWriter : public MinidumpWritable { - public: - ~MinidumpStreamWriter() override; - - //! \brief Returns an object’s stream type. - //! - //! \note Valid in any state. - virtual MinidumpStreamType StreamType() const = 0; - - //! \brief Returns a MINIDUMP_DIRECTORY entry that serves as a pointer to this - //! stream. - //! - //! This method is provided for MinidumpFileWriter, which calls it in order to - //! obtain the directory entry for a stream. - //! - //! \note Valid only in #kStateWritable. - const MINIDUMP_DIRECTORY* DirectoryListEntry() const; - - protected: - MinidumpStreamWriter(); - - // MinidumpWritable: - bool Freeze() override; - - private: - MINIDUMP_DIRECTORY directory_list_entry_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpStreamWriter); -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_STREAM_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_string_writer.h b/Tools/Crashpad/include/minidump/minidump_string_writer.h deleted file mode 100644 index 97215da445..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_string_writer.h +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_STRING_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_STRING_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <sys/types.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "base/strings/string16.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_rva_list_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { -namespace internal { - -//! \cond - -struct MinidumpStringWriterUTF16Traits { - using StringType = base::string16; - using MinidumpStringType = MINIDUMP_STRING; -}; - -struct MinidumpStringWriterUTF8Traits { - using StringType = std::string; - using MinidumpStringType = MinidumpUTF8String; -}; - -//! \endcond - -//! \brief Writes a variable-length string to a minidump file in accordance with -//! the string type’s characteristics. -//! -//! MinidumpStringWriter objects should not be instantiated directly. To write -//! strings to minidump file, use the MinidumpUTF16StringWriter and -//! MinidumpUTF8StringWriter subclasses instead. -template <typename Traits> -class MinidumpStringWriter : public MinidumpWritable { - public: - MinidumpStringWriter(); - ~MinidumpStringWriter() override; - - protected: - using MinidumpStringType = typename Traits::MinidumpStringType; - using StringType = typename Traits::StringType; - - bool Freeze() override; - size_t SizeOfObject() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - //! \brief Sets the string to be written. - //! - //! \note Valid in #kStateMutable. - void set_string(const StringType& string) { string_.assign(string); } - - //! \brief Retrieves the string to be written. - //! - //! \note Valid in any state. - const StringType& string() const { return string_; } - - private: - std::unique_ptr<MinidumpStringType> string_base_; - StringType string_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpStringWriter); -}; - -//! \brief Writes a variable-length UTF-16-encoded MINIDUMP_STRING to a minidump -//! file. -//! -//! MinidumpUTF16StringWriter objects should not be instantiated directly -//! outside of the MinidumpWritable family of classes. -class MinidumpUTF16StringWriter final - : public MinidumpStringWriter<MinidumpStringWriterUTF16Traits> { - public: - MinidumpUTF16StringWriter() : MinidumpStringWriter() {} - ~MinidumpUTF16StringWriter() override; - - //! \brief Converts a UTF-8 string to UTF-16 and sets it as the string to be - //! written. - //! - //! \note Valid in #kStateMutable. - void SetUTF8(const std::string& string_utf8); - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpUTF16StringWriter); -}; - -//! \brief Writes a variable-length UTF-8-encoded MinidumpUTF8String to a -//! minidump file. -//! -//! MinidumpUTF8StringWriter objects should not be instantiated directly outside -//! of the MinidumpWritable family of classes. -class MinidumpUTF8StringWriter final - : public MinidumpStringWriter<MinidumpStringWriterUTF8Traits> { - public: - MinidumpUTF8StringWriter() : MinidumpStringWriter() {} - ~MinidumpUTF8StringWriter() override; - - //! \brief Sets the string to be written. - //! - //! \note Valid in #kStateMutable. - void SetUTF8(const std::string& string_utf8) { set_string(string_utf8); } - - //! \brief Retrieves the string to be written. - //! - //! \note Valid in any state. - const std::string& UTF8() const { return string(); } - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpUTF8StringWriter); -}; - -//! \brief The writer for a MinidumpRVAList object in a minidump file, -//! containing a list of \a MinidumpStringWriterType objects. -template <typename MinidumpStringWriterType> -class MinidumpStringListWriter final : public MinidumpRVAListWriter { - public: - MinidumpStringListWriter(); - ~MinidumpStringListWriter() override; - - //! \brief Adds a new \a Traits::MinidumpStringWriterType for each element in - //! \a vector to the MinidumpRVAList. - //! - //! \param[in] vector The vector to use as source data. Each string in the - //! vector is treated as a UTF-8 string, and a new string writer will be - //! created for each one and made a child of the MinidumpStringListWriter. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromVector(const std::vector<std::string>& vector); - - //! \brief Creates a new \a Traits::MinidumpStringWriterType object and adds - //! it to the MinidumpRVAList. - //! - //! This object creates a new string writer with string value \a string_utf8, - //! takes ownership of it, and becomes its parent in the overall tree of - //! MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void AddStringUTF8(const std::string& string_utf8); - - //! \brief Determines whether the object is useful. - //! - //! A useful object is one that carries data that makes a meaningful - //! contribution to a minidump file. An object carrying entries would be - //! considered useful. - //! - //! \return `true` if the object is useful, `false` otherwise. - bool IsUseful() const; - - private: - DISALLOW_COPY_AND_ASSIGN(MinidumpStringListWriter); -}; - -} // namespace internal - -using MinidumpUTF16StringListWriter = internal::MinidumpStringListWriter< - internal::MinidumpUTF16StringWriter>; -using MinidumpUTF8StringListWriter = internal::MinidumpStringListWriter< - internal::MinidumpUTF8StringWriter>; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_STRING_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_system_info_writer.h b/Tools/Crashpad/include/minidump/minidump_system_info_writer.h deleted file mode 100644 index 866530c304..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_system_info_writer.h +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_SYSTEM_INFO_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_SYSTEM_INFO_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class SystemSnapshot; - -namespace internal { -class MinidumpUTF16StringWriter; -} // namespace internal - -//! \brief The writer for a MINIDUMP_SYSTEM_INFO stream in a minidump file. -class MinidumpSystemInfoWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpSystemInfoWriter(); - ~MinidumpSystemInfoWriter() override; - - //! \brief Initializes MINIDUMP_SYSTEM_INFO based on \a system_snapshot. - //! - //! \param[in] system_snapshot The system snapshot to use as source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const SystemSnapshot* system_snapshot); - - //! \brief Sets MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. - void SetCPUArchitecture(MinidumpCPUArchitecture processor_architecture) { - system_info_.ProcessorArchitecture = processor_architecture; - } - - //! \brief Sets MINIDUMP_SYSTEM_INFO::ProcessorLevel and - //! MINIDUMP_SYSTEM_INFO::ProcessorRevision. - void SetCPULevelAndRevision(uint16_t processor_level, - uint16_t processor_revision) { - system_info_.ProcessorLevel = processor_level; - system_info_.ProcessorRevision = processor_revision; - } - - //! \brief Sets MINIDUMP_SYSTEM_INFO::NumberOfProcessors. - void SetCPUCount(uint8_t number_of_processors) { - system_info_.NumberOfProcessors = number_of_processors; - } - - //! \brief Sets MINIDUMP_SYSTEM_INFO::PlatformId. - void SetOS(MinidumpOS platform_id) { system_info_.PlatformId = platform_id; } - - //! \brief Sets MINIDUMP_SYSTEM_INFO::ProductType. - void SetOSType(MinidumpOSType product_type) { - system_info_.ProductType = product_type; - } - - //! \brief Sets MINIDUMP_SYSTEM_INFO::MajorVersion, - //! MINIDUMP_SYSTEM_INFO::MinorVersion, and - //! MINIDUMP_SYSTEM_INFO::BuildNumber. - void SetOSVersion(uint32_t major_version, - uint32_t minor_version, - uint32_t build_number) { - system_info_.MajorVersion = major_version; - system_info_.MinorVersion = minor_version; - system_info_.BuildNumber = build_number; - } - - //! \brief Arranges for MINIDUMP_SYSTEM_INFO::CSDVersionRva to point to a - //! MINIDUMP_STRING containing the supplied string. - //! - //! This method must be called prior to Freeze(). A CSD version is required - //! in all MINIDUMP_SYSTEM_INFO streams. An empty string is an acceptable - //! value. - void SetCSDVersion(const std::string& csd_version); - - //! \brief Sets MINIDUMP_SYSTEM_INFO::SuiteMask. - void SetSuiteMask(uint16_t suite_mask) { - system_info_.SuiteMask = suite_mask; - } - - //! \brief Sets \ref CPU_INFORMATION::VendorId - //! "MINIDUMP_SYSTEM_INFO::Cpu::X86CpuInfo::VendorId". - //! - //! This is only valid if SetCPUArchitecture() has been used to set the CPU - //! architecture to #kMinidumpCPUArchitectureX86 or - //! #kMinidumpCPUArchitectureX86Win64. - //! - //! \param[in] ebx The first 4 bytes of the CPU vendor string, the value - //! reported in `cpuid 0` `ebx`. - //! \param[in] edx The middle 4 bytes of the CPU vendor string, the value - //! reported in `cpuid 0` `edx`. - //! \param[in] ecx The last 4 bytes of the CPU vendor string, the value - //! reported by `cpuid 0` `ecx`. - //! - //! \note Do not call this method if SetCPUArchitecture() has been used to set - //! the CPU architecture to #kMinidumpCPUArchitectureAMD64. - //! - //! \sa SetCPUX86VendorString() - void SetCPUX86Vendor(uint32_t ebx, uint32_t edx, uint32_t ecx); - - //! \brief Sets \ref CPU_INFORMATION::VendorId - //! "MINIDUMP_SYSTEM_INFO::Cpu::X86CpuInfo::VendorId". - //! - //! This is only valid if SetCPUArchitecture() has been used to set the CPU - //! architecture to #kMinidumpCPUArchitectureX86 or - //! #kMinidumpCPUArchitectureX86Win64. - //! - //! \param[in] vendor The entire CPU vendor string, which must be exactly 12 - //! bytes long. - //! - //! \note Do not call this method if SetCPUArchitecture() has been used to set - //! the CPU architecture to #kMinidumpCPUArchitectureAMD64. - //! - //! \sa SetCPUX86Vendor() - void SetCPUX86VendorString(const std::string& vendor); - - //! \brief Sets \ref CPU_INFORMATION::VersionInformation - //! "MINIDUMP_SYSTEM_INFO::Cpu::X86CpuInfo::VersionInformation" and - //! \ref CPU_INFORMATION::FeatureInformation - //! "MINIDUMP_SYSTEM_INFO::Cpu::X86CpuInfo::FeatureInformation". - //! - //! This is only valid if SetCPUArchitecture() has been used to set the CPU - //! architecture to #kMinidumpCPUArchitectureX86 or - //! #kMinidumpCPUArchitectureX86Win64. - //! - //! \note Do not call this method if SetCPUArchitecture() has been used to set - //! the CPU architecture to #kMinidumpCPUArchitectureAMD64. - void SetCPUX86VersionAndFeatures(uint32_t version, uint32_t features); - - //! \brief Sets \ref CPU_INFORMATION::AMDExtendedCpuFeatures - //! "MINIDUMP_SYSTEM_INFO::Cpu::X86CpuInfo::AMDExtendedCPUFeatures". - //! - //! This is only valid if SetCPUArchitecture() has been used to set the CPU - //! architecture to #kMinidumpCPUArchitectureX86 or - //! #kMinidumpCPUArchitectureX86Win64, and if SetCPUX86Vendor() or - //! SetCPUX86VendorString() has been used to set the CPU vendor to - //! “AuthenticAMDâ€. - //! - //! \note Do not call this method if SetCPUArchitecture() has been used to set - //! the CPU architecture to #kMinidumpCPUArchitectureAMD64. - void SetCPUX86AMDExtendedFeatures(uint32_t extended_features); - - //! \brief Sets \ref CPU_INFORMATION::ProcessorFeatures - //! "MINIDUMP_SYSTEM_INFO::Cpu::OtherCpuInfo::ProcessorFeatures". - //! - //! This is only valid if SetCPUArchitecture() has been used to set the CPU - //! architecture to an architecture other than #kMinidumpCPUArchitectureX86 - //! or #kMinidumpCPUArchitectureX86Win64. - //! - //! \note This method may be called if SetCPUArchitecture() has been used to - //! set the CPU architecture to #kMinidumpCPUArchitectureAMD64. - void SetCPUOtherFeatures(uint64_t features_0, uint64_t features_1); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - MINIDUMP_SYSTEM_INFO system_info_; - std::unique_ptr<internal::MinidumpUTF16StringWriter> csd_version_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpSystemInfoWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_SYSTEM_INFO_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_thread_id_map.h b/Tools/Crashpad/include/minidump/minidump_thread_id_map.h deleted file mode 100644 index 33b105fba1..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_thread_id_map.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_THREAD_ID_MAP_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_THREAD_ID_MAP_H_ - -#include <stdint.h> - -#include <map> -#include <vector> - -namespace crashpad { - -class ThreadSnapshot; - -//! \brief A map that connects 64-bit snapshot thread IDs to 32-bit minidump -//! thread IDs. -//! -//! 64-bit snapshot thread IDs are obtained from ThreadSnapshot::ThreadID(). -//! 32-bit minidump thread IDs are stored in MINIDUMP_THREAD::ThreadId. -//! -//! A ThreadIDMap ensures that there are no collisions among the set of 32-bit -//! minidump thread IDs. -using MinidumpThreadIDMap = std::map<uint64_t, uint32_t>; - -//! \brief Builds a MinidumpThreadIDMap for a group of ThreadSnapshot objects. -//! -//! \param[in] thread_snapshots The thread snapshots to use as source data. -//! \param[out] thread_id_map A MinidumpThreadIDMap to be built by this method. -//! This map must be empty when this function is called. -//! -//! The map ensures that for any unique 64-bit thread ID found in a -//! ThreadSnapshot, the 32-bit thread ID used in a minidump file will also be -//! unique. -void BuildMinidumpThreadIDMap( - const std::vector<const ThreadSnapshot*>& thread_snapshots, - MinidumpThreadIDMap* thread_id_map); - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_THREAD_ID_MAP_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_thread_writer.h b/Tools/Crashpad/include/minidump/minidump_thread_writer.h deleted file mode 100644 index 82092e2b61..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_thread_writer.h +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_THREAD_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_THREAD_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_thread_id_map.h" -#include "minidump/minidump_writable.h" - -namespace crashpad { - -class MinidumpContextWriter; -class MinidumpMemoryListWriter; -class SnapshotMinidumpMemoryWriter; -class ThreadSnapshot; - -//! \brief The writer for a MINIDUMP_THREAD object in a minidump file. -//! -//! Because MINIDUMP_THREAD objects only appear as elements of -//! MINIDUMP_THREAD_LIST objects, this class does not write any data on its own. -//! It makes its MINIDUMP_THREAD data available to its MinidumpThreadListWriter -//! parent, which writes it as part of a MINIDUMP_THREAD_LIST. -class MinidumpThreadWriter final : public internal::MinidumpWritable { - public: - MinidumpThreadWriter(); - ~MinidumpThreadWriter() override; - - //! \brief Initializes the MINIDUMP_THREAD based on \a thread_snapshot. - //! - //! \param[in] thread_snapshot The thread snapshot to use as source data. - //! \param[in] thread_id_map A MinidumpThreadIDMap to be consulted to - //! determine the 32-bit minidump thread ID to use for \a thread_snapshot. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot(const ThreadSnapshot* thread_snapshot, - const MinidumpThreadIDMap* thread_id_map); - - //! \brief Returns a MINIDUMP_THREAD referencing this object’s data. - //! - //! This method is expected to be called by a MinidumpThreadListWriter in - //! order to obtain a MINIDUMP_THREAD to include in its list. - //! - //! \note Valid in #kStateWritable. - const MINIDUMP_THREAD* MinidumpThread() const; - - //! \brief Returns a SnapshotMinidumpMemoryWriter that will write the memory - //! region corresponding to this object’s stack. - //! - //! If the thread does not have a stack, or its stack could not be determined, - //! this will return `nullptr`. - //! - //! This method is provided so that MinidumpThreadListWriter can obtain thread - //! stack memory regions for the purposes of adding them to a - //! MinidumpMemoryListWriter (configured by calling - //! MinidumpThreadListWriter::SetMemoryListWriter()) by calling - //! MinidumpMemoryListWriter::AddExtraMemory(). - //! - //! \note Valid in any state. - SnapshotMinidumpMemoryWriter* Stack() const { return stack_.get(); } - - //! \brief Arranges for MINIDUMP_THREAD::Stack to point to the MINIDUMP_MEMORY - //! object to be written by \a stack. - //! - //! This object takes ownership of \a stack and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetStack(std::unique_ptr<SnapshotMinidumpMemoryWriter> stack); - - //! \brief Arranges for MINIDUMP_THREAD::ThreadContext to point to the CPU - //! context to be written by \a context. - //! - //! A context is required in all MINIDUMP_THREAD objects. - //! - //! This object takes ownership of \a context and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void SetContext(std::unique_ptr<MinidumpContextWriter> context); - - //! \brief Sets MINIDUMP_THREAD::ThreadId. - void SetThreadID(uint32_t thread_id) { thread_.ThreadId = thread_id; } - - //! \brief Sets MINIDUMP_THREAD::SuspendCount. - void SetSuspendCount(uint32_t suspend_count) { - thread_.SuspendCount = suspend_count; - } - - //! \brief Sets MINIDUMP_THREAD::PriorityClass. - void SetPriorityClass(uint32_t priority_class) { - thread_.PriorityClass = priority_class; - } - - //! \brief Sets MINIDUMP_THREAD::Priority. - void SetPriority(uint32_t priority) { thread_.Priority = priority; } - - //! \brief Sets MINIDUMP_THREAD::Teb. - void SetTEB(uint64_t teb) { thread_.Teb = teb; } - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MINIDUMP_THREAD thread_; - std::unique_ptr<SnapshotMinidumpMemoryWriter> stack_; - std::unique_ptr<MinidumpContextWriter> context_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpThreadWriter); -}; - -//! \brief The writer for a MINIDUMP_THREAD_LIST stream in a minidump file, -//! containing a list of MINIDUMP_THREAD objects. -class MinidumpThreadListWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpThreadListWriter(); - ~MinidumpThreadListWriter() override; - - //! \brief Adds an initialized MINIDUMP_THREAD for each thread in \a - //! thread_snapshots to the MINIDUMP_THREAD_LIST. - //! - //! \param[in] thread_snapshots The thread snapshots to use as source data. - //! \param[out] thread_id_map A MinidumpThreadIDMap to be built by this - //! method. This map must be empty when this method is called. - //! - //! \note Valid in #kStateMutable. AddThread() may not be called before this - //! method, and it is not normally necessary to call AddThread() after - //! this method. - void InitializeFromSnapshot( - const std::vector<const ThreadSnapshot*>& thread_snapshots, - MinidumpThreadIDMap* thread_id_map); - - //! \brief Sets the MinidumpMemoryListWriter that each thread’s stack memory - //! region should be added to as extra memory. - //! - //! Each MINIDUMP_THREAD object can contain a reference to a - //! SnapshotMinidumpMemoryWriter object that contains a snapshot of its stac - //! memory. In the overall tree of internal::MinidumpWritable objects, these - //! SnapshotMinidumpMemoryWriter objects are considered children of their - //! MINIDUMP_THREAD, and are referenced by a MINIDUMP_MEMORY_DESCRIPTOR - //! contained in the MINIDUMP_THREAD. It is also possible for the same memory - //! regions to have MINIDUMP_MEMORY_DESCRIPTOR objects present in a - //! MINIDUMP_MEMORY_LIST stream. This is accomplished by calling this method, - //! which informs a MinidumpThreadListWriter that it should call - //! MinidumpMemoryListWriter::AddExtraMemory() for each extant thread stack - //! while the thread is being added in AddThread(). When this is done, the - //! MinidumpMemoryListWriter will contain a MINIDUMP_MEMORY_DESCRIPTOR - //! pointing to the thread’s stack memory in its MINIDUMP_MEMORY_LIST. Note - //! that the actual contents of the memory is only written once, as a child of - //! the MinidumpThreadWriter. The MINIDUMP_MEMORY_DESCRIPTOR objects in both - //! the MINIDUMP_THREAD and MINIDUMP_MEMORY_LIST will point to the same copy - //! of the memory’s contents. - //! - //! \note This method must be called before AddThread() is called. Threads - //! added by AddThread() prior to this method being called will not have - //! their stacks added to \a memory_list_writer as extra memory. - //! \note Valid in #kStateMutable. - void SetMemoryListWriter(MinidumpMemoryListWriter* memory_list_writer); - - //! \brief Adds a MinidumpThreadWriter to the MINIDUMP_THREAD_LIST. - //! - //! This object takes ownership of \a thread and becomes its parent in the - //! overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void AddThread(std::unique_ptr<MinidumpThreadWriter> thread); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - std::vector<std::unique_ptr<MinidumpThreadWriter>> threads_; - MinidumpMemoryListWriter* memory_list_writer_; // weak - MINIDUMP_THREAD_LIST thread_list_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpThreadListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_THREAD_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_unloaded_module_writer.h b/Tools/Crashpad/include/minidump/minidump_unloaded_module_writer.h deleted file mode 100644 index 97651dbac8..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_unloaded_module_writer.h +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_UNLOADED_MODULE_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_UNLOADED_MODULE_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_string_writer.h" -#include "minidump/minidump_writable.h" -#include "snapshot/unloaded_module_snapshot.h" - -namespace crashpad { - -//! \brief The writer for a MINIDUMP_UNLOADED_MODULE object in a minidump file. -//! -//! Because MINIDUMP_UNLOADED_MODULE objects only appear as elements of -//! MINIDUMP_UNLOADED_MODULE_LIST objects, this class does not write any data on -//! its own. It makes its MINIDUMP_UNLOADED_MODULE data available to its -//! MinidumpUnloadedModuleListWriter parent, which writes it as part of a -//! MINIDUMP_UNLOADED_MODULE_LIST. -class MinidumpUnloadedModuleWriter final : public internal::MinidumpWritable { - public: - MinidumpUnloadedModuleWriter(); - ~MinidumpUnloadedModuleWriter() override; - - //! \brief Initializes the MINIDUMP_UNLOADED_MODULE based on \a - //! unloaded_module_snapshot. - //! - //! \param[in] unloaded_module_snapshot The unloaded module snapshot to use as - //! source data. - //! - //! \note Valid in #kStateMutable. No mutator methods may be called before - //! this method, and it is not normally necessary to call any mutator - //! methods after this method. - void InitializeFromSnapshot( - const UnloadedModuleSnapshot& unloaded_module_snapshot); - - //! \brief Returns a MINIDUMP_UNLOADED_MODULE referencing this object’s data. - //! - //! This method is expected to be called by a MinidumpUnloadedModuleListWriter - //! in order to obtain a MINIDUMP_UNLOADED_MODULE to include in its list. - //! - //! \note Valid in #kStateWritable. - const MINIDUMP_UNLOADED_MODULE* MinidumpUnloadedModule() const; - - //! \brief Arranges for MINIDUMP_UNLOADED_MODULE::ModuleNameRva to point to a - //! MINIDUMP_STRING containing \a name. - //! - //! \note Valid in #kStateMutable. - void SetName(const std::string& name); - - //! \brief Sets MINIDUMP_UNLOADED_MODULE::BaseOfImage. - void SetImageBaseAddress(uint64_t image_base_address) { - unloaded_module_.BaseOfImage = image_base_address; - } - - //! \brief Sets MINIDUMP_UNLOADED_MODULE::SizeOfImage. - void SetImageSize(uint32_t image_size) { - unloaded_module_.SizeOfImage = image_size; - } - - //! \brief Sets MINIDUMP_UNLOADED_MODULE::CheckSum. - void SetChecksum(uint32_t checksum) { unloaded_module_.CheckSum = checksum; } - - //! \brief Sets MINIDUMP_UNLOADED_MODULE::TimeDateStamp. - //! - //! \note Valid in #kStateMutable. - void SetTimestamp(time_t timestamp); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - private: - MINIDUMP_UNLOADED_MODULE unloaded_module_; - std::unique_ptr<internal::MinidumpUTF16StringWriter> name_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpUnloadedModuleWriter); -}; - -//! \brief The writer for a MINIDUMP_UNLOADED_MODULE_LIST stream in a minidump -//! file, containing a list of MINIDUMP_UNLOADED_MODULE objects. -class MinidumpUnloadedModuleListWriter final - : public internal::MinidumpStreamWriter { - public: - MinidumpUnloadedModuleListWriter(); - ~MinidumpUnloadedModuleListWriter() override; - - //! \brief Adds an initialized MINIDUMP_UNLOADED_MODULE for each unloaded - //! module in \a unloaded_module_snapshots to the - //! MINIDUMP_UNLOADED_MODULE_LIST. - //! - //! \param[in] unloaded_module_snapshots The unloaded module snapshots to use - //! as source data. - //! - //! \note Valid in #kStateMutable. AddUnloadedModule() may not be called - //! before this this method, and it is not normally necessary to call - //! AddUnloadedModule() after this method. - void InitializeFromSnapshot( - const std::vector<UnloadedModuleSnapshot>& unloaded_module_snapshots); - - //! \brief Adds a MinidumpUnloadedModuleWriter to the - //! MINIDUMP_UNLOADED_MODULE_LIST. - //! - //! This object takes ownership of \a unloaded_module and becomes its parent - //! in the overall tree of internal::MinidumpWritable objects. - //! - //! \note Valid in #kStateMutable. - void AddUnloadedModule( - std::unique_ptr<MinidumpUnloadedModuleWriter> unloaded_module); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - std::vector<std::unique_ptr<MinidumpUnloadedModuleWriter>> unloaded_modules_; - MINIDUMP_UNLOADED_MODULE_LIST unloaded_module_list_base_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpUnloadedModuleListWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_UNLOADED_MODULE_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_user_extension_stream_data_source.h b/Tools/Crashpad/include/minidump/minidump_user_extension_stream_data_source.h deleted file mode 100644 index 3eb0c8743a..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_user_extension_stream_data_source.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_ - -#include <stdint.h> -#include <sys/types.h> - -#include "base/macros.h" - -#include "minidump/minidump_extensions.h" - -namespace crashpad { - -//! \brief Describes a user extension data stream in a minidump. -class MinidumpUserExtensionStreamDataSource { - public: - //! \brief An interface implemented by readers of - //! MinidumpUserExtensionStreamDataSource. - class Delegate { - public: - //! \brief Called by MinidumpUserExtensionStreamDataSource::Read() to - //! provide data requested by a call to that method. - //! - //! \param[in] data A pointer to the data that was read. The callee does not - //! take ownership of this data. This data is only valid for the - //! duration of the call to this method. This parameter may be `nullptr` - //! if \a size is `0`. - //! \param[in] size The size of the data that was read. - //! - //! \return `true` on success, `false` on failure. - //! MinidumpUserExtensionStreamDataSource::ReadStreamData() will use - //! this as its own return value. - virtual bool ExtensionStreamDataSourceRead(const void* data, - size_t size) = 0; - - protected: - ~Delegate() {} - }; - - //! \brief Constructs a MinidumpUserExtensionStreamDataSource. - //! - //! \param[in] stream_type The type of the user extension stream. - explicit MinidumpUserExtensionStreamDataSource(uint32_t stream_type); - virtual ~MinidumpUserExtensionStreamDataSource(); - - MinidumpStreamType stream_type() const { return stream_type_; } - - //! \brief The size of this data stream. - virtual size_t StreamDataSize() = 0; - - //! \brief Calls Delegate::UserStreamDataSourceRead(), providing it with - //! the stream data. - //! - //! Implementations do not necessarily compute the stream data prior to - //! this method being called. The stream data may be computed or loaded - //! lazily and may be discarded after being passed to the delegate. - //! - //! \return `false` on failure, otherwise, the return value of - //! Delegate::ExtensionStreamDataSourceRead(), which should be `true` on - //! success and `false` on failure. - virtual bool ReadStreamData(Delegate* delegate) = 0; - - private: - MinidumpStreamType stream_type_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpUserExtensionStreamDataSource); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_user_stream_writer.h b/Tools/Crashpad/include/minidump/minidump_user_stream_writer.h deleted file mode 100644 index c1bad0ac92..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_user_stream_writer.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_USER_STREAM_WRITER_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_USER_STREAM_WRITER_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <stdint.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "minidump/minidump_extensions.h" -#include "minidump/minidump_stream_writer.h" -#include "minidump/minidump_writable.h" -#include "minidump/minidump_user_extension_stream_data_source.h" -#include "snapshot/module_snapshot.h" - -namespace crashpad { - -//! \brief The writer for a MINIDUMP_USER_STREAM in a minidump file. -class MinidumpUserStreamWriter final : public internal::MinidumpStreamWriter { - public: - MinidumpUserStreamWriter(); - ~MinidumpUserStreamWriter() override; - - //! \brief Initializes a MINIDUMP_USER_STREAM based on \a stream. - //! - //! \param[in] stream The memory and stream type to use as source data. - //! - //! \note Valid in #kStateMutable. - void InitializeFromSnapshot(const UserMinidumpStream* stream); - - //! \brief Initializes a MINIDUMP_USER_STREAM based on \a data_source. - //! - //! \param[in] data_source The content and type of the stream. - //! - //! \note Valid in #kStateMutable. - void InitializeFromUserExtensionStream( - std::unique_ptr<MinidumpUserExtensionStreamDataSource> data_source); - - protected: - // MinidumpWritable: - bool Freeze() override; - size_t SizeOfObject() override; - std::vector<internal::MinidumpWritable*> Children() override; - bool WriteObject(FileWriterInterface* file_writer) override; - - // MinidumpStreamWriter: - MinidumpStreamType StreamType() const override; - - private: - class ContentsWriter; - class SnapshotContentsWriter; - class ExtensionStreamContentsWriter; - - std::unique_ptr<ContentsWriter> contents_writer_; - - MinidumpStreamType stream_type_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpUserStreamWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_USER_STREAM_WRITER_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_writable.h b/Tools/Crashpad/include/minidump/minidump_writable.h deleted file mode 100644 index b2ebf04e7d..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_writable.h +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_WRITABLE_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_WRITABLE_H_ - -#include <windows.h> -#include <dbghelp.h> -#include <sys/types.h> - -#include <limits> -#include <vector> - -#include "base/macros.h" -#include "util/file/file_io.h" - -namespace crashpad { - -class FileWriterInterface; - -namespace internal { - -//! \brief The base class for all content that might be written to a minidump -//! file. -class MinidumpWritable { - public: - virtual ~MinidumpWritable(); - - //! \brief Writes an object and all of its children to a minidump file. - //! - //! Use this on the root object of a tree of MinidumpWritable objects, - //! typically on a MinidumpFileWriter object. - //! - //! \param[in] file_writer The file writer to receive the minidump file’s - //! content. - //! - //! \return `true` on success. `false` on failure, with an appropriate message - //! logged. - //! - //! \note Valid in #kStateMutable, and transitions the object and the entire - //! tree beneath it through all states to #kStateWritten. - //! - //! \note This method should rarely be overridden. - virtual bool WriteEverything(FileWriterInterface* file_writer); - - //! \brief Registers a file offset pointer as one that should point to the - //! object on which this method is called. - //! - //! Once the file offset at which an object will be written is known (when it - //! enters #kStateWritable), registered RVA pointers will be updated. - //! - //! \param[in] rva A pointer to storage for the file offset that should - //! contain this object’s writable file offset, once it is known. - //! - //! \note Valid in #kStateFrozen or any preceding state. - // - // This is public instead of protected because objects of derived classes need - // to be able to register their own pointers with distinct objects. - void RegisterRVA(RVA* rva); - - //! \brief Registers a location descriptor as one that should point to the - //! object on which this method is called. - //! - //! Once an object’s size and the file offset at it will be written is known - //! (when it enters #kStateFrozen), the relevant data in registered location - //! descriptors will be updated. - //! - //! \param[in] location_descriptor A pointer to a location descriptor that - //! should contain this object’s writable size and file offset, once they - //! are known. - //! - //! \note Valid in #kStateFrozen or any preceding state. - // - // This is public instead of protected because objects of derived classes need - // to be able to register their own pointers with distinct objects. - void RegisterLocationDescriptor( - MINIDUMP_LOCATION_DESCRIPTOR* location_descriptor); - - protected: - //! \brief Identifies the state of an object. - //! - //! Objects will normally transition through each of these states as they are - //! created, populated with data, and then written to a minidump file. - enum State { - //! \brief The object’s properties can be modified. - kStateMutable = 0, - - //! \brief The object is “frozenâ€. - //! - //! Its properties cannot be modified. Pointers to file offsets of other - //! structures may not yet be valid. - kStateFrozen, - - //! \brief The object is writable. - //! - //! The file offset at which it will be written is known. Pointers to file - //! offsets of other structures are valid when all objects in a tree are in - //! this state. - kStateWritable, - - //! \brief The object has been written to a minidump file. - kStateWritten, - }; - - //! \brief Identifies the phase during which an object will be written to a - //! minidump file. - enum Phase { - //! \brief Objects that are written to a minidump file “earlyâ€. - //! - //! The normal sequence is for an object to write itself and then write all - //! of its children. - kPhaseEarly = 0, - - //! \brief Objects that are written to a minidump file “lateâ€. - //! - //! Some objects, such as those capturing memory region snapshots, are - //! written to minidump files after all other objects. This “late†phase - //! identifies such objects. This is useful to improve spatial locality in - //! minidump files in accordance with expected access patterns: unlike most - //! other data, memory snapshots are large and do not usually need to be - //! consulted in their entirety in order to process a minidump file. - kPhaseLate, - }; - - //! \brief A size value used to signal failure by methods that return - //! `size_t`. - static constexpr size_t kInvalidSize = std::numeric_limits<size_t>::max(); - - MinidumpWritable(); - - //! \brief The state of the object. - State state() const { return state_; } - - //! \brief Transitions the object from #kStateMutable to #kStateFrozen. - //! - //! The default implementation marks the object as frozen and recursively - //! calls Freeze() on all of its children. Subclasses may override this method - //! to perform processing that should only be done once callers have finished - //! populating an object with data. Typically, a subclass implementation would - //! call RegisterRVA() or RegisterLocationDescriptor() on other objects as - //! appropriate, because at the time Freeze() runs, the in-memory locations of - //! RVAs and location descriptors are known and will not change for the - //! remaining duration of an object’s lifetime. - //! - //! \return `true` on success. `false` on failure, with an appropriate message - //! logged. - virtual bool Freeze(); - - //! \brief Returns the amount of space that this object will consume when - //! written to a minidump file, in bytes, not including any leading or - //! trailing padding necessary to maintain proper alignment. - //! - //! \note Valid in #kStateFrozen or any subsequent state. - virtual size_t SizeOfObject() = 0; - - //! \brief Returns the object’s desired byte-boundary alignment. - //! - //! The default implementation returns `4`. Subclasses may override this as - //! needed. - //! - //! \note Valid in #kStateFrozen or any subsequent state. - virtual size_t Alignment(); - - //! \brief Returns the object’s children. - //! - //! \note Valid in #kStateFrozen or any subsequent state. - virtual std::vector<MinidumpWritable*> Children(); - - //! \brief Returns the object’s desired write phase. - //! - //! The default implementation returns #kPhaseEarly. Subclasses may override - //! this method to alter their write phase. - //! - //! \note Valid in any state. - virtual Phase WritePhase(); - - //! \brief Prepares the object to be written at a known file offset, - //! transitioning it from #kStateFrozen to #kStateWritable. - //! - //! This method is responsible for determining the final file offset of the - //! object, which may be increased from \a offset to meet alignment - //! requirements. It calls WillWriteAtOffsetImpl() for the benefit of - //! subclasses. It populates all RVAs and location descriptors registered with - //! it via RegisterRVA() and RegisterLocationDescriptor(). It also recurses - //! into all known children. - //! - //! \param[in] phase The phase during which the object will be written. If - //! this does not match Phase(), processing is suppressed, although - //! recursive processing will still occur on all children. This addresses - //! the case where parents and children do not write in the same phase. - //! \param[in] offset The file offset at which the object will be written. The - //! offset may need to be adjusted for alignment. - //! \param[out] write_sequence This object will append itself to this list, - //! such that on return from a recursive tree of WillWriteAtOffset() - //! calls, elements of the vector will be organized in the sequence that - //! the objects will be written to the minidump file. - //! - //! \return The file size consumed by this object and all children, including - //! any padding inserted to meet alignment requirements. On failure, - //! #kInvalidSize, with an appropriate message logged. - //! - //! \note This method cannot be overridden. Subclasses that need to perform - //! processing when an object transitions to #kStateWritable should - //! implement WillWriteAtOffsetImpl(), which is called by this method. - size_t WillWriteAtOffset(Phase phase, - FileOffset* offset, - std::vector<MinidumpWritable*>* write_sequence); - - //! \brief Called once an object’s writable file offset is determined, as it - //! transitions into #kStateWritable. - //! - //! Subclasses can override this method if they need to provide additional - //! processing once their writable file offset is known. Typically, this will - //! be done by subclasses that handle certain RVAs themselves instead of using - //! the RegisterRVA() interface. - //! - //! \param[in] offset The file offset at which the object will be written. The - //! value passed to this method will already have been adjusted to meet - //! alignment requirements. - //! - //! \return `true` on success. `false` on error, indicating that the minidump - //! file should not be written. - //! - //! \note Valid in #kStateFrozen. The object will transition to - //! #kStateWritable after this method returns. - virtual bool WillWriteAtOffsetImpl(FileOffset offset); - - //! \brief Writes the object, transitioning it from #kStateWritable to - //! #kStateWritten. - //! - //! Writes any padding necessary to meet alignment requirements, and then - //! calls WriteObject() to write the object’s content. - //! - //! \param[in] file_writer The file writer to receive the object’s content. - //! - //! \return `true` on success. `false` on error with an appropriate message - //! logged. - //! - //! \note This method cannot be overridden. Subclasses must override - //! WriteObject(). - bool WritePaddingAndObject(FileWriterInterface* file_writer); - - //! \brief Writes the object’s content. - //! - //! \param[in] file_writer The file writer to receive the object’s content. - //! - //! \return `true` on success. `false` on error, indicating that the content - //! could not be written to the minidump file. - //! - //! \note Valid in #kStateWritable. The object will transition to - //! #kStateWritten after this method returns. - virtual bool WriteObject(FileWriterInterface* file_writer) = 0; - - private: - std::vector<RVA*> registered_rvas_; // weak - - // weak - std::vector<MINIDUMP_LOCATION_DESCRIPTOR*> registered_location_descriptors_; - - size_t leading_pad_bytes_; - State state_; - - DISALLOW_COPY_AND_ASSIGN(MinidumpWritable); -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_WRITABLE_H_ diff --git a/Tools/Crashpad/include/minidump/minidump_writer_util.h b/Tools/Crashpad/include/minidump/minidump_writer_util.h deleted file mode 100644 index 7ebe3f3aa1..0000000000 --- a/Tools/Crashpad/include/minidump/minidump_writer_util.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_MINIDUMP_MINIDUMP_WRITER_UTIL_H_ -#define CRASHPAD_MINIDUMP_MINIDUMP_WRITER_UTIL_H_ - -#include <stdint.h> -#include <sys/types.h> -#include <time.h> - -#include <string> - -#include "base/macros.h" -#include "base/strings/string16.h" - -namespace crashpad { -namespace internal { - -//! \brief A collection of utility functions used by the MinidumpWritable family -//! of classes. -class MinidumpWriterUtil final { - public: - //! \brief Assigns a `time_t` value, logging a warning if the result overflows - //! the destination buffer and will be truncated. - //! - //! \param[out] destination A pointer to the variable to be assigned to. - //! \param[in] source The value to assign. - //! - //! The minidump format uses `uint32_t` for many timestamp values, but - //! `time_t` may be wider than this. These year 2038 bugs are a limitation of - //! the minidump format. An out-of-range error will be noted with a warning, - //! but is not considered fatal. \a source will be truncated and assigned to - //! \a destination in this case. - //! - //! For `time_t` values with nonfatal overflow semantics, this function is - //! used in preference to AssignIfInRange(), which fails without performing an - //! assignment when an out-of-range condition is detected. - static void AssignTimeT(uint32_t* destination, time_t source); - - //! \brief Converts a UTF-8 string to UTF-16 and returns it. If the string - //! cannot be converted losslessly, indicating that the input is not - //! well-formed UTF-8, a warning is logged. - //! - //! \param[in] utf8 The UTF-8-encoded string to convert. - //! - //! \return The \a utf8 string, converted to UTF-16 encoding. If the - //! conversion is lossy, U+FFFD “replacement characters†will be - //! introduced. - static base::string16 ConvertUTF8ToUTF16(const std::string& utf8); - - //! \brief Converts a UTF-8 string to UTF-16 and places it into a buffer of - //! fixed size, taking care to `NUL`-terminate the buffer and not to - //! overflow it. If the string will be truncated or if it cannot be - //! converted losslessly, a warning is logged. - //! - //! Any unused portion of the \a destination buffer that is not written to by - //! the converted string will be overwritten with `NUL` UTF-16 code units, - //! thus, this function always writes \a destination_size `char16` units. - //! - //! If the conversion is lossy, U+FFFD “replacement characters†will be - //! introduced. - //! - //! \param[out] destination A pointer to the destination buffer, where the - //! UTF-16-encoded string will be written. - //! \param[in] destination_size The size of \a destination in `char16` units, - //! including space used by a `NUL` terminator. - //! \param[in] source The UTF-8-encoded input string. - static void AssignUTF8ToUTF16(base::char16* destination, - size_t destination_size, - const std::string& source); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(MinidumpWriterUtil); -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_MINIDUMP_MINIDUMP_WRITER_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/getopt/LICENSE b/Tools/Crashpad/include/third_party/getopt/LICENSE deleted file mode 100644 index 4444b1201e..0000000000 --- a/Tools/Crashpad/include/third_party/getopt/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright (C) 1997 Gregory Pietsch - -[These files] are hereby placed in the public domain without restrictions. Just -give the author credit, don't claim you wrote it or prevent anyone else from -using it. diff --git a/Tools/Crashpad/include/third_party/getopt/getopt.h b/Tools/Crashpad/include/third_party/getopt/getopt.h deleted file mode 100644 index 27ab0dd4e5..0000000000 --- a/Tools/Crashpad/include/third_party/getopt/getopt.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright (C) 1997 Gregory Pietsch - -[These files] are hereby placed in the public domain without restrictions. Just -give the author credit, don't claim you wrote it or prevent anyone else from -using it. -*/ - -#ifndef GETOPT_H -#define GETOPT_H - -/* include files needed by this include file */ - -/* macros defined by this include file */ -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -/* types defined by this include file */ - -namespace crashpad { - -/* GETOPT_LONG_OPTION_T: The type of long option */ -typedef struct GETOPT_LONG_OPTION_T -{ - const char *name; /* the name of the long option */ - int has_arg; /* one of the above macros */ - int *flag; /* determines if getopt_long() returns a - * value for a long option; if it is - * non-NULL, 0 is returned as a function - * value and the value of val is stored in - * the area pointed to by flag. Otherwise, - * val is returned. */ - int val; /* determines the value to return if flag is - * NULL. */ -} GETOPT_LONG_OPTION_T; - -typedef GETOPT_LONG_OPTION_T option; - -/* externally-defined variables */ -extern char *optarg; -extern int optind; -extern int opterr; -extern int optopt; - -/* function prototypes */ -int getopt(int argc, char** argv, char* optstring); -int getopt_long(int argc, - char** argv, - const char* shortopts, - const GETOPT_LONG_OPTION_T* longopts, - int* longind); -int getopt_long_only(int argc, - char** argv, - const char* shortopts, - const GETOPT_LONG_OPTION_T* longopts, - int* longind); - -} // namespace crashpad - -#endif /* GETOPT_H */ - -/* END OF FILE getopt.h */ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops.h deleted file mode 100644 index 2a08de32e4..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops.h +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// For atomic operations on reference counts, see atomic_refcount.h. -// For atomic operations on sequence numbers, see atomic_sequence_num.h. - -// The routines exported by this module are subtle. If you use them, even if -// you get the code right, it will depend on careful reasoning about atomicity -// and memory ordering; it will be less readable, and harder to maintain. If -// you plan to use these routines, you should have a good reason, such as solid -// evidence that performance would otherwise suffer, or there being no -// alternative. You should assume only properties explicitly guaranteed by the -// specifications in this file. You are almost certainly _not_ writing code -// just for the x86; if you assume x86 semantics, x86 hardware bugs and -// implementations on other archtectures will cause your code to break. If you -// do not know what you are doing, avoid these routines, and use a Mutex. -// -// It is incorrect to make direct assignments to/from an atomic variable. -// You should use one of the Load or Store routines. The NoBarrier -// versions are provided when no barriers are needed: -// NoBarrier_Store() -// NoBarrier_Load() -// Although there are currently no compiler enforcement, you are encouraged -// to use these. -// - -#ifndef MINI_CHROMIUM_BASE_ATOMICOPS_H_ -#define MINI_CHROMIUM_BASE_ATOMICOPS_H_ - -#include <stdint.h> - -// Small C++ header which defines implementation specific macros used to -// identify the STL implementation. -// - libc++: captures __config for _LIBCPP_VERSION -// - libstdc++: captures bits/c++config.h for __GLIBCXX__ -#include <cstddef> - -#include "build/build_config.h" - -#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS) -// windows.h #defines this (only on x64). This causes problems because the -// public API also uses MemoryBarrier at the public name for this fence. So, on -// X64, undef it, and call its documented -// (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208.aspx) -// implementation directly. -#undef MemoryBarrier -#endif - -namespace base { -namespace subtle { - -typedef int32_t Atomic32; -#ifdef ARCH_CPU_64_BITS -// We need to be able to go between Atomic64 and AtomicWord implicitly. This -// means Atomic64 and AtomicWord should be the same type on 64-bit. -#if defined(__ILP32__) || defined(OS_NACL) -// NaCl's intptr_t is not actually 64-bits on 64-bit! -// http://code.google.com/p/nativeclient/issues/detail?id=1162 -typedef int64_t Atomic64; -#else -typedef intptr_t Atomic64; -#endif -#endif - -// Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or -// Atomic64 routines below, depending on your architecture. -typedef intptr_t AtomicWord; - -// Atomically execute: -// result = *ptr; -// if (*ptr == old_value) -// *ptr = new_value; -// return result; -// -// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". -// Always return the old value of "*ptr" -// -// This routine implies no memory barriers. -Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value); - -// Atomically store new_value into *ptr, returning the previous value held in -// *ptr. This routine implies no memory barriers. -Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value); - -// Atomically increment *ptr by "increment". Returns the new value of -// *ptr with the increment applied. This routine implies no memory barriers. -Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); - -Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment); - -// These following lower-level operations are typically useful only to people -// implementing higher-level synchronization operations like spinlocks, -// mutexes, and condition-variables. They combine CompareAndSwap(), a load, or -// a store with appropriate memory-ordering instructions. "Acquire" operations -// ensure that no later memory access can be reordered ahead of the operation. -// "Release" operations ensure that no previous memory access can be reordered -// after the operation. "Barrier" operations have both "Acquire" and "Release" -// semantics. A MemoryBarrier() has "Barrier" semantics, but does no memory -// access. -Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value); -Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value); - -void MemoryBarrier(); -void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value); -void Acquire_Store(volatile Atomic32* ptr, Atomic32 value); -void Release_Store(volatile Atomic32* ptr, Atomic32 value); - -Atomic32 NoBarrier_Load(volatile const Atomic32* ptr); -Atomic32 Acquire_Load(volatile const Atomic32* ptr); -Atomic32 Release_Load(volatile const Atomic32* ptr); - -// 64-bit atomic operations (only available on 64-bit processors). -#ifdef ARCH_CPU_64_BITS -Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value); -Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value); -Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); -Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); - -Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value); -Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value); -void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value); -void Acquire_Store(volatile Atomic64* ptr, Atomic64 value); -void Release_Store(volatile Atomic64* ptr, Atomic64 value); -Atomic64 NoBarrier_Load(volatile const Atomic64* ptr); -Atomic64 Acquire_Load(volatile const Atomic64* ptr); -Atomic64 Release_Load(volatile const Atomic64* ptr); -#endif // ARCH_CPU_64_BITS - -} // namespace subtle -} // namespace base - -// The following x86 CPU features are used in atomicops_internals_x86_gcc.h, but -// this file is duplicated inside of Chrome: protobuf and tcmalloc rely on the -// struct being present at link time. Some parts of Chrome can currently use the -// portable interface whereas others still use GCC one. The include guards are -// the same as in atomicops_internals_x86_gcc.cc. -#if defined(__i386__) || defined(__x86_64__) -// This struct is not part of the public API of this module; clients may not -// use it. (However, it's exported via BASE_EXPORT because clients implicitly -// do use it at link time by inlining these functions.) -// Features of this x86. Values may not be correct before main() is run, -// but are set conservatively. -struct AtomicOps_x86CPUFeatureStruct { - bool has_amd_lock_mb_bug; // Processor has AMD memory-barrier bug; do lfence - // after acquire compare-and-swap. - // The following fields are unused by Chrome's base implementation but are - // still used by copies of the same code in other parts of the code base. This - // causes an ODR violation, and the other code is likely reading invalid - // memory. - // TODO(jfb) Delete these fields once the rest of the Chrome code base doesn't - // depend on them. - bool has_sse2; // Processor has SSE2. - bool has_cmpxchg16b; // Processor supports cmpxchg16b instruction. -}; -extern struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures; -#endif - -// Try to use a portable implementation based on C++11 atomics. -// -// Some toolchains support C++11 language features without supporting library -// features (recent compiler, older STL). Whitelist libstdc++ and libc++ that we -// know will have <atomic> when compiling C++11. -#if ((__cplusplus >= 201103L) && \ - ((defined(__GLIBCXX__) && (__GLIBCXX__ > 20110216)) || \ - (defined(_LIBCPP_VERSION) && (_LIBCPP_STD_VER >= 11)))) -# include "base/atomicops_internals_portable.h" -#else // Otherwise use a platform specific implementation. -# if (defined(OS_WIN) && defined(COMPILER_MSVC) && \ - defined(ARCH_CPU_X86_FAMILY)) -# include "base/atomicops_internals_x86_msvc.h" -# elif defined(OS_MACOSX) -# include "base/atomicops_internals_mac.h" -# else -# error "Atomic operations are not supported on your platform" -# endif -#endif // Portable / non-portable includes. - -// On some platforms we need additional declarations to make -// AtomicWord compatible with our other Atomic* types. -#if defined(OS_MACOSX) || defined(OS_OPENBSD) -#include "base/atomicops_internals_atomicword_compat.h" -#endif - -#endif // MINI_CHROMIUM_BASE_ATOMICOPS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h deleted file mode 100644 index d5b8caaf61..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_atomicword_compat.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file is an internal atomic implementation, use base/atomicops.h instead. - -#ifndef MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ -#define MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ - -// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32, -// which in turn means int. On some LP32 platforms, intptr_t is an int, but -// on others, it's a long. When AtomicWord and Atomic32 are based on different -// fundamental types, their pointers are incompatible. -// -// This file defines function overloads to allow both AtomicWord and Atomic32 -// data to be used with this interface. -// -// On LP64 platforms, AtomicWord and Atomic64 are both always long, -// so this problem doesn't occur. - -#if !defined(ARCH_CPU_64_BITS) - -namespace base { -namespace subtle { - -inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, - AtomicWord old_value, - AtomicWord new_value) { - return NoBarrier_CompareAndSwap( - reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); -} - -inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, - AtomicWord new_value) { - return NoBarrier_AtomicExchange( - reinterpret_cast<volatile Atomic32*>(ptr), new_value); -} - -inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, - AtomicWord increment) { - return NoBarrier_AtomicIncrement( - reinterpret_cast<volatile Atomic32*>(ptr), increment); -} - -inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, - AtomicWord increment) { - return Barrier_AtomicIncrement( - reinterpret_cast<volatile Atomic32*>(ptr), increment); -} - -inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, - AtomicWord old_value, - AtomicWord new_value) { - return base::subtle::Acquire_CompareAndSwap( - reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); -} - -inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, - AtomicWord old_value, - AtomicWord new_value) { - return base::subtle::Release_CompareAndSwap( - reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); -} - -inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { - NoBarrier_Store( - reinterpret_cast<volatile Atomic32*>(ptr), value); -} - -inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) { - return base::subtle::Acquire_Store( - reinterpret_cast<volatile Atomic32*>(ptr), value); -} - -inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { - return base::subtle::Release_Store( - reinterpret_cast<volatile Atomic32*>(ptr), value); -} - -inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { - return NoBarrier_Load( - reinterpret_cast<volatile const Atomic32*>(ptr)); -} - -inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { - return base::subtle::Acquire_Load( - reinterpret_cast<volatile const Atomic32*>(ptr)); -} - -inline AtomicWord Release_Load(volatile const AtomicWord* ptr) { - return base::subtle::Release_Load( - reinterpret_cast<volatile const Atomic32*>(ptr)); -} - -} // namespace base::subtle -} // namespace base - -#endif // !defined(ARCH_CPU_64_BITS) - -#endif // MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_mac.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_mac.h deleted file mode 100644 index dff655fdb5..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_mac.h +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file is an internal atomic implementation, use base/atomicops.h instead. - -#ifndef MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_MAC_H_ -#define MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_MAC_H_ - -#include <libkern/OSAtomic.h> - -namespace base { -namespace subtle { - -inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - Atomic32 prev_value; - do { - if (OSAtomicCompareAndSwap32(old_value, new_value, - const_cast<Atomic32*>(ptr))) { - return old_value; - } - prev_value = *ptr; - } while (prev_value == old_value); - return prev_value; -} - -inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, - Atomic32 new_value) { - Atomic32 old_value; - do { - old_value = *ptr; - } while (!OSAtomicCompareAndSwap32(old_value, new_value, - const_cast<Atomic32*>(ptr))); - return old_value; -} - -inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return OSAtomicAdd32(increment, const_cast<Atomic32*>(ptr)); -} - -inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return OSAtomicAdd32Barrier(increment, const_cast<Atomic32*>(ptr)); -} - -inline void MemoryBarrier() { - OSMemoryBarrier(); -} - -inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - Atomic32 prev_value; - do { - if (OSAtomicCompareAndSwap32Barrier(old_value, new_value, - const_cast<Atomic32*>(ptr))) { - return old_value; - } - prev_value = *ptr; - } while (prev_value == old_value); - return prev_value; -} - -inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - return Acquire_CompareAndSwap(ptr, old_value, new_value); -} - -inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { - *ptr = value; -} - -inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { - *ptr = value; - MemoryBarrier(); -} - -inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { - MemoryBarrier(); - *ptr = value; -} - -inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { - return *ptr; -} - -inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { - Atomic32 value = *ptr; - MemoryBarrier(); - return value; -} - -inline Atomic32 Release_Load(volatile const Atomic32* ptr) { - MemoryBarrier(); - return *ptr; -} - -#ifdef __LP64__ - -// 64-bit implementation on 64-bit platform - -inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - Atomic64 prev_value; - do { - if (OSAtomicCompareAndSwap64(old_value, new_value, - reinterpret_cast<volatile int64_t*>(ptr))) { - return old_value; - } - prev_value = *ptr; - } while (prev_value == old_value); - return prev_value; -} - -inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, - Atomic64 new_value) { - Atomic64 old_value; - do { - old_value = *ptr; - } while (!OSAtomicCompareAndSwap64(old_value, new_value, - reinterpret_cast<volatile int64_t*>(ptr))); - return old_value; -} - -inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return OSAtomicAdd64(increment, reinterpret_cast<volatile int64_t*>(ptr)); -} - -inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return OSAtomicAdd64Barrier(increment, - reinterpret_cast<volatile int64_t*>(ptr)); -} - -inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - Atomic64 prev_value; - do { - if (OSAtomicCompareAndSwap64Barrier( - old_value, new_value, reinterpret_cast<volatile int64_t*>(ptr))) { - return old_value; - } - prev_value = *ptr; - } while (prev_value == old_value); - return prev_value; -} - -inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - // The lib kern interface does not distinguish between - // Acquire and Release memory barriers; they are equivalent. - return Acquire_CompareAndSwap(ptr, old_value, new_value); -} - -inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { - *ptr = value; -} - -inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { - *ptr = value; - MemoryBarrier(); -} - -inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { - MemoryBarrier(); - *ptr = value; -} - -inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { - return *ptr; -} - -inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { - Atomic64 value = *ptr; - MemoryBarrier(); - return value; -} - -inline Atomic64 Release_Load(volatile const Atomic64* ptr) { - MemoryBarrier(); - return *ptr; -} - -#endif // defined(__LP64__) - -} // namespace base::subtle -} // namespace base - -#endif // MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_MAC_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h deleted file mode 100644 index db610523c1..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_portable.h +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (c) 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file is an internal atomic implementation, use atomicops.h instead. -// -// This implementation uses C++11 atomics' member functions. The code base is -// currently written assuming atomicity revolves around accesses instead of -// C++11's memory locations. The burden is on the programmer to ensure that all -// memory locations accessed atomically are never accessed non-atomically (tsan -// should help with this). -// -// TODO(jfb) Modify the atomicops.h API and user code to declare atomic -// locations as truly atomic. See the static_assert below. -// -// Of note in this implementation: -// * All NoBarrier variants are implemented as relaxed. -// * All Barrier variants are implemented as sequentially-consistent. -// * Compare exchange's failure ordering is always the same as the success one -// (except for release, which fails as relaxed): using a weaker ordering is -// only valid under certain uses of compare exchange. -// * Acquire store doesn't exist in the C11 memory model, it is instead -// implemented as a relaxed store followed by a sequentially consistent -// fence. -// * Release load doesn't exist in the C11 memory model, it is instead -// implemented as sequentially consistent fence followed by a relaxed load. -// * Atomic increment is expected to return the post-incremented value, whereas -// C11 fetch add returns the previous value. The implementation therefore -// needs to increment twice (which the compiler should be able to detect and -// optimize). - -#ifndef MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ -#define MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ - -#include <atomic> - -namespace base { -namespace subtle { - -// This implementation is transitional and maintains the original API for -// atomicops.h. This requires casting memory locations to the atomic types, and -// assumes that the API and the C++11 implementation are layout-compatible, -// which isn't true for all implementations or hardware platforms. The static -// assertion should detect this issue, were it to fire then this header -// shouldn't be used. -// -// TODO(jfb) If this header manages to stay committed then the API should be -// modified, and all call sites updated. -typedef volatile std::atomic<Atomic32>* AtomicLocation32; -static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32), - "incompatible 32-bit atomic layout"); - -inline void MemoryBarrier() { -#if defined(__GLIBCXX__) - // Work around libstdc++ bug 51038 where atomic_thread_fence was declared but - // not defined, leading to the linker complaining about undefined references. - __atomic_thread_fence(std::memory_order_seq_cst); -#else - std::atomic_thread_fence(std::memory_order_seq_cst); -#endif -} - -inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - ((AtomicLocation32)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_relaxed, - std::memory_order_relaxed); - return old_value; -} - -inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, - Atomic32 new_value) { - return ((AtomicLocation32)ptr) - ->exchange(new_value, std::memory_order_relaxed); -} - -inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return increment + - ((AtomicLocation32)ptr) - ->fetch_add(increment, std::memory_order_relaxed); -} - -inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return increment + ((AtomicLocation32)ptr)->fetch_add(increment); -} - -inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - ((AtomicLocation32)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_acquire, - std::memory_order_acquire); - return old_value; -} - -inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - ((AtomicLocation32)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_release, - std::memory_order_relaxed); - return old_value; -} - -inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { - ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); -} - -inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { - ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); - MemoryBarrier(); -} - -inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { - ((AtomicLocation32)ptr)->store(value, std::memory_order_release); -} - -inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { - return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); -} - -inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { - return ((AtomicLocation32)ptr)->load(std::memory_order_acquire); -} - -inline Atomic32 Release_Load(volatile const Atomic32* ptr) { - MemoryBarrier(); - return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); -} - -#if defined(ARCH_CPU_64_BITS) - -typedef volatile std::atomic<Atomic64>* AtomicLocation64; -static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64), - "incompatible 64-bit atomic layout"); - -inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - ((AtomicLocation64)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_relaxed, - std::memory_order_relaxed); - return old_value; -} - -inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, - Atomic64 new_value) { - return ((AtomicLocation64)ptr) - ->exchange(new_value, std::memory_order_relaxed); -} - -inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return increment + - ((AtomicLocation64)ptr) - ->fetch_add(increment, std::memory_order_relaxed); -} - -inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return increment + ((AtomicLocation64)ptr)->fetch_add(increment); -} - -inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - ((AtomicLocation64)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_acquire, - std::memory_order_acquire); - return old_value; -} - -inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - ((AtomicLocation64)ptr) - ->compare_exchange_strong(old_value, - new_value, - std::memory_order_release, - std::memory_order_relaxed); - return old_value; -} - -inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { - ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed); -} - -inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { - ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed); - MemoryBarrier(); -} - -inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { - ((AtomicLocation64)ptr)->store(value, std::memory_order_release); -} - -inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { - return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); -} - -inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { - return ((AtomicLocation64)ptr)->load(std::memory_order_acquire); -} - -inline Atomic64 Release_Load(volatile const Atomic64* ptr) { - MemoryBarrier(); - return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); -} - -#endif // defined(ARCH_CPU_64_BITS) -} -} // namespace base::subtle - -#endif // MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_x86_msvc.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_x86_msvc.h deleted file mode 100644 index 353158d07b..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/atomicops_internals_x86_msvc.h +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file is an internal atomic implementation, use base/atomicops.h instead. - -#ifndef MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_X86_MSVC_H_ -#define MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_X86_MSVC_H_ - -#include <windows.h> - -#include <intrin.h> - -#if defined(ARCH_CPU_64_BITS) -// windows.h #defines this (only on x64). This causes problems because the -// public API also uses MemoryBarrier at the public name for this fence. So, on -// X64, undef it, and call its documented -// (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208.aspx) -// implementation directly. -#undef MemoryBarrier -#endif - -namespace base { -namespace subtle { - -inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - LONG result = _InterlockedCompareExchange( - reinterpret_cast<volatile LONG*>(ptr), - static_cast<LONG>(new_value), - static_cast<LONG>(old_value)); - return static_cast<Atomic32>(result); -} - -inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, - Atomic32 new_value) { - LONG result = _InterlockedExchange( - reinterpret_cast<volatile LONG*>(ptr), - static_cast<LONG>(new_value)); - return static_cast<Atomic32>(result); -} - -inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return _InterlockedExchangeAdd( - reinterpret_cast<volatile LONG*>(ptr), - static_cast<LONG>(increment)) + increment; -} - -inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, - Atomic32 increment) { - return Barrier_AtomicIncrement(ptr, increment); -} - -inline void MemoryBarrier() { -#if defined(ARCH_CPU_64_BITS) - // See #undef and note at the top of this file. - __faststorefence(); -#else - // We use MemoryBarrier from WinNT.h - ::MemoryBarrier(); -#endif -} - -inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - return NoBarrier_CompareAndSwap(ptr, old_value, new_value); -} - -inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, - Atomic32 old_value, - Atomic32 new_value) { - return NoBarrier_CompareAndSwap(ptr, old_value, new_value); -} - -inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { - *ptr = value; -} - -inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { - NoBarrier_AtomicExchange(ptr, value); - // acts as a barrier in this implementation -} - -inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { - *ptr = value; // works w/o barrier for current Intel chips as of June 2005 - // See comments in Atomic64 version of Release_Store() below. -} - -inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { - return *ptr; -} - -inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { - Atomic32 value = *ptr; - return value; -} - -inline Atomic32 Release_Load(volatile const Atomic32* ptr) { - MemoryBarrier(); - return *ptr; -} - -#if defined(_WIN64) - -// 64-bit low-level operations on 64-bit platform. - -static_assert(sizeof(Atomic64) == sizeof(PVOID), "atomic word is atomic"); - -inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - PVOID result = InterlockedCompareExchangePointer( - reinterpret_cast<volatile PVOID*>(ptr), - reinterpret_cast<PVOID>(new_value), reinterpret_cast<PVOID>(old_value)); - return reinterpret_cast<Atomic64>(result); -} - -inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, - Atomic64 new_value) { - PVOID result = InterlockedExchangePointer( - reinterpret_cast<volatile PVOID*>(ptr), - reinterpret_cast<PVOID>(new_value)); - return reinterpret_cast<Atomic64>(result); -} - -inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return InterlockedExchangeAdd64( - reinterpret_cast<volatile LONGLONG*>(ptr), - static_cast<LONGLONG>(increment)) + increment; -} - -inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, - Atomic64 increment) { - return Barrier_AtomicIncrement(ptr, increment); -} - -inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { - *ptr = value; -} - -inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { - NoBarrier_AtomicExchange(ptr, value); - // acts as a barrier in this implementation -} - -inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { - *ptr = value; // works w/o barrier for current Intel chips as of June 2005 - - // When new chips come out, check: - // IA-32 Intel Architecture Software Developer's Manual, Volume 3: - // System Programming Guide, Chatper 7: Multiple-processor management, - // Section 7.2, Memory Ordering. - // Last seen at: - // http://developer.intel.com/design/pentium4/manuals/index_new.htm -} - -inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { - return *ptr; -} - -inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { - Atomic64 value = *ptr; - return value; -} - -inline Atomic64 Release_Load(volatile const Atomic64* ptr) { - MemoryBarrier(); - return *ptr; -} - -inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - return NoBarrier_CompareAndSwap(ptr, old_value, new_value); -} - -inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, - Atomic64 old_value, - Atomic64 new_value) { - return NoBarrier_CompareAndSwap(ptr, old_value, new_value); -} - - -#endif // defined(_WIN64) - -} // namespace base::subtle -} // namespace base - -#endif // MINI_CHROMIUM_BASE_ATOMICOPS_INTERNALS_X86_MSVC_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/auto_reset.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/auto_reset.h deleted file mode 100644 index 03b4015d55..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/auto_reset.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_AUTO_RESET_H_ -#define MINI_CHROMIUM_BASE_AUTO_RESET_H_ - -#include "base/macros.h" - -namespace base { - -template<typename T> -class AutoReset { - public: - AutoReset(T* scoped_variable, T new_value) - : scoped_variable_(scoped_variable), - original_value_(*scoped_variable) { - *scoped_variable_ = new_value; - } - - ~AutoReset() { *scoped_variable_ = original_value_; } - - private: - T* scoped_variable_; - T original_value_; - - DISALLOW_COPY_AND_ASSIGN(AutoReset); -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_AUTO_RESET_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/bit_cast.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/bit_cast.h deleted file mode 100644 index a93ba63ef8..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/bit_cast.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_BIT_CAST_H_ -#define MINI_CHROMIUM_BASE_BIT_CAST_H_ - -#include <string.h> -#include <type_traits> - -#include "base/compiler_specific.h" -#include "build/build_config.h" - -// bit_cast<Dest,Source> is a template function that implements the equivalent -// of "*reinterpret_cast<Dest*>(&source)". We need this in very low-level -// functions like the protobuf library and fast math support. -// -// float f = 3.14159265358979; -// int i = bit_cast<int32_t>(f); -// // i = 0x40490fdb -// -// The classical address-casting method is: -// -// // WRONG -// float f = 3.14159265358979; // WRONG -// int i = * reinterpret_cast<int*>(&f); // WRONG -// -// The address-casting method actually produces undefined behavior according to -// the ISO C++98 specification, section 3.10 ("basic.lval"), paragraph 15. -// (This did not substantially change in C++11.) Roughly, this section says: if -// an object in memory has one type, and a program accesses it with a different -// type, then the result is undefined behavior for most values of "different -// type". -// -// This is true for any cast syntax, either *(int*)&f or -// *reinterpret_cast<int*>(&f). And it is particularly true for conversions -// between integral lvalues and floating-point lvalues. -// -// The purpose of this paragraph is to allow optimizing compilers to assume that -// expressions with different types refer to different memory. Compilers are -// known to take advantage of this. So a non-conforming program quietly -// produces wildly incorrect output. -// -// The problem is not the use of reinterpret_cast. The problem is type punning: -// holding an object in memory of one type and reading its bits back using a -// different type. -// -// The C++ standard is more subtle and complex than this, but that is the basic -// idea. -// -// Anyways ... -// -// bit_cast<> calls memcpy() which is blessed by the standard, especially by the -// example in section 3.9 . Also, of course, bit_cast<> wraps up the nasty -// logic in one place. -// -// Fortunately memcpy() is very fast. In optimized mode, compilers replace -// calls to memcpy() with inline object code when the size argument is a -// compile-time constant. On a 32-bit system, memcpy(d,s,4) compiles to one -// load and one store, and memcpy(d,s,8) compiles to two loads and two stores. - -template <class Dest, class Source> -inline Dest bit_cast(const Source& source) { - static_assert(sizeof(Dest) == sizeof(Source), - "bit_cast requires source and destination to be the same size"); - -#if (__GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1) || \ - defined(_LIBCPP_VERSION)) - // GCC 5.1 contains the first libstdc++ with is_trivially_copyable. - // Assume libc++ Just Works: is_trivially_copyable added on May 13th 2011. - static_assert(std::is_trivially_copyable<Dest>::value, - "non-trivially-copyable bit_cast is undefined"); - static_assert(std::is_trivially_copyable<Source>::value, - "non-trivially-copyable bit_cast is undefined"); -#elif HAS_FEATURE(is_trivially_copyable) - // The compiler supports an equivalent intrinsic. - static_assert(__is_trivially_copyable(Dest), - "non-trivially-copyable bit_cast is undefined"); - static_assert(__is_trivially_copyable(Source), - "non-trivially-copyable bit_cast is undefined"); -#elif COMPILER_GCC - // Fallback to compiler intrinsic on GCC and clang (which pretends to be - // GCC). This isn't quite the same as is_trivially_copyable but it'll do for - // our purpose. - static_assert(__has_trivial_copy(Dest), - "non-trivially-copyable bit_cast is undefined"); - static_assert(__has_trivial_copy(Source), - "non-trivially-copyable bit_cast is undefined"); -#else - // Do nothing, let the bots handle it. -#endif - - Dest dest; - memcpy(&dest, &source, sizeof(dest)); - return dest; -} - -#endif // MINI_CHROMIUM_BASE_BIT_CAST_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/compiler_specific.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/compiler_specific.h deleted file mode 100644 index 73c02ea5fd..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/compiler_specific.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ -#define MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ - -#include "build/build_config.h" - -#if defined(COMPILER_MSVC) - -// MSVC_SUPPRESS_WARNING disables warning |n| for the remainder of the line and -// for the next line of the source file. -#define MSVC_SUPPRESS_WARNING(n) __pragma(warning(suppress:n)) - -// MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled. -// The warning remains disabled until popped by MSVC_POP_WARNING. -#define MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ - __pragma(warning(disable:n)) - -// Pop effects of innermost MSVC_PUSH_* macro. -#define MSVC_POP_WARNING() __pragma(warning(pop)) - -#else // Not MSVC - -#define MSVC_SUPPRESS_WARNING(n) -#define MSVC_PUSH_DISABLE_WARNING(n) -#define MSVC_POP_WARNING() - -#endif // COMPILER_MSVC - -// Annotate a variable indicating it's ok if the variable is not used. -// (Typically used to silence a compiler warning when the assignment -// is important for some other reason.) -// Use like: -// int x = ...; -// ALLOW_UNUSED_LOCAL(x); -#define ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0 - -// Annotate a typedef or function indicating it's ok if it's not used. -// Use like: -// typedef Foo Bar ALLOW_UNUSED_TYPE; -#if defined(COMPILER_GCC) -#define ALLOW_UNUSED_TYPE __attribute__((unused)) -#else -#define ALLOW_UNUSED_TYPE -#endif - -// Specify memory alignment for structs, classes, etc. -// Use like: -// class ALIGNAS(16) MyClass { ... } -// ALIGNAS(16) int array[4]; -#if defined(COMPILER_MSVC) -#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) -#elif defined(COMPILER_GCC) -#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) -#endif - -// Return the byte alignment of the given type (available at compile time). Use -// sizeof(type) prior to checking __alignof to workaround Visual C++ bug: -// http://goo.gl/isH0C -// Use like: -// ALIGNOF(int32_t) // this would be 4 -#if defined(COMPILER_MSVC) -#define ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type)) -#elif defined(COMPILER_GCC) -#define ALIGNOF(type) __alignof__(type) -#endif - -#if defined(COMPILER_MSVC) -#define WARN_UNUSED_RESULT -#else -#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#endif - -#if defined(COMPILER_MSVC) -#define PRINTF_FORMAT(format_param, dots_param) -#else -#define PRINTF_FORMAT(format_param, dots_param) \ - __attribute__((format(printf, format_param, dots_param))) -#endif - -// Compiler feature-detection. -// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension -#if defined(__has_feature) -#define HAS_FEATURE(FEATURE) __has_feature(FEATURE) -#else -#define HAS_FEATURE(FEATURE) 0 -#endif - -#endif // MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_path.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_path.h deleted file mode 100644 index 0ac91bf873..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_path.h +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// FilePath is a container for pathnames stored in a platform's native string -// type, providing containers for manipulation in according with the -// platform's conventions for pathnames. It supports the following path -// types: -// -// POSIX Windows -// --------------- ---------------------------------- -// Fundamental type char[] wchar_t[] -// Encoding unspecified* UTF-16 -// Separator / \, tolerant of / -// Drive letters no case-insensitive A-Z followed by : -// Alternate root // (surprise!) \\, for UNC paths -// -// * The encoding need not be specified on POSIX systems, although some -// POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. -// Chrome OS also uses UTF-8. -// Linux does not specify an encoding, but in practice, the locale's -// character set may be used. -// -// For more arcane bits of path trivia, see below. -// -// FilePath objects are intended to be used anywhere paths are. An -// application may pass FilePath objects around internally, masking the -// underlying differences between systems, only differing in implementation -// where interfacing directly with the system. For example, a single -// OpenFile(const FilePath &) function may be made available, allowing all -// callers to operate without regard to the underlying implementation. On -// POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might -// wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This -// allows each platform to pass pathnames around without requiring conversions -// between encodings, which has an impact on performance, but more imporantly, -// has an impact on correctness on platforms that do not have well-defined -// encodings for pathnames. -// -// Several methods are available to perform common operations on a FilePath -// object, such as determining the parent directory (DirName), isolating the -// final path component (BaseName), and appending a relative pathname string -// to an existing FilePath object (Append). These methods are highly -// recommended over attempting to split and concatenate strings directly. -// These methods are based purely on string manipulation and knowledge of -// platform-specific pathname conventions, and do not consult the filesystem -// at all, making them safe to use without fear of blocking on I/O operations. -// These methods do not function as mutators but instead return distinct -// instances of FilePath objects, and are therefore safe to use on const -// objects. The objects themselves are safe to share between threads. -// -// To aid in initialization of FilePath objects from string literals, a -// FILE_PATH_LITERAL macro is provided, which accounts for the difference -// between char[]-based pathnames on POSIX systems and wchar_t[]-based -// pathnames on Windows. -// -// Paths can't contain NULs as a precaution agaist premature truncation. -// -// Because a FilePath object should not be instantiated at the global scope, -// instead, use a FilePath::CharType[] and initialize it with -// FILE_PATH_LITERAL. At runtime, a FilePath object can be created from the -// character array. Example: -// -// | const FilePath::CharType kLogFileName[] = FILE_PATH_LITERAL("log.txt"); -// | -// | void Function() { -// | FilePath log_file_path(kLogFileName); -// | [...] -// | } -// -// WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even -// when the UI language is RTL. This means you always need to pass filepaths -// through base::i18n::WrapPathWithLTRFormatting() before displaying it in the -// RTL UI. -// -// This is a very common source of bugs, please try to keep this in mind. -// -// ARCANE BITS OF PATH TRIVIA -// -// - A double leading slash is actually part of the POSIX standard. Systems -// are allowed to treat // as an alternate root, as Windows does for UNC -// (network share) paths. Most POSIX systems don't do anything special -// with two leading slashes, but FilePath handles this case properly -// in case it ever comes across such a system. FilePath needs this support -// for Windows UNC paths, anyway. -// References: -// The Open Group Base Specifications Issue 7, sections 3.266 ("Pathname") -// and 4.12 ("Pathname Resolution"), available at: -// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_266 -// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_12 -// -// - Windows treats c:\\ the same way it treats \\. This was intended to -// allow older applications that require drive letters to support UNC paths -// like \\server\share\path, by permitting c:\\server\share\path as an -// equivalent. Since the OS treats these paths specially, FilePath needs -// to do the same. Since Windows can use either / or \ as the separator, -// FilePath treats c://, c:\\, //, and \\ all equivalently. -// Reference: -// The Old New Thing, "Why is a drive letter permitted in front of UNC -// paths (sometimes)?", available at: -// http://blogs.msdn.com/oldnewthing/archive/2005/11/22/495740.aspx - -#ifndef MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ -#define MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ - -#include <stddef.h> - -#include <iosfwd> -#include <string> - -#include "base/compiler_specific.h" -#include "build/build_config.h" - -// Windows-style drive letter support and pathname separator characters can be -// enabled and disabled independently, to aid testing. These #defines are -// here so that the same setting can be used in both the implementation and -// in the unit test. -#if defined(OS_WIN) -#define FILE_PATH_USES_DRIVE_LETTERS -#define FILE_PATH_USES_WIN_SEPARATORS -#endif // OS_WIN - -namespace base { - -// An abstraction to isolate users from the differences between native -// pathnames on different platforms. -class FilePath { - public: -#if defined(OS_POSIX) - // On most platforms, native pathnames are char arrays, and the encoding - // may or may not be specified. On Mac OS X, native pathnames are encoded - // in UTF-8. - typedef std::string StringType; -#elif defined(OS_WIN) - // On Windows, for Unicode-aware applications, native pathnames are wchar_t - // arrays encoded in UTF-16. - typedef std::wstring StringType; -#endif // OS_WIN - - typedef StringType::value_type CharType; - - // Null-terminated array of separators used to separate components in - // hierarchical paths. Each character in this array is a valid separator, - // but kSeparators[0] is treated as the canonical separator and will be used - // when composing pathnames. - static const CharType kSeparators[]; - - // A special path component meaning "this directory." - static const CharType kCurrentDirectory[]; - - // A special path component meaning "the parent directory." - static const CharType kParentDirectory[]; - - // The character used to identify a file extension. - static const CharType kExtensionSeparator; - - FilePath(); - FilePath(const FilePath& that); - explicit FilePath(const StringType& path); - ~FilePath(); - FilePath& operator=(const FilePath& that); - - bool operator==(const FilePath& that) const; - - bool operator!=(const FilePath& that) const; - - // Required for some STL containers and operations - bool operator<(const FilePath& that) const { - return path_ < that.path_; - } - - const StringType& value() const { return path_; } - - bool empty() const { return path_.empty(); } - - void clear() { path_.clear(); } - - // Returns true if |character| is in kSeparators. - static bool IsSeparator(CharType character); - - // Returns a FilePath corresponding to the directory containing the path - // named by this object, stripping away the file component. If this object - // only contains one component, returns a FilePath identifying - // kCurrentDirectory. If this object already refers to the root directory, - // returns a FilePath identifying the root directory. - FilePath DirName() const WARN_UNUSED_RESULT; - - // Returns a FilePath corresponding to the last path component of this - // object, either a file or a directory. If this object already refers to - // the root directory, returns a FilePath identifying the root directory; - // this is the only situation in which BaseName will return an absolute path. - FilePath BaseName() const WARN_UNUSED_RESULT; - - // Returns the path's file extension. This does not have a special case for - // common double extensions, so FinalExtension() of "foo.tar.gz" is simply - // ".gz". If there is no extension, "" will be returned. - StringType FinalExtension() const WARN_UNUSED_RESULT; - - // Returns a FilePath with FinalExtension() removed. - FilePath RemoveFinalExtension() const WARN_UNUSED_RESULT; - - // Returns a FilePath by appending a separator and the supplied path - // component to this object's path. Append takes care to avoid adding - // excessive separators if this object's path already ends with a separator. - // If this object's path is kCurrentDirectory, a new FilePath corresponding - // only to |component| is returned. |component| must be a relative path; - // it is an error to pass an absolute path. - FilePath Append(const StringType& component) const WARN_UNUSED_RESULT; - FilePath Append(const FilePath& component) const WARN_UNUSED_RESULT; - - // Returns true if this FilePath contains an absolute path. On Windows, an - // absolute path begins with either a drive letter specification followed by - // a separator character, or with two separator characters. On POSIX - // platforms, an absolute path begins with a separator character. - bool IsAbsolute() const; - - private: - // Remove trailing separators from this object. If the path is absolute, it - // will never be stripped any more than to refer to the absolute root - // directory, so "////" will become "/", not "". A leading pair of - // separators is never stripped, to support alternate roots. This is used to - // support UNC paths on Windows. - void StripTrailingSeparatorsInternal(); - - StringType path_; -}; - -} // namespace base - -// This is required by googletest to print a readable output on test failures. -extern void PrintTo(const base::FilePath& path, std::ostream* out); - -// Macros for string literal initialization of FilePath::CharType[], and for -// using a FilePath::CharType[] in a printf-style format string. -#if defined(OS_POSIX) -#define FILE_PATH_LITERAL(x) x -#define PRFilePath "s" -#define PRFilePathLiteral "%s" -#elif defined(OS_WIN) -#define FILE_PATH_LITERAL(x) L ## x -#define PRFilePath "ls" -#define PRFilePathLiteral L"%ls" -#endif // OS_WIN - -#endif // MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_util.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_util.h deleted file mode 100644 index 312525176b..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/file_util.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_FILES_FILE_UTIL_H_ -#define MINI_CHROMIUM_BASE_FILES_FILE_UTIL_H_ - -#include "build/build_config.h" - -#if defined(OS_POSIX) - -#include <sys/types.h> - -namespace base { - -bool ReadFromFD(int fd, char* buffer, size_t bytes); - -} // namespace base - -#endif // OS_POSIX - -#endif // MINI_CHROMIUM_BASE_FILES_FILE_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h deleted file mode 100644 index 462f561386..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/files/scoped_file.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_FILES_SCOPED_FILE_H_ -#define MINI_CHROMIUM_BASE_FILES_SCOPED_FILE_H_ - -#include <stdio.h> - -#include <memory> - -#include "base/scoped_generic.h" -#include "build/build_config.h" - -namespace base { - -namespace internal { - -#if defined(OS_POSIX) -struct ScopedFDCloseTraits { - static int InvalidValue() { - return -1; - } - static void Free(int fd); -}; -#endif // OS_POSIX - -struct ScopedFILECloser { - void operator()(FILE* file) const; -}; - -} // namespace internal - -#if defined(OS_POSIX) -typedef ScopedGeneric<int, internal::ScopedFDCloseTraits> ScopedFD; -#endif // OS_POSIX -typedef std::unique_ptr<FILE, internal::ScopedFILECloser> ScopedFILE; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_FILES_SCOPED_FILE_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/format_macros.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/format_macros.h deleted file mode 100644 index 4d90c593a6..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/format_macros.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_FORMAT_MACROS_H_ -#define BASE_FORMAT_MACROS_H_ - -// This file defines the format macros for some integer types. - -// To print a 64-bit value in a portable way: -// int64_t value; -// printf("xyz:%" PRId64, value); -// The "d" in the macro corresponds to %d; you can also use PRIu64 etc. -// -// For wide strings, prepend "Wide" to the macro: -// int64_t value; -// StringPrintf(L"xyz: %" WidePRId64, value); -// -// To print a size_t value in a portable way: -// size_t size; -// printf("xyz: %" PRIuS, size); -// The "u" in the macro corresponds to %u, and S is for "size". - -#include "build/build_config.h" - -#if defined(OS_POSIX) - -#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) -#error "inttypes.h has already been included before this header file, but " -#error "without __STDC_FORMAT_MACROS defined." -#endif - -#if !defined(__STDC_FORMAT_MACROS) -#define __STDC_FORMAT_MACROS -#endif - -#include <inttypes.h> - -// GCC will concatenate wide and narrow strings correctly, so nothing needs to -// be done here. -#define WidePRId64 PRId64 -#define WidePRIu64 PRIu64 -#define WidePRIx64 PRIx64 - -#if !defined(PRIuS) -#define PRIuS "zu" -#endif - -// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit -// architectures and Apple does not provides standard format macros and -// recommends casting. This has many drawbacks, so instead define macros -// for formatting those types. -#if defined(OS_MACOSX) -#if defined(ARCH_CPU_64_BITS) -#if !defined(PRIdNS) -#define PRIdNS "ld" -#endif -#if !defined(PRIuNS) -#define PRIuNS "lu" -#endif -#if !defined(PRIxNS) -#define PRIxNS "lx" -#endif -#else // defined(ARCH_CPU_64_BITS) -#if !defined(PRIdNS) -#define PRIdNS "d" -#endif -#if !defined(PRIuNS) -#define PRIuNS "u" -#endif -#if !defined(PRIxNS) -#define PRIxNS "x" -#endif -#endif -#endif // defined(OS_MACOSX) - -#else // OS_WIN - -#if !defined(PRId64) -#define PRId64 "I64d" -#endif - -#if !defined(PRIu64) -#define PRIu64 "I64u" -#endif - -#if !defined(PRIx64) -#define PRIx64 "I64x" -#endif - -#define WidePRId64 L"I64d" -#define WidePRIu64 L"I64u" -#define WidePRIx64 L"I64x" - -#if !defined(PRIuS) -#define PRIuS "Iu" -#endif - -#endif - -#endif // BASE_FORMAT_MACROS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/logging.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/logging.h deleted file mode 100644 index 37bf23be86..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/logging.h +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_LOGGING_H_ -#define MINI_CHROMIUM_BASE_LOGGING_H_ - -#include <assert.h> -#include <errno.h> - -#include <limits> -#include <sstream> -#include <string> - -#include "base/macros.h" -#include "build/build_config.h" - -namespace logging { - -typedef int LogSeverity; -const LogSeverity LOG_VERBOSE = -1; -const LogSeverity LOG_INFO = 0; -const LogSeverity LOG_WARNING = 1; -const LogSeverity LOG_ERROR = 2; -const LogSeverity LOG_ERROR_REPORT = 3; -const LogSeverity LOG_FATAL = 4; -const LogSeverity LOG_NUM_SEVERITIES = 5; - -#if defined(NDEBUG) -const LogSeverity LOG_DFATAL = LOG_ERROR; -#else -const LogSeverity LOG_DFATAL = LOG_FATAL; -#endif - -typedef bool (*LogMessageHandlerFunction)(LogSeverity severity, - const char* file_poath, - int line, - size_t message_start, - const std::string& string); - -void SetLogMessageHandler(LogMessageHandlerFunction log_message_handler); -LogMessageHandlerFunction GetLogMessageHandler(); - -static inline int GetMinLogLevel() { - return LOG_INFO; -} - -static inline int GetVlogLevel(const char*) { - return std::numeric_limits<int>::max(); -} - -#if defined(OS_WIN) -// This is just ::GetLastError, but out-of-line to avoid including windows.h in -// such a widely used place. -unsigned long GetLastSystemErrorCode(); -std::string SystemErrorCodeToString(unsigned long error_code); -#elif defined(OS_POSIX) -static inline int GetLastSystemErrorCode() { - return errno; -} -#endif - -template<typename t1, typename t2> -std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) { - std::ostringstream ss; - ss << names << " (" << v1 << " vs. " << v2 << ")"; - std::string* msg = new std::string(ss.str()); - return msg; -} - -#define DEFINE_CHECK_OP_IMPL(name, op) \ - template <typename t1, typename t2> \ - inline std::string* Check ## name ## Impl(const t1& v1, const t2& v2, \ - const char* names) { \ - if (v1 op v2) { \ - return NULL; \ - } else { \ - return MakeCheckOpString(v1, v2, names); \ - } \ - } \ - inline std::string* Check ## name ## Impl(int v1, int v2, \ - const char* names) { \ - if (v1 op v2) { \ - return NULL; \ - } else { \ - return MakeCheckOpString(v1, v2, names); \ - } \ - } - -DEFINE_CHECK_OP_IMPL(EQ, ==) -DEFINE_CHECK_OP_IMPL(NE, !=) -DEFINE_CHECK_OP_IMPL(LE, <=) -DEFINE_CHECK_OP_IMPL(LT, <) -DEFINE_CHECK_OP_IMPL(GE, >=) -DEFINE_CHECK_OP_IMPL(GT, >) - -#undef DEFINE_CHECK_OP_IMPL - -class LogMessage { - public: - LogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity); - LogMessage(const char* function, - const char* file_path, - int line, - std::string* result); - ~LogMessage(); - - std::ostream& stream() { return stream_; } - - private: - void Init(const char* function); - - std::ostringstream stream_; - const char* file_path_; - size_t message_start_; - const int line_; - LogSeverity severity_; - - DISALLOW_COPY_AND_ASSIGN(LogMessage); -}; - -class LogMessageVoidify { - public: - LogMessageVoidify() {} - - void operator&(const std::ostream&) const {} -}; - -#if defined(OS_WIN) -class Win32ErrorLogMessage : public LogMessage { - public: - Win32ErrorLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - unsigned long err); - ~Win32ErrorLogMessage(); - - private: - unsigned long err_; - - DISALLOW_COPY_AND_ASSIGN(Win32ErrorLogMessage); -}; -#elif defined(OS_POSIX) -class ErrnoLogMessage : public LogMessage { - public: - ErrnoLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - int err); - ~ErrnoLogMessage(); - - private: - int err_; - - DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage); -}; -#endif - -} // namespace logging - -#if defined(COMPILER_MSVC) -#define FUNCTION_SIGNATURE __FUNCSIG__ -#else -#define FUNCTION_SIGNATURE __PRETTY_FUNCTION__ -#endif - -#define COMPACT_GOOGLE_LOG_EX_INFO(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_INFO, ## __VA_ARGS__) -#define COMPACT_GOOGLE_LOG_EX_WARNING(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_WARNING, ## __VA_ARGS__) -#define COMPACT_GOOGLE_LOG_EX_ERROR(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_ERROR, ## __VA_ARGS__) -#define COMPACT_GOOGLE_LOG_EX_ERROR_REPORT(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_ERROR_REPORT, ## __VA_ARGS__) -#define COMPACT_GOOGLE_LOG_EX_FATAL(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_FATAL, ## __VA_ARGS__) -#define COMPACT_GOOGLE_LOG_EX_DFATAL(ClassName, ...) \ - logging::ClassName(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - logging::LOG_DFATAL, ## __VA_ARGS__) - -#define COMPACT_GOOGLE_LOG_INFO \ - COMPACT_GOOGLE_LOG_EX_INFO(LogMessage) -#define COMPACT_GOOGLE_LOG_WARNING \ - COMPACT_GOOGLE_LOG_EX_WARNING(LogMessage) -#define COMPACT_GOOGLE_LOG_ERROR \ - COMPACT_GOOGLE_LOG_EX_ERROR(LogMessage) -#define COMPACT_GOOGLE_LOG_ERROR_REPORT \ - COMPACT_GOOGLE_LOG_EX_ERROR_REPORT(LogMessage) -#define COMPACT_GOOGLE_LOG_FATAL \ - COMPACT_GOOGLE_LOG_EX_FATAL(LogMessage) -#define COMPACT_GOOGLE_LOG_DFATAL \ - COMPACT_GOOGLE_LOG_EX_DFATAL(LogMessage) - -#if defined(OS_WIN) - -// wingdi.h defines ERROR 0. We don't want to include windows.h here, and we -// want to allow "LOG(ERROR)", which will expand to LOG_0. - -// This will not cause a warning if the RHS text is identical to that in -// wingdi.h (which it is). -#define ERROR 0 - -#define COMPACT_GOOGLE_LOG_EX_0(ClassName, ...) \ - COMPACT_GOOGLE_LOG_EX_ERROR(ClassName , ##__VA_ARGS__) -#define COMPACT_GOOGLE_LOG_0 COMPACT_GOOGLE_LOG_ERROR -namespace logging { -const LogSeverity LOG_0 = LOG_ERROR; -} // namespace logging - -#endif // OS_WIN - -#define LAZY_STREAM(stream, condition) \ - !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream) - -#define LOG_IS_ON(severity) \ - ((::logging::LOG_ ## severity) >= ::logging::GetMinLogLevel()) -#define VLOG_IS_ON(verbose_level) \ - ((verbose_level) <= ::logging::GetVlogLevel(__FILE__)) - -#define LOG_STREAM(severity) COMPACT_GOOGLE_LOG_ ## severity.stream() -#define VLOG_STREAM(verbose_level) \ - logging::LogMessage(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - -verbose_level).stream() - -#if defined(OS_WIN) -#define PLOG_STREAM(severity) COMPACT_GOOGLE_LOG_EX_ ## severity( \ - Win32ErrorLogMessage, ::logging::GetLastSystemErrorCode()).stream() -#define VPLOG_STREAM(verbose_level) \ - logging::Win32ErrorLogMessage(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - -verbose_level, \ - ::logging::GetLastSystemErrorCode()).stream() -#elif defined(OS_POSIX) -#define PLOG_STREAM(severity) COMPACT_GOOGLE_LOG_EX_ ## severity( \ - ErrnoLogMessage, ::logging::GetLastSystemErrorCode()).stream() -#define VPLOG_STREAM(verbose_level) \ - logging::ErrnoLogMessage(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - -verbose_level, \ - ::logging::GetLastSystemErrorCode()).stream() -#endif - -#define LOG(severity) LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity)) -#define LOG_IF(severity, condition) \ - LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity) && (condition)) -#define LOG_ASSERT(condition) \ - LOG_IF(FATAL, !(condition)) << "Assertion failed: " # condition ". " - -#define VLOG(verbose_level) \ - LAZY_STREAM(VLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level)) -#define VLOG_IF(verbose_level, condition) \ - LAZY_STREAM(VLOG_STREAM(verbose_level), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define PLOG(severity) LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity)) -#define PLOG_IF(severity, condition) \ - LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition)) - -#define VPLOG(verbose_level) \ - LAZY_STREAM(VPLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level)) -#define VPLOG_IF(verbose_level, condition) \ - LAZY_STREAM(VPLOG_STREAM(verbose_level), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define CHECK(condition) \ - LAZY_STREAM(LOG_STREAM(FATAL), !(condition)) \ - << "Check failed: " # condition << ". " -#define PCHECK(condition) \ - LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \ - << "Check failed: " # condition << ". " - -#define CHECK_OP(name, op, val1, val2) \ - if (std::string* _result = \ - logging::Check ## name ## Impl((val1), (val2), \ - # val1 " " # op " " # val2)) \ - logging::LogMessage(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - _result).stream() - -#define CHECK_EQ(val1, val2) CHECK_OP(EQ, ==, val1, val2) -#define CHECK_NE(val1, val2) CHECK_OP(NE, !=, val1, val2) -#define CHECK_LE(val1, val2) CHECK_OP(LE, <=, val1, val2) -#define CHECK_LT(val1, val2) CHECK_OP(LT, <, val1, val2) -#define CHECK_GE(val1, val2) CHECK_OP(GE, >=, val1, val2) -#define CHECK_GT(val1, val2) CHECK_OP(GT, >, val1, val2) - -#if defined(NDEBUG) -#define DLOG_IS_ON(severity) 0 -#define DVLOG_IS_ON(verbose_level) 0 -#define DCHECK_IS_ON() 0 -#else -#define DLOG_IS_ON(severity) LOG_IS_ON(severity) -#define DVLOG_IS_ON(verbose_level) VLOG_IS_ON(verbose_level) -#define DCHECK_IS_ON() 1 -#endif - -#define DLOG(severity) LAZY_STREAM(LOG_STREAM(severity), DLOG_IS_ON(severity)) -#define DLOG_IF(severity, condition) \ - LAZY_STREAM(LOG_STREAM(severity), DLOG_IS_ON(severity) && (condition)) -#define DLOG_ASSERT(condition) \ - DLOG_IF(FATAL, !(condition)) << "Assertion failed: " # condition ". " - -#define DVLOG(verbose_level) \ - LAZY_STREAM(VLOG_STREAM(verbose_level), DVLOG_IS_ON(verbose_level)) -#define DVLOG_IF(verbose_level, condition) \ - LAZY_STREAM(VLOG_STREAM(verbose_level), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define DPLOG(severity) LAZY_STREAM(PLOG_STREAM(severity), DLOG_IS_ON(severity)) -#define DPLOG_IF(severity, condition) \ - LAZY_STREAM(PLOG_STREAM(severity), DLOG_IS_ON(severity) && (condition)) - -#define DVPLOG(verbose_level) \ - LAZY_STREAM(VPLOG_STREAM(verbose_level), DVLOG_IS_ON(verbose_level)) -#define DVPLOG_IF(verbose_level, condition) \ - LAZY_STREAM(VPLOG_STREAM(verbose_level), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define DCHECK(condition) \ - LAZY_STREAM(LOG_STREAM(FATAL), DCHECK_IS_ON() ? !(condition) : false) \ - << "Check failed: " # condition << ". " -#define DPCHECK(condition) \ - LAZY_STREAM(PLOG_STREAM(FATAL), DCHECK_IS_ON() ? !(condition) : false) \ - << "Check failed: " # condition << ". " - -#define DCHECK_OP(name, op, val1, val2) \ - if (DCHECK_IS_ON()) \ - if (std::string* _result = \ - logging::Check ## name ## Impl((val1), (val2), \ - # val1 " " # op " " # val2)) \ - logging::LogMessage(FUNCTION_SIGNATURE, __FILE__, __LINE__, \ - _result).stream() - -#define DCHECK_EQ(val1, val2) DCHECK_OP(EQ, ==, val1, val2) -#define DCHECK_NE(val1, val2) DCHECK_OP(NE, !=, val1, val2) -#define DCHECK_LE(val1, val2) DCHECK_OP(LE, <=, val1, val2) -#define DCHECK_LT(val1, val2) DCHECK_OP(LT, <, val1, val2) -#define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2) -#define DCHECK_GT(val1, val2) DCHECK_OP(GT, >, val1, val2) - -#define NOTREACHED() DCHECK(false) - -#undef assert -#define assert(condition) DLOG_ASSERT(condition) - -#endif // MINI_CHROMIUM_BASE_LOGGING_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h deleted file mode 100644 index 9291ac7c1c..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/foundation_util.h +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ -#define MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ - -#include <ApplicationServices/ApplicationServices.h> - -#include "base/logging.h" - -#if defined(__OBJC__) -#import <Foundation/Foundation.h> -#else // defined(__OBJC__) -#include <CoreFoundation/CoreFoundation.h> -#endif // defined(__OBJC__) - -#if !defined(__OBJC__) -#define OBJC_CPP_CLASS_DECL(x) class x; -#else // defined(__OBJC__) -#define OBJC_CPP_CLASS_DECL(x) -#endif // defined(__OBJC__) - -// Convert toll-free bridged CFTypes to NSTypes and vice-versa. This does not -// autorelease |cf_val|. This is useful for the case where there is a CFType in -// a call that expects an NSType and the compiler is complaining about const -// casting problems. -// The calls are used like this: -// NSString *foo = CFToNSCast(CFSTR("Hello")); -// CFStringRef foo2 = NSToCFCast(@"Hello"); -// The macro magic below is to enforce safe casting. It could possibly have -// been done using template function specialization, but template function -// specialization doesn't always work intuitively, -// (http://www.gotw.ca/publications/mill17.htm) so the trusty combination -// of macros and function overloading is used instead. - -#define CF_TO_NS_CAST_DECL(TypeCF, TypeNS) \ -OBJC_CPP_CLASS_DECL(TypeNS) \ -\ -namespace base { \ -namespace mac { \ -TypeNS* CFToNSCast(TypeCF##Ref cf_val); \ -TypeCF##Ref NSToCFCast(TypeNS* ns_val); \ -} \ -} -#define CF_TO_NS_MUTABLE_CAST_DECL(name) \ -CF_TO_NS_CAST_DECL(CF##name, NS##name) \ -OBJC_CPP_CLASS_DECL(NSMutable##name) \ -\ -namespace base { \ -namespace mac { \ -NSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val); \ -CFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val); \ -} \ -} - -// List of toll-free bridged types taken from: -// http://www.cocoadev.com/index.pl?TollFreeBridged - -CF_TO_NS_MUTABLE_CAST_DECL(Array); -CF_TO_NS_MUTABLE_CAST_DECL(AttributedString); -CF_TO_NS_CAST_DECL(CFCalendar, NSCalendar); -CF_TO_NS_MUTABLE_CAST_DECL(CharacterSet); -CF_TO_NS_MUTABLE_CAST_DECL(Data); -CF_TO_NS_CAST_DECL(CFDate, NSDate); -CF_TO_NS_MUTABLE_CAST_DECL(Dictionary); -CF_TO_NS_CAST_DECL(CFError, NSError); -CF_TO_NS_CAST_DECL(CFLocale, NSLocale); -CF_TO_NS_CAST_DECL(CFNumber, NSNumber); -CF_TO_NS_CAST_DECL(CFRunLoopTimer, NSTimer); -CF_TO_NS_CAST_DECL(CFTimeZone, NSTimeZone); -CF_TO_NS_MUTABLE_CAST_DECL(Set); -CF_TO_NS_CAST_DECL(CFReadStream, NSInputStream); -CF_TO_NS_CAST_DECL(CFWriteStream, NSOutputStream); -CF_TO_NS_MUTABLE_CAST_DECL(String); -CF_TO_NS_CAST_DECL(CFURL, NSURL); - -#undef CF_TO_NS_CAST_DECL -#undef CF_TO_NS_MUTABLE_CAST_DECL -#undef OBJC_CPP_CLASS_DECL - -namespace base { -namespace mac { - -// CFCast<>() and CFCastStrict<>() cast a basic CFTypeRef to a more -// specific CoreFoundation type. The compatibility of the passed -// object is found by comparing its opaque type against the -// requested type identifier. If the supplied object is not -// compatible with the requested return type, CFCast<>() returns -// NULL and CFCastStrict<>() will DCHECK. Providing a NULL pointer -// to either variant results in NULL being returned without -// triggering any DCHECK. -// -// Example usage: -// CFNumberRef some_number = base::mac::CFCast<CFNumberRef>( -// CFArrayGetValueAtIndex(array, index)); -// -// CFTypeRef hello = CFSTR("hello world"); -// CFStringRef some_string = base::mac::CFCastStrict<CFStringRef>(hello); - -template<typename T> -T CFCast(const CFTypeRef& cf_val); - -template<typename T> -T CFCastStrict(const CFTypeRef& cf_val); - -#define CF_CAST_DECL(TypeCF) \ -template<> TypeCF##Ref \ -CFCast<TypeCF##Ref>(const CFTypeRef& cf_val);\ -\ -template<> TypeCF##Ref \ -CFCastStrict<TypeCF##Ref>(const CFTypeRef& cf_val); - -CF_CAST_DECL(CFArray); -CF_CAST_DECL(CFBag); -CF_CAST_DECL(CFBoolean); -CF_CAST_DECL(CFData); -CF_CAST_DECL(CFDate); -CF_CAST_DECL(CFDictionary); -CF_CAST_DECL(CFNull); -CF_CAST_DECL(CFNumber); -CF_CAST_DECL(CFSet); -CF_CAST_DECL(CFString); -CF_CAST_DECL(CFURL); -CF_CAST_DECL(CFUUID); - -CF_CAST_DECL(CGColor); - -CF_CAST_DECL(CTFont); -CF_CAST_DECL(CTRun); - -CF_CAST_DECL(SecACL); -CF_CAST_DECL(SecTrustedApplication); - -#undef CF_CAST_DECL - -#if defined(__OBJC__) - -// ObjCCast<>() and ObjCCastStrict<>() cast a basic id to a more -// specific (NSObject-derived) type. The compatibility of the passed -// object is found by checking if it's a kind of the requested type -// identifier. If the supplied object is not compatible with the -// requested return type, ObjCCast<>() returns nil and -// ObjCCastStrict<>() will DCHECK. Providing a nil pointer to either -// variant results in nil being returned without triggering any DCHECK. -// -// The strict variant is useful when retrieving a value from a -// collection which only has values of a specific type, e.g. an -// NSArray of NSStrings. The non-strict variant is useful when -// retrieving values from data that you can't fully control. For -// example, a plist read from disk may be beyond your exclusive -// control, so you'd only want to check that the values you retrieve -// from it are of the expected types, but not crash if they're not. -// -// Example usage: -// NSString* version = base::mac::ObjCCast<NSString>( -// [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]); -// -// NSString* str = base::mac::ObjCCastStrict<NSString>( -// [ns_arr_of_ns_strs objectAtIndex:0]); -template<typename T> -T* ObjCCast(id objc_val) { - if ([objc_val isKindOfClass:[T class]]) { - return reinterpret_cast<T*>(objc_val); - } - return nil; -} - -template<typename T> -T* ObjCCastStrict(id objc_val) { - T* rv = ObjCCast<T>(objc_val); - DCHECK(objc_val == nil || rv); - return rv; -} - -#endif // defined(__OBJC__) - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_FOUNDATION_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h deleted file mode 100644 index e5bd1f6381..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/mach_logging.h +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ -#define MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ - -#include <mach/mach.h> - -#include "base/logging.h" -#include "base/macros.h" - -// Use the MACH_LOG family of macros along with a mach_error_t (kern_return_t) -// containing a Mach error. The error value will be decoded so that logged -// messages explain the error. -// -// Use the BOOTSTRAP_LOG family of macros specifically for errors that occur -// while interoperating with the bootstrap subsystem. These errors will first -// be looked up as bootstrap error messages. If no match is found, they will -// be treated as generic Mach errors, as in MACH_LOG. -// -// Examples: -// -// kern_return_t kr = mach_timebase_info(&info); -// if (kr != KERN_SUCCESS) { -// MACH_LOG(ERROR, kr) << "mach_timebase_info"; -// } -// -// kr = vm_deallocate(task, address, size); -// MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate"; - -namespace logging { - -class MachLogMessage : public logging::LogMessage { - public: - MachLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - mach_error_t mach_err); - ~MachLogMessage(); - - private: - mach_error_t mach_err_; - - DISALLOW_COPY_AND_ASSIGN(MachLogMessage); -}; - -} // namespace logging - -#define MACH_LOG_STREAM(severity, mach_err) \ - COMPACT_GOOGLE_LOG_EX_ ## severity(MachLogMessage, mach_err).stream() -#define MACH_VLOG_STREAM(verbose_level, mach_err) \ - logging::MachLogMessage(__PRETTY_FUNCTION__, __FILE__, __LINE__, \ - -verbose_level, mach_err).stream() - -#define MACH_LOG(severity, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), LOG_IS_ON(severity)) -#define MACH_LOG_IF(severity, condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ - LOG_IS_ON(severity) && (condition)) - -#define MACH_VLOG(verbose_level, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - VLOG_IS_ON(verbose_level)) -#define MACH_VLOG_IF(verbose_level, condition, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define MACH_CHECK(condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), !(condition)) \ - << "Check failed: " # condition << ". " - -#define MACH_DLOG(severity, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), DLOG_IS_ON(severity)) -#define MACH_DLOG_IF(severity, condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(severity, mach_err), \ - DLOG_IS_ON(severity) && (condition)) - -#define MACH_DVLOG(verbose_level, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - DVLOG_IS_ON(verbose_level)) -#define MACH_DVLOG_IF(verbose_level, condition, mach_err) \ - LAZY_STREAM(MACH_VLOG_STREAM(verbose_level, mach_err), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define MACH_DCHECK(condition, mach_err) \ - LAZY_STREAM(MACH_LOG_STREAM(FATAL, mach_err), \ - DCHECK_IS_ON && !(condition)) \ - << "Check failed: " # condition << ". " - -namespace logging { - -class BootstrapLogMessage : public logging::LogMessage { - public: - BootstrapLogMessage(const char* function, - const char* file_path, - int line, - LogSeverity severity, - kern_return_t bootstrap_err); - ~BootstrapLogMessage(); - - private: - kern_return_t bootstrap_err_; - - DISALLOW_COPY_AND_ASSIGN(BootstrapLogMessage); -}; - -} // namespace logging - -#define BOOTSTRAP_LOG_STREAM(severity, bootstrap_err) \ - COMPACT_GOOGLE_LOG_EX_ ## severity(BootstrapLogMessage, \ - bootstrap_err).stream() -#define BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err) \ - logging::BootstrapLogMessage(__PRETTY_FUNCTION__, __FILE__, __LINE__, \ - -verbose_level, bootstrap_err).stream() - -#define BOOTSTRAP_LOG(severity, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, \ - bootstrap_err), LOG_IS_ON(severity)) -#define BOOTSTRAP_LOG_IF(severity, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - LOG_IS_ON(severity) && (condition)) - -#define BOOTSTRAP_VLOG(verbose_level, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - VLOG_IS_ON(verbose_level)) -#define BOOTSTRAP_VLOG_IF(verbose_level, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define BOOTSTRAP_CHECK(condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), !(condition)) \ - << "Check failed: " # condition << ". " - -#define BOOTSTRAP_DLOG(severity, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - DLOG_IS_ON(severity)) -#define BOOTSTRAP_DLOG_IF(severity, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(severity, bootstrap_err), \ - DLOG_IS_ON(severity) && (condition)) - -#define BOOTSTRAP_DVLOG(verbose_level, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - DVLOG_IS_ON(verbose_level)) -#define BOOTSTRAP_DVLOG_IF(verbose_level, condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_VLOG_STREAM(verbose_level, bootstrap_err), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define BOOTSTRAP_DCHECK(condition, bootstrap_err) \ - LAZY_STREAM(BOOTSTRAP_LOG_STREAM(FATAL, bootstrap_err), \ - DCHECK_IS_ON && !(condition)) \ - << "Check failed: " # condition << ". " - -#endif // MINI_CHROMIUM_BASE_MAC_MACH_LOGGING_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h deleted file mode 100644 index 7ea09219ff..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_cftyperef.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ - -#include <CoreFoundation/CoreFoundation.h> - -#include "base/mac/scoped_typeref.h" - -namespace base { - -namespace internal { - -template <typename CFT> -struct ScopedCFTypeRefTraits { - static CFT InvalidValue() { return nullptr; } - static CFT Retain(CFT object) { - CFRetain(object); - return object; - } - static void Release(CFT object) { CFRelease(object); } -}; - -} // namespace internal - -template <typename CFT> -using ScopedCFTypeRef = - ScopedTypeRef<CFT, internal::ScopedCFTypeRefTraits<CFT>>; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_CFTYPEREF_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h deleted file mode 100644 index e653110a96..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_ioobject.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_IOOBJECT_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_IOOBJECT_H_ - -#include <IOKit/IOKitLib.h> - -#include "base/mac/scoped_typeref.h" - -namespace base { -namespace mac { - -namespace internal { - -template <typename IOT> -struct ScopedIOObjectTraits { - static IOT InvalidValue() { return IO_OBJECT_NULL; } - static IOT Retain(IOT iot) { - IOObjectRetain(iot); - return iot; - } - static void Release(IOT iot) { IOObjectRelease(iot); } -}; - -} // namespce internal - -template <typename IOT> -using ScopedIOObject = ScopedTypeRef<IOT, internal::ScopedIOObjectTraits<IOT>>; - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_IOOBJECT_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h deleted file mode 100644 index 8f8e759fc2..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_launch_data.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_ - -#include <launch.h> - -#include "base/scoped_generic.h" - -namespace base { -namespace mac { - -namespace internal { - -struct ScopedLaunchDataTraits { - static launch_data_t InvalidValue() { return nullptr; } - - static void Free(launch_data_t ldt) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - launch_data_free(ldt); -#pragma clang diagnostic pop - } -}; - -} // namespace internal - -using ScopedLaunchData = - ScopedGeneric<launch_data_t, internal::ScopedLaunchDataTraits>; - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h deleted file mode 100644 index f7275edb68..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_port.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ - -#include <mach/mach.h> - -#include "base/scoped_generic.h" - -namespace base { -namespace mac { - -namespace internal { - -struct SendRightTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } - static void Free(mach_port_t port); -}; - -struct ReceiveRightTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } - static void Free(mach_port_t port); -}; - -struct PortSetTraits { - static mach_port_t InvalidValue() { - return MACH_PORT_NULL; - } - static void Free(mach_port_t port); -}; - -} // namespace internal - -using ScopedMachSendRight = - ScopedGeneric<mach_port_t, internal::SendRightTraits>; -using ScopedMachReceiveRight = - ScopedGeneric<mach_port_t, internal::ReceiveRightTraits>; -using ScopedMachPortSet = ScopedGeneric<mach_port_t, internal::PortSetTraits>; - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_PORT_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h deleted file mode 100644 index 89087c733e..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_mach_vm.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ - -#include <mach/mach.h> - -#include <algorithm> - -#include "base/logging.h" -#include "base/macros.h" - -// Use ScopedMachVM to supervise ownership of pages in the current process -// through the Mach VM subsystem. Pages allocated with vm_allocate can be -// released when exiting a scope with ScopedMachVM. -// -// The Mach VM subsystem operates on a page-by-page basis, and a single VM -// allocation managed by a ScopedMachVM object may span multiple pages. As far -// as Mach is concerned, allocated pages may be deallocated individually. This -// is in contrast to higher-level allocators such as malloc, where the base -// address of an allocation implies the size of an allocated block. -// Consequently, it is not sufficient to just pass the base address of an -// allocation to ScopedMachVM, it also needs to know the size of the -// allocation. To avoid any confusion, both the base address and size must -// be page-aligned. -// -// When dealing with Mach VM, base addresses will naturally be page-aligned, -// but user-specified sizes may not be. If there's a concern that a size is -// not page-aligned, use the mach_vm_round_page macro to correct it. -// -// Example: -// -// vm_address_t address = 0; -// vm_size_t size = 12345; // This requested size is not page-aligned. -// kern_return_t kr = -// vm_allocate(mach_task_self(), &address, size, VM_FLAGS_ANYWHERE); -// if (kr != KERN_SUCCESS) { -// return false; -// } -// ScopedMachVM vm_owner(address, mach_vm_round_page(size)); - -namespace base { -namespace mac { - -class ScopedMachVM { - public: - explicit ScopedMachVM(vm_address_t address = 0, vm_size_t size = 0) - : address_(address), - size_(size) { - DCHECK(address % PAGE_SIZE == 0); - DCHECK(size % PAGE_SIZE == 0); - } - - ~ScopedMachVM() { - if (size_) { - vm_deallocate(mach_task_self(), address_, size_); - } - } - - void reset(vm_address_t address = 0, vm_size_t size = 0); - - vm_address_t address() const { - return address_; - } - - vm_size_t size() const { - return size_; - } - - void swap(ScopedMachVM& that) { - std::swap(address_, that.address_); - std::swap(size_, that.size_); - } - - void release() { - address_ = 0; - size_ = 0; - } - - private: - vm_address_t address_; - vm_size_t size_; - - DISALLOW_COPY_AND_ASSIGN(ScopedMachVM); -}; - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_MACH_VM_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h deleted file mode 100644 index c8d9def5d5..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsautorelease_pool.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ - -#include "base/macros.h" - -#if defined(OS_MACOSX) -#if defined(__OBJC__) -@class NSAutoreleasePool; -#else // __OBJC__ -class NSAutoreleasePool; -#endif // __OBJC__ -#endif // OS_MACOSX - -namespace base { -namespace mac { - -// On the Mac, ScopedNSAutoreleasePool allocates an NSAutoreleasePool when -// instantiated and sends it a -drain message when destroyed. This allows an -// autorelease pool to be maintained in ordinary C++ code without bringing in -// any direct Objective-C dependency. -// -// On other platforms, ScopedNSAutoreleasePool is an empty object with no -// effects. This allows it to be used directly in cross-platform code without -// ugly #ifdefs. -class ScopedNSAutoreleasePool { - public: -#if !defined(OS_MACOSX) - ScopedNSAutoreleasePool() {} - void Recycle() { } -#else // OS_MACOSX - ScopedNSAutoreleasePool(); - ~ScopedNSAutoreleasePool(); - - // Clear out the pool in case its position on the stack causes it to be - // alive for long periods of time (such as the entire length of the app). - // Only use then when you're certain the items currently in the pool are - // no longer needed. - void Recycle(); - private: - NSAutoreleasePool* autorelease_pool_; -#endif // OS_MACOSX - - private: - DISALLOW_COPY_AND_ASSIGN(ScopedNSAutoreleasePool); -}; - -} // namespace mac -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_NSAUTORELEASE_POOL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h deleted file mode 100644 index 2e157a4a28..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_nsobject.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ - -#import <Foundation/Foundation.h> - -#include <type_traits> - -#include "base/compiler_specific.h" -#include "base/mac/scoped_typeref.h" - -namespace base { - -namespace internal { - -template <typename NST> -struct ScopedNSProtocolTraits { - static NST InvalidValue() { return nil; } - static NST Retain(NST nst) { return [nst retain]; } - static void Release(NST nst) { [nst release]; } -}; - -} // namespace internal - -template <typename NST> -class scoped_nsprotocol - : public ScopedTypeRef<NST, internal::ScopedNSProtocolTraits<NST>> { - public: - using ScopedTypeRef<NST, - internal::ScopedNSProtocolTraits<NST>>::ScopedTypeRef; - - NST autorelease() { return [this->release() autorelease]; } -}; - -template <class C> -void swap(scoped_nsprotocol<C>& p1, scoped_nsprotocol<C>& p2) { - p1.swap(p2); -} - -template <class C> -bool operator==(C p1, const scoped_nsprotocol<C>& p2) { - return p1 == p2.get(); -} - -template <class C> -bool operator!=(C p1, const scoped_nsprotocol<C>& p2) { - return p1 != p2.get(); -} - -template <typename NST> -class scoped_nsobject : public scoped_nsprotocol<NST*> { - public: - using scoped_nsprotocol<NST*>::scoped_nsprotocol; - - static_assert(std::is_same<NST, NSAutoreleasePool>::value == false, - "Use ScopedNSAutoreleasePool instead"); -}; - -template<> -class scoped_nsobject<id> : public scoped_nsprotocol<id> { - public: - using scoped_nsprotocol<id>::scoped_nsprotocol; -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_NSOBJECT_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h deleted file mode 100644 index 9f00b1a216..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/mac/scoped_typeref.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ -#define MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ - -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/memory/scoped_policy.h" - -namespace base { - -template <typename T> -struct ScopedTypeRefTraits; - -template <typename T, typename Traits = ScopedTypeRefTraits<T>> -class ScopedTypeRef { - public: - typedef T element_type; - - ScopedTypeRef( - T object = Traits::InvalidValue(), - base::scoped_policy::OwnershipPolicy policy = base::scoped_policy::ASSUME) - : object_(object) { - if (object_ && policy == base::scoped_policy::RETAIN) - object_ = Traits::Retain(object_); - } - - ScopedTypeRef(const ScopedTypeRef<T, Traits>& that) : object_(that.object_) { - if (object_) - object_ = Traits::Retain(object_); - } - - ~ScopedTypeRef() { - if (object_) - Traits::Release(object_); - } - - ScopedTypeRef& operator=(const ScopedTypeRef<T, Traits>& that) { - reset(that.get(), base::scoped_policy::RETAIN); - return *this; - } - - T* InitializeInto() WARN_UNUSED_RESULT { - DCHECK(!object_); - return &object_; - } - - void reset(T object = Traits::InvalidValue(), - base::scoped_policy::OwnershipPolicy policy = - base::scoped_policy::ASSUME) { - if (object && policy == base::scoped_policy::RETAIN) - object = Traits::Retain(object); - if (object_) - Traits::Release(object_); - object_ = object; - } - - bool operator==(T that) const { return object_ == that; } - - bool operator!=(T that) const { return object_ != that; } - - operator T() const { return object_; } - - T get() const { return object_; } - - void swap(ScopedTypeRef& that) { - T temp = that.object_; - that.object_ = object_; - object_ = temp; - } - - T release() WARN_UNUSED_RESULT { - T temp = object_; - object_ = Traits::InvalidValue(); - return temp; - } - - private: - T object_; -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_MAC_SCOPED_TYPEREF_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/macros.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/macros.h deleted file mode 100644 index 5d96783daa..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/macros.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MACROS_H_ -#define MINI_CHROMIUM_BASE_MACROS_H_ - -#include <string.h> -#include <sys/types.h> - -#include "base/compiler_specific.h" - -#if __cplusplus >= 201103L - -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&) = delete; \ - void operator=(const TypeName&) = delete - -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName() = delete; \ - DISALLOW_COPY_AND_ASSIGN(TypeName) - -#else - -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) - -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) - -#endif - -template<typename T, size_t N> -char (&ArraySizeHelper(T (&array)[N]))[N]; - -template <typename T, size_t N> -char (&ArraySizeHelper(const T (&array)[N]))[N]; - -#define arraysize(array) (sizeof(ArraySizeHelper(array))) - -template <typename Dest, typename Source> -inline Dest bit_cast(const Source& source) { - static_assert(sizeof(Dest) == sizeof(Source), "sizes must be equal"); - - Dest dest; - memcpy(&dest, &source, sizeof(dest)); - return dest; -} - -template<typename T> -inline void ignore_result(const T&) { -} - -#endif // MINI_CHROMIUM_BASE_MACROS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h deleted file mode 100644 index be59d91b4f..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions.h +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_H_ -#define MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_H_ - -#include <stddef.h> - -#include <limits> -#include <ostream> -#include <type_traits> - -#include "base/logging.h" -#include "base/numerics/safe_conversions_impl.h" - -namespace base { - -// The following are helper constexpr template functions and classes for safely -// performing a range of conversions, assignments, and tests: -// -// checked_cast<> - Analogous to static_cast<> for numeric types, except -// that it CHECKs that the specified numeric conversion will not overflow -// or underflow. NaN source will always trigger a CHECK. -// The default CHECK triggers a crash, but the handler can be overriden. -// saturated_cast<> - Analogous to static_cast<> for numeric types, except -// that it returns a saturated result when the specified numeric conversion -// would otherwise overflow or underflow. An NaN source returns 0 by -// default, but can be overridden to return a different result. -// strict_cast<> - Analogous to static_cast<> for numeric types, except that -// it will cause a compile failure if the destination type is not large -// enough to contain any value in the source type. It performs no runtime -// checking and thus introduces no runtime overhead. -// IsValueInRangeForNumericType<>() - A convenience function that returns true -// if the type supplied to the template parameter can represent the value -// passed as an argument to the function. -// IsValueNegative<>() - A convenience function that will accept any arithmetic -// type as an argument and will return whether the value is less than zero. -// Unsigned types always return false. -// StrictNumeric<> - A wrapper type that performs assignments and copies via -// the strict_cast<> template, and can perform valid arithmetic comparisons -// across any range of arithmetic types. StrictNumeric is the return type -// for values extracted from a CheckedNumeric class instance. The raw -// arithmetic value is extracted via static_cast to the underlying type. -// MakeStrictNum() - Creates a new StrictNumeric from the underlying type of -// the supplied arithmetic or StrictNumeric type. - -// Convenience function that returns true if the supplied value is in range -// for the destination type. -template <typename Dst, typename Src> -constexpr bool IsValueInRangeForNumericType(Src value) { - return internal::DstRangeRelationToSrcRange<Dst>(value) == - internal::RANGE_VALID; -} - -// Convenience function for determining if a numeric value is negative without -// throwing compiler warnings on: unsigned(value) < 0. -template <typename T, - typename std::enable_if<std::is_signed<T>::value>::type* = nullptr> -constexpr bool IsValueNegative(T value) { - static_assert(std::is_arithmetic<T>::value, "Argument must be numeric."); - return value < 0; -} - -template <typename T, - typename std::enable_if<!std::is_signed<T>::value>::type* = nullptr> -constexpr bool IsValueNegative(T) { - static_assert(std::is_arithmetic<T>::value, "Argument must be numeric."); - return false; -} - -// Forces a crash. Used for numeric boundary errors. -struct CheckOnFailure { - template <typename T> - static T HandleFailure() { - CHECK(false); - return T(); - } -}; - -// checked_cast<> is analogous to static_cast<> for numeric types, -// except that it CHECKs that the specified numeric conversion will not -// overflow or underflow. NaN source will always trigger a CHECK. -template <typename Dst, - class CheckHandler = CheckOnFailure, - typename Src> -constexpr Dst checked_cast(Src value) { - // This throws a compile-time error on evaluating the constexpr if it can be - // determined at compile-time as failing, otherwise it will CHECK at runtime. - using SrcType = typename internal::UnderlyingType<Src>::type; - return IsValueInRangeForNumericType<Dst, SrcType>(value) - ? static_cast<Dst>(static_cast<SrcType>(value)) - : CheckHandler::template HandleFailure<Dst>(); -} - -// HandleNaN will return 0 in this case. -struct SaturatedCastNaNBehaviorReturnZero { - template <typename T> - static constexpr T HandleFailure() { - return T(); - } -}; - -namespace internal { -// These wrappers are used for C++11 constexpr support by avoiding both the -// declaration of local variables and invalid evaluation resulting from the -// lack of "constexpr if" support in the saturated_cast template function. -// TODO(jschuh): Convert to single function with a switch once we support C++14. -template < - typename Dst, - class NaNHandler, - typename Src, - typename std::enable_if<std::is_integral<Dst>::value>::type* = nullptr> -constexpr Dst saturated_cast_impl(const Src value, - const RangeConstraint constraint) { - return constraint == RANGE_VALID - ? static_cast<Dst>(value) - : (constraint == RANGE_UNDERFLOW - ? std::numeric_limits<Dst>::lowest() - : (constraint == RANGE_OVERFLOW - ? std::numeric_limits<Dst>::max() - : NaNHandler::template HandleFailure<Dst>())); -} - -template <typename Dst, - class NaNHandler, - typename Src, - typename std::enable_if<std::is_floating_point<Dst>::value>::type* = - nullptr> -constexpr Dst saturated_cast_impl(const Src value, - const RangeConstraint constraint) { - return constraint == RANGE_VALID - ? static_cast<Dst>(value) - : (constraint == RANGE_UNDERFLOW - ? -std::numeric_limits<Dst>::infinity() - : (constraint == RANGE_OVERFLOW - ? std::numeric_limits<Dst>::infinity() - : std::numeric_limits<Dst>::quiet_NaN())); -} - -// saturated_cast<> is analogous to static_cast<> for numeric types, except -// that the specified numeric conversion will saturate rather than overflow or -// underflow. NaN assignment to an integral will defer the behavior to a -// specified class. By default, it will return 0. -template <typename Dst, - class NaNHandler = SaturatedCastNaNBehaviorReturnZero, - typename Src> -constexpr Dst saturated_cast(Src value) { - using SrcType = typename UnderlyingType<Src>::type; - return internal::saturated_cast_impl<Dst, NaNHandler>( - value, internal::DstRangeRelationToSrcRange<Dst, SrcType>(value)); -} - -// strict_cast<> is analogous to static_cast<> for numeric types, except that -// it will cause a compile failure if the destination type is not large enough -// to contain any value in the source type. It performs no runtime checking. -template <typename Dst, typename Src> -constexpr Dst strict_cast(Src value) { - using SrcType = typename UnderlyingType<Src>::type; - static_assert(UnderlyingType<Src>::is_numeric, "Argument must be numeric."); - static_assert(std::is_arithmetic<Dst>::value, "Result must be numeric."); - - // If you got here from a compiler error, it's because you tried to assign - // from a source type to a destination type that has insufficient range. - // The solution may be to change the destination type you're assigning to, - // and use one large enough to represent the source. - // Alternatively, you may be better served with the checked_cast<> or - // saturated_cast<> template functions for your particular use case. - static_assert(StaticDstRangeRelationToSrcRange<Dst, SrcType>::value == - NUMERIC_RANGE_CONTAINED, - "The source type is out of range for the destination type. " - "Please see strict_cast<> comments for more information."); - - return static_cast<Dst>(static_cast<SrcType>(value)); -} - -// Some wrappers to statically check that a type is in range. -template <typename Dst, typename Src, class Enable = void> -struct IsNumericRangeContained { - static const bool value = false; -}; - -template <typename Dst, typename Src> -struct IsNumericRangeContained< - Dst, - Src, - typename std::enable_if<ArithmeticOrUnderlyingEnum<Dst>::value && - ArithmeticOrUnderlyingEnum<Src>::value>::type> { - static const bool value = StaticDstRangeRelationToSrcRange<Dst, Src>::value == - NUMERIC_RANGE_CONTAINED; -}; - -// StrictNumeric implements compile time range checking between numeric types by -// wrapping assignment operations in a strict_cast. This class is intended to be -// used for function arguments and return types, to ensure the destination type -// can always contain the source type. This is essentially the same as enforcing -// -Wconversion in gcc and C4302 warnings on MSVC, but it can be applied -// incrementally at API boundaries, making it easier to convert code so that it -// compiles cleanly with truncation warnings enabled. -// This template should introduce no runtime overhead, but it also provides no -// runtime checking of any of the associated mathematical operations. Use -// CheckedNumeric for runtime range checks of the actual value being assigned. -template <typename T> -class StrictNumeric { - public: - using type = T; - - constexpr StrictNumeric() : value_(0) {} - - // Copy constructor. - template <typename Src> - constexpr StrictNumeric(const StrictNumeric<Src>& rhs) - : value_(strict_cast<T>(rhs.value_)) {} - - // This is not an explicit constructor because we implicitly upgrade regular - // numerics to StrictNumerics to make them easier to use. - template <typename Src> - constexpr StrictNumeric(Src value) // NOLINT(runtime/explicit) - : value_(strict_cast<T>(value)) {} - - // If you got here from a compiler error, it's because you tried to assign - // from a source type to a destination type that has insufficient range. - // The solution may be to change the destination type you're assigning to, - // and use one large enough to represent the source. - // If you're assigning from a CheckedNumeric<> class, you may be able to use - // the AssignIfValid() member function, specify a narrower destination type to - // the member value functions (e.g. val.template ValueOrDie<Dst>()), use one - // of the value helper functions (e.g. ValueOrDieForType<Dst>(val)). - // If you've encountered an _ambiguous overload_ you can use a static_cast<> - // to explicitly cast the result to the destination type. - // If none of that works, you may be better served with the checked_cast<> or - // saturated_cast<> template functions for your particular use case. - template <typename Dst, - typename std::enable_if< - IsNumericRangeContained<Dst, T>::value>::type* = nullptr> - constexpr operator Dst() const { - return static_cast<typename ArithmeticOrUnderlyingEnum<Dst>::type>(value_); - } - - private: - const T value_; -}; - -// Convience wrapper returns a StrictNumeric from the provided arithmetic type. -template <typename T> -constexpr StrictNumeric<typename UnderlyingType<T>::type> MakeStrictNum( - const T value) { - return value; -} - -// Overload the ostream output operator to make logging work nicely. -template <typename T> -std::ostream& operator<<(std::ostream& os, const StrictNumeric<T>& value) { - os << static_cast<T>(value); - return os; -} - -#define STRICT_COMPARISON_OP(NAME, OP) \ - template <typename L, typename R, \ - typename std::enable_if< \ - internal::IsStrictOp<L, R>::value>::type* = nullptr> \ - constexpr bool operator OP(const L lhs, const R rhs) { \ - return SafeCompare<NAME, typename UnderlyingType<L>::type, \ - typename UnderlyingType<R>::type>(lhs, rhs); \ - } - -STRICT_COMPARISON_OP(IsLess, <); -STRICT_COMPARISON_OP(IsLessOrEqual, <=); -STRICT_COMPARISON_OP(IsGreater, >); -STRICT_COMPARISON_OP(IsGreaterOrEqual, >=); -STRICT_COMPARISON_OP(IsEqual, ==); -STRICT_COMPARISON_OP(IsNotEqual, !=); - -#undef STRICT_COMPARISON_OP -}; - -using internal::strict_cast; -using internal::saturated_cast; -using internal::StrictNumeric; -using internal::MakeStrictNum; - -// Explicitly make a shorter size_t alias for convenience. -using SizeT = StrictNumeric<size_t>; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h deleted file mode 100644 index 230a655e74..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_conversions_impl.h +++ /dev/null @@ -1,616 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ -#define MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ - -#include <stdint.h> - -#include <limits> -#include <type_traits> - -namespace base { -namespace internal { - -// The std library doesn't provide a binary max_exponent for integers, however -// we can compute an analog using std::numeric_limits<>::digits. -template <typename NumericType> -struct MaxExponent { - static const int value = std::is_floating_point<NumericType>::value - ? std::numeric_limits<NumericType>::max_exponent - : std::numeric_limits<NumericType>::digits + 1; -}; - -// The number of bits (including the sign) in an integer. Eliminates sizeof -// hacks. -template <typename NumericType> -struct IntegerBitsPlusSign { - static const int value = std::numeric_limits<NumericType>::digits + - std::is_signed<NumericType>::value; -}; - -enum IntegerRepresentation { - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_SIGNED -}; - -// A range for a given nunmeric Src type is contained for a given numeric Dst -// type if both numeric_limits<Src>::max() <= numeric_limits<Dst>::max() and -// numeric_limits<Src>::lowest() >= numeric_limits<Dst>::lowest() are true. -// We implement this as template specializations rather than simple static -// comparisons to ensure type correctness in our comparisons. -enum NumericRangeRepresentation { - NUMERIC_RANGE_NOT_CONTAINED, - NUMERIC_RANGE_CONTAINED -}; - -// Helper templates to statically determine if our destination type can contain -// maximum and minimum values represented by the source type. - -template <typename Dst, - typename Src, - IntegerRepresentation DstSign = std::is_signed<Dst>::value - ? INTEGER_REPRESENTATION_SIGNED - : INTEGER_REPRESENTATION_UNSIGNED, - IntegerRepresentation SrcSign = std::is_signed<Src>::value - ? INTEGER_REPRESENTATION_SIGNED - : INTEGER_REPRESENTATION_UNSIGNED> -struct StaticDstRangeRelationToSrcRange; - -// Same sign: Dst is guaranteed to contain Src only if its range is equal or -// larger. -template <typename Dst, typename Src, IntegerRepresentation Sign> -struct StaticDstRangeRelationToSrcRange<Dst, Src, Sign, Sign> { - static const NumericRangeRepresentation value = - MaxExponent<Dst>::value >= MaxExponent<Src>::value - ? NUMERIC_RANGE_CONTAINED - : NUMERIC_RANGE_NOT_CONTAINED; -}; - -// Unsigned to signed: Dst is guaranteed to contain source only if its range is -// larger. -template <typename Dst, typename Src> -struct StaticDstRangeRelationToSrcRange<Dst, - Src, - INTEGER_REPRESENTATION_SIGNED, - INTEGER_REPRESENTATION_UNSIGNED> { - static const NumericRangeRepresentation value = - MaxExponent<Dst>::value > MaxExponent<Src>::value - ? NUMERIC_RANGE_CONTAINED - : NUMERIC_RANGE_NOT_CONTAINED; -}; - -// Signed to unsigned: Dst cannot be statically determined to contain Src. -template <typename Dst, typename Src> -struct StaticDstRangeRelationToSrcRange<Dst, - Src, - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_SIGNED> { - static const NumericRangeRepresentation value = NUMERIC_RANGE_NOT_CONTAINED; -}; - -enum RangeConstraint { - RANGE_VALID = 0x0, // Value can be represented by the destination type. - RANGE_UNDERFLOW = 0x1, // Value would overflow. - RANGE_OVERFLOW = 0x2, // Value would underflow. - RANGE_INVALID = RANGE_UNDERFLOW | RANGE_OVERFLOW // Invalid (i.e. NaN). -}; - -// Helper function for coercing an int back to a RangeContraint. -constexpr RangeConstraint GetRangeConstraint(int integer_range_constraint) { - // TODO(jschuh): Once we get full C++14 support we want this - // assert(integer_range_constraint >= RANGE_VALID && - // integer_range_constraint <= RANGE_INVALID) - return static_cast<RangeConstraint>(integer_range_constraint); -} - -// This function creates a RangeConstraint from an upper and lower bound -// check by taking advantage of the fact that only NaN can be out of range in -// both directions at once. -constexpr inline RangeConstraint GetRangeConstraint(bool is_in_upper_bound, - bool is_in_lower_bound) { - return GetRangeConstraint((is_in_upper_bound ? 0 : RANGE_OVERFLOW) | - (is_in_lower_bound ? 0 : RANGE_UNDERFLOW)); -} - -// The following helper template addresses a corner case in range checks for -// conversion from a floating-point type to an integral type of smaller range -// but larger precision (e.g. float -> unsigned). The problem is as follows: -// 1. Integral maximum is always one less than a power of two, so it must be -// truncated to fit the mantissa of the floating point. The direction of -// rounding is implementation defined, but by default it's always IEEE -// floats, which round to nearest and thus result in a value of larger -// magnitude than the integral value. -// Example: float f = UINT_MAX; // f is 4294967296f but UINT_MAX -// // is 4294967295u. -// 2. If the floating point value is equal to the promoted integral maximum -// value, a range check will erroneously pass. -// Example: (4294967296f <= 4294967295u) // This is true due to a precision -// // loss in rounding up to float. -// 3. When the floating point value is then converted to an integral, the -// resulting value is out of range for the target integral type and -// thus is implementation defined. -// Example: unsigned u = (float)INT_MAX; // u will typically overflow to 0. -// To fix this bug we manually truncate the maximum value when the destination -// type is an integral of larger precision than the source floating-point type, -// such that the resulting maximum is represented exactly as a floating point. -template <typename Dst, typename Src> -struct NarrowingRange { - using SrcLimits = typename std::numeric_limits<Src>; - using DstLimits = typename std::numeric_limits<Dst>; - // The following logic avoids warnings where the max function is - // instantiated with invalid values for a bit shift (even though - // such a function can never be called). - static const int shift = (MaxExponent<Src>::value > MaxExponent<Dst>::value && - SrcLimits::digits < DstLimits::digits && - SrcLimits::is_iec559 && - DstLimits::is_integer) - ? (DstLimits::digits - SrcLimits::digits) - : 0; - - static constexpr Dst max() { - // We use UINTMAX_C below to avoid compiler warnings about shifting floating - // points. Since it's a compile time calculation, it shouldn't have any - // performance impact. - return DstLimits::max() - static_cast<Dst>((UINTMAX_C(1) << shift) - 1); - } - - static constexpr Dst lowest() { return DstLimits::lowest(); } -}; - -template <typename Dst, - typename Src, - IntegerRepresentation DstSign = std::is_signed<Dst>::value - ? INTEGER_REPRESENTATION_SIGNED - : INTEGER_REPRESENTATION_UNSIGNED, - IntegerRepresentation SrcSign = std::is_signed<Src>::value - ? INTEGER_REPRESENTATION_SIGNED - : INTEGER_REPRESENTATION_UNSIGNED, - NumericRangeRepresentation DstRange = - StaticDstRangeRelationToSrcRange<Dst, Src>::value> -struct DstRangeRelationToSrcRangeImpl; - -// The following templates are for ranges that must be verified at runtime. We -// split it into checks based on signedness to avoid confusing casts and -// compiler warnings on signed an unsigned comparisons. - -// Dst range is statically determined to contain Src: Nothing to check. -template <typename Dst, - typename Src, - IntegerRepresentation DstSign, - IntegerRepresentation SrcSign> -struct DstRangeRelationToSrcRangeImpl<Dst, - Src, - DstSign, - SrcSign, - NUMERIC_RANGE_CONTAINED> { - static constexpr RangeConstraint Check(Src value) { return RANGE_VALID; } -}; - -// Signed to signed narrowing: Both the upper and lower boundaries may be -// exceeded. -template <typename Dst, typename Src> -struct DstRangeRelationToSrcRangeImpl<Dst, - Src, - INTEGER_REPRESENTATION_SIGNED, - INTEGER_REPRESENTATION_SIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { - static constexpr RangeConstraint Check(Src value) { - return GetRangeConstraint((value <= NarrowingRange<Dst, Src>::max()), - (value >= NarrowingRange<Dst, Src>::lowest())); - } -}; - -// Unsigned to unsigned narrowing: Only the upper boundary can be exceeded. -template <typename Dst, typename Src> -struct DstRangeRelationToSrcRangeImpl<Dst, - Src, - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_UNSIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { - static constexpr RangeConstraint Check(Src value) { - return GetRangeConstraint(value <= NarrowingRange<Dst, Src>::max(), true); - } -}; - -// Unsigned to signed: The upper boundary may be exceeded. -template <typename Dst, typename Src> -struct DstRangeRelationToSrcRangeImpl<Dst, - Src, - INTEGER_REPRESENTATION_SIGNED, - INTEGER_REPRESENTATION_UNSIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { - static constexpr RangeConstraint Check(Src value) { - return IntegerBitsPlusSign<Dst>::value > IntegerBitsPlusSign<Src>::value - ? RANGE_VALID - : GetRangeConstraint( - value <= static_cast<Src>(NarrowingRange<Dst, Src>::max()), - true); - } -}; - -// Signed to unsigned: The upper boundary may be exceeded for a narrower Dst, -// and any negative value exceeds the lower boundary. -template <typename Dst, typename Src> -struct DstRangeRelationToSrcRangeImpl<Dst, - Src, - INTEGER_REPRESENTATION_UNSIGNED, - INTEGER_REPRESENTATION_SIGNED, - NUMERIC_RANGE_NOT_CONTAINED> { - static constexpr RangeConstraint Check(Src value) { - return (MaxExponent<Dst>::value >= MaxExponent<Src>::value) - ? GetRangeConstraint(true, value >= static_cast<Src>(0)) - : GetRangeConstraint( - value <= static_cast<Src>(NarrowingRange<Dst, Src>::max()), - value >= static_cast<Src>(0)); - } -}; - -template <typename Dst, typename Src> -constexpr RangeConstraint DstRangeRelationToSrcRange(Src value) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); - static_assert(std::is_arithmetic<Dst>::value, "Result must be numeric."); - return DstRangeRelationToSrcRangeImpl<Dst, Src>::Check(value); -} - -// Integer promotion templates used by the portable checked integer arithmetic. -template <size_t Size, bool IsSigned> -struct IntegerForDigitsAndSign; - -#define INTEGER_FOR_DIGITS_AND_SIGN(I) \ - template <> \ - struct IntegerForDigitsAndSign<IntegerBitsPlusSign<I>::value, \ - std::is_signed<I>::value> { \ - using type = I; \ - } - -INTEGER_FOR_DIGITS_AND_SIGN(int8_t); -INTEGER_FOR_DIGITS_AND_SIGN(uint8_t); -INTEGER_FOR_DIGITS_AND_SIGN(int16_t); -INTEGER_FOR_DIGITS_AND_SIGN(uint16_t); -INTEGER_FOR_DIGITS_AND_SIGN(int32_t); -INTEGER_FOR_DIGITS_AND_SIGN(uint32_t); -INTEGER_FOR_DIGITS_AND_SIGN(int64_t); -INTEGER_FOR_DIGITS_AND_SIGN(uint64_t); -#undef INTEGER_FOR_DIGITS_AND_SIGN - -// WARNING: We have no IntegerForSizeAndSign<16, *>. If we ever add one to -// support 128-bit math, then the ArithmeticPromotion template below will need -// to be updated (or more likely replaced with a decltype expression). -static_assert(IntegerBitsPlusSign<intmax_t>::value == 64, - "Max integer size not supported for this toolchain."); - -template <typename Integer, bool IsSigned = std::is_signed<Integer>::value> -struct TwiceWiderInteger { - using type = - typename IntegerForDigitsAndSign<IntegerBitsPlusSign<Integer>::value * 2, - IsSigned>::type; -}; - -template <typename Integer> -struct PositionOfSignBit { - static const size_t value = IntegerBitsPlusSign<Integer>::value - 1; -}; - -enum ArithmeticPromotionCategory { - LEFT_PROMOTION, // Use the type of the left-hand argument. - RIGHT_PROMOTION // Use the type of the right-hand argument. -}; - -// Determines the type that can represent the largest positive value. -template <typename Lhs, - typename Rhs, - ArithmeticPromotionCategory Promotion = - (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value) - ? LEFT_PROMOTION - : RIGHT_PROMOTION> -struct MaxExponentPromotion; - -template <typename Lhs, typename Rhs> -struct MaxExponentPromotion<Lhs, Rhs, LEFT_PROMOTION> { - using type = Lhs; -}; - -template <typename Lhs, typename Rhs> -struct MaxExponentPromotion<Lhs, Rhs, RIGHT_PROMOTION> { - using type = Rhs; -}; - -// Determines the type that can represent the lowest arithmetic value. -template <typename Lhs, - typename Rhs, - ArithmeticPromotionCategory Promotion = - std::is_signed<Lhs>::value - ? (std::is_signed<Rhs>::value - ? (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value - ? LEFT_PROMOTION - : RIGHT_PROMOTION) - : LEFT_PROMOTION) - : (std::is_signed<Rhs>::value - ? RIGHT_PROMOTION - : (MaxExponent<Lhs>::value < MaxExponent<Rhs>::value - ? LEFT_PROMOTION - : RIGHT_PROMOTION))> -struct LowestValuePromotion; - -template <typename Lhs, typename Rhs> -struct LowestValuePromotion<Lhs, Rhs, LEFT_PROMOTION> { - using type = Lhs; -}; - -template <typename Lhs, typename Rhs> -struct LowestValuePromotion<Lhs, Rhs, RIGHT_PROMOTION> { - using type = Rhs; -}; - -// Determines the type that is best able to represent an arithmetic result. -template < - typename Lhs, - typename Rhs = Lhs, - bool is_intmax_type = - std::is_integral<typename MaxExponentPromotion<Lhs, Rhs>::type>::value&& - IntegerBitsPlusSign<typename MaxExponentPromotion<Lhs, Rhs>::type>:: - value == IntegerBitsPlusSign<intmax_t>::value, - bool is_max_exponent = - StaticDstRangeRelationToSrcRange< - typename MaxExponentPromotion<Lhs, Rhs>::type, - Lhs>::value == - NUMERIC_RANGE_CONTAINED&& StaticDstRangeRelationToSrcRange< - typename MaxExponentPromotion<Lhs, Rhs>::type, - Rhs>::value == NUMERIC_RANGE_CONTAINED> -struct BigEnoughPromotion; - -// The side with the max exponent is big enough. -template <typename Lhs, typename Rhs, bool is_intmax_type> -struct BigEnoughPromotion<Lhs, Rhs, is_intmax_type, true> { - using type = typename MaxExponentPromotion<Lhs, Rhs>::type; - static const bool is_contained = true; -}; - -// We can use a twice wider type to fit. -template <typename Lhs, typename Rhs> -struct BigEnoughPromotion<Lhs, Rhs, false, false> { - using type = - typename TwiceWiderInteger<typename MaxExponentPromotion<Lhs, Rhs>::type, - std::is_signed<Lhs>::value || - std::is_signed<Rhs>::value>::type; - static const bool is_contained = true; -}; - -// No type is large enough. -template <typename Lhs, typename Rhs> -struct BigEnoughPromotion<Lhs, Rhs, true, false> { - using type = typename MaxExponentPromotion<Lhs, Rhs>::type; - static const bool is_contained = false; -}; - -// We can statically check if operations on the provided types can wrap, so we -// can skip the checked operations if they're not needed. So, for an integer we -// care if the destination type preserves the sign and is twice the width of -// the source. -template <typename T, typename Lhs, typename Rhs> -struct IsIntegerArithmeticSafe { - static const bool value = - !std::is_floating_point<T>::value && - StaticDstRangeRelationToSrcRange<T, Lhs>::value == - NUMERIC_RANGE_CONTAINED && - IntegerBitsPlusSign<T>::value >= (2 * IntegerBitsPlusSign<Lhs>::value) && - StaticDstRangeRelationToSrcRange<T, Rhs>::value != - NUMERIC_RANGE_CONTAINED && - IntegerBitsPlusSign<T>::value >= (2 * IntegerBitsPlusSign<Rhs>::value); -}; - -// This hacks around libstdc++ 4.6 missing stuff in type_traits. -#if defined(__GLIBCXX__) -#define PRIV_GLIBCXX_4_7_0 20120322 -#define PRIV_GLIBCXX_4_5_4 20120702 -#define PRIV_GLIBCXX_4_6_4 20121127 -#if (__GLIBCXX__ < PRIV_GLIBCXX_4_7_0 || __GLIBCXX__ == PRIV_GLIBCXX_4_5_4 || \ - __GLIBCXX__ == PRIV_GLIBCXX_4_6_4) -#define PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX -#undef PRIV_GLIBCXX_4_7_0 -#undef PRIV_GLIBCXX_4_5_4 -#undef PRIV_GLIBCXX_4_6_4 -#endif -#endif - -// Extracts the underlying type from an enum. -template <typename T, bool is_enum = std::is_enum<T>::value> -struct ArithmeticOrUnderlyingEnum; - -template <typename T> -struct ArithmeticOrUnderlyingEnum<T, true> { -#if defined(PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX) - using type = __underlying_type(T); -#else - using type = typename std::underlying_type<T>::type; -#endif - static const bool value = std::is_arithmetic<type>::value; -}; - -#if defined(PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX) -#undef PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX -#endif - -template <typename T> -struct ArithmeticOrUnderlyingEnum<T, false> { - using type = T; - static const bool value = std::is_arithmetic<type>::value; -}; - -// The following are helper templates used in the CheckedNumeric class. -template <typename T> -class CheckedNumeric; - -template <typename T> -class StrictNumeric; - -// Used to treat CheckedNumeric and arithmetic underlying types the same. -template <typename T> -struct UnderlyingType { - using type = typename ArithmeticOrUnderlyingEnum<T>::type; - static const bool is_numeric = std::is_arithmetic<type>::value; - static const bool is_checked = false; - static const bool is_strict = false; -}; - -template <typename T> -struct UnderlyingType<CheckedNumeric<T>> { - using type = T; - static const bool is_numeric = true; - static const bool is_checked = true; - static const bool is_strict = false; -}; - -template <typename T> -struct UnderlyingType<StrictNumeric<T>> { - using type = T; - static const bool is_numeric = true; - static const bool is_checked = false; - static const bool is_strict = true; -}; - -template <typename L, typename R> -struct IsCheckedOp { - static const bool value = - UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && - (UnderlyingType<L>::is_checked || UnderlyingType<R>::is_checked); -}; - -template <typename L, typename R> -struct IsStrictOp { - static const bool value = - UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && - (UnderlyingType<L>::is_strict || UnderlyingType<R>::is_strict); -}; - -template <typename L, typename R> -constexpr bool IsLessImpl(const L lhs, - const R rhs, - const RangeConstraint l_range, - const RangeConstraint r_range) { - return l_range == RANGE_UNDERFLOW || r_range == RANGE_OVERFLOW || - (l_range == r_range && - static_cast<decltype(lhs + rhs)>(lhs) < - static_cast<decltype(lhs + rhs)>(rhs)); -} - -template <typename L, typename R> -struct IsLess { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return IsLessImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } -}; - -template <typename L, typename R> -constexpr bool IsLessOrEqualImpl(const L lhs, - const R rhs, - const RangeConstraint l_range, - const RangeConstraint r_range) { - return l_range == RANGE_UNDERFLOW || r_range == RANGE_OVERFLOW || - (l_range == r_range && - static_cast<decltype(lhs + rhs)>(lhs) <= - static_cast<decltype(lhs + rhs)>(rhs)); -} - -template <typename L, typename R> -struct IsLessOrEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return IsLessOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } -}; - -template <typename L, typename R> -constexpr bool IsGreaterImpl(const L lhs, - const R rhs, - const RangeConstraint l_range, - const RangeConstraint r_range) { - return l_range == RANGE_OVERFLOW || r_range == RANGE_UNDERFLOW || - (l_range == r_range && - static_cast<decltype(lhs + rhs)>(lhs) > - static_cast<decltype(lhs + rhs)>(rhs)); -} - -template <typename L, typename R> -struct IsGreater { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return IsGreaterImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } -}; - -template <typename L, typename R> -constexpr bool IsGreaterOrEqualImpl(const L lhs, - const R rhs, - const RangeConstraint l_range, - const RangeConstraint r_range) { - return l_range == RANGE_OVERFLOW || r_range == RANGE_UNDERFLOW || - (l_range == r_range && - static_cast<decltype(lhs + rhs)>(lhs) >= - static_cast<decltype(lhs + rhs)>(rhs)); -} - -template <typename L, typename R> -struct IsGreaterOrEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return IsGreaterOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange<R>(lhs), - DstRangeRelationToSrcRange<L>(rhs)); - } -}; - -template <typename L, typename R> -struct IsEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return DstRangeRelationToSrcRange<R>(lhs) == - DstRangeRelationToSrcRange<L>(rhs) && - static_cast<decltype(lhs + rhs)>(lhs) == - static_cast<decltype(lhs + rhs)>(rhs); - } -}; - -template <typename L, typename R> -struct IsNotEqual { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - static constexpr bool Test(const L lhs, const R rhs) { - return DstRangeRelationToSrcRange<R>(lhs) != - DstRangeRelationToSrcRange<L>(rhs) || - static_cast<decltype(lhs + rhs)>(lhs) != - static_cast<decltype(lhs + rhs)>(rhs); - } -}; - -// These perform the actual math operations on the CheckedNumerics. -// Binary arithmetic operations. -template <template <typename, typename> class C, typename L, typename R> -constexpr bool SafeCompare(const L lhs, const R rhs) { - static_assert(std::is_arithmetic<L>::value && std::is_arithmetic<R>::value, - "Types must be numeric."); - using Promotion = BigEnoughPromotion<L, R>; - using BigType = typename Promotion::type; - return Promotion::is_contained - // Force to a larger type for speed if both are contained. - ? C<BigType, BigType>::Test( - static_cast<BigType>(static_cast<L>(lhs)), - static_cast<BigType>(static_cast<R>(rhs))) - // Let the template functions figure it out for mixed types. - : C<L, R>::Test(lhs, rhs); -}; - -} // namespace internal -} // namespace base - -#endif // MINI_CHROMIUM_BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h deleted file mode 100644 index a81c8f3c4f..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math.h +++ /dev/null @@ -1,509 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_H_ -#define MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_H_ - -#include <stddef.h> - -#include <limits> -#include <type_traits> - -#include "base/numerics/safe_math_impl.h" - -namespace base { -namespace internal { - -// CheckedNumeric<> implements all the logic and operators for detecting integer -// boundary conditions such as overflow, underflow, and invalid conversions. -// The CheckedNumeric type implicitly converts from floating point and integer -// data types, and contains overloads for basic arithmetic operations (i.e.: +, -// -, *, / for all types and %, <<, >>, &, |, ^ for integers). Type promotions -// are a slightly modified version of the standard C arithmetic rules with the -// two differences being that there is no default promotion to int and bitwise -// logical operations always return an unsigned of the wider type. -// -// You may also use one of the variadic convenience functions, which accept -// standard arithmetic or CheckedNumeric types, perform arithmetic operations, -// and return a CheckedNumeric result. The supported functions are: -// CheckAdd() - Addition. -// CheckSub() - Subtraction. -// CheckMul() - Multiplication. -// CheckDiv() - Division. -// CheckMod() - Modulous (integer only). -// CheckLsh() - Left integer shift (integer only). -// CheckRsh() - Right integer shift (integer only). -// CheckAnd() - Bitwise AND (integer only with unsigned result). -// CheckOr() - Bitwise OR (integer only with unsigned result). -// CheckXor() - Bitwise XOR (integer only with unsigned result). -// CheckMax() - Maximum of supplied arguments. -// CheckMin() - Minimum of supplied arguments. -// -// The unary negation, increment, and decrement operators are supported, along -// with the following unary arithmetic methods, which return a new -// CheckedNumeric as a result of the operation: -// Abs() - Absolute value. -// UnsignedAbs() - Absolute value as an equal-width unsigned underlying type -// (valid for only integral types). -// Max() - Returns whichever is greater of the current instance or argument. -// The underlying return type is whichever has the greatest magnitude. -// Min() - Returns whichever is lowest of the current instance or argument. -// The underlying return type is whichever has can represent the lowest -// number in the smallest width (e.g. int8_t over unsigned, int over -// int8_t, and float over int). -// -// The following methods convert from CheckedNumeric to standard numeric values: -// AssignIfValid() - Assigns the underlying value to the supplied destination -// pointer if the value is currently valid and within the range -// supported by the destination type. Returns true on success. -// **************************************************************************** -// * WARNING: All of the following functions return a StrictNumeric, which * -// * is valid for comparison and assignment operations, but will trigger a * -// * compile failure on attempts to assign to a type of insufficient range. * -// **************************************************************************** -// IsValid() - Returns true if the underlying numeric value is valid (i.e. has -// has not wrapped and is not the result of an invalid conversion). -// ValueOrDie() - Returns the underlying value. If the state is not valid this -// call will crash on a CHECK. -// ValueOrDefault() - Returns the current value, or the supplied default if the -// state is not valid (will not trigger a CHECK). -// -// The following wrapper functions can be used to avoid the template -// disambiguator syntax when converting a destination type. -// IsValidForType<>() in place of: a.template IsValid<Dst>() -// ValueOrDieForType<>() in place of: a.template ValueOrDie() -// ValueOrDefaultForType<>() in place of: a.template ValueOrDefault(default) -// -// The following are general utility methods that are useful for converting -// between arithmetic types and CheckedNumeric types: -// CheckedNumeric::Cast<Dst>() - Instance method returning a CheckedNumeric -// derived from casting the current instance to a CheckedNumeric of -// the supplied destination type. -// MakeCheckedNum() - Creates a new CheckedNumeric from the underlying type of -// the supplied arithmetic, CheckedNumeric, or StrictNumeric type. -// -// Comparison operations are explicitly not supported because they could result -// in a crash on an unexpected CHECK condition. You should use patterns like the -// following for comparisons: -// CheckedNumeric<size_t> checked_size = untrusted_input_value; -// checked_size += HEADER LENGTH; -// if (checked_size.IsValid() && checked_size.ValueOrDie() < buffer_size) -// Do stuff... - -template <typename T> -class CheckedNumeric { - static_assert(std::is_arithmetic<T>::value, - "CheckedNumeric<T>: T must be a numeric type."); - - public: - using type = T; - - constexpr CheckedNumeric() {} - - // Copy constructor. - template <typename Src> - constexpr CheckedNumeric(const CheckedNumeric<Src>& rhs) - : state_(rhs.state_.value(), rhs.IsValid()) {} - - template <typename Src> - friend class CheckedNumeric; - - // This is not an explicit constructor because we implicitly upgrade regular - // numerics to CheckedNumerics to make them easier to use. - template <typename Src> - constexpr CheckedNumeric(Src value) // NOLINT(runtime/explicit) - : state_(value) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); - } - - // This is not an explicit constructor because we want a seamless conversion - // from StrictNumeric types. - template <typename Src> - constexpr CheckedNumeric( - StrictNumeric<Src> value) // NOLINT(runtime/explicit) - : state_(static_cast<Src>(value)) {} - - // IsValid() - The public API to test if a CheckedNumeric is currently valid. - // A range checked destination type can be supplied using the Dst template - // parameter. - template <typename Dst = T> - constexpr bool IsValid() const { - return state_.is_valid() && - IsValueInRangeForNumericType<Dst>(state_.value()); - } - - // AssignIfValid(Dst) - Assigns the underlying value if it is currently valid - // and is within the range supported by the destination type. Returns true if - // successful and false otherwise. - template <typename Dst> - constexpr bool AssignIfValid(Dst* result) const { - return IsValid<Dst>() ? ((*result = static_cast<Dst>(state_.value())), true) - : false; - } - - // ValueOrDie() - The primary accessor for the underlying value. If the - // current state is not valid it will CHECK and crash. - // A range checked destination type can be supplied using the Dst template - // parameter, which will trigger a CHECK if the value is not in bounds for - // the destination. - // The CHECK behavior can be overridden by supplying a handler as a - // template parameter, for test code, etc. However, the handler cannot access - // the underlying value, and it is not available through other means. - template <typename Dst = T, class CheckHandler = CheckOnFailure> - constexpr StrictNumeric<Dst> ValueOrDie() const { - return IsValid<Dst>() ? static_cast<Dst>(state_.value()) - : CheckHandler::template HandleFailure<Dst>(); - } - - // ValueOrDefault(T default_value) - A convenience method that returns the - // current value if the state is valid, and the supplied default_value for - // any other state. - // A range checked destination type can be supplied using the Dst template - // parameter. WARNING: This function may fail to compile or CHECK at runtime - // if the supplied default_value is not within range of the destination type. - template <typename Dst = T, typename Src> - constexpr StrictNumeric<Dst> ValueOrDefault(const Src default_value) const { - return IsValid<Dst>() ? static_cast<Dst>(state_.value()) - : checked_cast<Dst>(default_value); - } - - // Returns a checked numeric of the specified type, cast from the current - // CheckedNumeric. If the current state is invalid or the destination cannot - // represent the result then the returned CheckedNumeric will be invalid. - template <typename Dst> - constexpr CheckedNumeric<typename UnderlyingType<Dst>::type> Cast() const { - return *this; - } - - // This friend method is available solely for providing more detailed logging - // in the the tests. Do not implement it in production code, because the - // underlying values may change at any time. - template <typename U> - friend U GetNumericValueForTest(const CheckedNumeric<U>& src); - - // Prototypes for the supported arithmetic operator overloads. - template <typename Src> - CheckedNumeric& operator+=(const Src rhs); - template <typename Src> - CheckedNumeric& operator-=(const Src rhs); - template <typename Src> - CheckedNumeric& operator*=(const Src rhs); - template <typename Src> - CheckedNumeric& operator/=(const Src rhs); - template <typename Src> - CheckedNumeric& operator%=(const Src rhs); - template <typename Src> - CheckedNumeric& operator<<=(const Src rhs); - template <typename Src> - CheckedNumeric& operator>>=(const Src rhs); - template <typename Src> - CheckedNumeric& operator&=(const Src rhs); - template <typename Src> - CheckedNumeric& operator|=(const Src rhs); - template <typename Src> - CheckedNumeric& operator^=(const Src rhs); - - CheckedNumeric operator-() const { - // Negation is always valid for floating point. - T value = 0; - bool is_valid = (std::is_floating_point<T>::value || IsValid()) && - CheckedNeg(state_.value(), &value); - return CheckedNumeric<T>(value, is_valid); - } - - CheckedNumeric operator~() const { - static_assert(!std::is_signed<T>::value, "Type must be unsigned."); - T value = 0; - bool is_valid = IsValid() && CheckedInv(state_.value(), &value); - return CheckedNumeric<T>(value, is_valid); - } - - CheckedNumeric Abs() const { - // Absolute value is always valid for floating point. - T value = 0; - bool is_valid = (std::is_floating_point<T>::value || IsValid()) && - CheckedAbs(state_.value(), &value); - return CheckedNumeric<T>(value, is_valid); - } - - template <typename U> - constexpr CheckedNumeric<typename MathWrapper<CheckedMaxOp, T, U>::type> Max( - const U rhs) const { - using R = typename UnderlyingType<U>::type; - using result_type = typename MathWrapper<CheckedMaxOp, T, U>::type; - // TODO(jschuh): This can be converted to the MathOp version and remain - // constexpr once we have C++14 support. - return CheckedNumeric<result_type>( - static_cast<result_type>( - IsGreater<T, R>::Test(state_.value(), Wrapper<U>::value(rhs)) - ? state_.value() - : Wrapper<U>::value(rhs)), - state_.is_valid() && Wrapper<U>::is_valid(rhs)); - } - - template <typename U> - constexpr CheckedNumeric<typename MathWrapper<CheckedMinOp, T, U>::type> Min( - const U rhs) const { - using R = typename UnderlyingType<U>::type; - using result_type = typename MathWrapper<CheckedMinOp, T, U>::type; - // TODO(jschuh): This can be converted to the MathOp version and remain - // constexpr once we have C++14 support. - return CheckedNumeric<result_type>( - static_cast<result_type>( - IsLess<T, R>::Test(state_.value(), Wrapper<U>::value(rhs)) - ? state_.value() - : Wrapper<U>::value(rhs)), - state_.is_valid() && Wrapper<U>::is_valid(rhs)); - } - - // This function is available only for integral types. It returns an unsigned - // integer of the same width as the source type, containing the absolute value - // of the source, and properly handling signed min. - constexpr CheckedNumeric<typename UnsignedOrFloatForSize<T>::type> - UnsignedAbs() const { - return CheckedNumeric<typename UnsignedOrFloatForSize<T>::type>( - SafeUnsignedAbs(state_.value()), state_.is_valid()); - } - - CheckedNumeric& operator++() { - *this += 1; - return *this; - } - - CheckedNumeric operator++(int) { - CheckedNumeric value = *this; - *this += 1; - return value; - } - - CheckedNumeric& operator--() { - *this -= 1; - return *this; - } - - CheckedNumeric operator--(int) { - CheckedNumeric value = *this; - *this -= 1; - return value; - } - - // These perform the actual math operations on the CheckedNumerics. - // Binary arithmetic operations. - template <template <typename, typename, typename> class M, - typename L, - typename R> - static CheckedNumeric MathOp(const L lhs, const R rhs) { - using Math = typename MathWrapper<M, L, R>::math; - T result = 0; - bool is_valid = - Wrapper<L>::is_valid(lhs) && Wrapper<R>::is_valid(rhs) && - Math::Do(Wrapper<L>::value(lhs), Wrapper<R>::value(rhs), &result); - return CheckedNumeric<T>(result, is_valid); - }; - - // Assignment arithmetic operations. - template <template <typename, typename, typename> class M, typename R> - CheckedNumeric& MathOp(const R rhs) { - using Math = typename MathWrapper<M, T, R>::math; - T result = 0; // Using T as the destination saves a range check. - bool is_valid = state_.is_valid() && Wrapper<R>::is_valid(rhs) && - Math::Do(state_.value(), Wrapper<R>::value(rhs), &result); - *this = CheckedNumeric<T>(result, is_valid); - return *this; - }; - - private: - CheckedNumericState<T> state_; - - template <typename Src> - constexpr CheckedNumeric(Src value, bool is_valid) - : state_(value, is_valid) {} - - // These wrappers allow us to handle state the same way for both - // CheckedNumeric and POD arithmetic types. - template <typename Src> - struct Wrapper { - static constexpr bool is_valid(Src) { return true; } - static constexpr Src value(Src value) { return value; } - }; - - template <typename Src> - struct Wrapper<CheckedNumeric<Src>> { - static constexpr bool is_valid(const CheckedNumeric<Src> v) { - return v.IsValid(); - } - static constexpr Src value(const CheckedNumeric<Src> v) { - return v.state_.value(); - } - }; - - template <typename Src> - struct Wrapper<StrictNumeric<Src>> { - static constexpr bool is_valid(const StrictNumeric<Src>) { return true; } - static constexpr Src value(const StrictNumeric<Src> v) { - return static_cast<Src>(v); - } - }; -}; - -// Convenience functions to avoid the ugly template disambiguator syntax. -template <typename Dst, typename Src> -constexpr bool IsValidForType(const CheckedNumeric<Src> value) { - return value.template IsValid<Dst>(); -} - -template <typename Dst, typename Src> -constexpr StrictNumeric<Dst> ValueOrDieForType( - const CheckedNumeric<Src> value) { - return value.template ValueOrDie<Dst>(); -} - -template <typename Dst, typename Src, typename Default> -constexpr StrictNumeric<Dst> ValueOrDefaultForType( - const CheckedNumeric<Src> value, - const Default default_value) { - return value.template ValueOrDefault<Dst>(default_value); -} - -// These variadic templates work out the return types. -// TODO(jschuh): Rip all this out once we have C++14 non-trailing auto support. -template <template <typename, typename, typename> class M, - typename L, - typename R, - typename... Args> -struct ResultType; - -template <template <typename, typename, typename> class M, - typename L, - typename R> -struct ResultType<M, L, R> { - using type = typename MathWrapper<M, L, R>::type; -}; - -template <template <typename, typename, typename> class M, - typename L, - typename R, - typename... Args> -struct ResultType { - using type = - typename ResultType<M, typename ResultType<M, L, R>::type, Args...>::type; -}; - -// Convience wrapper to return a new CheckedNumeric from the provided arithmetic -// or CheckedNumericType. -template <typename T> -constexpr CheckedNumeric<typename UnderlyingType<T>::type> MakeCheckedNum( - const T value) { - return value; -} - -// These implement the variadic wrapper for the math operations. -template <template <typename, typename, typename> class M, - typename L, - typename R> -CheckedNumeric<typename MathWrapper<M, L, R>::type> ChkMathOp(const L lhs, - const R rhs) { - using Math = typename MathWrapper<M, L, R>::math; - return CheckedNumeric<typename Math::result_type>::template MathOp<M>(lhs, - rhs); -} - -// General purpose wrapper template for arithmetic operations. -template <template <typename, typename, typename> class M, - typename L, - typename R, - typename... Args> -CheckedNumeric<typename ResultType<M, L, R, Args...>::type> -ChkMathOp(const L lhs, const R rhs, const Args... args) { - auto tmp = ChkMathOp<M>(lhs, rhs); - return tmp.IsValid() ? ChkMathOp<M>(tmp, args...) - : decltype(ChkMathOp<M>(tmp, args...))(tmp); -}; - -// The following macros are just boilerplate for the standard arithmetic -// operator overloads and variadic function templates. A macro isn't the nicest -// solution, but it beats rewriting these over and over again. -#define BASE_NUMERIC_ARITHMETIC_VARIADIC(NAME) \ - template <typename L, typename R, typename... Args> \ - CheckedNumeric<typename ResultType<Checked##NAME##Op, L, R, Args...>::type> \ - Check##NAME(const L lhs, const R rhs, const Args... args) { \ - return ChkMathOp<Checked##NAME##Op, L, R, Args...>(lhs, rhs, args...); \ - } - -#define BASE_NUMERIC_ARITHMETIC_OPERATORS(NAME, OP, COMPOUND_OP) \ - /* Binary arithmetic operator for all CheckedNumeric operations. */ \ - template <typename L, typename R, \ - typename std::enable_if<IsCheckedOp<L, R>::value>::type* = \ - nullptr> \ - CheckedNumeric<typename MathWrapper<Checked##NAME##Op, L, R>::type> \ - operator OP(const L lhs, const R rhs) { \ - return decltype(lhs OP rhs)::template MathOp<Checked##NAME##Op>(lhs, rhs); \ - } \ - /* Assignment arithmetic operator implementation from CheckedNumeric. */ \ - template <typename L> \ - template <typename R> \ - CheckedNumeric<L>& CheckedNumeric<L>::operator COMPOUND_OP(const R rhs) { \ - return MathOp<Checked##NAME##Op>(rhs); \ - } \ - /* Variadic arithmetic functions that return CheckedNumeric. */ \ - BASE_NUMERIC_ARITHMETIC_VARIADIC(NAME) - -BASE_NUMERIC_ARITHMETIC_OPERATORS(Add, +, +=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Sub, -, -=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Mul, *, *=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Div, /, /=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Mod, %, %=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Lsh, <<, <<=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Rsh, >>, >>=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(And, &, &=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Or, |, |=) -BASE_NUMERIC_ARITHMETIC_OPERATORS(Xor, ^, ^=) -BASE_NUMERIC_ARITHMETIC_VARIADIC(Max) -BASE_NUMERIC_ARITHMETIC_VARIADIC(Min) - -#undef BASE_NUMERIC_ARITHMETIC_VARIADIC -#undef BASE_NUMERIC_ARITHMETIC_OPERATORS - -// These are some extra StrictNumeric operators to support simple pointer -// arithmetic with our result types. Since wrapping on a pointer is always -// bad, we trigger the CHECK condition here. -template <typename L, typename R> -L* operator+(L* lhs, const StrictNumeric<R> rhs) { - uintptr_t result = CheckAdd(reinterpret_cast<uintptr_t>(lhs), - CheckMul(sizeof(L), static_cast<R>(rhs))) - .template ValueOrDie<uintptr_t>(); - return reinterpret_cast<L*>(result); -} - -template <typename L, typename R> -L* operator-(L* lhs, const StrictNumeric<R> rhs) { - uintptr_t result = CheckSub(reinterpret_cast<uintptr_t>(lhs), - CheckMul(sizeof(L), static_cast<R>(rhs))) - .template ValueOrDie<uintptr_t>(); - return reinterpret_cast<L*>(result); -} - -} // namespace internal - -using internal::CheckedNumeric; -using internal::IsValidForType; -using internal::ValueOrDieForType; -using internal::ValueOrDefaultForType; -using internal::MakeCheckedNum; -using internal::CheckMax; -using internal::CheckMin; -using internal::CheckAdd; -using internal::CheckSub; -using internal::CheckMul; -using internal::CheckDiv; -using internal::CheckMod; -using internal::CheckLsh; -using internal::CheckRsh; -using internal::CheckAnd; -using internal::CheckOr; -using internal::CheckXor; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_impl.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_impl.h deleted file mode 100644 index 76f581a371..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/numerics/safe_math_impl.h +++ /dev/null @@ -1,739 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_IMPL_H_ -#define MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_IMPL_H_ - -#include <stddef.h> -#include <stdint.h> - -#include <climits> -#include <cmath> -#include <cstdlib> -#include <limits> -#include <type_traits> - -#include "base/numerics/safe_conversions.h" - -namespace base { -namespace internal { - -// Everything from here up to the floating point operations is portable C++, -// but it may not be fast. This code could be split based on -// platform/architecture and replaced with potentially faster implementations. - -// This is used for UnsignedAbs, where we need to support floating-point -// template instantiations even though we don't actually support the operations. -// However, there is no corresponding implementation of e.g. SafeUnsignedAbs, -// so the float versions will not compile. -template <typename Numeric, - bool IsInteger = std::is_integral<Numeric>::value, - bool IsFloat = std::is_floating_point<Numeric>::value> -struct UnsignedOrFloatForSize; - -template <typename Numeric> -struct UnsignedOrFloatForSize<Numeric, true, false> { - using type = typename std::make_unsigned<Numeric>::type; -}; - -template <typename Numeric> -struct UnsignedOrFloatForSize<Numeric, false, true> { - using type = Numeric; -}; - -// Helper templates for integer manipulations. - -template <typename T> -constexpr bool HasSignBit(T x) { - // Cast to unsigned since right shift on signed is undefined. - return !!(static_cast<typename std::make_unsigned<T>::type>(x) >> - PositionOfSignBit<T>::value); -} - -// This wrapper undoes the standard integer promotions. -template <typename T> -constexpr T BinaryComplement(T x) { - return static_cast<T>(~x); -} - -// Probe for builtin math overflow support on Clang and version check on GCC. -#if defined(__has_builtin) -#define USE_OVERFLOW_BUILTINS (__has_builtin(__builtin_add_overflow)) -#elif defined(__GNUC__) -#define USE_OVERFLOW_BUILTINS (__GNUC__ >= 5) -#else -#define USE_OVERFLOW_BUILTINS (0) -#endif - -template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> -bool CheckedAddImpl(T x, T y, T* result) { - // Since the value of x+y is undefined if we have a signed type, we compute - // it using the unsigned type of the same size. - using UnsignedDst = typename std::make_unsigned<T>::type; - UnsignedDst ux = static_cast<UnsignedDst>(x); - UnsignedDst uy = static_cast<UnsignedDst>(y); - UnsignedDst uresult = static_cast<UnsignedDst>(ux + uy); - *result = static_cast<T>(uresult); - // Addition is valid if the sign of (x + y) is equal to either that of x or - // that of y. - return (std::is_signed<T>::value) - ? HasSignBit(BinaryComplement( - static_cast<UnsignedDst>((uresult ^ ux) & (uresult ^ uy)))) - : (BinaryComplement(x) >= - y); // Unsigned is either valid or underflow. -} - -template <typename T, typename U, class Enable = void> -struct CheckedAddOp {}; - -template <typename T, typename U> -struct CheckedAddOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V> - static bool Do(T x, U y, V* result) { -#if USE_OVERFLOW_BUILTINS - return !__builtin_add_overflow(x, y, result); -#else - using Promotion = typename BigEnoughPromotion<T, U>::type; - Promotion presult; - // Fail if either operand is out of range for the promoted type. - // TODO(jschuh): This could be made to work for a broader range of values. - bool is_valid = IsValueInRangeForNumericType<Promotion>(x) && - IsValueInRangeForNumericType<Promotion>(y); - - if (IsIntegerArithmeticSafe<Promotion, T, U>::value) { - presult = static_cast<Promotion>(x) + static_cast<Promotion>(y); - } else { - is_valid &= CheckedAddImpl(static_cast<Promotion>(x), - static_cast<Promotion>(y), &presult); - } - *result = static_cast<V>(presult); - return is_valid && IsValueInRangeForNumericType<V>(presult); -#endif - } -}; - -template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> -bool CheckedSubImpl(T x, T y, T* result) { - // Since the value of x+y is undefined if we have a signed type, we compute - // it using the unsigned type of the same size. - using UnsignedDst = typename std::make_unsigned<T>::type; - UnsignedDst ux = static_cast<UnsignedDst>(x); - UnsignedDst uy = static_cast<UnsignedDst>(y); - UnsignedDst uresult = static_cast<UnsignedDst>(ux - uy); - *result = static_cast<T>(uresult); - // Subtraction is valid if either x and y have same sign, or (x-y) and x have - // the same sign. - return (std::is_signed<T>::value) - ? HasSignBit(BinaryComplement( - static_cast<UnsignedDst>((uresult ^ ux) & (ux ^ uy)))) - : (x >= y); -} - -template <typename T, typename U, class Enable = void> -struct CheckedSubOp {}; - -template <typename T, typename U> -struct CheckedSubOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V> - static bool Do(T x, U y, V* result) { -#if USE_OVERFLOW_BUILTINS - return !__builtin_sub_overflow(x, y, result); -#else - using Promotion = typename BigEnoughPromotion<T, U>::type; - Promotion presult; - // Fail if either operand is out of range for the promoted type. - // TODO(jschuh): This could be made to work for a broader range of values. - bool is_valid = IsValueInRangeForNumericType<Promotion>(x) && - IsValueInRangeForNumericType<Promotion>(y); - - if (IsIntegerArithmeticSafe<Promotion, T, U>::value) { - presult = static_cast<Promotion>(x) - static_cast<Promotion>(y); - } else { - is_valid &= CheckedSubImpl(static_cast<Promotion>(x), - static_cast<Promotion>(y), &presult); - } - *result = static_cast<V>(presult); - return is_valid && IsValueInRangeForNumericType<V>(presult); -#endif - } -}; - -// Integer multiplication is a bit complicated. In the fast case we just -// we just promote to a twice wider type, and range check the result. In the -// slow case we need to manually check that the result won't be truncated by -// checking with division against the appropriate bound. -template <typename T, - typename std::enable_if< - std::is_integral<T>::value && - ((IntegerBitsPlusSign<T>::value * 2) <= - IntegerBitsPlusSign<intmax_t>::value)>::type* = nullptr> -bool CheckedMulImpl(T x, T y, T* result) { - using IntermediateType = typename TwiceWiderInteger<T>::type; - IntermediateType tmp = - static_cast<IntermediateType>(x) * static_cast<IntermediateType>(y); - *result = static_cast<T>(tmp); - return DstRangeRelationToSrcRange<T>(tmp) == RANGE_VALID; -} - -template <typename T, - typename std::enable_if< - std::is_integral<T>::value && std::is_signed<T>::value && - ((IntegerBitsPlusSign<T>::value * 2) > - IntegerBitsPlusSign<intmax_t>::value)>::type* = nullptr> -bool CheckedMulImpl(T x, T y, T* result) { - if (x && y) { - if (x > 0) { - if (y > 0) { - if (x > std::numeric_limits<T>::max() / y) - return false; - } else { - if (y < std::numeric_limits<T>::lowest() / x) - return false; - } - } else { - if (y > 0) { - if (x < std::numeric_limits<T>::lowest() / y) - return false; - } else { - if (y < std::numeric_limits<T>::max() / x) - return false; - } - } - } - *result = x * y; - return true; -} - -template <typename T, - typename std::enable_if< - std::is_integral<T>::value && !std::is_signed<T>::value && - ((IntegerBitsPlusSign<T>::value * 2) > - IntegerBitsPlusSign<uintmax_t>::value)>::type* = nullptr> -bool CheckedMulImpl(T x, T y, T* result) { - *result = x * y; - return (y == 0 || x <= std::numeric_limits<T>::max() / y); -} - -template <typename T, typename U, class Enable = void> -struct CheckedMulOp {}; - -template <typename T, typename U> -struct CheckedMulOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V> - static bool Do(T x, U y, V* result) { -#if USE_OVERFLOW_BUILTINS -#if defined(__clang__) - // TODO(jschuh): Get the Clang runtime library issues sorted out so we can - // support full-width, mixed-sign multiply builtins. - // https://crbug.com/613003 - static const bool kUseMaxInt = - // Narrower type than uintptr_t is always safe. - std::numeric_limits<__typeof__(x * y)>::digits < - std::numeric_limits<intptr_t>::digits || - // Safe for intptr_t and uintptr_t if the sign matches. - (IntegerBitsPlusSign<__typeof__(x * y)>::value == - IntegerBitsPlusSign<intptr_t>::value && - std::is_signed<T>::value == std::is_signed<U>::value); -#else - static const bool kUseMaxInt = true; -#endif - if (kUseMaxInt) - return !__builtin_mul_overflow(x, y, result); -#endif - using Promotion = typename BigEnoughPromotion<T, U>::type; - Promotion presult; - // Fail if either operand is out of range for the promoted type. - // TODO(jschuh): This could be made to work for a broader range of values. - bool is_valid = IsValueInRangeForNumericType<Promotion>(x) && - IsValueInRangeForNumericType<Promotion>(y); - - if (IsIntegerArithmeticSafe<Promotion, T, U>::value) { - presult = static_cast<Promotion>(x) * static_cast<Promotion>(y); - } else { - is_valid &= CheckedMulImpl(static_cast<Promotion>(x), - static_cast<Promotion>(y), &presult); - } - *result = static_cast<V>(presult); - return is_valid && IsValueInRangeForNumericType<V>(presult); - } -}; - -// Avoid poluting the namespace once we're done with the macro. -#undef USE_OVERFLOW_BUILTINS - -// Division just requires a check for a zero denominator or an invalid negation -// on signed min/-1. -template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> -bool CheckedDivImpl(T x, T y, T* result) { - if (y && (!std::is_signed<T>::value || - x != std::numeric_limits<T>::lowest() || y != static_cast<T>(-1))) { - *result = x / y; - return true; - } - return false; -} - -template <typename T, typename U, class Enable = void> -struct CheckedDivOp {}; - -template <typename T, typename U> -struct CheckedDivOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V> - static bool Do(T x, U y, V* result) { - using Promotion = typename BigEnoughPromotion<T, U>::type; - Promotion presult; - // Fail if either operand is out of range for the promoted type. - // TODO(jschuh): This could be made to work for a broader range of values. - bool is_valid = IsValueInRangeForNumericType<Promotion>(x) && - IsValueInRangeForNumericType<Promotion>(y); - is_valid &= CheckedDivImpl(static_cast<Promotion>(x), - static_cast<Promotion>(y), &presult); - *result = static_cast<V>(presult); - return is_valid && IsValueInRangeForNumericType<V>(presult); - } -}; - -template <typename T, - typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> -bool CheckedModImpl(T x, T y, T* result) { - if (y > 0) { - *result = static_cast<T>(x % y); - return true; - } - return false; -} - -template <typename T, typename U, class Enable = void> -struct CheckedModOp {}; - -template <typename T, typename U> -struct CheckedModOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V> - static bool Do(T x, U y, V* result) { - using Promotion = typename BigEnoughPromotion<T, U>::type; - Promotion presult; - bool is_valid = CheckedModImpl(static_cast<Promotion>(x), - static_cast<Promotion>(y), &presult); - *result = static_cast<V>(presult); - return is_valid && IsValueInRangeForNumericType<V>(presult); - } -}; - -template <typename T, typename U, class Enable = void> -struct CheckedLshOp {}; - -// Left shift. Shifts less than 0 or greater than or equal to the number -// of bits in the promoted type are undefined. Shifts of negative values -// are undefined. Otherwise it is defined when the result fits. -template <typename T, typename U> -struct CheckedLshOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = T; - template <typename V> - static bool Do(T x, U shift, V* result) { - using ShiftType = typename std::make_unsigned<T>::type; - static const ShiftType kBitWidth = IntegerBitsPlusSign<T>::value; - const ShiftType real_shift = static_cast<ShiftType>(shift); - // Signed shift is not legal on negative values. - if (!IsValueNegative(x) && real_shift < kBitWidth) { - // Just use a multiplication because it's easy. - // TODO(jschuh): This could probably be made more efficient. - if (!std::is_signed<T>::value || real_shift != kBitWidth - 1) - return CheckedMulOp<T, T>::Do(x, static_cast<T>(1) << shift, result); - return !x; // Special case zero for a full width signed shift. - } - return false; - } -}; - -template <typename T, typename U, class Enable = void> -struct CheckedRshOp {}; - -// Right shift. Shifts less than 0 or greater than or equal to the number -// of bits in the promoted type are undefined. Otherwise, it is always defined, -// but a right shift of a negative value is implementation-dependent. -template <typename T, typename U> -struct CheckedRshOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = T; - template <typename V = result_type> - static bool Do(T x, U shift, V* result) { - // Use the type conversion push negative values out of range. - using ShiftType = typename std::make_unsigned<T>::type; - if (static_cast<ShiftType>(shift) < IntegerBitsPlusSign<T>::value) { - T tmp = x >> shift; - *result = static_cast<V>(tmp); - return IsValueInRangeForNumericType<V>(tmp); - } - return false; - } -}; - -template <typename T, typename U, class Enable = void> -struct CheckedAndOp {}; - -// For simplicity we support only unsigned integer results. -template <typename T, typename U> -struct CheckedAndOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename std::make_unsigned< - typename MaxExponentPromotion<T, U>::type>::type; - template <typename V = result_type> - static bool Do(T x, U y, V* result) { - result_type tmp = static_cast<result_type>(x) & static_cast<result_type>(y); - *result = static_cast<V>(tmp); - return IsValueInRangeForNumericType<V>(tmp); - } -}; - -template <typename T, typename U, class Enable = void> -struct CheckedOrOp {}; - -// For simplicity we support only unsigned integers. -template <typename T, typename U> -struct CheckedOrOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename std::make_unsigned< - typename MaxExponentPromotion<T, U>::type>::type; - template <typename V = result_type> - static bool Do(T x, U y, V* result) { - result_type tmp = static_cast<result_type>(x) | static_cast<result_type>(y); - *result = static_cast<V>(tmp); - return IsValueInRangeForNumericType<V>(tmp); - } -}; - -template <typename T, typename U, class Enable = void> -struct CheckedXorOp {}; - -// For simplicity we support only unsigned integers. -template <typename T, typename U> -struct CheckedXorOp<T, - U, - typename std::enable_if<std::is_integral<T>::value && - std::is_integral<U>::value>::type> { - using result_type = typename std::make_unsigned< - typename MaxExponentPromotion<T, U>::type>::type; - template <typename V = result_type> - static bool Do(T x, U y, V* result) { - result_type tmp = static_cast<result_type>(x) ^ static_cast<result_type>(y); - *result = static_cast<V>(tmp); - return IsValueInRangeForNumericType<V>(tmp); - } -}; - -// Max doesn't really need to be implemented this way because it can't fail, -// but it makes the code much cleaner to use the MathOp wrappers. -template <typename T, typename U, class Enable = void> -struct CheckedMaxOp {}; - -template <typename T, typename U> -struct CheckedMaxOp< - T, - U, - typename std::enable_if<std::is_arithmetic<T>::value && - std::is_arithmetic<U>::value>::type> { - using result_type = typename MaxExponentPromotion<T, U>::type; - template <typename V = result_type> - static bool Do(T x, U y, V* result) { - *result = IsGreater<T, U>::Test(x, y) ? static_cast<result_type>(x) - : static_cast<result_type>(y); - return true; - } -}; - -// Min doesn't really need to be implemented this way because it can't fail, -// but it makes the code much cleaner to use the MathOp wrappers. -template <typename T, typename U, class Enable = void> -struct CheckedMinOp {}; - -template <typename T, typename U> -struct CheckedMinOp< - T, - U, - typename std::enable_if<std::is_arithmetic<T>::value && - std::is_arithmetic<U>::value>::type> { - using result_type = typename LowestValuePromotion<T, U>::type; - template <typename V = result_type> - static bool Do(T x, U y, V* result) { - *result = IsLess<T, U>::Test(x, y) ? static_cast<result_type>(x) - : static_cast<result_type>(y); - return true; - } -}; - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - std::is_signed<T>::value>::type* = nullptr> -bool CheckedNeg(T value, T* result) { - // The negation of signed min is min, so catch that one. - if (value != std::numeric_limits<T>::lowest()) { - *result = static_cast<T>(-value); - return true; - } - return false; -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - !std::is_signed<T>::value>::type* = nullptr> -bool CheckedNeg(T value, T* result) { - if (!value) { - *result = static_cast<T>(0); - return true; - } - return false; -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - !std::is_signed<T>::value>::type* = nullptr> -bool CheckedInv(T value, T* result) { - *result = ~value; - return true; -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - std::is_signed<T>::value>::type* = nullptr> -bool CheckedAbs(T value, T* result) { - if (value != std::numeric_limits<T>::lowest()) { - *result = std::abs(value); - return true; - } - return false; -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - !std::is_signed<T>::value>::type* = nullptr> -bool CheckedAbs(T value, T* result) { - // T is unsigned, so |value| must already be positive. - *result = value; - return true; -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - std::is_signed<T>::value>::type* = nullptr> -constexpr typename std::make_unsigned<T>::type SafeUnsignedAbs(T value) { - using UnsignedT = typename std::make_unsigned<T>::type; - return value == std::numeric_limits<T>::lowest() - ? static_cast<UnsignedT>(std::numeric_limits<T>::max()) + 1 - : static_cast<UnsignedT>(std::abs(value)); -} - -template <typename T, - typename std::enable_if<std::is_integral<T>::value && - !std::is_signed<T>::value>::type* = nullptr> -constexpr T SafeUnsignedAbs(T value) { - // T is unsigned, so |value| must already be positive. - return static_cast<T>(value); -} - -// This is just boilerplate that wraps the standard floating point arithmetic. -// A macro isn't the nicest solution, but it beats rewriting these repeatedly. -#define BASE_FLOAT_ARITHMETIC_OPS(NAME, OP) \ - template <typename T, typename U> \ - struct Checked##NAME##Op< \ - T, U, typename std::enable_if<std::is_floating_point<T>::value || \ - std::is_floating_point<U>::value>::type> { \ - using result_type = typename MaxExponentPromotion<T, U>::type; \ - template <typename V> \ - static bool Do(T x, U y, V* result) { \ - using Promotion = typename MaxExponentPromotion<T, U>::type; \ - Promotion presult = x OP y; \ - *result = static_cast<V>(presult); \ - return IsValueInRangeForNumericType<V>(presult); \ - } \ - }; - -BASE_FLOAT_ARITHMETIC_OPS(Add, +) -BASE_FLOAT_ARITHMETIC_OPS(Sub, -) -BASE_FLOAT_ARITHMETIC_OPS(Mul, *) -BASE_FLOAT_ARITHMETIC_OPS(Div, /) - -#undef BASE_FLOAT_ARITHMETIC_OPS - -template < - typename T, - typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr> -bool CheckedNeg(T value, T* result) { - *result = static_cast<T>(-value); - return true; -} - -template < - typename T, - typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr> -bool CheckedAbs(T value, T* result) { - *result = static_cast<T>(std::abs(value)); - return true; -} - -// Floats carry around their validity state with them, but integers do not. So, -// we wrap the underlying value in a specialization in order to hide that detail -// and expose an interface via accessors. -enum NumericRepresentation { - NUMERIC_INTEGER, - NUMERIC_FLOATING, - NUMERIC_UNKNOWN -}; - -template <typename NumericType> -struct GetNumericRepresentation { - static const NumericRepresentation value = - std::is_integral<NumericType>::value - ? NUMERIC_INTEGER - : (std::is_floating_point<NumericType>::value ? NUMERIC_FLOATING - : NUMERIC_UNKNOWN); -}; - -template <typename T, NumericRepresentation type = - GetNumericRepresentation<T>::value> -class CheckedNumericState {}; - -// Integrals require quite a bit of additional housekeeping to manage state. -template <typename T> -class CheckedNumericState<T, NUMERIC_INTEGER> { - private: - // is_valid_ precedes value_ because member intializers in the constructors - // are evaluated in field order, and is_valid_ must be read when initializing - // value_. - bool is_valid_; - T value_; - - // Ensures that a type conversion does not trigger undefined behavior. - template <typename Src> - static constexpr T WellDefinedConversionOrZero(const Src value, - const bool is_valid) { - using SrcType = typename internal::UnderlyingType<Src>::type; - return (std::is_integral<SrcType>::value || is_valid) - ? static_cast<T>(value) - : static_cast<T>(0); - } - - public: - template <typename Src, NumericRepresentation type> - friend class CheckedNumericState; - - constexpr CheckedNumericState() : is_valid_(true), value_(0) {} - - template <typename Src> - constexpr CheckedNumericState(Src value, bool is_valid) - : is_valid_(is_valid && IsValueInRangeForNumericType<T>(value)), - value_(WellDefinedConversionOrZero(value, is_valid_)) { - static_assert(std::is_arithmetic<Src>::value, "Argument must be numeric."); - } - - // Copy constructor. - template <typename Src> - constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs) - : is_valid_(rhs.IsValid()), - value_(WellDefinedConversionOrZero(rhs.value(), is_valid_)) {} - - template <typename Src> - constexpr explicit CheckedNumericState(Src value) - : is_valid_(IsValueInRangeForNumericType<T>(value)), - value_(WellDefinedConversionOrZero(value, is_valid_)) {} - - constexpr bool is_valid() const { return is_valid_; } - constexpr T value() const { return value_; } -}; - -// Floating points maintain their own validity, but need translation wrappers. -template <typename T> -class CheckedNumericState<T, NUMERIC_FLOATING> { - private: - T value_; - - // Ensures that a type conversion does not trigger undefined behavior. - template <typename Src> - static constexpr T WellDefinedConversionOrNaN(const Src value, - const bool is_valid) { - using SrcType = typename internal::UnderlyingType<Src>::type; - return (StaticDstRangeRelationToSrcRange<T, SrcType>::value == - NUMERIC_RANGE_CONTAINED || - is_valid) - ? static_cast<T>(value) - : std::numeric_limits<T>::quiet_NaN(); - } - - public: - template <typename Src, NumericRepresentation type> - friend class CheckedNumericState; - - constexpr CheckedNumericState() : value_(0.0) {} - - template <typename Src> - constexpr CheckedNumericState(Src value, bool is_valid) - : value_(WellDefinedConversionOrNaN(value, is_valid)) {} - - template <typename Src> - constexpr explicit CheckedNumericState(Src value) - : value_(WellDefinedConversionOrNaN( - value, - IsValueInRangeForNumericType<T>(value))) {} - - // Copy constructor. - template <typename Src> - constexpr CheckedNumericState(const CheckedNumericState<Src>& rhs) - : value_(WellDefinedConversionOrNaN( - rhs.value(), - rhs.is_valid() && IsValueInRangeForNumericType<T>(rhs.value()))) {} - - constexpr bool is_valid() const { - // Written this way because std::isfinite is not reliably constexpr. - // TODO(jschuh): Fix this if the libraries ever get fixed. - return value_ <= std::numeric_limits<T>::max() && - value_ >= std::numeric_limits<T>::lowest(); - } - constexpr T value() const { return value_; } -}; - -template <template <typename, typename, typename> class M, - typename L, - typename R> -struct MathWrapper { - using math = M<typename UnderlyingType<L>::type, - typename UnderlyingType<R>::type, - void>; - using type = typename math::result_type; -}; - -} // namespace internal -} // namespace base - -#endif // MINI_CHROMIUM_BASE_NUMERICS_SAFE_MATH_IMPL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/rand_util.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/rand_util.h deleted file mode 100644 index 21ece1bec6..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/rand_util.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_RAND_UTIL_H_ -#define MINI_CHROMIUM_BASE_RAND_UTIL_H_ - -#include <stdint.h> - -#include <string> - -namespace base { - -uint64_t RandUint64(); - -int RandInt(int min, int max); - -uint64_t RandGenerator(uint64_t range); - -double RandDouble(); - -void RandBytes(void* output, size_t output_length); -std::string RandBytesAsString(size_t length); - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_RAND_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_clear_errno.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_clear_errno.h deleted file mode 100644 index 19caf79b71..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_clear_errno.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_SCOPED_CLEAR_ERRNO_H_ -#define MINI_CHROMIUM_BASE_SCOPED_CLEAR_ERRNO_H_ - -#include <errno.h> - -#include "base/macros.h" - -namespace base { - -// Simple scoper that saves the current value of errno, resets it to 0, and on -// destruction puts the old value back. -class ScopedClearErrno { - public: - ScopedClearErrno() : old_errno_(errno) { - errno = 0; - } - ~ScopedClearErrno() { - if (errno == 0) - errno = old_errno_; - } - - private: - const int old_errno_; - - DISALLOW_COPY_AND_ASSIGN(ScopedClearErrno); -}; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_SCOPED_CLEAR_ERRNO_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_generic.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_generic.h deleted file mode 100644 index 0427e92c5b..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/scoped_generic.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ -#define MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ - -#include <stdlib.h> - -#include <algorithm> - -#include "base/compiler_specific.h" -#include "base/macros.h" - -namespace base { - -template<typename T, typename Traits> -class ScopedGeneric { - private: - struct Data : public Traits { - explicit Data(const T& in) : generic(in) {} - Data(const T& in, const Traits& other) : Traits(other), generic(in) {} - T generic; - }; - - public: - typedef T element_type; - typedef Traits traits_type; - - ScopedGeneric() : data_(traits_type::InvalidValue()) {} - - explicit ScopedGeneric(const element_type& value) : data_(value) {} - - ScopedGeneric(const element_type& value, const traits_type& traits) - : data_(value, traits) { - } - - ScopedGeneric(ScopedGeneric<T, Traits>&& rvalue) - : data_(rvalue.release(), rvalue.get_traits()) { - } - - ~ScopedGeneric() { - FreeIfNecessary(); - } - - ScopedGeneric& operator=(ScopedGeneric<T, Traits>&& rvalue) { - reset(rvalue.release()); - return *this; - } - - void reset(const element_type& value = traits_type::InvalidValue()) { - if (data_.generic != traits_type::InvalidValue() && data_.generic == value) - abort(); - FreeIfNecessary(); - data_.generic = value; - } - - void swap(ScopedGeneric& other) { - using std::swap; - swap(static_cast<Traits&>(data_), static_cast<Traits&>(other.data_)); - swap(data_.generic, other.data_.generic); - } - - element_type release() WARN_UNUSED_RESULT { - element_type old_generic = data_.generic; - data_.generic = traits_type::InvalidValue(); - return old_generic; - } - - const element_type& get() const { return data_.generic; } - - bool is_valid() const { return data_.generic != traits_type::InvalidValue(); } - - bool operator==(const element_type& value) const { - return data_.generic == value; - } - bool operator!=(const element_type& value) const { - return data_.generic != value; - } - - Traits& get_traits() { return data_; } - const Traits& get_traits() const { return data_; } - - private: - void FreeIfNecessary() { - if (data_.generic != traits_type::InvalidValue()) { - data_.Free(data_.generic); - data_.generic = traits_type::InvalidValue(); - } - } - - template <typename T2, typename Traits2> bool operator==( - const ScopedGeneric<T2, Traits2>& p2) const; - template <typename T2, typename Traits2> bool operator!=( - const ScopedGeneric<T2, Traits2>& p2) const; - - Data data_; - - DISALLOW_COPY_AND_ASSIGN(ScopedGeneric); -}; - -template<class T, class Traits> -void swap(const ScopedGeneric<T, Traits>& a, - const ScopedGeneric<T, Traits>& b) { - a.swap(b); -} - -template<class T, class Traits> -bool operator==(const T& value, const ScopedGeneric<T, Traits>& scoped) { - return value == scoped.get(); -} - -template<class T, class Traits> -bool operator!=(const T& value, const ScopedGeneric<T, Traits>& scoped) { - return value != scoped.get(); -} - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string16.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string16.h deleted file mode 100644 index 2eccd2afe2..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string16.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ - -#include <stdint.h> -#include <stdio.h> - -#include <string> - -#include "build/build_config.h" - -namespace base { - -#if defined(WCHAR_T_IS_UTF16) -typedef wchar_t char16; -#elif defined(WCHAR_T_IS_UTF32) -typedef uint16_t char16; -#endif // WCHAR_T_IS_UTF32 - -int c16memcmp(const char16* s1, const char16* s2, size_t n); -size_t c16len(const char16* s); -const char16* c16memchr(const char16* s, char16 c, size_t n); -char16* c16memmove(char16* s1, const char16* s2, size_t n); -char16* c16memcpy(char16* s1, const char16* s2, size_t n); -char16* c16memset(char16* s, char16 c, size_t n); - -#if defined(WCHAR_T_IS_UTF16) - -typedef std::wstring string16; -typedef std::char_traits<wchar_t> string16_char_traits; - -#elif defined(WCHAR_T_IS_UTF32) - -struct string16_char_traits { - typedef char16 char_type; - typedef int int_type; - - static_assert(sizeof(int_type) > sizeof(char_type), "unexpected type width"); - - typedef std::streamoff off_type; - typedef mbstate_t state_type; - typedef std::fpos<state_type> pos_type; - - static void assign(char_type& c1, const char_type& c2) { - c1 = c2; - } - - static bool eq(const char_type& c1, const char_type& c2) { - return c1 == c2; - } - static bool lt(const char_type& c1, const char_type& c2) { - return c1 < c2; - } - - static int compare(const char_type* s1, const char_type* s2, size_t n) { - return c16memcmp(s1, s2, n); - } - - static size_t length(const char_type* s) { - return c16len(s); - } - - static const char_type* find(const char_type* s, size_t n, - const char_type& a) { - return c16memchr(s, a, n); - } - - static char_type* move(char_type* s1, const char_type* s2, size_t n) { - return c16memmove(s1, s2, n); - } - - static char_type* copy(char_type* s1, const char_type* s2, size_t n) { - return c16memcpy(s1, s2, n); - } - - static char_type* assign(char_type* s, size_t n, char_type a) { - return c16memset(s, a, n); - } - - static int_type not_eof(const int_type& c) { - return eq_int_type(c, eof()) ? 0 : c; - } - - static char_type to_char_type(const int_type& c) { - return char_type(c); - } - - static int_type to_int_type(const char_type& c) { - return int_type(c); - } - - static bool eq_int_type(const int_type& c1, const int_type& c2) { - return c1 == c2; - } - - static int_type eof() { - return static_cast<int_type>(EOF); - } -}; - -typedef std::basic_string<char16, base::string16_char_traits> string16; - -extern std::ostream& operator<<(std::ostream& out, const string16& str); - -#endif // WCHAR_T_IS_UTF32 - -} // namespace base - -#if defined(WCHAR_T_IS_UTF32) -extern template class std::basic_string<base::char16, - base::string16_char_traits>; -#endif // WCHAR_T_IS_UTF32 - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h deleted file mode 100644 index 8f9911f920..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_number_conversions.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_NUMBER_CONVERSIONS_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING_NUMBER_CONVERSIONS_H_ - -#include <stdint.h> - -#include <string> -#include <vector> - -#include "base/strings/string_piece.h" - -namespace base { - -bool StringToInt(const StringPiece& input, int* output); -bool StringToUint(const StringPiece& input, unsigned int* output); -bool StringToInt64(const StringPiece& input, int64_t* output); -bool StringToUint64(const StringPiece& input, uint64_t* output); -bool StringToSizeT(const StringPiece& input, size_t* output); - -bool HexStringToInt(const StringPiece& input, int* output); -bool HexStringToBytes(const std::string& input, std::vector<uint8_t>* output); - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING_NUMBER_CONVERSIONS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h deleted file mode 100644 index b0e45eea6c..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ - -#include <algorithm> -#include <iterator> -#include <ostream> -#include <string> - -#include "base/strings/string16.h" - -namespace base { - -template<typename StringType> -class BasicStringPiece { - public: - typedef typename StringType::traits_type traits_type; - typedef typename StringType::value_type value_type; - typedef typename StringType::size_type size_type; - typedef typename StringType::difference_type difference_type; - typedef const value_type& reference; - typedef const value_type& const_reference; - typedef const value_type* pointer; - typedef const value_type* const_pointer; - typedef const value_type* const_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - - static const size_type npos; - - BasicStringPiece() - : pointer_(NULL), - length_(0) { - } - - BasicStringPiece(const value_type* string) - : pointer_(string), - length_((string == NULL) ? 0 : traits_type::length(string)) { - } - - BasicStringPiece(const StringType& string) - : pointer_(string.data()), - length_(string.size()) { - } - - BasicStringPiece(const value_type* offset, size_type length) - : pointer_(offset), - length_(length) { - } - - BasicStringPiece(const typename StringType::const_iterator& begin, - const typename StringType::const_iterator& end) - : pointer_((end > begin) ? &(*begin) : NULL), - length_((end > begin) ? static_cast<size_type>(end - begin) : 0) { - } - - value_type operator[](size_type index) const { return pointer_[index]; } - - const value_type* data() const { return pointer_; } - - const_iterator begin() const { return pointer_; } - const_iterator end() const { return pointer_ + length_; } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(pointer_ + length_); - } - const_reverse_iterator rend() const { - return const_reverse_iterator(pointer_); - } - - bool empty() const { return length_ == 0; } - size_type size() const { return length_; } - size_type length() const { return length_; } - size_type max_size() const { return length_; } - size_type capacity() const { return length_; } - - static int wordmemcmp(const value_type* p, - const value_type* p2, - size_type N) { - return StringType::traits_type::compare(p, p2, N); - } - - void clear() { - pointer_ = NULL; - length_ = 0; - } - - int compare(const BasicStringPiece<StringType>& that) const { - int result = traits_type::compare(pointer_, - that.pointer_, - std::min(length_, that.length_)); - if (result == 0) { - if (length_ < that.length_) { - result = -1; - } else if (length_ > that.length_) { - result = 1; - } - } - return result; - } - - BasicStringPiece<StringType> substr(size_type position = 0, - size_type count = npos) const { - position = std::min(position, size()); - count = std::min(count, size() - position); - return BasicStringPiece<StringType>(data() + position, count); - } - - size_type copy(value_type* dest, - size_type count, - size_type position = 0) const { - size_type ret = std::min(size() - position, count); - traits_type::copy(dest, data() + position, ret); - return ret; - } - - size_type find(const BasicStringPiece<StringType>& str, size_type pos) const { - if (pos >= size()) { - return npos; - } - const_iterator result = std::search(begin() + pos, - end(), - str.begin(), - str.end()); - size_type xpos = static_cast<size_type>(result - begin()); - return xpos + str.size() <= size() ? xpos : npos; - } - - size_type find(value_type c, size_type pos) const { - if (pos >= size()) { - return npos; - } - const_iterator result = std::find(begin() + pos, end(), c); - return result != end() ? static_cast<size_type>(result - begin()) : npos; - } - - void set(const value_type* string) { - pointer_ = string; - length_ = string ? traits_type::length(string) : 0; - } - - StringType as_string() const { - return empty() ? StringType() : StringType(data(), size()); - } - - private: - const value_type* pointer_; - size_type length_; -}; - -template <typename StringType> -const typename BasicStringPiece<StringType>::size_type - BasicStringPiece<StringType>::npos = StringType::npos; - -template<typename StringType> -std::ostream& operator<<(std::ostream& ostream, - const BasicStringPiece<StringType>& string_piece) { - ostream.write(string_piece.data(), string_piece.size()); - return ostream; -} - -typedef BasicStringPiece<std::string> StringPiece; -typedef BasicStringPiece<string16> StringPiece16; - -inline bool operator==(const StringPiece& x, const StringPiece& y) { - if (x.size() != y.size()) - return false; - - return StringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0; -} - -inline bool operator==(const StringPiece16& x, const StringPiece16& y) { - if (x.size() != y.size()) - return false; - - return StringPiece16::wordmemcmp(x.data(), y.data(), x.size()) == 0; -} - -// This hash function is copied from base/strings/string16.h. We don't use the -// ones already defined for string and string16 directly because it would -// require the string constructors to be called, which we don't want. -#define HASH_STRING_PIECE(StringPieceType, string_piece) \ - std::size_t result = 0; \ - for (StringPieceType::const_iterator i = string_piece.begin(); \ - i != string_piece.end(); ++i) \ - result = (result * 131) + *i; \ - return result; - -struct StringPieceHash { - std::size_t operator()(const StringPiece& sp) const { - HASH_STRING_PIECE(StringPiece, sp); - } -}; -struct StringPiece16Hash { - std::size_t operator()(const StringPiece16& sp16) const { - HASH_STRING_PIECE(StringPiece16, sp16); - } -}; - -} // namespace base; - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util.h deleted file mode 100644 index 51ebba39e5..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ - -#include "base/compiler_specific.h" -#include "base/logging.h" - -namespace base { - -int vsnprintf(char* buffer, size_t size, const char* format, va_list arguments) - PRINTF_FORMAT(3, 0); - -} // namespace base - -#if defined(OS_WIN) -#include "base/strings/string_util_win.h" -#elif defined(OS_POSIX) -#include "base/strings/string_util_posix.h" -#endif - -template <class string_type> -inline typename string_type::value_type* WriteInto(string_type* str, - size_t length_with_null) { - DCHECK_NE(0u, length_with_null); - str->reserve(length_with_null); - str->resize(length_with_null - 1); - - if (length_with_null <= 1) - return NULL; - - return &((*str)[0]); -} - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h deleted file mode 100644 index 445f06b039..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_posix.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_POSIX_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_POSIX_H_ - -#include "base/strings/string_util.h" - -#include <stdio.h> - -namespace base { - -inline int vsnprintf(char* buffer, - size_t size, - const char* format, va_list arguments) { - return ::vsnprintf(buffer, size, format, arguments); -} - -// Chromium code style is to not use malloc'd strings; this is only for use -// for interaction with APIs that require it. -inline char* strdup(const char* str) { - return ::strdup(str); -} - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING_UTIL_POSIX_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h deleted file mode 100644 index 447892b478..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/string_util_win.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_STRINGS_STRING_UTIL_WIN_H_ -#define BASE_STRINGS_STRING_UTIL_WIN_H_ - -#include <string.h> - -namespace base { - -// Chromium code style is to not use malloc'd strings; this is only for use -// for interaction with APIs that require it. -inline char* strdup(const char* str) { - return _strdup(str); -} - -} // namespace base - -#endif // BASE_STRINGS_STRING_UTIL_WIN_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h deleted file mode 100644 index 1b1e60be22..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/stringprintf.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRINGPRINTF_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRINGPRINTF_H_ - -#include <stdarg.h> - -#include <string> - -#include "base/compiler_specific.h" - -namespace base { - -std::string StringPrintf(const char* format, ...) - PRINTF_FORMAT(1, 2); -void StringAppendV(std::string* dst, const char* format, va_list ap) - PRINTF_FORMAT(2, 0); - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRINGPRINTF_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h deleted file mode 100644 index 3759989975..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/sys_string_conversions.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_SYS_STRING_CONVERSIONS_H_ -#define MINI_CHROMIUM_BASE_STRINGS_SYS_STRING_CONVERSIONS_H_ - -#include "build/build_config.h" - -#if defined(OS_MACOSX) - -#include <CoreFoundation/CoreFoundation.h> - -#include <string> - -#if defined(__OBJC__) -#import <Foundation/Foundation.h> -#else -class NSString; -#endif - -namespace base { - -std::string SysCFStringRefToUTF8(CFStringRef ref); -std::string SysNSStringToUTF8(NSString* nsstring); -CFStringRef SysUTF8ToCFStringRef(const std::string& utf8); -NSString* SysUTF8ToNSString(const std::string& utf8); - -} // namespace base - -#endif // defined(OS_MACOSX) - -#endif // MINI_CHROMIUM_BASE_STRINGS_SYS_STRING_CONVERSIONS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h deleted file mode 100644 index 72f86aef51..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversion_utils.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSION_UTILS_H_ -#define MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSION_UTILS_H_ - -#include "base/strings/string16.h" - -namespace base { - -inline bool IsValidCodepoint(uint32_t code_point) { - return code_point < 0xD800u || - (code_point >= 0xE000u && code_point <= 0x10FFFFu); -} - -bool ReadUnicodeCharacter(const char* src, - int32_t src_len, - int32_t* char_index, - uint32_t* code_point_out); - -bool ReadUnicodeCharacter(const char16* src, - int32_t src_len, - int32_t* char_index, - uint32_t* code_point); - -size_t WriteUnicodeCharacter(uint32_t code_point, std::string* output); - -size_t WriteUnicodeCharacter(uint32_t code_point, string16* output); - -template<typename CHAR> -void PrepareForUTF8Output(const CHAR* src, size_t src_len, std::string* output); - -template<typename STRING> -void PrepareForUTF16Or32Output(const char* src, size_t src_len, STRING* output); - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSION_UTILS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h deleted file mode 100644 index c2ca67482c..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/strings/utf_string_conversions.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSIONS_H_ -#define MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSIONS_H_ - -#include <string> - -#include "base/strings/string16.h" -#include "base/strings/string_piece.h" - -namespace base { - -bool UTF8ToUTF16(const char* src, size_t src_len, string16* output); -string16 UTF8ToUTF16(const StringPiece& utf8); -bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output); -std::string UTF16ToUTF8(const StringPiece16& utf16); - -} // namespace - -#endif // MINI_CHROMIUM_BASE_STRINGS_UTF_STRING_CONVERSIONS_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h deleted file mode 100644 index d60c133aff..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/sys_byteorder.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_ -#define MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_ - -#include "base/macros.h" - -#if defined(OS_MACOSX) -#include <libkern/OSByteOrder.h> -#elif defined(OS_WIN) -#include <stdlib.h> -#else -#include <byteswap.h> -#endif - -namespace base { - -inline uint16_t ByteSwap(uint16_t x) { -#if defined(OS_MACOSX) - return OSSwapInt16(x); -#elif defined(OS_WIN) - return _byteswap_ushort(x); -#else - return bswap_16(x); -#endif -} - -inline uint32_t ByteSwap(uint32_t x) { -#if defined(OS_MACOSX) - return OSSwapInt32(x); -#elif defined(OS_WIN) - return _byteswap_ulong(x); -#else - return bswap_32(x); -#endif -} - -inline uint64_t ByteSwap(uint64_t x) { -#if defined(OS_MACOSX) - return OSSwapInt64(x); -#elif defined(OS_WIN) - return _byteswap_uint64(x); -#else - return bswap_64(x); -#endif -} - -inline uint16_t NetToHost16(uint16_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -inline uint32_t NetToHost32(uint32_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -inline uint64_t NetToHost64(uint64_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -inline uint16_t HostToNet16(uint16_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -inline uint32_t HostToNet32(uint32_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -inline uint64_t HostToNet64(uint64_t x) { -#if defined(ARCH_CPU_LITTLE_ENDIAN) - return ByteSwap(x); -#else - return x; -#endif -} - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/template_util.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/template_util.h deleted file mode 100644 index 618a081966..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/base/template_util.h +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ -#define MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ - -#include <stddef.h> - -#include "build/build_config.h" - -namespace base { - -// template definitions from tr1 - -template<class T, T v> -struct integral_constant { - static const T value = v; - typedef T value_type; - typedef integral_constant<T, v> type; -}; - -template <class T, T v> const T integral_constant<T, v>::value; - -typedef integral_constant<bool, true> true_type; -typedef integral_constant<bool, false> false_type; - -template <class T> struct is_pointer : false_type {}; -template <class T> struct is_pointer<T*> : true_type {}; - -// Member function pointer detection. This is built-in to C++ 11's stdlib, and -// we can remove this when we switch to it. -template<typename T> -struct is_member_function_pointer : false_type {}; - -template <typename R, typename Z, typename... A> -struct is_member_function_pointer<R(Z::*)(A...)> : true_type {}; -template <typename R, typename Z, typename... A> -struct is_member_function_pointer<R(Z::*)(A...) const> : true_type {}; - - -template <class T, class U> struct is_same : public false_type {}; -template <class T> struct is_same<T,T> : true_type {}; - -template<class> struct is_array : public false_type {}; -template<class T, size_t n> struct is_array<T[n]> : public true_type {}; -template<class T> struct is_array<T[]> : public true_type {}; - -template <class T> struct is_non_const_reference : false_type {}; -template <class T> struct is_non_const_reference<T&> : true_type {}; -template <class T> struct is_non_const_reference<const T&> : false_type {}; - -template <class T> struct is_const : false_type {}; -template <class T> struct is_const<const T> : true_type {}; - -template <class T> struct is_void : false_type {}; -template <> struct is_void<void> : true_type {}; - -namespace internal { - -// Types YesType and NoType are guaranteed such that sizeof(YesType) < -// sizeof(NoType). -typedef char YesType; - -struct NoType { - YesType dummy[2]; -}; - -// This class is an implementation detail for is_convertible, and you -// don't need to know how it works to use is_convertible. For those -// who care: we declare two different functions, one whose argument is -// of type To and one with a variadic argument list. We give them -// return types of different size, so we can use sizeof to trick the -// compiler into telling us which function it would have chosen if we -// had called it with an argument of type From. See Alexandrescu's -// _Modern C++ Design_ for more details on this sort of trick. - -struct ConvertHelper { - template <typename To> - static YesType Test(To); - - template <typename To> - static NoType Test(...); - - template <typename From> - static From& Create(); -}; - -// Used to determine if a type is a struct/union/class. Inspired by Boost's -// is_class type_trait implementation. -struct IsClassHelper { - template <typename C> - static YesType Test(void(C::*)(void)); - - template <typename C> - static NoType Test(...); -}; - -} // namespace internal - -// Inherits from true_type if From is convertible to To, false_type otherwise. -// -// Note that if the type is convertible, this will be a true_type REGARDLESS -// of whether or not the conversion would emit a warning. -template <typename From, typename To> -struct is_convertible - : integral_constant<bool, - sizeof(internal::ConvertHelper::Test<To>( - internal::ConvertHelper::Create<From>())) == - sizeof(internal::YesType)> { -}; - -template <typename T> -struct is_class - : integral_constant<bool, - sizeof(internal::IsClassHelper::Test<T>(0)) == - sizeof(internal::YesType)> { -}; - -template<bool B, class T = void> -struct enable_if {}; - -template<class T> -struct enable_if<true, T> { typedef T type; }; - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_TEMPLATE_UTIL_H_ diff --git a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/build/build_config.h b/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/build/build_config.h deleted file mode 100644 index eca51a5cc7..0000000000 --- a/Tools/Crashpad/include/third_party/mini_chromium/mini_chromium/build/build_config.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ -#define MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ - -#if defined(__APPLE__) -#define OS_MACOSX 1 -#elif defined(__ANDROID__) -#define OS_ANDROID 1 -#elif defined(__linux__) -#define OS_LINUX 1 -#elif defined(_WIN32) -#define OS_WIN 1 -#else -#error Please add support for your platform in build/build_config.h -#endif - -#if defined(OS_MACOSX) -#include <TargetConditionals.h> -#if defined(TARGET_OS_IOS) -#if TARGET_OS_IOS -#define OS_IOS 1 -#endif -#elif defined(TARGET_OS_IPHONE) -#if TARGET_OS_IPHONE -#define OS_IOS 1 -#endif -#endif -#endif - -#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_ANDROID) -#define OS_POSIX 1 -#endif - -// Compiler detection. -#if defined(__GNUC__) -#define COMPILER_GCC 1 -#elif defined(_MSC_VER) -#define COMPILER_MSVC 1 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#if defined(_M_X64) || defined(__x86_64__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86_64 1 -#define ARCH_CPU_64_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(_M_IX86) || defined(__i386__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86 1 -#define ARCH_CPU_32_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__ARMEL__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARMEL 1 -#define ARCH_CPU_32_BITS 1 -#elif defined(__aarch64__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARM64 1 -#define ARCH_CPU_64_BITS 1 -#else -#error Please add support for your architecture in build/build_config.h -#endif - -#if !defined(ARCH_CPU_LITTLE_ENDIAN) && !defined(ARCH_CPU_BIG_ENDIAN) -#if defined(__LITTLE_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__BIG_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) -#define ARCH_CPU_BIG_ENDIAN 1 -#else -#error Please add support for your architecture in build/build_config.h -#endif -#endif - -#if defined(OS_POSIX) && defined(COMPILER_GCC) && \ - defined(__WCHAR_MAX__) && \ - (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) -#define WCHAR_T_IS_UTF32 -#elif defined(OS_WIN) -#define WCHAR_T_IS_UTF16 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#endif // MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ diff --git a/Tools/Crashpad/include/tools/tool_support.h b/Tools/Crashpad/include/tools/tool_support.h deleted file mode 100644 index 48f412f35f..0000000000 --- a/Tools/Crashpad/include/tools/tool_support.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_TOOLS_TOOL_SUPPORT_H_ -#define CRASHPAD_TOOLS_TOOL_SUPPORT_H_ - -#include <string> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/strings/string_piece.h" -#include "build/build_config.h" - -namespace crashpad { - -//! \brief Common functions used by command line tools. -class ToolSupport { - public: - //! \brief Handles `--version`. - //! - //! \param[in] me The tool’s name, the basename of `argv[0]`. - static void Version(const base::FilePath& me); - - //! \brief Prints the footer for `--help`. - //! - //! \param[in] me The tool’s name, the basename of `argv[0]`. - static void UsageTail(const base::FilePath& me); - - //! \brief Suggests using `--help` when a command line tool can’t make sense - //! of its arguments. - //! - //! \param[in] me The tool’s name, the basename of `argv[0]`. - //! \param[in] hint A hint to display before the suggestion to try `--help`. - //! Optional, may be `nullptr`, in which case no hint will be presented. - static void UsageHint(const base::FilePath& me, const char* hint); - -#if defined(OS_POSIX) || DOXYGEN - //! \copydoc Version - static void Version(const std::string& me); - - //! \copydoc UsageTail - static void UsageTail(const std::string& me); - - //! \copydoc UsageHint - static void UsageHint(const std::string& me, const char* hint); -#endif // OS_POSIX - -#if defined(OS_WIN) || DOXYGEN - //! \brief Converts \a argv `wchar_t` UTF-16 to UTF-8, and passes onwards to a - //! UTF-8 entry point. - //! - //! \return The return value of \a entry. - static int Wmain(int argc, wchar_t* argv[], int (*entry)(int, char*[])); -#endif // OS_WIN - - //! \brief Converts a command line argument to the string type suitable for - //! base::FilePath. - //! - //! On POSIX, this is a no-op. On Windows, assumes that Wmain() was used, and - //! the input argument was converted from UTF-16 in a `wchar_t*` to UTF-8 in a - //! `char*`. This undoes that transformation. - //! - //! \sa Wmain() - //! \sa FilePathToCommandLineArgument() - static base::FilePath::StringType CommandLineArgumentToFilePathStringType( - const base::StringPiece& arg); - - //! \brief Converts a base::FilePath to a command line argument. - //! - //! On POSIX, this is a no-op. On Windows, this undoes the transformation done - //! by CommandLineArgumentToFilePathStringType() in the same manner as - //! Wmain(). - static std::string FilePathToCommandLineArgument( - const base::FilePath& file_path); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(ToolSupport); -}; - -} // namespace crashpad - -#endif // CRASHPAD_TOOLS_TOOL_SUPPORT_H_ diff --git a/Tools/Crashpad/include/util/file/delimited_file_reader.h b/Tools/Crashpad/include/util/file/delimited_file_reader.h deleted file mode 100644 index 93fd738062..0000000000 --- a/Tools/Crashpad/include/util/file/delimited_file_reader.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_ -#define CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_ - -#include <stdint.h> - -#include <string> - -#include "base/macros.h" -#include "util/file/file_reader.h" - -namespace crashpad { - -//! \brief Reads a file one field or line at a time. -//! -//! The file is interpreted as a series of fields separated by delimiter -//! characters. When the delimiter character is the newline character -//! (<code>'\\n'</code>), the file is interpreted as a series of lines. -//! -//! It is safe to mix GetDelim() and GetLine() calls, if appropriate for the -//! format being interpreted. -//! -//! This is a replacement for the standard library’s `getdelim()` and -//! `getline()` functions, adapted to work with FileReaderInterface objects -//! instead of `FILE*` streams. -class DelimitedFileReader { - public: - //! \brief The result of a GetDelim() or GetLine() call. - enum class Result { - //! \brief An error occurred, and a message was logged. - kError = -1, - - //! \brief A field or line was read from the file. - kSuccess, - - //! \brief The end of the file was encountered. - kEndOfFile, - }; - - explicit DelimitedFileReader(FileReaderInterface* file_reader); - ~DelimitedFileReader(); - - //! \brief Reads a single field from the file. - //! - //! \param[in] delimiter The delimiter character that terminates the field. - //! It is safe to call this method multiple times while changing the value - //! of this parameter, if appropriate for the format being interpreted. - //! \param[out] field The field read from the file. This parameter will - //! include the field’s terminating delimiter character unless the field - //! was at the end of the file and was read without such a character. - //! This parameter will not be empty. - //! - //! \return a #Result value. \a field is only valid when Result::kSuccess is - //! returned. - Result GetDelim(char delimiter, std::string* field); - - //! \brief Reads a single line from the file. - //! - //! \param[out] line The line read from the file. This parameter will include - //! the line terminating delimiter character unless the line was at the - //! end of the file and was read without such a character. This parameter - //! will not be empty. - //! - //! \return a #Result value. \a line is only valid when Result::kSuccess is - //! returned. - Result GetLine(std::string* line); - - private: - char buf_[4096]; - FileReaderInterface* file_reader_; // weak - uint16_t buf_pos_; // Index into buf_ of the start of the next field. - uint16_t buf_len_; // The size of buf_ that’s been filled. - bool eof_; // Caches the EOF signal when detected following a partial field. - - DISALLOW_COPY_AND_ASSIGN(DelimitedFileReader); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_ diff --git a/Tools/Crashpad/include/util/file/directory_reader.h b/Tools/Crashpad/include/util/file/directory_reader.h deleted file mode 100644 index d3976929c9..0000000000 --- a/Tools/Crashpad/include/util/file/directory_reader.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_DIRECTORY_READER_H_ -#define CRASHPAD_UTIL_FILE_DIRECTORY_READER_H_ - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "build/build_config.h" - -#if defined(OS_POSIX) -#include "util/posix/scoped_dir.h" -#elif defined(OS_WIN) -#include <windows.h> - -#include "util/win/scoped_handle.h" -#endif // OS_POSIX - -namespace crashpad { - -//! \brief Iterates over the file and directory names in a directory. -//! -//! The names enumerated are relative to the specified directory and do not -//! include ".", "..", or files and directories in subdirectories. -class DirectoryReader { - public: - //! \brief The result of a call to NextFile(). - enum class Result { - //! \brief An error occurred and a message was logged. - kError = -1, - - //! \brief A file was found. - kSuccess, - - //! \brief No more files were found. - kNoMoreFiles, - }; - - DirectoryReader(); - ~DirectoryReader(); - - //! \brief Opens the directory specified by \a path for reading. - //! - //! \param[in] path The path to the directory to read. - //! \return `true` on success. `false` on failure with a message logged. - bool Open(const base::FilePath& path); - - //! \brief Advances the reader to the next file in the directory. - //! - //! \param[out] filename The filename of the next file. - //! \return a #Result value. \a filename is only valid when Result::kSuccess - //! is returned. If Result::kError is returned, a message will be - //! logged. - Result NextFile(base::FilePath* filename); - -#if defined(OS_POSIX) || DOXYGEN - //! \brief Returns the file descriptor associated with this reader, logging a - //! message and returning -1 on error. - int DirectoryFD(); -#endif - - private: -#if defined(OS_POSIX) - ScopedDIR dir_; -#elif defined(OS_WIN) - WIN32_FIND_DATA find_data_; - ScopedSearchHANDLE handle_; - bool first_entry_; -#endif // OS_POSIX - - DISALLOW_COPY_AND_ASSIGN(DirectoryReader); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_DIRECTORY_READER_H_ diff --git a/Tools/Crashpad/include/util/file/file_io.h b/Tools/Crashpad/include/util/file/file_io.h deleted file mode 100644 index 87c40702a8..0000000000 --- a/Tools/Crashpad/include/util/file/file_io.h +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILE_IO_H_ -#define CRASHPAD_UTIL_FILE_FILE_IO_H_ - -#include <sys/types.h> - -#include "build/build_config.h" - -#if defined(OS_POSIX) -#include "base/files/scoped_file.h" -#elif defined(OS_WIN) -#include <windows.h> -#include "util/win/scoped_handle.h" -#endif - -namespace base { -class FilePath; -} // namespace base - -namespace crashpad { - -#if defined(OS_POSIX) || DOXYGEN - -//! \brief Platform-specific alias for a low-level file handle. -using FileHandle = int; - -//! \brief Platform-specific alias for a position in an open file. -using FileOffset = off_t; - -//! \brief Scoped wrapper of a FileHandle. -using ScopedFileHandle = base::ScopedFD; - -//! \brief A value that can never be a valid FileHandle. -const FileHandle kInvalidFileHandle = -1; - -using FileOperationResult = ssize_t; - -#elif defined(OS_WIN) - -using FileHandle = HANDLE; -using FileOffset = LONGLONG; -using ScopedFileHandle = ScopedFileHANDLE; -using FileOperationResult = LONG_PTR; - -const FileHandle kInvalidFileHandle = INVALID_HANDLE_VALUE; - -#endif - -//! \brief Determines the mode that LoggingOpenFileForWrite() uses. -enum class FileWriteMode { - //! \brief Opens the file if it exists, or fails if it does not. - kReuseOrFail, - - //! \brief Opens the file if it exists, or creates a new file. - kReuseOrCreate, - - //! \brief Creates a new file. If the file already exists, it will be - //! overwritten. - kTruncateOrCreate, - - //! \brief Creates a new file. If the file already exists, the open will fail. - kCreateOrFail, -}; - -//! \brief Determines the permissions bits for files created on POSIX systems. -enum class FilePermissions : bool { - //! \brief Equivalent to `0600`. - kOwnerOnly, - - //! \brief Equivalent to `0644`. - kWorldReadable, -}; - -//! \brief Determines the locking mode that LoggingLockFile() uses. -enum class FileLocking : bool { - //! \brief Equivalent to `flock()` with `LOCK_SH`. - kShared, - - //! \brief Equivalent to `flock()` with `LOCK_EX`. - kExclusive, -}; - -//! \brief Determines the FileHandle that StdioFileHandle() returns. -enum class StdioStream { - //! \brief Standard input, or `stdin`. - kStandardInput, - - //! \brief Standard output, or `stdout`. - kStandardOutput, - - //! \brief Standard error, or `stderr`. - kStandardError, -}; - -namespace internal { - -//! \brief The name of the native read function used by ReadFile(). -//! -//! This value may be useful for logging. -//! -//! \sa kNativeWriteFunctionName -extern const char kNativeReadFunctionName[]; - -//! \brief The name of the native write function used by WriteFile(). -//! -//! This value may be useful for logging. -//! -//! \sa kNativeReadFunctionName -extern const char kNativeWriteFunctionName[]; - -//! \brief The internal implementation of ReadFileExactly() and its wrappers. -//! -//! The logic is exposed so that it may be reused by FileReaderInterface, and -//! so that it may be tested without requiring large files to be read. It is not -//! intended to be used more generally. Use ReadFileExactly(), -//! LoggingReadFileExactly(), CheckedReadFileExactly(), or -//! FileReaderInterface::ReadExactly() instead. -class ReadExactlyInternal { - public: - //! \brief Calls Read(), retrying following a short read, ensuring that - //! exactly \a size bytes are read. - //! - //! \return `true` on success. `false` if the underlying Read() fails or if - //! fewer than \a size bytes were read. When returning `false`, if \a - //! can_log is `true`, logs a message. - bool ReadExactly(void* buffer, size_t size, bool can_log); - - protected: - ReadExactlyInternal() {} - ~ReadExactlyInternal() {} - - private: - //! \brief Wraps a read operation, such as ReadFile(). - //! - //! \return The number of bytes read and placed into \a buffer, or `-1` on - //! error. When returning `-1`, if \a can_log is `true`, logs a message. - virtual FileOperationResult Read(void* buffer, size_t size, bool can_log) = 0; - - DISALLOW_COPY_AND_ASSIGN(ReadExactlyInternal); -}; - -//! \brief The internal implementation of WriteFile() and its wrappers. -//! -//! The logic is exposed so that it may be tested without requiring large files -//! to be written. It is not intended to be used more generally. Use -//! WriteFile(), LoggingWriteFile(), CheckedWriteFile(), or -//! FileWriterInterface::Write() instead. -class WriteAllInternal { - public: - //! \brief Calls Write(), retrying following a short write, ensuring that - //! exactly \a size bytes are written. - //! - //! \return `true` on success. `false` if the underlying Write() fails or if - //! fewer than \a size bytes were written. - bool WriteAll(const void* buffer, size_t size); - - protected: - WriteAllInternal() {} - ~WriteAllInternal() {} - - private: - //! \brief Wraps a write operation, such as NativeWriteFile(). - //! - //! \return The number of bytes written from \a buffer, or `-1` on error. - virtual FileOperationResult Write(const void* buffer, size_t size) = 0; - - DISALLOW_COPY_AND_ASSIGN(WriteAllInternal); -}; - -//! \brief Writes to a file, retrying when interrupted on POSIX. -//! -//! Fewer than \a size bytes may be written to \a file. This can happen if the -//! underlying write operation returns before writing the entire buffer, or if -//! the buffer is too large to write in a single operation, possibly due to a -//! limitation of a data type used to express the number of bytes written. -//! -//! This function adapts native write operations for uniform use by WriteFile(). -//! This function should only be called by WriteFile(). Other code should call -//! WriteFile() or another function that wraps WriteFile(). -//! -//! \param[in] file The file to write to. -//! \param[in] buffer A buffer containing data to be written. -//! \param[in] size The number of bytes from \a buffer to write. -//! -//! \return The number of bytes actually written from \a buffer to \a file on -//! success. `-1` on error, with `errno` or `GetLastError()` set -//! appropriately. -FileOperationResult NativeWriteFile(FileHandle file, - const void* buffer, - size_t size); - -} // namespace internal - -//! \brief Reads from a file, retrying when interrupted before reading any data -//! on POSIX. -//! -//! This function reads into \a buffer. Fewer than \a size bytes may be read. -//! On Windows, reading from sockets is not currently supported. -//! -//! \return The number of bytes read and placed into \a buffer, or `-1` on -//! error, with `errno` or `GetLastError()` set appropriately. On error, a -//! portion of \a file may have been read into \a buffer. -//! -//! \sa WriteFile -//! \sa ReadFileExactly -//! \sa LoggingReadFileExactly -//! \sa CheckedReadFileExactly -//! \sa CheckedReadFileAtEOF -FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); - -//! \brief Writes to a file, retrying when interrupted on POSIX or following a -//! short write. -//! -//! This function writes to \a file, stopping only when \a size bytes have been -//! written. -//! -//! \return `true` on success. `false` on error, with `errno` or -//! `GetLastError()` set appropriately. On error, a portion of \a buffer may -//! have been written to \a file. -//! -//! \sa ReadFile -//! \sa LoggingWriteFile -//! \sa CheckedWriteFile -bool WriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), retrying following a short read, ensuring that -//! exactly \a size bytes are read. -//! -//! \return `true` on success. If the underlying ReadFile() fails, or if fewer -//! than \a size bytes were read, this function logs a message and -//! returns `false`. -//! -//! \sa LoggingWriteFile -//! \sa ReadFile -//! \sa LoggingReadFileExactly -//! \sa CheckedReadFileExactly -//! \sa CheckedReadFileAtEOF -bool ReadFileExactly(FileHandle file, void* buffer, size_t size); - -//! \brief Wraps ReadFile(), retrying following a short read, ensuring that -//! exactly \a size bytes are read. -//! -//! \return `true` on success. If the underlying ReadFile() fails, or if fewer -//! than \a size bytes were read, this function logs a message and -//! returns `false`. -//! -//! \sa LoggingWriteFile -//! \sa ReadFile -//! \sa ReadFileExactly -//! \sa CheckedReadFileExactly -//! \sa CheckedReadFileAtEOF -bool LoggingReadFileExactly(FileHandle file, void* buffer, size_t size); - -//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. -//! -//! \return `true` on success. If the underlying WriteFile() fails, or if fewer -//! than \a size bytes were written, this function logs a message and -//! returns `false`. -//! -//! \sa LoggingReadFileExactly -//! \sa WriteFile -//! \sa CheckedWriteFile -bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. -//! -//! If the underlying ReadFile() fails, or if fewer than \a size bytes were -//! read, this function causes execution to terminate without returning. -//! -//! \sa CheckedWriteFile -//! \sa ReadFile -//! \sa LoggingReadFileExactly -//! \sa CheckedReadFileAtEOF -void CheckedReadFileExactly(FileHandle file, void* buffer, size_t size); - -//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. -//! -//! if the underlying WriteFile() fails, or if fewer than \a size bytes were -//! written, this function causes execution to terminate without returning. -//! -//! \sa CheckedReadFileExactly -//! \sa WriteFile -//! \sa LoggingWriteFile -void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), ensuring that it indicates end-of-file. -//! -//! Attempts to read a single byte from \a file, expecting no data to be read. -//! If the underlying ReadFile() fails, or if a byte actually is read, this -//! function causes execution to terminate without returning. -//! -//! \sa CheckedReadFileExactly -//! \sa ReadFile -void CheckedReadFileAtEOF(FileHandle file); - -//! \brief Wraps `open()` or `CreateFile()`, opening an existing file for -//! reading. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForWrite -//! \sa OpenFileForReadAndWrite -//! \sa LoggingOpenFileForRead -FileHandle OpenFileForRead(const base::FilePath& path); - -//! \brief Wraps `open()` or `CreateFile()`, creating a file for output. -//! -//! \a mode determines the style (truncate, reuse, etc.) that is used to open -//! the file. On POSIX, \a permissions determines the value that is passed as -//! `mode` to `open()`. On Windows, the file is always opened in binary mode -//! (that is, no CRLF translation). On Windows, the file is opened for sharing, -//! see LoggingLockFile() and LoggingUnlockFile() to control concurrent access. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForRead -//! \sa OpenFileForReadAndWrite -//! \sa LoggingOpenFileForWrite -FileHandle OpenFileForWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps `open()` or `CreateFile()`, creating a file for both input and -//! output. -//! -//! \a mode determines the style (truncate, reuse, etc.) that is used to open -//! the file. On POSIX, \a permissions determines the value that is passed as -//! `mode` to `open()`. On Windows, the file is always opened in binary mode -//! (that is, no CRLF translation). On Windows, the file is opened for sharing, -//! see LoggingLockFile() and LoggingUnlockFile() to control concurrent access. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForRead -//! \sa OpenFileForWrite -//! \sa LoggingOpenFileForReadAndWrite -FileHandle OpenFileForReadAndWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps OpenFileForRead(), logging an error if the operation fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForWrite -//! \sa LoggingOpenFileForReadAndWrite -FileHandle LoggingOpenFileForRead(const base::FilePath& path); - -//! \brief Wraps OpenFileForWrite(), logging an error if the operation fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForRead -//! \sa LoggingOpenFileForReadAndWrite -FileHandle LoggingOpenFileForWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps OpenFileForReadAndWrite(), logging an error if the operation -//! fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForRead -//! \sa LoggingOpenFileForWrite -FileHandle LoggingOpenFileForReadAndWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Locks the given \a file using `flock()` on POSIX or `LockFileEx()` on -//! Windows. -//! -//! It is an error to attempt to lock a file in a different mode when it is -//! already locked. This call will block until the lock is acquired. The -//! entire file is locked. -//! -//! If \a locking is FileLocking::kShared, \a file must have been opened for -//! reading, and if it's FileLocking::kExclusive, \a file must have been opened -//! for writing. -//! -//! \param[in] file The open file handle to be locked. -//! \param[in] locking Controls whether the lock is a shared reader lock, or an -//! exclusive writer lock. -//! -//! \return `true` on success, or `false` and a message will be logged. -bool LoggingLockFile(FileHandle file, FileLocking locking); - -//! \brief Unlocks a file previously locked with LoggingLockFile(). -//! -//! It is an error to attempt to unlock a file that was not previously locked. -//! A previously-locked file should be unlocked before closing the file handle, -//! otherwise on some OSs the lock may not be released immediately. -//! -//! \param[in] file The open locked file handle to be unlocked. -//! -//! \return `true` on success, or `false` and a message will be logged. -bool LoggingUnlockFile(FileHandle file); - -//! \brief Wraps `lseek()` or `SetFilePointerEx()`. Logs an error if the -//! operation fails. -//! -//! Repositions the offset of the open \a file to the specified \a offset, -//! relative to \a whence. \a whence must be one of `SEEK_SET`, `SEEK_CUR`, or -//! `SEEK_END`, and is interpreted in the usual way. -//! -//! \return The resulting offset in bytes from the beginning of the file, or -//! `-1` on failure. -FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence); - -//! \brief Truncates the given \a file to zero bytes in length. -//! -//! \return `true` on success, or `false`, and a message will be logged. -bool LoggingTruncateFile(FileHandle file); - -//! \brief Wraps `close()` or `CloseHandle()`, logging an error if the operation -//! fails. -//! -//! \return On success, `true` is returned. On failure, an error is logged and -//! `false` is returned. -bool LoggingCloseFile(FileHandle file); - -//! \brief Wraps `close()` or `CloseHandle()`, ensuring that it succeeds. -//! -//! If the underlying function fails, this function causes execution to -//! terminate without returning. -void CheckedCloseFile(FileHandle file); - -//! \brief Determines the size of a file. -//! -//! \param[in] file The handle to the file for which the size should be -//! retrieved. -//! -//! \return The size of the file. If an error occurs when attempting to -//! determine its size, returns `-1` with an error logged. -FileOffset LoggingFileSizeByHandle(FileHandle file); - -//! \brief Returns a FileHandle corresponding to the requested standard I/O -//! stream. -//! -//! The returned FileHandle should not be closed on POSIX, where it is -//! important to maintain valid file descriptors occupying the slots reserved -//! for these streams. If a need to close such a stream arises on POSIX, -//! `dup2()` should instead be used to replace the existing file descriptor with -//! one opened to `/dev/null`. See CloseStdinAndStdout(). -//! -//! \param[in] stdio_stream The requested standard I/O stream. -//! -//! \return A corresponding FileHandle on success. kInvalidFileHandle on error, -//! with a message logged. -FileHandle StdioFileHandle(StdioStream stdio_stream); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILE_IO_H_ diff --git a/Tools/Crashpad/include/util/file/file_reader.h b/Tools/Crashpad/include/util/file/file_reader.h deleted file mode 100644 index d44be1c142..0000000000 --- a/Tools/Crashpad/include/util/file/file_reader.h +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILE_READER_H_ -#define CRASHPAD_UTIL_FILE_FILE_READER_H_ - -#include <sys/types.h> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/file/file_seeker.h" - -namespace crashpad { - -//! \brief An interface to read to files and other file-like objects with -//! semantics matching the underlying platform (POSIX or Windows). -class FileReaderInterface : public virtual FileSeekerInterface { - public: - virtual ~FileReaderInterface() {} - - //! \brief Wraps ReadFile(), or provides an implementation with identical - //! semantics. - //! - //! \return The number of bytes actually read if the operation succeeded, - //! which may be `0` or any positive value less than or equal to \a size. - //! `-1` if the operation failed, with an error message logged. - virtual FileOperationResult Read(void* data, size_t size) = 0; - - //! \brief Wraps Read(), ensuring that the read succeeded and exactly \a size - //! bytes were read. - //! - //! Semantically, this behaves as LoggingReadFileExactly(). - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. Short reads are treated as failures. - bool ReadExactly(void* data, size_t size); -}; - -//! \brief A file reader backed by a FileHandle. -//! -//! FileReader requires users to provide a FilePath to open, but this class -//! accepts an already-open FileHandle instead. Like FileReader, this class may -//! read from a filesystem-based file, but unlike FileReader, this class is not -//! responsible for opening or closing the file. Users of this class must ensure -//! that the file handle is closed appropriately elsewhere. Objects of this -//! class may be used to read from file handles not associated with -//! filesystem-based files, although special attention should be paid to the -//! Seek() method, which may not function on file handles that do not refer to -//! disk-based files. -//! -//! This class is expected to be used when other code is responsible for -//! opening files and already provides file handles. -class WeakFileHandleFileReader : public FileReaderInterface { - public: - explicit WeakFileHandleFileReader(FileHandle file_handle); - ~WeakFileHandleFileReader() override; - - // FileReaderInterface: - FileOperationResult Read(void* data, size_t size) override; - - // FileSeekerInterface: - - //! \copydoc FileReaderInterface::Seek() - //! - //! \note This method is only guaranteed to function on file handles referring - //! to disk-based files. - FileOffset Seek(FileOffset offset, int whence) override; - - private: - void set_file_handle(FileHandle file_handle) { file_handle_ = file_handle; } - - FileHandle file_handle_; // weak - - // FileReader uses this class as its internal implementation, and it needs to - // be able to call set_file_handle(). FileReader cannot initialize a - // WeakFileHandleFileReader with a correct file descriptor at the time of - // construction because no file descriptor will be available until - // FileReader::Open() is called. - friend class FileReader; - - DISALLOW_COPY_AND_ASSIGN(WeakFileHandleFileReader); -}; - -//! \brief A file reader implementation that wraps traditional system file -//! operations on files accessed through the filesystem. -class FileReader : public FileReaderInterface { - public: - FileReader(); - ~FileReader() override; - - // FileReaderInterface: - - //! \brief Wraps LoggingOpenFileForRead(). - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. - //! - //! \note After a successful call, this method cannot be called again until - //! after Close(). - bool Open(const base::FilePath& path); - - //! \brief Wraps CheckedCloseHandle(). - //! - //! \note It is only valid to call this method on an object that has had a - //! successful Open() that has not yet been matched by a subsequent call - //! to this method. - void Close(); - - // FileReaderInterface: - - //! \copydoc FileReaderInterface::Read() - //! - //! \note It is only valid to call this method between a successful Open() and - //! a Close(). - FileOperationResult Read(void* data, size_t size) override; - - // FileSeekerInterface: - - //! \copydoc FileReaderInterface::Seek() - //! - //! \note It is only valid to call this method between a successful Open() and - //! a Close(). - FileOffset Seek(FileOffset offset, int whence) override; - - private: - ScopedFileHandle file_; - WeakFileHandleFileReader weak_file_handle_file_reader_; - - DISALLOW_COPY_AND_ASSIGN(FileReader); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILE_READER_H_ diff --git a/Tools/Crashpad/include/util/file/file_seeker.h b/Tools/Crashpad/include/util/file/file_seeker.h deleted file mode 100644 index a7cff90807..0000000000 --- a/Tools/Crashpad/include/util/file/file_seeker.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILE_SEEKER_H_ -#define CRASHPAD_UTIL_FILE_FILE_SEEKER_H_ - -#include "util/file/file_io.h" - -namespace crashpad { - -//! \brief An interface to seek in files and other file-like objects with -//! semantics matching the underlying platform (POSIX or Windows). -class FileSeekerInterface { - public: - //! \brief Wraps LoggingSeekFile() or provides an alternate implementation - //! with identical semantics. - //! - //! \return The return value of LoggingSeekFile(). `-1` on failure, - //! with an error message logged. - virtual FileOffset Seek(FileOffset offset, int whence) = 0; - - //! \brief Wraps Seek(), using `SEEK_CUR` to obtain the file’s current - //! position. - //! - //! \return The file’s current position on success. `-1` on failure, with an - //! error message logged. - FileOffset SeekGet(); - - //! \brief Wraps Seek(), using `SEEK_SET`, ensuring that the seek succeeded - //! and the file is positioned as desired. - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. A failure to reposition the file as desired is - //! treated as a failure. - bool SeekSet(FileOffset offset); - - protected: - ~FileSeekerInterface() {} -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILE_SEEKER_H_ diff --git a/Tools/Crashpad/include/util/file/file_writer.h b/Tools/Crashpad/include/util/file/file_writer.h deleted file mode 100644 index ed261ec544..0000000000 --- a/Tools/Crashpad/include/util/file/file_writer.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILE_WRITER_H_ -#define CRASHPAD_UTIL_FILE_FILE_WRITER_H_ - -#include <sys/types.h> - -#include <vector> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/file/file_seeker.h" - -namespace crashpad { - -//! \brief A version of `iovec` with a `const` #iov_base field. -//! -//! This structure is intended to be used for write operations. -// -// Type compatibility with iovec is tested with static assertions in the -// implementation file. -struct WritableIoVec { - //! \brief The base address of a memory region for output. - const void* iov_base; - - //! \brief The size of the memory pointed to by #iov_base. - size_t iov_len; -}; - -//! \brief An interface to write to files and other file-like objects with -//! semantics matching the underlying platform (POSIX or Windows). -class FileWriterInterface : public virtual FileSeekerInterface { - public: - virtual ~FileWriterInterface() {} - - //! \brief Wraps LoggingWriteFile(), or provides an implementation with - //! identical semantics. - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. - virtual bool Write(const void* data, size_t size) = 0; - - //! \brief Wraps `writev()` on POSIX or provides an alternate implementation - //! with identical semantics. This method will write entire buffers, - //! continuing after a short write or after being interrupted. On - //! non-POSIX this is a simple wrapper around Write(). - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. - //! - //! \note The contents of \a iovecs are undefined when this method returns. - virtual bool WriteIoVec(std::vector<WritableIoVec>* iovecs) = 0; -}; - -//! \brief A file writer backed by a FileHandle. -//! -//! FileWriter requires users to provide a FilePath to open, but this class -//! accepts an already-open FileHandle instead. Like FileWriter, this class may -//! write to a filesystem-based file, but unlike FileWriter, this class is not -//! responsible for creating or closing the file. Users of this class must -//! ensure that the file handle is closed appropriately elsewhere. Objects of -//! this class may be used to write to file handles not associated with -//! filesystem-based files, although special attention should be paid to the -//! Seek() method, which may not function on file handles that do not refer to -//! disk-based files. -//! -//! This class is expected to be used when other code is responsible for -//! creating files and already provides file handles. -class WeakFileHandleFileWriter : public FileWriterInterface { - public: - explicit WeakFileHandleFileWriter(FileHandle file_handle); - ~WeakFileHandleFileWriter() override; - - // FileWriterInterface: - bool Write(const void* data, size_t size) override; - bool WriteIoVec(std::vector<WritableIoVec>* iovecs) override; - - // FileSeekerInterface: - - //! \copydoc FileWriterInterface::Seek() - //! - //! \note This method is only guaranteed to function on file handles referring - //! to disk-based files. - FileOffset Seek(FileOffset offset, int whence) override; - - private: - void set_file_handle(FileHandle file_handle) { file_handle_ = file_handle; } - - FileHandle file_handle_; // weak - - // FileWriter uses this class as its internal implementation, and it needs to - // be able to call set_file_handle(). FileWriter cannot initialize a - // WeakFileHandleFileWriter with a correct file descriptor at the time of - // construction because no file descriptor will be available until - // FileWriter::Open() is called. - friend class FileWriter; - - DISALLOW_COPY_AND_ASSIGN(WeakFileHandleFileWriter); -}; - -//! \brief A file writer implementation that wraps traditional system file -//! operations on files accessed through the filesystem. -class FileWriter : public FileWriterInterface { - public: - FileWriter(); - ~FileWriter() override; - - // FileWriterInterface: - - //! \brief Wraps LoggingOpenFileForWrite(). - //! - //! \return `true` if the operation succeeded, `false` if it failed, with an - //! error message logged. - //! - //! \note After a successful call, this method cannot be called again until - //! after Close(). - bool Open(const base::FilePath& path, - FileWriteMode write_mode, - FilePermissions permissions); - - //! \brief Wraps CheckedCloseHandle(). - //! - //! \note It is only valid to call this method on an object that has had a - //! successful Open() that has not yet been matched by a subsequent call - //! to this method. - void Close(); - - // FileWriterInterface: - - //! \copydoc FileWriterInterface::Write() - //! - //! \note It is only valid to call this method between a successful Open() and - //! a Close(). - bool Write(const void* data, size_t size) override; - - //! \copydoc FileWriterInterface::WriteIoVec() - //! - //! \note It is only valid to call this method between a successful Open() and - //! a Close(). - bool WriteIoVec(std::vector<WritableIoVec>* iovecs) override; - - // FileSeekerInterface: - - //! \copydoc FileWriterInterface::Seek() - //! - //! \note It is only valid to call this method between a successful Open() and - //! a Close(). - FileOffset Seek(FileOffset offset, int whence) override; - - private: - ScopedFileHandle file_; - WeakFileHandleFileWriter weak_file_handle_file_writer_; - - DISALLOW_COPY_AND_ASSIGN(FileWriter); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILE_WRITER_H_ diff --git a/Tools/Crashpad/include/util/file/filesystem.h b/Tools/Crashpad/include/util/file/filesystem.h deleted file mode 100644 index 27a4d1de6f..0000000000 --- a/Tools/Crashpad/include/util/file/filesystem.h +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILESYSTEM_H_ -#define CRASHPAD_UTIL_FILE_FILESYSTEM_H_ - -#include <time.h> - -#include "base/files/file_path.h" -#include "util/file/file_io.h" - -namespace crashpad { - -//! \brief Determines the modification time for a file, directory, or symbolic -//! link, logging a message on failure. -//! -//! \param[in] path The file to get the modification time for. -//! \param[out] mtime The modification time as seconds since the POSIX Epoch. -//! \return `true` on success. `false` on failure with a message logged. -bool FileModificationTime(const base::FilePath& path, timespec* mtime); - -//! \brief Creates a directory, logging a message on failure. -//! -//! \param[in] path The path to the directory to create. -//! \param[in] permissions The permissions to use if the directory is created. -//! \param[in] may_reuse If `true`, this function will return `true` if a -//! directory or symbolic link to a directory with path \a path already -//! exists. If the directory already exists, it's permissions may differ -//! from \a permissions. -//! \return `true` if the directory is successfully created or it already -//! existed and \a may_reuse is `true`. Otherwise, `false`. -bool LoggingCreateDirectory(const base::FilePath& path, - FilePermissions permissions, - bool may_reuse); - -//! \brief Moves a file, symbolic link, or directory, logging a message on -//! failure. -//! -//! \a source must exist and refer to a file, symbolic link, or directory. -//! -//! \a source and \a dest must be on the same filesystem. -//! -//! If \a dest exists, it may be overwritten: -//! -//! If \a dest exists and refers to a file or to a live or dangling symbolic -//! link to a file, it will be overwritten if \a source also refers to a file or -//! to a live or dangling symbolic link to a file or directory. -//! -//! On POSIX, if \a dest refers to a directory, it will be overwritten only if -//! it is empty and \a source also refers to a directory. -//! -//! On Windows, if \a dest refers to a directory or to a live or dangling -//! symbolic link to a directory, it will not be overwritten. -//! -//! \param[in] source The path to the file to be moved. -//! \param[in] dest The new path for the file. -//! \return `true` on success. `false` on failure with a message logged. -bool MoveFileOrDirectory(const base::FilePath& source, - const base::FilePath& dest); - -//! \brief Determines if a path refers to a regular file, logging a message on -//! failure. -//! -//! On POSIX, this function returns `true` if \a path refers to a file that is -//! not a symbolic link, directory, or other kind of special file. -//! -//! On Windows, this function returns `true` if \a path refers to a file that -//! is not a symbolic link or directory. -//! -//! \param[in] path The path to the file to check. -//! \return `true` if the file exists and is a regular file. Otherwise `false`. -bool IsRegularFile(const base::FilePath& path); - -//! \brief Determines if a path refers to a directory, logging a message on -//! failure. -//! -//! \param[in] path The path to check. -//! \param[in] allow_symlinks Whether to allow the final component in the path -//! to be a symbolic link to a directory. -//! \return `true` if the path exists and is a directory. Otherwise `false`. -bool IsDirectory(const base::FilePath& path, bool allow_symlinks); - -//! \brief Removes a file or a symbolic link to a file or directory, logging a -//! message on failure. -//! -//! \param[in] path The path to the file to remove. -//! \return `true` on success. `false` on failure with a message logged. -bool LoggingRemoveFile(const base::FilePath& path); - -//! \brief Non-recurseively removes an empty directory, logging a message on -//! failure. -//! -//! This function will not remove symbolic links to directories. -//! -//! \param[in] path The to the directory to remove. -//! \return `true` if the directory was removed. Otherwise, `false`. -bool LoggingRemoveDirectory(const base::FilePath& path); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILESYSTEM_H_ diff --git a/Tools/Crashpad/include/util/file/scoped_remove_file.h b/Tools/Crashpad/include/util/file/scoped_remove_file.h deleted file mode 100644 index de4af0d445..0000000000 --- a/Tools/Crashpad/include/util/file/scoped_remove_file.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_SCOPED_REMOVE_FILE_H_ -#define CRASHPAD_UTIL_FILE_SCOPED_REMOVE_FILE_H_ - -#include "base/files/file_path.h" -#include "base/scoped_generic.h" - -namespace crashpad { - -struct ScopedRemoveFileTraits { - static base::FilePath InvalidValue() { return base::FilePath(); } - static void Free(const base::FilePath& path); -}; - -using ScopedRemoveFile = - base::ScopedGeneric<base::FilePath, ScopedRemoveFileTraits>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_SCOPED_REMOVE_FILE_H_ diff --git a/Tools/Crashpad/include/util/file/string_file.h b/Tools/Crashpad/include/util/file/string_file.h deleted file mode 100644 index 313310e678..0000000000 --- a/Tools/Crashpad/include/util/file/string_file.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_STRING_FILE_H_ -#define CRASHPAD_UTIL_FILE_STRING_FILE_H_ - -#include <sys/types.h> - -#include <string> - -#include "base/macros.h" -#include "base/numerics/safe_math.h" -#include "util/file/file_io.h" -#include "util/file/file_reader.h" -#include "util/file/file_writer.h" - -namespace crashpad { - -//! \brief A file reader and writer backed by a virtual file, as opposed to a -//! file on disk or other operating system file descriptor-based file. -//! -//! The virtual file is a buffer in memory. This class is convenient for use -//! with other code that normally expects to read or write files, when it is -//! impractical or inconvenient to read or write a file. It is expected that -//! tests, in particular, will benefit from using this class. -class StringFile : public FileReaderInterface, public FileWriterInterface { - public: - StringFile(); - ~StringFile() override; - - //! \brief Returns a string containing the virtual file’s contents. - const std::string& string() const { return string_; } - - //! \brief Sets the virtual file’s contents to \a string, and resets its file - //! position to `0`. - void SetString(const std::string& string); - - //! \brief Resets the virtual file’s contents to be empty, and resets its file - //! position to `0`. - void Reset(); - - // FileReaderInterface: - FileOperationResult Read(void* data, size_t size) override; - - // FileWriterInterface: - bool Write(const void* data, size_t size) override; - bool WriteIoVec(std::vector<WritableIoVec>* iovecs) override; - - // FileSeekerInterface: - FileOffset Seek(FileOffset offset, int whence) override; - - private: - //! \brief The virtual file’s contents. - std::string string_; - - //! \brief The file offset of the virtual file. - //! - //! \note This is stored in a `size_t` to match the characteristics of - //! #string_, the `std::string` used to store the virtual file’s contents. - //! This type will have different characteristics than the `off_t` used to - //! report file offsets. The implementation must take care when converting - //! between these distinct types. - base::CheckedNumeric<size_t> offset_; - - DISALLOW_COPY_AND_ASSIGN(StringFile); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_STRING_FILE_H_ diff --git a/Tools/Crashpad/include/util/linux/address_types.h b/Tools/Crashpad/include/util/linux/address_types.h deleted file mode 100644 index fb17500d9b..0000000000 --- a/Tools/Crashpad/include/util/linux/address_types.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_ADDRESS_TYPES_H_ -#define CRASHPAD_UTIL_LINUX_ADDRESS_TYPES_H_ - -#include <stdint.h> - -namespace crashpad { - -//! \brief Type used to represent an address in a process, potentially across -//! bitness. -using LinuxVMAddress = uint64_t; - -//! \brief Type used to represent the size of a memory range (with a -//! LinuxVMAddress), potentially across bitness. -using LinuxVMSize = uint64_t; - -//! \brief Type used to represent an offset from a LinuxVMAddress, potentially -//! across bitness. -using LinuxVMOffset = int64_t; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_ADDRESS_TYPES_H_ diff --git a/Tools/Crashpad/include/util/linux/auxiliary_vector.h b/Tools/Crashpad/include/util/linux/auxiliary_vector.h deleted file mode 100644 index 65d0e3cf74..0000000000 --- a/Tools/Crashpad/include/util/linux/auxiliary_vector.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_AUXILIARY_VECTOR_H_ -#define CRASHPAD_UTIL_LINUX_AUXILIARY_VECTOR_H_ - -#include <sys/types.h> - -#include <map> - -#include "base/logging.h" -#include "base/macros.h" -#include "util/misc/reinterpret_bytes.h" - -namespace crashpad { - -//! \brief Read the auxiliary vector for a target process. -class AuxiliaryVector { - public: - AuxiliaryVector(); - ~AuxiliaryVector(); - - //! \brief Initializes this object with the auxiliary vector for the process - //! with process ID \a pid. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. - //! - //! \param[in] pid The process ID of a target process. - //! \param[in] is_64_bit Whether the target process is 64-bit. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Initialize(pid_t pid, bool is_64_bit); - - //! \brief Retrieve a value from the vector. - //! - //! \param[in] type Specifies which value should be retrieved. The possible - //! values for this parameter are defined by `<linux/auxvec.h>`. - //! \param[out] value The value, casted to an appropriate type, if found. - //! \return `true` if the value is found. - template <typename V> - bool GetValue(uint64_t type, V* value) const { - auto iter = values_.find(type); - if (iter == values_.end()) { - LOG(ERROR) << "value not found"; - return false; - } - return ReinterpretBytes(iter->second, value); - } - - protected: - std::map<uint64_t, uint64_t> values_; - - private: - template <typename ULong> - bool Read(pid_t pid); - - DISALLOW_COPY_AND_ASSIGN(AuxiliaryVector); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_AUXILIARY_VECTOR_H_ diff --git a/Tools/Crashpad/include/util/linux/checked_linux_address_range.h b/Tools/Crashpad/include/util/linux/checked_linux_address_range.h deleted file mode 100644 index 6bf86ec5a9..0000000000 --- a/Tools/Crashpad/include/util/linux/checked_linux_address_range.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_CHECKED_LINUX_ADDRESS_RANGE_H_ -#define CRASHPAD_UTIL_LINUX_CHECKED_LINUX_ADDRESS_RANGE_H_ - -#include "util/linux/address_types.h" -#include "util/numeric/checked_address_range.h" - -namespace crashpad { - -//! \brief Ensures that a range, composed of a base and a size, does not -//! overflow the pointer type of the process it describes a range in. -//! -//! This class checks bases of type #LinuxVMAddress and sizes of type -//! #LinuxVMSize against a process whose pointer type is either 32 or 64 -//! bits wide. -//! -//! Aside from varying the overall range on the basis of a process’ pointer type -//! width, this class functions very similarly to CheckedRange. -using CheckedLinuxAddressRange = - internal::CheckedAddressRangeGeneric<LinuxVMAddress, LinuxVMSize>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_CHECKED_LINUX_ADDRESS_RANGE_H_ diff --git a/Tools/Crashpad/include/util/linux/direct_ptrace_connection.h b/Tools/Crashpad/include/util/linux/direct_ptrace_connection.h deleted file mode 100644 index f1d7ab5fb8..0000000000 --- a/Tools/Crashpad/include/util/linux/direct_ptrace_connection.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_DIRECT_PTRACE_CONNECTION_H_ -#define CRASHPAD_UTIL_LINUX_DIRECT_PTRACE_CONNECTION_H_ - -#include <sys/types.h> - -#include <memory> -#include <vector> - -#include "base/macros.h" -#include "util/linux/ptrace_connection.h" -#include "util/linux/ptracer.h" -#include "util/linux/scoped_ptrace_attach.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Manages a direct `ptrace` connection to a process. -//! -//! This class is used when the current process has `ptrace` capabilities for -//! the target process. -class DirectPtraceConnection : public PtraceConnection { - public: - DirectPtraceConnection(); - ~DirectPtraceConnection(); - - //! \brief Initializes this connection for the process whose process ID is - //! \a pid. - //! - //! The main thread of the process is automatically attached by this call. - //! - //! \param[in] pid The process ID of the process to connect to. - //! \return `true` on success. `false` on failure with a message logged. - bool Initialize(pid_t pid); - - // PtraceConnection: - - pid_t GetProcessID() override; - bool Attach(pid_t tid) override; - bool Is64Bit() override; - bool GetThreadInfo(pid_t tid, ThreadInfo* info) override; - - private: - std::vector<std::unique_ptr<ScopedPtraceAttach>> attachments_; - pid_t pid_; - Ptracer ptracer_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(DirectPtraceConnection); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_DIRECT_PTRACE_CONNECTION_H_ diff --git a/Tools/Crashpad/include/util/linux/exception_handler_client.h b/Tools/Crashpad/include/util/linux/exception_handler_client.h deleted file mode 100644 index a60b06562c..0000000000 --- a/Tools/Crashpad/include/util/linux/exception_handler_client.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_CLIENT_H_ -#define CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_CLIENT_H_ - -#include <sys/types.h> - -#include "base/macros.h" -#include "util/linux/exception_handler_protocol.h" - -namespace crashpad { - -//! A client for an ExceptionHandlerServer -class ExceptionHandlerClient { - public: - //! \brief Constructs this object. - //! - //! \param[in] sock A socket connected to an ExceptionHandlerServer. - explicit ExceptionHandlerClient(int sock); - - ~ExceptionHandlerClient(); - - //! \brief Request a crash dump from the ExceptionHandlerServer. - //! - //! This method blocks until the crash dump is complete. - //! - //! \param[in] info Information about this client. - //! \return 0 on success or an error code on failure. - int RequestCrashDump(const ClientInformation& info); - - //! \brief Uses `prctl(PR_SET_PTRACER, ...)` to set the process with - //! process ID \a pid as the ptracer for this process. - //! - //! \param[in] pid The process ID of the process to be set as this process' - //! ptracer. - //! \return 0 on success or an error code on failure. - int SetPtracer(pid_t pid); - - //! \brief Enables or disables SetPtracer(). - //! \param[in] can_set_ptracer Whether SetPtracer should be enabled. - void SetCanSetPtracer(bool can_set_ptracer); - - private: - int SendCrashDumpRequest(const ClientInformation& info); - int WaitForCrashDumpComplete(); - - int server_sock_; - pid_t ptracer_; - bool can_set_ptracer_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerClient); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_CLIENT_H_ diff --git a/Tools/Crashpad/include/util/linux/exception_handler_protocol.h b/Tools/Crashpad/include/util/linux/exception_handler_protocol.h deleted file mode 100644 index 3f71abf796..0000000000 --- a/Tools/Crashpad/include/util/linux/exception_handler_protocol.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_ -#define CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_ - -#include <errno.h> -#include <stdint.h> -#include <sys/types.h> - -#include "util/file/file_io.h" -#include "util/misc/address_types.h" - -namespace crashpad { - -#pragma pack(push, 1) - -//! \brief The type used for error reporting. -using Errno = int32_t; -static_assert(sizeof(Errno) >= sizeof(errno), "Errno type is too small"); - -//! \brief A boolean status suitable for communication between processes. -enum Bool : char { kBoolFalse, kBoolTrue }; - -//! \brief Information about a client registered with an ExceptionHandlerServer. -struct ClientInformation { - //! \brief The address in the client's address space of an - //! ExceptionInformation struct. - VMAddress exception_information_address; -}; - -//! \brief The message passed from client to server. -struct ClientToServerMessage { - static constexpr int32_t kVersion = 1; - - //! \brief Indicates what message version is being used. - int32_t version = kVersion; - - enum Type : uint32_t { - //! \brief Used to request a crash dump for the sending client. - kCrashDumpRequest - } type; - - union { - //! \brief Valid for type == kCrashDumpRequest - ClientInformation client_info; - }; -}; - -//! \brief The message passed from server to client. -struct ServerToClientMessage { - enum Type : uint32_t { - //! \brief Indicates that the client should fork a PtraceBroker process. - kTypeForkBroker, - - //! \brief Inidicates that the client should set allow the handler to trace - //! it using PR_SET_PTRACER. - kTypeSetPtracer, - - //! \brief Indicates that the handler has completed a requested crash dump. - kTypeCrashDumpComplete, - - //! \brief Indicicates that the handler was unable to produce a crash dump. - kTypeCrashDumpFailed - } type; - - //! \brief The handler's process ID. Valid for kTypeSetPtracer. - pid_t pid; -}; - -#pragma pack(pop) - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_ diff --git a/Tools/Crashpad/include/util/linux/exception_information.h b/Tools/Crashpad/include/util/linux/exception_information.h deleted file mode 100644 index d7dbe529e4..0000000000 --- a/Tools/Crashpad/include/util/linux/exception_information.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_EXCEPTION_INFORMATION_H_ -#define CRASHPAD_UTIL_LINUX_EXCEPTION_INFORMATION_H_ - -#include <sys/types.h> - -#include "util/linux/address_types.h" - -namespace crashpad { - -#pragma pack(push, 1) - -//! \brief Structure read out of the client process by the crash handler when an -//! exception occurs. -struct ExceptionInformation { - //! \brief The address of the `siginfo_t` passed to the signal handler in the - //! crashed process. - LinuxVMAddress siginfo_address; - - //! \brief The address of the `ucontext_t` passed to the signal handler in the - //! crashed process. - LinuxVMAddress context_address; - - //! \brief The thread ID of the thread which received the signal. - pid_t thread_id; -}; - -#pragma pack(pop) - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_EXCEPTION_INFORMATION_H_ diff --git a/Tools/Crashpad/include/util/linux/memory_map.h b/Tools/Crashpad/include/util/linux/memory_map.h deleted file mode 100644 index 6e5b40c8de..0000000000 --- a/Tools/Crashpad/include/util/linux/memory_map.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_MEMORY_MAP_H_ -#define CRASHPAD_UTIL_LINUX_MEMORY_MAP_H_ - -#include <sys/types.h> - -#include <string> -#include <vector> - -#include "util/linux/address_types.h" -#include "util/linux/checked_linux_address_range.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Accesses information about mapped memory in another process. -//! -//! The target process must be stopped to guarantee correct mappings. If the -//! target process is not stopped, mappings may be invalid after the return from -//! Initialize(), and even mappings existing at the time Initialize() was called -//! may not be found. -class MemoryMap { - public: - //! \brief Information about a mapped region of memory. - struct Mapping { - Mapping(); - bool Equals(const Mapping& other) const; - - std::string name; - CheckedLinuxAddressRange range; - off_t offset; - dev_t device; - ino_t inode; - bool readable; - bool writable; - bool executable; - bool shareable; - }; - - MemoryMap(); - ~MemoryMap(); - - //! \brief Initializes this object with information about the mapped memory - //! regions in the process whose ID is \a pid. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. This method may only be called once. - //! - //! \param[in] pid The process ID to obtain information for. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Initialize(pid_t pid); - - //! \return The Mapping containing \a address or `nullptr` if no match is - //! found. The caller does not take ownership of this object. It is scoped - //! to the lifetime of the MemoryMap object that it was obtained from. - const Mapping* FindMapping(LinuxVMAddress address) const; - - //! \return The Mapping with the lowest base address whose name is \a name or - //! `nullptr` if no match is found. The caller does not take ownership of - //! this object. It is scoped to the lifetime of the MemoryMap object that - //! it was obtained from. - const Mapping* FindMappingWithName(const std::string& name) const; - - //! \brief Find the first Mapping in a series of mappings for the same file. - //! - //! Executables and libaries are typically loaded into several mappings with - //! varying permissions for different segments. This method searches for the - //! mapping with the highest address at or below \a mapping, which maps the - //! same file as \a mapping from file offset 0. - //! - //! If \a mapping is not found, `nullptr` is returned. If \a mapping is found - //! but does not map a file, \a mapping is returned. - //! - //! \param[in] mapping A Mapping whose series to find the start of. - //! \return The first Mapping in the series or `nullptr` on failure with a - //! message logged. - const Mapping* FindFileMmapStart(const Mapping& mapping) const; - - private: - std::vector<Mapping> mappings_; - InitializationStateDcheck initialized_; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_MEMORY_MAP_H_ diff --git a/Tools/Crashpad/include/util/linux/proc_stat_reader.h b/Tools/Crashpad/include/util/linux/proc_stat_reader.h deleted file mode 100644 index 4cad97c59f..0000000000 --- a/Tools/Crashpad/include/util/linux/proc_stat_reader.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_ -#define CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_ - -#include <stddef.h> -#include <sys/time.h> -#include <sys/types.h> - -#include <string> - -#include "base/macros.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Reads the /proc/[pid]/stat file for a thread. -class ProcStatReader { - public: - ProcStatReader(); - ~ProcStatReader(); - - //! \brief Initializes the reader. - //! - //! This method must be successfully called before calling any other. - //! - //! \param[in] tid The thread ID to read the stat file for. - bool Initialize(pid_t tid); - - //! \brief Determines the time the thread has spent executing in user mode. - //! - //! \param[out] user_time The time spent executing in user mode. - //! - //! \return `true` on success, with \a user_time set. Otherwise, `false` with - //! a message logged. - bool UserCPUTime(timeval* user_time) const; - - //! \brief Determines the time the thread has spent executing in system mode. - //! - //! \param[out] system_time The time spent executing in system mode. - //! - //! \return `true` on success, with \a system_time set. Otherwise, `false` - //! with a message logged. - bool SystemCPUTime(timeval* system_time) const; - - //! \brief Determines the target thread’s start time. - //! - //! \param[out] start_time The time that the thread started. - //! - //! \return `true` on success, with \a start_time set. Otherwise, `false` with - //! a message logged. - bool StartTime(timeval* start_time) const; - - private: - bool ReadFile(pid_t tid); - bool FindColumn(int index, const char** column) const; - bool ReadTimeAtIndex(int index, timeval* time_val) const; - - std::string contents_; - size_t third_column_position_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ProcStatReader); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_ diff --git a/Tools/Crashpad/include/util/linux/ptrace_broker.h b/Tools/Crashpad/include/util/linux/ptrace_broker.h deleted file mode 100644 index 96cbee5894..0000000000 --- a/Tools/Crashpad/include/util/linux/ptrace_broker.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_PTRACE_BROKER_H_ -#define CRASHPAD_UTIL_LINUX_PTRACE_BROKER_H_ - -#include <errno.h> -#include <stdint.h> -#include <sys/types.h> - -#include "base/macros.h" -#include "util/linux/exception_handler_protocol.h" -#include "util/linux/ptrace_connection.h" -#include "util/linux/ptracer.h" -#include "util/linux/scoped_ptrace_attach.h" -#include "util/linux/thread_info.h" -#include "util/misc/address_types.h" - -namespace crashpad { - -//! \brief Implements a PtraceConnection over a socket. -//! -//! This class is the server half of the connection. The broker should be run -//! in a process with `ptrace` capabilities for the target process and may run -//! in a compromised context. -class PtraceBroker { - public: -#pragma pack(push, 1) - //! \brief A request sent to a PtraceBroker from a PtraceClient. - struct Request { - static constexpr uint16_t kVersion = 1; - - //! \brief The version number for this Request. - uint16_t version = kVersion; - - //! \brief The type of request to serve. - enum Type : uint16_t { - //! \brief `ptrace`-attach the specified thread ID. Responds with - //! kBoolTrue on success, otherwise kBoolFalse, followed by an Errno. - kTypeAttach, - - //! \brief Responds with kBoolTrue if the target process is 64-bit. - //! Otherwise, kBoolFalse. - kTypeIs64Bit, - - //! \brief Responds with a GetThreadInfoResponse containing a ThreadInfo - //! for the specified thread ID. If an error occurs, - //! GetThreadInfoResponse::success is set to kBoolFalse and is - //! followed by an Errno. - kTypeGetThreadInfo, - - //! \brief Reads memory from the attached process. The data is returned in - //! a series of messages. Each message begins with a VMSize indicating - //! the number of bytes being returned in this message, followed by - //! the requested bytes. The broker continues to send messages until - //! either all of the requested memory has been sent or an error - //! occurs, in which case it sends a message containing a VMSize equal - //! to zero, followed by an Errno. - kTypeReadMemory, - - //! \brief Causes the broker to return from Run(), detaching all attached - //! threads. Does not respond. - kTypeExit - } type; - - //! \brief The thread ID associated with this request. Valid for kTypeAttach, - //! kTypeGetThreadInfo, and kTypeReadMemory. - pid_t tid; - - //! \brief Specifies the memory region to read for a kTypeReadMemory request. - struct { - //! \brief The base address of the memory region. - VMAddress base; - - //! \brief The size of the memory region. - VMSize size; - } iov; - }; - - //! \brief The response sent for a Request with type kTypeGetThreadInfo. - struct GetThreadInfoResponse { - //! \brief Information about the specified thread. Only valid if #success - //! is kBoolTrue. - ThreadInfo info; - - //! \brief Specifies the success or failure of this call. - Bool success; - }; -#pragma pack(pop) - - //! \brief Constructs this object. - //! - //! \param[in] sock A socket on which to read requests from a connected - //! PtraceClient. Does not take ownership of the socket. - //! \param[in] is_64_bit Whether this broker should be configured to trace a - //! 64-bit process. - PtraceBroker(int sock, bool is_64_bit); - - ~PtraceBroker(); - - //! \brief Begin serving requests on the configured socket. - //! - //! This method returns when a PtraceBrokerRequest with type kTypeExit is - //! received or an error is encountered on the socket. - //! - //! This method calls `sbrk`, which may break other memory management tools, - //! such as `malloc`. - //! - //! \return 0 if Run() exited due to an exit request. Otherwise an error code. - int Run(); - - private: - int RunImpl(); - int SendMemory(pid_t pid, VMAddress address, VMSize size); - bool AllocateAttachments(); - void ReleaseAttachments(); - - Ptracer ptracer_; - ScopedPtraceAttach* attachments_; - size_t attach_count_; - size_t attach_capacity_; - int sock_; - - DISALLOW_COPY_AND_ASSIGN(PtraceBroker); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_PTRACE_BROKER_H_ diff --git a/Tools/Crashpad/include/util/linux/ptrace_client.h b/Tools/Crashpad/include/util/linux/ptrace_client.h deleted file mode 100644 index 397c891f78..0000000000 --- a/Tools/Crashpad/include/util/linux/ptrace_client.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_PTRACE_CLIENT_H_ -#define CRASHPAD_UTIL_LINUX_PTRACE_CLIENT_H_ - -#include <sys/types.h> - -#include "base/macros.h" -#include "util/linux/ptrace_connection.h" -#include "util/misc/address_types.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Implements a PtraceConnection over a socket. -//! -//! This class forms the client half of the connection and is typically used -//! when the current process does not have `ptrace` capabilities on the target -//! process. It should be created with a socket connected to a PtraceBroker. -class PtraceClient : public PtraceConnection { - public: - PtraceClient(); - ~PtraceClient(); - - //! \brief Initializes this object. - //! - //! This method must be successfully called before any other method in this - //! class. - //! - //! \param[in] sock A socket connected to a PtraceBroker. Does not take - //! ownership of the socket. - //! \param[in] pid The process ID of the process to form a PtraceConnection - //! with. - //! \return `true` on success. `false` on failure with a message logged. - bool Initialize(int sock, pid_t pid); - - //! \brief Copies memory from the target process into a caller-provided buffer - //! in the current process. - //! - //! TODO(jperaza): In order for this to be usable, PtraceConnection will need - //! to surface it, possibly by inheriting from ProcessMemory, or providing a - //! method to return a ProcessMemory*. - //! - //! \param[in] address The address, in the target process' address space, of - //! the memory region to copy. - //! \param[in] size The size, in bytes, of the memory region to copy. - //! \a buffer must be at least this size. - //! \param[out] buffer The buffer into which the contents of the other - //! process' memory will be copied. - //! - //! \return `true` on success, with \a buffer filled appropriately. `false` on - //! failure, with a message logged. - bool Read(VMAddress address, size_t size, void* buffer); - - // PtraceConnection: - - pid_t GetProcessID() override; - bool Attach(pid_t tid) override; - bool Is64Bit() override; - bool GetThreadInfo(pid_t tid, ThreadInfo* info) override; - - private: - int sock_; - pid_t pid_; - bool is_64_bit_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(PtraceClient); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_PTRACE_CLIENT_H_ diff --git a/Tools/Crashpad/include/util/linux/ptrace_connection.h b/Tools/Crashpad/include/util/linux/ptrace_connection.h deleted file mode 100644 index d09cd20de5..0000000000 --- a/Tools/Crashpad/include/util/linux/ptrace_connection.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_PTRACE_CONNECTION_H_ -#define CRASHPAD_UTIL_LINUX_PTRACE_CONNECTION_H_ - -#include <sys/types.h> - -#include "util/linux/thread_info.h" - -namespace crashpad { - -//! \brief Provides an interface for making `ptrace` requests against a process -//! and its threads. -class PtraceConnection { - public: - virtual ~PtraceConnection() {} - - //! \brief Returns the process ID of the connected process. - virtual pid_t GetProcessID() = 0; - - //! \brief Adds a new thread to this connection. - //! - //! \param[in] tid The thread ID of the thread to attach. - //! \return `true` on success. `false` on failure with a message logged. - virtual bool Attach(pid_t tid) = 0; - - //! \brief Returns `true` if connected to a 64-bit process. - virtual bool Is64Bit() = 0; - - //! \brief Retrieves a ThreadInfo for a target thread. - //! - //! \param[in] tid The thread ID of the target thread. - //! \param[out] info Information about the thread. - //! \return `true` on success. `false` on failure with a message logged. - virtual bool GetThreadInfo(pid_t tid, ThreadInfo* info) = 0; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_PTRACE_CONNECTION_H_ diff --git a/Tools/Crashpad/include/util/linux/ptracer.h b/Tools/Crashpad/include/util/linux/ptracer.h deleted file mode 100644 index daa7a01f98..0000000000 --- a/Tools/Crashpad/include/util/linux/ptracer.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_PTRACER_H_ -#define CRASHPAD_UTIL_LINUX_PTRACER_H_ - -#include <sys/types.h> - -#include "base/macros.h" -#include "util/linux/address_types.h" -#include "util/linux/thread_info.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -//! \brief Provides an architecturally agnostic interface for collecting -//! information with `ptrace`. -//! -//! A ptracer is configured for a particular bitness. It is an error to make any -//! calls via this object against a thread whose bitness does not match the -//! bitness this object was initialized with. -class Ptracer { - public: - //! \brief Constructs this object with a pre-determined bitness. - //! - //! \param[in] is_64_bit `true` if this object is to be configured for 64-bit. - //! \param[in] can_log Whether methods in this class can log error messages. - Ptracer(bool is_64_bit, bool can_log); - - //! \brief Constructs this object without a pre-determined bitness. - //! - //! Initialize() must be successfully called before making any other calls on - //! this object. - //! - //! \param[in] can_log Whether methods in this class can log error messages. - explicit Ptracer(bool can_log); - - ~Ptracer(); - - //! \brief Initializes this object to the bitness of the process whose process - //! ID is \a pid. - //! - //! \param[in] pid The process ID of the process to initialize with. - //! \return `true` on success. `false` on failure with a message logged, if - //! enabled. - bool Initialize(pid_t pid); - - //! \brief Return `true` if this object is configured for 64-bit. - bool Is64Bit(); - - //! \brief Uses `ptrace` to collect information about the thread with thread - //! ID \a tid. - //! - //! The target thread should be attached before calling this method. - //! \see ScopedPtraceAttach - //! - //! \param[in] tid The thread ID of the thread to collect information for. - //! \param[out] info A ThreadInfo for the thread. - //! \return `true` on success. `false` on failure with a message logged, if - //! enabled. - bool GetThreadInfo(pid_t tid, ThreadInfo* info); - - //! \brief Uses `ptrace` to read memory from the process with process ID \a - //! pid. - //! - //! The target process should already be attached before calling this method. - //! \see ScopedPtraceAttach - //! - //! \param[in] pid The process ID whose memory to read. - //! \param[in] address The base address of the region to read. - //! \param[in] size The size of the memory region to read. - //! \param[out] buffer The buffer to fill with the data read. - //! \return `true` on success. `false` on failure with a message logged, if - //! enabled. - bool ReadMemory(pid_t pid, LinuxVMAddress address, size_t size, char* buffer); - - private: - bool is_64_bit_; - bool can_log_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(Ptracer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_PTRACER_H_ diff --git a/Tools/Crashpad/include/util/linux/scoped_ptrace_attach.h b/Tools/Crashpad/include/util/linux/scoped_ptrace_attach.h deleted file mode 100644 index a3d9d6987f..0000000000 --- a/Tools/Crashpad/include/util/linux/scoped_ptrace_attach.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_ -#define CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_ - -#include <sys/types.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Maintains a `ptrace()` attachment to a process. -//! -//! On destruction, the process will be detached. -class ScopedPtraceAttach { - public: - ScopedPtraceAttach(); - ~ScopedPtraceAttach(); - - //! \brief Detaches from the process by calling `ptrace()`. - //! - //! \return `true` on success. `false` on failure, with a message logged. - bool Reset(); - - //! \brief Detaches from any previously attached process, attaches to the - //! process with process ID \a pid, and blocks until the target process - //! has stopped by calling `waitpid()`. - //! - //! \return `true` on success. `false` on failure, with a message logged. - bool ResetAttach(pid_t pid); - - private: - pid_t pid_; - - DISALLOW_COPY_AND_ASSIGN(ScopedPtraceAttach); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_ diff --git a/Tools/Crashpad/include/util/linux/thread_info.h b/Tools/Crashpad/include/util/linux/thread_info.h deleted file mode 100644 index 4208be67f4..0000000000 --- a/Tools/Crashpad/include/util/linux/thread_info.h +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_THREAD_INFO_H_ -#define CRASHPAD_UTIL_LINUX_THREAD_INFO_H_ - -#include <stdint.h> -#include <sys/user.h> - -#include <type_traits> - -#include "build/build_config.h" -#include "util/linux/address_types.h" -#include "util/numeric/int128.h" - -#if defined(OS_ANDROID) -#include <android/api-level.h> -#endif - -namespace crashpad { - -//! \brief The set of general purpose registers for an architecture family. -union ThreadContext { - ThreadContext(); - ~ThreadContext(); - - //! \brief The general purpose registers used by the 32-bit variant of the - //! architecture. - struct t32_t { -#if defined(ARCH_CPU_X86_FAMILY) - // Reflects user_regs_struct in sys/user.h. - uint32_t ebx; - uint32_t ecx; - uint32_t edx; - uint32_t esi; - uint32_t edi; - uint32_t ebp; - uint32_t eax; - uint32_t xds; - uint32_t xes; - uint32_t xfs; - uint32_t xgs; - uint32_t orig_eax; - uint32_t eip; - uint32_t xcs; - uint32_t eflags; - uint32_t esp; - uint32_t xss; -#elif defined(ARCH_CPU_ARM_FAMILY) - // Reflects user_regs in sys/user.h. - uint32_t regs[11]; - uint32_t fp; - uint32_t ip; - uint32_t sp; - uint32_t lr; - uint32_t pc; - uint32_t cpsr; - uint32_t orig_r0; -#else -#error Port. -#endif // ARCH_CPU_X86_FAMILY - } t32; - - //! \brief The general purpose registers used by the 64-bit variant of the - //! architecture. - struct t64_t { -#if defined(ARCH_CPU_X86_FAMILY) - // Reflects user_regs_struct in sys/user.h. - uint64_t r15; - uint64_t r14; - uint64_t r13; - uint64_t r12; - uint64_t rbp; - uint64_t rbx; - uint64_t r11; - uint64_t r10; - uint64_t r9; - uint64_t r8; - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rsi; - uint64_t rdi; - uint64_t orig_rax; - uint64_t rip; - uint64_t cs; - uint64_t eflags; - uint64_t rsp; - uint64_t ss; - uint64_t fs_base; - uint64_t gs_base; - uint64_t ds; - uint64_t es; - uint64_t fs; - uint64_t gs; -#elif defined(ARCH_CPU_ARM_FAMILY) - // Reflects user_regs_struct in sys/user.h. - uint64_t regs[31]; - uint64_t sp; - uint64_t pc; - uint64_t pstate; -#else -#error Port. -#endif // ARCH_CPU_X86_FAMILY - } t64; - -#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM64) - using NativeThreadContext = user_regs_struct; -#elif defined(ARCH_CPU_ARMEL) - using NativeThreadContext = user_regs; -#else -#error Port. -#endif // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64 - -#if defined(ARCH_CPU_32_BITS) - static_assert(sizeof(t32_t) == sizeof(NativeThreadContext), "Size mismatch"); -#else // ARCH_CPU_64_BITS - static_assert(sizeof(t64_t) == sizeof(NativeThreadContext), "Size mismatch"); -#endif // ARCH_CPU_32_BITS -}; -static_assert(std::is_standard_layout<ThreadContext>::value, - "Not standard layout"); - -//! \brief The floating point registers used for an architecture family. -union FloatContext { - FloatContext(); - ~FloatContext(); - - //! \brief The floating point registers used by the 32-bit variant of the - //! architecture. - struct f32_t { -#if defined(ARCH_CPU_X86_FAMILY) - // Reflects user_fpxregs_struct in sys/user.h - struct fxsave { - uint16_t cwd; - uint16_t swd; - uint16_t twd; - uint16_t fop; - uint32_t fip; - uint32_t fcs; - uint32_t foo; - uint32_t fos; - uint32_t mxcsr; - uint32_t reserved; - uint32_t st_space[32]; - uint32_t xmm_space[32]; - uint32_t padding[56]; - } fxsave; -#elif defined(ARCH_CPU_ARM_FAMILY) - // Reflects user_fpregs in sys/user.h. - struct fpregs { - struct fp_reg { - uint32_t sign1 : 1; - uint32_t unused : 15; - uint32_t sign2 : 1; - uint32_t exponent : 14; - uint32_t j : 1; - uint32_t mantissa1 : 31; - uint32_t mantisss0 : 32; - } fpregs[8]; - uint32_t fpsr : 32; - uint32_t fpcr : 32; - uint8_t type[8]; - uint32_t init_flag; - } fpregs; - - // Reflects user_vfp in sys/user.h. - struct vfp { - uint64_t fpregs[32]; - uint32_t fpscr; - } vfp; - - bool have_fpregs; - bool have_vfp; -#else -#error Port. -#endif // ARCH_CPU_X86_FAMILY - } f32; - - //! \brief The floating point registers used by the 64-bit variant of the - //! architecture. - struct f64_t { -#if defined(ARCH_CPU_X86_FAMILY) - // Refelects user_fpregs_struct in sys/user.h - struct fxsave { - uint16_t cwd; - uint16_t swd; - uint16_t ftw; - uint16_t fop; - uint64_t rip; - uint64_t rdp; - uint32_t mxcsr; - uint32_t mxcr_mask; - uint32_t st_space[32]; - uint32_t xmm_space[64]; - uint32_t padding[24]; - } fxsave; -#elif defined(ARCH_CPU_ARM_FAMILY) - uint128_struct vregs[32]; - uint32_t fpsr; - uint32_t fpcr; - uint8_t padding[8]; -#else -#error Port. -#endif // ARCH_CPU_X86_FAMILY - } f64; - -#if defined(ARCH_CPU_X86) -// __ANDROID_API_N__ is a proxy for determining whether unified headers are in -// use. It’s only defined by unified headers. Unified headers call this -// structure user_fpxregs_struct regardless of API level. -#if defined(OS_ANDROID) && __ANDROID_API__ <= 19 && !defined(__ANDROID_API_N__) - using NativeFpxregs = user_fxsr_struct; -#else - using NativeFpxregs = user_fpxregs_struct; -#endif // OS_ANDROID - static_assert(sizeof(f32_t::fxsave) == sizeof(NativeFpxregs), - "Size mismatch"); -#elif defined(ARCH_CPU_X86_64) - static_assert(sizeof(f64_t::fxsave) == sizeof(user_fpregs_struct), - "Size mismatch"); -#elif defined(ARCH_CPU_ARMEL) - static_assert(sizeof(f32_t::fpregs) == sizeof(user_fpregs), "Size mismatch"); - static_assert(sizeof(f32_t::vfp) == sizeof(user_vfp), "Size mismatch"); -#elif defined(ARCH_CPU_ARM64) - static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch"); -#else -#error Port. -#endif // ARCH_CPU_X86 -}; -static_assert(std::is_standard_layout<FloatContext>::value, - "Not standard layout"); - -//! \brief A collection of `ptrace`-able information about a thread. -struct ThreadInfo { - ThreadInfo(); - ~ThreadInfo(); - - //! \brief The general purpose registers for the thread. - ThreadContext thread_context; - - //! \brief The floating point registers for the thread. - FloatContext float_context; - - //! \brief The thread-local storage address for the thread. - LinuxVMAddress thread_specific_data_address; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_THREAD_INFO_H_ diff --git a/Tools/Crashpad/include/util/linux/traits.h b/Tools/Crashpad/include/util/linux/traits.h deleted file mode 100644 index ca9576814f..0000000000 --- a/Tools/Crashpad/include/util/linux/traits.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_LINUX_TRAITS_H_ -#define CRASHPAD_UTIL_LINUX_TRAITS_H_ - -#include <stdint.h> - -namespace crashpad { - -struct Traits32 { - using Nothing = char[0]; - using Address = uint32_t; - using Long = int32_t; - using ULong = uint32_t; - using Clock = Long; - using Size = uint32_t; - using ULong_32Only = ULong; - using ULong_64Only = Nothing; - using UInteger32_64Only = Nothing; -}; - -struct Traits64 { - using Nothing = char[0]; - using Address = uint64_t; - using Long = int64_t; - using ULong = uint64_t; - using Clock = Long; - using Size = uint64_t; - using ULong_32Only = Nothing; - using ULong_64Only = ULong; - using UInteger32_64Only = uint32_t; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_LINUX_TRAITS_H_ diff --git a/Tools/Crashpad/include/util/mac/checked_mach_address_range.h b/Tools/Crashpad/include/util/mac/checked_mach_address_range.h deleted file mode 100644 index e64e3d1ec7..0000000000 --- a/Tools/Crashpad/include/util/mac/checked_mach_address_range.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ -#define CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ - -#include <mach/mach.h> - -#include "util/numeric/checked_address_range.h" - -namespace crashpad { - -//! \brief Ensures that a range, composed of a base and a size, does not -//! overflow the pointer type of the process it describes a range in. -//! -//! This class checks bases of type `mach_vm_address_t` and sizes of type -//! `mach_vm_address_t` against a process whose pointer type is either 32 or 64 -//! bits wide. -//! -//! Aside from varying the overall range on the basis of a process’ pointer type -//! width, this class functions very similarly to CheckedRange. -using CheckedMachAddressRange = - internal::CheckedAddressRangeGeneric<mach_vm_address_t, mach_vm_size_t>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MAC_CHECKED_MACH_ADDRESS_RANGE_H_ diff --git a/Tools/Crashpad/include/util/mac/launchd.h b/Tools/Crashpad/include/util/mac/launchd.h deleted file mode 100644 index 21b43f8d00..0000000000 --- a/Tools/Crashpad/include/util/mac/launchd.h +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MAC_LAUNCHD_H_ -#define CRASHPAD_UTIL_MAC_LAUNCHD_H_ - -#include <CoreFoundation/CoreFoundation.h> -#include <launch.h> -#include <sys/types.h> - -namespace crashpad { - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - -//! \{ -//! \brief Wraps the `<launch.h>` function of the same name. -//! -//! The OS X 10.10 SDK deprecates `<launch.h>`, although the functionality it -//! provides is still useful. These wrappers allow the deprecated functions to -//! be called without triggering deprecated-declaration warnings. - -inline launch_data_t LaunchDataAlloc(launch_data_type_t type) { - return launch_data_alloc(type); -} - -inline launch_data_type_t LaunchDataGetType(const launch_data_t data) { - return launch_data_get_type(data); -} - -inline void LaunchDataFree(launch_data_t data) { - return launch_data_free(data); -} - -inline bool LaunchDataDictInsert(launch_data_t dict, - const launch_data_t value, - const char* key) { - return launch_data_dict_insert(dict, value, key); -} - -inline launch_data_t LaunchDataDictLookup(const launch_data_t dict, - const char* key) { - return launch_data_dict_lookup(dict, key); -} - -inline size_t LaunchDataDictGetCount(launch_data_t dict) { - return launch_data_dict_get_count(dict); -} - -inline bool LaunchDataArraySetIndex(launch_data_t array, - const launch_data_t value, - size_t index) { - return launch_data_array_set_index(array, value, index); -} - -inline launch_data_t LaunchDataArrayGetIndex(launch_data_t array, - size_t index) { - return launch_data_array_get_index(array, index); -} - -inline size_t LaunchDataArrayGetCount(launch_data_t array) { - return launch_data_array_get_count(array); -} - -inline launch_data_t LaunchDataNewInteger(long long integer) { - return launch_data_new_integer(integer); -} - -inline launch_data_t LaunchDataNewBool(bool boolean) { - return launch_data_new_bool(boolean); -} - -inline launch_data_t LaunchDataNewReal(double real) { - return launch_data_new_real(real); -} - -inline launch_data_t LaunchDataNewString(const char* string) { - return launch_data_new_string(string); -} - -inline launch_data_t LaunchDataNewOpaque(const void* opaque, size_t size) { - return launch_data_new_opaque(opaque, size); -} - -inline long long LaunchDataGetInteger(const launch_data_t data) { - return launch_data_get_integer(data); -} - -inline bool LaunchDataGetBool(const launch_data_t data) { - return launch_data_get_bool(data); -} - -inline double LaunchDataGetReal(const launch_data_t data) { - return launch_data_get_real(data); -} - -inline const char* LaunchDataGetString(const launch_data_t data) { - return launch_data_get_string(data); -} - -inline void* LaunchDataGetOpaque(const launch_data_t data) { - return launch_data_get_opaque(data); -} - -inline size_t LaunchDataGetOpaqueSize(const launch_data_t data) { - return launch_data_get_opaque_size(data); -} - -inline int LaunchDataGetErrno(const launch_data_t data) { - return launch_data_get_errno(data); -} - -inline launch_data_t LaunchMsg(const launch_data_t data) { - return launch_msg(data); -} - -//! \} - -#pragma clang diagnostic pop - -//! \brief Converts a Core Foundation-type property list to a launchd-type -//! `launch_data_t`. -//! -//! \param[in] property_cf The Core Foundation-type property list to convert. -//! -//! \return The converted launchd-type `launch_data_t`. The caller takes -//! ownership of the returned value. On error, returns `nullptr`. -//! -//! \note This function handles all `CFPropertyListRef` types except for -//! `CFDateRef`, because there’s no `launch_data_type_t` analogue. Not all -//! types supported in a launchd-type `launch_data_t` have -//! `CFPropertyListRef` analogues. -launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MAC_LAUNCHD_H_ diff --git a/Tools/Crashpad/include/util/mac/mac_util.h b/Tools/Crashpad/include/util/mac/mac_util.h deleted file mode 100644 index d8b71598aa..0000000000 --- a/Tools/Crashpad/include/util/mac/mac_util.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MAC_MAC_UTIL_H_ -#define CRASHPAD_UTIL_MAC_MAC_UTIL_H_ - -#include <string> - -namespace crashpad { - -//! \brief Returns the version of the running operating system. -//! -//! \return The minor version of the operating system, such as `12` for macOS -//! 10.12.1. -//! -//! \note This is similar to the base::mac::IsOS*() family of functions, but -//! is provided for situations where the caller needs to obtain version -//! information beyond what is provided by Chromium’s base, or for when the -//! caller needs the actual minor version value. -int MacOSXMinorVersion(); - -//! \brief Returns the version of the running operating system. -//! -//! All parameters are required. No parameter may be `nullptr`. -//! -//! \param[out] major The major version of the operating system, such as `10` -//! for macOS 10.12.1. -//! \param[out] minor The major version of the operating system, such as `12` -//! for macOS 10.12.1. -//! \param[out] bugfix The bugfix version of the operating system, such as `1` -//! for macOS 10.12.1. -//! \param[out] build The operating system’s build string, such as `"16B2657"` -//! for macOS 10.12.1. -//! \param[out] server `true` for a macOS Server installation, `false` otherwise -//! (for a desktop/laptop, client, or workstation system). -//! \param[out] version_string A string representing the full operating system -//! version, such as `"macOS 10.12.1 (16B2657)"`. -//! -//! \return `true` on success, `false` on failure, with an error message logged. -//! A failure is considered to have occurred if any element could not be -//! determined. When this happens, their values will be untouched, but other -//! values that could be determined will still be set properly. -bool MacOSXVersion(int* major, - int* minor, - int* bugfix, - std::string* build, - bool* server, - std::string* version_string); - -//! \brief Returns the model name and board ID of the running system. -//! -//! \param[out] model The system’s model name. A mid-2012 15" MacBook Pro would -//! report “MacBookPro10,1â€. -//! \param[out] board_id The system’s board ID. A mid-2012 15" MacBook Pro would -//! report “Mac-C3EC7CD22292981Fâ€. -//! -//! If a value cannot be determined, its string is cleared. -void MacModelAndBoard(std::string* model, std::string* board_id); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MAC_MAC_UTIL_H_ diff --git a/Tools/Crashpad/include/util/mac/service_management.h b/Tools/Crashpad/include/util/mac/service_management.h deleted file mode 100644 index 16cb45aaed..0000000000 --- a/Tools/Crashpad/include/util/mac/service_management.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MAC_SERVICE_MANAGEMENT_H_ -#define CRASHPAD_UTIL_MAC_SERVICE_MANAGEMENT_H_ - -#include <CoreFoundation/CoreFoundation.h> -#include <unistd.h> - -#include <string> - -namespace crashpad { - -//! \brief Submits a job to the user launchd domain as in `SMJobSubmit()`. -//! -//! \param[in] job_cf A dictionary describing a job. -//! -//! \return `true` if the job was submitted successfully, otherwise `false`. -//! -//! \note This function is provided because `SMJobSubmit()` is deprecated in OS -//! X 10.10. It may or may not be implemented using `SMJobSubmit()` from -//! `ServiceManagement.framework`. -bool ServiceManagementSubmitJob(CFDictionaryRef job_cf); - -//! \brief Removes a job from the user launchd domain as in `SMJobRemove()`. -//! -//! \param[in] label The label for the job to remove. -//! \param[in] wait `true` if this function should block, waiting for the job to -//! be removed. `false` if the job may be removed asynchronously. -//! -//! \return `true` if the job was removed successfully or if an asynchronous -//! attempt to remove the job was started successfully, otherwise `false`. -//! -//! \note This function is provided because `SMJobRemove()` is deprecated in OS -//! X 10.10. On OS X 10.10, observed in DP8 14A361c, it also blocks for far -//! too long (`_block_until_job_exits()` contains a one-second `sleep()`, -//! filed as radar 18398683) and does not signal failure via its return -//! value when asked to remove a nonexistent job (filed as radar 18268941). -bool ServiceManagementRemoveJob(const std::string& label, bool wait); - -//! \brief Determines whether a specified job is loaded in the user launchd -//! domain. -//! -//! \param[in] label The label for the job to look up. -//! -//! \return `true` if the job is loaded, otherwise `false`. -//! -//! \note A loaded job is not necessarily presently running, nor has it -//! necessarily ever run in the past. -//! \note This function is provided because `SMJobCopyDictionary()` is -//! deprecated in OS X 10.10. It may or may not be implemented using -//! `SMJobCopyDictionary()` from `ServiceManagement.framework`. -bool ServiceManagementIsJobLoaded(const std::string& label); - -//! \brief Determines whether a specified job is running in the user launchd -//! domain. -//! -//! \param[in] label The label for the job to look up. -//! -//! \return The job’s process ID if running, otherwise `0`. -//! -//! \note This function is provided because `SMJobCopyDictionary()` is -//! deprecated in OS X 10.10. It may or may not be implemented using -//! `SMJobCopyDictionary()` from `ServiceManagement.framework`. -pid_t ServiceManagementIsJobRunning(const std::string& label); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MAC_SERVICE_MANAGEMENT diff --git a/Tools/Crashpad/include/util/mac/xattr.h b/Tools/Crashpad/include/util/mac/xattr.h deleted file mode 100644 index ebe13df507..0000000000 --- a/Tools/Crashpad/include/util/mac/xattr.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MAC_XATTR_H_ -#define CRASHPAD_UTIL_MAC_XATTR_H_ - -#include <time.h> - -#include <string> - -#include "base/files/file_path.h" -#include "base/strings/string_piece.h" - -namespace crashpad { - -//! \brief The result code for a ReadXattr operation. -enum class XattrStatus { - //! \brief No error occured. No message is logged. - kOK = 0, - - //! \brief The attribute does not exist. No message is logged. - kNoAttribute, - - //! \brief An error occurred and an error message was logged. - kOtherError, -}; - -//! \brief Reads an extended attribute on a file. -//! -//! \param[in] file The path to the file. -//! \param[in] name The name of the extended attribute to read. -//! \param[out] value The value of the attribute. -//! -//! \return XattrStatus -XattrStatus ReadXattr(const base::FilePath& file, - const base::StringPiece& name, - std::string* value); - -//! \brief Writes an extended attribute on a file. -//! -//! \param[in] file The path to the file. -//! \param[in] name The name of the extended attribute to write. -//! \param[in] value The value of the attribute. -//! -//! \return `true` if the write was successful. `false` on error, with a message -//! logged. -bool WriteXattr(const base::FilePath& file, - const base::StringPiece& name, - const std::string& value); - -//! \copydoc ReadXattr -//! -//! Only the values `"0"` and `"1"`, for `false` and `true` respectively, are -//! valid conversions. -XattrStatus ReadXattrBool(const base::FilePath& file, - const base::StringPiece& name, - bool* value); - -//! \copydoc WriteXattr -bool WriteXattrBool(const base::FilePath& file, - const base::StringPiece& name, - bool value); - -//! \copydoc ReadXattr -XattrStatus ReadXattrInt(const base::FilePath& file, - const base::StringPiece& name, - int* value); - -//! \copydoc WriteXattr -bool WriteXattrInt(const base::FilePath& file, - const base::StringPiece& name, - int value); - -//! \copydoc ReadXattr -XattrStatus ReadXattrTimeT(const base::FilePath& file, - const base::StringPiece& name, - time_t* value); - -//! \copydoc WriteXattr -bool WriteXattrTimeT(const base::FilePath& file, - const base::StringPiece& name, - time_t value); - -//! \brief Removes an extended attribute from a file. -//! -//! \param[in] file The path to the file. -//! \param[in] name The name of the extended attribute to remove. -//! -//! \return XattrStatus -XattrStatus RemoveXattr(const base::FilePath& file, - const base::StringPiece& name); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MAC_XATTR_H_ diff --git a/Tools/Crashpad/include/util/mach/child_port_handshake.h b/Tools/Crashpad/include/util/mach/child_port_handshake.h deleted file mode 100644 index 429164a9b5..0000000000 --- a/Tools/Crashpad/include/util/mach/child_port_handshake.h +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_CHILD_PORT_HANDSHAKE_H_ -#define CRASHPAD_UTIL_MACH_CHILD_PORT_HANDSHAKE_H_ - -#include <mach/mach.h> - -#include <string> - -#include "base/files/scoped_file.h" -#include "base/macros.h" -#include "util/mach/child_port_types.h" - -namespace crashpad { - -namespace test { -namespace { -class ChildPortHandshakeTest; -} // namespace -} // namespace test - -//! \brief Implements a handshake protocol that allows processes to exchange -//! port rights. -//! -//! Ordinarily, there is no way for parent and child processes to exchange port -//! rights, outside of the rights that children inherit from their parents. -//! These include task-special ports and exception ports, but all of these have -//! system-defined uses, and cannot reliably be replaced: in a multi-threaded -//! parent, it is impossible to temporarily change an inheritable port while -//! maintaining a guarantee that another thread will not attempt to use it, and -//! in children, it difficult to guarantee that nothing will attempt to use an -//! inheritable port before it can be replaced with the correct one. This latter -//! concern is becoming increasingly more pronounced as system libraries perform -//! more operations that rely on an inherited port in module initializers. -//! -//! The protocol implemented by this class involves a server that runs in one -//! process. The server is published with the bootstrap server, which the other -//! process has access to because the bootstrap port is one of the inherited -//! task-special ports. The two processes also share a pipe, which the server -//! can write to and the client can read from. The server will write a random -//! token to this pipe, along with the name under which its service has been -//! registered with the bootstrap server. The client can then obtain a send -//! right to this service with `bootstrap_look_up()`, and send a check-in -//! message containing the token value and the port right of its choice by -//! calling `child_port_check_in()`. -//! -//! The inclusion of the token authenticates the client to the server. This is -//! necessary because the service is published with the bootstrap server, which -//! opens up access to it to more than the intended client. Because the token is -//! passed to the client by a shared pipe, it constitutes a shared secret not -//! known by other processes that may have incidental access to the server. The -//! ChildPortHandshake server considers its randomly-generated token valid until -//! a client checks in with it. This mechanism is used instead of examining the -//! request message’s audit trailer to verify the sender’s process ID because in -//! some process architectures, it may be impossible to verify the client’s -//! process ID. -//! -//! The shared pipe serves another purpose: the server monitors it for an -//! end-of-file (no readers) condition. Once detected, it will stop its blocking -//! wait for a client to check in. This mechanism was also chosen for its -//! ability to function properly in diverse process architectures. -//! -//! This class can be used to allow a child process to provide its parent with a -//! send right to its task port, in cases where it is desirable for the parent -//! to have such access. It can also be used to allow a parent process to -//! transfer a receive right to a child process that implements the server for -//! that right, or for a child process to establish its own server and provide -//! its parent with a send right to that server, for cases where a service is -//! provided and it is undesirable or impossible to provide it via the bootstrap -//! or launchd interfaces. -//! -//! Example parent process, running a client that sends a receive right to its -//! child: -//! \code -//! ChildPortHandshake child_port_handshake; -//! base::ScopedFD server_write_fd = child_port_handshake.ServerWriteFD(); -//! std::string server_write_fd_string = -//! base::StringPrintf("%d", server_write_fd.get()); -//! -//! pid_t pid = fork(); -//! if (pid == 0) { -//! // Child -//! -//! // Close all file descriptors above STDERR_FILENO except for -//! // server_write_fd. Let the child know what file descriptor to use for -//! // server_write_fd by passing it as argv[1]. Example code for the child -//! // process is below. -//! CloseMultipleNowOrOnExec(STDERR_FILENO + 1, server_write_fd.get()); -//! execlp("./child", "child", server_write_fd_string.c_str(), nullptr); -//! } -//! -//! // Parent -//! -//! // Close the child’s end of the pipe. -//! server_write_fd.reset(); -//! -//! // Make a new Mach receive right. -//! base::mac::ScopedMachReceiveRight -//! receive_right(NewMachPort(MACH_PORT_RIGHT_RECEIVE)); -//! -//! // Make a send right corresponding to the receive right. -//! mach_port_t send_right; -//! mach_msg_type_name_t send_right_type; -//! mach_port_extract_right(mach_task_self(), -//! receive_right.get(), -//! MACH_MSG_TYPE_MAKE_SEND, -//! &send_right, -//! &send_right_type); -//! base::mac::ScopedMachSendRight send_right_owner(send_right); -//! -//! // Send the receive right to the child process, retaining the send right -//! // for use in the parent process. -//! if (child_port_handshake.RunClient(receive_right.get(), -//! MACH_MSG_TYPE_MOVE_RECEIVE)) { -//! ignore_result(receive_right.release()); -//! } -//! \endcode -//! -//! Example child process, running a server that receives a receive right from -//! its parent: -//! \code -//! int main(int argc, char* argv[]) { -//! // The parent passed server_write_fd in argv[1]. -//! base::ScopedFD server_write_fd(atoi(argv[1])); -//! -//! // Obtain a receive right from the parent process. -//! base::mac::ScopedMachReceiveRight receive_right( -//! ChildPortHandshake::RunServerForFD( -//! std::move(server_write_fd), -//! ChildPortHandshake::PortRightType::kReceiveRight)); -//! } -//! \endcode -class ChildPortHandshake { - public: - //! \brief Controls whether a receive or send right is expected to be - //! obtained from the client by the server’s call to RunServer(). - enum class PortRightType { - //! \brief The server expects to receive a receive right. - kReceiveRight = 0, - - //! \brief The server expects to receive a send or send-once right. - kSendRight, - }; - - ChildPortHandshake(); - ~ChildPortHandshake(); - - //! \brief Obtains the “read†side of the pipe, to be used by the client. - //! - //! This file descriptor must be passed to RunClientForFD(). - //! - //! \return The file descriptor that the client should read from. - base::ScopedFD ClientReadFD(); - - //! \brief Obtains the “write†side of the pipe, to be used by the server. - //! - //! This file descriptor must be passed to RunServerForFD(). - //! - //! \return The file descriptor that the server should write to. - base::ScopedFD ServerWriteFD(); - - //! \brief Runs the server. - //! - //! This method closes the “read†side of the pipe in-process, so that the - //! client process holds the only file descriptor that can read from the pipe. - //! It then calls RunServerForFD() using the “write†side of the pipe. If - //! ClientReadFD() has already been called in the server process, the caller - //! must ensure that the file descriptor returned by ClientReadFD() is closed - //! prior to calling this method. - mach_port_t RunServer(PortRightType port_right_type); - - //! \brief Runs the client. - //! - //! This method closes the “write†side of the pipe in-process, so that the - //! server process holds the only file descriptor that can write to the pipe. - //! It then calls RunClientForFD() using the “read†side of the pipe. If - //! ServerWriteFD() has already been called in the client process, the caller - //! must ensure that the file descriptor returned by ServerWriteFD() is closed - //! prior to calling this method. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool RunClient(mach_port_t port, mach_msg_type_name_t right_type); - - //! \brief Runs the server. - //! - //! If a ChildPortHandshake object is available, don’t call this static - //! function. Instead, call RunServer(), which wraps this function. When using - //! this function, the caller is responsible for ensuring that the client - //! “read†side of the pipe is closed in the server process prior to calling - //! this function. - //! - //! This function performs these tasks: - //! - Creates a random token and sends it via the pipe. - //! - Checks its service in with the bootstrap server, and sends the name - //! of its bootstrap service mapping via the pipe. - //! - Simultaneously receives messages on its Mach server and monitors the - //! pipe for end-of-file. This is a blocking operation. - //! - When a Mach message is received, calls HandleChildPortCheckIn() to - //! interpret and validate it, and if the message is valid, returns the - //! port right extracted from the message. If the message is not valid, - //! this method will continue waiting for a valid message. Valid messages - //! are properly formatted and have the correct token. The right carried in - //! a valid message will be returned. If a message is not valid, this - //! method will continue waiting for pipe EOF or a valid message. - //! - When notified of pipe EOF, returns `MACH_PORT_NULL`. - //! - Regardless of return value, destroys the server’s receive right and - //! closes the pipe. - //! - //! \param[in] server_write_fd The write side of the pipe shared with the - //! client process. This function takes ownership of this file descriptor, - //! and will close it prior to returning. - //! \param[in] port_right_type The port right type expected to be received - //! from the client. If the port right received from the client does not - //! match the expected type, the received port right will be destroyed, - //! and `MACH_PORT_NULL` will be returned. - //! - //! \return On success, the port right provided by the client. The caller - //! takes ownership of this right. On failure, `MACH_PORT_NULL`, - //! indicating that the client did not check in properly before - //! terminating, where termination is detected by detecting that the read - //! side of the shared pipe has closed. On failure, a message indicating - //! the nature of the failure will be logged. - static mach_port_t RunServerForFD(base::ScopedFD server_write_fd, - PortRightType port_right_type); - - //! \brief Runs the client. - //! - //! If a ChildPortHandshake object is available, don’t call this static - //! function. Instead, call RunClient(), which wraps this function. When using - //! this function, the caller is responsible for ensuring that the server - //! “write†side of the pipe is closed in the client process prior to calling - //! this function. - //! - //! This function performs these tasks: - //! - Reads the token from the pipe. - //! - Reads the bootstrap service name from the pipe. - //! - Obtains a send right to the server by calling `bootstrap_look_up()`. - //! - Sends a check-in message to the server by calling - //! `child_port_check_in()`, providing the token and the user-supplied port - //! right. - //! - Deallocates the send right to the server, and closes the pipe. - //! - //! There is no return value because `child_port_check_in()` is a MIG - //! `simpleroutine`, and the server does not send a reply. This allows - //! check-in to occur without blocking to wait for a reply. - //! - //! \param[in] client_read_fd The “readâ€Â side of the pipe shared with the - //! server process. This function takes ownership of this file descriptor, - //! and will close it prior to returning. - //! \param[in] port The port right that will be passed to the server by - //! `child_port_check_in()`. - //! \param[in] right_type The right type to furnish the server with. If \a - //! port is a send right, this can be `MACH_MSG_TYPE_COPY_SEND` or - //! `MACH_MSG_TYPE_MOVE_SEND`. If \a port is a send-once right, this can - //! be `MACH_MSG_TYPE_MOVE_SEND_ONCE`. If \a port is a receive right, this - //! can be `MACH_MSG_TYPE_MAKE_SEND`, `MACH_MSG_TYPE_MAKE_SEND_ONCE`, or - //! `MACH_MSG_TYPE_MOVE_RECEIVE`. - //! - //! \return `true` on success, `false` on failure with a message logged. On - //! failure, the port right corresponding to a \a right_type of - //! `MACH_MSG_TYPE_MOVE_*` is not consumed, and the caller must dispose of - //! the right if necessary. - static bool RunClientForFD(base::ScopedFD client_read_fd, - mach_port_t port, - mach_msg_type_name_t right_type); - - private: - //! \brief Runs the read-from-pipe portion of the client’s side of the - //! handshake. This is an implementation detail of RunClient and is only - //! exposed for testing purposes. - //! - //! When using this function and RunClientInternal_SendCheckIn(), the caller - //! is responsible for closing \a pipe_read at an appropriate time, normally - //! after calling RunClientInternal_SendCheckIn(). - //! - //! \param[in] pipe_read The “read†side of the pipe shared with the server - //! process. - //! \param[out] token The token value read from \a pipe_read. - //! \param[out] service_name The service name as registered with the bootstrap - //! server, read from \a pipe_read. - //! - //! \return `true` on success, `false` on failure with a message logged. - static bool RunClientInternal_ReadPipe(int pipe_read, - child_port_token_t* token, - std::string* service_name); - - //! \brief Runs the check-in portion of the client’s side of the handshake. - //! This is an implementation detail of RunClient and is only exposed for - //! testing purposes. - //! - //! When using this RunClientInternal_ReadPipe() and this function, the caller - //! is responsible for closing the “read†side of the pipe at an appropriate - //! time, normally after calling this function. - //! - //! \param[in] service_name The service name as registered with the bootstrap - //! server, to be looked up with `bootstrap_look_up()`. - //! \param[in] token The token value to provide during check-in. - //! \param[in] port The port that will be passed to the server by - //! `child_port_check_in()`. - //! \param[in] right_type The right type to furnish the server with. - //! - //! \return `true` on success, `false` on failure with a message logged. - static bool RunClientInternal_SendCheckIn(const std::string& service_name, - child_port_token_t token, - mach_port_t port, - mach_msg_type_name_t right_type); - - base::ScopedFD client_read_fd_; - base::ScopedFD server_write_fd_; - - friend class test::ChildPortHandshakeTest; - - DISALLOW_COPY_AND_ASSIGN(ChildPortHandshake); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_CHILD_PORT_HANDSHAKE_H_ diff --git a/Tools/Crashpad/include/util/mach/child_port_server.h b/Tools/Crashpad/include/util/mach/child_port_server.h deleted file mode 100644 index 47d72e4da9..0000000000 --- a/Tools/Crashpad/include/util/mach/child_port_server.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_CHILD_PORT_SERVER_H_ -#define CRASHPAD_UTIL_MACH_CHILD_PORT_SERVER_H_ - -#include <mach/mach.h> - -#include <set> - -#include "base/macros.h" -#include "util/mach/child_port_types.h" -#include "util/mach/mach_message_server.h" - -namespace crashpad { - -//! \brief A server interface for the `child_port` Mach subsystem. -class ChildPortServer : public MachMessageServer::Interface { - public: - //! \brief An interface that the request message that is a part of the - //! `child_port` Mach subsystem can be dispatched to. - class Interface { - public: - //! \brief Handles check-ins sent by `child_port_check_in()`. - //! - //! This behaves equivalently to a `handle_child_port_check_in()` function - //! used with `child_port_server()`. - //! - //! \param[in] server - //! \param[in] token - //! \param[in] port - //! \param[in] right_type - //! \param[in] trailer The trailer received with the request message. - //! \param[out] destroy_request `true` if the request message is to be - //! destroyed even when this method returns success. See - //! MachMessageServer::Interface. - virtual kern_return_t HandleChildPortCheckIn( - child_port_server_t server, - const child_port_token_t token, - mach_port_t port, - mach_msg_type_name_t right_type, - const mach_msg_trailer_t* trailer, - bool* destroy_request) = 0; - - protected: - ~Interface() {} - }; - - //! \brief Constructs an object of this class. - //! - //! \param[in] interface The interface to dispatch requests to. Weak. - explicit ChildPortServer(Interface* interface); - - // MachMessageServer::Interface: - bool MachMessageServerFunction(const mach_msg_header_t* in_header, - mach_msg_header_t* out_header, - bool* destroy_complex_request) override; - std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; - mach_msg_size_t MachMessageServerRequestSize() override; - mach_msg_size_t MachMessageServerReplySize() override; - - private: - Interface* interface_; // weak - - DISALLOW_COPY_AND_ASSIGN(ChildPortServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_CHILD_PORT_SERVER_H_ diff --git a/Tools/Crashpad/include/util/mach/child_port_types.h b/Tools/Crashpad/include/util/mach/child_port_types.h deleted file mode 100644 index d0760a73f4..0000000000 --- a/Tools/Crashpad/include/util/mach/child_port_types.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_CHILD_PORT_TYPES_H_ -#define CRASHPAD_UTIL_MACH_CHILD_PORT_TYPES_H_ - -#include <mach/mach.h> -#include <stdint.h> - -// This file is #included by C (non-C++) files, and must remain strictly C. - -typedef mach_port_t child_port_server_t; -typedef uint64_t child_port_token_t; - -#endif // CRASHPAD_UTIL_MACH_CHILD_PORT_TYPES_H_ diff --git a/Tools/Crashpad/include/util/mach/composite_mach_message_server.h b/Tools/Crashpad/include/util/mach/composite_mach_message_server.h deleted file mode 100644 index 785af4dc61..0000000000 --- a/Tools/Crashpad/include/util/mach/composite_mach_message_server.h +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_COMPOSITE_MACH_MESSAGE_SERVER_H_ -#define CRASHPAD_UTIL_MACH_COMPOSITE_MACH_MESSAGE_SERVER_H_ - -#include <mach/mach.h> - -#include <map> -#include <set> - -#include "base/macros.h" -#include "util/mach/mach_message_server.h" - -namespace crashpad { - -//! \brief Adapts multiple MachMessageServer::Interface implementations for -//! simultaneous use in a single MachMessageServer::Run() call. -//! -//! This class implements a MachMessageServer::Interface that contains other -//! MachMessageServer::Interface objects. -//! -//! In some situations, it may be desirable for a Mach message server to handle -//! messages from distinct MIG subsystems with distinct -//! MachMessageServer::Interface implementations. This may happen if a single -//! receive right is shared for multiple subsystems, or if distinct receive -//! rights are combined in a Mach port set. In these cases, this class performs -//! a first-level demultiplexing to forward request messages to the proper -//! subsystem-level demultiplexers. -class CompositeMachMessageServer : public MachMessageServer::Interface { - public: - CompositeMachMessageServer(); - ~CompositeMachMessageServer(); - - //! \brief Adds a handler that messages can be dispatched to based on request - //! message ID. - //! - //! \param[in] handler A MachMessageServer handler. Ownership of this object - //! is not taken. Cycles must not be created between objects. It is - //! invalid to add an object as its own handler. - //! - //! If \a handler claims to support any request ID that this object is already - //! able to handle, execution will be terminated. - void AddHandler(MachMessageServer::Interface* handler); - - // MachMessageServer::Interface: - - //! \copydoc MachMessageServer::Interface::MachMessageServerFunction() - //! - //! This implementation forwards the message to an appropriate handler added - //! by AddHandler() on the basis of the \a in request message’s message ID. If - //! no appropriate handler exists, the \a out reply message is treated as a - //! `mig_reply_error_t`, its return code is set to `MIG_BAD_ID`, and `false` - //! is returned. - bool MachMessageServerFunction(const mach_msg_header_t* in, - mach_msg_header_t* out, - bool* destroy_complex_request) override; - - //! \copydoc MachMessageServer::Interface::MachMessageServerRequestIDs() - //! - //! This implementation returns the set of all request message Mach message - //! IDs of all handlers added by AddHandler(). - std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; - - //! \copydoc MachMessageServer::Interface::MachMessageServerRequestSize() - //! - //! This implementation returns the maximum request message size of all - //! handlers added by AddHandler(). If no handlers are present, returns the - //! size of `mach_msg_header_t`, the minimum size of a MIG request message - //! that can be received for demultiplexing purposes. - mach_msg_size_t MachMessageServerRequestSize() override; - - //! \copydoc MachMessageServer::Interface::MachMessageServerReplySize() - //! - //! This implementation returns the maximum reply message size of all handlers - //! added by AddHandler(). If no handlers are present, returns the size of - //! `mig_reply_error_t`, the minimum size of a MIG reply message. - mach_msg_size_t MachMessageServerReplySize() override; - - private: - using HandlerMap = std::map<mach_msg_id_t, MachMessageServer::Interface*>; - - HandlerMap handler_map_; // weak - mach_msg_size_t request_size_; - mach_msg_size_t reply_size_; - - DISALLOW_COPY_AND_ASSIGN(CompositeMachMessageServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_COMPOSITE_MACH_MESSAGE_SERVER_H_ diff --git a/Tools/Crashpad/include/util/mach/exc_client_variants.h b/Tools/Crashpad/include/util/mach/exc_client_variants.h deleted file mode 100644 index 8f52ed5323..0000000000 --- a/Tools/Crashpad/include/util/mach/exc_client_variants.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_EXC_CLIENT_VARIANTS_H_ -#define CRASHPAD_UTIL_MACH_EXC_CLIENT_VARIANTS_H_ - -#include <mach/mach.h> - -#include "util/mach/mach_extensions.h" - -namespace crashpad { - -//! \brief Calls the appropriate `*exception_raise*()` function for the -//! specified \a behavior. -//! -//! The function called will be `exception_raise()` for `EXCEPTION_DEFAULT`, -//! `exception_raise_state()` for `EXCEPTION_STATE`, or -//! `exception_raise_state_identity()` for `EXCEPTION_STATE_IDENTITY`. If -//! `MACH_EXCEPTION_CODES` is also set, the function called will instead be -//! `mach_exception_raise()`, `mach_exception_raise_state()` or -//! `mach_exception_raise_state_identity()`, respectively. -//! -//! This function does not fetch the existing thread state for \a behavior -//! values that require a thread state. The caller must provide the existing -//! thread state in the \a flavor, \a old_state, and \a old_state_count -//! parameters for \a behavior values that require a thread state. Thread states -//! may be obtained by calling `thread_get_state()` if needed. Similarly, this -//! function does not do anything with the new thread state returned for these -//! \a behavior values. Callers that wish to make use of the new thread state -//! may do so by using the returned \a flavor, \a new_state, and \a -//! new_state_count values. Thread states may be set by calling -//! `thread_set_state()` if needed. -//! -//! \a thread and \a task are only used when \a behavior indicates that the -//! exception message will carry identity information, when it has the value -//! `EXCEPTION_DEFAULT` or `EXCEPTION_STATE_IDENTITY`, possibly with -//! `MACH_EXCEPTION_CODES` also set. In other cases, these parameters are unused -//! and may be set to `THREAD_NULL` and `TASK_NULL`, respectively. -//! -//! \a flavor, \a old_state, \a old_state_count, \a new_state, and \a -//! new_state_count are only used when \a behavior indicates that the exception -//! message will carry thread state information, when it has the value -//! `EXCEPTION_STATE` or `EXCEPTION_STATE_IDENTITY`, possibly with -//! `MACH_EXCEPTION_CODES` also set. In other cases, these parameters are unused -//! and may be set to `0` (\a old_state_count) or `nullptr` (the remaining -//! parameters). -//! -//! Except as noted, the parameters and return value are equivalent to those of -//! the `*exception_raise*()` family of functions. -//! -//! \param[in] behavior The exception behavior, which dictates which function -//! will be called. It is an error to call this function with an invalid -//! value for \a behavior. -//! \param[in] exception_port -//! \param[in] thread -//! \param[in] task -//! \param[in] exception -//! \param[in] code If \a behavior indicates a behavior without -//! `MACH_EXCEPTION_CODES`, the elements of \a code will be truncated in -//! order to be passed to the appropriate exception handler. -//! \param[in] code_count -//! \param[in,out] flavor -//! \param[in] old_state -//! \param[in] old_state_count -//! \param[out] new_state -//! \param[out] new_state_count -//! -//! \return The return value of the function called. -kern_return_t UniversalExceptionRaise(exception_behavior_t behavior, - exception_handler_t exception_port, - thread_t thread, - task_t task, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t* flavor, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count, - thread_state_t new_state, - mach_msg_type_number_t* new_state_count); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_EXC_CLIENT_VARIANTS_H_ diff --git a/Tools/Crashpad/include/util/mach/exc_server_variants.h b/Tools/Crashpad/include/util/mach/exc_server_variants.h deleted file mode 100644 index c7b35d4184..0000000000 --- a/Tools/Crashpad/include/util/mach/exc_server_variants.h +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ -#define CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ - -#include <mach/mach.h> - -#include <memory> -#include <set> - -#include "base/macros.h" -#include "util/mach/mach_extensions.h" -#include "util/mach/mach_message_server.h" - -namespace crashpad { - -namespace internal { -class UniversalMachExcServerImpl; -} // namespace internal - -//! \brief A server interface for the `exc` and `mach_exc` Mach subsystems, -//! unified to handle exceptions delivered to either subsystem, and -//! simplified to have only a single interface method needing -//! implementation. -//! -//! The `<mach/exc.defs>` and `<mach/mach_exc.defs>` interfaces are identical, -//! except that the latter allows for 64-bit exception codes, and is requested -//! by setting the MACH_EXCEPTION_CODES behavior bit associated with an -//! exception port. -//! -//! UniversalMachExcServer operates by translating messages received in the -//! `exc` subsystem to a variant that is compatible with the `mach_exc` -//! subsystem. This involves changing the format of \a code, the exception code -//! field, from `exception_data_type_t` to `mach_exception_data_type_t`. -class UniversalMachExcServer final : public MachMessageServer::Interface { - public: - //! \brief An interface that the different request messages that are a part of - //! the `exc` and `mach_exc` Mach subsystems can be dispatched to. - class Interface { - public: - //! \brief Handles exceptions raised by `exception_raise()`, - //! `exception_raise_state()`, `exception_raise_state_identity()`, - //! `mach_exception_raise()`, `mach_exception_raise_state()`, and - //! `mach_exception_raise_state_identity()`. - //! - //! For convenience in implementation, these different “behaviors†of - //! exception messages are all mapped to a single interface method. The - //! exception’s original “behavior†is specified in the \a behavior - //! parameter. Only parameters that were supplied in the request message - //! are populated, other parameters are set to reasonable default values. - //! - //! This behaves equivalently to a `catch_exception_raise_state_identity()` - //! function used with `exc_server()`, or a - //! `catch_mach_exception_raise_state_identity()` function used with - //! `mach_exc_server()`. Except as noted, the parameters and return value - //! are equivalent to those of these other functions. - //! - //! \param[in] behavior `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, - //! or `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES` - //! ORed in. This identifies which exception request message was - //! processed and thus which other parameters are valid. - //! \param[in] exception_port - //! \param[in] thread - //! \param[in] task - //! \param[in] exception - //! \param[in] code - //! \param[in] code_count - //! \param[in,out] flavor - //! \param[in] old_state - //! \param[in] old_state_count - //! \param[out] new_state - //! \param[out] new_state_count - //! \param[in] trailer The trailer received with the request message. - //! \param[out] destroy_complex_request `true` if the request message is to - //! be destroyed even when this method returns success. See - //! MachMessageServer::Interface. - //! - //! \return A code indicating whether the exception was handled. See - //! ExcServerSuccessfulReturnValue() for success codes. On failure, - //! a code such as `KERN_FAILURE`. - virtual kern_return_t CatchMachException( - exception_behavior_t behavior, - exception_handler_t exception_port, - thread_t thread, - task_t task, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t* flavor, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count, - thread_state_t new_state, - mach_msg_type_number_t* new_state_count, - const mach_msg_trailer_t* trailer, - bool* destroy_complex_request) = 0; - - protected: - ~Interface() {} - }; - - //! \brief Constructs an object of this class. - //! - //! \param[in] interface The interface to dispatch requests to. Weak. - explicit UniversalMachExcServer(Interface* interface); - - ~UniversalMachExcServer(); - - // MachMessageServer::Interface: - bool MachMessageServerFunction(const mach_msg_header_t* in_header, - mach_msg_header_t* out_header, - bool* destroy_complex_request) override; - std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; - mach_msg_size_t MachMessageServerRequestSize() override; - mach_msg_size_t MachMessageServerReplySize() override; - - private: - std::unique_ptr<internal::UniversalMachExcServerImpl> impl_; - - DISALLOW_COPY_AND_ASSIGN(UniversalMachExcServer); -}; - -//! \brief Computes an approriate successful return value for an exception -//! handler function. -//! -//! For exception handlers that respond to state-carrying behaviors, when the -//! handler is called by the kernel (as it is normally), the kernel will attempt -//! to set a new thread state when the exception handler returns successfully. -//! Other code that mimics the kernel’s exception-delivery semantics may -//! implement the same or similar behavior. In some situations, it is -//! undesirable to set a new thread state. If the exception handler were to -//! return unsuccessfully, however, the kernel would continue searching for an -//! exception handler at a wider (task or host) scope. This may also be -//! undesirable. -//! -//! If such exception handlers return `MACH_RCV_PORT_DIED`, the kernel will not -//! set a new thread state and will also not search for another exception -//! handler. See 10.9.4 `xnu-2422.110.17/osfmk/kern/exception.c`. -//! `exception_deliver()` will only set a new thread state if the handler’s -//! return code was `MACH_MSG_SUCCESS` (a synonym for `KERN_SUCCESS`), and -//! subsequently, `exception_triage()` will not search for a new handler if the -//! handler’s return code was `KERN_SUCCESS` or `MACH_RCV_PORT_DIED`. -//! -//! This function allows exception handlers to compute an appropriate return -//! code to influence their caller (the kernel) in the desired way with respect -//! to setting a new thread state while suppressing the caller’s subsequent -//! search for other exception handlers. An exception handler should return the -//! value returned by this function. -//! -//! This function is useful even for `EXC_CRASH` handlers, where returning -//! `KERN_SUCCESS` and allowing the kernel to set a new thread state has been -//! observed to cause a perceptible and unnecessary waste of time. The victim -//! task in an `EXC_CRASH` handler is already being terminated and is no longer -//! schedulable, so there is no point in setting the states of any of its -//! threads. -//! -//! On OS X 10.11, the `MACH_RCV_PORT_DIED` mechanism cannot be used with an -//! `EXC_CRASH` handler without triggering an undesirable `EXC_CORPSE_NOTIFY` -//! exception. In that case, `KERN_SUCCESS` is always returned. Because this -//! function may return `KERN_SUCCESS` for a state-carrying exception, it is -//! important to ensure that the state returned by a state-carrying exception -//! handler is valid, because it will be passed to `thread_set_status()`. -//! ExcServerCopyState() may be used to achieve this. -//! -//! \param[in] exception The exception type passed to the exception handler. -//! This may be taken directly from the \a exception parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! \param[in] behavior The behavior of the exception handler as invoked. This -//! may be taken directly from the \a behavior parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! \param[in] set_thread_state `true` if the handler would like its caller to -//! set the new thread state using the \a flavor, \a new_state, and \a -//! new_state_count out parameters. This can only happen when \a behavior is -//! a state-carrying behavior. -//! -//! \return `KERN_SUCCESS` or `MACH_RCV_PORT_DIED`. `KERN_SUCCESS` is used when -//! \a behavior is not a state-carrying behavior, or when it is a -//! state-carrying behavior and \a set_thread_state is `true`, or for -//! `EXC_CRASH` exceptions on OS X 10.11 and later. Otherwise, -//! `MACH_RCV_PORT_DIED` is used. -kern_return_t ExcServerSuccessfulReturnValue(exception_type_t exception, - exception_behavior_t behavior, - bool set_thread_state); - -//! \brief Copies the old state to the new state for state-carrying exceptions. -//! -//! When the kernel sends a state-carrying exception request and the response is -//! successful (`MACH_MSG_SUCCESS`, a synonym for `KERN_SUCCESS`), it will set -//! a new thread state based on \a new_state and \a new_state_count. To ease -//! initialization of the new state, this function copies \a old_state and -//! \a old_state_count. This is only done if \a behavior indicates a -//! state-carrying exception. -//! -//! \param[in] behavior The behavior of the exception handler as invoked. This -//! may be taken directly from the \a behavior parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! \param[in] old_state The original state value. This may be taken directly -//! from the \a old_state parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! \param[in] old_state_count The number of significant `natural_t` words in \a -//! old_state. This may be taken directly from the \a old_state_count -//! parameter of internal::SimplifiedExcServer::Interface::CatchException(), -//! for example. -//! \param[out] new_state The state value to be set. This may be taken directly -//! from the \a new_state parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! This parameter is untouched if \a behavior is not state-carrying. -//! \param[in,out] new_state_count On entry, the number of `natural_t` words -//! available to be written to in \a new_state. On return, the number of -//! significant `natural_t` words in \a new_state. This may be taken -//! directly from the \a new_state_count parameter of -//! internal::SimplifiedExcServer::Interface::CatchException(), for example. -//! This parameter is untouched if \a behavior is not state-carrying. If \a -//! \a behavior is state-carrying, this parameter should be at least as -//! large as \a old_state_count. -void ExcServerCopyState(exception_behavior_t behavior, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count, - thread_state_t new_state, - mach_msg_type_number_t* new_state_count); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ diff --git a/Tools/Crashpad/include/util/mach/exception_behaviors.h b/Tools/Crashpad/include/util/mach/exception_behaviors.h deleted file mode 100644 index 14b5448a2b..0000000000 --- a/Tools/Crashpad/include/util/mach/exception_behaviors.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_EXCEPTION_BEHAVIORS_H_ -#define CRASHPAD_UTIL_MACH_EXCEPTION_BEHAVIORS_H_ - -#include <mach/mach.h> - -namespace crashpad { - -//! \brief Determines whether \a behavior indicates an exception behavior that -//! carries thread state information. -//! -//! When this function returns `true`, an exception message of \a behavior will -//! carry thread state information. Its \a flavor, \a old_state, \a -//! old_state_count, \a new_state, and \a new_state_count fields will be valid. -//! When this function returns `false`, these fields will not be valid. -//! -//! Exception behaviors that carry thread state information are -//! `EXCEPTION_STATE` and `EXCEPTION_STATE_IDENTITY`. `MACH_EXCEPTION_CODES` may -//! also be set. These behaviors correspond to `exception_raise_state()`, -//! `exception_raise_state_identity()`, `mach_exception_raise_state()`, and -//! `mach_exception_raise_state_identity()`. -//! -//! \param[in] behavior An exception behavior value. -//! -//! \return `true` if \a behavior is `EXCEPTION_STATE` or -//! `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES` also -//! set. -bool ExceptionBehaviorHasState(exception_behavior_t behavior); - -//! \brief Determines whether \a behavior indicates an exception behavior that -//! carries thread and task identities. -//! -//! When this function returns `true`, an exception message of \a behavior will -//! carry thread and task identities in the form of send rights to the thread -//! and task ports. Its \a thread and \a task fields will be valid. When this -//! function returns `false`, these fields will not be valid. -//! -//! Exception behaviors that carry thread and task identity information are -//! `EXCEPTION_DEFAULT` and `EXCEPTION_STATE_IDENTITY`. `MACH_EXCEPTION_CODES` -//! may also be set. These behaviors correspond to `exception_raise()`, -//! `exception_raise_state_identity()`, `mach_exception_raise()`, and -//! `mach_exception_raise_state_identity()`. -//! -//! \param[in] behavior An exception behavior value. -//! -//! \return `true` if \a behavior is `EXCEPTION_DEFAULT` or -//! `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES` also -//! set. -bool ExceptionBehaviorHasIdentity(exception_behavior_t behavior); - -//! \brief Determines whether \a behavior indicates an exception behavior that -//! carries 64-bit exception codes (“Mach exception codesâ€). -//! -//! When this function returns `true`, an exception message of \a behavior will -//! carry 64-bit exception codes of type `mach_exception_code_t` in its \a code -//! field. When this function returns `false`, the exception message will carry -//! 32-bit exception codes of type `exception_data_type_t` in its \a code field. -//! -//! Exception behaviors that carry 64-bit exception codes are those that have -//! `MACH_EXCEPTION_CODES` set. These behaviors correspond to -//! `mach_exception_raise()`, `mach_exception_raise_state()`, and -//! `mach_exception_raise_state_identity()`. -//! -//! \param[in] behavior An exception behavior value. -//! -//! \return `true` if `MACH_EXCEPTION_CODES` is set in \a behavior. -bool ExceptionBehaviorHasMachExceptionCodes(exception_behavior_t behavior); - -//! \brief Returns the basic behavior value of \a behavior, its value without -//! `MACH_EXCEPTION_CODES` set. -//! -//! \param[in] behavior An exception behavior value. -//! -//! \return `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, or -//! `EXCEPTION_STATE_IDENTITY`, assuming \a behavior was a correct exception -//! behavior value. -exception_behavior_t ExceptionBehaviorBasic(exception_behavior_t behavior); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_EXCEPTION_BEHAVIORS_H_ diff --git a/Tools/Crashpad/include/util/mach/exception_ports.h b/Tools/Crashpad/include/util/mach/exception_ports.h deleted file mode 100644 index b2473d98a0..0000000000 --- a/Tools/Crashpad/include/util/mach/exception_ports.h +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_EXCEPTION_PORTS_H_ -#define CRASHPAD_UTIL_MACH_EXCEPTION_PORTS_H_ - -#include <mach/mach.h> - -#include <vector> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief A better interface to `*_get_exception_ports()` and -//! `*_set_exception_ports()`. -//! -//! The same generic interface can be used to operate on host, task, and thread -//! exception ports. The “get†interface is superior to the system’s native -//! interface because it keeps related data about a single exception handler -//! together in one struct, rather than separating it into four parallel arrays. -class ExceptionPorts { - public: - //! \brief Various entities which can have their own exception ports set. - enum TargetType { - //! \brief The host exception target. - //! - //! `host_get_exception_ports()` and `host_set_exception_ports()` will be - //! used. If no target port is explicitly provided, `mach_host_self()` will - //! be used as the target port. `mach_host_self()` is the only target port - //! for this type that is expected to function properly. - //! - //! \note Operations on this target type are not expected to succeed as - //! non-root, because `mach_host_self()` doesn’t return the privileged - //! `host_priv` port to non-root users, and this is the target port - //! that’s required for `host_get_exception_ports()` and - //! `host_set_exception_ports()`. - kTargetTypeHost = 0, - - //! \brief A task exception target. - //! - //! `task_get_exception_ports()` and `task_set_exception_ports()` will be - //! used. If no target port is explicitly provided, `mach_task_self()` will - //! be used as the target port. - kTargetTypeTask, - - //! \brief A thread exception target. - //! - //! `thread_get_exception_ports()` and `thread_set_exception_ports()` will - //! be used. If no target port is explicitly provided, `mach_thread_self()` - //! will be used as the target port. - kTargetTypeThread, - }; - - //! \brief Information about a registered exception handler. - struct ExceptionHandler { - //! \brief A mask specifying the exception types to direct to \a port, - //! containing `EXC_MASK_*` values. - exception_mask_t mask; - - //! \brief A send right to a Mach port that will handle exceptions of the - //! types indicated in \a mask. - exception_handler_t port; - - //! \brief The “behavior†that the exception handler at \a port implements: - //! `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, or - //! `EXCEPTION_STATE_IDENTITY`, possibly combined with - //! `MACH_EXCEPTION_CODES`. - exception_behavior_t behavior; - - //! \brief The thread state flavor that the exception handler at \a port - //! will receive and possibly modify. This member has no effect for \a - //! \a behavior values that indicate a “default†behavior. - thread_state_flavor_t flavor; - }; - - //! \brief Wraps `std::vector<ExceptionHandler>`, providing proper cleanup of - //! the send rights contained in each element’s ExceptionHandler::port. - //! - //! Upon destruction or clear(), an object of this class will deallocate all - //! send rights it contains. Otherwise, it is an interface-compatible drop-in - //! replacement for `std::vector<ExceptionHandler>`. Note that non-`const` - //! mutators are not provided to avoid accidental Mach right leaks. - class ExceptionHandlerVector { - public: - using VectorType = std::vector<ExceptionHandler>; - - ExceptionHandlerVector(); - ~ExceptionHandlerVector(); - - VectorType::const_iterator begin() const { return vector_.begin(); } - VectorType::const_iterator end() const { return vector_.end(); } - VectorType::size_type size() const { return vector_.size(); } - bool empty() const { return vector_.empty(); } - VectorType::const_reference operator[](VectorType::size_type index) const { - return vector_[index]; - } - void push_back(VectorType::value_type& value) { vector_.push_back(value); } - void clear(); - - private: - void Deallocate(); - - VectorType vector_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerVector); - }; - - //! \brief Constructs an interface object to get or set exception ports on a - //! host, task, or thread port. - //! - //! \param[in] target_type The type of target on which the exception ports are - //! to be get or set: #kTargetTypeHost, #kTargetTypeTask, or or - //! #kTargetTypeThread. The correct functions for - //! `*_get_exception_ports()` and `*_set_exception_ports()` will be used. - //! \param[in] target_port The target on which to call - //! `*_get_exception_ports()` or `*_set_exception_ports()`. The target - //! port must be a send right to a port of the type specified in \a - //! target_type. In this case, ownership of \a target_port is not given to - //! the new ExceptionPorts object. \a target_port may also be - //! `HOST_NULL`, `TASK_NULL`, or `THREAD_NULL`, in which case - //! `mach_host_self()`, `mach_task_self()`, or `mach_thread_self()` will - //! be used as the target port depending on the value of \a target_type. - //! In this case, ownership of the target port will be managed - //! appropriately for \a target_type. - ExceptionPorts(TargetType target_type, mach_port_t target_port); - - ~ExceptionPorts(); - - //! \brief Calls `*_get_exception_ports()` on the target. - //! - //! \param[in] mask The exception mask, containing the `EXC_MASK_*` values to - //! be looked up and returned in \a handlers. - //! \param[out] handlers The exception handlers registered for \a target_port - //! to handle exceptions indicated in \a mask. If no execption port is - //! registered for a bit in \a mask, \a handlers will not contain an entry - //! corresponding to that bit. This is a departure from the - //! `*_get_exception_ports()` functions, which may return a handler whose - //! port is set to `EXCEPTION_PORT_NULL` in this case. On failure, this - //! argument is untouched. - //! - //! \return `true` if `*_get_exception_ports()` returned `KERN_SUCCESS`, with - //! \a handlers set appropriately. `false` otherwise, with an appropriate - //! message logged. - bool GetExceptionPorts(exception_mask_t mask, - ExceptionHandlerVector* handlers) const; - - //! \brief Calls `*_set_exception_ports()` on the target. - //! - //! \param[in] mask A mask specifying the exception types to direct to \a - //! port, containing `EXC_MASK_*` values. - //! \param[in] port A send right to a Mach port that will handle exceptions - //! sustained by \a target_port of the types indicated in \a mask. The - //! send right is copied, not consumed, by this call. - //! \param[in] behavior The “behavior†that the exception handler at \a port - //! implements: `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, or - //! `EXCEPTION_STATE_IDENTITY`, possibly combined with - //! `MACH_EXCEPTION_CODES`. - //! \param[in] flavor The thread state flavor that the exception handler at \a - //! port expects to receive and possibly modify. This argument has no - //! effect for \a behavior values that indicate a “default†behavior. - //! - //! \return `true` if `*_set_exception_ports()` returned `KERN_SUCCESS`. - //! `false` otherwise, with an appropriate message logged. - bool SetExceptionPort(exception_mask_t mask, - exception_handler_t port, - exception_behavior_t behavior, - thread_state_flavor_t flavor) const; - - //! \brief Returns a string identifying the target type. - //! - //! \return `"host"`, `"task"`, or `"thread"`, as appropriate. - const char* TargetTypeName() const; - - private: - using GetExceptionPortsType = kern_return_t(*)(mach_port_t, - exception_mask_t, - exception_mask_array_t, - mach_msg_type_number_t*, - exception_handler_array_t, - exception_behavior_array_t, - exception_flavor_array_t); - - using SetExceptionPortsType = kern_return_t(*)(mach_port_t, - exception_mask_t, - exception_handler_t, - exception_behavior_t, - thread_state_flavor_t); - - GetExceptionPortsType get_exception_ports_; - SetExceptionPortsType set_exception_ports_; - const char* target_name_; - mach_port_t target_port_; - - // If true, target_port_ will be deallocated in the destructor. This will - // always be false when the user provides a non-null target_port to the - // constructor. It will also be false when target_type is kTargetTypeTask, - // even with a TASK_NULL target_port, because it is incorrect to deallocate - // the result of mach_task_self(). - bool dealloc_target_port_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionPorts); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_EXCEPTION_PORTS_H_ diff --git a/Tools/Crashpad/include/util/mach/exception_types.h b/Tools/Crashpad/include/util/mach/exception_types.h deleted file mode 100644 index 5082ed194f..0000000000 --- a/Tools/Crashpad/include/util/mach/exception_types.h +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_EXCEPTION_TYPES_H_ -#define CRASHPAD_UTIL_MACH_EXCEPTION_TYPES_H_ - -#include <inttypes.h> -#include <mach/mach.h> -#include <sys/types.h> - -namespace crashpad { - -//! \brief Recovers the original exception, first exception code, and signal -//! from the encoded form of the first exception code delivered with -//! `EXC_CRASH` exceptions. -//! -//! `EXC_CRASH` exceptions are generated when the kernel has committed to -//! terminating a process as a result of a core-generating POSIX signal and, for -//! hardware exceptions, an earlier Mach exception. Information about this -//! earlier exception and signal is made available to the `EXC_CRASH` handler -//! via its `code[0]` parameter. This function recovers the original exception, -//! the value of `code[0]` from the original exception, and the value of the -//! signal responsible for process termination. -//! -//! \param[in] code_0 The first exception code (`code[0]`) passed to a Mach -//! exception handler in an `EXC_CRASH` exception. It is invalid to call -//! this function with an exception code from any exception other than -//! `EXC_CRASH`. -//! \param[out] original_code_0 The first exception code (`code[0]`) passed to -//! the Mach exception handler for a hardware exception that resulted in the -//! generation of a POSIX signal that caused process termination. If the -//! signal that caused termination was not sent as a result of a hardware -//! exception, this will be `0`. Callers that do not need this value may -//! pass `nullptr`. -//! \param[out] signal The POSIX signal that caused process termination. Callers -//! that do not need this value may pass `nullptr`. -//! -//! \return The original exception for a hardware exception that resulted in the -//! generation of a POSIX signal that caused process termination. If the -//! signal that caused termination was not sent as a result of a hardware -//! exception, this will be `0`. -exception_type_t ExcCrashRecoverOriginalException( - mach_exception_code_t code_0, - mach_exception_code_t* original_code_0, - int* signal); - -//! \brief Determines whether a given exception type could plausibly be carried -//! within an `EXC_CRASH` exception. -//! -//! \param[in] exception The exception type to test. -//! -//! \return `true` if an `EXC_CRASH` exception could plausibly carry \a -//! exception. -//! -//! An `EXC_CRASH` exception can wrap exceptions that originate as hardware -//! faults, as well as exceptions that originate from certain software sources -//! such as POSIX signals. It cannot wrap another `EXC_CRASH` exception, nor can -//! it wrap `EXC_RESOURCE`, `EXC_GUARD`, or `EXC_CORPSE_NOTIFY` exceptions. It -//! also cannot wrap Crashpad-specific #kMachExceptionSimulated exceptions. -bool ExcCrashCouldContainException(exception_type_t exception); - -//! \brief Returns the exception code to report via a configured metrics system. -//! -//! \param[in] exception The exception type as received by a Mach exception -//! handler. -//! \param[in] code_0 The first exception code (`code[0]`) as received by a -//! Mach exception handler. -//! -//! \return An exception code that maps useful information from \a exception and -//! \a code_0 to the more limited data type available for metrics reporting. -//! -//! For classic Mach exceptions (including hardware faults reported as Mach -//! exceptions), the mapping is `(exception << 16) | code_0`. -//! -//! For `EXC_CRASH` exceptions that originate as Mach exceptions described -//! above, the mapping above is used, with the original exception’s values. For -//! `EXC_CRASH` exceptions that originate as POSIX signals without an underlying -//! Mach exception, the mapping is `(EXC_CRASH << 16) | code_0`. -//! -//! `EXC_RESOURCE` and `EXC_GUARD` exceptions both contain exception-specific -//! “type†values and type-specific “flavor†values. In these cases, the mapping -//! is `(exception << 16) | (type << 8) | flavor`. For `EXC_GUARD`, the “flavor†-//! value is rewritten to be more space-efficient by replacing the -//! kernel-supplied bitmask having exactly one bit set with the index of the set -//! bit. -//! -//! `EXC_CORPSE_NOTIFY` exceptions are reported as classic Mach exceptions with -//! the \a code_0 field set to `0`. -//! -//! If \a exception is #kMachExceptionSimulated, that value is returned as-is. -//! -//! Overflow conditions in any field are handled via saturation. -int32_t ExceptionCodeForMetrics(exception_type_t exception, - mach_exception_code_t code_0); - -//! \brief Determines whether an exception is a non-fatal `EXC_RESOURCE`. -//! -//! \param[in] exception The exception type as received by a Mach exception -//! handler. -//! \param[in] code_0 The first exception code (`code[0]`) as received by a -//! Mach exception handler. -//! \param[in] pid The process ID that the exception occurred in. In some cases, -//! process may need to be queried to determine whether an `EXC_RESOURCE` -//! exception is fatal. -//! -//! \return `true` if the exception is a non-fatal `EXC_RESOURCE`. `false` -//! otherwise. If the exception is `EXC_RESOURCE` of a recognized type but -//! it is not possible to determine whether it is fatal, returns `true` -//! under the assumption that all known `EXC_RESOURCE` exceptions are -//! non-fatal by default. If the exception is not `EXC_RESOURCE` or is an -//! unknown `EXC_RESOURCE` type, returns `false`. -bool IsExceptionNonfatalResource(exception_type_t exception, - mach_exception_code_t code_0, - pid_t pid); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_EXCEPTION_TYPES_H_ diff --git a/Tools/Crashpad/include/util/mach/mach_extensions.h b/Tools/Crashpad/include/util/mach/mach_extensions.h deleted file mode 100644 index 25e401c230..0000000000 --- a/Tools/Crashpad/include/util/mach/mach_extensions.h +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_MACH_EXTENSIONS_H_ -#define CRASHPAD_UTIL_MACH_MACH_EXTENSIONS_H_ - -#include <mach/mach.h> - -#include <string> - -#include "base/mac/scoped_mach_port.h" - -namespace crashpad { - -//! \brief `MACH_PORT_NULL` with the correct type for a Mach port, -//! `mach_port_t`. -//! -//! For situations where implicit conversions between signed and unsigned types -//! are not performed, use kMachPortNull instead of an explicit `implicit_cast` -//! of `MACH_PORT_NULL` to `mach_port_t`. This is useful for logging and testing -//! assertions. -constexpr mach_port_t kMachPortNull = MACH_PORT_NULL; - -//! \brief `MACH_EXCEPTION_CODES` with the correct type for a Mach exception -//! behavior, `exception_behavior_t`. -//! -//! Signedness problems can occur when ORing `MACH_EXCEPTION_CODES` as a signed -//! integer, because a signed integer overflow results. This constant can be -//! used instead of `MACH_EXCEPTION_CODES` in such cases. -constexpr exception_behavior_t kMachExceptionCodes = MACH_EXCEPTION_CODES; - -// Because exception_mask_t is an int and has one bit for each defined -// exception_type_t, it’s reasonable to assume that there cannot be any -// officially-defined exception_type_t values higher than 31. -// kMachExceptionSimulated uses a value well outside this range because it does -// not require a corresponding mask value. Simulated exceptions are delivered to -// the exception handler registered for EXC_CRASH exceptions using -// EXC_MASK_CRASH. - -//! \brief An exception type to use for simulated exceptions. -constexpr exception_type_t kMachExceptionSimulated = 'CPsx'; - -//! \brief A const version of `thread_state_t`. -//! -//! This is useful as the \a old_state parameter to exception handler functions. -//! Normally, these parameters are of type `thread_state_t`, but this allows -//! modification of the state, which is conceptually `const`. -using ConstThreadState = const natural_t*; - -//! \brief Like `mach_thread_self()`, but without the obligation to release the -//! send right. -//! -//! `mach_thread_self()` returns a send right to the current thread port, -//! incrementing its reference count. This burdens the caller with maintaining -//! this send right, and calling `mach_port_deallocate()` when it is no longer -//! needed. This is burdensome, and is at odds with the normal operation of -//! `mach_task_self()`, which does not increment the task port’s reference count -//! whose result must not be deallocated. -//! -//! Callers can use this function in preference to `mach_thread_self()`. This -//! function returns an extant reference to the current thread’s port without -//! incrementing its reference count. -//! -//! \return The value of `mach_thread_self()` without incrementing its reference -//! count. The returned port must not be deallocated by -//! `mach_port_deallocate()`. The returned value is valid as long as the -//! thread continues to exist as a `pthread_t`. -thread_t MachThreadSelf(); - -//! \brief Creates a new Mach port in the current task. -//! -//! This function wraps the `mach_port_allocate()` providing a simpler -//! interface. -//! -//! \param[in] right The type of right to create. -//! -//! \return The new Mach port. On failure, `MACH_PORT_NULL` with a message -//! logged. -mach_port_t NewMachPort(mach_port_right_t right); - -//! \brief The value for `EXC_MASK_ALL` appropriate for the operating system at -//! run time. -//! -//! The SDK’s definition of `EXC_MASK_ALL` has changed over time, with later -//! versions containing more bits set than earlier versions. However, older -//! kernels will reject exception masks that contain bits set that they don’t -//! recognize. Calling this function will return a value for `EXC_MASK_ALL` -//! appropriate for the system at run time. -//! -//! \note `EXC_MASK_ALL` does not include the value of `EXC_MASK_CRASH` or -//! `EXC_MASK_CORPSE_NOTIFY`. Consumers that want `EXC_MASK_ALL` along with -//! `EXC_MASK_CRASH` may use ExcMaskAll() `| EXC_MASK_CRASH`. Consumers may -//! use ExcMaskValid() for `EXC_MASK_ALL` along with `EXC_MASK_CRASH`, -//! `EXC_MASK_CORPSE_NOTIFY`, and any values that come into existence in the -//! future. -exception_mask_t ExcMaskAll(); - -//! \brief An exception mask containing every possible exception understood by -//! the operating system at run time. -//! -//! `EXC_MASK_ALL`, and thus ExcMaskAll(), never includes the value of -//! `EXC_MASK_CRASH` or `EXC_MASK_CORPSE_NOTIFY`. For situations where an -//! exception mask corresponding to every possible exception understood by the -//! running kernel is desired, use this function instead. -//! -//! Should new exception types be introduced in the future, this function will -//! be updated to include their bits in the returned mask value when run time -//! support is present. -exception_mask_t ExcMaskValid(); - -//! \brief Makes a `boostrap_check_in()` call to the process’ bootstrap server. -//! -//! This function is provided to make it easier to call `bootstrap_check_in()` -//! while avoiding accidental leaks of the returned receive right. -//! -//! \param[in] service_name The service name to check in. -//! -//! \return On success, a receive right to the service port. On failure, -//! `MACH_PORT_NULL` with a message logged. -base::mac::ScopedMachReceiveRight BootstrapCheckIn( - const std::string& service_name); - -//! \brief Makes a `boostrap_look_up()` call to the process’ bootstrap server. -//! -//! This function is provided to make it easier to call `bootstrap_look_up()` -//! while avoiding accidental leaks of the returned send right. -//! -//! \param[in] service_name The service name to look up. -//! -//! \return On success, a send right to the service port. On failure, -//! `MACH_PORT_NULL` with a message logged. -base::mac::ScopedMachSendRight BootstrapLookUp(const std::string& service_name); - -//! \brief Obtains the system’s default Mach exception handler for crash-type -//! exceptions. -//! -//! This is obtained by looking up `"com.apple.ReportCrash"` with the bootstrap -//! server. The service name comes from the first launch agent loaded by -//! `launchd` with a `MachServices` entry having `ExceptionServer` set. This -//! launch agent is normally loaded from -//! `/System/Library/LaunchAgents/com.apple.ReportCrash.plist`. -//! -//! \return On success, a send right to an `exception_handler_t` corresponding -//! to the system’s default crash reporter. On failure, `MACH_PORT_NULL`, -//! with a message logged. -base::mac::ScopedMachSendRight SystemCrashReporterHandler(); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_MACH_EXTENSIONS_H_ diff --git a/Tools/Crashpad/include/util/mach/mach_message.h b/Tools/Crashpad/include/util/mach/mach_message.h deleted file mode 100644 index e0fc6f6f72..0000000000 --- a/Tools/Crashpad/include/util/mach/mach_message.h +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_MACH_MESSAGE_H_ -#define CRASHPAD_UTIL_MACH_MACH_MESSAGE_H_ - -#include <mach/mach.h> -#include <stdint.h> -#include <sys/types.h> - -namespace crashpad { - -//! \brief A Mach message option specifying that an audit trailer should be -//! delivered during a receive operation. -//! -//! This constant is provided because the macros normally used to request this -//! behavior are cumbersome. -constexpr mach_msg_option_t kMachMessageReceiveAuditTrailer = - MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0) | - MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT); - -//! \brief Special constants used as `mach_msg_timeout_t` values. -enum : mach_msg_timeout_t { - //! \brief When passed to MachMessageDeadlineFromTimeout(), that function will - //! return #kMachMessageDeadlineNonblocking. - kMachMessageTimeoutNonblocking = 0, - - //! \brief When passed to MachMessageDeadlineFromTimeout(), that function will - //! return #kMachMessageDeadlineWaitIndefinitely. - kMachMessageTimeoutWaitIndefinitely = 0xffffffff, -}; - -//! \brief The time before which a MachMessageWithDeadline() call should -//! complete. -//! -//! A value of this type may be one of the special constants -//! #kMachMessageDeadlineNonblocking or #kMachMessageDeadlineWaitIndefinitely. -//! Any other values should be produced by calling -//! MachMessageDeadlineFromTimeout(). -//! -//! Internally, these are currently specified on the same time base as -//! ClockMonotonicNanoseconds(), although this is an implementation detail. -using MachMessageDeadline = uint64_t; - -//! \brief Special constants used as \ref crashpad::MachMessageDeadline -//! "MachMessageDeadline" values. -enum : MachMessageDeadline { - //! \brief MachMessageWithDeadline() should not block at all in its operation. - kMachMessageDeadlineNonblocking = 0, - - //! \brief MachMessageWithDeadline() should wait indefinitely for the - //! requested operation to complete. - kMachMessageDeadlineWaitIndefinitely = 0xffffffffffffffff, -}; - -//! \brief Computes the deadline for a specified timeout value. -//! -//! While deadlines exist on an absolute time scale, timeouts are relative. This -//! function calculates the deadline as \a timeout_ms milliseconds after it -//! executes. -//! -//! If \a timeout_ms is #kMachMessageDeadlineNonblocking, this function will -//! return #kMachMessageDeadlineNonblocking. If \a timeout_ms is -//! #kMachMessageTimeoutWaitIndefinitely, this function will return -//! #kMachMessageDeadlineWaitIndefinitely. -MachMessageDeadline MachMessageDeadlineFromTimeout( - mach_msg_timeout_t timeout_ms); - -//! \brief Runs `mach_msg()` with a deadline, as opposed to a timeout. -//! -//! This function is similar to `mach_msg()`, with the following differences: -//! - The `timeout` parameter has been replaced by \a deadline. The deadline -//! applies uniformly to a call that is requested to both send and receive -//! a message. -//! - The `MACH_SEND_TIMEOUT` and `MACH_RCV_TIMEOUT` bits in \a options are -//! not used. Timeouts are specified by the \a deadline argument. -//! - The `send_size` parameter has been removed. Its value is implied by -//! \a message when \a options contains `MACH_SEND_MSG`. -//! - The \a run_even_if_expired parameter has been added. -//! -//! Like the `mach_msg()` wrapper in `libsyscall`, this function will retry -//! operations when experiencing `MACH_SEND_INTERRUPTED` and -//! `MACH_RCV_INTERRUPTED`, unless \a options contains `MACH_SEND_INTERRUPT` or -//! `MACH_RCV_INTERRUPT`. Unlike `mach_msg()`, which restarts the call with the -//! full timeout when this occurs, this function continues enforcing the -//! user-specified \a deadline. -//! -//! Except as noted, the parameters and return value are identical to those of -//! `mach_msg()`. -//! -//! \param[in,out] message -//! \param[in] options -//! \param[in] receive_size -//! \param[in] receive_port -//! \param[in] deadline The time by which this call should complete. If the -//! deadline is exceeded, this call will return `MACH_SEND_TIMED_OUT` or -//! `MACH_RCV_TIMED_OUT`. -//! \param[in] notify_port -//! \param[in] run_even_if_expired If `true`, a deadline that is expired when -//! this function is called will be treated as though a deadline of -//! #kMachMessageDeadlineNonblocking had been specified. When `false`, an -//! expired deadline will result in a `MACH_SEND_TIMED_OUT` or -//! `MACH_RCV_TIMED_OUT` return value, even if the deadline is already -//! expired when the function is called. -//! -//! \return The return value of `mach_msg()` -mach_msg_return_t MachMessageWithDeadline(mach_msg_header_t* message, - mach_msg_option_t options, - mach_msg_size_t receive_size, - mach_port_name_t receive_port, - MachMessageDeadline deadline, - mach_port_name_t notify_port, - bool run_even_if_expired); - -//! \brief Initializes a reply message for a MIG server routine based on its -//! corresponding request. -//! -//! If a request is handled by a server routine, it may be necessary to revise -//! some of the fields set by this function, such as `msgh_size` and any fields -//! defined in a routine’s reply structure type. -//! -//! \param[in] in_header The request message to base the reply on. -//! \param[out] out_header The reply message to initialize. \a out_header will -//! be treated as a `mig_reply_error_t*` and all of its fields will be set -//! except for `RetCode`, which must be set by SetMIGReplyError(). This -//! argument is accepted as a `mach_msg_header_t*` instead of a -//! `mig_reply_error_t*` because that is the type that callers are expected -//! to possess in the C API. -void PrepareMIGReplyFromRequest(const mach_msg_header_t* in_header, - mach_msg_header_t* out_header); - -//! \brief Sets the error code in a reply message for a MIG server routine. -//! -//! \param[in,out] out_header The reply message to operate on. \a out_header -//! will be treated as a `mig_reply_error_t*` and its `RetCode` field will -//! be set. This argument is accepted as a `mach_msg_header_t*` instead of a -//! `mig_reply_error_t*` because that is the type that callers are expected -//! to possess in the C API. -//! \param[in] error The error code to store in \a out_header. -//! -//! \sa PrepareMIGReplyFromRequest() -void SetMIGReplyError(mach_msg_header_t* out_header, kern_return_t error); - -//! \brief Returns a Mach message trailer for a message that has been received. -//! -//! This function must only be called on Mach messages that have been received -//! via the Mach messaging interface, such as `mach_msg()`. Messages constructed -//! for sending do not contain trailers. -//! -//! \param[in] header A pointer to a received Mach message. -//! -//! \return A pointer to the trailer following the received Mach message’s body. -//! The contents of the trailer depend on the options provided to -//! `mach_msg()` or a similar function when the message was received. -const mach_msg_trailer_t* MachMessageTrailerFromHeader( - const mach_msg_header_t* header); - -//! \brief Returns the process ID of a Mach message’s sender from its audit -//! trailer. -//! -//! For the audit trailer to be present, the message must have been received -//! with #kMachMessageReceiveAuditTrailer or its macro equivalent specified in -//! the receive options. -//! -//! If the kernel is the message’s sender, a process ID of `0` will be returned. -//! -//! \param[in] trailer The trailer received with a Mach message. -//! -//! \return The process ID of the message’s sender, or `-1` on failure with a -//! message logged. It is considered a failure for \a trailer to not contain -//! audit information. -pid_t AuditPIDFromMachMessageTrailer(const mach_msg_trailer_t* trailer); - -//! \brief Destroys or deallocates a Mach port received in a Mach message. -//! -//! This function disposes of port rights received in a Mach message. Receive -//! rights will be destroyed with `mach_port_mod_refs()`. Send and send-once -//! rights will be deallocated with `mach_port_deallocate()`. -//! -//! \param[in] port The port to destroy or deallocate. -//! \param[in] port_right_type The right type held for \a port: -//! `MACH_MSG_TYPE_PORT_RECEIVE`, `MACH_MSG_TYPE_PORT_SEND`, or -//! `MACH_MSG_TYPE_PORT_SEND_ONCE`. -//! -//! \return `true` on success, or `false` on failure with a message logged. -bool MachMessageDestroyReceivedPort(mach_port_t port, - mach_msg_type_name_t port_right_type); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_MACH_MESSAGE_H_ diff --git a/Tools/Crashpad/include/util/mach/mach_message_server.h b/Tools/Crashpad/include/util/mach/mach_message_server.h deleted file mode 100644 index 5e96c4cef3..0000000000 --- a/Tools/Crashpad/include/util/mach/mach_message_server.h +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_MACH_MESSAGE_SERVER_H_ -#define CRASHPAD_UTIL_MACH_MACH_MESSAGE_SERVER_H_ - -#include <mach/mach.h> - -#include <set> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Runs a Mach message server to handle a Mach RPC request for MIG -//! servers. -//! -//! The principal entry point to this interface is the static Run() method. -class MachMessageServer { - public: - //! \brief A Mach RPC callback interface, called by Run(). - class Interface { - public: - //! \brief Handles a Mach RPC request. - //! - //! This method is a stand-in for a MIG-generated Mach RPC server “demux†- //! function such as `exc_server()` and `mach_exc_server()`. Implementations - //! may call such a function directly. This method is expected to behave - //! exactly as these functions behave. - //! - //! \param[in] in The request message, received as a Mach message. Note that - //! this interface uses a `const` parameter for this purpose, whereas - //! MIG-generated “demux†functions do not. - //! \param[out] out The reply message. The caller allocates storage, and the - //! callee is expected to populate the reply message appropriately. - //! After returning, the caller will send this reply as a Mach message - //! via the message’s reply port. - //! \param[out] destroy_complex_request `true` if a complex request message - //! is to be destroyed even when handled successfully, `false` - //! otherwise. The traditional behavior is `false`. In this case, the - //! caller only destroys the request message in \a in when the reply - //! message in \a out is not complex and when it indicates a return code - //! other than `KERN_SUCCESS` or `MIG_NO_REPLY`. The assumption is that - //! the rights or out-of-line data carried in a complex message may be - //! retained by the server in this situation, and that it is the - //! responsibility of the server to release these resources as needed. - //! However, in many cases, these resources are not needed beyond the - //! duration of a request-reply transaction, and in such cases, it is - //! less error-prone to always have the caller, - //! MachMessageServer::Run(), destroy complex request messages. To - //! choose this behavior, this parameter should be set to `true`. - //! - //! \return `true` on success and `false` on failure, although the caller - //! ignores the return value. However, the return code to be included in - //! the reply message should be set as `mig_reply_error_t::RetCode`. The - //! non-`void` return value is used for increased compatibility with - //! MIG-generated functions. - virtual bool MachMessageServerFunction(const mach_msg_header_t* in, - mach_msg_header_t* out, - bool* destroy_complex_request) = 0; - - //! \return The set of request message Mach message IDs that - //! MachMessageServerFunction() is able to handle. - virtual std::set<mach_msg_id_t> MachMessageServerRequestIDs() = 0; - - //! \return The expected or maximum size, in bytes, of a request message to - //! be received as the \a in parameter of MachMessageServerFunction(). - virtual mach_msg_size_t MachMessageServerRequestSize() = 0; - - //! \return The maximum size, in bytes, of a reply message to be sent via - //! the \a out parameter of MachMessageServerFunction(). This value does - //! not need to include the size of any trailer to be sent with the - //! message. - virtual mach_msg_size_t MachMessageServerReplySize() = 0; - - protected: - ~Interface() {} - }; - - //! \brief Informs Run() whether to handle a single request-reply transaction - //! or to run in a loop. - enum Persistent { - //! \brief Handle a single request-reply transaction and then return. - kOneShot = false, - - //! \brief Run in a loop, potentially handling multiple request-reply - //! transactions. - kPersistent, - }; - - //! \brief Determines how to handle the reception of messages larger than the - //! size of the buffer allocated to store them. - enum ReceiveLarge { - //! \brief Return `MACH_RCV_TOO_LARGE` upon receipt of a large message. - //! - //! This mimics the default behavior of `mach_msg_server()` when `options` - //! does not contain `MACH_RCV_LARGE`. - kReceiveLargeError = 0, - - //! \brief Ignore large messages, and attempt to receive the next queued - //! message upon encountering one. - //! - //! When a large message is encountered, a warning will be logged. - //! - //! `mach_msg()` will be called to receive the next message after a large - //! one even when accompanied by a #Persistent value of #kOneShot. - kReceiveLargeIgnore, - - //! \brief Allocate an appropriately-sized buffer upon encountering a large - //! message. The buffer will be used to receive the message. This - //! - //! This mimics the behavior of `mach_msg_server()` when `options` contains - //! `MACH_RCV_LARGE`. - kReceiveLargeResize, - }; - - //! \brief Runs a Mach message server to handle a Mach RPC request for MIG - //! servers. - //! - //! This function listens for a request message and passes it to a callback - //! interface. A reponse is collected from that interface, and is sent back as - //! a reply. - //! - //! This function is similar to `mach_msg_server()` and - //! `mach_msg_server_once()`. - //! - //! \param[in] interface The MachMessageServerInterface that is responsible - //! for handling the message. Interface::MachMessageServerRequestSize() is - //! used as the receive size for the request message, and - //! Interface::MachMessageServerReplySize() is used as the - //! maximum size of the reply message. If \a options contains - //! `MACH_RCV_LARGE`, this function will retry a receive operation that - //! returns `MACH_RCV_TOO_LARGE` with an appropriately-sized buffer. - //! MachMessageServerInterface::MachMessageServerFunction() is called to - //! handle the request and populate the reply. - //! \param[in] receive_port The port on which to receive the request message. - //! \param[in] options Options suitable for mach_msg. For the defaults, use - //! `MACH_MSG_OPTION_NONE`. `MACH_RCV_LARGE` when specified here is - //! ignored. Set \a receive_large to #kReceiveLargeResize instead. - //! \param[in] persistent Chooses between one-shot and persistent operation. - //! \param[in] receive_large Determines the behavior upon encountering a - //! message larger than the receive buffer’s size. - //! \param[in] timeout_ms The maximum duration that this entire function will - //! run, in milliseconds. This may be #kMachMessageTimeoutNonblocking or - //! #kMachMessageTimeoutWaitIndefinitely. When \a persistent is - //! #kPersistent, the timeout applies to the overall duration of this - //! function, not to any individual `mach_msg()` call. - //! - //! \return On success, `MACH_MSG_SUCCESS` (when \a persistent is #kOneShot) - //! or `MACH_RCV_TIMED_OUT` (when \a persistent is #kOneShot and \a - //! timeout_ms is not #kMachMessageTimeoutWaitIndefinitely). This function - //! has no successful return value when \a persistent is #kPersistent and - //! \a timeout_ms is #kMachMessageTimeoutWaitIndefinitely. On failure, - //! returns a value identifying the nature of the error. A request - //! received with a reply port that is (or becomes) a dead name before the - //! reply is sent will result in `MACH_SEND_INVALID_DEST` as a return - //! value, which may or may not be considered an error from the caller’s - //! perspective. - static mach_msg_return_t Run(Interface* interface, - mach_port_t receive_port, - mach_msg_options_t options, - Persistent persistent, - ReceiveLarge receive_large, - mach_msg_timeout_t timeout_ms); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(MachMessageServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_MACH_MESSAGE_SERVER_H_ diff --git a/Tools/Crashpad/include/util/mach/notify_server.h b/Tools/Crashpad/include/util/mach/notify_server.h deleted file mode 100644 index ad0a888262..0000000000 --- a/Tools/Crashpad/include/util/mach/notify_server.h +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_NOTIFY_SERVER_H_ -#define CRASHPAD_UTIL_MACH_NOTIFY_SERVER_H_ - -#include <mach/mach.h> - -#include <set> - -#include "base/macros.h" -#include "util/mach/mach_message_server.h" - -namespace crashpad { - -//! \brief A server interface for the `notify` Mach subsystem. -//! -//! The <a -//! href="https://lists.apple.com/archives/darwin-development/2001/Sep/msg00451.html">mach -//! port notifications</a> thread on the <a -//! href="https://lists.apple.com/archives/darwin-development/">darwin-development</a> -//! mailing list (now known as <a -//! href="https://lists.apple.com/mailman/listinfo/darwin-dev">darwin-dev</a>) -//! is good background for the various notification types. -class NotifyServer : public MachMessageServer::Interface { - public: - //! \brief An interface that the different request messages that are a part of - //! the `notify` Mach subsystem can be dispatched to. - //! - //! Default implementations of all methods are available in the - //! DefaultInterface class. - class Interface { - public: - //! \brief Handles port-deleted notifications sent by - //! `mach_notify_port_deleted()`. - //! - //! A port-deleted notification is generated when a port with a dead-name - //! notification request is destroyed and the port name becomes available - //! for reuse. - //! - //! This behaves equivalently to a `do_mach_notify_port_deleted()` function - //! used with `notify_server()`. - //! - //! \param[in] notify The Mach port that the notification was sent to. - //! \param[in] name The name that formerly referenced the deleted port. When - //! this method is called, \a name no longer corresponds to the port - //! that has been deleted, and may be reused for another purpose. - //! \param[in] trailer The trailer received with the notification message. - virtual kern_return_t DoMachNotifyPortDeleted( - notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer) = 0; - - //! \brief Handles port-destroyed notifications sent by - //! `mach_notify_port_destroyed()`. - //! - //! A port-destroyed notification is generated when a receive right with a - //! port-destroyed notification request is destroyed. Rather than destroying - //! the receive right, it is transferred via this notification’s \a rights - //! parameter. - //! - //! This behaves equivalently to a `do_mach_notify_port_destroyed()` - //! function used with `notify_server()`. - //! - //! \param[in] notify The Mach port that the notification was sent to. - //! \param[in] rights A receive right for the port that would have been - //! destroyed. The callee takes ownership of this port, however, if the - //! callee does not wish to take ownership, it may set \a - //! destroy_request to `true`. - //! \param[in] trailer The trailer received with the notification message. - //! \param[out] destroy_request `true` if the request message is to be - //! destroyed even when this method returns success. See - //! MachMessageServer::Interface. - virtual kern_return_t DoMachNotifyPortDestroyed( - notify_port_t notify, - mach_port_t rights, - const mach_msg_trailer_t* trailer, - bool* destroy_request) = 0; - - //! \brief Handles no-senders notifications sent by - //! `mach_notify_no_senders()`. - //! - //! A no-senders notification is generated when a receive right with a - //! no-senders notification request loses its last corresponding send right. - //! - //! This behaves equivalently to a `do_mach_notify_no_senders()` function - //! used with `notify_server()`. - //! - //! \param[in] notify The Mach port that the notification was sent to. - //! \param[in] mscount The value of the sender-less port’s make-send count - //! at the time the notification was generated. - //! \param[in] trailer The trailer received with the notification message. - virtual kern_return_t DoMachNotifyNoSenders( - notify_port_t notify, - mach_port_mscount_t mscount, - const mach_msg_trailer_t* trailer) = 0; - - //! \brief Handles send-once notifications sent by - //! `mach_notify_send_once()`. - //! - //! A send-once notification is generated when a send-once right is - //! destroyed without being used. - //! - //! This behaves equivalently to a `do_mach_notify_send_once()` function - //! used with `notify_server()`. - //! - //! \param[in] notify The Mach port that the notification was sent to. - //! \param[in] trailer The trailer received with the notification message. - //! - //! \note Unlike the other notifications in the `notify` subsystem, - //! send-once notifications are not generated as a result of a - //! notification request, but are generated any time a send-once right - //! is destroyed rather than being used. The notification is sent via - //! the send-once right to its receiver. These notifications are more - //! useful for clients, not servers. Send-once notifications are - //! normally handled by MIG-generated client routines, which make - //! send-once rights for their reply ports and interpret send-once - //! notifications as a signal that there will be no reply. Although not - //! expected to be primarily useful for servers, this method is provided - //! because send-once notifications are defined as a part of the - //! `notify` subsystem. - virtual kern_return_t DoMachNotifySendOnce( - notify_port_t notify, - const mach_msg_trailer_t* trailer) = 0; - - //! \brief Handles dead-name notifications sent by - //! `mach_notify_dead_name()`. - //! - //! A dead-name notification is generated when a port with a dead-name - //! notification request is destroyed and the right becomes a dead name. - //! - //! This behaves equivalently to a `do_mach_notify_dead_name()` function - //! used with `notify_server()`. - //! - //! \param[in] notify The Mach port that the notification was sent to. - //! \param[in] name The dead name. Although this is transferred as a - //! `mach_port_name_t` and not a `mach_port_t`, the callee assumes an - //! additional reference to this port when this method is called. See - //! the note below. - //! \param[in] trailer The trailer received with the notification message. - //! - //! \note When a dead-name notification is generated, the user reference - //! count of the dead name is incremented. A send right with one - //! reference that becomes a dead name will have one dead-name - //! reference, and the dead-name notification will add another dead-name - //! reference, for a total of 2. DoMachNotifyDeadName() implementations - //! must take care to deallocate this extra reference. There is no \a - //! destroy_request parameter to simplify this operation because - //! dead-name notifications carry a port name only (\a name is of type - //! `mach_port_name_t`) without transferring port rights, and are thus - //! not complex Mach messages. - virtual kern_return_t DoMachNotifyDeadName( - notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer) = 0; - - protected: - ~Interface() {} - }; - - //! \brief A concrete implementation of Interface that provides a default - //! behavior for all `notify` routines. - //! - //! The Mach `notify` subsystem contains a collection of unrelated routines, - //! and a single server would rarely need to implement all of them. To make it - //! easier to use NotifyServer, a server can inherit from DefaultInterface - //! instead of Interface. Unless overridden, each routine in DefaultInterface - //! returns `MIG_BAD_ID` to indicate to the caller that the `notify` message - //! was unexpected and not processed. - class DefaultInterface : public Interface { - public: - // Interface: - - kern_return_t DoMachNotifyPortDeleted( - notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer) override; - - kern_return_t DoMachNotifyPortDestroyed( - notify_port_t notify, - mach_port_t rights, - const mach_msg_trailer_t* trailer, - bool* destroy_request) override; - - kern_return_t DoMachNotifyNoSenders( - notify_port_t notify, - mach_port_mscount_t mscount, - const mach_msg_trailer_t* trailer) override; - - kern_return_t DoMachNotifySendOnce( - notify_port_t notify, - const mach_msg_trailer_t* trailer) override; - - kern_return_t DoMachNotifyDeadName( - notify_port_t notify, - mach_port_name_t name, - const mach_msg_trailer_t* trailer) override; - - protected: - DefaultInterface() : Interface() {} - ~DefaultInterface() {} - - private: - DISALLOW_COPY_AND_ASSIGN(DefaultInterface); - }; - - //! \brief Constructs an object of this class. - //! - //! \param[in] interface The interface to dispatch requests to. Weak. - explicit NotifyServer(Interface* interface); - - // MachMessageServer::Interface: - - bool MachMessageServerFunction(const mach_msg_header_t* in_header, - mach_msg_header_t* out_header, - bool* destroy_complex_request) override; - - std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; - - mach_msg_size_t MachMessageServerRequestSize() override; - mach_msg_size_t MachMessageServerReplySize() override; - - private: - Interface* interface_; // weak - - DISALLOW_COPY_AND_ASSIGN(NotifyServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_NOTIFY_SERVER_H_ diff --git a/Tools/Crashpad/include/util/mach/scoped_task_suspend.h b/Tools/Crashpad/include/util/mach/scoped_task_suspend.h deleted file mode 100644 index 389ea5f62c..0000000000 --- a/Tools/Crashpad/include/util/mach/scoped_task_suspend.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_SCOPED_TASK_SUSPEND_H_ -#define CRASHPAD_UTIL_MACH_SCOPED_TASK_SUSPEND_H_ - -#include <mach/mach.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Manages the suspension of another task. -//! -//! While an object of this class exists, the other task will be suspended. Once -//! the object is destroyed, the other task will become eligible for resumption. -//! Note that suspensions are counted, and the task will not actually resume -//! unless its suspend count drops to 0. -//! -//! Callers should not attempt to suspend the current task (`mach_task_self()`). -class ScopedTaskSuspend { - public: - explicit ScopedTaskSuspend(task_t task); - ~ScopedTaskSuspend(); - - private: - task_t task_; - - DISALLOW_COPY_AND_ASSIGN(ScopedTaskSuspend); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_SCOPED_TASK_SUSPEND_H_ diff --git a/Tools/Crashpad/include/util/mach/symbolic_constants_mach.h b/Tools/Crashpad/include/util/mach/symbolic_constants_mach.h deleted file mode 100644 index be522fa875..0000000000 --- a/Tools/Crashpad/include/util/mach/symbolic_constants_mach.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_SYMBOLIC_CONSTANTS_MACH_H_ -#define CRASHPAD_UTIL_MACH_SYMBOLIC_CONSTANTS_MACH_H_ - -#include <mach/mach.h> - -#include <string> - -#include "base/strings/string_piece.h" -#include "util/misc/symbolic_constants_common.h" - -namespace crashpad { - -//! \brief Converts a Mach exception value to a textual representation. -//! -//! \param[in] exception The Mach exception value to convert. -//! \param[in] options Options affecting the conversion. ::kUseOr is ignored. -//! For ::kUnknownIsNumeric, the format is `"%d"`. -//! -//! \return The converted string. -std::string ExceptionToString(exception_type_t exception, - SymbolicConstantToStringOptions options); - -//! \brief Converts a string to its corresponding Mach exception value. -//! -//! \param[in] string The string to convert. -//! \param[in] options Options affecting the conversion. ::kAllowOr is ignored. -//! \param[out] exception The converted Mach exception value. -//! -//! \return `true` on success, `false` if \a string could not be converted as -//! requested. -bool StringToException(const base::StringPiece& string, - StringToSymbolicConstantOptions options, - exception_type_t* exception); - -//! \brief Converts a Mach exception mask value to a textual representation. -//! -//! \param[in] exception_mask The Mach exception mask value to convert. -//! \param[in] options Options affecting the conversion. ::kUseOr is honored. -//! For ::kUnknownIsNumeric, the format is `"%#x"`. -//! -//! \return The converted string. -std::string ExceptionMaskToString(exception_mask_t exception_mask, - SymbolicConstantToStringOptions options); - -//! \brief Converts a string to its corresponding Mach exception mask value. -//! -//! \param[in] string The string to convert. -//! \param[in] options Options affecting the conversion. ::kAllowOr is honored. -//! \param[out] exception_mask The converted Mach exception mask value. -//! -//! \return `true` on success, `false` if \a string could not be converted as -//! requested. -bool StringToExceptionMask(const base::StringPiece& string, - StringToSymbolicConstantOptions options, - exception_mask_t* exception_mask); - -//! \brief Converts a Mach exception behavior value to a textual representation. -//! -//! \param[in] behavior The Mach exception behavior value to convert. -//! \param[in] options Options affecting the conversion. ::kUseOr is ignored. -//! `MACH_EXCEPTION_CODES` can always be ORed in, but no other values can be -//! ORed with each other. For ::kUnknownIsNumeric, the format is `"%#x"`. -//! -//! \return The converted string. -std::string ExceptionBehaviorToString(exception_behavior_t behavior, - SymbolicConstantToStringOptions options); - -//! \brief Converts a string to its corresponding Mach exception behavior value. -//! -//! \param[in] string The string to convert. -//! \param[in] options Options affecting the conversion. ::kAllowOr is ignored. -//! `MACH_EXCEPTION_CODES` can always be ORed in, but no other values can be -//! ORed with each other. -//! \param[out] behavior The converted Mach exception behavior value. -//! -//! \return `true` on success, `false` if \a string could not be converted as -//! requested. -bool StringToExceptionBehavior(const base::StringPiece& string, - StringToSymbolicConstantOptions options, - exception_behavior_t* behavior); - -//! \brief Converts a thread state flavor value to a textual representation. -//! -//! \param[in] flavor The thread state flavor value to convert. -//! \param[in] options Options affecting the conversion. ::kUseOr is ignored. -//! For ::kUnknownIsNumeric, the format is `"%d"`. -//! -//! \return The converted string. -std::string ThreadStateFlavorToString(thread_state_flavor_t flavor, - SymbolicConstantToStringOptions options); - -//! \brief Converts a string to its corresponding thread state flavor value. -//! -//! \param[in] string The string to convert. -//! \param[in] options Options affecting the conversion. ::kAllowOr is ignored. -//! \param[out] flavor The converted thread state flavor value. -//! -//! \return `true` on success, `false` if \a string could not be converted as -//! requested. -bool StringToThreadStateFlavor(const base::StringPiece& string, - StringToSymbolicConstantOptions options, - thread_state_flavor_t* flavor); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_SYMBOLIC_CONSTANTS_MACH_H_ diff --git a/Tools/Crashpad/include/util/mach/task_for_pid.h b/Tools/Crashpad/include/util/mach/task_for_pid.h deleted file mode 100644 index 2b81fbebdd..0000000000 --- a/Tools/Crashpad/include/util/mach/task_for_pid.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_TASK_FOR_PID_H_ -#define CRASHPAD_UTIL_MACH_TASK_FOR_PID_H_ - -#include <mach/mach.h> -#include <sys/types.h> - -namespace crashpad { - -//! \brief Wraps `task_for_pid()`. -//! -//! This function exists to support `task_for_pid()` access checks in a setuid -//! environment. Normally, `task_for_pid()` can only return an arbitrary task’s -//! port when running as root or when taskgated(8) approves. When not running as -//! root, a series of access checks are perfomed to ensure that the running -//! process has permission to obtain the other process’ task port. -//! -//! It is possible to make an executable setuid root to give it broader -//! `task_for_pid()` access by bypassing taskgated(8) checks, but this also has -//! the effect of bypassing the access checks, allowing any process’ task port -//! to be obtained. In most situations, these access checks are desirable to -//! prevent security and privacy breaches. -//! -//! When running as setuid root, this function wraps `task_for_pid()`, -//! reimplementing those access checks. A process whose effective user ID is 0 -//! and whose real user ID is nonzero is understood to be running setuid root. -//! In this case, the requested task’s real, effective, and saved set-user IDs -//! must all equal the running process’ real user ID, the requested task must -//! not have changed privileges, and the requested task’s set of all group IDs -//! (including its real, effective, and saved set-group IDs and supplementary -//! group list) must be a subset of the running process’ set of all group IDs. -//! These access checks mimic those that the kernel performs. -//! -//! When not running as setuid root, `task_for_pid()` is called directly, -//! without imposing any additional checks beyond what the kernel does. -//! -//! \param[in] pid The process ID of the task whose task port is desired. -//! -//! \return A send right to the task port if it could be obtained, or -//! `TASK_NULL` otherwise, with an error message logged. If a send right is -//! returned, the caller takes ownership of it. -task_t TaskForPID(pid_t pid); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_TASK_FOR_PID_H_ diff --git a/Tools/Crashpad/include/util/mach/task_memory.h b/Tools/Crashpad/include/util/mach/task_memory.h deleted file mode 100644 index c8caf85cd5..0000000000 --- a/Tools/Crashpad/include/util/mach/task_memory.h +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MACH_TASK_MEMORY_H_ -#define CRASHPAD_UTIL_MACH_TASK_MEMORY_H_ - -#include <mach/mach.h> -#include <sys/types.h> - -#include <memory> -#include <string> - -#include "base/mac/scoped_mach_vm.h" -#include "base/macros.h" - -namespace crashpad { - -//! \brief Accesses the memory of another Mach task. -class TaskMemory { - public: - //! \brief A memory region mapped from another Mach task. - //! - //! The mapping is maintained until this object is destroyed. - class MappedMemory { - public: - ~MappedMemory(); - - //! \brief Returns a pointer to the data requested by the user. - //! - //! This is the value of the \a vm_address + \a user_offset parameters - //! passed to the constructor, casted to `const void*`. - const void* data() const { return data_; } - - //! \brief Reads a `NUL`-terminated C string from the mapped region. - //! - //! This method will read contiguous memory until a `NUL` terminator is - //! found. - //! - //! \param[in] offset The offset into data() of the string to be read. - //! \param[out] string The string, whose contents begin at data() and - //! continue up to a `NUL` terminator. - //! - //! \return `true` on success, with \a string set appropriately. If \a - //! offset is greater than or equal to the \a user_size constructor - //! parameter, or if no `NUL` terminator was found in data() after \a - //! offset, returns `false` with an appropriate warning logged. - bool ReadCString(size_t offset, std::string* string) const; - - private: - //! \brief Creates an object that owns a memory region mapped from another - //! Mach task. - //! - //! \param[in] vm_address The address in this process’ address space where - //! the mapping begins. This must be page-aligned. - //! \param[in] vm_size The total size of the mapping that begins at \a - //! vm_address. This must be page-aligned. - //! \param[in] user_offset The offset into the mapped region where the data - //! requested by the user begins. This accounts for the fact that a - //! mapping must be page-aligned but the user data may not be. This - //! parameter must be equal to or less than \a vm_size. - //! \param[in] user_size The size of the data requested by the user. This - //! parameter can be used to compute the end address of user data, which - //! must be within the mapped region. - MappedMemory(vm_address_t vm_address, - size_t vm_size, - size_t user_offset, - size_t user_size); - - base::mac::ScopedMachVM vm_; - const void* data_; - size_t user_size_; - - // The outer class needs to be able to call this class’ private constructor. - friend class TaskMemory; - - DISALLOW_COPY_AND_ASSIGN(MappedMemory); - }; - - //! \param[in] task A send right to the target task’s task port. This object - //! does not take ownership of the send right. - explicit TaskMemory(task_t task); - - ~TaskMemory() {} - - //! \brief Copies memory from the target task into a caller-provided buffer in - //! the current task. - //! - //! \param[in] address The address, in the target task’s address space, of the - //! memory region to copy. - //! \param[in] size The size, in bytes, of the memory region to copy. \a - //! buffer must be at least this size. - //! \param[out] buffer The buffer into which the contents of the other task’s - //! memory will be copied. - //! - //! \return `true` on success, with \a buffer filled appropriately. `false` on - //! failure, with a warning logged. Failures can occur, for example, when - //! encountering unmapped or unreadable pages. - //! - //! \sa ReadMapped() - bool Read(mach_vm_address_t address, size_t size, void* buffer); - - //! \brief Maps memory from the target task into the current task. - //! - //! This interface is an alternative to Read() that does not require the - //! caller to provide a buffer to fill. This avoids copying memory, which can - //! offer a performance improvement. - //! - //! \param[in] address The address, in the target task’s address space, of the - //! memory region to map. - //! \param[in] size The size, in bytes, of the memory region to map. - //! - //! \return On success, a MappedMemory object that provides access to the data - //! requested. On faliure, `nullptr`, with a warning logged. Failures can - //! occur, for example, when encountering unmapped or unreadable pages. - std::unique_ptr<MappedMemory> ReadMapped(mach_vm_address_t address, - size_t size); - - //! \brief Reads a `NUL`-terminated C string from the target task into a - //! string in the current task. - //! - //! The length of the string need not be known ahead of time. This method will - //! read contiguous memory until a `NUL` terminator is found. - //! - //! \param[in] address The address, in the target task’s address space, of the - //! string to copy. - //! \param[out] string The string read from the other task. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a warning logged. Failures can occur, for example, when - //! encountering unmapped or unreadable pages. - //! - //! \sa MappedMemory::ReadCString() - bool ReadCString(mach_vm_address_t address, std::string* string); - - //! \brief Reads a `NUL`-terminated C string from the target task into a - //! string in the current task. - //! - //! \param[in] address The address, in the target task’s address space, of the - //! string to copy. - //! \param[in] size The maximum number of bytes to read. The string is - //! required to be `NUL`-terminated within this many bytes. - //! \param[out] string The string read from the other task. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a warning logged. Failures can occur, for example, when - //! a `NUL` terminator is not found within \a size bytes, or when - //! encountering unmapped or unreadable pages. - //! - //! \sa MappedMemory::ReadCString() - bool ReadCStringSizeLimited(mach_vm_address_t address, - mach_vm_size_t size, - std::string* string); - - private: - // The common internal implementation shared by the ReadCString*() methods. - bool ReadCStringInternal(mach_vm_address_t address, - bool has_size, - mach_vm_size_t size, - std::string* string); - - task_t task_; // weak - - DISALLOW_COPY_AND_ASSIGN(TaskMemory); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MACH_TASK_MEMORY_H_ diff --git a/Tools/Crashpad/include/util/misc/address_sanitizer.h b/Tools/Crashpad/include/util/misc/address_sanitizer.h deleted file mode 100644 index 75c72399aa..0000000000 --- a/Tools/Crashpad/include/util/misc/address_sanitizer.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_ADDRESS_SANITIZER_H_ -#define CRASHPAD_UTIL_MISC_ADDRESS_SANITIZER_H_ - -#include "base/compiler_specific.h" -#include "build/build_config.h" - -#if !defined(ADDRESS_SANITIZER) -#if HAS_FEATURE(address_sanitizer) || \ - (defined(COMPILER_GCC) && defined(__SANITIZE_ADDRESS__)) -#define ADDRESS_SANITIZER 1 -#endif -#endif // !defined(ADDRESS_SANITIZER) - -#endif // CRASHPAD_UTIL_MISC_ADDRESS_SANITIZER_H_ diff --git a/Tools/Crashpad/include/util/misc/address_types.h b/Tools/Crashpad/include/util/misc/address_types.h deleted file mode 100644 index bfce35fcff..0000000000 --- a/Tools/Crashpad/include/util/misc/address_types.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ -#define CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ - -#include <stdint.h> - -#include <type_traits> - -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include <mach/mach_types.h> -#elif defined(OS_WIN) -#include "util/win/address_types.h" -#elif defined(OS_LINUX) || defined(OS_ANDROID) -#include "util/linux/address_types.h" -#else -#error "Unhandled OS type" -#endif - -namespace crashpad { - -#if DOXYGEN - -//! \brief Type used to represent an address in a process, potentially across -//! bitness. -using VMAddress = uint64_t; - -//! \brief Type used to represent the size of a memory range (with a -//! VMAddress), potentially across bitness. -using VMSize = uint64_t; - -#elif defined(OS_MACOSX) - -using VMAddress = mach_vm_address_t; -using VMSize = mach_vm_size_t; - -#elif defined(OS_WIN) - -using VMAddress = WinVMAddress; -using VMSize = WinVMSize; - -#elif defined(OS_LINUX) || defined(OS_ANDROID) - -using VMAddress = LinuxVMAddress; -using VMSize = LinuxVMSize; - -#endif - -//! \brief Type used to represent an offset from a VMAddress, potentially -//! across bitness. -using VMOffset = std::make_signed<VMSize>::type; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ diff --git a/Tools/Crashpad/include/util/misc/arraysize_unsafe.h b/Tools/Crashpad/include/util/misc/arraysize_unsafe.h deleted file mode 100644 index e53c70b8c8..0000000000 --- a/Tools/Crashpad/include/util/misc/arraysize_unsafe.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_ARRAYSIZE_UNSAFE_H_ -#define CRASHPAD_UTIL_MISC_ARRAYSIZE_UNSAFE_H_ - -//! \file - -//! \brief Not the safest way of computing an array’s size… -//! -//! `#%include "base/macros.h"` and use its `arraysize()` instead. This macro -//! should only be used in rare situations where `arraysize()` does not -//! function. -#define ARRAYSIZE_UNSAFE(array) (sizeof(array) / sizeof(array[0])) - -#endif // CRASHPAD_UTIL_MISC_ARRAYSIZE_UNSAFE_H_ diff --git a/Tools/Crashpad/include/util/misc/as_underlying_type.h b/Tools/Crashpad/include/util/misc/as_underlying_type.h deleted file mode 100644 index ba673ae5c2..0000000000 --- a/Tools/Crashpad/include/util/misc/as_underlying_type.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_AS_UNDERLYING_TYPE_H_ -#define CRASHPAD_UTIL_MISC_AS_UNDERLYING_TYPE_H_ - -#include <type_traits> - -namespace crashpad { - -//! \brief Casts a value to its underlying type. -//! -//! \param[in] from The value to be casted. -//! \return \a from casted to its underlying type. -template <typename From> -constexpr typename std::underlying_type<From>::type AsUnderlyingType( - From from) { - return static_cast<typename std::underlying_type<From>::type>(from); -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_AS_UNDERLYING_TYPE_H_ diff --git a/Tools/Crashpad/include/util/misc/clock.h b/Tools/Crashpad/include/util/misc/clock.h deleted file mode 100644 index a07e12a6ee..0000000000 --- a/Tools/Crashpad/include/util/misc/clock.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_CLOCK_H_ -#define CRASHPAD_UTIL_MISC_CLOCK_H_ - -#include <stdint.h> - -#include "build/build_config.h" - -namespace crashpad { - -//! \brief Returns the value of the system’s monotonic clock. -//! -//! The monotonic clock is a tick counter whose epoch is unspecified. It is a -//! monotonically-increasing clock that cannot be set, and never jumps backwards -//! on a running system. The monotonic clock may stop while the system is -//! sleeping, and it may be reset when the system starts up. This clock is -//! suitable for computing durations of events. Subject to the underlying -//! clock’s resolution, successive calls to this function will result in a -//! series of increasing values. -//! -//! \return The value of the system’s monotonic clock, in nanoseconds. -uint64_t ClockMonotonicNanoseconds(); - -#if !defined(OS_WIN) // Not implemented on Windows yet. - -//! \brief Sleeps for the specified duration. -//! -//! \param[in] nanoseconds The number of nanoseconds to sleep. The actual sleep -//! may be slightly longer due to latencies and timer resolution. -//! -//! This function is resilient against the underlying `nanosleep()` system call -//! being interrupted by a signal. -void SleepNanoseconds(uint64_t nanoseconds); - -#endif - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_CLOCK_H_ diff --git a/Tools/Crashpad/include/util/misc/from_pointer_cast.h b/Tools/Crashpad/include/util/misc/from_pointer_cast.h deleted file mode 100644 index f1b3734960..0000000000 --- a/Tools/Crashpad/include/util/misc/from_pointer_cast.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_FROM_POINTER_CAST_H_ -#define CRASHPAD_UTIL_MISC_FROM_POINTER_CAST_H_ - -#include <stdint.h> - -#include <cstddef> -#include <type_traits> - -#include "base/numerics/safe_conversions.h" - -namespace crashpad { - -#if DOXYGEN - -//! \brief Casts from a pointer type to an integer. -//! -//! Compared to `reinterpret_cast<>()`, FromPointerCast<>() defines whether a -//! pointer type is sign-extended or zero-extended. Casts to signed integral -//! types are sign-extended. Casts to unsigned integral types are zero-extended. -//! -//! Use FromPointerCast<>() instead of `reinterpret_cast<>()` when casting a -//! pointer to an integral type that may not be the same width as a pointer. -//! There is no need to prefer FromPointerCast<>() when casting to an integral -//! type that’s definitely the same width as a pointer, such as `uintptr_t` and -//! `intptr_t`. -template <typename To, typename From> -FromPointerCast(From from) { - return reinterpret_cast<To>(from); -} - -#else // DOXYGEN - -// Cast std::nullptr_t to any type. -// -// In C++14, the nullptr_t check could use std::is_null_pointer<From>::value -// instead of the is_same<remove_cv<From>::type, nullptr_t>::type construct. -template <typename To, typename From> -typename std::enable_if< - std::is_same<typename std::remove_cv<From>::type, std::nullptr_t>::value, - To>::type -FromPointerCast(From) { - return To(); -} - -// Cast a pointer to any other pointer type. -template <typename To, typename From> -typename std::enable_if<std::is_pointer<From>::value && - std::is_pointer<To>::value, - To>::type -FromPointerCast(From from) { - return reinterpret_cast<To>(from); -} - -// Cast a pointer to an integral type. Sign-extend when casting to a signed -// type, zero-extend when casting to an unsigned type. -template <typename To, typename From> -typename std::enable_if<std::is_pointer<From>::value && - std::is_integral<To>::value, - To>::type -FromPointerCast(From from) { - const auto intermediate = - reinterpret_cast<typename std::conditional<std::is_signed<To>::value, - intptr_t, - uintptr_t>::type>(from); - - if (sizeof(To) >= sizeof(From)) { - // If the destination integral type is at least as wide as the source - // pointer type, use static_cast<>() and just return it. - return static_cast<To>(intermediate); - } - - // If the destination integral type is narrower than the source pointer type, - // use checked_cast<>(). - return base::checked_cast<To>(intermediate); -} - -#endif // DOXYGEN - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_FROM_POINTER_CAST_H_ diff --git a/Tools/Crashpad/include/util/misc/implicit_cast.h b/Tools/Crashpad/include/util/misc/implicit_cast.h deleted file mode 100644 index 6f8a1a301d..0000000000 --- a/Tools/Crashpad/include/util/misc/implicit_cast.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_IMPLICIT_CAST_H_ -#define CRASHPAD_UTIL_MISC_IMPLICIT_CAST_H_ - -namespace crashpad { - -// Use implicit_cast as a safe version of static_cast or const_cast -// for upcasting in the type hierarchy (i.e. casting a pointer to Foo -// to a pointer to SuperclassOfFoo or casting a pointer to Foo to -// a const pointer to Foo). -// When you use implicit_cast, the compiler checks that the cast is safe. -// Such explicit implicit_casts are necessary in surprisingly many -// situations where C++ demands an exact type match instead of an -// argument type convertible to a target type. -// -// The From type can be inferred, so the preferred syntax for using -// implicit_cast is the same as for static_cast etc.: -// -// implicit_cast<ToType>(expr) -// -// implicit_cast would have been part of the C++ standard library, -// but the proposal was submitted too late. It will probably make -// its way into the language in the future. -template<typename To, typename From> -inline To implicit_cast(From const &f) { - return f; -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_IMPLICIT_CAST_H_ diff --git a/Tools/Crashpad/include/util/misc/initialization_state.h b/Tools/Crashpad/include/util/misc/initialization_state.h deleted file mode 100644 index 85f9b2894d..0000000000 --- a/Tools/Crashpad/include/util/misc/initialization_state.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ -#define CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ - -#include <stdint.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Tracks whether data are initialized. -//! -//! Objects of this type track whether the data they’re guarding are -//! initialized. The three possible states are uninitialized (the initial -//! state), initializing, and valid. As the guarded data are initialized, an -//! InitializationState object will normally transition through these three -//! states. A fourth state corresponds to the destruction of objects of this -//! type, making it less likely that a use-after-free of an InitializationState -//! object will appear in the valid state. -//! -//! If the only purpose for tracking the initialization state of guarded data is -//! to DCHECK when the object is in an unexpected state, use -//! InitializationStateDcheck instead. -class InitializationState { - public: - //! \brief The object’s state. - enum State : uint8_t { - //! \brief The object has not yet been initialized. - kStateUninitialized = 0, - - //! \brief The object is being initialized. - //! - //! This state protects against attempted reinitializaton of - //! partially-initialized objects whose initial initialization attempt - //! failed. This state is to be used while objects are initializing, but are - //! not yet fully initialized. - kStateInvalid, - - //! \brief The object has been initialized. - kStateValid, - - //! \brief The object has been destroyed. - kStateDestroyed, - }; - - InitializationState() : state_(kStateUninitialized) {} - ~InitializationState() { state_ = kStateDestroyed; } - - //! \brief Returns `true` if the object’s state is #kStateUninitialized and it - //! is safe to begin initializing it. - bool is_uninitialized() const { return state_ == kStateUninitialized; } - - //! \brief Sets the object’s state to #kStateInvalid, marking initialization - //! as being in process. - void set_invalid() { state_ = kStateInvalid; } - - //! \brief Sets the object’s state to #kStateValid, marking it initialized. - void set_valid() { state_ = kStateValid; } - - //! \brief Returns `true` if the the object’s state is #kStateValid and it has - //! been fully initialized and may be used. - bool is_valid() const { return state_ == kStateValid; } - - protected: - //! \brief Returns the object’s state. - //! - //! Consumers of this class should use an is_state_*() method instead. - State state() const { return state_; } - - //! \brief Sets the object’s state. - //! - //! Consumers of this class should use a set_state_*() method instead. - void set_state(State state) { state_ = state; } - - private: - // state_ is volatile to ensure that it’ll be set by the destructor when it - // runs. Otherwise, optimizations might prevent it from ever being set to - // kStateDestroyed, limiting this class’ ability to catch use-after-free - // errors. - volatile State state_; - - DISALLOW_COPY_AND_ASSIGN(InitializationState); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ diff --git a/Tools/Crashpad/include/util/misc/initialization_state_dcheck.h b/Tools/Crashpad/include/util/misc/initialization_state_dcheck.h deleted file mode 100644 index 7b6df9863b..0000000000 --- a/Tools/Crashpad/include/util/misc/initialization_state_dcheck.h +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_DCHECK_H_ -#define CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_DCHECK_H_ - -//! \file - -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/macros.h" -#include "build/build_config.h" -#include "util/misc/initialization_state.h" - -namespace crashpad { - -#if DCHECK_IS_ON() || DOXYGEN - -//! \brief Tracks whether data are initialized, triggering a DCHECK assertion -//! on an invalid data access. -//! -//! Put an InitializationStateDcheck member into a class to help DCHECK that -//! it’s in the right states at the right times. This is useful for classes with -//! Initialize() methods. The chief advantage of InitializationStateDcheck over -//! having a member variable to track state is that when the only use of the -//! variable is to DCHECK, it wastes space (in memory and executable code) in -//! non-DCHECK builds unless the code is also peppered with ugly `#%ifdef`s. -//! -//! This implementation concentrates the ugly `#%ifdef`s in one location. -//! -//! Usage: -//! -//! \code -//! class Class { -//! public: -//! Class() : initialized_() {} -//! -//! void Initialize() { -//! INITIALIZATION_STATE_SET_INITIALIZING(initialized_); -//! // Perform initialization. -//! INITIALIZATION_STATE_SET_VALID(initialized_); -//! } -//! -//! void DoSomething() { -//! INITIALIZATION_STATE_DCHECK_VALID(initialized_); -//! // Do something. -//! } -//! -//! private: -//! InitializationStateDcheck initialized_; -//! }; -//! \endcode -class InitializationStateDcheck : public InitializationState { - public: - InitializationStateDcheck() : InitializationState() {} - - //! \brief Returns the object’s state. - //! - //! Consumers of this class should not call this method. Use the - //! INITIALIZATION_STATE_SET_INITIALIZING(), INITIALIZATION_STATE_SET_VALID(), - //! and INITIALIZATION_STATE_DCHECK_VALID() macros instead. - // - // The superclass’ state() accessor is protected, but it needs to be exposed - // to consumers of this class for the macros below to work properly. The - // macros prefer access to the unerlying state value over a simple boolean - // because with access to the state value, DCHECK_EQ can be used, which, when - // tripped, prints both the expected and observed values. This can aid - // troubleshooting. - State state() const { return InitializationState::state(); } - - //! \brief Marks an uninitialized object as initializing. - //! - //! If the object is in the #kStateUninitialized state, changes its state to - //! #kStateInvalid (initializing) and returns the previous - //! (#kStateUninitialized) state. Otherwise, returns the object’s current - //! state. - //! - //! Consumers of this class should not call this method. Use the - //! INITIALIZATION_STATE_SET_INITIALIZING() macro instead. - State SetInitializing(); - - //! \brief Marks an initializing object as valid. - //! - //! If the object is in the #kStateInvalid (initializing) state, changes its - //! state to #kStateValid and returns the previous (#kStateInvalid) state. - //! Otherwise, returns the object’s current state. - //! - //! Consumers of this class should not call this method. Use the - //! INITIALIZATION_STATE_SET_VALID() macro instead. - State SetValid(); - - private: - DISALLOW_COPY_AND_ASSIGN(InitializationStateDcheck); -}; - -// Using macros enables the non-DCHECK no-op implementation below to be more -// compact and less intrusive. These are macros instead of methods that call -// DCHECK to enable the DCHECK failure message to point to the correct file and -// line number, and to allow additional messages to be streamed on failure with -// the << operator. - -//! \brief Checks that a crashpad::InitializationStateDcheck object is in the -//! crashpad::InitializationState::kStateUninitialized state, and changes -//! its state to initializing -//! (crashpad::InitializationState::kStateInvalid). -//! -//! If the object is not in the correct state, a DCHECK assertion is triggered -//! and the object’s state remains unchanged. -//! -//! \param[in] initialization_state_dcheck A crashpad::InitializationStateDcheck -//! object. -//! -//! \sa crashpad::InitializationStateDcheck -#define INITIALIZATION_STATE_SET_INITIALIZING(initialization_state_dcheck) \ - DCHECK_EQ((initialization_state_dcheck).SetInitializing(), \ - (initialization_state_dcheck).kStateUninitialized) - -//! \brief Checks that a crashpad::InitializationStateDcheck object is in the -//! initializing (crashpad::InitializationState::kStateInvalid) state, and -//! changes its state to crashpad::InitializationState::kStateValid. -//! -//! If the object is not in the correct state, a DCHECK assertion is triggered -//! and the object’s state remains unchanged. -//! -//! \param[in] initialization_state_dcheck A crashpad::InitializationStateDcheck -//! object. -//! -//! \sa crashpad::InitializationStateDcheck -#define INITIALIZATION_STATE_SET_VALID(initialization_state_dcheck) \ - DCHECK_EQ((initialization_state_dcheck).SetValid(), \ - (initialization_state_dcheck).kStateInvalid) - -//! \brief Checks that a crashpad::InitializationStateDcheck object is in the -//! crashpad::InitializationState::kStateValid state. -//! -//! If the object is not in the correct state, a DCHECK assertion is triggered. -//! -//! \param[in] initialization_state_dcheck A crashpad::InitializationStateDcheck -//! object. -//! -//! \sa crashpad::InitializationStateDcheck -#define INITIALIZATION_STATE_DCHECK_VALID(initialization_state_dcheck) \ - DCHECK_EQ((initialization_state_dcheck).state(), \ - (initialization_state_dcheck).kStateValid) - -#else - -#if defined(COMPILER_MSVC) -// bool[0] (below) is not accepted by MSVC. -struct InitializationStateDcheck { -}; -#else -// Since this is to be used as a DCHECK (for debugging), it should be -// non-intrusive in non-DCHECK (non-debug, release) builds. An empty struct -// would still have a nonzero size (rationale: -// http://www.stroustrup.com/bs_faq2.html#sizeof-empty). Zero-length arrays are -// technically invalid according to the standard, but clang and g++ accept them -// without complaint even with warnings turned up. They take up no space at all, -// and they can be “initialized†with the same () syntax used to initialize -// objects of the DCHECK_IS_ON() InitializationStateDcheck class above. -using InitializationStateDcheck = bool[0]; -#endif // COMPILER_MSVC - -// Avoid triggering warnings by repurposing these macros when DCHECKs are -// disabled. -#define INITIALIZATION_STATE_SET_INITIALIZING(initialization_state_dcheck) \ - ALLOW_UNUSED_LOCAL(initialization_state_dcheck) -#define INITIALIZATION_STATE_SET_VALID(initialization_state_dcheck) \ - ALLOW_UNUSED_LOCAL(initialization_state_dcheck) -#define INITIALIZATION_STATE_DCHECK_VALID(initialization_state_dcheck) \ - ALLOW_UNUSED_LOCAL(initialization_state_dcheck) - -#endif - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_DCHECK_H_ diff --git a/Tools/Crashpad/include/util/misc/lexing.h b/Tools/Crashpad/include/util/misc/lexing.h deleted file mode 100644 index ba37e0ca5f..0000000000 --- a/Tools/Crashpad/include/util/misc/lexing.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_LEXING_H_ -#define CRASHPAD_UTIL_MISC_LEXING_H_ - -namespace crashpad { - -//! \brief Match a pattern at the start of a char string. -//! -//! \param[in,out] input A pointer to the char string to match against. \a input -//! is advanced past the matched pattern if it is found. -//! \param[in] pattern The pattern to match at the start of \a input. -//! \return `true` if the pattern is matched exactly and \a input is advanced, -//! otherwise `false`. -bool AdvancePastPrefix(const char** input, const char* pattern); - -//! \brief Convert a prefix of a char string to a numeric value. -//! -//! Valid values are positive or negative decimal numbers, matching the regular -//! expression "-?\d+", and within the limits of T. -//! -//! \param[in,out] input A pointer to the char string to match against. \a input -//! is advanced past the number if one is found. -//! \param[out] value The converted number, if one is found. -//! \return `true` if a number is found at the start of \a input and \a input is -//! advanced, otherwise `false`. -template <typename T> -bool AdvancePastNumber(const char** input, T* value); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_LEXING_H diff --git a/Tools/Crashpad/include/util/misc/metrics.h b/Tools/Crashpad/include/util/misc/metrics.h deleted file mode 100644 index dd257a11b6..0000000000 --- a/Tools/Crashpad/include/util/misc/metrics.h +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_METRICS_H_ -#define CRASHPAD_UTIL_MISC_METRICS_H_ - -#include <inttypes.h> - -#include "base/macros.h" -#include "util/file/file_io.h" - -namespace crashpad { - -//! \brief Container class to hold shared UMA metrics integration points. -//! -//! Each static function in this class will call a `UMA_*` from -//! `base/metrics/histogram_macros.h`. When building Crashpad standalone, -//! (against mini_chromium), these macros do nothing. When built against -//! Chromium's base, they allow integration with its metrics system. -class Metrics { - public: - //! \brief Values for CrashReportPending(). - //! - //! \note These are used as metrics enumeration values, so new values should - //! always be added at the end, before PendingReportReason::kMaxValue. - enum class PendingReportReason : int32_t { - //! \brief A report was newly created and is ready for upload. - kNewlyCreated = 0, - - //! \brief The user manually requested the report be uploaded. - kUserInitiated = 1, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports when a crash upload has entered the pending state. - static void CrashReportPending(PendingReportReason reason); - - //! \brief Reports the size of a crash report file in bytes. Should be called - //! when a new report is written to disk. - static void CrashReportSize(FileHandle file); - - //! \brief Reports on a crash upload attempt, and if it succeeded. - static void CrashUploadAttempted(bool successful); - - //! \brief Values for CrashUploadSkipped(). - //! - //! \note These are used as metrics enumeration values, so new values should - //! always be added at the end, before CrashSkippedReason::kMaxValue. - enum class CrashSkippedReason : int32_t { - //! \brief Crash uploading is disabled. - kUploadsDisabled = 0, - - //! \brief There was another upload too recently, so this one was throttled. - kUploadThrottled = 1, - - //! \brief The report had an unexpected timestamp. - kUnexpectedTime = 2, - - //! \brief The database reported an error, likely due to a filesystem - //! problem. - kDatabaseError = 3, - - //! \brief The upload of the crash failed during communication with the - //! server. - kUploadFailed = 4, - - //! \brief The upload of the crash failed during communication with the - //! server. - kUserRefused = 5, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports when a report is moved to the completed state in the - //! database, without the report being uploadad. - static void CrashUploadSkipped(CrashSkippedReason reason); - - //! \brief The result of capturing an exception. - //! - //! \note These are used as metrics enumeration values, so new values should - //! always be added at the end, before CaptureResult::kMaxValue. - enum class CaptureResult : int32_t { - //! \brief The exception capture succeeded normally. - kSuccess = 0, - - //! \brief Unexpected exception behavior. - //! - //! This value is only used on macOS. - kUnexpectedExceptionBehavior = 1, - - //! \brief Failed due to attempt to suspend self. - //! - //! This value is only used on macOS. - kFailedDueToSuspendSelf = 2, - - //! \brief The process snapshot could not be captured. - kSnapshotFailed = 3, - - //! \brief The exception could not be initialized. - kExceptionInitializationFailed = 4, - - //! \brief The attempt to prepare a new crash report in the crash database - //! failed. - kPrepareNewCrashReportFailed = 5, - - //! \brief Writing the minidump to disk failed. - kMinidumpWriteFailed = 6, - - //! \brief There was a database error in attempt to complete the report. - kFinishedWritingCrashReportFailed = 7, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports on the outcome of capturing a report in the exception - //! handler. Should be called on all capture completion paths. - static void ExceptionCaptureResult(CaptureResult result); - - //! \brief The exception code for an exception was retrieved. - //! - //! These values are OS-specific, and correspond to - //! MINIDUMP_EXCEPTION::ExceptionCode. - static void ExceptionCode(uint32_t exception_code); - - //! \brief The exception handler server started capturing an exception. - static void ExceptionEncountered(); - - //! \brief An important event in a handler process’ lifetime. - //! - //! \note These are used as metrics enumeration values, so new values should - //! always be added at the end, before LifetimeMilestone::kMaxValue. - enum class LifetimeMilestone : int32_t { - //! \brief The handler process started. - kStarted = 0, - - //! \brief The handler process exited normally and cleanly. - kExitedNormally, - - //! \brief The handler process exited early, but was successful in - //! performing some non-default action on user request. - kExitedEarly, - - //! \brief The handler process exited with a failure code. - kFailed, - - //! \brief The handler process was forcibly terminated. - kTerminated, - - //! \brief The handler process crashed. - kCrashed, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Records a handler start/exit/crash event. - static void HandlerLifetimeMilestone(LifetimeMilestone milestone); - - //! \brief The handler process crashed with the given exception code. - //! - //! This is currently only reported on Windows. - static void HandlerCrashed(uint32_t exception_code); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(Metrics); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_METRICS_H_ diff --git a/Tools/Crashpad/include/util/misc/paths.h b/Tools/Crashpad/include/util/misc/paths.h deleted file mode 100644 index 30bbec5098..0000000000 --- a/Tools/Crashpad/include/util/misc/paths.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_PATHS_H_ -#define CRASHPAD_UTIL_PATHS_H_ - -#include "base/files/file_path.h" -#include "base/macros.h" - -namespace crashpad { - -//! \brief Functions to obtain paths. -class Paths { - public: - //! \brief Obtains the pathname of the currently-running executable. - //! - //! \param[out] path The pathname of the currently-running executable. - //! - //! \return `true` on success. `false` on failure, with a message logged. - //! - //! \note In test code, use test::TestPaths::Executable() instead. - static bool Executable(base::FilePath* path); - - DISALLOW_IMPLICIT_CONSTRUCTORS(Paths); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_TEST_PATHS_H_ diff --git a/Tools/Crashpad/include/util/misc/pdb_structures.h b/Tools/Crashpad/include/util/misc/pdb_structures.h deleted file mode 100644 index 218a763286..0000000000 --- a/Tools/Crashpad/include/util/misc/pdb_structures.h +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_PDB_STRUCTURES_H_ -#define CRASHPAD_UTIL_MISC_PDB_STRUCTURES_H_ - -#include <stdint.h> - -#include "util/misc/uuid.h" - -namespace crashpad { - -//! \brief A CodeView record linking to a `.pdb` 2.0 file. -//! -//! This format provides an indirect link to debugging data by referencing an -//! external `.pdb` file by its name, timestamp, and age. This structure may be -//! pointed to by MINIDUMP_MODULE::CvRecord. It has been superseded by -//! CodeViewRecordPDB70. -//! -//! For more information about this structure and format, see <a -//! href="http://www.debuginfo.com/articles/debuginfomatch.html#pdbfiles">Matching -//! Debug Information</a>, PDB Files, and <a -//! href="http://undocumented.rawol.com/sbs-w2k-1-windows-2000-debugging-support.pdf#page=63">Undocumented -//! Windows 2000 Secrets</a>, Windows 2000 Debugging Support/Microsoft Symbol -//! File Internals/CodeView Subsections. -//! -//! \sa IMAGE_DEBUG_MISC -struct CodeViewRecordPDB20 { - //! \brief The magic number identifying this structure version, stored in - //! #signature. - //! - //! In a hex dump, this will appear as “NB10†when produced by a little-endian - //! machine. - static const uint32_t kSignature = '01BN'; - - //! \brief The magic number identifying this structure version, the value of - //! #kSignature. - uint32_t signature; - - //! \brief The offset to CodeView data. - //! - //! In this structure, this field always has the value `0` because no CodeView - //! data is present, there is only a link to CodeView data stored in an - //! external file. - uint32_t offset; - - //! \brief The time that the `.pdb` file was created, in `time_t` format, the - //! number of seconds since the POSIX epoch. - uint32_t timestamp; - - //! \brief The revision of the `.pdb` file. - //! - //! A `.pdb` file’s age indicates incremental changes to it. When a `.pdb` - //! file is created, it has age `1`, and subsequent updates increase this - //! value. - uint32_t age; - - //! \brief The path or file name of the `.pdb` file associated with the - //! module. - //! - //! This is a NUL-terminated string. On Windows, it will be encoded in the - //! code page of the system that linked the module. On other operating - //! systems, UTF-8 may be used. - uint8_t pdb_name[1]; -}; - -//! \brief A CodeView record linking to a `.pdb` 7.0 file. -//! -//! This format provides an indirect link to debugging data by referencing an -//! external `.pdb` file by its name, %UUID, and age. This structure may be -//! pointed to by MINIDUMP_MODULE::CvRecord. -//! -//! For more information about this structure and format, see <a -//! href="http://www.debuginfo.com/articles/debuginfomatch.html#pdbfiles">Matching -//! Debug Information</a>, PDB Files. -//! -//! \sa CodeViewRecordPDB20 -//! \sa IMAGE_DEBUG_MISC -struct CodeViewRecordPDB70 { - // UUID has a constructor, which makes it non-POD, which makes this structure - // non-POD. In order for the default constructor to zero-initialize other - // members, an explicit constructor must be provided. - CodeViewRecordPDB70() - : signature(), - uuid(), - age(), - pdb_name() { - } - - //! \brief The magic number identifying this structure version, stored in - //! #signature. - //! - //! In a hex dump, this will appear as “RSDS†when produced by a little-endian - //! machine. - static const uint32_t kSignature = 'SDSR'; - - //! \brief The magic number identifying this structure version, the value of - //! #kSignature. - uint32_t signature; - - //! \brief The `.pdb` file’s unique identifier. - UUID uuid; - - //! \brief The revision of the `.pdb` file. - //! - //! A `.pdb` file’s age indicates incremental changes to it. When a `.pdb` - //! file is created, it has age `1`, and subsequent updates increase this - //! value. - uint32_t age; - - //! \brief The path or file name of the `.pdb` file associated with the - //! module. - //! - //! This is a NUL-terminated string. On Windows, it will be encoded in the - //! code page of the system that linked the module. On other operating - //! systems, UTF-8 may be used. - uint8_t pdb_name[1]; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_PDB_STRUCTURES_H_ diff --git a/Tools/Crashpad/include/util/misc/random_string.h b/Tools/Crashpad/include/util/misc/random_string.h deleted file mode 100644 index 93b3a7fa46..0000000000 --- a/Tools/Crashpad/include/util/misc/random_string.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_RANDOM_STRING_H_ -#define CRASHPAD_UTIL_MISC_RANDOM_STRING_H_ - -#include <string> - -namespace crashpad { - -//! \brief Returns a random string. -//! -//! The string consists of 16 uppercase characters chosen at random. The -//! returned string has over 75 bits of randomness (26<sup>16</sup> > -//! 2<sup>75</sup>). -std::string RandomString(); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_RANDOM_STRING_H_ diff --git a/Tools/Crashpad/include/util/misc/reinterpret_bytes.h b/Tools/Crashpad/include/util/misc/reinterpret_bytes.h deleted file mode 100644 index d6c8c78b60..0000000000 --- a/Tools/Crashpad/include/util/misc/reinterpret_bytes.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_REINTERPRET_BYTES_H_ -#define CRASHPAD_UTIL_MISC_REINTERPRET_BYTES_H_ - -#include <stddef.h> - -namespace crashpad { - -namespace internal { - -bool ReinterpretBytesImpl(const char* from, - size_t from_size, - char* to, - size_t to_size); - -} // namespace internal - -//! \brief Copies the bytes of \a from to \a to. -//! -//! This function is similar to `bit_cast`, except that it can operate on -//! differently sized types. -//! -//! \return `true` if the copy is possible without information loss, otherwise -//! `false` with a message logged. -template <typename From, typename To> -bool ReinterpretBytes(const From& from, To* to) { - return internal::ReinterpretBytesImpl(reinterpret_cast<const char*>(&from), - sizeof(From), - reinterpret_cast<char*>(to), - sizeof(To)); -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_REINTERPRET_BYTES_H_ diff --git a/Tools/Crashpad/include/util/misc/scoped_forbid_return.h b/Tools/Crashpad/include/util/misc/scoped_forbid_return.h deleted file mode 100644 index 4f1e214f79..0000000000 --- a/Tools/Crashpad/include/util/misc/scoped_forbid_return.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_SCOPED_FORBID_RETURN_H_ -#define CRASHPAD_UTIL_MISC_SCOPED_FORBID_RETURN_H_ - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Asserts that a scope must not be exited while unsafe. -//! -//! An object of this class has two states: armed and disarmed. A disarmed -//! object is a harmless no-op. An armed object will abort execution upon -//! destruction. Newly-constructed objects are armed by default. -//! -//! These objects may be used to assert that a scope not be exited while it is -//! unsafe to do so. If it ever becomes safe to leave such a scope, an object -//! can be disarmed. -class ScopedForbidReturn { - public: - ScopedForbidReturn() : armed_(true) {} - ~ScopedForbidReturn(); - - //! \brief Arms the object so that it will abort execution when destroyed. - //! - //! The most recent call to Arm() or Disarm() sets the state of the object. - void Arm() { armed_ = true; } - - //! \brief Arms the object so that it will abort execution when destroyed. - //! - //! The most recent call to Arm() or Disarm() sets the state of the object. - void Disarm() { armed_ = false; } - - private: - bool armed_; - - DISALLOW_COPY_AND_ASSIGN(ScopedForbidReturn); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_SCOPED_FORBID_RETURN_H_ diff --git a/Tools/Crashpad/include/util/misc/symbolic_constants_common.h b/Tools/Crashpad/include/util/misc/symbolic_constants_common.h deleted file mode 100644 index ea2495aa00..0000000000 --- a/Tools/Crashpad/include/util/misc/symbolic_constants_common.h +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_SYMBOLIC_CONSTANTS_COMMON_H_ -#define CRASHPAD_UTIL_MISC_SYMBOLIC_CONSTANTS_COMMON_H_ - -//! \file -//! -//! \anchor symbolic_constant_terminology -//! Symbolic constant terminology -//! ============================= -//! <dl> -//! <dt>Family</dt> -//! <dd>A group of related symbolic constants. Typically, within a single -//! family, one function will be used to transform a numeric value to a -//! string equivalent, and another will perform the inverse operation. -//! Families include POSIX signals and Mach exception masks.</dd> -//! <dt>Full name</dt> -//! <dd>The normal symbolic name used for a constant. For example, in the -//! family of POSIX signals, the strings `"SIGHUP"` and `"SIGSEGV"` are -//! full names.</dd> -//! <dt>Short name</dt> -//! <dd>An abbreviated form of symbolic name used for a constant. Short names -//! vary between families, but are commonly constructed by removing a -//! common prefix from full names. For example, in the family of POSIX -//! signals, the prefix is `SIG`, and short names include `"HUP"` and -//! `"SEGV"`.</dd> -//! <dt>Numeric string</dt> -//! <dd>A string that does not contain a full or short name, but contains a -//! numeric value that can be interpreted as a symbolic constant. For -//! example, in the family of POSIX signals, `SIGKILL` generally has value -//! `9`, so the numeric string `"9"` would be interpreted equivalently to -//! `"SIGKILL"`.</dd> -//! </dl> - -namespace crashpad { - -//! \brief Options for various `*ToString` functions in `symbolic_constants_*` -//! files. -//! -//! \sa \ref symbolic_constant_terminology "Symbolic constant terminology" -enum SymbolicConstantToStringOptionBits { - //! \brief Return the full name for a given constant. - //! - //! \attention API consumers should provide this value when desired, but - //! should provide only one of kUseFullName and ::kUseShortName. Because - //! kUseFullName is valueless, implementers should check for the absence - //! of ::kUseShortName instead. - kUseFullName = 0 << 0, - - //! \brief Return the short name for a given constant. - kUseShortName = 1 << 0, - - //! \brief If no symbolic name is known for a given constant, return an empty - //! string. - //! - //! \attention API consumers should provide this value when desired, but - //! should provide only one of kUnknownIsEmpty and ::kUnknownIsNumeric. - //! Because kUnknownIsEmpty is valueless, implementers should check for - //! the absence of ::kUnknownIsNumeric instead. - kUnknownIsEmpty = 0 << 1, - - //! \brief If no symbolic name is known for a given constant, return a numeric - //! string. - //! - //! The numeric format used will vary by family, but will be appropriate to - //! the family. Families whose values are typically constructed as bitfields - //! will generally use a hexadecimal format, and other families will generally - //! use a signed or unsigned decimal format. - kUnknownIsNumeric = 1 << 1, - - //! \brief Use `|` to combine values in a bitfield. - //! - //! For families whose values may be constructed as bitfields, allow - //! conversion to strings containing multiple individual components treated as - //! being combined by a bitwise “or†operation. An example family of constants - //! that behaves this way is the suite of Mach exception masks. For constants - //! that are not constructed as bitfields, or constants that are only - //! partially constructed as bitfields, this option has no effect. - kUseOr = 1 << 2, -}; - -//! \brief A bitfield containing values of #SymbolicConstantToStringOptionBits. -using SymbolicConstantToStringOptions = unsigned int; - -//! \brief Options for various `StringTo*` functions in `symbolic_constants_*` -//! files. -//! -//! Not every `StringTo*` function will implement each of these options. See -//! function-specific documentation for details. -//! -//! \sa \ref symbolic_constant_terminology "Symbolic constant terminology" -enum StringToSymbolicConstantOptionBits { - //! \brief Allow conversion from a string containing a symbolic constant by - //! its full name. - kAllowFullName = 1 << 0, - - //! \brief Allow conversion from a string containing a symbolic constant by - //! its short name. - kAllowShortName = 1 << 1, - - //! \brief Allow conversion from a numeric string. - kAllowNumber = 1 << 2, - - //! \brief Allow `|` to combine values in a bitfield. - //! - //! For families whose values may be constructed as bitfields, allow - //! conversion of strings containing multiple individual components treated as - //! being combined by a bitwise “or†operation. An example family of constants - //! that behaves this way is the suite of Mach exception masks. For constants - //! that are not constructed as bitfields, or constants that are only - //! partially constructed as bitfields, this option has no effect. - kAllowOr = 1 << 3, -}; - -//! \brief A bitfield containing values of #StringToSymbolicConstantOptionBits. -using StringToSymbolicConstantOptions = unsigned int; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_SYMBOLIC_CONSTANTS_COMMON_H_ diff --git a/Tools/Crashpad/include/util/misc/time.h b/Tools/Crashpad/include/util/misc/time.h deleted file mode 100644 index aabe8e6496..0000000000 --- a/Tools/Crashpad/include/util/misc/time.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_TIME_H_ -#define CRASHPAD_UTIL_MISC_TIME_H_ - -#include <stdint.h> -#include <sys/time.h> -#include <time.h> - -#include "build/build_config.h" - -#if defined(OS_WIN) -#include <windows.h> -#endif - -namespace crashpad { - -constexpr uint64_t kNanosecondsPerSecond = static_cast<uint64_t>(1E9); - -//! \brief Add `timespec` \a ts1 and \a ts2 and return the result in \a result. -void AddTimespec(const timespec& ts1, const timespec& ts2, timespec* result); - -//! \brief Subtract `timespec` \a ts2 from \a ts1 and return the result in \a -//! result. -void SubtractTimespec(const timespec& ts1, - const timespec& ts2, - timespec* result); - -//! \brief Convert the timespec \a ts to a timeval \a tv. -//! \return `true` if the assignment is possible without truncation. -bool TimespecToTimeval(const timespec& ts, timeval* tv); - -//! \brief Convert the timeval \a tv to a timespec \a ts. -void TimevalToTimespec(const timeval& tv, timespec* ts); - -#if defined(OS_WIN) || DOXYGEN - -//! \brief Convert a `timespec` to a Windows `FILETIME`, converting from POSIX -//! epoch to Windows epoch. -FILETIME TimespecToFiletimeEpoch(const timespec& ts); - -//! \brief Convert a Windows `FILETIME` to `timespec`, converting from Windows -//! epoch to POSIX epoch. -timespec FiletimeToTimespecEpoch(const FILETIME& filetime); - -//! \brief Convert Windows `FILETIME` to `timeval`, converting from Windows -//! epoch to POSIX epoch. -timeval FiletimeToTimevalEpoch(const FILETIME& filetime); - -//! \brief Convert Windows `FILETIME` to `timeval`, treating the values as -//! an interval of elapsed time. -timeval FiletimeToTimevalInterval(const FILETIME& filetime); - -//! \brief Similar to POSIX `gettimeofday()`, gets the current system time in -//! UTC. -void GetTimeOfDay(timeval* tv); - -#endif // OS_WIN - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_TIME_H_ diff --git a/Tools/Crashpad/include/util/misc/tri_state.h b/Tools/Crashpad/include/util/misc/tri_state.h deleted file mode 100644 index be55721488..0000000000 --- a/Tools/Crashpad/include/util/misc/tri_state.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_TRI_STATE_H_ -#define CRASHPAD_UTIL_MISC_TRI_STATE_H_ - -#include <stdint.h> - -namespace crashpad { - -//! \brief A tri-state value that can be unset, on, or off. -enum class TriState : uint8_t { - //! \brief The value has not explicitly been set. - //! - //! To allow a zero-initialized value to have this behavior, this must have - //! the value `0`. - kUnset = 0, - - //! \brief The value has explicitly been set to on, or a behavior has - //! explicitly been enabled. - kEnabled, - - //! \brief The value has explicitly been set to off, or a behavior has - //! explicitly been disabled. - kDisabled, -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_TRI_STATE_H_ diff --git a/Tools/Crashpad/include/util/misc/uuid.h b/Tools/Crashpad/include/util/misc/uuid.h deleted file mode 100644 index 4e5884e25a..0000000000 --- a/Tools/Crashpad/include/util/misc/uuid.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_UUID_H_ -#define CRASHPAD_UTIL_MISC_UUID_H_ - -#include <stdint.h> - -#include <string> - -#include "base/strings/string16.h" -#include "base/strings/string_piece.h" -#include "build/build_config.h" - -#if defined(OS_WIN) -#include <rpc.h> -#endif - -namespace crashpad { - -//! \brief A universally unique identifier (%UUID). -//! -//! An alternate term for %UUID is “globally unique identifier†(GUID), used -//! primarily by Microsoft. -//! -//! A %UUID is a unique 128-bit number specified by RFC 4122. -//! -//! This is a POD structure. -struct UUID { - bool operator==(const UUID& that) const; - bool operator!=(const UUID& that) const { return !operator==(that); } - - //! \brief Initializes the %UUID to zero. - void InitializeToZero(); - - //! \brief Initializes the %UUID from a sequence of bytes. - //! - //! \a bytes is taken as a %UUID laid out in big-endian format in memory. On - //! little-endian machines, appropriate byte-swapping will be performed to - //! initialize an object’s data members. - //! - //! \param[in] bytes A buffer of exactly 16 bytes that will be assigned to the - //! %UUID. - void InitializeFromBytes(const uint8_t* bytes); - - //! \brief Initializes the %UUID from a RFC 4122 §3 formatted string. - //! - //! \param[in] string A string of the form - //! `"00112233-4455-6677-8899-aabbccddeeff"`. - //! - //! \return `true` if the string was formatted correctly and the object has - //! been initialized with the data. `false` if the string could not be - //! parsed, with the object state untouched. - bool InitializeFromString(const base::StringPiece& string); - - //! \brief Initializes the %UUID using a standard system facility to generate - //! the value. - //! - //! \return `true` if the %UUID was initialized correctly, `false` otherwise - //! with a message logged. - bool InitializeWithNew(); - -#if defined(OS_WIN) || DOXYGEN - //! \brief Initializes the %UUID from a system `UUID` or `GUID` structure. - //! - //! \param[in] system_uuid A system `UUID` or `GUID` structure. - void InitializeFromSystemUUID(const ::UUID* system_uuid); -#endif // OS_WIN - - //! \brief Formats the %UUID per RFC 4122 §3. - //! - //! \return A string of the form `"00112233-4455-6677-8899-aabbccddeeff"`. - std::string ToString() const; - -#if defined(OS_WIN) || DOXYGEN - //! \brief The same as ToString, but returned as a string16. - base::string16 ToString16() const; -#endif // OS_WIN - - // These fields are laid out according to RFC 4122 §4.1.2. - uint32_t data_1; - uint16_t data_2; - uint16_t data_3; - uint8_t data_4[2]; - uint8_t data_5[6]; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_UUID_H_ diff --git a/Tools/Crashpad/include/util/misc/zlib.h b/Tools/Crashpad/include/util/misc/zlib.h deleted file mode 100644 index 99a9c91f9f..0000000000 --- a/Tools/Crashpad/include/util/misc/zlib.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_ZLIB_H_ -#define CRASHPAD_UTIL_MISC_ZLIB_H_ - -#include <string> - -namespace crashpad { - -//! \brief Obtain a \a window_bits parameter to pass to `deflateInit2()` or -//! `inflateInit2()` that specifies a `gzip` wrapper instead of the default -//! zlib wrapper. -//! -//! \param[in] window_bits A \a window_bits value that only specifies the base-2 -//! logarithm of the deflate sliding window size. -//! -//! \return \a window_bits adjusted to specify a `gzip` wrapper, to be passed to -//! `deflateInit2()` or `inflateInit2()`. -int ZlibWindowBitsWithGzipWrapper(int window_bits); - -//! \brief Formats a string for an error received from the zlib library. -//! -//! \param[in] zr A zlib result code, such as `Z_STREAM_ERROR`. -//! -//! \return A formatted string. -std::string ZlibErrorString(int zr); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_ZLIB_H_ diff --git a/Tools/Crashpad/include/util/net/http_body.h b/Tools/Crashpad/include/util/net/http_body.h deleted file mode 100644 index e053d9cd7e..0000000000 --- a/Tools/Crashpad/include/util/net/http_body.h +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_BODY_H_ -#define CRASHPAD_UTIL_NET_HTTP_BODY_H_ - -#include <stdint.h> -#include <sys/types.h> - -#include <string> -#include <vector> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/file/file_reader.h" - -namespace crashpad { - -//! \brief An interface to a stream that can be used for an HTTP request body. -class HTTPBodyStream { - public: - virtual ~HTTPBodyStream() {} - - //! \brief Copies up to \a max_len bytes into the user-supplied buffer. - //! - //! \param[out] buffer A user-supplied buffer into which this method will copy - //! bytes from the stream. - //! \param[in] max_len The length (or size) of \a buffer. At most this many - //! bytes will be copied. - //! - //! \return On success, a positive number indicating the number of bytes - //! actually copied to \a buffer. On failure, a negative number. When - //! the stream has no more data, returns `0`. - virtual FileOperationResult GetBytesBuffer(uint8_t* buffer, - size_t max_len) = 0; - - protected: - HTTPBodyStream() {} -}; - -//! \brief An implementation of HTTPBodyStream that turns a fixed string into -//! a stream. -class StringHTTPBodyStream : public HTTPBodyStream { - public: - //! \brief Creates a stream with the specified string. - //! - //! \param[in] string The string to turn into a stream. - explicit StringHTTPBodyStream(const std::string& string); - - ~StringHTTPBodyStream() override; - - // HTTPBodyStream: - FileOperationResult GetBytesBuffer(uint8_t* buffer, size_t max_len) override; - - private: - std::string string_; - size_t bytes_read_; - - DISALLOW_COPY_AND_ASSIGN(StringHTTPBodyStream); -}; - -//! \brief An implementation of HTTPBodyStream that reads from a -//! FileReaderInterface and provides its contents for an HTTP body. -class FileReaderHTTPBodyStream : public HTTPBodyStream { - public: - //! \brief Creates a stream for reading from a FileReaderInterface. - //! - //! \param[in] reader A FileReaderInterface from which this HTTPBodyStream - //! will read. - explicit FileReaderHTTPBodyStream(FileReaderInterface* reader); - - ~FileReaderHTTPBodyStream() override; - - // HTTPBodyStream: - FileOperationResult GetBytesBuffer(uint8_t* buffer, size_t max_len) override; - - private: - FileReaderInterface* reader_; // weak - bool reached_eof_; - - DISALLOW_COPY_AND_ASSIGN(FileReaderHTTPBodyStream); -}; - -//! \brief An implementation of HTTPBodyStream that combines an array of -//! several other HTTPBodyStream objects into a single, unified stream. -class CompositeHTTPBodyStream : public HTTPBodyStream { - public: - using PartsList = std::vector<HTTPBodyStream*>; - - //! \brief Creates a stream from an array of other stream parts. - //! - //! \param[in] parts A vector of HTTPBodyStream objects, of which this object - //! takes ownership, that will be represented as a single unified stream. - //! Callers should not mutate the stream objects after passing them to - //! an instance of this class. - explicit CompositeHTTPBodyStream(const PartsList& parts); - - ~CompositeHTTPBodyStream() override; - - // HTTPBodyStream: - FileOperationResult GetBytesBuffer(uint8_t* buffer, size_t max_len) override; - - private: - PartsList parts_; - PartsList::iterator current_part_; - - DISALLOW_COPY_AND_ASSIGN(CompositeHTTPBodyStream); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_BODY_H_ diff --git a/Tools/Crashpad/include/util/net/http_body_gzip.h b/Tools/Crashpad/include/util/net/http_body_gzip.h deleted file mode 100644 index da3a5f24d9..0000000000 --- a/Tools/Crashpad/include/util/net/http_body_gzip.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_BODY_GZIP_H_ -#define CRASHPAD_UTIL_NET_HTTP_BODY_GZIP_H_ - -#include <stdint.h> -#include <sys/types.h> - -#include <memory> - -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/net/http_body.h" - -extern "C" { -typedef struct z_stream_s z_stream; -} // extern "C" - -namespace crashpad { - -//! \brief An implementation of HTTPBodyStream that `gzip`-compresses another -//! HTTPBodyStream. -class GzipHTTPBodyStream : public HTTPBodyStream { - public: - explicit GzipHTTPBodyStream(std::unique_ptr<HTTPBodyStream> source); - - ~GzipHTTPBodyStream() override; - - // HTTPBodyStream: - FileOperationResult GetBytesBuffer(uint8_t* buffer, size_t max_len) override; - - private: - enum State : int { - kUninitialized, - kOperating, - kInputEOF, - kFinished, - kError, - }; - - // Calls deflateEnd() and transitions state_ to state. If deflateEnd() fails, - // logs a message and transitions state_ to State::kError. - void Done(State state); - - uint8_t input_[4096]; - std::unique_ptr<HTTPBodyStream> source_; - std::unique_ptr<z_stream> z_stream_; - State state_; - - DISALLOW_COPY_AND_ASSIGN(GzipHTTPBodyStream); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_BODY_GZIP_H_ diff --git a/Tools/Crashpad/include/util/net/http_body_test_util.h b/Tools/Crashpad/include/util/net/http_body_test_util.h deleted file mode 100644 index 288fccaeb6..0000000000 --- a/Tools/Crashpad/include/util/net/http_body_test_util.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_BODY_TEST_UTIL_H_ -#define CRASHPAD_UTIL_NET_HTTP_BODY_TEST_UTIL_H_ - -#include <sys/types.h> - -#include <string> - -namespace crashpad { - -class HTTPBodyStream; - -namespace test { - -//! \brief Reads a HTTPBodyStream to a string. If an error occurs, adds a -//! test failure and returns an empty string. -//! -//! \param[in] stream The stream from which to read. -//! -//! \return The contents of the stream, or an empty string on failure. -std::string ReadStreamToString(HTTPBodyStream* stream); - -//! \brief Reads a HTTPBodyStream to a string. If an error occurs, adds a -//! test failure and returns an empty string. -//! -//! \param[in] stream The stream from which to read. -//! \param[in] buffer_size The size of the buffer to use when reading from the -//! stream. -//! -//! \return The contents of the stream, or an empty string on failure. -std::string ReadStreamToString(HTTPBodyStream* stream, size_t buffer_size); - -} // namespace test -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_BODY_TEST_UTIL_H_ diff --git a/Tools/Crashpad/include/util/net/http_headers.h b/Tools/Crashpad/include/util/net/http_headers.h deleted file mode 100644 index 50335063b3..0000000000 --- a/Tools/Crashpad/include/util/net/http_headers.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_HEADERS_H_ -#define CRASHPAD_UTIL_NET_HTTP_HEADERS_H_ - -#include <map> -#include <string> - -namespace crashpad { - -//! \brief A map of HTTP header fields to their values. -using HTTPHeaders = std::map<std::string, std::string>; - -//! \brief The header name `"Content-Type"`. -constexpr char kContentType[] = "Content-Type"; - -//! \brief The header name `"Content-Length"`. -constexpr char kContentLength[] = "Content-Length"; - -//! \brief The header name `"Content-Encoding"`. -constexpr char kContentEncoding[] = "Content-Encoding"; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_HEADERS_H_ diff --git a/Tools/Crashpad/include/util/net/http_multipart_builder.h b/Tools/Crashpad/include/util/net/http_multipart_builder.h deleted file mode 100644 index c7c59a7739..0000000000 --- a/Tools/Crashpad/include/util/net/http_multipart_builder.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_ -#define CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/macros.h" -#include "util/file/file_reader.h" -#include "util/net/http_headers.h" - -namespace crashpad { - -class HTTPBodyStream; - -//! \brief This class is used to build a MIME multipart message, conforming to -//! RFC 2046, for use as a HTTP request body. -class HTTPMultipartBuilder { - public: - HTTPMultipartBuilder(); - ~HTTPMultipartBuilder(); - - //! \brief Enables or disables `gzip` compression. - //! - //! \param[in] gzip_enabled Whether to enable or disable `gzip` compression. - //! - //! When `gzip` compression is enabled, the body stream returned by - //! GetBodyStream() will be `gzip`-compressed, and the content headers set by - //! PopulateContentHeaders() will contain `Content-Encoding: gzip`. - void SetGzipEnabled(bool gzip_enabled); - - //! \brief Sets a `Content-Disposition: form-data` key-value pair. - //! - //! \param[in] key The key of the form data, specified as the `name` in the - //! multipart message. Any data previously set on this class with this - //! key will be overwritten. - //! \param[in] value The value to set at the \a key. - void SetFormData(const std::string& key, const std::string& value); - - //! \brief Specifies the contents read from \a reader to be uploaded as - //! multipart data, available at `name` of \a upload_file_name. - //! - //! \param[in] key The key of the form data, specified as the `name` in the - //! multipart message. Any data previously set on this class with this - //! key will be overwritten. - //! \param[in] upload_file_name The `filename` to specify for this multipart - //! data attachment. - //! \param[in] reader A FileReaderInterface from which to read the content to - //! upload. - //! \param[in] content_type The `Content-Type` to specify for the attachment. - //! If this is empty, `"application/octet-stream"` will be used. - void SetFileAttachment(const std::string& key, - const std::string& upload_file_name, - FileReaderInterface* reader, - const std::string& content_type); - - //! \brief Generates the HTTPBodyStream for the data currently supplied to - //! the builder. - //! - //! \return A caller-owned HTTPBodyStream object. - std::unique_ptr<HTTPBodyStream> GetBodyStream(); - - //! \brief Adds the appropriate content headers to \a http_headers. - //! - //! Any headers that this method adds will replace existing headers by the - //! same name in \a http_headers. - void PopulateContentHeaders(HTTPHeaders* http_headers) const; - - private: - struct FileAttachment { - std::string filename; - std::string content_type; - FileReaderInterface* reader; - }; - - // Removes elements from both data maps at the specified |key|, to ensure - // uniqueness across the entire HTTP body. - void EraseKey(const std::string& key); - - std::string boundary_; - std::map<std::string, std::string> form_data_; - std::map<std::string, FileAttachment> file_attachments_; - bool gzip_enabled_; - - DISALLOW_COPY_AND_ASSIGN(HTTPMultipartBuilder); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_ diff --git a/Tools/Crashpad/include/util/net/http_transport.h b/Tools/Crashpad/include/util/net/http_transport.h deleted file mode 100644 index f9948aa2e5..0000000000 --- a/Tools/Crashpad/include/util/net/http_transport.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_HTTP_TRANSPORT_H_ -#define CRASHPAD_UTIL_NET_HTTP_TRANSPORT_H_ - -#include <memory> -#include <string> - -#include "base/macros.h" -#include "util/net/http_headers.h" - -namespace crashpad { - -class HTTPBodyStream; - -//! \brief HTTPTransport executes a HTTP request using the specified URL, HTTP -//! method, headers, and body. This class can only issue a synchronous -//! HTTP request. -//! -//! This class cannot be instantiated directly. A concrete subclass must be -//! instantiated instead, which provides an implementation to execute the -//! request that is appropriate for the host operating system. -class HTTPTransport { - public: - virtual ~HTTPTransport(); - - //! \brief Instantiates a concrete HTTPTransport class for the current - //! operating system. - //! - //! \return A new caller-owned HTTPTransport object. - static std::unique_ptr<HTTPTransport> Create(); - - //! \brief Sets URL to which the request will be made. - //! - //! \param[in] url The request URL. - void SetURL(const std::string& url); - - //! \brief Sets the HTTP method to execute. E.g., GET, POST, etc. The default - //! method is `"POST"`. - //! - //! \param[in] http_method The HTTP method. - void SetMethod(const std::string& http_method); - - //! \brief Sets a HTTP header-value pair. - //! - //! \param[in] header The HTTP header name. Any previous value set at this - //! name will be overwritten. - //! \param[in] value The value to set for the header. - void SetHeader(const std::string& header, const std::string& value); - - //! \brief Sets the stream object from which to generate the HTTP body. - //! - //! \param[in] stream A HTTPBodyStream, of which this class will take - //! ownership. - void SetBodyStream(std::unique_ptr<HTTPBodyStream> stream); - - //! \brief Sets the timeout for the HTTP request. The default is 15 seconds. - //! - //! \param[in] timeout The request timeout, in seconds. - void SetTimeout(double timeout); - - //! \brief Performs the HTTP request with the configured parameters and waits - //! for the execution to complete. - //! - //! \param[out] response_body On success, this will be set to the HTTP - //! response body. This parameter is optional and may be set to `nullptr` - //! if the response body is not required. - //! - //! \return Whether or not the request was successful, defined as returning - //! a HTTP status 200 (OK) code. - virtual bool ExecuteSynchronously(std::string* response_body) = 0; - - protected: - HTTPTransport(); - - const std::string& url() const { return url_; } - const std::string& method() const { return method_; } - const HTTPHeaders& headers() const { return headers_; } - HTTPBodyStream* body_stream() const { return body_stream_.get(); } - double timeout() const { return timeout_; } - - private: - std::string url_; - std::string method_; - HTTPHeaders headers_; - std::unique_ptr<HTTPBodyStream> body_stream_; - double timeout_; - - DISALLOW_COPY_AND_ASSIGN(HTTPTransport); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_HTTP_TRANSPORT_H_ diff --git a/Tools/Crashpad/include/util/net/url.h b/Tools/Crashpad/include/util/net/url.h deleted file mode 100644 index 8817571fdf..0000000000 --- a/Tools/Crashpad/include/util/net/url.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NET_URL_H_ -#define CRASHPAD_UTIL_NET_URL_H_ - -#include <string> - -namespace crashpad { - -//! \brief Performs percent-encoding (URL encoding) on the input string, -//! following RFC 3986 paragraph 2. -//! -//! \param[in] url The string to be encoded. -//! \return The encoded string. -std::string URLEncode(const std::string& url); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NET_URL_H_ diff --git a/Tools/Crashpad/include/util/numeric/checked_address_range.h b/Tools/Crashpad/include/util/numeric/checked_address_range.h deleted file mode 100644 index 40c82390c7..0000000000 --- a/Tools/Crashpad/include/util/numeric/checked_address_range.h +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ -#define CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ - -#include <stdint.h> - -#include <string> - -#include "base/macros.h" -#include "build/build_config.h" -#include "util/numeric/checked_range.h" - -namespace crashpad { -namespace internal { - -//! \brief Ensures that a range, composed of a base and a size, does not -//! overflow the pointer type of the process it describes a range in. -//! -//! This class checks bases of type `ValueType` and sizes of type `SizeType` -//! against a process whose pointer type is either 32 or 64 bits wide. -//! -//! Aside from varying the overall range on the basis of a process’ pointer type -//! width, this class functions very similarly to CheckedRange. -//! -//! \sa CheckedMachAddressRange -template <class ValueType, class SizeType> -class CheckedAddressRangeGeneric { - public: - //! \brief Initializes a default range. - //! - //! The default range has base 0, size 0, and appears to be from a 32-bit - //! process. - CheckedAddressRangeGeneric(); - - //! \brief Initializes a range. - //! - //! See SetRange(). - CheckedAddressRangeGeneric(bool is_64_bit, ValueType base, SizeType size); - - //! \brief Sets a range’s fields. - //! - //! \param[in] is_64_bit `true` if \a base and \a size refer to addresses in a - //! 64-bit process; `false` if they refer to addresses in a 32-bit - //! process. - //! \param[in] base The range’s base address. - //! \param[in] size The range’s size. - void SetRange(bool is_64_bit, ValueType base, SizeType size); - - //! \brief The range’s base address. - ValueType Base() const; - - //! \brief The range’s size. - SizeType Size() const; - - //! \brief The range’s end address (its base address plus its size). - ValueType End() const; - - //! \brief Returns the validity of the address range. - //! - //! \return `true` if the address range is valid, `false` otherwise. - //! - //! An address range is valid if its size can be converted to the address - //! range’s data type without data loss, and if its end (base plus size) can - //! be computed without overflowing its data type. - bool IsValid() const; - - //! \brief Returns whether this range refers to a 64-bit process. - bool Is64Bit() const { return is_64_bit_; } - - //! \brief Returns whether the address range contains another address. - //! - //! \param[in] value The (possibly) contained address. - //! - //! \return `true` if the address range contains \a value, `false` otherwise. - //! - //! An address range contains a value if the value is greater than or equal to - //! its base address, and less than its end address (base address plus size). - //! - //! This method must only be called if IsValid() would return `true`. - bool ContainsValue(const ValueType value) const; - - //! \brief Returns whether the address range contains another address range. - //! - //! \param[in] that The (possibly) contained address range. - //! - //! \return `true` if `this` address range, the containing address range, - //! contains \a that, the contained address range. `false` otherwise. - //! - //! An address range contains another address range when the contained address - //! range’s base is greater than or equal to the containing address range’s - //! base, and the contained address range’s end is less than or equal to the - //! containing address range’s end. - //! - //! This method should only be called on two CheckedAddressRangeGeneric - //! objects representing address ranges in the same process. - //! - //! This method must only be called if IsValid() would return `true` for both - //! CheckedAddressRangeGeneric objects involved. - bool ContainsRange(const CheckedAddressRangeGeneric& that) const; - - //! \brief Returns a string describing the address range. - //! - //! The string will be formatted as `"0x123 + 0x45 (64)"`, where the - //! individual components are the address, size, and bitness. - std::string AsString() const; - - private: -#if defined(COMPILER_MSVC) - // MSVC cannot handle a union containing CheckedRange (with constructor, etc.) - // currently. - CheckedRange<uint32_t> range_32_; - CheckedRange<uint64_t> range_64_; -#else - // The field of the union that is expressed is determined by is_64_bit_. - union { - CheckedRange<uint32_t> range_32_; - CheckedRange<uint64_t> range_64_; - }; -#endif - - // Determines which field of the union is expressed. - bool is_64_bit_; - - // Whether the base and size were valid for their data type when set. This is - // always true when is_64_bit_ is true because the underlying data types are - // 64 bits wide and there is no possibility for range and size to overflow. - // When is_64_bit_ is false, range_ok_ will be false if SetRange() was passed - // a base or size that overflowed the underlying 32-bit data type. This field - // is necessary because the interface exposes the address and size types - // uniformly, but these types are too wide for the underlying pointer and size - // types in 32-bit processes. - bool range_ok_; -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_CHECKED_ADDRESS_RANGE_H_ diff --git a/Tools/Crashpad/include/util/numeric/checked_range.h b/Tools/Crashpad/include/util/numeric/checked_range.h deleted file mode 100644 index 09dfc22727..0000000000 --- a/Tools/Crashpad/include/util/numeric/checked_range.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_CHECKED_RANGE_H_ -#define CRASHPAD_UTIL_NUMERIC_CHECKED_RANGE_H_ - -#include <limits> -#include <tuple> - -#include "base/logging.h" -#include "base/numerics/safe_conversions.h" -#include "base/numerics/safe_math.h" -#include "util/misc/implicit_cast.h" - -namespace crashpad { - -//! \brief Ensures that a range, composed of a base and size, does not overflow -//! its data type. -template <typename ValueType, typename SizeType = ValueType> -class CheckedRange { - public: - CheckedRange(ValueType base, SizeType size) { - static_assert(!std::numeric_limits<SizeType>::is_signed, - "SizeType must be unsigned"); - SetRange(base, size); - } - - //! \brief Sets the range’s base and size to \a base and \a size, - //! respectively. - void SetRange(ValueType base, SizeType size) { - base_ = base; - size_ = size; - } - - //! \brief The range’s base. - ValueType base() const { return base_; } - - //! \brief The range’s size. - SizeType size() const { return size_; } - - //! \brief The range’s end (its base plus its size). - ValueType end() const { return base_ + size_; } - - //! \brief Returns the validity of the range. - //! - //! \return `true` if the range is valid, `false` otherwise. - //! - //! A range is valid if its size can be converted to the range’s data type - //! without data loss, and if its end (base plus size) can be computed without - //! overflowing its data type. - bool IsValid() const { - if (!base::IsValueInRangeForNumericType<ValueType, SizeType>(size_)) { - return false; - } - base::CheckedNumeric<ValueType> checked_end(base_); - checked_end += implicit_cast<ValueType>(size_); - return checked_end.IsValid(); - } - - //! \brief Returns whether the range contains another value. - //! - //! \param[in] value The (possibly) contained value. - //! - //! \return `true` if the range contains \a value, `false` otherwise. - //! - //! A range contains a value if the value is greater than or equal to its - //! base, and less than its end (base plus size). - //! - //! This method must only be called if IsValid() would return `true`. - bool ContainsValue(ValueType value) const { - DCHECK(IsValid()); - - return value >= base() && value < end(); - } - - //! \brief Returns whether the range contains another range. - //! - //! \param[in] that The (possibly) contained range. - //! - //! \return `true` if `this` range, the containing range, contains \a that, - //! the contained range. `false` otherwise. - //! - //! A range contains another range when the contained range’s base is greater - //! than or equal to the containing range’s base, and the contained range’s - //! end is less than or equal to the containing range’s end. - //! - //! This method must only be called if IsValid() would return `true` for both - //! CheckedRange objects involved. - bool ContainsRange(const CheckedRange<ValueType, SizeType>& that) const { - DCHECK(IsValid()); - DCHECK(that.IsValid()); - - return that.base() >= base() && that.end() <= end(); - } - - //! \brief Returns whether the range overlaps another range. - //! - //! \param[in] that The (possibly) overlapping range. - //! - //! \return `true` if `this` range, the first range, overlaps \a that, - //! the provided range. `false` otherwise. - //! - //! Ranges are considered to be closed-open [base, end) for this test. Zero - //! length ranges are never considered to overlap another range. - //! - //! This method must only be called if IsValid() would return `true` for both - //! CheckedRange objects involved. - bool OverlapsRange(const CheckedRange<ValueType, SizeType>& that) const { - DCHECK(IsValid()); - DCHECK(that.IsValid()); - - if (size() == 0 || that.size() == 0) - return false; - - return base() < that.end() && that.base() < end(); - } - - bool operator<(const CheckedRange& other) const { - return std::tie(base_, size_) < std::tie(other.base_, other.size_); - } - - private: - ValueType base_; - SizeType size_; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_CHECKED_RANGE_H_ diff --git a/Tools/Crashpad/include/util/numeric/checked_vm_address_range.h b/Tools/Crashpad/include/util/numeric/checked_vm_address_range.h deleted file mode 100644 index e792dba939..0000000000 --- a/Tools/Crashpad/include/util/numeric/checked_vm_address_range.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ -#define CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ - -#include "util/misc/address_types.h" -#include "util/numeric/checked_address_range.h" - -namespace crashpad { - -//! \brief Ensures that a range, composed of a base and a size, does not -//! overflow the pointer type of the process it describes a range in. -//! -//! This class checks bases of type #VMAddress and sizes of type #VMSize against -//! a process whose pointer type is either 32 or 64 bits wide. -//! -//! Aside from varying the overall range on the basis of a process’ pointer type -//! width, this class functions very similarly to CheckedRange. -using CheckedVMAddressRange = - internal::CheckedAddressRangeGeneric<VMAddress, VMSize>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ diff --git a/Tools/Crashpad/include/util/numeric/in_range_cast.h b/Tools/Crashpad/include/util/numeric/in_range_cast.h deleted file mode 100644 index 3dba10afa1..0000000000 --- a/Tools/Crashpad/include/util/numeric/in_range_cast.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ -#define CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ - -#include "base/logging.h" -#include "base/numerics/safe_conversions.h" - -namespace crashpad { - -//! \brief Casts to a different type if it can be done without data loss, -//! logging a warning message and returing a default value otherwise. -//! -//! \param[in] source The value to convert and return. -//! \param[in] default_value The default value to return, in the event that \a -//! source cannot be represented in the destination type. -//! -//! \return \a source if it can be represented in the destination type, -//! otherwise \a default_value. -template <typename Destination, typename Source> -Destination InRangeCast(Source source, Destination default_value) { - if (base::IsValueInRangeForNumericType<Destination>(source)) { - return static_cast<Destination>(source); - } - - LOG(WARNING) << "value " << source << " out of range"; - return static_cast<Destination>(default_value); -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_IN_RANGE_CAST_H_ diff --git a/Tools/Crashpad/include/util/numeric/int128.h b/Tools/Crashpad/include/util/numeric/int128.h deleted file mode 100644 index c57bed6d28..0000000000 --- a/Tools/Crashpad/include/util/numeric/int128.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_INT128_H_ -#define CRASHPAD_UTIL_NUMERIC_INT128_H_ - -#include <stdint.h> - -#include "build/build_config.h" - -namespace crashpad { - -//! \brief Stores a 128-bit quantity. -//! -//! This structure is organized so that 128-bit quantities are laid out in -//! memory according to the system’s natural byte order. If a system offers a -//! native 128-bit type, it should be possible to bit_cast<> between that type -//! and this one. -//! -//! This structure is designed to have the same layout, although not the same -//! field names, as the Windows SDK’s `M128A` type from `<winnt.h>`. It is -//! provided here instead of in `compat` because it is useful outside of the -//! scope of data structures defined by the Windows SDK. -struct uint128_struct { -#if defined(ARCH_CPU_LITTLE_ENDIAN) || DOXYGEN - //! \brief The low 64 bits of the 128-bit quantity. - uint64_t lo; - - //! \brief The high 64 bits of the 128-bit quantity. - uint64_t hi; -#else - uint64_t hi; - uint64_t lo; -#endif -}; - -static_assert(sizeof(uint128_struct) == 16, "uint128 must be 16 bytes"); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_INT128_H_ diff --git a/Tools/Crashpad/include/util/numeric/safe_assignment.h b/Tools/Crashpad/include/util/numeric/safe_assignment.h deleted file mode 100644 index 358d983701..0000000000 --- a/Tools/Crashpad/include/util/numeric/safe_assignment.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_NUMERIC_SAFE_ASSIGNMENT_H_ -#define CRASHPAD_UTIL_NUMERIC_SAFE_ASSIGNMENT_H_ - -#include "base/numerics/safe_conversions.h" - -namespace crashpad { - -//! \brief Performs an assignment if it can be done safely, and signals if it -//! cannot be done safely. -//! -//! \param[out] destination A pointer to the variable to be assigned to. -//! \param[in] source The value to assign. -//! -//! \return `true` if \a source is in the range supported by the type of \a -//! *destination, with the assignment to \a *destination having been -//! performed. `false` if the assignment cannot be completed safely because -//! \a source is outside of this range. -template <typename Destination, typename Source> -bool AssignIfInRange(Destination* destination, Source source) { - if (!base::IsValueInRangeForNumericType<Destination>(source)) { - return false; - } - - *destination = static_cast<Destination>(source); - return true; -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_NUMERIC_SAFE_ASSIGNMENT_H_ diff --git a/Tools/Crashpad/include/util/posix/close_multiple.h b/Tools/Crashpad/include/util/posix/close_multiple.h deleted file mode 100644 index baf72b2b6d..0000000000 --- a/Tools/Crashpad/include/util/posix/close_multiple.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_CLOSE_MULTIPLE_H_ -#define CRASHPAD_UTIL_POSIX_CLOSE_MULTIPLE_H_ - -namespace crashpad { - -//! \brief Close multiple file descriptors or mark them close-on-exec. -//! -//! This is similar to the BSD/Solaris-style `closefrom()` routine, which closes -//! all open file descriptors equal to or higher than its \a fd argument. This -//! function must not be called while other threads are active. It is intended -//! to be used in a child process created by `fork()`, prior to calling an -//! `exec()`-family function. This guarantees that a (possibly untrustworthy) -//! child process does not inherit file descriptors that it has no need for. -//! -//! Unlike the BSD function, this function may not close file descriptors -//! immediately, but may instead mark them as close-on-exec. The actual behavior -//! chosen is specific to the operating system. On macOS, file descriptors are -//! marked close-on-exec instead of being closed outright in order to avoid -//! raising `EXC_GUARD` exceptions for guarded file descriptors that are -//! protected against `close()`. -//! -//! \param[in] fd The lowest file descriptor to close or set as close-on-exec. -//! \param[in] preserve_fd A file descriptor to preserve and not close (or set -//! as close-on-exec), even if it is open and its value is greater than \a -//! fd. To not preserve any file descriptor, pass `-1` for this parameter. -void CloseMultipleNowOrOnExec(int fd, int preserve_fd); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_CLOSE_MULTIPLE_H_ diff --git a/Tools/Crashpad/include/util/posix/close_stdio.h b/Tools/Crashpad/include/util/posix/close_stdio.h deleted file mode 100644 index 9515923b52..0000000000 --- a/Tools/Crashpad/include/util/posix/close_stdio.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_CLOSE_STDIO_H_ -#define CRASHPAD_UTIL_POSIX_CLOSE_STDIO_H_ - -namespace crashpad { - -//! \brief Closes `stdin` and `stdout` by opening `/dev/null` over them. -//! -//! It is normally inadvisable to `close()` the three standard input/output -//! streams, because they occupy special file descriptors. Closing them outright -//! could result in their file descriptors being reused. This causes problems -//! for library code (including the standard library) that expects these file -//! descriptors to have special meaning. -//! -//! This function discards the standard input and standard output streams by -//! opening `/dev/null` and assigning it to their file descriptors, closing -//! whatever had been at those file descriptors previously. -//! -//! `stderr`, the standard error stream, is not closed. It is often useful to -//! retain the ability to send diagnostic messages to the standard error stream. -//! -//! \note This function can only maintain its guarantees in a single-threaded -//! process, or in situations where the caller has control of all threads in -//! the process. -void CloseStdinAndStdout(); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_CLOSE_STDIO_H_ diff --git a/Tools/Crashpad/include/util/posix/double_fork_and_exec.h b/Tools/Crashpad/include/util/posix/double_fork_and_exec.h deleted file mode 100644 index df340d07a7..0000000000 --- a/Tools/Crashpad/include/util/posix/double_fork_and_exec.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_DOUBLE_FORK_AND_EXEC_H_ -#define CRASHPAD_UTIL_POSIX_DOUBLE_FORK_AND_EXEC_H_ - -#include <string> -#include <vector> - -namespace crashpad { - -//! \brief Executes a (grand-)child process. -//! -//! The grandchild process will be started through the -//! double-`fork()`-and-`execv()` pattern. This allows the grandchild to fully -//! disassociate from the parent. The grandchild will not be a member of the -//! parent’s process group or session and will not have a controlling terminal, -//! providing isolation from signals not intended for it. The grandchild’s -//! parent process, in terms of the process tree hierarchy, will be the process -//! with process ID 1, relieving any other process of the responsibility to reap -//! it via `waitpid()`. Aside from the three file descriptors associated with -//! the standard input/output streams and any file descriptor passed in \a -//! preserve_fd, the grandchild will not inherit any file descriptors from the -//! parent process. -//! -//! \param[in] argv The argument vector to start the grandchild process with. -//! `argv[0]` is used as the path to the executable. -//! \param[in] preserve_fd A file descriptor to be inherited by the grandchild -//! process. This file descriptor is inherited in addition to the three file -//! descriptors associated with the standard input/output streams. Use `-1` -//! if no additional file descriptors are to be inherited. -//! \param[in] use_path Whether to consult the `PATH` environment variable when -//! requested to start an executable at a non-absolute path. If `false`, -//! `execv()`, which does not consult `PATH`, will be used. If `true`, -//! `execvp()`, which does consult `PATH`, will be used. -//! \param[in] child_function If not `nullptr`, this function will be called in -//! the intermediate child process, prior to the second `fork()`. Take note -//! that this function will run in the context of a forked process, and must -//! be safe for that purpose. -//! -//! \return `true` on success, and `false` on failure with a message logged. -//! Only failures that occur in the parent process that indicate a definite -//! failure to start the the grandchild are reported in the return value. -//! Failures in the intermediate child or grandchild processes cannot be -//! reported in the return value, and are addressed by logging a message and -//! terminating. The caller assumes the responsibility for detecting such -//! failures, for example, by observing a failure to perform a successful -//! handshake with the grandchild process. -bool DoubleForkAndExec(const std::vector<std::string>& argv, - int preserve_fd, - bool use_path, - void (*child_function)()); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_DOUBLE_FORK_AND_EXEC_H_ diff --git a/Tools/Crashpad/include/util/posix/drop_privileges.h b/Tools/Crashpad/include/util/posix/drop_privileges.h deleted file mode 100644 index 91220e9785..0000000000 --- a/Tools/Crashpad/include/util/posix/drop_privileges.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_DROP_PRIVILEGES_H_ -#define CRASHPAD_UTIL_POSIX_DROP_PRIVILEGES_H_ - -namespace crashpad { - -//! \brief Permanently drops privileges conferred by being a setuid or setgid -//! executable. -//! -//! The effective user ID and saved set-user ID are set to the real user ID, -//! negating any effects of being a setuid executable. The effective group ID -//! and saved set-group ID are set to the real group ID, negating any effects of -//! being a setgid executable. Because the saved set-user ID and saved set-group -//! ID are reset, there is no way to restore the prior privileges, and the drop -//! is permanent. -//! -//! This function drops privileges correctly when running setuid root and in -//! other circumstances, including when running setuid non-root. If the program -//! is not a setuid or setgid executable, this function has no effect. -//! -//! No changes are made to the supplementary group list, which is normally not -//! altered for setuid or setgid executables. -void DropPrivileges(); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_DROP_PRIVILEGES_H_ diff --git a/Tools/Crashpad/include/util/posix/process_info.h b/Tools/Crashpad/include/util/posix/process_info.h deleted file mode 100644 index 18a9cd93d0..0000000000 --- a/Tools/Crashpad/include/util/posix/process_info.h +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_PROCESS_INFO_H_ -#define CRASHPAD_UTIL_POSIX_PROCESS_INFO_H_ - -#include <sys/time.h> -#include <sys/types.h> -#include <unistd.h> - -#include <set> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "build/build_config.h" -#include "util/misc/initialization_state.h" -#include "util/misc/initialization_state_dcheck.h" - -#if defined(OS_MACOSX) -#include <mach/mach.h> -#include <sys/sysctl.h> -#endif - -#if defined(OS_LINUX) || defined(OS_ANDROID) -#include "util/linux/ptrace_connection.h" -#endif - -namespace crashpad { - -class ProcessInfo { - public: - ProcessInfo(); - ~ProcessInfo(); - -#if defined(OS_LINUX) || defined(OS_ANDROID) || DOXYGEN - //! \brief Initializes this object with information about the process whose ID - //! is \a pid using a PtraceConnection \a connection. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. This method may only be called once. - //! - //! It is unspecified whether the information that an object of this class - //! returns is loaded at the time Initialize() is called or subsequently, and - //! whether this information is cached in the object or not. - //! - //! \param[in] connection A connection to the remote process. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool InitializeWithPtrace(PtraceConnection* connection); -#endif // OS_LINUX || OS_ANDROID || DOXYGEN - -#if defined(OS_MACOSX) || DOXYGEN - //! \brief Initializes this object with information about the process whose ID - //! is \a pid. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. This method may only be called once. - //! - //! It is unspecified whether the information that an object of this class - //! returns is loaded at the time Initialize() is called or subsequently, and - //! whether this information is cached in the object or not. - //! - //! \param[in] pid The process ID to obtain information for. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool InitializeWithPid(pid_t pid); - - //! \brief Initializes this object with information about a process based on - //! its Mach task. - //! - //! This method serves as a stand-in for InitializeWithPid() and may be called - //! in its place with the same restrictions and considerations. - //! - //! \param[in] task The Mach task to obtain information for. - //! - //! \return `true` on success, `false` on failure with an message logged. - bool InitializeWithTask(task_t task); -#endif - - //! \return The target task’s process ID. - pid_t ProcessID() const; - - //! \return The target task’s parent process ID. - pid_t ParentProcessID() const; - - //! \return The target process’ real user ID as would be returned to it by - //! `getuid()`. - uid_t RealUserID() const; - - //! \return The target process’ effective user ID as would be returned to it - //! by `geteuid()`. - uid_t EffectiveUserID() const; - - //! \return The target process’ saved set-user ID. - uid_t SavedUserID() const; - - //! \return the target process’ real group ID as would be returned to it by - //! `getgid()`. - gid_t RealGroupID() const; - - //! \return the target process’ effective group ID as would be returned to it - //! by `getegid()`. - gid_t EffectiveGroupID() const; - - //! \return The target process’ saved set-group ID. - gid_t SavedGroupID() const; - - //! \return the target process’ supplementary group list as would be returned - //! to it by `getgroups()`. - std::set<gid_t> SupplementaryGroups() const; - - //! \return All groups that the target process claims membership in, including - //! RealGroupID(), EffectiveGroupID(), SavedGroupID(), and - //! SupplementaryGroups(). - std::set<gid_t> AllGroups() const; - - //! \brief Determines whether the target process has changed privileges. - //! - //! A process is considered to have changed privileges if it has changed its - //! real, effective, or saved set-user or group IDs with the `setuid()`, - //! `seteuid()`, `setreuid()`, `setgid()`, `setegid()`, or `setregid()` system - //! calls since its most recent `execve()`, or if its privileges changed at - //! `execve()` as a result of executing a setuid or setgid executable. - bool DidChangePrivileges() const; - - //! \brief Determines the target process’ bitness. - //! - //! \return `true` if the target task is a 64-bit process. - bool Is64Bit() const; - - //! \brief Determines the target process’ start time. - //! - //! \param[out] start_time The time that the process started. - //! - //! \return `true` on success, with \a start_time set. Otherwise, `false` with - //! a message logged. - bool StartTime(timeval* start_time) const; - - //! \brief Obtains the arguments used to launch a process. - //! - //! Whether it is possible to obtain this information for a process with - //! different privileges than the running program is system-dependent. - //! - //! \param[out] argv The process’ arguments as passed to its `main()` function - //! as the \a argv parameter, possibly modified by the process. - //! - //! \return `true` on success, with \a argv populated appropriately. - //! Otherwise, `false` with a message logged. - //! - //! \note This function may spuriously return `false` when used to examine a - //! process that it is calling `exec()`. If examining such a process, call - //! this function in a retry loop with a small (100ns) delay to avoid an - //! erroneous assumption that \a pid is not running. - bool Arguments(std::vector<std::string>* argv) const; - - private: -#if defined(OS_MACOSX) - kinfo_proc kern_proc_info_; -#elif defined(OS_LINUX) || defined(OS_ANDROID) - // Some members are marked mutable so that they can be lazily initialized by - // const methods. These are always InitializationState-protected so that - // multiple successive calls will always produce the same return value and out - // parameters. This is necessary for intergration with the Snapshot interface. - // See https://crashpad.chromium.org/bug/9. - std::set<gid_t> supplementary_groups_; - mutable timeval start_time_; - pid_t pid_; - pid_t ppid_; - uid_t uid_; - uid_t euid_; - uid_t suid_; - gid_t gid_; - gid_t egid_; - gid_t sgid_; - bool is_64_bit_; - mutable InitializationState start_time_initialized_; -#endif - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ProcessInfo); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_PROCESS_INFO_H_ diff --git a/Tools/Crashpad/include/util/posix/scoped_dir.h b/Tools/Crashpad/include/util/posix/scoped_dir.h deleted file mode 100644 index 3fcbdf9c9d..0000000000 --- a/Tools/Crashpad/include/util/posix/scoped_dir.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ -#define CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ - -#include <dirent.h> - -#include "base/scoped_generic.h" - -namespace crashpad { -namespace internal { - -struct ScopedDIRCloseTraits { - static DIR* InvalidValue() { return nullptr; } - static void Free(DIR* dir); -}; - -} // namespace internal - -//! \brief Maintains a directory opened by `opendir`. -//! -//! On destruction, the directory will be closed by calling `closedir`. -using ScopedDIR = base::ScopedGeneric<DIR*, internal::ScopedDIRCloseTraits>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_SCOPED_DIR_H_ diff --git a/Tools/Crashpad/include/util/posix/scoped_mmap.h b/Tools/Crashpad/include/util/posix/scoped_mmap.h deleted file mode 100644 index b0ff3dc0ae..0000000000 --- a/Tools/Crashpad/include/util/posix/scoped_mmap.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_ -#define CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_ - -#include "base/macros.h" - -#include <sys/mman.h> -#include <sys/types.h> - -#include "util/misc/from_pointer_cast.h" - -namespace crashpad { - -//! \brief Maintains a memory-mapped region created by `mmap()`. -//! -//! On destruction, any memory-mapped region managed by an object of this class -//! will be released by calling `munmap()`. -class ScopedMmap { - public: - ScopedMmap(); - ~ScopedMmap(); - - //! \brief Releases the memory-mapped region by calling `munmap()`. - //! - //! \return `true` on success. `false` on failure, with a message logged. - bool Reset(); - - //! \brief Releases any existing memory-mapped region and sets the object to - //! maintain an already-established mapping. - //! - //! If \a addr and \a len indicate a region that overlaps with the existing - //! memory-mapped region, only the portion of the existing memory-mapped - //! region that does not overlap the new region, if any, will be released. - //! - //! \param[in] addr The base address of the existing memory-mapped region to - //! maintain. - //! \param[in] len The size of the existing memory-mapped region to maintain. - //! - //! \return `true` on success. `false` on failure, with a message logged. - bool ResetAddrLen(void* addr, size_t len); - - //! \brief Releases any existing memory-mapped region and establishes a new - //! one by calling `mmap()`. - //! - //! The parameters to this method are passed directly to `mmap()`. - //! - //! \return `true` on success. `false` on failure, with a message logged. A - //! message will also be logged on failure to release any existing - //! memory-mapped region, but this will not preclude `mmap()` from being - //! called or a new mapping from being established, and if such a call to - //! `mmap()` is successful, this method will return `true`. - bool ResetMmap(void* addr, - size_t len, - int prot, - int flags, - int fd, - off_t offset); - - //! \brief Sets the protection of the memory-mapped region by calling - //! `mprotect()`. - //! - //! \a prot is passed directly to `mprotect()`. - //! - //! \return `true` on success. `false` on failure, with a message logged. - bool Mprotect(int prot); - - //! \return Whether this object is managing a valid memory-mapped region. - bool is_valid() const { return addr_ != MAP_FAILED; } - - //! \brief Returns the base address of the memory-mapped region. - void* addr() const { return addr_; } - - //! \brief Returns the base address of the memory-mapped region, casted to - //! a type of the caller’s choosing. - template <typename T> - T addr_as() const { - return FromPointerCast<T>(addr_); - } - - //! \brief Returns the size of the memory-mapped region. - size_t len() const { return len_; } - - private: - void* addr_ = MAP_FAILED; - size_t len_ = 0; - - DISALLOW_COPY_AND_ASSIGN(ScopedMmap); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_ diff --git a/Tools/Crashpad/include/util/posix/signals.h b/Tools/Crashpad/include/util/posix/signals.h deleted file mode 100644 index ade093bfad..0000000000 --- a/Tools/Crashpad/include/util/posix/signals.h +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_SIGNALS_H_ -#define CRASHPAD_UTIL_POSIX_SIGNALS_H_ - -#include <signal.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Utilities for handling POSIX signals. -class Signals { - public: - //! \brief The type used for `struct sigaction::sa_sigaction`. - using Handler = void (*)(int, siginfo_t*, void*); - - //! \brief A group of `struct sigaction` structures corresponding to a set - //! of signals’ previous actions, addressable by signal number. - //! - //! This type is used to store previous signal actions when new actions are - //! installed in batch by InstallCrashHandlers() or - //! InstallTerminateHandlers(). - //! - //! This object is not initialized by any constructor. Its expected initial - //! state is to have its contents filled with zeroes. Because signal handlers - //! are stateless (there is no “context†parameter), any state must be - //! accessed via objects of static storage duration, and it is expected that - //! objects of this class will only ever exist with static storage duration, - //! which in the absence of a constructor will be zero-initialized as - //! expected. In the event that an object of this class must exist with a - //! different storage duration, such as automatic or dynamic storage duration, - //! it must be explicitly initialized. For example: `OldActions old_actions = - //! {};`. - class OldActions { - public: - // DISALLOW_COPY_AND_ASSIGN removes the default constructor, so explicitly - // opt for it. This should not result in any static initialization code even - // when an object of this class is given static storage duration. - OldActions() = default; - - //! \brief Returns a `struct sigaction` structure corresponding to the - //! given signal. - //! - //! \note This method is safe to call from a signal handler. - struct sigaction* ActionForSignal(int sig); - - private: - // As a small storage optimization, don’t waste any space on a slot for - // signal 0, because there is no signal 0. - struct sigaction actions_[NSIG - 1]; - - DISALLOW_COPY_AND_ASSIGN(OldActions); - }; - - //! \brief Installs a new signal handler. - //! - //! \param[in] sig The signal number to handle. - //! \param[in] handler A signal-handling function to execute, used as the - //! `struct sigaction::sa_sigaction` field when calling `sigaction()`. - //! \param[in] flags Flags to pass to `sigaction()` in the `struct - //! sigaction::sa_flags` field. `SA_SIGINFO` will be specified implicitly. - //! \param[out] old_action The previous action for the signal, replaced by the - //! new action. May be `nullptr` if not needed. - //! - //! \return `true` on success. `false` on failure with a message logged. - //! - //! \warning This function may not be called from a signal handler because of - //! its use of logging. See RestoreHandlerAndReraiseSignalOnReturn() - //! instead. - static bool InstallHandler(int sig, - Handler handler, - int flags, - struct sigaction* old_action); - - //! \brief Installs `SIG_DFL` for the signal \a sig. - //! - //! \param[in] sig The signal to set the default action for. - //! - //! \return `true` on success, `false` on failure with errno set. No message - //! is logged. - static bool InstallDefaultHandler(int sig); - - //! \brief Installs a new signal handler for all signals associated with - //! crashes. - //! - //! Signals associated with crashes are those whose default dispositions - //! involve creating a core dump. The precise set of signals involved varies - //! between operating systems. - //! - //! A single signal may either be associated with a crash or with termination - //! (see InstallTerminateHandlers()), and perhaps neither, but never both. - //! - //! \param[in] handler A signal-handling function to execute, used as the - //! `struct sigaction::sa_sigaction` field when calling `sigaction()`. - //! \param[in] flags Flags to pass to `sigaction()` in the `struct - //! sigaction::sa_flags` field. `SA_SIGINFO` will be specified implicitly. - //! \param[out] old_actions The previous actions for the signals, replaced by - //! the new action. May be `nullptr` if not needed. The same \a - //! old_actions object may be used for calls to both this function and - //! InstallTerminateHandlers(). - //! - //! \return `true` on success. `false` on failure with a message logged. - //! - //! \warning This function may not be called from a signal handler because of - //! its use of logging. See RestoreHandlerAndReraiseSignalOnReturn() - //! instead. - static bool InstallCrashHandlers(Handler handler, - int flags, - OldActions* old_actions); - - //! \brief Installs a new signal handler for all signals associated with - //! termination. - //! - //! Signals associated with termination are those whose default dispositions - //! involve terminating the process without creating a core dump. The precise - //! set of signals involved varies between operating systems. - //! - //! A single signal may either be associated with termination or with a - //! crash (see InstalCrashHandlers()), and perhaps neither, but never both. - //! - //! \param[in] handler A signal-handling function to execute, used as the - //! `struct sigaction::sa_sigaction` field when calling `sigaction()`. - //! \param[in] flags Flags to pass to `sigaction()` in the `struct - //! sigaction::sa_flags` field. `SA_SIGINFO` will be specified implicitly. - //! \param[out] old_actions The previous actions for the signals, replaced by - //! the new action. May be `nullptr` if not needed. The same \a - //! old_actions object may be used for calls to both this function and - //! InstallCrashHandlers(). - //! - //! \return `true` on success. `false` on failure with a message logged. - //! - //! \warning This function may not be called from a signal handler because of - //! its use of logging. See RestoreHandlerAndReraiseSignalOnReturn() - //! instead. - static bool InstallTerminateHandlers(Handler handler, - int flags, - OldActions* old_actions); - - //! \brief Determines whether a signal will be re-raised autonomously upon - //! return from a signal handler. - //! - //! Certain signals, when generated synchronously in response to a hardware - //! fault, are unrecoverable. Upon return from the signal handler, the same - //! action that triggered the signal to be raised initially will be retried, - //! and unless the signal handler took action to mitigate this error, the same - //! signal will be re-raised. As an example, a CPU will not be able to read - //! unmapped memory (causing `SIGSEGV`), thus the signal will be re-raised - //! upon return from the signal handler unless the signal handler established - //! a memory mapping where required. - //! - //! It is important to distinguish between these synchronous signals generated - //! in response to a hardware fault and signals generated asynchronously or in - //! software. As an example, `SIGSEGV` will not re-raise autonomously if sent - //! by `kill()`. - //! - //! This function distinguishes between signals that can re-raise - //! autonomously, and for those that can, between instances of the signal that - //! were generated synchronously in response to a hardware fault and instances - //! that were generated by other means. - //! - //! \param[in] siginfo A pointer to a `siginfo_t` object received by a signal - //! handler. - //! - //! \return `true` if the signal being handled will re-raise itself - //! autonomously upon return from a signal handler. `false` if it will - //! not. When this function returns `false`, a signal can still be - //! re-raised upon return from a signal handler by calling `raise()` from - //! within the signal handler. - //! - //! \note This function is safe to call from a signal handler. - static bool WillSignalReraiseAutonomously(const siginfo_t* siginfo); - - //! \brief Restores a previous signal action and arranges to re-raise a signal - //! on return from a signal handler. - //! - //! \param[in] siginfo A pointer to a `siginfo_t` object received by a signal - //! handler. - //! \param[in] old_action The previous action for the signal, which will be - //! re-established as the signal’s action. May be `nullptr`, which directs - //! the default action for the signal to be used. - //! - //! If this function fails, it will immediately call `_exit()` and set an exit - //! status of `191`. - //! - //! \note This function may only be called from a signal handler. - static void RestoreHandlerAndReraiseSignalOnReturn( - const siginfo_t* siginfo, - const struct sigaction* old_action); - - //! \brief Determines whether a signal is associated with a crash. - //! - //! Signals associated with crashes are those whose default dispositions - //! involve creating a core dump. The precise set of signals involved varies - //! between operating systems. - //! - //! \param[in] sig The signal to test. - //! - //! \return `true` if \a sig is associated with a crash. `false` otherwise. - //! - //! \note This function is safe to call from a signal handler. - static bool IsCrashSignal(int sig); - - //! \brief Determines whether a signal is associated with termination. - //! - //! Signals associated with termination are those whose default dispositions - //! involve terminating the process without creating a core dump. The precise - //! set of signals involved varies between operating systems. - //! - //! \param[in] sig The signal to test. - //! - //! \return `true` if \a sig is associated with termination. `false` - //! otherwise. - //! - //! \note This function is safe to call from a signal handler. - static bool IsTerminateSignal(int sig); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(Signals); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_SIGNALS_H_ diff --git a/Tools/Crashpad/include/util/posix/symbolic_constants_posix.h b/Tools/Crashpad/include/util/posix/symbolic_constants_posix.h deleted file mode 100644 index 4fb4a358aa..0000000000 --- a/Tools/Crashpad/include/util/posix/symbolic_constants_posix.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_POSIX_SYMBOLIC_CONSTANTS_POSIX_H_ -#define CRASHPAD_UTIL_POSIX_SYMBOLIC_CONSTANTS_POSIX_H_ - -#include <string> - -#include "base/strings/string_piece.h" -#include "util/misc/symbolic_constants_common.h" - -namespace crashpad { - -//! \brief Converts a POSIX signal value to a textual representation. -//! -//! \param[in] signal The signal value to convert. -//! \param[in] options Options affecting the conversion. ::kUseOr is ignored. -//! For ::kUnknownIsNumeric, the format is `"%d"`. -//! -//! \return The converted string. -std::string SignalToString(int signal, SymbolicConstantToStringOptions options); - -//! \brief Converts a string to its corresponding POSIX signal value. -//! -//! \param[in] string The string to convert. -//! \param[in] options Options affecting the conversion. ::kAllowOr is ignored. -//! \param[out] signal The converted POSIX signal value. -//! -//! \return `true` on success, `false` if \a string could not be converted as -//! requested. -bool StringToSignal(const base::StringPiece& string, - StringToSymbolicConstantOptions options, - int* signal); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_POSIX_SYMBOLIC_CONSTANTS_POSIX_H_ diff --git a/Tools/Crashpad/include/util/process/process_memory.h b/Tools/Crashpad/include/util/process/process_memory.h deleted file mode 100644 index c046fc6e78..0000000000 --- a/Tools/Crashpad/include/util/process/process_memory.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_H_ -#define CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_H_ - -#include <sys/types.h> - -#include <string> - -#include "util/misc/address_types.h" - -namespace crashpad { - -//! \brief Abstract base class for accessing the memory of another process. -//! -//! Implementations are platform-specific. -class ProcessMemory { - public: - //! \brief Copies memory from the target process into a caller-provided buffer - //! in the current process. - //! - //! \param[in] address The address, in the target process' address space, of - //! the memory region to copy. - //! \param[in] size The size, in bytes, of the memory region to copy. - //! \a buffer must be at least this size. - //! \param[out] buffer The buffer into which the contents of the other - //! process' memory will be copied. - //! - //! \return `true` on success, with \a buffer filled appropriately. `false` on - //! failure, with a message logged. - virtual bool Read(VMAddress address, size_t size, void* buffer) const = 0; - - //! \brief Reads a `NUL`-terminated C string from the target process into a - //! string in the current process. - //! - //! The length of the string need not be known ahead of time. This method will - //! read contiguous memory until a `NUL` terminator is found. - //! - //! \param[in] address The address, in the target process’s address space, of - //! the string to copy. - //! \param[out] string The string read from the other process. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a message logged. Failures can occur, for example, when - //! encountering unmapped or unreadable pages. - bool ReadCString(VMAddress address, std::string* string) const { - return ReadCStringInternal(address, false, 0, string); - } - - //! \brief Reads a `NUL`-terminated C string from the target process into a - //! string in the current process. - //! - //! \param[in] address The address, in the target process’s address space, of - //! the string to copy. - //! \param[in] size The maximum number of bytes to read. The string is - //! required to be `NUL`-terminated within this many bytes. - //! \param[out] string The string read from the other process. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a message logged. Failures can occur, for example, when - //! a `NUL` terminator is not found within \a size bytes, or when - //! encountering unmapped or unreadable pages. - bool ReadCStringSizeLimited(VMAddress address, - size_t size, - std::string* string) const { - return ReadCStringInternal(address, true, size, string); - } - - protected: - ProcessMemory() = default; - ~ProcessMemory() = default; - - private: - //! \brief Reads a `NUL`-terminated C string from the target process into a - //! string in the current process. - //! - //! \param[in] address The address, in the target process’s address space, of - //! the string to copy. - //! \param[in] has_size If true, this method will read \a size bytes. If - //! false, this method will ignore \a size and instead read contiguous - //! memory until a `NUL` terminator is found. - //! \param[in] size If \a has_size is true, the maximum number of bytes to - //! read. The string is required to be `NUL`-terminated within this many - //! bytes. Ignored if \a has_size is false. - //! \param[out] string The string read from the other process. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a message logged. Failures can occur, for example, when - //! encountering unmapped or unreadable pages. - virtual bool ReadCStringInternal(VMAddress address, - bool has_size, - size_t size, - std::string* string) const = 0; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_H_ diff --git a/Tools/Crashpad/include/util/process/process_memory_linux.h b/Tools/Crashpad/include/util/process/process_memory_linux.h deleted file mode 100644 index e03e251f0f..0000000000 --- a/Tools/Crashpad/include/util/process/process_memory_linux.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_LINUX_H_ -#define CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_LINUX_H_ - -#include <sys/types.h> - -#include <string> - -#include "base/files/scoped_file.h" -#include "base/macros.h" -#include "util/misc/address_types.h" -#include "util/process/process_memory.h" - -namespace crashpad { - -//! \brief Accesses the memory of another Linux process. -class ProcessMemoryLinux final : public ProcessMemory { - public: - ProcessMemoryLinux(); - ~ProcessMemoryLinux(); - - //! \brief Initializes this object to read the memory of a process whose ID - //! is \a pid. - //! - //! This method must be called successfully prior to calling any other method - //! in this class. - //! - //! \param[in] pid The process ID of a target process. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Initialize(pid_t pid); - - bool Read(VMAddress address, size_t size, void* buffer) const override; - - private: - bool ReadCStringInternal(VMAddress address, - bool has_size, - size_t size, - std::string* string) const override; - - base::ScopedFD mem_fd_; - pid_t pid_; - - DISALLOW_COPY_AND_ASSIGN(ProcessMemoryLinux); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_LINUX_H_ diff --git a/Tools/Crashpad/include/util/process/process_memory_range.h b/Tools/Crashpad/include/util/process/process_memory_range.h deleted file mode 100644 index 2b654ba1f3..0000000000 --- a/Tools/Crashpad/include/util/process/process_memory_range.h +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_RANGE_H_ -#define CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_RANGE_H_ - -#include <sys/types.h> - -#include <string> - -#include "base/macros.h" -#include "util/misc/address_types.h" -#include "util/misc/initialization_state_dcheck.h" -#include "util/numeric/checked_vm_address_range.h" -#include "util/process/process_memory.h" - -namespace crashpad { - -//! \brief Provides range protected access to the memory of another process. -class ProcessMemoryRange { - public: - ProcessMemoryRange(); - ~ProcessMemoryRange(); - - //! \brief Initializes this object. - //! - //! One of the Initialize methods must be successfully called on this object - //! before calling any other. - //! - //! \param[in] memory The memory reader to delegate to. - //! \param[in] is_64_bit Whether the target process is 64-bit. - //! \param[in] base The base address of the initial range. - //! \param[in] size The size of the initial range. - //! \return `true` on success. `false` on failure with a message logged. - bool Initialize(const ProcessMemory* memory, - bool is_64_bit, - VMAddress base, - VMSize size); - - //! \brief Initializes this object with the maximum range for the address - //! space. - //! - //! One of the Initialize methods must be successfully called on this object - //! before calling any other. - //! - //! \param[in] memory The memory reader to delegate to. - //! \param[in] is_64_bit Whether the target process is 64-bit. - bool Initialize(const ProcessMemory* memory, bool is_64_bit); - - //! \brief Initializes this object from an existing memory range. - //! - //! One of the Initialize methods must be successfully called on this object - //! before calling any other. - //! - //! \param[in] other The memory range object to initialize from. - //! \return `true` on success. `false` on failure with a message logged. - bool Initialize(const ProcessMemoryRange& other); - - //! \brief Returns whether the range is part of a 64-bit address space. - bool Is64Bit() const { return range_.Is64Bit(); } - - //! \brief Returns the base address of the range. - VMAddress Base() const { return range_.Base(); } - - //! \brief Returns the size of the range. - VMSize Size() const { return range_.Size(); } - - //! \brief Shrinks the range to the new base and size. - //! - //! The new range must be contained within the existing range for this object. - //! - //! \param[in] base The new base of the range. - //! \param[in] size The new size of the range. - //! \return `true` on success. `false` on failure with a message logged. - bool RestrictRange(VMAddress base, VMSize size); - - //! \brief Copies memory from the target process into a caller-provided buffer - //! in the current process. - //! - //! \param[in] address The address, in the target process' address space, of - //! the memory region to copy. - //! \param[in] size The size, in bytes, of the memory region to copy. - //! \a buffer must be at least this size. - //! \param[out] buffer The buffer into which the contents of the other - //! process' memory will be copied. - //! - //! \return `true` on success, with \a buffer filled appropriately. `false` on - //! failure, with a message logged. - bool Read(VMAddress address, size_t size, void* buffer) const; - - //! \brief Reads a `NUL`-terminated C string from the target process into a - //! string in the current process. - //! - //! \param[in] address The address, in the target process’s address space, of - //! the string to copy. - //! \param[in] size The maximum number of bytes to read. The string is - //! required to be `NUL`-terminated within this many bytes. - //! \param[out] string The string read from the other process. - //! - //! \return `true` on success, with \a string set appropriately. `false` on - //! failure, with a message logged. Failures can occur, for example, when - //! a `NUL` terminator is not found within \a size bytes, or when - //! encountering unmapped or unreadable pages. - bool ReadCStringSizeLimited(VMAddress address, - size_t size, - std::string* string) const; - - private: - const ProcessMemory* memory_; // weak - CheckedVMAddressRange range_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ProcessMemoryRange); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_PROCESS_PROCESS_MEMORY_RANGE_H_ diff --git a/Tools/Crashpad/include/util/stdlib/aligned_allocator.h b/Tools/Crashpad/include/util/stdlib/aligned_allocator.h deleted file mode 100644 index 97be27a271..0000000000 --- a/Tools/Crashpad/include/util/stdlib/aligned_allocator.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_ -#define CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_ - -#include <stddef.h> - -#include <limits> -#include <memory> -#include <new> -#include <utility> -#include <vector> - -namespace crashpad { - -//! \brief Allocates memory with the specified alignment constraint. -//! -//! This function wraps `posix_memalign()` or `_aligned_malloc()`. Memory -//! allocated by this function must be released by AlignFree(). -void* AlignedAllocate(size_t alignment, size_t size); - -//! \brief Frees memory allocated by AlignedAllocate(). -//! -//! This function wraps `free()` or `_aligned_free()`. -void AlignedFree(void* pointer); - -//! \brief A standard allocator that aligns its allocations as requested, -//! suitable for use as an allocator in standard containers. -//! -//! This is similar to `std::allocator<T>`, with the addition of an alignment -//! guarantee. \a Alignment must be a power of 2. If \a Alignment is not -//! specified, the default alignment for type \a T is used. -template <class T, size_t Alignment = alignof(T)> -struct AlignedAllocator { - public: - using value_type = T; - using pointer = T*; - using const_pointer = const T*; - using reference = T&; - using const_reference = const T&; - using size_type = size_t; - using difference_type = ptrdiff_t; - - template <class U> - struct rebind { - using other = AlignedAllocator<U, Alignment>; - }; - - AlignedAllocator() noexcept {} - AlignedAllocator(const AlignedAllocator& other) noexcept {} - - template <typename U> - AlignedAllocator(const AlignedAllocator<U, Alignment>& other) noexcept {} - - ~AlignedAllocator() {} - - pointer address(reference x) const noexcept { return &x; } - const_pointer address(const_reference x) const noexcept { return &x; } - - pointer allocate(size_type n, std::allocator<void>::const_pointer hint = 0) { - return reinterpret_cast<pointer>( - AlignedAllocate(Alignment, sizeof(value_type) * n)); - } - - void deallocate(pointer p, size_type n) { AlignedFree(p); } - - size_type max_size() const noexcept { - return std::numeric_limits<size_type>::max() / sizeof(value_type); - } - - template <class U, class... Args> - void construct(U* p, Args&&... args) { - new (reinterpret_cast<void*>(p)) U(std::forward<Args>(args)...); - } - - template <class U> - void destroy(U* p) { - p->~U(); - } -}; - -template <class T1, class T2, size_t Alignment> -bool operator==(const AlignedAllocator<T1, Alignment>& lhs, - const AlignedAllocator<T2, Alignment>& rhs) noexcept { - return true; -} - -template <class T1, class T2, size_t Alignment> -bool operator!=(const AlignedAllocator<T1, Alignment>& lhs, - const AlignedAllocator<T2, Alignment>& rhs) noexcept { - return false; -} - -//! \brief A `std::vector` using AlignedAllocator. -//! -//! This is similar to `std::vector<T>`, with the addition of an alignment -//! guarantee. \a Alignment must be a power of 2. If \a Alignment is not -//! specified, the default alignment for type \a T is used. -template <typename T, size_t Alignment = alignof(T)> -using AlignedVector = std::vector<T, AlignedAllocator<T, Alignment>>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_ diff --git a/Tools/Crashpad/include/util/stdlib/map_insert.h b/Tools/Crashpad/include/util/stdlib/map_insert.h deleted file mode 100644 index d2c3b84211..0000000000 --- a/Tools/Crashpad/include/util/stdlib/map_insert.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ -#define CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ - -#include <map> -#include <utility> - -namespace crashpad { - -//! \brief Inserts a mapping from \a key to \a value into \a map, or replaces -//! an existing mapping so that \a key maps to \a value. -//! -//! This behaves similarly to `std::map<>::%insert_or_assign()` proposed for -//! C++17, except that the \a old_value parameter is added. -//! -//! \param[in,out] map The map to operate on. -//! \param[in] key The key that should be mapped to \a value. -//! \param[in] value The value that \a key should map to. -//! \param[out] old_value If \a key was previously present in \a map, this will -//! be set to its previous value. This parameter is optional and may be -//! `nullptr` if this information is not required. -//! -//! \return `false` if \a key was previously present in \a map. If \a old_value -//! is not `nullptr`, it will be set to the previous value. `true` if \a -//! key was not present in the map and was inserted. -template <typename T> -bool MapInsertOrReplace(T* map, - const typename T::key_type& key, - const typename T::mapped_type& value, - typename T::mapped_type* old_value) { - const auto result = map->insert(std::make_pair(key, value)); - if (!result.second) { - if (old_value) { - *old_value = result.first->second; - } - result.first->second = value; - } - return result.second; -} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ diff --git a/Tools/Crashpad/include/util/stdlib/objc.h b/Tools/Crashpad/include/util/stdlib/objc.h deleted file mode 100644 index faaa453869..0000000000 --- a/Tools/Crashpad/include/util/stdlib/objc.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_OBJC_H_ -#define CRASHPAD_UTIL_STDLIB_OBJC_H_ - -#include <AvailabilityMacros.h> -#include <objc/objc.h> - -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_8 - -// In order for the @NO and @YES literals to work, NO and YES must be defined as -// __objc_no and __objc_yes. See -// https://clang.llvm.org/docs/ObjectiveCLiterals.html. -// -// NO and YES are defined properly for this purpose in the 10.8 SDK, but not in -// earlier SDKs. Because this code is never expected to be compiled with a -// compiler that does not understand the modern forms of these boolean -// constants, but it may be built with an older SDK, replace the outdated SDK -// definitions unconditionally. -#undef NO -#undef YES -#define NO __objc_no -#define YES __objc_yes - -#endif - -#endif // CRASHPAD_UTIL_STDLIB_OBJC_H_ diff --git a/Tools/Crashpad/include/util/stdlib/string_number_conversion.h b/Tools/Crashpad/include/util/stdlib/string_number_conversion.h deleted file mode 100644 index b7bdcce86e..0000000000 --- a/Tools/Crashpad/include/util/stdlib/string_number_conversion.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_STRING_NUMBER_CONVERSION_H_ -#define CRASHPAD_UTIL_STDLIB_STRING_NUMBER_CONVERSION_H_ - -#include "base/strings/string_piece.h" - -namespace crashpad { - -// Convert between strings and numbers. -// -// These functions will only set *number if a perfect conversion can be -// performed. A perfect conversion contains no leading or trailing characters -// (including whitespace) other than the number to convert, and does not -// overflow the targeted data type. If a perfect conversion is possible, *number -// is set and these functions return true. Otherwise, they return false. -// -// The interface in base/strings/string_number_conversions.h doesn’t allow -// arbitrary bases based on whether the string begins with prefixes such as "0x" -// as strtol does with base = 0. The functions here are implemented on the -// strtol family with base = 0, and thus do accept such input. - -//! \{ -//! \brief Convert a string to a number. -//! -//! A conversion will only be performed if it can be done perfectly: if \a -//! string contains no leading or trailing characters (including whitespace) -//! other than the number to convert, and does not overflow the targeted data -//! type. -//! -//! \param[in] string The string to convert to a number. As in `strtol()` with a -//! `base` parameter of `0`, the string is treated as decimal unless it -//! begins with a `"0x"` or `"0X"` prefix, in which case it is treated as -//! hexadecimal, or a `"0"` prefix, in which case it is treated as octal. -//! \param[out] number The converted number. This will only be set if a perfect -//! conversion can be performed. -//! -//! \return `true` if a perfect conversion could be performed, with \a number -//! set appropriately. `false` if a perfect conversion was not possible. -//! -//! \note The interface in `base/strings/string_number_conversions.h` doesn’t -//! allow arbitrary bases based on whether the string begins with a prefix -//! indicating its base. The functions here are provided for situations -//! where such prefix recognition is desirable. -bool StringToNumber(const base::StringPiece& string, int* number); -bool StringToNumber(const base::StringPiece& string, unsigned int* number); -bool StringToNumber(const base::StringPiece& string, int64_t* number); -bool StringToNumber(const base::StringPiece& string, uint64_t* number); -//! \} - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_STRING_NUMBER_CONVERSION_H_ diff --git a/Tools/Crashpad/include/util/stdlib/strlcpy.h b/Tools/Crashpad/include/util/stdlib/strlcpy.h deleted file mode 100644 index 20e1a71822..0000000000 --- a/Tools/Crashpad/include/util/stdlib/strlcpy.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_STRLCPY_H_ -#define CRASHPAD_UTIL_STDLIB_STRLCPY_H_ - -#include <sys/types.h> - -#include "base/strings/string16.h" - -namespace crashpad { - -//! \brief Copy a `NUL`-terminated char16-based string to a fixed-size buffer. -//! -//! This function behaves identically to `strlcpy()`, but it operates on char16 -//! data instead of `char` data. It copies the `NUL`-terminated string in the -//! buffer beginning at \a source to the buffer of size \a length at \a -//! destination, ensuring that the destination buffer is `NUL`-terminated. No -//! data will be written outside of the \a destination buffer, but if \a length -//! is smaller than the length of the string at \a source, the string will be -//! truncated. -//! -//! \param[out] destination A pointer to a buffer of at least size \a length -//! char16 units (not bytes). The string will be copied to this buffer, -//! possibly with truncation, and `NUL`-terminated. Nothing will be written -//! following the `NUL` terminator. -//! \param[in] source A pointer to a `NUL`-terminated string of char16 data. The -//! `NUL` terminator must be a `NUL` value in a char16 unit, not just a -//! single `NUL` byte. -//! \param[in] length The length of the \a destination buffer in char16 units, -//! not bytes. A maximum of \a `length - 1` char16 units from \a source will -//! be copied to \a destination. -//! -//! \return The length of the \a source string in char16 units, not including -//! its `NUL` terminator. When truncation occurs, the return value will be -//! equal to or greater than than the \a length parameter. -size_t c16lcpy(base::char16* destination, - const base::char16* source, - size_t length); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_STRLCPY_H_ diff --git a/Tools/Crashpad/include/util/stdlib/strnlen.h b/Tools/Crashpad/include/util/stdlib/strnlen.h deleted file mode 100644 index e85d8c7e45..0000000000 --- a/Tools/Crashpad/include/util/stdlib/strnlen.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_STRNLEN_H_ -#define CRASHPAD_UTIL_STDLIB_STRNLEN_H_ - -#include <string.h> -#include <sys/types.h> - -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include <AvailabilityMacros.h> -#endif - -namespace crashpad { - -//! \brief Returns the length of a string, not to exceed a maximum. -//! -//! \param[in] string The string whose length is to be calculated. -//! \param[in] max_length The maximum length to return. -//! -//! \return The length of \a string, determined as the index of the first `NUL` -//! byte found, not exceeding \a max_length. -//! -//! \note This function is provided because it was introduced in POSIX.1-2008, -//! and not all systems’ standard libraries provide an implementation. -size_t strnlen(const char* string, size_t max_length); - -#if !defined(OS_MACOSX) || \ - MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 -inline size_t strnlen(const char* string, size_t max_length) { - return ::strnlen(string, max_length); -} -#endif - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_STRNLEN_H_ diff --git a/Tools/Crashpad/include/util/stdlib/thread_safe_vector.h b/Tools/Crashpad/include/util/stdlib/thread_safe_vector.h deleted file mode 100644 index f97024d0a8..0000000000 --- a/Tools/Crashpad/include/util/stdlib/thread_safe_vector.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STDLIB_THREAD_SAFE_VECTOR_H_ -#define CRASHPAD_UTIL_STDLIB_THREAD_SAFE_VECTOR_H_ - -#include <utility> -#include <vector> - -#include "base/macros.h" -#include "base/synchronization/lock.h" - -namespace crashpad { - -//! \brief A wrapper for a `std::vector<>` that can be accessed safely from -//! multiple threads. -//! -//! This is not a drop-in replacement for `std::vector<>`. Only necessary -//! operations are defined. -template <typename T> -class ThreadSafeVector { - public: - ThreadSafeVector() : vector_(), lock_() {} - ~ThreadSafeVector() {} - - //! \brief Wraps `std::vector<>::%push_back()`. - void PushBack(const T& element) { - base::AutoLock lock_owner(lock_); - vector_.push_back(element); - } - - //! \brief Atomically clears the underlying vector and returns its previous - //! contents. - std::vector<T> Drain() { - std::vector<T> contents; - { - base::AutoLock lock_owner(lock_); - std::swap(vector_, contents); - } - return contents; - } - - private: - std::vector<T> vector_; - base::Lock lock_; - - DISALLOW_COPY_AND_ASSIGN(ThreadSafeVector); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STDLIB_THREAD_SAFE_VECTOR_H_ diff --git a/Tools/Crashpad/include/util/string/split_string.h b/Tools/Crashpad/include/util/string/split_string.h deleted file mode 100644 index af4f953c7a..0000000000 --- a/Tools/Crashpad/include/util/string/split_string.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_STRING_SPLIT_STRING_H_ -#define CRASHPAD_UTIL_STRING_SPLIT_STRING_H_ - -#include <string> -#include <vector> - -namespace crashpad { - -//! \brief Splits a string into two parts at the first delimiter found. -//! -//! \param[in] string The string to split. -//! \param[in] delimiter The delimiter to split at. -//! \param[out] left The portion of \a string up to, but not including, the -//! first \a delimiter character. -//! \param[out] right The portion of \a string after the first \a delimiter -//! character. -//! -//! \return `true` if \a string was split successfully. `false` if \a string -//! did not contain a \a delimiter character or began with a \a delimiter -//! character. -bool SplitStringFirst(const std::string& string, - char delimiter, - std::string* left, - std::string* right); - -//! \brief Splits a string into multiple parts on the given delimiter. -//! -//! \param[in] string The string to split. -//! \param[in] delimiter The delimiter to split at. -//! -//! \return The individual parts of the string. -std::vector<std::string> SplitString(const std::string& string, char delimiter); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_STRING_SPLIT_STRING_H_ diff --git a/Tools/Crashpad/include/util/synchronization/semaphore.h b/Tools/Crashpad/include/util/synchronization/semaphore.h deleted file mode 100644 index 4947963994..0000000000 --- a/Tools/Crashpad/include/util/synchronization/semaphore.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_SYNCHRONIZATION_SEMAPHORE_H_ -#define CRASHPAD_UTIL_SYNCHRONIZATION_SEMAPHORE_H_ - -#include <limits> - -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include <dispatch/dispatch.h> -#elif defined(OS_WIN) -#include <windows.h> -#else -#include <semaphore.h> -#endif - -namespace crashpad { - -//! \brief An anonymous in-process counting sempahore. -class Semaphore { - public: - //! \brief A TimedWait() argument that causes an indefinite wait. - static constexpr double kIndefiniteWait = - std::numeric_limits<double>::infinity(); - - //! \brief Initializes the semaphore. - //! - //! \param[in] value The initial value of the semaphore. - //! - //! If the semaphore cannot be created, execution is terminated. - explicit Semaphore(int value); - - ~Semaphore(); - - //! \brief Performs the wait (or “procureâ€) operation on the semaphore. - //! - //! Atomically decrements the value of the semaphore by 1. If the new value is - //! negative, this function blocks and will not return until the semaphore’s - //! value is incremented to 0 by Signal(). - //! - //! \sa TimedWait() - void Wait(); - - //! \brief Performs a timed wait (or “procureâ€) operation on the semaphore. - //! - //! \param[in] seconds The maximum number of seconds to wait for the operation - //! to complete. If \a seconds is #kIndefiniteWait, this method behaves as - //! Wait(), and will not time out. - //! - //! \return `false` if the wait timed out, `true` otherwise. - //! - //! This method is simlar to Wait(), except that the amount of time that it - //! blocks is limited. - bool TimedWait(double seconds); - - //! \brief Performs the signal (or “postâ€) operation on the semaphore. - //! - //! Atomically increments the value of the semaphore by 1. If the new value is - //! 0, a caller blocked in Wait() will be awakened. - void Signal(); - - private: -#if defined(OS_MACOSX) - dispatch_semaphore_t semaphore_; -#elif defined(OS_WIN) - HANDLE semaphore_; -#else - sem_t semaphore_; -#endif -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_SYNCHRONIZATION_SEMAPHORE_H_ diff --git a/Tools/Crashpad/include/util/thread/thread.h b/Tools/Crashpad/include/util/thread/thread.h deleted file mode 100644 index 595d308e56..0000000000 --- a/Tools/Crashpad/include/util/thread/thread.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_THREAD_THREAD_H_ -#define CRASHPAD_UTIL_THREAD_THREAD_H_ - -#include "base/macros.h" -#include "build/build_config.h" - -#if defined(OS_POSIX) -#include <pthread.h> -#elif defined(OS_WIN) -#include <windows.h> -#endif // OS_POSIX - -namespace crashpad { - -//! \brief Basic thread abstraction. Users should derive from this -//! class and implement ThreadMain(). -class Thread { - public: - Thread(); - virtual ~Thread(); - - //! \brief Create a platform thread, and run ThreadMain() on that thread. Must - //! be paired with a call to Join(). - void Start(); - - //! \brief Block until ThreadMain() exits. This may be called from any thread. - //! Must paired with a call to Start(). - void Join(); - - private: - //! \brief The thread entry point to be implemented by the subclass. - virtual void ThreadMain() = 0; - - static -#if defined(OS_POSIX) - void* -#elif defined(OS_WIN) - DWORD WINAPI -#endif // OS_POSIX - ThreadEntryThunk(void* argument); - -#if defined(OS_POSIX) - pthread_t platform_thread_; -#elif defined(OS_WIN) - HANDLE platform_thread_; -#endif - - DISALLOW_COPY_AND_ASSIGN(Thread); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_THREAD_THREAD_H_ diff --git a/Tools/Crashpad/include/util/thread/thread_log_messages.h b/Tools/Crashpad/include/util/thread/thread_log_messages.h deleted file mode 100644 index e8eef358b6..0000000000 --- a/Tools/Crashpad/include/util/thread/thread_log_messages.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_THREAD_THREAD_LOG_MESSAGES_H_ -#define CRASHPAD_UTIL_THREAD_THREAD_LOG_MESSAGES_H_ - -#include <string> -#include <vector> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Captures log messages produced on the current thread during an -//! object’s lifetime. -//! -//! At most one object of this class type may exist on a single thread at a -//! time. When using this class, no other part of the program may call -//! `logging::SetLogMessageHandler()` at any time. -class ThreadLogMessages { - public: - ThreadLogMessages(); - ~ThreadLogMessages(); - - //! \return The log messages collected on the thread that this object was - //! created on since the time it was created. - const std::vector<std::string>& log_messages() const { return log_messages_; } - - private: - std::vector<std::string> log_messages_; - - DISALLOW_COPY_AND_ASSIGN(ThreadLogMessages); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_THREAD_THREAD_LOG_MESSAGES_H_ diff --git a/Tools/Crashpad/include/util/thread/worker_thread.h b/Tools/Crashpad/include/util/thread/worker_thread.h deleted file mode 100644 index 97fb6ecde0..0000000000 --- a/Tools/Crashpad/include/util/thread/worker_thread.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_THREAD_WORKER_THREAD_H_ -#define CRASHPAD_UTIL_THREAD_WORKER_THREAD_H_ - -#include <memory> - -#include "base/macros.h" -#include "util/synchronization/semaphore.h" - -namespace crashpad { - -namespace internal { -class WorkerThreadImpl; -} // namespace internal - -//! \brief A WorkerThread executes its Delegate's DoWork method repeatedly on a -//! dedicated thread at a set time interval. -class WorkerThread { - public: - //! \brief An interface for doing work on a WorkerThread. - class Delegate { - public: - //! \brief The work function executed by the WorkerThread every work - //! interval. - virtual void DoWork(const WorkerThread* thread) = 0; - - protected: - virtual ~Delegate() {} - }; - - //! \brief A delay or interval argument that causes an indefinite wait. - static constexpr double kIndefiniteWait = Semaphore::kIndefiniteWait; - - //! \brief Creates a new WorkerThread that is not yet running. - //! - //! \param[in] work_interval The time interval in seconds at which the \a - //! delegate runs. The interval counts from the completion of - //! Delegate::DoWork() to the next invocation. This can be - //! #kIndefiniteWait if work should only be done when DoWorkNow() is - //! called. - //! \param[in] delegate The work delegate to invoke every interval. - WorkerThread(double work_interval, Delegate* delegate); - ~WorkerThread(); - - //! \brief Starts the worker thread. - //! - //! This may not be called if the thread is_running(). - //! - //! \param[in] initial_work_delay The amount of time in seconds to wait - //! before invoking the \a delegate for the first time. Pass `0` for - //! no delay. This can be #kIndefiniteWait if work should not be done - //! until DoWorkNow() is called. - void Start(double initial_work_delay); - - //! \brief Stops the worker thread from running. - //! - //! This may only be called if the thread is_running(). - //! - //! If the work function is currently executing, this will not interrupt it. - //! This method stops any future work from occurring. This method is safe - //! to call from any thread with the exception of the worker thread itself, - //! as this joins the thread. - void Stop(); - - //! \brief Interrupts a \a work_interval to execute the work function - //! immediately. This invokes Delegate::DoWork() on the thread, without - //! waiting for the current \a work_interval to expire. After the - //! delegate is invoked, the WorkerThread will start waiting for a new - //! \a work_interval. - void DoWorkNow(); - - //! \return `true` if the thread is running, `false` if it is not. - bool is_running() const { return running_; } - - private: - friend class internal::WorkerThreadImpl; - - double work_interval_; - Delegate* delegate_; // weak - std::unique_ptr<internal::WorkerThreadImpl> impl_; - bool running_; - - DISALLOW_COPY_AND_ASSIGN(WorkerThread); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_THREAD_WORKER_THREAD_H_ diff --git a/Tools/Crashpad/include/util/win/address_types.h b/Tools/Crashpad/include/util/win/address_types.h deleted file mode 100644 index f26a57eff5..0000000000 --- a/Tools/Crashpad/include/util/win/address_types.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_ADDRESS_TYPES_H_ -#define CRASHPAD_UTIL_WIN_ADDRESS_TYPES_H_ - -#include <stdint.h> - -namespace crashpad { - -//! \brief Type used to represent an address in a process, potentially across -//! bitness. -using WinVMAddress = uint64_t; - -//! \brief Type used to represent the size of a memory range (with a -//! WinVMAddress), potentially across bitness. -using WinVMSize = uint64_t; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_ADDRESS_TYPES_H_ diff --git a/Tools/Crashpad/include/util/win/capture_context.h b/Tools/Crashpad/include/util/win/capture_context.h deleted file mode 100644 index 2f501f8030..0000000000 --- a/Tools/Crashpad/include/util/win/capture_context.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CAPTURE_CONTEXT_WIN_H_ -#define CRASHPAD_CLIENT_CAPTURE_CONTEXT_WIN_H_ - -#include <windows.h> - -namespace crashpad { - -//! \brief Saves the CPU context. -//! -//! The CPU context will be captured as accurately and completely as possible, -//! containing an atomic snapshot at the point of this function’s return. This -//! function does not modify any registers. -//! -//! This function captures all integer registers as well as the floating-point -//! and vector (SSE) state. It does not capture debug registers, which are -//! inaccessible by user code. -//! -//! This function is a replacement for `RtlCaptureContext()`, which contains -//! bugs and limitations. On 32-bit x86, `RtlCaptureContext()` requires that -//! `ebp` be used as a frame pointer, and returns `ebp`, `esp`, and `eip` out of -//! sync with the other registers. Both the 32-bit x86 and 64-bit x86_64 -//! versions of `RtlCaptureContext()` capture only the state of the integer -//! registers, ignoring floating-point and vector state. -//! -//! \param[out] context The structure to store the context in. -//! -//! \note On x86_64, the value for `rcx` will be populated with the address of -//! this function’s argument, as mandated by the ABI. -void CaptureContext(CONTEXT* context); - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CAPTURE_CONTEXT_WIN_H_ diff --git a/Tools/Crashpad/include/util/win/checked_win_address_range.h b/Tools/Crashpad/include/util/win/checked_win_address_range.h deleted file mode 100644 index e86c7b7b0a..0000000000 --- a/Tools/Crashpad/include/util/win/checked_win_address_range.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_CHECKED_WIN_ADDRESS_RANGE_H_ -#define CRASHPAD_UTIL_WIN_CHECKED_WIN_ADDRESS_RANGE_H_ - -#include "util/numeric/checked_address_range.h" -#include "util/win/address_types.h" - -namespace crashpad { - -//! \brief Ensures that a range, composed of a base and a size, does not -//! overflow the pointer type of the process it describes a range in. -//! -//! This class checks bases of type WinVMAddress and sizes of type WinVMSize -//! against a process whose pointer type is either 32 or 64 bits wide. -//! -//! Aside from varying the overall range on the basis of a process' pointer type -//! width, this class functions very similarly to CheckedRange. -using CheckedWinAddressRange = - internal::CheckedAddressRangeGeneric<WinVMAddress, WinVMSize>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_CHECKED_WIN_ADDRESS_RANGE_H_ diff --git a/Tools/Crashpad/include/util/win/command_line.h b/Tools/Crashpad/include/util/win/command_line.h deleted file mode 100644 index c12d6539a4..0000000000 --- a/Tools/Crashpad/include/util/win/command_line.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_COMMAND_LINE_H_ -#define CRASHPAD_UTIL_WIN_COMMAND_LINE_H_ - -#include <string> - -namespace crashpad { - -//! \brief Utility function for building escaped command lines. -//! -//! This builds a command line so that individual arguments can be reliably -//! decoded by `CommandLineToArgvW()`. -//! -//! \a argument is appended to \a command_line. If necessary, it will be placed -//! in quotation marks and escaped properly. If \a command_line is initially -//! non-empty, a space will precede \a argument. -//! -//! \param[in] argument The argument to append to \a command_line. -//! \param[in,out] command_line The command line being constructed. -void AppendCommandLineArgument(const std::wstring& argument, - std::wstring* command_line); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_COMMAND_LINE_H_ diff --git a/Tools/Crashpad/include/util/win/critical_section_with_debug_info.h b/Tools/Crashpad/include/util/win/critical_section_with_debug_info.h deleted file mode 100644 index 1271685755..0000000000 --- a/Tools/Crashpad/include/util/win/critical_section_with_debug_info.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_CRITICAL_SECTION_WITH_DEBUG_INFO_H_ -#define CRASHPAD_UTIL_WIN_CRITICAL_SECTION_WITH_DEBUG_INFO_H_ - -#include <windows.h> - -namespace crashpad { - -//! \brief Equivalent to `InitializeCritialSection()`, but attempts to allocate -//! with a valid `.DebugInfo` field on versions of Windows where it's -//! possible to do so. -//! -//! \return `true` on success, or `false` on failure with a message logged. -//! Success means that the critical section was successfully initialized, -//! but it does not necessarily have a valid `.DebugInfo` field. -bool InitializeCriticalSectionWithDebugInfoIfPossible( - CRITICAL_SECTION* critical_section); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_CRITICAL_SECTION_WITH_DEBUG_INFO_H_ diff --git a/Tools/Crashpad/include/util/win/exception_handler_server.h b/Tools/Crashpad/include/util/win/exception_handler_server.h deleted file mode 100644 index 994cdba47f..0000000000 --- a/Tools/Crashpad/include/util/win/exception_handler_server.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_EXCEPTION_HANDLER_SERVER_H_ -#define CRASHPAD_UTIL_WIN_EXCEPTION_HANDLER_SERVER_H_ - -#include <set> -#include <string> - -#include "base/macros.h" -#include "base/synchronization/lock.h" -#include "util/file/file_io.h" -#include "util/win/address_types.h" -#include "util/win/initial_client_data.h" -#include "util/win/scoped_handle.h" - -namespace crashpad { - -namespace internal { -class PipeServiceContext; -class ClientData; -} // namespace internal - -//! \brief Runs the main exception-handling server in Crashpad's handler -//! process. -class ExceptionHandlerServer { - public: - class Delegate { - public: - //! \brief Called when the server has created the named pipe connection - //! points and is ready to service requests. - virtual void ExceptionHandlerServerStarted() = 0; - - //! \brief Called when the client has signalled that it has encountered an - //! exception and so wants a crash dump to be taken. - //! - //! \param[in] process A handle to the client process. Ownership of the - //! lifetime of this handle is not passed to the delegate. - //! \param[in] exception_information_address The address in the client's - //! address space of an ExceptionInformation structure. - //! \param[in] debug_critical_section_address The address in the client's - //! address space of a `CRITICAL_SECTION` allocated with a valid - //! `.DebugInfo` field, or `0` if unavailable. - //! \return The exit code that should be used when terminating the client - //! process. - virtual unsigned int ExceptionHandlerServerException( - HANDLE process, - WinVMAddress exception_information_address, - WinVMAddress debug_critical_section_address) = 0; - - protected: - ~Delegate(); - }; - - //! \brief Constructs the exception handling server. - //! - //! \param[in] persistent `true` if Run() should not return until Stop() is - //! called. If `false`, Run() will return when all clients have exited, - //! although Run() will always wait for the first client to connect. - explicit ExceptionHandlerServer(bool persistent); - - ~ExceptionHandlerServer(); - - //! \brief Sets the pipe name to listen for client registrations on. - //! - //! This method, or InitializeWithInheritedDataForInitialClient(), must be - //! called before Run(). - //! - //! \param[in] pipe_name The name of the pipe to listen on. Must be of the - //! form "\\.\pipe\<some_name>". - void SetPipeName(const std::wstring& pipe_name); - - //! \brief Sets the pipe to listen for client registrations on, providing - //! the first precreated instance. - //! - //! This method, or SetPipeName(), must be called before Run(). All of these - //! parameters are generally created in a parent process that launches the - //! handler. For more details see the Windows implementation of - //! CrashpadClient. - //! - //! \sa CrashpadClient - //! \sa RegistrationRequest - //! - //! \param[in] initial_client_data The handles and addresses of data inherited - //! from a parent process needed to initialize and register the first - //! client. Ownership of these handles is taken. - //! \param[in] delegate The interface to which the exceptions are delegated - //! when they are caught in Run(). Ownership is not transferred. - void InitializeWithInheritedDataForInitialClient( - const InitialClientData& initial_client_data, - Delegate* delegate); - - //! \brief Runs the exception-handling server. - //! - //! \param[in] delegate The interface to which the exceptions are delegated - //! when they are caught in Run(). Ownership is not transferred. - void Run(Delegate* delegate); - - //! \brief Stops the exception-handling server. Returns immediately. The - //! object must not be destroyed until Run() returns. - void Stop(); - - //! \brief The number of server-side pipe instances that the exception handler - //! server creates to listen for connections from clients. - static const size_t kPipeInstances = 2; - - private: - static bool ServiceClientConnection( - const internal::PipeServiceContext& service_context); - static DWORD __stdcall PipeServiceProc(void* ctx); - static void __stdcall OnCrashDumpEvent(void* ctx, BOOLEAN); - static void __stdcall OnNonCrashDumpEvent(void* ctx, BOOLEAN); - static void __stdcall OnProcessEnd(void* ctx, BOOLEAN); - - std::wstring pipe_name_; - ScopedKernelHANDLE port_; - ScopedFileHandle first_pipe_instance_; - - base::Lock clients_lock_; - std::set<internal::ClientData*> clients_; - - bool persistent_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_EXCEPTION_HANDLER_SERVER_H_ diff --git a/Tools/Crashpad/include/util/win/get_function.h b/Tools/Crashpad/include/util/win/get_function.h deleted file mode 100644 index 50e5f1505c..0000000000 --- a/Tools/Crashpad/include/util/win/get_function.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ -#define CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ - -#include <windows.h> - -//! \file - -namespace crashpad { -namespace internal { - -//! \brief Returns a function pointer to a named function in a library. -//! -//! Do not call this directly, use the GET_FUNCTION() or GET_FUNCTION_REQUIRED() -//! macros instead. -//! -//! This accesses \a library by calling `LoadLibrary()` and is subject to the -//! same restrictions as that function. Notably, it can’t be used from a -//! `DllMain()` entry point. -//! -//! \param[in] library The library to search in. -//! \param[in] function The function to search for. If a leading `::` is -//! present, it will be stripped. -//! \param[in] required If `true`, require the function to resolve by `DCHECK`. -//! -//! \return A pointer to the requested function on success. If \a required is -//! `true`, triggers a `DCHECK` assertion on failure, otherwise, `nullptr` -//! on failure. -FARPROC GetFunctionInternal( - const wchar_t* library, const char* function, bool required); - -//! \copydoc GetFunctionInternal -template <typename FunctionType> -FunctionType* GetFunction( - const wchar_t* library, const char* function, bool required) { - return reinterpret_cast<FunctionType*>( - internal::GetFunctionInternal(library, function, required)); -} - -} // namespace internal -} // namespace crashpad - -//! \brief Returns a function pointer to a named function in a library without -//! requiring that it be found. -//! -//! If the library or function cannot be found, this will return `nullptr`. This -//! macro is intended to be used to access functions that may not be available -//! at runtime. -//! -//! This macro returns a properly-typed function pointer. It is expected to be -//! used in this way: -//! \code -//! static const auto get_named_pipe_client_process_id = -//! GET_FUNCTION(L"kernel32.dll", ::GetNamedPipeClientProcessId); -//! if (get_named_pipe_client_process_id) { -//! BOOL rv = get_named_pipe_client_process_id(pipe, &client_process_id); -//! } -//! \endcode -//! -//! This accesses \a library by calling `LoadLibrary()` and is subject to the -//! same restrictions as that function. Notably, it can’t be used from a -//! `DllMain()` entry point. -//! -//! \param[in] library The library to search in. -//! \param[in] function The function to search for. A leading `::` is -//! recommended when a wrapper function of the same name is present. -//! -//! \return A pointer to the requested function on success, or `nullptr` on -//! failure. -//! -//! \sa GET_FUNCTION_REQUIRED -#define GET_FUNCTION(library, function) \ - crashpad::internal::GetFunction<decltype(function)>( \ - library, #function, false) - -//! \brief Returns a function pointer to a named function in a library, -//! requiring that it be found. -//! -//! If the library or function cannot be found, this will trigger a `DCHECK` -//! assertion. This macro is intended to be used to access functions that are -//! always expected to be available at runtime but which are not present in any -//! import library. -//! -//! This macro returns a properly-typed function pointer. It is expected to be -//! used in this way: -//! \code -//! static const auto nt_query_object = -//! GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtQueryObject); -//! NTSTATUS status = -//! nt_query_object(handle, type, &info, info_length, &return_length); -//! \endcode -//! -//! This accesses \a library by calling `LoadLibrary()` and is subject to the -//! same restrictions as that function. Notably, it can’t be used from a -//! `DllMain()` entry point. -//! -//! \param[in] library The library to search in. -//! \param[in] function The function to search for. A leading `::` is -//! recommended when a wrapper function of the same name is present. -//! -//! \return A pointer to the requested function. -//! -//! \sa GET_FUNCTION -#define GET_FUNCTION_REQUIRED(library, function) \ - crashpad::internal::GetFunction<decltype(function)>( \ - library, #function, true) - -#endif // CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ diff --git a/Tools/Crashpad/include/util/win/get_module_information.h b/Tools/Crashpad/include/util/win/get_module_information.h deleted file mode 100644 index c7d1cf17a0..0000000000 --- a/Tools/Crashpad/include/util/win/get_module_information.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_GET_MODULE_INFORMATION_H_ -#define CRASHPAD_UTIL_WIN_GET_MODULE_INFORMATION_H_ - -#include <windows.h> - -#define PSAPI_VERSION 1 -#include <psapi.h> - -namespace crashpad { - -//! \brief Proxy function for `GetModuleInformation()`. -BOOL CrashpadGetModuleInformation(HANDLE process, - HMODULE module, - MODULEINFO* module_info, - DWORD cb); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_GET_MODULE_INFORMATION_H_ diff --git a/Tools/Crashpad/include/util/win/handle.h b/Tools/Crashpad/include/util/win/handle.h deleted file mode 100644 index 951302e2fb..0000000000 --- a/Tools/Crashpad/include/util/win/handle.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_HANDLE_TO_INT_H_ -#define CRASHPAD_UTIL_WIN_HANDLE_TO_INT_H_ - -#include <windows.h> - -namespace crashpad { - -//! \brief Converts a `HANDLE` to an `int`. -//! -//! `HANDLE` is a `typedef` for `void *`, but kernel `HANDLE` values aren’t -//! pointers to anything. Only 32 bits of kernel `HANDLE`s are significant, even -//! in 64-bit processes on 64-bit operating systems. See <a -//! href="https://msdn.microsoft.com/library/aa384203.aspx">Interprocess -//! Communication Between 32-bit and 64-bit Applications</a>. -//! -//! This function safely converts a kernel `HANDLE` to an `int` similarly to a -//! cast operation. It checks that the operation can be performed safely, and -//! aborts execution if it cannot. -//! -//! \param[in] handle The kernel `HANDLE` to convert. -//! -//! \return An equivalent `int`, truncated (if necessary) from \a handle. If -//! truncation would have resulted in an `int` that could not be converted -//! back to \a handle, aborts execution. -//! -//! \sa IntToHandle() -int HandleToInt(HANDLE handle); - -//! \brief Converts an `int` to an `HANDLE`. -//! -//! `HANDLE` is a `typedef` for `void *`, but kernel `HANDLE` values aren’t -//! pointers to anything. Only 32 bits of kernel `HANDLE`s are significant, even -//! in 64-bit processes on 64-bit operating systems. See <a -//! href="https://msdn.microsoft.com/library/aa384203.aspx">Interprocess -//! Communication Between 32-bit and 64-bit Applications</a>. -//! -//! This function safely convert an `int` to a kernel `HANDLE` similarly to a -//! cast operation. -//! -//! \param[in] handle_int The `int` to convert. This must have been produced by -//! HandleToInt(), possibly in a different process. -//! -//! \return An equivalent kernel `HANDLE`, sign-extended (if necessary) from \a -//! handle_int. -//! -//! \sa HandleToInt() -HANDLE IntToHandle(int handle_int); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_HANDLE_TO_INT_H_ diff --git a/Tools/Crashpad/include/util/win/initial_client_data.h b/Tools/Crashpad/include/util/win/initial_client_data.h deleted file mode 100644 index f686959e4b..0000000000 --- a/Tools/Crashpad/include/util/win/initial_client_data.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ -#define CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ - -#include <windows.h> - -#include <string> - -#include "base/macros.h" -#include "util/win/address_types.h" - -namespace crashpad { - -//! \brief A container for the data associated with the `--initial-client-data` -//! method for initializing the handler process on Windows. -class InitialClientData { - public: - //! \brief Constructs an unintialized instance to be used with - //! InitializeFromString(). - InitialClientData(); - - //! \brief Constructs an instance of InitialClientData. This object does not - //! take ownership of any of the referenced HANDLEs. - //! - //! \param[in] request_crash_dump An event signalled from the client on crash. - //! \param[in] request_non_crash_dump An event signalled from the client when - //! it would like a dump to be taken, but allowed to continue afterwards. - //! \param[in] non_crash_dump_completed An event signalled from the handler to - //! tell the client that the non-crash dump has completed, and it can - //! continue execution. - //! \param[in] first_pipe_instance The server end and first instance of a pipe - //! that will be used for communication with all other clients after this - //! initial one. - //! \param[in] client_process A process handle for the client being - //! registered. - //! \param[in] crash_exception_information The address, in the client's - //! address space, of an ExceptionInformation structure, used when - //! handling a crash dump request. - //! \param[in] non_crash_exception_information The address, in the client's - //! address space, of an ExceptionInformation structure, used when - //! handling a non-crashing dump request. - //! \param[in] debug_critical_section_address The address, in the client - //! process's address space, of a `CRITICAL_SECTION` allocated with a - //! valid .DebugInfo field. This can be accomplished by using - //! InitializeCriticalSectionWithDebugInfoIfPossible() or equivalent. This - //! value can be `0`, however then limited lock data will be available in - //! minidumps. - InitialClientData(HANDLE request_crash_dump, - HANDLE request_non_crash_dump, - HANDLE non_crash_dump_completed, - HANDLE first_pipe_instance, - HANDLE client_process, - WinVMAddress crash_exception_information, - WinVMAddress non_crash_exception_information, - WinVMAddress debug_critical_section_address); - - //! \brief Returns whether the object has been initialized successfully. - bool IsValid() const { return is_valid_; } - - //! Initializes this object from a string representation presumed to have been - //! created by StringRepresentation(). - //! - //! \param[in] str The output of StringRepresentation(). - //! - //! \return `true` on success, or `false` with a message logged on failure. - bool InitializeFromString(const std::string& str); - - //! \brief Returns a string representation of the data of this object, - //! suitable for passing on the command line. - std::string StringRepresentation() const; - - HANDLE request_crash_dump() const { return request_crash_dump_; } - HANDLE request_non_crash_dump() const { return request_non_crash_dump_; } - HANDLE non_crash_dump_completed() const { return non_crash_dump_completed_; } - HANDLE first_pipe_instance() const { return first_pipe_instance_; } - HANDLE client_process() const { return client_process_; } - WinVMAddress crash_exception_information() const { - return crash_exception_information_; - } - WinVMAddress non_crash_exception_information() const { - return non_crash_exception_information_; - } - WinVMAddress debug_critical_section_address() const { - return debug_critical_section_address_; - } - - private: - WinVMAddress crash_exception_information_; - WinVMAddress non_crash_exception_information_; - WinVMAddress debug_critical_section_address_; - HANDLE request_crash_dump_; - HANDLE request_non_crash_dump_; - HANDLE non_crash_dump_completed_; - HANDLE first_pipe_instance_; - HANDLE client_process_; - bool is_valid_; - - DISALLOW_COPY_AND_ASSIGN(InitialClientData); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ diff --git a/Tools/Crashpad/include/util/win/module_version.h b/Tools/Crashpad/include/util/win/module_version.h deleted file mode 100644 index afc2a508b7..0000000000 --- a/Tools/Crashpad/include/util/win/module_version.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_MODULE_VERSION_H_ -#define CRASHPAD_UTIL_WIN_MODULE_VERSION_H_ - -#include <windows.h> - -#include "base/files/file_path.h" - -namespace crashpad { - -//! \brief Retrieve the type and version information from a given module (exe, -//! dll, etc.) -//! -//! This function calls `GetFileVersionInfo()`, which can implicitly call -//! `LoadLibrary()` to load \a path into the calling process. Do not call this -//! function on an untrusted module, because there is a risk of executing the -//! module’s code. -//! -//! \param[in] path The path to the module to be inspected. -//! \param[out] vs_fixedfileinfo The VS_FIXEDFILEINFO on success. -//! VS_FIXEDFILEINFO::dwFileFlags will have been masked with -//! VS_FIXEDFILEINFO::dwFileFlagsMask already. -//! -//! \return `true` on success, or `false` on failure with a message logged. If -//! the module has no `VERSIONINFO` resource, `false` will be returned -//! without any messages logged. -bool GetModuleVersionAndType(const base::FilePath& path, - VS_FIXEDFILEINFO* vs_fixedfileinfo); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_MODULE_VERSION_H_ diff --git a/Tools/Crashpad/include/util/win/nt_internals.h b/Tools/Crashpad/include/util/win/nt_internals.h deleted file mode 100644 index a2a88b7744..0000000000 --- a/Tools/Crashpad/include/util/win/nt_internals.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <windows.h> -#include <winternl.h> - -#include "util/win/process_structs.h" - -// Copied from ntstatus.h because um/winnt.h conflicts with general inclusion of -// ntstatus.h. -#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) -#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L) -#define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS)0xC000010AL) - -namespace crashpad { - -NTSTATUS NtClose(HANDLE handle); - -// http://processhacker.sourceforge.net/doc/ntpsapi_8h_source.html -#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002 -NTSTATUS -NtCreateThreadEx(PHANDLE thread_handle, - ACCESS_MASK desired_access, - POBJECT_ATTRIBUTES object_attributes, - HANDLE process_handle, - PVOID start_routine, - PVOID argument, - ULONG create_flags, - SIZE_T zero_bits, - SIZE_T stack_size, - SIZE_T maximum_stack_size, - PVOID /*PPS_ATTRIBUTE_LIST*/ attribute_list); - -// winternal.h defines THREADINFOCLASS, but not all members. -enum { ThreadBasicInformation = 0 }; - -// winternal.h defines SYSTEM_INFORMATION_CLASS, but not all members. -enum { SystemExtendedHandleInformation = 64 }; - -NTSTATUS NtQuerySystemInformation( - SYSTEM_INFORMATION_CLASS system_information_class, - PVOID system_information, - ULONG system_information_length, - PULONG return_length); - -NTSTATUS NtQueryInformationThread(HANDLE thread_handle, - THREADINFOCLASS thread_information_class, - PVOID thread_information, - ULONG thread_information_length, - PULONG return_length); - -template <class Traits> -NTSTATUS NtOpenThread(PHANDLE thread_handle, - ACCESS_MASK desired_access, - POBJECT_ATTRIBUTES object_attributes, - const process_types::CLIENT_ID<Traits>* client_id); - -NTSTATUS NtQueryObject(HANDLE handle, - OBJECT_INFORMATION_CLASS object_information_class, - void* object_information, - ULONG object_information_length, - ULONG* return_length); - -NTSTATUS NtSuspendProcess(HANDLE handle); - -NTSTATUS NtResumeProcess(HANDLE handle); - -// From https://msdn.microsoft.com/library/cc678403.aspx. -template <class Traits> -struct RTL_UNLOAD_EVENT_TRACE { - typename Traits::Pointer BaseAddress; - typename Traits::UnsignedIntegral SizeOfImage; - ULONG Sequence; - ULONG TimeDateStamp; - ULONG CheckSum; - WCHAR ImageName[32]; -}; - -void RtlGetUnloadEventTraceEx(ULONG** element_size, - ULONG** element_count, - void** event_trace); - -} // namespace crashpad diff --git a/Tools/Crashpad/include/util/win/ntstatus_logging.h b/Tools/Crashpad/include/util/win/ntstatus_logging.h deleted file mode 100644 index 7eececc95b..0000000000 --- a/Tools/Crashpad/include/util/win/ntstatus_logging.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_NTSTATUS_LOGGING_H_ -#define CRASHPAD_UTIL_WIN_NTSTATUS_LOGGING_H_ - -#include <windows.h> - -#include "base/logging.h" -#include "base/macros.h" - -namespace logging { - -class NtstatusLogMessage : public logging::LogMessage { - public: - NtstatusLogMessage( -#if defined(MINI_CHROMIUM_BASE_LOGGING_H_) - const char* function, -#endif - const char* file_path, - int line, - LogSeverity severity, - DWORD ntstatus); - ~NtstatusLogMessage(); - - private: - DWORD ntstatus_; - - DISALLOW_COPY_AND_ASSIGN(NtstatusLogMessage); -}; - -} // namespace logging - -#define NTSTATUS_LOG_STREAM(severity, ntstatus) \ - COMPACT_GOOGLE_LOG_EX_##severity(NtstatusLogMessage, ntstatus).stream() - -#if defined(MINI_CHROMIUM_BASE_LOGGING_H_) - -#define NTSTATUS_VLOG_STREAM(verbose_level, ntstatus) \ - logging::NtstatusLogMessage( \ - __PRETTY_FUNCTION__, __FILE__, __LINE__, -verbose_level, ntstatus) \ - .stream() - -#else - -#define NTSTATUS_VLOG_STREAM(verbose_level, ntstatus) \ - logging::NtstatusLogMessage(__FILE__, __LINE__, -verbose_level, ntstatus) \ - .stream() - -#endif // MINI_CHROMIUM_BASE_LOGGING_H_ - -#define NTSTATUS_LOG(severity, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(severity, ntstatus), LOG_IS_ON(severity)) -#define NTSTATUS_LOG_IF(severity, condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(severity, ntstatus), \ - LOG_IS_ON(severity) && (condition)) - -#define NTSTATUS_VLOG(verbose_level, ntstatus) \ - LAZY_STREAM(NTSTATUS_VLOG_STREAM(verbose_level, ntstatus), \ - VLOG_IS_ON(verbose_level)) -#define NTSTATUS_VLOG_IF(verbose_level, condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_VLOG_STREAM(verbose_level, ntstatus), \ - VLOG_IS_ON(verbose_level) && (condition)) - -#define NTSTATUS_CHECK(condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(FATAL, ntstatus), !(condition)) \ - << "Check failed: " #condition << ". " - -#define NTSTATUS_DLOG(severity, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(severity, ntstatus), DLOG_IS_ON(severity)) -#define NTSTATUS_DLOG_IF(severity, condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(severity, ntstatus), \ - DLOG_IS_ON(severity) && (condition)) - -#define NTSTATUS_DVLOG(verbose_level, ntstatus) \ - LAZY_STREAM(NTSTATUS_VLOG_STREAM(verbose_level, ntstatus), \ - DVLOG_IS_ON(verbose_level)) -#define NTSTATUS_DVLOG_IF(verbose_level, condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_VLOG_STREAM(verbose_level, ntstatus), \ - DVLOG_IS_ON(verbose_level) && (condition)) - -#define NTSTATUS_DCHECK(condition, ntstatus) \ - LAZY_STREAM(NTSTATUS_LOG_STREAM(FATAL, ntstatus), \ - DCHECK_IS_ON && !(condition)) \ - << "Check failed: " #condition << ". " - -#endif // CRASHPAD_UTIL_WIN_NTSTATUS_LOGGING_H_ diff --git a/Tools/Crashpad/include/util/win/process_info.h b/Tools/Crashpad/include/util/win/process_info.h deleted file mode 100644 index 58921c56f1..0000000000 --- a/Tools/Crashpad/include/util/win/process_info.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_PROCESS_INFO_H_ -#define CRASHPAD_UTIL_WIN_PROCESS_INFO_H_ - -#include <windows.h> -#include <sys/types.h> - -#include <string> -#include <vector> - -#include "base/macros.h" -#include "util/misc/initialization_state_dcheck.h" -#include "util/numeric/checked_range.h" -#include "util/stdlib/aligned_allocator.h" -#include "util/win/address_types.h" - -namespace crashpad { - -//! \brief Gathers information about a process given its `HANDLE`. This consists -//! primarily of information stored in the Process Environment Block. -class ProcessInfo { - public: - //! \brief The return type of MemoryInfo(), for convenience. - using MemoryBasicInformation64Vector = - AlignedVector<MEMORY_BASIC_INFORMATION64>; - - //! \brief Contains information about a module loaded into a process. - struct Module { - Module(); - ~Module(); - - //! \brief The pathname used to load the module from disk. - std::wstring name; - - //! \brief The base address of the loaded DLL. - WinVMAddress dll_base; - - //! \brief The size of the module. - WinVMSize size; - - //! \brief The module's timestamp. - time_t timestamp; - }; - - struct Handle { - Handle(); - ~Handle(); - - //! \brief A string representation of the handle's type. - std::wstring type_name; - - //! \brief The handle's value. - int handle; - - //! \brief The attributes for the handle, e.g. `OBJ_INHERIT`, - //! `OBJ_CASE_INSENSITIVE`, etc. - uint32_t attributes; - - //! \brief The `ACCESS_MASK` for the handle in this process. - //! - //! See - //! https://blogs.msdn.microsoft.com/openspecification/2010/04/01/about-the-access_mask-structure/ - //! for more information. - uint32_t granted_access; - - //! \brief The number of kernel references to the object that this handle - //! refers to. - uint32_t pointer_count; - - //! \brief The number of open handles to the object that this handle refers - //! to. - uint32_t handle_count; - }; - - ProcessInfo(); - ~ProcessInfo(); - - //! \brief Initializes this object with information about the given - //! \a process. - //! - //! This method must be called successfully prior to calling any other - //! method in this class. This method may only be called once. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Initialize(HANDLE process); - - //! \return `true` if the target process is a 64-bit process. - bool Is64Bit() const; - - //! \return `true` if the target process is running on the Win32-on-Win64 - //! subsystem. - bool IsWow64() const; - - //! \return The target process's process ID. - pid_t ProcessID() const; - - //! \return The target process's parent process ID. - pid_t ParentProcessID() const; - - //! \return The command line from the target process's Process Environment - //! Block. - bool CommandLine(std::wstring* command_line) const; - - //! \brief Gets the address and size of the process's Process Environment - //! Block. - //! - //! \param[out] peb_address The address of the Process Environment Block. - //! \param[out] peb_size The size of the Process Environment Block. - void Peb(WinVMAddress* peb_address, WinVMSize* peb_size) const; - - //! \brief Retrieves the modules loaded into the target process. - //! - //! The modules are enumerated in initialization order as detailed in the - //! Process Environment Block. The main executable will always be the - //! first element. - bool Modules(std::vector<Module>* modules) const; - - //! \brief Retrieves information about all pages mapped into the process. - const MemoryBasicInformation64Vector& MemoryInfo() const; - - //! \brief Given a range to be read from the target process, returns a vector - //! of ranges, representing the readable portions of the original range. - //! - //! \param[in] range The range being identified. - //! - //! \return A vector of ranges corresponding to the portion of \a range that - //! is readable based on the memory map. - std::vector<CheckedRange<WinVMAddress, WinVMSize>> GetReadableRanges( - const CheckedRange<WinVMAddress, WinVMSize>& range) const; - - //! \brief Given a range in the target process, determines if the entire range - //! is readable. - //! - //! \param[in] range The range being inspected. - //! - //! \return `true` if the range is fully readable, otherwise `false` with a - //! message logged. - bool LoggingRangeIsFullyReadable( - const CheckedRange<WinVMAddress, WinVMSize>& range) const; - - //! \brief Retrieves information about open handles in the target process. - const std::vector<Handle>& Handles() const; - - private: - template <class Traits> - friend bool GetProcessBasicInformation(HANDLE process, - bool is_wow64, - ProcessInfo* process_info, - WinVMAddress* peb_address, - WinVMSize* peb_size); - template <class Traits> - friend bool ReadProcessData(HANDLE process, - WinVMAddress peb_address_vmaddr, - ProcessInfo* process_info); - - friend bool ReadMemoryInfo(HANDLE process, - bool is_64_bit, - ProcessInfo* process_info); - - // This function is best-effort under low memory conditions. - std::vector<Handle> BuildHandleVector(HANDLE process) const; - - pid_t process_id_; - pid_t inherited_from_process_id_; - HANDLE process_; - std::wstring command_line_; - WinVMAddress peb_address_; - WinVMSize peb_size_; - std::vector<Module> modules_; - - // memory_info_ is a MemoryBasicInformation64Vector instead of a - // std::vector<MEMORY_BASIC_INFORMATION64> because MEMORY_BASIC_INFORMATION64 - // is declared with __declspec(align(16)), but std::vector<> does not maintain - // this alignment on 32-bit x86. clang-cl (but not MSVC cl) takes advantage of - // the presumed alignment and emits SSE instructions that require aligned - // storage. clang-cl should relax (unfortunately), but in the mean time, this - // provides aligned storage. See https://crbug.com/564691 and - // https://llvm.org/PR25779. - // - // TODO(mark): Remove this workaround when https://llvm.org/PR25779 is fixed - // and the fix is present in the clang-cl that compiles this code. - MemoryBasicInformation64Vector memory_info_; - - // Handles() is logically const, but updates this member on first retrieval. - // See https://crashpad.chromium.org/bug/9. - mutable std::vector<Handle> handles_; - - bool is_64_bit_; - bool is_wow64_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ProcessInfo); -}; - -//! \brief Given a memory map of a process, and a range to be read from the -//! target process, returns a vector of ranges, representing the readable -//! portions of the original range. -//! -//! This is a free function for testing, but prefer -//! ProcessInfo::GetReadableRanges(). -std::vector<CheckedRange<WinVMAddress, WinVMSize>> GetReadableRangesOfMemoryMap( - const CheckedRange<WinVMAddress, WinVMSize>& range, - const ProcessInfo::MemoryBasicInformation64Vector& memory_info); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_PROCESS_INFO_H_ diff --git a/Tools/Crashpad/include/util/win/process_structs.h b/Tools/Crashpad/include/util/win/process_structs.h deleted file mode 100644 index d9b5b2fa6f..0000000000 --- a/Tools/Crashpad/include/util/win/process_structs.h +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ -#define CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ - -#include <windows.h> - -namespace crashpad { -namespace process_types { - -namespace internal { - -struct Traits32 { - using Pad = DWORD; - using UnsignedIntegral = DWORD; - using Pointer = DWORD; -}; - -struct Traits64 { - using Pad = DWORD64; - using UnsignedIntegral = DWORD64; - using Pointer = DWORD64; -}; - -} // namespace internal - -//! \{ - -//! \brief Selected structures from winternl.h, ntddk.h, and `dt ntdll!xxx`, -//! customized to have both x86 and x64 sizes available. -//! -//! The structure and field names follow the Windows names for clarity. We do, -//! however, use plain integral types rather than pointer types. This is both -//! easier to define, and avoids accidentally treating them as pointers into the -//! current address space. -//! -//! The templates below should be instantiated with either internal::Traits32 -//! for structures targeting x86, or internal::Traits64 for x64. - -// We set packing to 1 so that we can explicitly control the layout to make it -// match the OS defined structures. -#pragma pack(push, 1) - -template <class Traits> -struct PROCESS_BASIC_INFORMATION { - union { - DWORD ExitStatus; - typename Traits::Pad padding_for_x64_0; - }; - typename Traits::Pointer PebBaseAddress; - typename Traits::UnsignedIntegral AffinityMask; - union { - DWORD BasePriority; - typename Traits::Pad padding_for_x64_1; - }; - typename Traits::UnsignedIntegral UniqueProcessId; - typename Traits::UnsignedIntegral InheritedFromUniqueProcessId; -}; - -template <class Traits> -struct LIST_ENTRY { - typename Traits::Pointer Flink; - typename Traits::Pointer Blink; -}; - -template <class Traits> -struct UNICODE_STRING { - union { - struct { - USHORT Length; - USHORT MaximumLength; - }; - typename Traits::Pad padding_for_x64; - }; - typename Traits::Pointer Buffer; -}; - -template <class Traits> -struct PEB_LDR_DATA { - ULONG Length; - DWORD Initialized; - typename Traits::Pointer SsHandle; - LIST_ENTRY<Traits> InLoadOrderModuleList; - LIST_ENTRY<Traits> InMemoryOrderModuleList; - LIST_ENTRY<Traits> InInitializationOrderModuleList; -}; - -template <class Traits> -struct LDR_DATA_TABLE_ENTRY { - LIST_ENTRY<Traits> InLoadOrderLinks; - LIST_ENTRY<Traits> InMemoryOrderLinks; - LIST_ENTRY<Traits> InInitializationOrderLinks; - typename Traits::Pointer DllBase; - typename Traits::Pointer EntryPoint; - union { - ULONG SizeOfImage; - typename Traits::Pad padding_for_x64; - }; - UNICODE_STRING<Traits> FullDllName; - UNICODE_STRING<Traits> BaseDllName; - ULONG Flags; - USHORT ObsoleteLoadCount; - USHORT TlsIndex; - LIST_ENTRY<Traits> HashLinks; - ULONG TimeDateStamp; -}; - -template <class Traits> -struct CURDIR { - UNICODE_STRING<Traits> DosPath; - typename Traits::Pointer Handle; -}; - -template <class Traits> -struct STRING { - union { - struct { - USHORT Length; - USHORT MaximumLength; - }; - typename Traits::Pad padding_for_x64; - }; - typename Traits::Pointer Buffer; -}; - -template <class Traits> -struct RTL_DRIVE_LETTER_CURDIR { - WORD Flags; - WORD Length; - DWORD TimeStamp; - STRING<Traits> DosPath; -}; - -template <class Traits> -struct RTL_USER_PROCESS_PARAMETERS { - DWORD MaximumLength; - DWORD Length; - DWORD Flags; - DWORD DebugFlags; - typename Traits::Pointer ConsoleHandle; - union { - DWORD ConsoleFlags; - typename Traits::Pad padding_for_x64_0; - }; - typename Traits::Pointer StandardInput; - typename Traits::Pointer StandardOutput; - typename Traits::Pointer StandardError; - CURDIR<Traits> CurrentDirectory; - UNICODE_STRING<Traits> DllPath; - UNICODE_STRING<Traits> ImagePathName; - UNICODE_STRING<Traits> CommandLine; - typename Traits::Pointer Environment; - DWORD StartingX; - DWORD StartingY; - DWORD CountX; - DWORD CountY; - DWORD CountCharsX; - DWORD CountCharsY; - DWORD FillAttribute; - DWORD WindowFlags; - union { - DWORD ShowWindowFlags; - typename Traits::Pad padding_for_x64_1; - }; - UNICODE_STRING<Traits> WindowTitle; - UNICODE_STRING<Traits> DesktopInfo; - UNICODE_STRING<Traits> ShellInfo; - UNICODE_STRING<Traits> RuntimeData; - RTL_DRIVE_LETTER_CURDIR<Traits> CurrentDirectores[32]; // sic. - ULONG EnvironmentSize; -}; - -template <class T> -struct GdiHandleBufferCountForBitness; - -template <> -struct GdiHandleBufferCountForBitness<internal::Traits32> { - enum { value = 34 }; -}; -template <> -struct GdiHandleBufferCountForBitness<internal::Traits64> { - enum { value = 60 }; -}; - -template <class Traits> -struct PEB { - union { - struct { - BYTE InheritedAddressSpace; - BYTE ReadImageFileExecOptions; - BYTE BeingDebugged; - BYTE BitField; - }; - typename Traits::Pad padding_for_x64_0; - }; - typename Traits::Pointer Mutant; - typename Traits::Pointer ImageBaseAddress; - typename Traits::Pointer Ldr; - typename Traits::Pointer ProcessParameters; - typename Traits::Pointer SubSystemData; - typename Traits::Pointer ProcessHeap; - typename Traits::Pointer FastPebLock; - typename Traits::Pointer AtlThunkSListPtr; - typename Traits::Pointer IFEOKey; - union { - DWORD CrossProcessFlags; - typename Traits::Pad padding_for_x64_1; - }; - typename Traits::Pointer KernelCallbackTable; - DWORD SystemReserved; - DWORD AtlThunkSListPtr32; - typename Traits::Pointer ApiSetMap; - union { - DWORD TlsExpansionCounter; - typename Traits::Pad padding_for_x64_2; - }; - typename Traits::Pointer TlsBitmap; - DWORD TlsBitmapBits[2]; - typename Traits::Pointer ReadOnlySharedMemoryBase; - typename Traits::Pointer SparePvoid0; - typename Traits::Pointer ReadOnlyStaticServerData; - typename Traits::Pointer AnsiCodePageData; - typename Traits::Pointer OemCodePageData; - typename Traits::Pointer UnicodeCaseTableData; - DWORD NumberOfProcessors; - DWORD NtGlobalFlag; - DWORD alignment_for_x86; - LARGE_INTEGER CriticalSectionTimeout; - typename Traits::UnsignedIntegral HeapSegmentReserve; - typename Traits::UnsignedIntegral HeapSegmentCommit; - typename Traits::UnsignedIntegral HeapDeCommitTotalFreeThreshold; - typename Traits::UnsignedIntegral HeapDeCommitFreeBlockThreshold; - DWORD NumberOfHeaps; - DWORD MaximumNumberOfHeaps; - typename Traits::Pointer ProcessHeaps; - typename Traits::Pointer GdiSharedHandleTable; - typename Traits::Pointer ProcessStarterHelper; - DWORD GdiDCAttributeList; - typename Traits::Pointer LoaderLock; - DWORD OSMajorVersion; - DWORD OSMinorVersion; - WORD OSBuildNumber; - WORD OSCSDVersion; - DWORD OSPlatformId; - DWORD ImageSubsystem; - DWORD ImageSubsystemMajorVersion; - union { - DWORD ImageSubsystemMinorVersion; - typename Traits::Pad padding_for_x64_3; - }; - typename Traits::UnsignedIntegral ActiveProcessAffinityMask; - DWORD GdiHandleBuffer[GdiHandleBufferCountForBitness<Traits>::value]; - typename Traits::Pointer PostProcessInitRoutine; - typename Traits::Pointer TlsExpansionBitmap; - DWORD TlsExpansionBitmapBits[32]; - union { - DWORD SessionId; - typename Traits::Pad padding_for_x64_4; - }; - ULARGE_INTEGER AppCompatFlags; - ULARGE_INTEGER AppCompatFlagsUser; - typename Traits::Pointer pShimData; - typename Traits::Pointer AppCompatInfo; - UNICODE_STRING<Traits> CSDVersion; - typename Traits::Pointer ActivationContextData; - typename Traits::Pointer ProcessAssemblyStorageMap; - typename Traits::Pointer SystemDefaultActivationContextData; - typename Traits::Pointer SystemAssemblyStorageMap; - typename Traits::UnsignedIntegral MinimumStackCommit; - typename Traits::Pointer FlsCallback; - LIST_ENTRY<Traits> FlsListHead; - typename Traits::Pointer FlsBitmap; - DWORD FlsBitmapBits[4]; - DWORD FlsHighIndex; -}; - -template <class Traits> -struct NT_TIB { - union { - // See https://msdn.microsoft.com/library/dn424783.aspx. - typename Traits::Pointer Wow64Teb; - struct { - typename Traits::Pointer ExceptionList; - typename Traits::Pointer StackBase; - typename Traits::Pointer StackLimit; - typename Traits::Pointer SubSystemTib; - union { - typename Traits::Pointer FiberData; - BYTE Version[4]; - }; - typename Traits::Pointer ArbitraryUserPointer; - typename Traits::Pointer Self; - }; - }; -}; - -// See https://msdn.microsoft.com/library/gg750647.aspx. -template <class Traits> -struct CLIENT_ID { - typename Traits::Pointer UniqueProcess; - typename Traits::Pointer UniqueThread; -}; - -// This is a partial definition of the TEB, as we do not currently use many -// fields of it. See https://nirsoft.net/kernel_struct/vista/TEB.html, and the -// (arch-specific) definition of _TEB in winternl.h. -template <class Traits> -struct TEB { - NT_TIB<Traits> NtTib; - typename Traits::Pointer EnvironmentPointer; - CLIENT_ID<Traits> ClientId; - typename Traits::Pointer ActiveRpcHandle; - typename Traits::Pointer ThreadLocalStoragePointer; - typename Traits::Pointer ProcessEnvironmentBlock; - typename Traits::Pointer RemainderOfReserved2[399]; - BYTE Reserved3[1952]; - typename Traits::Pointer TlsSlots[64]; - BYTE Reserved4[8]; - typename Traits::Pointer Reserved5[26]; - typename Traits::Pointer ReservedForOle; - typename Traits::Pointer Reserved6[4]; - typename Traits::Pointer TlsExpansionSlots; -}; - -// See https://msdn.microsoft.com/library/gg750724.aspx. -template <class Traits> -struct SYSTEM_THREAD_INFORMATION { - union { - struct { - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; - LARGE_INTEGER CreateTime; - union { - ULONG WaitTime; - typename Traits::Pad padding_for_x64_0; - }; - typename Traits::Pointer StartAddress; - CLIENT_ID<Traits> ClientId; - LONG Priority; - LONG BasePriority; - ULONG ContextSwitches; - ULONG ThreadState; - union { - ULONG WaitReason; - typename Traits::Pad padding_for_x64_1; - }; - }; - LARGE_INTEGER alignment_for_x86[8]; - }; -}; - -// There's an extra field in the x64 VM_COUNTERS (or maybe it's VM_COUNTERS_EX, -// it's not clear), so we just make separate specializations for 32/64. -template <class Traits> -struct VM_COUNTERS {}; - -template <> -struct VM_COUNTERS<internal::Traits32> { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -}; - -template <> -struct VM_COUNTERS<internal::Traits64> { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - union { - ULONG PageFaultCount; - internal::Traits64::Pad padding_for_x64; - }; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; - SIZE_T PrivateUsage; -}; - -// https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/System%20Information/Structures/SYSTEM_PROCESS_INFORMATION.html -template <class Traits> -struct SYSTEM_PROCESS_INFORMATION { - ULONG NextEntryOffset; - ULONG NumberOfThreads; - LARGE_INTEGER WorkingSetPrivateSize; - ULONG HardFaultCount; - ULONG NumberOfThreadsHighWatermark; - ULONGLONG CycleTime; - LARGE_INTEGER CreateTime; - LARGE_INTEGER UserTime; - LARGE_INTEGER KernelTime; - UNICODE_STRING<Traits> ImageName; - union { - LONG BasePriority; - typename Traits::Pad padding_for_x64_0; - }; - union { - DWORD UniqueProcessId; - typename Traits::Pad padding_for_x64_1; - }; - union { - DWORD InheritedFromUniqueProcessId; - typename Traits::Pad padding_for_x64_2; - }; - ULONG HandleCount; - ULONG SessionId; - typename Traits::Pointer UniqueProcessKey; - union { - VM_COUNTERS<Traits> VirtualMemoryCounters; - LARGE_INTEGER alignment_for_x86[6]; - }; - IO_COUNTERS IoCounters; - SYSTEM_THREAD_INFORMATION<Traits> Threads[1]; -}; - -// https://undocumented.ntinternals.net/source/usermode/structures/THREAD_BASIC_INFORMATION.html -template <class Traits> -struct THREAD_BASIC_INFORMATION { - union { - LONG ExitStatus; - typename Traits::Pad padding_for_x64_0; - }; - typename Traits::Pointer TebBaseAddress; - CLIENT_ID<Traits> ClientId; - typename Traits::Pointer AffinityMask; - ULONG Priority; - LONG BasePriority; -}; - -template <class Traits> -struct EXCEPTION_POINTERS { - typename Traits::Pointer ExceptionRecord; - typename Traits::Pointer ContextRecord; -}; - -using EXCEPTION_POINTERS32 = EXCEPTION_POINTERS<internal::Traits32>; -using EXCEPTION_POINTERS64 = EXCEPTION_POINTERS<internal::Traits64>; - -// This is defined in winnt.h, but not for cross-bitness. -template <class Traits> -struct RTL_CRITICAL_SECTION { - typename Traits::Pointer DebugInfo; - LONG LockCount; - LONG RecursionCount; - typename Traits::Pointer OwningThread; - typename Traits::Pointer LockSemaphore; - typename Traits::UnsignedIntegral SpinCount; -}; - -template <class Traits> -struct RTL_CRITICAL_SECTION_DEBUG { - union { - struct { - WORD Type; - WORD CreatorBackTraceIndex; - }; - typename Traits::Pad alignment_for_x64; - }; - typename Traits::Pointer CriticalSection; - LIST_ENTRY<Traits> ProcessLocksList; - DWORD EntryCount; - DWORD ContentionCount; - DWORD Flags; - WORD CreatorBackTraceIndexHigh; - WORD SpareWORD; -}; - -struct SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX { - void* Object; - ULONG_PTR UniqueProcessId; - HANDLE HandleValue; - ULONG GrantedAccess; - USHORT CreatorBackTraceIndex; - USHORT ObjectTypeIndex; - ULONG HandleAttributes; - ULONG Reserved; -}; - -struct SYSTEM_HANDLE_INFORMATION_EX { - ULONG_PTR NumberOfHandles; - ULONG_PTR Reserved; - SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1]; -}; - -#pragma pack(pop) - -//! \} - -} // namespace process_types -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_PROCESS_STRUCTS_H_ diff --git a/Tools/Crashpad/include/util/win/registration_protocol_win.h b/Tools/Crashpad/include/util/win/registration_protocol_win.h deleted file mode 100644 index 5f04a466c9..0000000000 --- a/Tools/Crashpad/include/util/win/registration_protocol_win.h +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_ -#define CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_ - -#include <windows.h> -#include <stdint.h> - -#include "base/strings/string16.h" -#include "util/win/address_types.h" - -namespace crashpad { - -#pragma pack(push, 1) - -//! \brief Structure read out of the client process by the crash handler when an -//! exception occurs. -struct ExceptionInformation { - //! \brief The address of an EXCEPTION_POINTERS structure in the client - //! process that describes the exception. - WinVMAddress exception_pointers; - - //! \brief The thread on which the exception happened. - DWORD thread_id; -}; - -//! \brief A client registration request. -struct RegistrationRequest { - //! \brief The expected value of `version`. This should be changed whenever - //! the messages or ExceptionInformation are modified incompatibly. - enum { kMessageVersion = 1 }; - - //! \brief Version field to detect skew between client and server. Should be - //! set to kMessageVersion. - int version; - - //! \brief The PID of the client process. - DWORD client_process_id; - - //! \brief The address, in the client process's address space, of an - //! ExceptionInformation structure, used when handling a crash dump - //! request. - WinVMAddress crash_exception_information; - - //! \brief The address, in the client process's address space, of an - //! ExceptionInformation structure, used when handling a non-crashing dump - //! request. - WinVMAddress non_crash_exception_information; - - //! \brief The address, in the client process's address space, of a - //! `CRITICAL_SECTION` allocated with a valid .DebugInfo field. This can - //! be accomplished by using - //! InitializeCriticalSectionWithDebugInfoIfPossible() or equivalent. This - //! value can be `0`, however then limited lock data will be available in - //! minidumps. - WinVMAddress critical_section_address; -}; - -//! \brief A message only sent to the server by itself to trigger shutdown. -struct ShutdownRequest { - //! \brief A randomly generated token used to validate the the shutdown - //! request was not sent from another process. - uint64_t token; -}; - -//! \brief The message passed from client to server by -//! SendToCrashHandlerServer(). -struct ClientToServerMessage { - //! \brief Indicates which field of the union is in use. - enum Type : uint32_t { - //! \brief For RegistrationRequest. - kRegister, - - //! \brief For ShutdownRequest. - kShutdown, - - //! \brief An empty message sent by the initial client in asynchronous mode. - //! No data is required, this just confirms that the server is ready to - //! accept client registrations. - kPing, - } type; - - union { - RegistrationRequest registration; - ShutdownRequest shutdown; - }; -}; - -//! \brief A client registration response. -struct RegistrationResponse { - //! \brief An event `HANDLE`, valid in the client process, that should be - //! signaled to request a crash report. Clients should convert the value - //! to a `HANDLE` by calling IntToHandle(). - int request_crash_dump_event; - - //! \brief An event `HANDLE`, valid in the client process, that should be - //! signaled to request a non-crashing dump be taken. Clients should - //! convert the value to a `HANDLE` by calling IntToHandle(). - int request_non_crash_dump_event; - - //! \brief An event `HANDLE`, valid in the client process, that will be - //! signaled by the server when the non-crashing dump is complete. Clients - //! should convert the value to a `HANDLE` by calling IntToHandle(). - int non_crash_dump_completed_event; -}; - -//! \brief The response sent back to the client via SendToCrashHandlerServer(). -union ServerToClientMessage { - RegistrationResponse registration; -}; - -#pragma pack(pop) - -//! \brief Connect over the given \a pipe_name, passing \a message to the -//! server, storing the server's reply into \a response. -//! -//! Typically clients will not use this directly, instead using -//! CrashpadClient::SetHandler(). -//! -//! \sa CrashpadClient::SetHandler() -bool SendToCrashHandlerServer(const base::string16& pipe_name, - const ClientToServerMessage& message, - ServerToClientMessage* response); - -//! \brief Wraps CreateNamedPipe() to create a single named pipe instance. -//! -//! \param[in] pipe_name The name to use for the pipe. -//! \param[in] first_instance If `true`, the named pipe instance will be -//! created with `FILE_FLAG_FIRST_PIPE_INSTANCE`. This ensures that the the -//! pipe name is not already in use when created. The first instance will be -//! created with an untrusted integrity SACL so instances of this pipe can -//! be connected to by processes of any integrity level. -HANDLE CreateNamedPipeInstance(const std::wstring& pipe_name, - bool first_instance); - -//! \brief Returns the SECURITY_DESCRIPTOR blob that will be used for creating -//! the connection pipe in CreateNamedPipeInstance(). -//! -//! This function is exposed for only for testing. -//! -//! \param[out] size The size of the returned blob. May be `nullptr` if not -//! required. -//! -//! \return A pointer to a self-relative `SECURITY_DESCRIPTOR`. Ownership is not -//! transferred to the caller. -const void* GetSecurityDescriptorForNamedPipeInstance(size_t* size); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_ diff --git a/Tools/Crashpad/include/util/win/safe_terminate_process.h b/Tools/Crashpad/include/util/win/safe_terminate_process.h deleted file mode 100644 index 7079eb2adc..0000000000 --- a/Tools/Crashpad/include/util/win/safe_terminate_process.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SAFE_TERMINATE_PROCESS_H_ -#define CRASHPAD_UTIL_WIN_SAFE_TERMINATE_PROCESS_H_ - -#include <windows.h> - -#include "build/build_config.h" - -namespace crashpad { - -//! \brief Calls `TerminateProcess()`. -//! -//! `TerminateProcess()` has been observed in the wild as being patched badly on -//! 32-bit x86: it’s patched with code adhering to the `cdecl` (caller clean-up) -//! convention, although it’s supposed to be `stdcall` (callee clean-up). The -//! mix-up means that neither caller nor callee perform parameter clean-up from -//! the stack, causing the stack pointer to have an unexpected value on return -//! from the patched function. This typically results in a crash shortly -//! thereafter. See <a href="https://crashpad.chromium.org/bug/179">Crashpad bug -//! 179</a>. -//! -//! On 32-bit x86, this replacement function calls `TerminateProcess()` without -//! making any assumptions about the stack pointer on its return. As such, it’s -//! compatible with the badly patched `cdecl` version as well as the native -//! `stdcall` version (and other less badly patched versions). -//! -//! Elsewhere, this function calls `TerminateProcess()` directly without any -//! additional fanfare. -//! -//! Call this function instead of `TerminateProcess()` anywhere that -//! `TerminateProcess()` would normally be called. -bool SafeTerminateProcess(HANDLE process, UINT exit_code); - -#if !defined(ARCH_CPU_X86) -inline bool SafeTerminateProcess(HANDLE process, UINT exit_code) { - return TerminateProcess(process, exit_code) != FALSE; -} -#endif // !ARCH_CPU_X86 - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SAFE_TERMINATE_PROCESS_H_ diff --git a/Tools/Crashpad/include/util/win/scoped_handle.h b/Tools/Crashpad/include/util/win/scoped_handle.h deleted file mode 100644 index 68be4f7b9f..0000000000 --- a/Tools/Crashpad/include/util/win/scoped_handle.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ -#define CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ - -#include <windows.h> - -#include "base/scoped_generic.h" - -namespace crashpad { - -namespace internal { - -struct ScopedFileHANDLECloseTraits { - static HANDLE InvalidValue() { - return INVALID_HANDLE_VALUE; - } - static void Free(HANDLE handle); -}; - -struct ScopedKernelHANDLECloseTraits { - static HANDLE InvalidValue() { - return nullptr; - } - static void Free(HANDLE handle); -}; - -} // namespace internal - -using ScopedFileHANDLE = - base::ScopedGeneric<HANDLE, internal::ScopedFileHANDLECloseTraits>; -using ScopedKernelHANDLE = - base::ScopedGeneric<HANDLE, internal::ScopedKernelHANDLECloseTraits>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ diff --git a/Tools/Crashpad/include/util/win/scoped_local_alloc.h b/Tools/Crashpad/include/util/win/scoped_local_alloc.h deleted file mode 100644 index b46078523e..0000000000 --- a/Tools/Crashpad/include/util/win/scoped_local_alloc.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SCOPED_LOCAL_ALLOC_H_ -#define CRASHPAD_UTIL_WIN_SCOPED_LOCAL_ALLOC_H_ - -#include <windows.h> - -#include "base/scoped_generic.h" - -namespace crashpad { - -namespace internal { - -struct LocalAllocTraits { - static HLOCAL InvalidValue() { return nullptr; } - static void Free(HLOCAL mem); -}; - -} // namespace internal - -using ScopedLocalAlloc = - base::ScopedGeneric<HLOCAL, internal::LocalAllocTraits>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SCOPED_LOCAL_ALLOC_H_ diff --git a/Tools/Crashpad/include/util/win/scoped_process_suspend.h b/Tools/Crashpad/include/util/win/scoped_process_suspend.h deleted file mode 100644 index 913886e5bf..0000000000 --- a/Tools/Crashpad/include/util/win/scoped_process_suspend.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_ -#define CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_ - -#include <windows.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Manages the suspension of another process. -//! -//! While an object of this class exists, the other process will be suspended. -//! Once the object is destroyed, the other process will become eligible for -//! resumption. -//! -//! If this process crashes while this object exists, there is no guarantee that -//! the other process will be resumed. -class ScopedProcessSuspend { - public: - //! Does not take ownership of \a process. - explicit ScopedProcessSuspend(HANDLE process); - ~ScopedProcessSuspend(); - - //! \brief Informs the object that the suspended process may be terminating, - //! and that this should not be treated as an error. - //! - //! Normally, attempting to resume a terminating process during destruction - //! results in an error message being logged for - //! `STATUS_PROCESS_IS_TERMINATING`. When it is known that a process may be - //! terminating, this method may be called to suppress that error message. - void TolerateTermination(); - - private: - HANDLE process_; - bool tolerate_termination_ = false; - - DISALLOW_COPY_AND_ASSIGN(ScopedProcessSuspend); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_ diff --git a/Tools/Crashpad/include/util/win/scoped_set_event.h b/Tools/Crashpad/include/util/win/scoped_set_event.h deleted file mode 100644 index 82a1b31486..0000000000 --- a/Tools/Crashpad/include/util/win/scoped_set_event.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SCOPED_SET_EVENT_H_ -#define CRASHPAD_UTIL_WIN_SCOPED_SET_EVENT_H_ - -#include <windows.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Calls `SetEvent()` on destruction at latest. -//! -//! Does not assume ownership of the event handle. Use ScopedKernelHANDLE for -//! ownership. -class ScopedSetEvent { - public: - explicit ScopedSetEvent(HANDLE event); - ~ScopedSetEvent(); - - //! \brief Calls `SetEvent()` immediately. - //! - //! `SetEvent()` will not be called on destruction. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool Set(); - - private: - HANDLE event_; // weak - - DISALLOW_COPY_AND_ASSIGN(ScopedSetEvent); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SCOPED_SET_EVENT_H_ diff --git a/Tools/Crashpad/include/util/win/session_end_watcher.h b/Tools/Crashpad/include/util/win/session_end_watcher.h deleted file mode 100644 index b23d391d8c..0000000000 --- a/Tools/Crashpad/include/util/win/session_end_watcher.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2017 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SESSION_END_WATCHER_H_ -#define CRASHPAD_UTIL_WIN_SESSION_END_WATCHER_H_ - -#include <windows.h> - -#include "base/macros.h" -#include "util/thread/thread.h" -#include "util/win/scoped_handle.h" - -namespace crashpad { - -//! \brief Creates a hidden window and waits for a `WM_ENDSESSION` message, -//! indicating that the session is ending and the application should -//! terminate. -//! -//! A dedicated thread will be created to run the `GetMessage()`-based message -//! loop required to monitor for this message. -//! -//! Users should subclass this class and receive notifications by implementing -//! the SessionEndWatcherEvent() method. -class SessionEndWatcher : public Thread { - public: - SessionEndWatcher(); - - //! \note The destructor waits for the thread that runs the message loop to - //! terminate. - ~SessionEndWatcher() override; - - protected: - // Exposed for testing. - HWND GetWindow() const { return window_; } - - // Exposed for testing. Blocks until window_ has been created. May be called - // multiple times if necessary. - void WaitForStart(); - - // Exposed for testing. Blocks until the message loop ends. May be called - // multiple times if necessary. - void WaitForStop(); - - private: - // Thread: - void ThreadMain() override; - - static LRESULT CALLBACK WindowProc(HWND window, - UINT message, - WPARAM w_param, - LPARAM l_param); - - //! \brief A `WM_ENDSESSION` message was received and it indicates that the - //! user session will be ending imminently. - //! - //! This method is called on the thread that runs the message loop. - virtual void SessionEnding() = 0; - - HWND window_; // Conceptually strong, but ownership managed in ThreadMain() - ScopedKernelHANDLE started_; - ScopedKernelHANDLE stopped_; - - DISALLOW_COPY_AND_ASSIGN(SessionEndWatcher); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SESSION_END_WATCHER_H_ diff --git a/Tools/Crashpad/include/util/win/termination_codes.h b/Tools/Crashpad/include/util/win/termination_codes.h deleted file mode 100644 index ce7fdba97a..0000000000 --- a/Tools/Crashpad/include/util/win/termination_codes.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_TERMINATION_CODES_H_ -#define CRASHPAD_UTIL_WIN_TERMINATION_CODES_H_ - -namespace crashpad { - -//! \brief Crashpad-specific codes that are used as arguments to -//! SafeTerminateProcess() or `TerminateProcess()` in unusual circumstances. -enum TerminationCodes : unsigned int { - //! \brief The crash handler did not respond, and the client self-terminated. - kTerminationCodeCrashNoDump = 0xffff7001, - - //! \brief The initial process snapshot failed, so the correct client - //! termination code could not be retrieved. - kTerminationCodeSnapshotFailed = 0xffff7002, - - //! \brief A dump was requested for a client that was never registered with - //! the crash handler. - kTerminationCodeNotConnectedToHandler = 0xffff7003, -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_TERMINATION_CODES_H_ diff --git a/Tools/Crashpad/include/util/win/xp_compat.h b/Tools/Crashpad/include/util/win/xp_compat.h deleted file mode 100644 index 1d4d4a0b46..0000000000 --- a/Tools/Crashpad/include/util/win/xp_compat.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_XP_COMPAT_H_ -#define CRASHPAD_UTIL_WIN_XP_COMPAT_H_ - -#include <windows.h> - -namespace crashpad { - -enum { - //! \brief This is the XP-suitable value of `PROCESS_ALL_ACCESS`. - //! - //! Requesting `PROCESS_ALL_ACCESS` with the value defined when building - //! against a Vista+ SDK results in `ERROR_ACCESS_DENIED` when running on XP. - //! See https://msdn.microsoft.com/library/ms684880.aspx. - kXPProcessAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, - - //! \brief This is the XP-suitable value of `THREAD_ALL_ACCESS`. - //! - //! Requesting `THREAD_ALL_ACCESS` with the value defined when building - //! against a Vista+ SDK results in `ERROR_ACCESS_DENIED` when running on XP. - //! See https://msdn.microsoft.com/library/ms686769.aspx. - kXPThreadAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF, -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_XP_COMPAT_H_ diff --git a/Tools/Crashpad/include/vs2013/client/crash_report_database.h b/Tools/Crashpad/include/vs2013/client/crash_report_database.h deleted file mode 100644 index 3768cb2335..0000000000 --- a/Tools/Crashpad/include/vs2013/client/crash_report_database.h +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ -#define CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ - -#include <time.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "util/file/file_io.h" -#include "util/misc/metrics.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -class Settings; - -//! \brief An interface for managing a collection of crash report files and -//! metadata associated with the crash reports. -//! -//! All Report objects that are returned by this class are logically const. -//! They are snapshots of the database at the time the query was run, and the -//! data returned is liable to change after the query is executed. -//! -//! The lifecycle of a crash report has three stages: -//! -//! 1. New: A crash report is created with PrepareNewCrashReport(), the -//! the client then writes the report, and then calls -//! FinishedWritingCrashReport() to make the report Pending. -//! 2. Pending: The report has been written but has not been locally -//! processed, or it was has been brought back from 'Completed' state by -//! user request. -//! 3. Completed: The report has been locally processed, either by uploading -//! it to a collection server and calling RecordUploadAttempt(), or by -//! calling SkipReportUpload(). -class CrashReportDatabase { - public: - //! \brief A crash report record. - //! - //! This represents the metadata for a crash report, as well as the location - //! of the report itself. A CrashReportDatabase maintains at least this - //! information. - struct Report { - Report(); - - //! A unique identifier by which this report will always be known to the - //! database. - UUID uuid; - - //! The current location of the crash report on the client’s filesystem. - //! The location of a crash report may change over time, so the UUID should - //! be used as the canonical identifier. - base::FilePath file_path; - - //! An identifier issued to this crash report by a collection server. - std::string id; - - //! The time at which the report was generated. - time_t creation_time; - - //! Whether this crash report was successfully uploaded to a collection - //! server. - bool uploaded; - - //! The last timestamp at which an attempt was made to submit this crash - //! report to a collection server. If this is zero, then the report has - //! never been uploaded. If #uploaded is true, then this timestamp is the - //! time at which the report was uploaded, and no other attempts to upload - //! this report will be made. - time_t last_upload_attempt_time; - - //! The number of times an attempt was made to submit this report to - //! a collection server. If this is more than zero, then - //! #last_upload_attempt_time will be set to the timestamp of the most - //! recent attempt. - int upload_attempts; - - //! Whether this crash report was explicitly requested by user to be - //! uploaded. This can be true only if report is in the 'pending' state. - bool upload_explicitly_requested; - }; - - //! \brief A crash report that is in the process of being written. - //! - //! An instance of this struct should be created via PrepareNewCrashReport() - //! and destroyed with FinishedWritingCrashReport(). - struct NewReport { - //! The file handle to which the report should be written. - FileHandle handle; - - //! A unique identifier by which this report will always be known to the - //! database. - UUID uuid; - - //! The path to the crash report being written. - base::FilePath path; - }; - - //! \brief A scoper to cleanly handle the interface requirement imposed by - //! PrepareNewCrashReport(). - //! - //! Calls ErrorWritingCrashReport() upon destruction unless disarmed by - //! calling Disarm(). Armed upon construction. - class CallErrorWritingCrashReport { - public: - //! \brief Arms the object to call ErrorWritingCrashReport() on \a database - //! with an argument of \a new_report on destruction. - CallErrorWritingCrashReport(CrashReportDatabase* database, - NewReport* new_report); - - //! \brief Calls ErrorWritingCrashReport() if the object is armed. - ~CallErrorWritingCrashReport(); - - //! \brief Disarms the object so that CallErrorWritingCrashReport() will not - //! be called upon destruction. - void Disarm(); - - private: - CrashReportDatabase* database_; // weak - NewReport* new_report_; // weak - - DISALLOW_COPY_AND_ASSIGN(CallErrorWritingCrashReport); - }; - - //! \brief The result code for operations performed on a database. - enum OperationStatus { - //! \brief No error occurred. - kNoError = 0, - - //! \brief The report that was requested could not be located. - kReportNotFound, - - //! \brief An error occured while performing a file operation on a crash - //! report. - //! - //! A database is responsible for managing both the metadata about a report - //! and the actual crash report itself. This error is returned when an - //! error occurred when managing the report file. Additional information - //! will be logged. - kFileSystemError, - - //! \brief An error occured while recording metadata for a crash report or - //! database-wide settings. - //! - //! A database is responsible for managing both the metadata about a report - //! and the actual crash report itself. This error is returned when an - //! error occurred when managing the metadata about a crash report or - //! database-wide settings. Additional information will be logged. - kDatabaseError, - - //! \brief The operation could not be completed because a concurrent - //! operation affecting the report is occurring. - kBusyError, - - //! \brief The report cannot be uploaded by user request as it has already - //! been uploaded. - kCannotRequestUpload, - }; - - virtual ~CrashReportDatabase() {} - - //! \brief Opens a database of crash reports, possibly creating it. - //! - //! \param[in] path A path to the database to be created or opened. If the - //! database does not yet exist, it will be created if possible. Note that - //! for databases implemented as directory structures, existence refers - //! solely to the outermost directory. - //! - //! \return A database object on success, `nullptr` on failure with an error - //! logged. - //! - //! \sa InitializeWithoutCreating - static std::unique_ptr<CrashReportDatabase> Initialize( - const base::FilePath& path); - - //! \brief Opens an existing database of crash reports. - //! - //! \param[in] path A path to the database to be opened. If the database does - //! not yet exist, it will not be created. Note that for databases - //! implemented as directory structures, existence refers solely to the - //! outermost directory. On such databases, as long as the outermost - //! directory is present, this method will create the inner structure. - //! - //! \return A database object on success, `nullptr` on failure with an error - //! logged. - //! - //! \sa Initialize - static std::unique_ptr<CrashReportDatabase> InitializeWithoutCreating( - const base::FilePath& path); - - //! \brief Returns the Settings object for this database. - //! - //! \return A weak pointer to the Settings object, which is owned by the - //! database. - virtual Settings* GetSettings() = 0; - - //! \brief Creates a record of a new crash report. - //! - //! Callers can then write the crash report using the file handle provided. - //! The caller does not own the new crash report record or its file handle, - //! both of which must be explicitly disposed of by calling - //! FinishedWritingCrashReport() or ErrorWritingCrashReport(). - //! - //! To arrange to call ErrorWritingCrashReport() during any early return, use - //! CallErrorWritingCrashReport. - //! - //! \param[out] report A NewReport object containing a file handle to which - //! the crash report data should be written. Only valid if this returns - //! #kNoError. The caller must not delete the NewReport object or close - //! the file handle within. - //! - //! \return The operation status code. - virtual OperationStatus PrepareNewCrashReport(NewReport** report) = 0; - - //! \brief Informs the database that a crash report has been written. - //! - //! After calling this method, the database is permitted to move and rename - //! the file at NewReport::path. - //! - //! \param[in] report A NewReport obtained with PrepareNewCrashReport(). The - //! NewReport object and file handle within will be invalidated as part of - //! this call. - //! \param[out] uuid The UUID of this crash report. - //! - //! \return The operation status code. - virtual OperationStatus FinishedWritingCrashReport(NewReport* report, - UUID* uuid) = 0; - - //! \brief Informs the database that an error occurred while attempting to - //! write a crash report, and that any resources associated with it should - //! be cleaned up. - //! - //! After calling this method, the database is permitted to remove the file at - //! NewReport::path. - //! - //! \param[in] report A NewReport obtained with PrepareNewCrashReport(). The - //! NewReport object and file handle within will be invalidated as part of - //! this call. - //! - //! \return The operation status code. - virtual OperationStatus ErrorWritingCrashReport(NewReport* report) = 0; - - //! \brief Returns the crash report record for the unique identifier. - //! - //! \param[in] uuid The crash report record unique identifier. - //! \param[out] report A crash report record. Only valid if this returns - //! #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus LookUpCrashReport(const UUID& uuid, - Report* report) = 0; - - //! \brief Returns a list of crash report records that have not been uploaded. - //! - //! \param[out] reports A list of crash report record objects. This must be - //! empty on entry. Only valid if this returns #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetPendingReports(std::vector<Report>* reports) = 0; - - //! \brief Returns a list of crash report records that have been completed, - //! either by being uploaded or by skipping upload. - //! - //! \param[out] reports A list of crash report record objects. This must be - //! empty on entry. Only valid if this returns #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetCompletedReports(std::vector<Report>* reports) = 0; - - //! \brief Obtains a report object for uploading to a collection server. - //! - //! The file at Report::file_path should be uploaded by the caller, and then - //! the returned Report object must be disposed of via a call to - //! RecordUploadAttempt(). - //! - //! A subsequent call to this method with the same \a uuid is illegal until - //! RecordUploadAttempt() has been called. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! \param[out] report A crash report record for the report to be uploaded. - //! The caller does not own this object. Only valid if this returns - //! #kNoError. - //! - //! \return The operation status code. - virtual OperationStatus GetReportForUploading(const UUID& uuid, - const Report** report) = 0; - - //! \brief Adjusts a crash report record’s metadata to account for an upload - //! attempt, and updates the last upload attempt time as returned by - //! Settings::GetLastUploadAttemptTime(). - //! - //! After calling this method, the database is permitted to move and rename - //! the file at Report::file_path. - //! - //! \param[in] report The report object obtained from - //! GetReportForUploading(). This object is invalidated after this call. - //! \param[in] successful Whether the upload attempt was successful. - //! \param[in] id The identifier assigned to this crash report by the - //! collection server. Must be empty if \a successful is `false`; may be - //! empty if it is `true`. - //! - //! \return The operation status code. - virtual OperationStatus RecordUploadAttempt(const Report* report, - bool successful, - const std::string& id) = 0; - - //! \brief Moves a report from the pending state to the completed state, but - //! without the report being uploaded. - //! - //! This can be used if the user has disabled crash report collection, but - //! crash generation is still enabled in the product. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! \param[in] reason The reason the report upload is being skipped for - //! metrics tracking purposes. - //! - //! \return The operation status code. - virtual OperationStatus SkipReportUpload( - const UUID& uuid, - Metrics::CrashSkippedReason reason) = 0; - - //! \brief Deletes a crash report file and its associated metadata. - //! - //! \param[in] uuid The UUID of the report to delete. - //! - //! \return The operation status code. - virtual OperationStatus DeleteReport(const UUID& uuid) = 0; - - //! \brief Marks a crash report as explicitly requested to be uploaded by the - //! user and moves it to 'pending' state. - //! - //! \param[in] uuid The unique identifier for the crash report record. - //! - //! \return The operation status code. - virtual OperationStatus RequestUpload(const UUID& uuid) = 0; - - protected: - CrashReportDatabase() {} - - private: - DISALLOW_COPY_AND_ASSIGN(CrashReportDatabase); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ diff --git a/Tools/Crashpad/include/vs2013/client/crashpad_client.h b/Tools/Crashpad/include/vs2013/client/crashpad_client.h deleted file mode 100644 index 844512f160..0000000000 --- a/Tools/Crashpad/include/vs2013/client/crashpad_client.h +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ -#define CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ - -#include <map> -#include <string> -#include <vector> - -#include <stdint.h> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "build/build_config.h" - -#if defined(OS_MACOSX) -#include "base/mac/scoped_mach_port.h" -#elif defined(OS_WIN) -#include <windows.h> -#include "util/win/scoped_handle.h" -#endif - -namespace crashpad { - -//! \brief The primary interface for an application to have Crashpad monitor -//! it for crashes. -class CrashpadClient { - public: - CrashpadClient(); - ~CrashpadClient(); - - //! \brief Starts a Crashpad handler process, performing any necessary - //! handshake to configure it. - //! - //! This method directs crashes to the Crashpad handler. On macOS, this is - //! applicable to this process and all subsequent child processes. On Windows, - //! child processes must also register by using SetHandlerIPCPipe(). - //! - //! On macOS, this method starts a Crashpad handler and obtains a Mach send - //! right corresponding to a receive right held by the handler process. The - //! handler process runs an exception server on this port. This method sets - //! the task’s exception port for `EXC_CRASH`, `EXC_RESOURCE`, and `EXC_GUARD` - //! exceptions to the Mach send right obtained. The handler will be installed - //! with behavior `EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES` and thread - //! state flavor `MACHINE_THREAD_STATE`. Exception ports are inherited, so a - //! Crashpad handler started here will remain the handler for any child - //! processes created after StartHandler() is called. These child processes do - //! not need to call StartHandler() or be aware of Crashpad in any way. The - //! Crashpad handler will receive crashes from child processes that have - //! inherited it as their exception handler even after the process that called - //! StartHandler() exits. - //! - //! On Windows, if \a asynchronous_start is `true`, this function will not - //! directly call `CreateProcess()`, making it suitable for use in a - //! `DllMain()`. In that case, the handler is started from a background - //! thread, deferring the handler's startup. Nevertheless, regardless of the - //! value of \a asynchronous_start, after calling this method, the global - //! unhandled exception filter is set up, and all crashes will be handled by - //! Crashpad. Optionally, use WaitForHandlerStart() to join with the - //! background thread and retrieve the status of handler startup. - //! - //! \param[in] handler The path to a Crashpad handler executable. - //! \param[in] database The path to a Crashpad database. The handler will be - //! started with this path as its `--database` argument. - //! \param[in] metrics_dir The path to an already existing directory where - //! metrics files can be stored. The handler will be started with this - //! path as its `--metrics-dir` argument. - //! \param[in] url The URL of an upload server. The handler will be started - //! with this URL as its `--url` argument. - //! \param[in] annotations Process annotations to set in each crash report. - //! The handler will be started with an `--annotation` argument for each - //! element in this map. - //! \param[in] arguments Additional arguments to pass to the Crashpad handler. - //! Arguments passed in other parameters and arguments required to perform - //! the handshake are the responsibility of this method, and must not be - //! specified in this parameter. - //! \param[in] restartable If `true`, the handler will be restarted if it - //! dies, if this behavior is supported. This option is not available on - //! all platforms, and does not function on all OS versions. If it is - //! not supported, it will be ignored. - //! \param[out] asynchronous_start If `true`, the handler will be started from - //! a background thread. Optionally, WaitForHandlerStart() can be used at - //! a suitable time to retreive the result of background startup. This - //! option is only used on Windows. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool StartHandler(const base::FilePath& handler, - const base::FilePath& database, - const base::FilePath& metrics_dir, - const std::string& url, - const std::map<std::string, std::string>& annotations, - const std::vector<std::string>& arguments, - bool restartable, - bool asynchronous_start); - -#if defined(OS_MACOSX) || DOXYGEN - //! \brief Sets the process’ crash handler to a Mach service registered with - //! the bootstrap server. - //! - //! This method is only defined on macOS. - //! - //! See StartHandler() for more detail on how the port and handler are - //! configured. - //! - //! \param[in] service_name The service name of a Crashpad exception handler - //! service previously registered with the bootstrap server. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool SetHandlerMachService(const std::string& service_name); - - //! \brief Sets the process’ crash handler to a Mach port. - //! - //! This method is only defined on macOS. - //! - //! See StartHandler() for more detail on how the port and handler are - //! configured. - //! - //! \param[in] exception_port An `exception_port_t` corresponding to a - //! Crashpad exception handler service. - //! - //! \return `true` on success, `false` on failure with a message logged. - bool SetHandlerMachPort(base::mac::ScopedMachSendRight exception_port); -#endif - -#if defined(OS_WIN) || DOXYGEN - //! \brief Sets the IPC pipe of a presumably-running Crashpad handler process - //! which was started with StartHandler() or by other compatible means - //! and does an IPC message exchange to register this process with the - //! handler. Crashes will be serviced once this method returns. - //! - //! This method is only defined on Windows. - //! - //! This method sets the unhandled exception handler to a local - //! function that when reached will "signal and wait" for the crash handler - //! process to create the dump. - //! - //! \param[in] ipc_pipe The full name of the crash handler IPC pipe. This is - //! a string of the form `"\\.\pipe\NAME"`. - //! - //! \return `true` on success and `false` on failure. - bool SetHandlerIPCPipe(const std::wstring& ipc_pipe); - - //! \brief Retrieves the IPC pipe name used to register with the Crashpad - //! handler. - //! - //! This method retrieves the IPC pipe name set by SetHandlerIPCPipe(), or a - //! suitable IPC pipe name chosen by StartHandler(). It is intended to be used - //! to obtain the IPC pipe name so that it may be passed to other processes, - //! so that they may register with an existing Crashpad handler by calling - //! SetHandlerIPCPipe(). - //! - //! This method is only defined on Windows. - //! - //! \return The full name of the crash handler IPC pipe, a string of the form - //! `"\\.\pipe\NAME"`. - std::wstring GetHandlerIPCPipe() const; - - //! \brief When `asynchronous_start` is used with StartHandler(), this method - //! can be used to block until the handler launch has been completed to - //! retrieve status information. - //! - //! This method should not be used unless `asynchronous_start` was `true`. - //! - //! \return `true` if the hander startup succeeded, `false` otherwise, and an - //! error message will have been logged. - bool WaitForHandlerStart(); - - //! \brief Requests that the handler capture a dump even though there hasn't - //! been a crash. - //! - //! \param[in] context A `CONTEXT`, generally captured by CaptureContext() or - //! similar. - static void DumpWithoutCrash(const CONTEXT& context); - - //! \brief Requests that the handler capture a dump using the given \a - //! exception_pointers to get the `EXCEPTION_RECORD` and `CONTEXT`. - //! - //! This function is not necessary in general usage as an unhandled exception - //! filter is installed by StartHandler() or SetHandlerIPCPipe(). - //! - //! \param[in] exception_pointers An `EXCEPTION_POINTERS`, as would generally - //! passed to an unhandled exception filter. - static void DumpAndCrash(EXCEPTION_POINTERS* exception_pointers); - - //! \brief Requests that the handler capture a dump of a different process. - //! - //! The target process must be an already-registered Crashpad client. An - //! exception will be triggered in the target process, and the regular dump - //! mechanism used. This function will block until the exception in the target - //! process has been handled by the Crashpad handler. - //! - //! This function is unavailable when running on Windows XP and will return - //! `false`. - //! - //! \param[in] process A `HANDLE` identifying the process to be dumped. - //! \param[in] blame_thread If non-null, a `HANDLE` valid in the caller's - //! process, referring to a thread in the target process. If this is - //! supplied, instead of the exception referring to the location where the - //! exception was injected, an exception record will be fabricated that - //! refers to the current location of the given thread. - //! \param[in] exception_code If \a blame_thread is non-null, this will be - //! used as the exception code in the exception record. - //! - //! \return `true` if the exception was triggered successfully. - bool DumpAndCrashTargetProcess(HANDLE process, - HANDLE blame_thread, - DWORD exception_code) const; - - enum : uint32_t { - //! \brief The exception code (roughly "Client called") used when - //! DumpAndCrashTargetProcess() triggers an exception in a target - //! process. - //! - //! \note This value does not have any bits of the top nibble set, to avoid - //! confusion with real exception codes which tend to have those bits - //! set. - kTriggeredExceptionCode = 0xcca11ed, - }; -#endif - -#if defined(OS_MACOSX) || DOXYGEN - //! \brief Configures the process to direct its crashes to the default handler - //! for the operating system. - //! - //! On macOS, this sets the task’s exception port as in SetHandlerMachPort(), - //! but the exception handler used is obtained from - //! SystemCrashReporterHandler(). If the system’s crash reporter handler - //! cannot be determined or set, the task’s exception ports for crash-type - //! exceptions are cleared. - //! - //! Use of this function is strongly discouraged. - //! - //! \warning After a call to this function, Crashpad will no longer monitor - //! the process for crashes until a subsequent call to - //! SetHandlerMachPort(). - //! - //! \note This is provided as a static function to allow it to be used in - //! situations where a CrashpadClient object is not otherwise available. - //! This may be useful when a child process inherits its parent’s Crashpad - //! handler, but wants to sever this tie. - static void UseSystemDefaultHandler(); -#endif - - private: -#if defined(OS_WIN) - std::wstring ipc_pipe_; - ScopedKernelHANDLE handler_start_thread_; -#endif - - DISALLOW_COPY_AND_ASSIGN(CrashpadClient); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_CRASHPAD_CLIENT_H_ diff --git a/Tools/Crashpad/include/vs2013/client/settings.h b/Tools/Crashpad/include/vs2013/client/settings.h deleted file mode 100644 index b64f74fbaf..0000000000 --- a/Tools/Crashpad/include/vs2013/client/settings.h +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2015 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_CLIENT_SETTINGS_H_ -#define CRASHPAD_CLIENT_SETTINGS_H_ - -#include <time.h> - -#include <string> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/scoped_generic.h" -#include "util/file/file_io.h" -#include "util/misc/initialization_state.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -namespace internal { - -struct ScopedLockedFileHandleTraits { - static FileHandle InvalidValue() { return kInvalidFileHandle; } - static void Free(FileHandle handle); -}; - -} // namespace internal - -//! \brief An interface for accessing and modifying the settings of a -//! CrashReportDatabase. -//! -//! This class must not be instantiated directly, but rather an instance of it -//! should be retrieved via CrashReportDatabase::GetSettings(). -class Settings { - public: - explicit Settings(const base::FilePath& file_path); - ~Settings(); - - bool Initialize(); - - //! \brief Retrieves the immutable identifier for this client, which is used - //! on a server to locate all crash reports from a specific Crashpad - //! database. - //! - //! This is automatically initialized when the database is created. - //! - //! \param[out] client_id The unique client identifier. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetClientID(UUID* client_id); - - //! \brief Retrieves the user’s preference for submitting crash reports to a - //! collection server. - //! - //! The default value is `false`. - //! - //! \param[out] enabled Whether crash reports should be uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetUploadsEnabled(bool* enabled); - - //! \brief Sets the user’s preference for submitting crash reports to a - //! collection server. - //! - //! \param[in] enabled Whether crash reports should be uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool SetUploadsEnabled(bool enabled); - - //! \brief Retrieves the last time at which a report was attempted to be - //! uploaded. - //! - //! The default value is `0` if it has never been set before. - //! - //! \param[out] time The last time at which a report was uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool GetLastUploadAttemptTime(time_t* time); - - //! \brief Sets the last time at which a report was attempted to be uploaded. - //! - //! This is only meant to be used internally by the CrashReportDatabase. - //! - //! \param[in] time The last time at which a report was uploaded. - //! - //! \return On success, returns `true`, otherwise returns `false` with an - //! error logged. - bool SetLastUploadAttemptTime(time_t time); - - private: - struct Data; - - // This must be constructed with MakeScopedLockedFileHandle(). It both unlocks - // and closes the file on destruction. - using ScopedLockedFileHandle = - base::ScopedGeneric<FileHandle, internal::ScopedLockedFileHandleTraits>; - static ScopedLockedFileHandle MakeScopedLockedFileHandle(FileHandle file, - FileLocking locking); - - // Opens the settings file for reading. On error, logs a message and returns - // the invalid handle. - ScopedLockedFileHandle OpenForReading(); - - // Opens the settings file for reading and writing. On error, logs a message - // and returns the invalid handle. |mode| determines how the file will be - // opened. |mode| must not be FileWriteMode::kTruncateOrCreate. - // - // If |log_open_error| is false, nothing will be logged for an error - // encountered when attempting to open the file, but this method will still - // return false. This is intended to be used to suppress error messages when - // attempting to create a new settings file when multiple attempts are made. - ScopedLockedFileHandle OpenForReadingAndWriting(FileWriteMode mode, - bool log_open_error); - - // Opens the settings file and reads the data. If that fails, an error will - // be logged and the settings will be recovered and re-initialized. If that - // also fails, returns false with additional log data from recovery. - bool OpenAndReadSettings(Data* out_data); - - // Opens the settings file for writing and reads the data. If reading fails, - // recovery is attempted. Returns the opened file handle on success, or the - // invalid file handle on failure, with an error logged. - ScopedLockedFileHandle OpenForWritingAndReadSettings(Data* out_data); - - // Reads the settings from |handle|. Logs an error and returns false on - // failure. This does not perform recovery. - // - // |handle| must be the result of OpenForReading() or - // OpenForReadingAndWriting(). - // - // If |log_read_error| is false, nothing will be logged for a read error, but - // this method will still return false. This is intended to be used to - // suppress error messages when attempting to read a newly created settings - // file. - bool ReadSettings(FileHandle handle, Data* out_data, bool log_read_error); - - // Writes the settings to |handle|. Logs an error and returns false on - // failure. This does not perform recovery. - // - // |handle| must be the result of OpenForReadingAndWriting(). - bool WriteSettings(FileHandle handle, const Data& data); - - // Recovers the settings file by re-initializing the data. If |handle| is the - // invalid handle, this will open the file; if it is not, then it must be the - // result of OpenForReadingAndWriting(). If the invalid handle is passed, the - // caller must not be holding the handle. The new settings data are stored in - // |out_data|. Returns true on success and false on failure, with an error - // logged. - bool RecoverSettings(FileHandle handle, Data* out_data); - - // Initializes a settings file and writes the data to |handle|. Returns true - // on success and false on failure, with an error logged. - // - // |handle| must be the result of OpenForReadingAndWriting(). - bool InitializeSettings(FileHandle handle); - - const base::FilePath& file_path() const { return file_path_; } - - base::FilePath file_path_; - - InitializationState initialized_; - - DISALLOW_COPY_AND_ASSIGN(Settings); -}; - -} // namespace crashpad - -#endif // CRASHPAD_CLIENT_SETTINGS_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/compiler_specific.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/compiler_specific.h deleted file mode 100644 index 73c02ea5fd..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/compiler_specific.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ -#define MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ - -#include "build/build_config.h" - -#if defined(COMPILER_MSVC) - -// MSVC_SUPPRESS_WARNING disables warning |n| for the remainder of the line and -// for the next line of the source file. -#define MSVC_SUPPRESS_WARNING(n) __pragma(warning(suppress:n)) - -// MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled. -// The warning remains disabled until popped by MSVC_POP_WARNING. -#define MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ - __pragma(warning(disable:n)) - -// Pop effects of innermost MSVC_PUSH_* macro. -#define MSVC_POP_WARNING() __pragma(warning(pop)) - -#else // Not MSVC - -#define MSVC_SUPPRESS_WARNING(n) -#define MSVC_PUSH_DISABLE_WARNING(n) -#define MSVC_POP_WARNING() - -#endif // COMPILER_MSVC - -// Annotate a variable indicating it's ok if the variable is not used. -// (Typically used to silence a compiler warning when the assignment -// is important for some other reason.) -// Use like: -// int x = ...; -// ALLOW_UNUSED_LOCAL(x); -#define ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0 - -// Annotate a typedef or function indicating it's ok if it's not used. -// Use like: -// typedef Foo Bar ALLOW_UNUSED_TYPE; -#if defined(COMPILER_GCC) -#define ALLOW_UNUSED_TYPE __attribute__((unused)) -#else -#define ALLOW_UNUSED_TYPE -#endif - -// Specify memory alignment for structs, classes, etc. -// Use like: -// class ALIGNAS(16) MyClass { ... } -// ALIGNAS(16) int array[4]; -#if defined(COMPILER_MSVC) -#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) -#elif defined(COMPILER_GCC) -#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) -#endif - -// Return the byte alignment of the given type (available at compile time). Use -// sizeof(type) prior to checking __alignof to workaround Visual C++ bug: -// http://goo.gl/isH0C -// Use like: -// ALIGNOF(int32_t) // this would be 4 -#if defined(COMPILER_MSVC) -#define ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type)) -#elif defined(COMPILER_GCC) -#define ALIGNOF(type) __alignof__(type) -#endif - -#if defined(COMPILER_MSVC) -#define WARN_UNUSED_RESULT -#else -#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#endif - -#if defined(COMPILER_MSVC) -#define PRINTF_FORMAT(format_param, dots_param) -#else -#define PRINTF_FORMAT(format_param, dots_param) \ - __attribute__((format(printf, format_param, dots_param))) -#endif - -// Compiler feature-detection. -// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension -#if defined(__has_feature) -#define HAS_FEATURE(FEATURE) __has_feature(FEATURE) -#else -#define HAS_FEATURE(FEATURE) 0 -#endif - -#endif // MINI_CHROMIUM_BASE_COMPILER_SPECIFIC_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/files/file_path.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/files/file_path.h deleted file mode 100644 index 0ac91bf873..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/files/file_path.h +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// FilePath is a container for pathnames stored in a platform's native string -// type, providing containers for manipulation in according with the -// platform's conventions for pathnames. It supports the following path -// types: -// -// POSIX Windows -// --------------- ---------------------------------- -// Fundamental type char[] wchar_t[] -// Encoding unspecified* UTF-16 -// Separator / \, tolerant of / -// Drive letters no case-insensitive A-Z followed by : -// Alternate root // (surprise!) \\, for UNC paths -// -// * The encoding need not be specified on POSIX systems, although some -// POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. -// Chrome OS also uses UTF-8. -// Linux does not specify an encoding, but in practice, the locale's -// character set may be used. -// -// For more arcane bits of path trivia, see below. -// -// FilePath objects are intended to be used anywhere paths are. An -// application may pass FilePath objects around internally, masking the -// underlying differences between systems, only differing in implementation -// where interfacing directly with the system. For example, a single -// OpenFile(const FilePath &) function may be made available, allowing all -// callers to operate without regard to the underlying implementation. On -// POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might -// wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This -// allows each platform to pass pathnames around without requiring conversions -// between encodings, which has an impact on performance, but more imporantly, -// has an impact on correctness on platforms that do not have well-defined -// encodings for pathnames. -// -// Several methods are available to perform common operations on a FilePath -// object, such as determining the parent directory (DirName), isolating the -// final path component (BaseName), and appending a relative pathname string -// to an existing FilePath object (Append). These methods are highly -// recommended over attempting to split and concatenate strings directly. -// These methods are based purely on string manipulation and knowledge of -// platform-specific pathname conventions, and do not consult the filesystem -// at all, making them safe to use without fear of blocking on I/O operations. -// These methods do not function as mutators but instead return distinct -// instances of FilePath objects, and are therefore safe to use on const -// objects. The objects themselves are safe to share between threads. -// -// To aid in initialization of FilePath objects from string literals, a -// FILE_PATH_LITERAL macro is provided, which accounts for the difference -// between char[]-based pathnames on POSIX systems and wchar_t[]-based -// pathnames on Windows. -// -// Paths can't contain NULs as a precaution agaist premature truncation. -// -// Because a FilePath object should not be instantiated at the global scope, -// instead, use a FilePath::CharType[] and initialize it with -// FILE_PATH_LITERAL. At runtime, a FilePath object can be created from the -// character array. Example: -// -// | const FilePath::CharType kLogFileName[] = FILE_PATH_LITERAL("log.txt"); -// | -// | void Function() { -// | FilePath log_file_path(kLogFileName); -// | [...] -// | } -// -// WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even -// when the UI language is RTL. This means you always need to pass filepaths -// through base::i18n::WrapPathWithLTRFormatting() before displaying it in the -// RTL UI. -// -// This is a very common source of bugs, please try to keep this in mind. -// -// ARCANE BITS OF PATH TRIVIA -// -// - A double leading slash is actually part of the POSIX standard. Systems -// are allowed to treat // as an alternate root, as Windows does for UNC -// (network share) paths. Most POSIX systems don't do anything special -// with two leading slashes, but FilePath handles this case properly -// in case it ever comes across such a system. FilePath needs this support -// for Windows UNC paths, anyway. -// References: -// The Open Group Base Specifications Issue 7, sections 3.266 ("Pathname") -// and 4.12 ("Pathname Resolution"), available at: -// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_266 -// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_12 -// -// - Windows treats c:\\ the same way it treats \\. This was intended to -// allow older applications that require drive letters to support UNC paths -// like \\server\share\path, by permitting c:\\server\share\path as an -// equivalent. Since the OS treats these paths specially, FilePath needs -// to do the same. Since Windows can use either / or \ as the separator, -// FilePath treats c://, c:\\, //, and \\ all equivalently. -// Reference: -// The Old New Thing, "Why is a drive letter permitted in front of UNC -// paths (sometimes)?", available at: -// http://blogs.msdn.com/oldnewthing/archive/2005/11/22/495740.aspx - -#ifndef MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ -#define MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ - -#include <stddef.h> - -#include <iosfwd> -#include <string> - -#include "base/compiler_specific.h" -#include "build/build_config.h" - -// Windows-style drive letter support and pathname separator characters can be -// enabled and disabled independently, to aid testing. These #defines are -// here so that the same setting can be used in both the implementation and -// in the unit test. -#if defined(OS_WIN) -#define FILE_PATH_USES_DRIVE_LETTERS -#define FILE_PATH_USES_WIN_SEPARATORS -#endif // OS_WIN - -namespace base { - -// An abstraction to isolate users from the differences between native -// pathnames on different platforms. -class FilePath { - public: -#if defined(OS_POSIX) - // On most platforms, native pathnames are char arrays, and the encoding - // may or may not be specified. On Mac OS X, native pathnames are encoded - // in UTF-8. - typedef std::string StringType; -#elif defined(OS_WIN) - // On Windows, for Unicode-aware applications, native pathnames are wchar_t - // arrays encoded in UTF-16. - typedef std::wstring StringType; -#endif // OS_WIN - - typedef StringType::value_type CharType; - - // Null-terminated array of separators used to separate components in - // hierarchical paths. Each character in this array is a valid separator, - // but kSeparators[0] is treated as the canonical separator and will be used - // when composing pathnames. - static const CharType kSeparators[]; - - // A special path component meaning "this directory." - static const CharType kCurrentDirectory[]; - - // A special path component meaning "the parent directory." - static const CharType kParentDirectory[]; - - // The character used to identify a file extension. - static const CharType kExtensionSeparator; - - FilePath(); - FilePath(const FilePath& that); - explicit FilePath(const StringType& path); - ~FilePath(); - FilePath& operator=(const FilePath& that); - - bool operator==(const FilePath& that) const; - - bool operator!=(const FilePath& that) const; - - // Required for some STL containers and operations - bool operator<(const FilePath& that) const { - return path_ < that.path_; - } - - const StringType& value() const { return path_; } - - bool empty() const { return path_.empty(); } - - void clear() { path_.clear(); } - - // Returns true if |character| is in kSeparators. - static bool IsSeparator(CharType character); - - // Returns a FilePath corresponding to the directory containing the path - // named by this object, stripping away the file component. If this object - // only contains one component, returns a FilePath identifying - // kCurrentDirectory. If this object already refers to the root directory, - // returns a FilePath identifying the root directory. - FilePath DirName() const WARN_UNUSED_RESULT; - - // Returns a FilePath corresponding to the last path component of this - // object, either a file or a directory. If this object already refers to - // the root directory, returns a FilePath identifying the root directory; - // this is the only situation in which BaseName will return an absolute path. - FilePath BaseName() const WARN_UNUSED_RESULT; - - // Returns the path's file extension. This does not have a special case for - // common double extensions, so FinalExtension() of "foo.tar.gz" is simply - // ".gz". If there is no extension, "" will be returned. - StringType FinalExtension() const WARN_UNUSED_RESULT; - - // Returns a FilePath with FinalExtension() removed. - FilePath RemoveFinalExtension() const WARN_UNUSED_RESULT; - - // Returns a FilePath by appending a separator and the supplied path - // component to this object's path. Append takes care to avoid adding - // excessive separators if this object's path already ends with a separator. - // If this object's path is kCurrentDirectory, a new FilePath corresponding - // only to |component| is returned. |component| must be a relative path; - // it is an error to pass an absolute path. - FilePath Append(const StringType& component) const WARN_UNUSED_RESULT; - FilePath Append(const FilePath& component) const WARN_UNUSED_RESULT; - - // Returns true if this FilePath contains an absolute path. On Windows, an - // absolute path begins with either a drive letter specification followed by - // a separator character, or with two separator characters. On POSIX - // platforms, an absolute path begins with a separator character. - bool IsAbsolute() const; - - private: - // Remove trailing separators from this object. If the path is absolute, it - // will never be stripped any more than to refer to the absolute root - // directory, so "////" will become "/", not "". A leading pair of - // separators is never stripped, to support alternate roots. This is used to - // support UNC paths on Windows. - void StripTrailingSeparatorsInternal(); - - StringType path_; -}; - -} // namespace base - -// This is required by googletest to print a readable output on test failures. -extern void PrintTo(const base::FilePath& path, std::ostream* out); - -// Macros for string literal initialization of FilePath::CharType[], and for -// using a FilePath::CharType[] in a printf-style format string. -#if defined(OS_POSIX) -#define FILE_PATH_LITERAL(x) x -#define PRFilePath "s" -#define PRFilePathLiteral "%s" -#elif defined(OS_WIN) -#define FILE_PATH_LITERAL(x) L ## x -#define PRFilePath "ls" -#define PRFilePathLiteral L"%ls" -#endif // OS_WIN - -#endif // MINI_CHROMIUM_BASE_FILES_FILE_PATH_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/macros.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/macros.h deleted file mode 100644 index 5d96783daa..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/macros.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_MACROS_H_ -#define MINI_CHROMIUM_BASE_MACROS_H_ - -#include <string.h> -#include <sys/types.h> - -#include "base/compiler_specific.h" - -#if __cplusplus >= 201103L - -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&) = delete; \ - void operator=(const TypeName&) = delete - -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName() = delete; \ - DISALLOW_COPY_AND_ASSIGN(TypeName) - -#else - -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) - -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) - -#endif - -template<typename T, size_t N> -char (&ArraySizeHelper(T (&array)[N]))[N]; - -template <typename T, size_t N> -char (&ArraySizeHelper(const T (&array)[N]))[N]; - -#define arraysize(array) (sizeof(ArraySizeHelper(array))) - -template <typename Dest, typename Source> -inline Dest bit_cast(const Source& source) { - static_assert(sizeof(Dest) == sizeof(Source), "sizes must be equal"); - - Dest dest; - memcpy(&dest, &source, sizeof(dest)); - return dest; -} - -template<typename T> -inline void ignore_result(const T&) { -} - -#endif // MINI_CHROMIUM_BASE_MACROS_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/scoped_generic.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/scoped_generic.h deleted file mode 100644 index 0427e92c5b..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/scoped_generic.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ -#define MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ - -#include <stdlib.h> - -#include <algorithm> - -#include "base/compiler_specific.h" -#include "base/macros.h" - -namespace base { - -template<typename T, typename Traits> -class ScopedGeneric { - private: - struct Data : public Traits { - explicit Data(const T& in) : generic(in) {} - Data(const T& in, const Traits& other) : Traits(other), generic(in) {} - T generic; - }; - - public: - typedef T element_type; - typedef Traits traits_type; - - ScopedGeneric() : data_(traits_type::InvalidValue()) {} - - explicit ScopedGeneric(const element_type& value) : data_(value) {} - - ScopedGeneric(const element_type& value, const traits_type& traits) - : data_(value, traits) { - } - - ScopedGeneric(ScopedGeneric<T, Traits>&& rvalue) - : data_(rvalue.release(), rvalue.get_traits()) { - } - - ~ScopedGeneric() { - FreeIfNecessary(); - } - - ScopedGeneric& operator=(ScopedGeneric<T, Traits>&& rvalue) { - reset(rvalue.release()); - return *this; - } - - void reset(const element_type& value = traits_type::InvalidValue()) { - if (data_.generic != traits_type::InvalidValue() && data_.generic == value) - abort(); - FreeIfNecessary(); - data_.generic = value; - } - - void swap(ScopedGeneric& other) { - using std::swap; - swap(static_cast<Traits&>(data_), static_cast<Traits&>(other.data_)); - swap(data_.generic, other.data_.generic); - } - - element_type release() WARN_UNUSED_RESULT { - element_type old_generic = data_.generic; - data_.generic = traits_type::InvalidValue(); - return old_generic; - } - - const element_type& get() const { return data_.generic; } - - bool is_valid() const { return data_.generic != traits_type::InvalidValue(); } - - bool operator==(const element_type& value) const { - return data_.generic == value; - } - bool operator!=(const element_type& value) const { - return data_.generic != value; - } - - Traits& get_traits() { return data_; } - const Traits& get_traits() const { return data_; } - - private: - void FreeIfNecessary() { - if (data_.generic != traits_type::InvalidValue()) { - data_.Free(data_.generic); - data_.generic = traits_type::InvalidValue(); - } - } - - template <typename T2, typename Traits2> bool operator==( - const ScopedGeneric<T2, Traits2>& p2) const; - template <typename T2, typename Traits2> bool operator!=( - const ScopedGeneric<T2, Traits2>& p2) const; - - Data data_; - - DISALLOW_COPY_AND_ASSIGN(ScopedGeneric); -}; - -template<class T, class Traits> -void swap(const ScopedGeneric<T, Traits>& a, - const ScopedGeneric<T, Traits>& b) { - a.swap(b); -} - -template<class T, class Traits> -bool operator==(const T& value, const ScopedGeneric<T, Traits>& scoped) { - return value == scoped.get(); -} - -template<class T, class Traits> -bool operator!=(const T& value, const ScopedGeneric<T, Traits>& scoped) { - return value != scoped.get(); -} - -} // namespace base - -#endif // MINI_CHROMIUM_BASE_SCOPED_GENERIC_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string16.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string16.h deleted file mode 100644 index 2eccd2afe2..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string16.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ - -#include <stdint.h> -#include <stdio.h> - -#include <string> - -#include "build/build_config.h" - -namespace base { - -#if defined(WCHAR_T_IS_UTF16) -typedef wchar_t char16; -#elif defined(WCHAR_T_IS_UTF32) -typedef uint16_t char16; -#endif // WCHAR_T_IS_UTF32 - -int c16memcmp(const char16* s1, const char16* s2, size_t n); -size_t c16len(const char16* s); -const char16* c16memchr(const char16* s, char16 c, size_t n); -char16* c16memmove(char16* s1, const char16* s2, size_t n); -char16* c16memcpy(char16* s1, const char16* s2, size_t n); -char16* c16memset(char16* s, char16 c, size_t n); - -#if defined(WCHAR_T_IS_UTF16) - -typedef std::wstring string16; -typedef std::char_traits<wchar_t> string16_char_traits; - -#elif defined(WCHAR_T_IS_UTF32) - -struct string16_char_traits { - typedef char16 char_type; - typedef int int_type; - - static_assert(sizeof(int_type) > sizeof(char_type), "unexpected type width"); - - typedef std::streamoff off_type; - typedef mbstate_t state_type; - typedef std::fpos<state_type> pos_type; - - static void assign(char_type& c1, const char_type& c2) { - c1 = c2; - } - - static bool eq(const char_type& c1, const char_type& c2) { - return c1 == c2; - } - static bool lt(const char_type& c1, const char_type& c2) { - return c1 < c2; - } - - static int compare(const char_type* s1, const char_type* s2, size_t n) { - return c16memcmp(s1, s2, n); - } - - static size_t length(const char_type* s) { - return c16len(s); - } - - static const char_type* find(const char_type* s, size_t n, - const char_type& a) { - return c16memchr(s, a, n); - } - - static char_type* move(char_type* s1, const char_type* s2, size_t n) { - return c16memmove(s1, s2, n); - } - - static char_type* copy(char_type* s1, const char_type* s2, size_t n) { - return c16memcpy(s1, s2, n); - } - - static char_type* assign(char_type* s, size_t n, char_type a) { - return c16memset(s, a, n); - } - - static int_type not_eof(const int_type& c) { - return eq_int_type(c, eof()) ? 0 : c; - } - - static char_type to_char_type(const int_type& c) { - return char_type(c); - } - - static int_type to_int_type(const char_type& c) { - return int_type(c); - } - - static bool eq_int_type(const int_type& c1, const int_type& c2) { - return c1 == c2; - } - - static int_type eof() { - return static_cast<int_type>(EOF); - } -}; - -typedef std::basic_string<char16, base::string16_char_traits> string16; - -extern std::ostream& operator<<(std::ostream& out, const string16& str); - -#endif // WCHAR_T_IS_UTF32 - -} // namespace base - -#if defined(WCHAR_T_IS_UTF32) -extern template class std::basic_string<base::char16, - base::string16_char_traits>; -#endif // WCHAR_T_IS_UTF32 - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING16_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h deleted file mode 100644 index b0e45eea6c..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/base/strings/string_piece.h +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ -#define MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ - -#include <algorithm> -#include <iterator> -#include <ostream> -#include <string> - -#include "base/strings/string16.h" - -namespace base { - -template<typename StringType> -class BasicStringPiece { - public: - typedef typename StringType::traits_type traits_type; - typedef typename StringType::value_type value_type; - typedef typename StringType::size_type size_type; - typedef typename StringType::difference_type difference_type; - typedef const value_type& reference; - typedef const value_type& const_reference; - typedef const value_type* pointer; - typedef const value_type* const_pointer; - typedef const value_type* const_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - - static const size_type npos; - - BasicStringPiece() - : pointer_(NULL), - length_(0) { - } - - BasicStringPiece(const value_type* string) - : pointer_(string), - length_((string == NULL) ? 0 : traits_type::length(string)) { - } - - BasicStringPiece(const StringType& string) - : pointer_(string.data()), - length_(string.size()) { - } - - BasicStringPiece(const value_type* offset, size_type length) - : pointer_(offset), - length_(length) { - } - - BasicStringPiece(const typename StringType::const_iterator& begin, - const typename StringType::const_iterator& end) - : pointer_((end > begin) ? &(*begin) : NULL), - length_((end > begin) ? static_cast<size_type>(end - begin) : 0) { - } - - value_type operator[](size_type index) const { return pointer_[index]; } - - const value_type* data() const { return pointer_; } - - const_iterator begin() const { return pointer_; } - const_iterator end() const { return pointer_ + length_; } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(pointer_ + length_); - } - const_reverse_iterator rend() const { - return const_reverse_iterator(pointer_); - } - - bool empty() const { return length_ == 0; } - size_type size() const { return length_; } - size_type length() const { return length_; } - size_type max_size() const { return length_; } - size_type capacity() const { return length_; } - - static int wordmemcmp(const value_type* p, - const value_type* p2, - size_type N) { - return StringType::traits_type::compare(p, p2, N); - } - - void clear() { - pointer_ = NULL; - length_ = 0; - } - - int compare(const BasicStringPiece<StringType>& that) const { - int result = traits_type::compare(pointer_, - that.pointer_, - std::min(length_, that.length_)); - if (result == 0) { - if (length_ < that.length_) { - result = -1; - } else if (length_ > that.length_) { - result = 1; - } - } - return result; - } - - BasicStringPiece<StringType> substr(size_type position = 0, - size_type count = npos) const { - position = std::min(position, size()); - count = std::min(count, size() - position); - return BasicStringPiece<StringType>(data() + position, count); - } - - size_type copy(value_type* dest, - size_type count, - size_type position = 0) const { - size_type ret = std::min(size() - position, count); - traits_type::copy(dest, data() + position, ret); - return ret; - } - - size_type find(const BasicStringPiece<StringType>& str, size_type pos) const { - if (pos >= size()) { - return npos; - } - const_iterator result = std::search(begin() + pos, - end(), - str.begin(), - str.end()); - size_type xpos = static_cast<size_type>(result - begin()); - return xpos + str.size() <= size() ? xpos : npos; - } - - size_type find(value_type c, size_type pos) const { - if (pos >= size()) { - return npos; - } - const_iterator result = std::find(begin() + pos, end(), c); - return result != end() ? static_cast<size_type>(result - begin()) : npos; - } - - void set(const value_type* string) { - pointer_ = string; - length_ = string ? traits_type::length(string) : 0; - } - - StringType as_string() const { - return empty() ? StringType() : StringType(data(), size()); - } - - private: - const value_type* pointer_; - size_type length_; -}; - -template <typename StringType> -const typename BasicStringPiece<StringType>::size_type - BasicStringPiece<StringType>::npos = StringType::npos; - -template<typename StringType> -std::ostream& operator<<(std::ostream& ostream, - const BasicStringPiece<StringType>& string_piece) { - ostream.write(string_piece.data(), string_piece.size()); - return ostream; -} - -typedef BasicStringPiece<std::string> StringPiece; -typedef BasicStringPiece<string16> StringPiece16; - -inline bool operator==(const StringPiece& x, const StringPiece& y) { - if (x.size() != y.size()) - return false; - - return StringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0; -} - -inline bool operator==(const StringPiece16& x, const StringPiece16& y) { - if (x.size() != y.size()) - return false; - - return StringPiece16::wordmemcmp(x.data(), y.data(), x.size()) == 0; -} - -// This hash function is copied from base/strings/string16.h. We don't use the -// ones already defined for string and string16 directly because it would -// require the string constructors to be called, which we don't want. -#define HASH_STRING_PIECE(StringPieceType, string_piece) \ - std::size_t result = 0; \ - for (StringPieceType::const_iterator i = string_piece.begin(); \ - i != string_piece.end(); ++i) \ - result = (result * 131) + *i; \ - return result; - -struct StringPieceHash { - std::size_t operator()(const StringPiece& sp) const { - HASH_STRING_PIECE(StringPiece, sp); - } -}; -struct StringPiece16Hash { - std::size_t operator()(const StringPiece16& sp16) const { - HASH_STRING_PIECE(StringPiece16, sp16); - } -}; - -} // namespace base; - -#endif // MINI_CHROMIUM_BASE_STRINGS_STRING_PIECE_H_ diff --git a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/build/build_config.h b/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/build/build_config.h deleted file mode 100644 index eca51a5cc7..0000000000 --- a/Tools/Crashpad/include/vs2013/third_party/mini_chromium/mini_chromium/build/build_config.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ -#define MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ - -#if defined(__APPLE__) -#define OS_MACOSX 1 -#elif defined(__ANDROID__) -#define OS_ANDROID 1 -#elif defined(__linux__) -#define OS_LINUX 1 -#elif defined(_WIN32) -#define OS_WIN 1 -#else -#error Please add support for your platform in build/build_config.h -#endif - -#if defined(OS_MACOSX) -#include <TargetConditionals.h> -#if defined(TARGET_OS_IOS) -#if TARGET_OS_IOS -#define OS_IOS 1 -#endif -#elif defined(TARGET_OS_IPHONE) -#if TARGET_OS_IPHONE -#define OS_IOS 1 -#endif -#endif -#endif - -#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_ANDROID) -#define OS_POSIX 1 -#endif - -// Compiler detection. -#if defined(__GNUC__) -#define COMPILER_GCC 1 -#elif defined(_MSC_VER) -#define COMPILER_MSVC 1 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#if defined(_M_X64) || defined(__x86_64__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86_64 1 -#define ARCH_CPU_64_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(_M_IX86) || defined(__i386__) -#define ARCH_CPU_X86_FAMILY 1 -#define ARCH_CPU_X86 1 -#define ARCH_CPU_32_BITS 1 -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__ARMEL__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARMEL 1 -#define ARCH_CPU_32_BITS 1 -#elif defined(__aarch64__) -#define ARCH_CPU_ARM_FAMILY 1 -#define ARCH_CPU_ARM64 1 -#define ARCH_CPU_64_BITS 1 -#else -#error Please add support for your architecture in build/build_config.h -#endif - -#if !defined(ARCH_CPU_LITTLE_ENDIAN) && !defined(ARCH_CPU_BIG_ENDIAN) -#if defined(__LITTLE_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#define ARCH_CPU_LITTLE_ENDIAN 1 -#elif defined(__BIG_ENDIAN__) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) -#define ARCH_CPU_BIG_ENDIAN 1 -#else -#error Please add support for your architecture in build/build_config.h -#endif -#endif - -#if defined(OS_POSIX) && defined(COMPILER_GCC) && \ - defined(__WCHAR_MAX__) && \ - (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) -#define WCHAR_T_IS_UTF32 -#elif defined(OS_WIN) -#define WCHAR_T_IS_UTF16 -#else -#error Please add support for your compiler in build/build_config.h -#endif - -#endif // MINI_CHROMIUM_BUILD_BUILD_CONFIG_H_ diff --git a/Tools/Crashpad/include/vs2013/util/file/file_io.h b/Tools/Crashpad/include/vs2013/util/file/file_io.h deleted file mode 100644 index ff20488da1..0000000000 --- a/Tools/Crashpad/include/vs2013/util/file/file_io.h +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_FILE_FILE_IO_H_ -#define CRASHPAD_UTIL_FILE_FILE_IO_H_ - -#include <sys/types.h> - -#include "build/build_config.h" - -#if defined(OS_POSIX) -#include "base/files/scoped_file.h" -#elif defined(OS_WIN) -#include <windows.h> -#include "util/win/scoped_handle.h" -#endif - -//! \file - -#if defined(OS_POSIX) || DOXYGEN - -//! \brief A `PLOG()` macro usable for standard input/output error conditions. -//! -//! The `PLOG()` macro uses `errno` on POSIX and is appropriate to report -//! errors from standard input/output functions. On Windows, `PLOG()` uses -//! `GetLastError()`, and cannot be used to report errors from standard -//! input/output functions. This macro uses `PLOG()` when appropriate for -//! standard I/O functions, and `LOG()` otherwise. -#define STDIO_PLOG(x) PLOG(x) - -#else - -#define STDIO_PLOG(x) LOG(x) -#define fseeko(file, offset, whence) _fseeki64(file, offset, whence) -#define ftello(file) _ftelli64(file) - -#endif - -namespace base { -class FilePath; -} // namespace base - -namespace crashpad { - -#if defined(OS_POSIX) || DOXYGEN - -//! \brief Platform-specific alias for a low-level file handle. -using FileHandle = int; - -//! \brief Platform-specific alias for a position in an open file. -using FileOffset = off_t; - -//! \brief Scoped wrapper of a FileHandle. -using ScopedFileHandle = base::ScopedFD; - -//! \brief A value that can never be a valid FileHandle. -const FileHandle kInvalidFileHandle = -1; - -using FileOperationResult = ssize_t; - -#elif defined(OS_WIN) - -using FileHandle = HANDLE; -using FileOffset = LONGLONG; -using ScopedFileHandle = ScopedFileHANDLE; -using FileOperationResult = LONG_PTR; - -const FileHandle kInvalidFileHandle = INVALID_HANDLE_VALUE; - -#endif - -//! \brief Determines the mode that LoggingOpenFileForWrite() uses. -enum class FileWriteMode { - //! \brief Opens the file if it exists, or fails if it does not. - kReuseOrFail, - - //! \brief Opens the file if it exists, or creates a new file. - kReuseOrCreate, - - //! \brief Creates a new file. If the file already exists, it will be - //! overwritten. - kTruncateOrCreate, - - //! \brief Creates a new file. If the file already exists, the open will fail. - kCreateOrFail, -}; - -//! \brief Determines the permissions bits for files created on POSIX systems. -enum class FilePermissions : bool { - //! \brief Equivalent to `0600`. - kOwnerOnly, - - //! \brief Equivalent to `0644`. - kWorldReadable, -}; - -//! \brief Determines the locking mode that LoggingLockFile() uses. -enum class FileLocking : bool { - //! \brief Equivalent to `flock()` with `LOCK_SH`. - kShared, - - //! \brief Equivalent to `flock()` with `LOCK_EX`. - kExclusive, -}; - -//! \brief Reads from a file, retrying when interrupted on POSIX or following a -//! short read. -//! -//! This function reads into \a buffer, stopping only when \a size bytes have -//! been read or when end-of-file has been reached. On Windows, reading from -//! sockets is not currently supported. -//! -//! \return The number of bytes read and placed into \a buffer, or `-1` on -//! error, with `errno` or `GetLastError()` set appropriately. On error, a -//! portion of \a file may have been read into \a buffer. -//! -//! \sa WriteFile -//! \sa LoggingReadFile -//! \sa CheckedReadFile -//! \sa CheckedReadFileAtEOF -FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); - -//! \brief Writes to a file, retrying when interrupted or following a short -//! write on POSIX. -//! -//! This function writes to \a file, stopping only when \a size bytes have been -//! written. -//! -//! \return The number of bytes written from \a buffer, or `-1` on error, with -//! `errno` or `GetLastError()` set appropriately. On error, a portion of -//! \a buffer may have been written to \a file. -//! -//! \sa ReadFile -//! \sa LoggingWriteFile -//! \sa CheckedWriteFile -FileOperationResult WriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. -//! -//! \return `true` on success. If \a size is out of the range of possible -//! ReadFile() return values, if the underlying ReadFile() fails, or if -//! other than \a size bytes were read, this function logs a message and -//! returns `false`. -//! -//! \sa LoggingWriteFile -//! \sa ReadFile -//! \sa CheckedReadFile -//! \sa CheckedReadFileAtEOF -bool LoggingReadFile(FileHandle file, void* buffer, size_t size); - -//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. -//! -//! \return `true` on success. If \a size is out of the range of possible -//! WriteFile() return values, if the underlying WriteFile() fails, or if -//! other than \a size bytes were written, this function logs a message and -//! returns `false`. -//! -//! \sa LoggingReadFile -//! \sa WriteFile -//! \sa CheckedWriteFile -bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. -//! -//! If \a size is out of the range of possible ReadFile() return values, if the -//! underlying ReadFile() fails, or if other than \a size bytes were read, this -//! function causes execution to terminate without returning. -//! -//! \sa CheckedWriteFile -//! \sa ReadFile -//! \sa LoggingReadFile -//! \sa CheckedReadFileAtEOF -void CheckedReadFile(FileHandle file, void* buffer, size_t size); - -//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. -//! -//! If \a size is out of the range of possible WriteFile() return values, if the -//! underlying WriteFile() fails, or if other than \a size bytes were written, -//! this function causes execution to terminate without returning. -//! -//! \sa CheckedReadFile -//! \sa WriteFile -//! \sa LoggingWriteFile -void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); - -//! \brief Wraps ReadFile(), ensuring that it indicates end-of-file. -//! -//! Attempts to read a single byte from \a file, expecting no data to be read. -//! If the underlying ReadFile() fails, or if a byte actually is read, this -//! function causes execution to terminate without returning. -//! -//! \sa CheckedReadFile -//! \sa ReadFile -void CheckedReadFileAtEOF(FileHandle file); - -//! \brief Wraps `open()` or `CreateFile()`, opening an existing file for -//! reading. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForWrite -//! \sa OpenFileForReadAndWrite -//! \sa LoggingOpenFileForRead -FileHandle OpenFileForRead(const base::FilePath& path); - -//! \brief Wraps `open()` or `CreateFile()`, creating a file for output. -//! -//! \a mode determines the style (truncate, reuse, etc.) that is used to open -//! the file. On POSIX, \a permissions determines the value that is passed as -//! `mode` to `open()`. On Windows, the file is always opened in binary mode -//! (that is, no CRLF translation). On Windows, the file is opened for sharing, -//! see LoggingLockFile() and LoggingUnlockFile() to control concurrent access. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForRead -//! \sa OpenFileForReadAndWrite -//! \sa LoggingOpenFileForWrite -FileHandle OpenFileForWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps `open()` or `CreateFile()`, creating a file for both input and -//! output. -//! -//! \a mode determines the style (truncate, reuse, etc.) that is used to open -//! the file. On POSIX, \a permissions determines the value that is passed as -//! `mode` to `open()`. On Windows, the file is always opened in binary mode -//! (that is, no CRLF translation). On Windows, the file is opened for sharing, -//! see LoggingLockFile() and LoggingUnlockFile() to control concurrent access. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa OpenFileForRead -//! \sa OpenFileForWrite -//! \sa LoggingOpenFileForReadAndWrite -FileHandle OpenFileForReadAndWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps OpenFileForRead(), logging an error if the operation fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForWrite -//! \sa LoggingOpenFileForReadAndWrite -FileHandle LoggingOpenFileForRead(const base::FilePath& path); - -//! \brief Wraps OpenFileForWrite(), logging an error if the operation fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForRead -//! \sa LoggingOpenFileForReadAndWrite -FileHandle LoggingOpenFileForWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Wraps OpenFileForReadAndWrite(), logging an error if the operation -//! fails. -//! -//! \return The newly opened FileHandle, or an invalid FileHandle on failure. -//! -//! \sa ScopedFileHandle -//! \sa LoggingOpenFileForRead -//! \sa LoggingOpenFileForWrite -FileHandle LoggingOpenFileForReadAndWrite(const base::FilePath& path, - FileWriteMode mode, - FilePermissions permissions); - -//! \brief Locks the given \a file using `flock()` on POSIX or `LockFileEx()` on -//! Windows. -//! -//! It is an error to attempt to lock a file in a different mode when it is -//! already locked. This call will block until the lock is acquired. The -//! entire file is locked. -//! -//! If \a locking is FileLocking::kShared, \a file must have been opened for -//! reading, and if it's FileLocking::kExclusive, \a file must have been opened -//! for writing. -//! -//! \param[in] file The open file handle to be locked. -//! \param[in] locking Controls whether the lock is a shared reader lock, or an -//! exclusive writer lock. -//! -//! \return `true` on success, or `false` and a message will be logged. -bool LoggingLockFile(FileHandle file, FileLocking locking); - -//! \brief Unlocks a file previously locked with LoggingLockFile(). -//! -//! It is an error to attempt to unlock a file that was not previously locked. -//! A previously-locked file should be unlocked before closing the file handle, -//! otherwise on some OSs the lock may not be released immediately. -//! -//! \param[in] file The open locked file handle to be unlocked. -//! -//! \return `true` on success, or `false` and a message will be logged. -bool LoggingUnlockFile(FileHandle file); - -//! \brief Wraps `lseek()` or `SetFilePointerEx()`. Logs an error if the -//! operation fails. -//! -//! Repositions the offset of the open \a file to the specified \a offset, -//! relative to \a whence. \a whence must be one of `SEEK_SET`, `SEEK_CUR`, or -//! `SEEK_END`, and is interpreted in the usual way. -//! -//! \return The resulting offset in bytes from the beginning of the file, or -//! `-1` on failure. -FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence); - -//! \brief Truncates the given \a file to zero bytes in length. -//! -//! \return `true` on success, or `false`, and a message will be logged. -bool LoggingTruncateFile(FileHandle file); - -//! \brief Wraps `close()` or `CloseHandle()`, logging an error if the operation -//! fails. -//! -//! \return On success, `true` is returned. On failure, an error is logged and -//! `false` is returned. -bool LoggingCloseFile(FileHandle file); - -//! \brief Wraps `close()` or `CloseHandle()`, ensuring that it succeeds. -//! -//! If the underlying function fails, this function causes execution to -//! terminate without returning. -void CheckedCloseFile(FileHandle file); - -//! \brief Determines the size of a file. -//! -//! \param[in] file The handle to the file for which the size should be -//! retrived. -//! -//! \return The size of the file. If an error occurs when attempting to -//! determine its size, returns `-1` with an error logged. -FileOffset LoggingFileSizeByHandle(FileHandle file); - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_FILE_FILE_IO_H_ diff --git a/Tools/Crashpad/include/vs2013/util/misc/initialization_state.h b/Tools/Crashpad/include/vs2013/util/misc/initialization_state.h deleted file mode 100644 index 85f9b2894d..0000000000 --- a/Tools/Crashpad/include/vs2013/util/misc/initialization_state.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ -#define CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ - -#include <stdint.h> - -#include "base/macros.h" - -namespace crashpad { - -//! \brief Tracks whether data are initialized. -//! -//! Objects of this type track whether the data they’re guarding are -//! initialized. The three possible states are uninitialized (the initial -//! state), initializing, and valid. As the guarded data are initialized, an -//! InitializationState object will normally transition through these three -//! states. A fourth state corresponds to the destruction of objects of this -//! type, making it less likely that a use-after-free of an InitializationState -//! object will appear in the valid state. -//! -//! If the only purpose for tracking the initialization state of guarded data is -//! to DCHECK when the object is in an unexpected state, use -//! InitializationStateDcheck instead. -class InitializationState { - public: - //! \brief The object’s state. - enum State : uint8_t { - //! \brief The object has not yet been initialized. - kStateUninitialized = 0, - - //! \brief The object is being initialized. - //! - //! This state protects against attempted reinitializaton of - //! partially-initialized objects whose initial initialization attempt - //! failed. This state is to be used while objects are initializing, but are - //! not yet fully initialized. - kStateInvalid, - - //! \brief The object has been initialized. - kStateValid, - - //! \brief The object has been destroyed. - kStateDestroyed, - }; - - InitializationState() : state_(kStateUninitialized) {} - ~InitializationState() { state_ = kStateDestroyed; } - - //! \brief Returns `true` if the object’s state is #kStateUninitialized and it - //! is safe to begin initializing it. - bool is_uninitialized() const { return state_ == kStateUninitialized; } - - //! \brief Sets the object’s state to #kStateInvalid, marking initialization - //! as being in process. - void set_invalid() { state_ = kStateInvalid; } - - //! \brief Sets the object’s state to #kStateValid, marking it initialized. - void set_valid() { state_ = kStateValid; } - - //! \brief Returns `true` if the the object’s state is #kStateValid and it has - //! been fully initialized and may be used. - bool is_valid() const { return state_ == kStateValid; } - - protected: - //! \brief Returns the object’s state. - //! - //! Consumers of this class should use an is_state_*() method instead. - State state() const { return state_; } - - //! \brief Sets the object’s state. - //! - //! Consumers of this class should use a set_state_*() method instead. - void set_state(State state) { state_ = state; } - - private: - // state_ is volatile to ensure that it’ll be set by the destructor when it - // runs. Otherwise, optimizations might prevent it from ever being set to - // kStateDestroyed, limiting this class’ ability to catch use-after-free - // errors. - volatile State state_; - - DISALLOW_COPY_AND_ASSIGN(InitializationState); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_INITIALIZATION_INITIALIZATION_STATE_H_ diff --git a/Tools/Crashpad/include/vs2013/util/misc/metrics.h b/Tools/Crashpad/include/vs2013/util/misc/metrics.h deleted file mode 100644 index fd2e120063..0000000000 --- a/Tools/Crashpad/include/vs2013/util/misc/metrics.h +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2016 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_METRICS_H_ -#define CRASHPAD_UTIL_MISC_METRICS_H_ - -#include <inttypes.h> - -#include "base/macros.h" -#include "util/file/file_io.h" - -namespace crashpad { - -//! \brief Container class to hold shared UMA metrics integration points. -//! -//! Each static function in this class will call a `UMA_*` from -//! `base/metrics/histogram_macros.h`. When building Crashpad standalone, -//! (against mini_chromium), these macros do nothing. When built against -//! Chromium's base, they allow integration with its metrics system. -class Metrics { - public: - //! \brief Values for CrashReportPending(). These are used as metrics - //! enumeration values, so new values should always be added at the end. - enum class PendingReportReason : int32_t { - //! \brief A report was newly created and is ready for upload. - kNewlyCreated = 0, - - //! \brief The user manually requested the report be uploaded. - kUserInitiated = 1, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports when a crash upload has entered the pending state. - static void CrashReportPending(PendingReportReason reason); - - //! \brief Reports the size of a crash report file in bytes. Should be called - //! when a new report is written to disk. - static void CrashReportSize(FileHandle file); - - //! \brief Reports on a crash upload attempt, and if it succeeded. - static void CrashUploadAttempted(bool successful); - - //! \brief Values for CrashUploadSkipped(). These are used as metrics - //! enumeration values, so new values should always be added at the end. - enum class CrashSkippedReason : int32_t { - //! \brief Crash uploading is disabled. - kUploadsDisabled = 0, - - //! \brief There was another upload too recently, so this one was throttled. - kUploadThrottled = 1, - - //! \brief The report had an unexpected timestamp. - kUnexpectedTime = 2, - - //! \brief The database reported an error, likely due to a filesystem - //! problem. - kDatabaseError = 3, - - //! \brief The upload of the crash failed during communication with the - //! server. - kUploadFailed = 4, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports when a report is moved to the completed state in the - //! database, without the report being uploadad. - static void CrashUploadSkipped(CrashSkippedReason reason); - - //! \brief The result of capturing an exception. These are used as metrics - //! enumeration values, so new values should always be added at the end. - enum class CaptureResult : int32_t { - //! \brief The exception capture succeeded normally. - kSuccess = 0, - - //! \brief Unexpected exception behavior. - //! - //! This value is only used on macOS. - kUnexpectedExceptionBehavior = 1, - - //! \brief Failed due to attempt to suspend self. - //! - //! This value is only used on macOS. - kFailedDueToSuspendSelf = 2, - - //! \brief The process snapshot could not be captured. - kSnapshotFailed = 3, - - //! \brief The exception could not be initialized. - kExceptionInitializationFailed = 4, - - //! \brief The attempt to prepare a new crash report in the crash database - //! failed. - kPrepareNewCrashReportFailed = 5, - - //! \brief Writing the minidump to disk failed. - kMinidumpWriteFailed = 6, - - //! \brief There was a database error in attempt to complete the report. - kFinishedWritingCrashReportFailed = 7, - - //! \brief The number of values in this enumeration; not a valid value. - kMaxValue - }; - - //! \brief Reports on the outcome of capturing a report in the exception - //! handler. Should be called on all capture completion paths. - static void ExceptionCaptureResult(CaptureResult result); - - //! \brief The exception code for an exception was retrieved. - //! - //! These values are OS-specific, and correspond to - //! MINIDUMP_EXCEPTION::ExceptionCode. - static void ExceptionCode(uint32_t exception_code); - - //! \brief The exception handler server started capturing an exception. - static void ExceptionEncountered(); - - //! \brief The handler process crashed with the given exception code. - //! - //! This is currently only reported on Windows. - static void HandlerCrashed(uint32_t exception_code); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(Metrics); -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_METRICS_H_ diff --git a/Tools/Crashpad/include/vs2013/util/misc/uuid.h b/Tools/Crashpad/include/vs2013/util/misc/uuid.h deleted file mode 100644 index 4e5884e25a..0000000000 --- a/Tools/Crashpad/include/vs2013/util/misc/uuid.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_MISC_UUID_H_ -#define CRASHPAD_UTIL_MISC_UUID_H_ - -#include <stdint.h> - -#include <string> - -#include "base/strings/string16.h" -#include "base/strings/string_piece.h" -#include "build/build_config.h" - -#if defined(OS_WIN) -#include <rpc.h> -#endif - -namespace crashpad { - -//! \brief A universally unique identifier (%UUID). -//! -//! An alternate term for %UUID is “globally unique identifier†(GUID), used -//! primarily by Microsoft. -//! -//! A %UUID is a unique 128-bit number specified by RFC 4122. -//! -//! This is a POD structure. -struct UUID { - bool operator==(const UUID& that) const; - bool operator!=(const UUID& that) const { return !operator==(that); } - - //! \brief Initializes the %UUID to zero. - void InitializeToZero(); - - //! \brief Initializes the %UUID from a sequence of bytes. - //! - //! \a bytes is taken as a %UUID laid out in big-endian format in memory. On - //! little-endian machines, appropriate byte-swapping will be performed to - //! initialize an object’s data members. - //! - //! \param[in] bytes A buffer of exactly 16 bytes that will be assigned to the - //! %UUID. - void InitializeFromBytes(const uint8_t* bytes); - - //! \brief Initializes the %UUID from a RFC 4122 §3 formatted string. - //! - //! \param[in] string A string of the form - //! `"00112233-4455-6677-8899-aabbccddeeff"`. - //! - //! \return `true` if the string was formatted correctly and the object has - //! been initialized with the data. `false` if the string could not be - //! parsed, with the object state untouched. - bool InitializeFromString(const base::StringPiece& string); - - //! \brief Initializes the %UUID using a standard system facility to generate - //! the value. - //! - //! \return `true` if the %UUID was initialized correctly, `false` otherwise - //! with a message logged. - bool InitializeWithNew(); - -#if defined(OS_WIN) || DOXYGEN - //! \brief Initializes the %UUID from a system `UUID` or `GUID` structure. - //! - //! \param[in] system_uuid A system `UUID` or `GUID` structure. - void InitializeFromSystemUUID(const ::UUID* system_uuid); -#endif // OS_WIN - - //! \brief Formats the %UUID per RFC 4122 §3. - //! - //! \return A string of the form `"00112233-4455-6677-8899-aabbccddeeff"`. - std::string ToString() const; - -#if defined(OS_WIN) || DOXYGEN - //! \brief The same as ToString, but returned as a string16. - base::string16 ToString16() const; -#endif // OS_WIN - - // These fields are laid out according to RFC 4122 §4.1.2. - uint32_t data_1; - uint16_t data_2; - uint16_t data_3; - uint8_t data_4[2]; - uint8_t data_5[6]; -}; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_MISC_UUID_H_ diff --git a/Tools/Crashpad/include/vs2013/util/win/scoped_handle.h b/Tools/Crashpad/include/vs2013/util/win/scoped_handle.h deleted file mode 100644 index 68be4f7b9f..0000000000 --- a/Tools/Crashpad/include/vs2013/util/win/scoped_handle.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2014 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ -#define CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ - -#include <windows.h> - -#include "base/scoped_generic.h" - -namespace crashpad { - -namespace internal { - -struct ScopedFileHANDLECloseTraits { - static HANDLE InvalidValue() { - return INVALID_HANDLE_VALUE; - } - static void Free(HANDLE handle); -}; - -struct ScopedKernelHANDLECloseTraits { - static HANDLE InvalidValue() { - return nullptr; - } - static void Free(HANDLE handle); -}; - -} // namespace internal - -using ScopedFileHANDLE = - base::ScopedGeneric<HANDLE, internal::ScopedFileHANDLECloseTraits>; -using ScopedKernelHANDLE = - base::ScopedGeneric<HANDLE, internal::ScopedKernelHANDLECloseTraits>; - -} // namespace crashpad - -#endif // CRASHPAD_UTIL_WIN_SCOPED_HANDLE_H_ diff --git a/Tools/Crashpad/util/Debug/crashpad_database_util.exe b/Tools/Crashpad/util/Debug/crashpad_database_util.exe deleted file mode 100644 index a4ea4b3a3f..0000000000 --- a/Tools/Crashpad/util/Debug/crashpad_database_util.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fe28a772508e2a78a5f9c78345e301f2695803cd269e40452c925ecd8ba73b6 -size 398848 diff --git a/Tools/Crashpad/util/Release/crashpad_database_util.exe b/Tools/Crashpad/util/Release/crashpad_database_util.exe deleted file mode 100644 index a7f9491cad..0000000000 --- a/Tools/Crashpad/util/Release/crashpad_database_util.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4715113f074eaa04554cdacea8e6ef4f908a88e89374add0801ca557003ce03 -size 228864 diff --git a/Tools/GFxExport/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest b/Tools/GFxExport/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest deleted file mode 100644 index 41623b1490..0000000000 --- a/Tools/GFxExport/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<!-- Copyright (c) Microsoft Corporation. All rights reserved. --> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <noInheritable/> - <assemblyIdentity - type="win32" - name="Microsoft.VC90.CRT" - version="9.0.21022.8" - processorArchitecture="x86" - publicKeyToken="1fc8b3b9a1e18e3b" - /> - <file name="msvcr90.dll" /> <file name="msvcp90.dll" /> <file name="msvcm90.dll" /> -</assembly> diff --git a/Tools/GFxExport/Microsoft.VC90.CRT/msvcm90.dll b/Tools/GFxExport/Microsoft.VC90.CRT/msvcm90.dll deleted file mode 100644 index 6024e2c548..0000000000 --- a/Tools/GFxExport/Microsoft.VC90.CRT/msvcm90.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b371af3ce6cb5d0b411919a188d5274df74d5ee49f6dd7b1ccb5a31466121a18 -size 224768 diff --git a/Tools/GFxExport/Microsoft.VC90.CRT/msvcp90.dll b/Tools/GFxExport/Microsoft.VC90.CRT/msvcp90.dll deleted file mode 100644 index 6d54eb3514..0000000000 --- a/Tools/GFxExport/Microsoft.VC90.CRT/msvcp90.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f7ed27b532888ce72b96e52952073eab2354160d1156924489054b7fa9b0b1a -size 568832 diff --git a/Tools/GFxExport/Microsoft.VC90.CRT/msvcr90.dll b/Tools/GFxExport/Microsoft.VC90.CRT/msvcr90.dll deleted file mode 100644 index 641933965f..0000000000 --- a/Tools/GFxExport/Microsoft.VC90.CRT/msvcr90.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed0170d3de86da33e02bfa1605eec8ff6010583481b1c530843867c1939d2185 -size 655872 diff --git a/Tools/GFxExport/gfxexport.exe b/Tools/GFxExport/gfxexport.exe deleted file mode 100644 index a161e10579..0000000000 --- a/Tools/GFxExport/gfxexport.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05de81770680059ba06607754ae73251d3454db15da80e6248c53fb0031c036f -size 1738752 diff --git a/Tools/GFxExport/jpeg62.dll b/Tools/GFxExport/jpeg62.dll deleted file mode 100644 index be33a218b5..0000000000 --- a/Tools/GFxExport/jpeg62.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:583784b568bff7a95c71010c8b85cc64a8b662b8d2627e7aeffdaf783d3c33db -size 153966 diff --git a/Tools/GFxExport/libtiff3.dll b/Tools/GFxExport/libtiff3.dll deleted file mode 100644 index e0d2aaf5e3..0000000000 --- a/Tools/GFxExport/libtiff3.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c897998b1b6f60792fd43501dc06baeb67daa603a3bb3e55ea8e5acc8b4c2a88 -size 441498 diff --git a/Tools/GFxExport/zlib1.dll b/Tools/GFxExport/zlib1.dll deleted file mode 100644 index e8afc7a852..0000000000 --- a/Tools/GFxExport/zlib1.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87ba7862b61b0ee592fb967d38dfd7636d361199788ab8557344251006a134b1 -size 70656 diff --git a/Tools/LyTestTools/README.txt b/Tools/LyTestTools/README.txt index 1cdd4811fc..b983615407 100644 --- a/Tools/LyTestTools/README.txt +++ b/Tools/LyTestTools/README.txt @@ -19,6 +19,10 @@ the following tools: A library to manipulate Lumberyard installations * Launchers: A library to test the game in a variety of platforms + * O3DE: + Contains various modules to test o3de specific executables + * Environment: + Contains various modules to assist with environmental dependencies REQUIREMENTS @@ -38,10 +42,6 @@ Assuming CMake is already setup on your operating system, below are some sample mkdir windows_vs2019 cd windows_vs2019 cmake -E time cmake --build . --target ALL_BUILD --config profile -NOTE: -Using the above command also adds LyTestTools to the PYTHONPATH OS environment variable. -Additionally, some CTest scripts will add the Python interpreter path to the PYTHON OS environment variable. -There is some LyTestTools functionality that will search for these, so feel free to populate them manually. To manually install the project in development mode using your own installed Python interpreter: cd /path/to/lumberyard/dev/Tools/LyTestTools/ diff --git a/Tools/LyTestTools/ly_test_tools/_internal/pytest_plugin/failed_test_rerun_command.py b/Tools/LyTestTools/ly_test_tools/_internal/pytest_plugin/failed_test_rerun_command.py index e8e0b02501..c67d6721cf 100755 --- a/Tools/LyTestTools/ly_test_tools/_internal/pytest_plugin/failed_test_rerun_command.py +++ b/Tools/LyTestTools/ly_test_tools/_internal/pytest_plugin/failed_test_rerun_command.py @@ -22,7 +22,7 @@ def _get_test_launcher_cmd(build_dir=None): """ build_arg = "" if build_dir: - build_arg = f"--build-directory {build_dir} " + build_arg = f" --build-directory {build_dir} " python_runner = "python.cmd" if not WINDOWS: diff --git a/Tools/NormalMapFilter.8bf b/Tools/NormalMapFilter.8bf deleted file mode 100644 index 8aa96853dc..0000000000 Binary files a/Tools/NormalMapFilter.8bf and /dev/null differ diff --git a/Tools/Python/python3.cmd b/Tools/Python/python3.cmd deleted file mode 100644 index 0407e8c3c1..0000000000 --- a/Tools/Python/python3.cmd +++ /dev/null @@ -1,30 +0,0 @@ -@ECHO OFF -REM -REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -REM its licensors. -REM -REM For complete copyright and license terms please see the LICENSE at the root of this -REM distribution (the "License"). All use of this software is governed by the License, -REM or, if provided, by the license below or the license accompanying this file. Do not -REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM - -SETLOCAL -SET CMD_DIR=%~dp0 -SET CMD_DIR=%CMD_DIR:~0,-1% - -echo WARNING: Using deprecated python3.sh in $DIR - please update your scripts -echo to use python.sh in the python subfolder of the root instead. - -rem we fetch python pre-emptively because the prior legacy system had -rem python pre-installed... -call %CMD_DIR%/../../python/get_python.bat - -if ERRORLEVEL 1 ( - ECHO Failed to fetch python - EXIT /b 1 -) - -call %CMD_DIR%/../../python/python.cmd %* -exit /b %ERRORLEVEL% diff --git a/Tools/Python/python3.sh b/Tools/Python/python3.sh deleted file mode 100755 index 424e982750..0000000000 --- a/Tools/Python/python3.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -# Original file Copyright Crytek GMBH or its affiliates, used under license. - -SOURCE="${BASH_SOURCE[0]}" -# While $SOURCE is a symlink, resolve it -while [ -h "$SOURCE" ]; do - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$( readlink "$SOURCE" )" - # If $SOURCE was a relative symlink (so no "/" as prefix, need to resolve it relative to the symlink base directory - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - -echo "WARNING: Using deprecated python3.sh in $DIR - please update your scripts" -echo " to use python.sh in the python subfolder of the root instead." - -# we fetch python pre-emptively because the prior legacy system had -# python pre-installed... - -$DIR/../../python/get_python.sh - -retVal=$? -if [ $retVal -ne 0 ]; then - echo "Error getting python using $DIR/../../python/get_python.sh" - exit 1 -fi - -$DIR/../../python/python.sh "$@" - -exit $? diff --git a/Tools/SettingsMgr.exe b/Tools/SettingsMgr.exe deleted file mode 100644 index 45ca242152..0000000000 --- a/Tools/SettingsMgr.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3b65cc9d52e2a0f938b5fce572ed71ecc11d2a1587fa7e9410f06fd643f921a -size 78336 diff --git a/Tools/ToolkitPro1310vc90.dll b/Tools/ToolkitPro1310vc90.dll deleted file mode 100644 index 9d7cf4cdc4..0000000000 --- a/Tools/ToolkitPro1310vc90.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b22b6e027e9a3aa72ca61fc317ce20ccdd95176089d9e3bebcc838b891ca714 -size 7415808 diff --git a/Tools/photoshop/actions/HorizCross2SkyBox.atn b/Tools/photoshop/actions/HorizCross2SkyBox.atn deleted file mode 100644 index bdb24d187d..0000000000 Binary files a/Tools/photoshop/actions/HorizCross2SkyBox.atn and /dev/null differ diff --git a/Tools/sed/libiconv2.dll b/Tools/sed/libiconv2.dll deleted file mode 100644 index 5d24ac9b71..0000000000 --- a/Tools/sed/libiconv2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ec2d1a924ef6f19f2db45e48b9cf4b74a904af5720100e3da02182eee3bcf02 -size 898048 diff --git a/Tools/sed/libintl3.dll b/Tools/sed/libintl3.dll deleted file mode 100644 index d12401dccd..0000000000 --- a/Tools/sed/libintl3.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b92377f1ecb1288467e81abe286d1fd12946d017e74bd1ab5fb2f11e46955154 -size 101888 diff --git a/Tools/sed/sed.exe b/Tools/sed/sed.exe deleted file mode 100644 index cb201c4a91..0000000000 --- a/Tools/sed/sed.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4451a8bf312f277291e433770c1eed0fbf8491a17ab6f957942cba3df4840953 -size 209920 diff --git a/Tools/xNormal_3_17_9_CryTIFF_32.dll b/Tools/xNormal_3_17_9_CryTIFF_32.dll deleted file mode 100644 index 57de16d678..0000000000 --- a/Tools/xNormal_3_17_9_CryTIFF_32.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3df60a49674ebd83d192cdb6b8e28f3441ae0bfee43615a16f383be08bf9bab -size 259072 diff --git a/Tools/xNormal_3_17_9_CryTIFF_64.dll b/Tools/xNormal_3_17_9_CryTIFF_64.dll deleted file mode 100644 index 100164a599..0000000000 --- a/Tools/xNormal_3_17_9_CryTIFF_64.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1efedd9f12013790f8c203d13e97140bcda56217c50aab087c50be59fc65c71 -size 298496 diff --git a/cmake/3rdParty.cmake b/cmake/3rdParty.cmake index 8d0c030302..7385f34e5a 100644 --- a/cmake/3rdParty.cmake +++ b/cmake/3rdParty.cmake @@ -10,7 +10,7 @@ # # Do not overcomplicate searching for the 3rdParty path, if it is not easy to find, -# the user should define it. +# the user should define it. set(LY_3RDPARTY_PATH "" CACHE PATH "Path to the 3rdParty folder") @@ -42,7 +42,7 @@ endfunction() # \arg:PACKAGE if defined, defines the name of the external library "package". This is used when a package exposes multiple interfaces # if not defined, NAME is used # \arg:COMPILE_DEFINITIONS compile definitions to be added to the interface -# \arg:BUILD_DEPENDENCIES list of interfaces this target depends on (could be a compilation dependency if the dependency is only +# \arg:BUILD_DEPENDENCIES list of interfaces this target depends on (could be a compilation dependency if the dependency is only # exposing an include path, or could be a linking dependency is exposing a lib) # \arg:RUNTIME_DEPENDENCIES list of files this target depends on (could be a dynamic libraries, text files, executables, # applications, other 3rdParty targets, etc) @@ -129,7 +129,7 @@ function(ly_add_external_target) INTERFACE ${ly_add_external_target_INCLUDE_DIRECTORIES} ) endif() - + # Check if there is a pal file ly_get_absolute_pal_filename(pal_file ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}/${ly_add_external_target_PACKAGE}_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) if(NOT EXISTS ${pal_file}) @@ -138,7 +138,7 @@ function(ly_add_external_target) if(EXISTS ${pal_file}) include(${pal_file}) endif() - + if(${PACKAGE_AND_NAME}_INCLUDE_DIRECTORIES) list(TRANSFORM ${PACKAGE_AND_NAME}_INCLUDE_DIRECTORIES PREPEND ${BASE_PATH}/) foreach(include_path ${${PACKAGE_AND_NAME}_INCLUDE_DIRECTORIES}) @@ -259,7 +259,7 @@ function(ly_add_external_target) list(APPEND ly_add_external_target_BUILD_DEPENDENCIES "${${PACKAGE_AND_NAME}_BUILD_DEPENDENCIES}") list(REMOVE_DUPLICATES ly_add_external_target_BUILD_DEPENDENCIES) endif() - + # Interface dependencies may require to find_packages. So far, we are just using packages for 3rdParty, so we will # search for those and automatically bring those packages. The naming convention used is 3rdParty::PackageName::OptionalInterface foreach(dependency ${ly_add_external_target_BUILD_DEPENDENCIES}) @@ -274,7 +274,7 @@ function(ly_add_external_target) if(ly_add_external_target_BUILD_DEPENDENCIES) target_link_libraries(3rdParty::${NAME_WITH_NAMESPACE} - INTERFACE + INTERFACE ${ly_add_external_target_BUILD_DEPENDENCIES} ) endif() @@ -287,9 +287,12 @@ endfunction() # # \arg:3RDPARTY_ROOT_DIRECTORY custom 3rd party directory which needs to be installed function(ly_install_external_target 3RDPARTY_ROOT_DIRECTORY) - - # Install the Find file to our <install_location>/cmake directory - install(FILES ${CMAKE_CURRENT_LIST_FILE} DESTINATION cmake) + + # Install the Find file to our <install_location>/cmake directory + install(FILES ${CMAKE_CURRENT_LIST_FILE} + DESTINATION cmake + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) # We only want to install external targets that are part of our source tree # Checking for relative path beginning with "../" also works when the path @@ -297,7 +300,10 @@ function(ly_install_external_target 3RDPARTY_ROOT_DIRECTORY) file(RELATIVE_PATH rel_path ${CMAKE_SOURCE_DIR} ${3RDPARTY_ROOT_DIRECTORY}) if (NOT ${rel_path} MATCHES "^../") get_filename_component(rel_path ${rel_path} DIRECTORY) - install(DIRECTORY ${3RDPARTY_ROOT_DIRECTORY} DESTINATION ${rel_path}) + install(DIRECTORY ${3RDPARTY_ROOT_DIRECTORY} + DESTINATION ${rel_path} + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) endif() endfunction() diff --git a/cmake/3rdParty/FindAWSGameLiftServerSDK.cmake b/cmake/3rdParty/FindAWSGameLiftServerSDK.cmake deleted file mode 100644 index 48e7096480..0000000000 --- a/cmake/3rdParty/FindAWSGameLiftServerSDK.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# -ly_add_external_target( - NAME AWSGameLiftServerSDK - VERSION 3.4.0 - 3RDPARTY_DIRECTORY AWS/GameLift - INCLUDE_DIRECTORIES include - COMPILE_DEFINITIONS - AWS_CUSTOM_MEMORY_MANAGEMENT - PLATFORM_SUPPORTS_AWS_NATIVE_SDK - GAMELIFT_USE_STD -) diff --git a/cmake/3rdParty/FindCrashpad.cmake b/cmake/3rdParty/FindCrashpad.cmake deleted file mode 100644 index 95922cdca9..0000000000 --- a/cmake/3rdParty/FindCrashpad.cmake +++ /dev/null @@ -1,30 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME Crashpad - VERSION "" - 3RDPARTY_ROOT_DIRECTORY ${LY_ROOT_FOLDER}/Tools/Crashpad - INCLUDE_DIRECTORIES - include - include/third_party/mini_chromium/mini_chromium/ -) - -ly_add_external_target( - NAME Handler - PACKAGE Crashpad - VERSION "" - 3RDPARTY_ROOT_DIRECTORY ${LY_ROOT_FOLDER}/Tools/Crashpad - INCLUDE_DIRECTORIES - include - include/third_party/mini_chromium/mini_chromium - include/third_party/getopt -) diff --git a/cmake/3rdParty/FindDirectXShaderCompiler.cmake b/cmake/3rdParty/FindDirectXShaderCompiler.cmake deleted file mode 100644 index 8973775e48..0000000000 --- a/cmake/3rdParty/FindDirectXShaderCompiler.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME dxcGL - PACKAGE DirectXShaderCompiler - VERSION 1.0.1-az.1 -) - -ly_add_external_target( - NAME dxcMetal - PACKAGE DirectXShaderCompiler - VERSION 1.0.1-az.1 -) diff --git a/cmake/3rdParty/FindOpenSSL.cmake b/cmake/3rdParty/FindOpenSSL.cmake deleted file mode 100644 index 63a3fee9db..0000000000 --- a/cmake/3rdParty/FindOpenSSL.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME OpenSSL - VERSION 1.1.1b-noasm-az - INCLUDE_DIRECTORIES include - COMPILE_DEFINITIONS OPENSSL_ENABLED -) diff --git a/cmake/3rdParty/FindVkValidation.cmake b/cmake/3rdParty/FindVkValidation.cmake index 40588dd2a3..3767946602 100644 --- a/cmake/3rdParty/FindVkValidation.cmake +++ b/cmake/3rdParty/FindVkValidation.cmake @@ -11,6 +11,5 @@ ly_add_external_target( NAME VkValidation - VERSION ${VKVALIDATION_VERSION} - 3RDPARTY_DIRECTORY ${VKVALIDATION_3RDPARTY_PLATFORM_DIRECTORY} + VERSION "" ) \ No newline at end of file diff --git a/cmake/3rdParty/Findcivetweb.cmake b/cmake/3rdParty/Findcivetweb.cmake deleted file mode 100644 index b882957b84..0000000000 --- a/cmake/3rdParty/Findcivetweb.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME civetweb - VERSION civetweb-20160922-az.2 - INCLUDE_DIRECTORIES include -) diff --git a/cmake/3rdParty/Findlibav.cmake b/cmake/3rdParty/Findlibav.cmake deleted file mode 100644 index f14a4cfe50..0000000000 --- a/cmake/3rdParty/Findlibav.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -ly_add_external_target( - NAME libav - VERSION 11.7 - INCLUDE_DIRECTORIES - usr/include -) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index 8ab270ec0d..9f63185ab3 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -11,7 +11,6 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME zlib-1.2.8-rev2-multiplatform TARGETS zlib PACKAGE_HASH e6f34b8ac16acf881e3d666ef9fd0c1aee94c3f69283fb6524d35d6f858eebbb) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev3-multiplatform TARGETS Lua PACKAGE_HASH 171dcdd60bd91fb325feaab0e53dd185c9d6e7b701d53e66fc6c2c6ee91d8bff) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-multiplatform TARGETS RapidJSON PACKAGE_HASH 18b0aef4e6e849389916ff6de6682ab9c591ebe15af6ea6017014453c1119ea1) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) @@ -25,8 +24,10 @@ ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-android TARGETS freetype PACKAGE_HASH 74dd75382688323c3a2a5090f473840b5d7e9d2aed1a4fcdff05ed2a09a664f2) ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-android TARGETS tiff PACKAGE_HASH a9b30a1980946390c2fad0ed94562476a1d7ba8c1f36934ae140a89c54a8efd0) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-android TARGETS AWSNativeSDK PACKAGE_HASH e2192157534cc8c4e22769545d88dff03ec6c1031599716ef63de3ebbb8c9a44) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-android TARGETS Lua PACKAGE_HASH 1f638e94a17a87fe9e588ea456d5893876094b4db191234380e4c4eb9e06c300) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-android TARGETS PhysX PACKAGE_HASH 9c494576c2d4ff04dee5a9e092fcd9d5af4b2845f15ffdfcaabb0dbc5b88a7a9) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-android TARGETS mikkelsen PACKAGE_HASH 075e8e4940884971063b5a9963014e2e517246fa269c07c7dc55b8cf2cd99705) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-android TARGETS googletest PACKAGE_HASH 95671be75287a61c9533452835c3647e9c1b30f81b34b43bcb0ec1997cc23894) ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-android TARGETS GoogleBenchmark PACKAGE_HASH 20b46e572211a69d7d94ddad1c89ec37bb958711d6ad4025368ac89ea83078fb) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-android TARGETS libsamplerate PACKAGE_HASH bf13662afe65d02bcfa16258a4caa9b875534978227d6f9f36c9cfa92b3fb12b) +ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-android TARGETS OpenSSL PACKAGE_HASH 4036d4019d722f0e1b7a1621bf60b5a17ca6a65c9c78fd8701cee1131eec8480) diff --git a/cmake/3rdParty/Platform/Android/VkValidation_android.cmake b/cmake/3rdParty/Platform/Android/VkValidation_android.cmake index 447bdb4332..ad219e3a79 100644 --- a/cmake/3rdParty/Platform/Android/VkValidation_android.cmake +++ b/cmake/3rdParty/Platform/Android/VkValidation_android.cmake @@ -9,4 +9,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -set(VKVALIDATION_RUNTIME_DEPENDENCIES $<$<NOT:$<CONFIG:Release>>:${BASE_PATH}/sources/third_party/vulkan/src/build-android/jniLibs/arm64-v8a/libVkLayer_khronos_validation.so>) +set(VKVALIDATION_RUNTIME_DEPENDENCIES $<$<NOT:$<CONFIG:Release>>:${LY_NDK_DIR}/sources/third_party/vulkan/src/build-android/jniLibs/arm64-v8a/libVkLayer_khronos_validation.so>) diff --git a/cmake/3rdParty/Platform/Android/civetweb_android.cmake b/cmake/3rdParty/Platform/Android/civetweb_android.cmake deleted file mode 100644 index 4d5680a30d..0000000000 --- a/cmake/3rdParty/Platform/Android/civetweb_android.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# diff --git a/cmake/3rdParty/Platform/Android/cmake_android_files.cmake b/cmake/3rdParty/Platform/Android/cmake_android_files.cmake index 07e453f862..59015d8704 100644 --- a/cmake/3rdParty/Platform/Android/cmake_android_files.cmake +++ b/cmake/3rdParty/Platform/Android/cmake_android_files.cmake @@ -11,7 +11,6 @@ set(FILES BuiltInPackages_android.cmake - civetweb_android.cmake VkValidation_android.cmake Wwise_android.cmake ) diff --git a/cmake/3rdParty/Platform/Linux/AWSGameLiftServerSDK_linux.cmake b/cmake/3rdParty/Platform/Linux/AWSGameLiftServerSDK_linux.cmake deleted file mode 100644 index 405b4f4597..0000000000 --- a/cmake/3rdParty/Platform/Linux/AWSGameLiftServerSDK_linux.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -# TODO AWSGameLiftServerSDK Linux shared libs are not compiled. -set(AWSGAMELIFTSERVERSDK_LIB_PATH ${BASE_PATH}/lib/linux/libstdcxx/intel64/clang-6.0.0/$<IF:$<CONFIG:Debug>,Debug,Release>) - -set(AWSGAMELIFTSERVERSDK_LIBS ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libaws-cpp-sdk-gamelift-server.a - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libsioclient.a - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_date_time.a - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_random.a - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_system.a - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libprotobuf.a -) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 9057b5ba1b..7ccd118413 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -11,11 +11,10 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME zlib-1.2.8-rev2-multiplatform TARGETS zlib PACKAGE_HASH e6f34b8ac16acf881e3d666ef9fd0c1aee94c3f69283fb6524d35d6f858eebbb) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev3-multiplatform TARGETS Lua PACKAGE_HASH 171dcdd60bd91fb325feaab0e53dd185c9d6e7b701d53e66fc6c2c6ee91d8bff) ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME hdf5-1.0.11-rev2-multiplatform TARGETS hdf5 PACKAGE_HASH 11d5e04df8a93f8c52a5684a4cacbf0d9003056360983ce34f8d7b601082c6bd) ly_associate_package(PACKAGE_NAME alembic-1.7.11-rev3-multiplatform TARGETS alembic PACKAGE_HASH ba7a7d4943dd752f5a662374f6c48b93493df1d8e2c5f6a8d101f3b50700dd25) -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev6-multiplatform TARGETS assimplib PACKAGE_HASH 47f1a6d05d101def036c030484c4a6e19d745aacd57037174715c7afe2b19b4c) +ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev7-multiplatform TARGETS assimplib PACKAGE_HASH def855c89d8210db3040f1cb6ec837141ab9b8e74c158eae7c03d50160fcf30b) ly_associate_package(PACKAGE_NAME squish-ccr-20150601-rev3-multiplatform TARGETS squish-ccr PACKAGE_HASH c878c6c0c705e78403c397d03f5aa7bc87e5978298710e14d09c9daf951a83b3) ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) @@ -31,13 +30,13 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARG ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) -ly_associate_package(PACKAGE_NAME poly2tri-0.3.3-rev2-multiplatform TARGETS poly2tri PACKAGE_HASH 04092d06716f59b936b61906eaf3647db23b685d81d8b66131eb53e0aeaa1a38) -ly_associate_package(PACKAGE_NAME v-hacd-2.0-rev1-multiplatform TARGETS v-hacd PACKAGE_HASH 5c71aef19cc9787d018d64eec076e9f51ea5a3e0dc6b6e22e57c898f6cc4afe3) # platform-specific: +ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-linux TARGETS AWSGameLiftServerSDK PACKAGE_HASH a8149a95bd100384af6ade97e2b21a56173740d921e6c3da8188cd51554d39af) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-linux TARGETS freetype PACKAGE_HASH 9ad246873067717962c6b780d28a5ce3cef3321b73c9aea746a039c798f52e93) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-linux TARGETS tiff PACKAGE_HASH ae92b4d3b189c42ef644abc5cac865d1fb2eb7cb5622ec17e35642b00d1a0a76) -ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-linux TARGETS AWSNativeSDK PACKAGE_HASH e69c55682638dc1e7fa571a61a82c8a69d395c74a008543a5188f4bd2b6b10c4) +ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev4-linux TARGETS AWSNativeSDK PACKAGE_HASH b4db38de49d35a5f7500aed7f4aee5ec511dd3b584ee06fe9097885690191a5d) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-linux TARGETS Lua PACKAGE_HASH 1adc812abe3dd0dbb2ca9756f81d8f0e0ba45779ac85bf1d8455b25c531a38b0) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-linux TARGETS PhysX PACKAGE_HASH e3ca36106a8dbf1524709f8bb82d520920ebd3ff3a92672d382efff406c75ee3) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-linux TARGETS etc2comp PACKAGE_HASH 9283aa5db5bb7fb90a0ddb7a9f3895317c8ebe8044943124bbb3673a41407430) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-linux TARGETS mikkelsen PACKAGE_HASH 5973b1e71a64633588eecdb5b5c06ca0081f7be97230f6ef64365cbda315b9c8) @@ -46,3 +45,4 @@ ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-linux TARGETS Goog ly_associate_package(PACKAGE_NAME unwind-1.2.1-linux TARGETS unwind PACKAGE_HASH 3453265fb056e25432f611a61546a25f60388e315515ad39007b5925dd054a77) ly_associate_package(PACKAGE_NAME qt-5.15.2-linux TARGETS Qt PACKAGE_HASH 3857fbb2fc5581cdb71d80a7f9298c83ef06073d4e1ccd86a32b4f88782b6f14) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-linux TARGETS libsamplerate PACKAGE_HASH 41643c31bc6b7d037f895f89d8d8d6369e906b92eff42b0fe05ee6a100f06261) +ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev2-linux TARGETS OpenSSL PACKAGE_HASH b779426d1e9c5ddf71160d5ae2e639c3b956e0fb5e9fcaf9ce97c4526024e3bc) diff --git a/cmake/3rdParty/Platform/Linux/Clang_linux.cmake b/cmake/3rdParty/Platform/Linux/Clang_linux.cmake deleted file mode 100644 index 1cf269d1a2..0000000000 --- a/cmake/3rdParty/Platform/Linux/Clang_linux.cmake +++ /dev/null @@ -1,43 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(CLANG_PLATFORM_LIB_PATH ${BASE_PATH}/linux_x64/release/lib) - -set(CLANG_INCLUDE_DIRECTORIES - llvm/include - linux_x64/release/include -) - -set(CLANG_LIBS - ${CLANG_PLATFORM_LIB_PATH}/libclangFrontend.a - ${CLANG_PLATFORM_LIB_PATH}/libclangSerialization.a - ${CLANG_PLATFORM_LIB_PATH}/libclangDriver.a - ${CLANG_PLATFORM_LIB_PATH}/libclangTooling.a - ${CLANG_PLATFORM_LIB_PATH}/libclangParse.a - ${CLANG_PLATFORM_LIB_PATH}/libclangSema.a - ${CLANG_PLATFORM_LIB_PATH}/libclangAnalysis.a - ${CLANG_PLATFORM_LIB_PATH}/libclangRewriteFrontend.a - ${CLANG_PLATFORM_LIB_PATH}/libclangRewrite.a - ${CLANG_PLATFORM_LIB_PATH}/libclangEdit.a - ${CLANG_PLATFORM_LIB_PATH}/libclangAST.a - ${CLANG_PLATFORM_LIB_PATH}/libclangLex.a - ${CLANG_PLATFORM_LIB_PATH}/libclangBasic.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMCore.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMBinaryFormat.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMDebugInfoDWARF.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMMC.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMOption.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMBitReader.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMMCParser.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMProfileData.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMTarget.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMSupport.a -) diff --git a/cmake/3rdParty/Platform/Linux/OpenSSL_linux.cmake b/cmake/3rdParty/Platform/Linux/OpenSSL_linux.cmake deleted file mode 100644 index 4e02b53abb..0000000000 --- a/cmake/3rdParty/Platform/Linux/OpenSSL_linux.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(OPENSSL_LIBS - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.so - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libssl.so -) - -set(OPENSSL_RUNTIME_DEPENDENCIES - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.so - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libssl.so - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.so.1.1 - ${BASE_PATH}/bin/linux-x86_64-clang-$<IF:$<CONFIG:Debug>,debug,release>/libssl.so.1.1 -) diff --git a/cmake/3rdParty/Platform/Linux/civetweb_linux.cmake b/cmake/3rdParty/Platform/Linux/civetweb_linux.cmake deleted file mode 100644 index 4d5680a30d..0000000000 --- a/cmake/3rdParty/Platform/Linux/civetweb_linux.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# diff --git a/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake b/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake index 2b1ba4d0e5..bd2fd969eb 100644 --- a/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake +++ b/cmake/3rdParty/Platform/Linux/cmake_linux_files.cmake @@ -10,12 +10,8 @@ # set(FILES - AWSGameLiftServerSDK_linux.cmake BuiltInPackages_linux.cmake - civetweb_linux.cmake - Clang_linux.cmake dyad_linux.cmake FbxSdk_linux.cmake - OpenSSL_linux.cmake Wwise_linux.cmake ) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index ef66259e22..fb6b17fb72 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -11,11 +11,10 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME zlib-1.2.8-rev2-multiplatform TARGETS zlib PACKAGE_HASH e6f34b8ac16acf881e3d666ef9fd0c1aee94c3f69283fb6524d35d6f858eebbb) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev3-multiplatform TARGETS Lua PACKAGE_HASH 171dcdd60bd91fb325feaab0e53dd185c9d6e7b701d53e66fc6c2c6ee91d8bff) ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME hdf5-1.0.11-rev2-multiplatform TARGETS hdf5 PACKAGE_HASH 11d5e04df8a93f8c52a5684a4cacbf0d9003056360983ce34f8d7b601082c6bd) ly_associate_package(PACKAGE_NAME alembic-1.7.11-rev3-multiplatform TARGETS alembic PACKAGE_HASH ba7a7d4943dd752f5a662374f6c48b93493df1d8e2c5f6a8d101f3b50700dd25) -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev6-multiplatform TARGETS assimplib PACKAGE_HASH 47f1a6d05d101def036c030484c4a6e19d745aacd57037174715c7afe2b19b4c) +ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev7-multiplatform TARGETS assimplib PACKAGE_HASH def855c89d8210db3040f1cb6ec837141ab9b8e74c158eae7c03d50160fcf30b) ly_associate_package(PACKAGE_NAME squish-ccr-20150601-rev3-multiplatform TARGETS squish-ccr PACKAGE_HASH c878c6c0c705e78403c397d03f5aa7bc87e5978298710e14d09c9daf951a83b3) ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) @@ -36,17 +35,17 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) -ly_associate_package(PACKAGE_NAME poly2tri-0.3.3-rev2-multiplatform TARGETS poly2tri PACKAGE_HASH 04092d06716f59b936b61906eaf3647db23b685d81d8b66131eb53e0aeaa1a38) -ly_associate_package(PACKAGE_NAME v-hacd-2.0-rev1-multiplatform TARGETS v-hacd PACKAGE_HASH 5c71aef19cc9787d018d64eec076e9f51ea5a3e0dc6b6e22e57c898f6cc4afe3) # platform-specific: ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-mac TARGETS AWSNativeSDK PACKAGE_HASH 21920372e90355407578b45ac19580df1463a39a25a867bcd0ffd8b385c8254a) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev6-mac TARGETS Lua PACKAGE_HASH b9079fd35634774c9269028447562c6b712dbc83b9c64975c095fd423ff04c08) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-mac TARGETS PhysX PACKAGE_HASH 149f5e9b44bd27291b1c4772f5e89a1e0efa88eef73c7e0b188935ed4d0c4a70) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-mac TARGETS etc2comp PACKAGE_HASH 1966ab101c89db7ecf30984917e0a48c0d02ee0e4d65b798743842b9469c0818) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-mac TARGETS mikkelsen PACKAGE_HASH 83af99ca8bee123684ad254263add556f0cf49486c0b3e32e6d303535714e505) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-mac TARGETS googletest PACKAGE_HASH cbf020d5ef976c5db8b6e894c6c63151ade85ed98e7c502729dd20172acae5a8) ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-mac TARGETS GoogleBenchmark PACKAGE_HASH ad25de0146769c91e179953d845de2bec8ed4a691f973f47e3eb37639381f665) +ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-mac TARGETS OpenSSL PACKAGE_HASH 28adc1c0616ac0482b2a9d7b4a3a3635a1020e87b163f8aba687c501cf35f96c) ly_associate_package(PACKAGE_NAME qt-5.15.2-mac TARGETS Qt PACKAGE_HASH ac248833d65838e4bcef50f30c9ff02ba9464ff64b9ada52de2ad6045d38baec) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-mac TARGETS libsamplerate PACKAGE_HASH b912af40c0ac197af9c43d85004395ba92a6a859a24b7eacd920fed5854a97fe) diff --git a/cmake/3rdParty/Platform/Mac/Clang_mac.cmake b/cmake/3rdParty/Platform/Mac/Clang_mac.cmake deleted file mode 100644 index 3d7fc64465..0000000000 --- a/cmake/3rdParty/Platform/Mac/Clang_mac.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(CLANG_PLATFORM_LIB_PATH ${BASE_PATH}/xcode/$<IF:$<CONFIG:Debug>,debug,release>/lib) - -set(CLANG_INCLUDE_DIRECTORIES - llvm/include - xcode/$<IF:$<CONFIG:Debug>,debug,release>/include -) - -set(CLANG_LIBS - ${CLANG_PLATFORM_LIB_PATH}/libclangFrontend.a - ${CLANG_PLATFORM_LIB_PATH}/libclangSerialization.a - ${CLANG_PLATFORM_LIB_PATH}/libclangDriver.a - ${CLANG_PLATFORM_LIB_PATH}/libclangTooling.a - ${CLANG_PLATFORM_LIB_PATH}/libclangParse.a - ${CLANG_PLATFORM_LIB_PATH}/libclangSema.a - ${CLANG_PLATFORM_LIB_PATH}/libclangAnalysis.a - ${CLANG_PLATFORM_LIB_PATH}/libclangRewriteFrontend.a - ${CLANG_PLATFORM_LIB_PATH}/libclangRewrite.a - ${CLANG_PLATFORM_LIB_PATH}/libclangEdit.a - ${CLANG_PLATFORM_LIB_PATH}/libclangAST.a - ${CLANG_PLATFORM_LIB_PATH}/libclangASTMatchers.a - ${CLANG_PLATFORM_LIB_PATH}/libclangLex.a - ${CLANG_PLATFORM_LIB_PATH}/libclangBasic.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMCore.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMBinaryFormat.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMDebugInfoDWARF.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMMC.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMOption.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMBitReader.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMMCParser.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMProfileData.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMTarget.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMSupport.a - - ${CLANG_PLATFORM_LIB_PATH}/libLLVMDemangle.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMSupport.a - ${CLANG_PLATFORM_LIB_PATH}/libLLVMCore.a - -) diff --git a/cmake/3rdParty/Platform/Mac/DirectXShaderCompiler_mac.cmake b/cmake/3rdParty/Platform/Mac/DirectXShaderCompiler_mac.cmake deleted file mode 100644 index c00f71dbc1..0000000000 --- a/cmake/3rdParty/Platform/Mac/DirectXShaderCompiler_mac.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(DIRECTXSHADERCOMPILER_BINARY_BASE_PATH ${BASE_PATH}/bin/darwin_x64/$<IF:$<CONFIG:Debug>,debug,release>) - -set(DIRECTXSHADERCOMPILER_DXCGL_RUNTIME_DEPENDENCIES ${DIRECTXSHADERCOMPILER_BINARY_BASE_PATH}/dxcGL\nCompiler/LLVMGL/$<IF:$<CONFIG:Debug>,debug,release>) - -set(DIRECTXSHADERCOMPILER_DXCMETAL_RUNTIME_DEPENDENCIES ${DIRECTXSHADERCOMPILER_BINARY_BASE_PATH}/dxcMetal\nCompiler/LLVMMETAL/$<IF:$<CONFIG:Debug>,debug,release>) diff --git a/cmake/3rdParty/Platform/Mac/OpenSSL_mac.cmake b/cmake/3rdParty/Platform/Mac/OpenSSL_mac.cmake deleted file mode 100644 index 022b56dd0c..0000000000 --- a/cmake/3rdParty/Platform/Mac/OpenSSL_mac.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(OPENSSL_LIBS - ${BASE_PATH}/lib/darwin-x86_64-$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.a - ${BASE_PATH}/lib/darwin-x86_64-$<IF:$<CONFIG:Debug>,debug,release>/libssl.a -) diff --git a/cmake/3rdParty/Platform/Mac/civetweb_mac.cmake b/cmake/3rdParty/Platform/Mac/civetweb_mac.cmake deleted file mode 100644 index 4d5680a30d..0000000000 --- a/cmake/3rdParty/Platform/Mac/civetweb_mac.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# diff --git a/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake b/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake index 0e3cc53262..7d7679c3aa 100644 --- a/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake +++ b/cmake/3rdParty/Platform/Mac/cmake_mac_files.cmake @@ -11,11 +11,7 @@ set(FILES BuiltInPackages_mac.cmake - civetweb_mac.cmake - Clang_mac.cmake - DirectXShaderCompiler_mac.cmake FbxSdk_mac.cmake OpenGLInterface_mac.cmake - OpenSSL_mac.cmake Wwise_mac.cmake ) diff --git a/cmake/3rdParty/Platform/Windows/AWSGameLiftServerSDK_windows.cmake b/cmake/3rdParty/Platform/Windows/AWSGameLiftServerSDK_windows.cmake deleted file mode 100644 index 5f93ef7030..0000000000 --- a/cmake/3rdParty/Platform/Windows/AWSGameLiftServerSDK_windows.cmake +++ /dev/null @@ -1,47 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -if (LY_MONOLITHIC_GAME) - # Import Libs - set(AWSGAMELIFTSERVERSDK_LIB_PATH ${BASE_PATH}/lib/windows/intel64/vs2017/$<IF:$<CONFIG:Debug>,Debug,Release>) -else() - # Static Libs - set(AWSGAMELIFTSERVERSDK_LIB_PATH ${BASE_PATH}/bin/windows/intel64/vs2017/$<IF:$<CONFIG:Debug>,Debug,Release>) -endif() - -set(AWSGAMELIFTSERVERSDK_LIBS - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/sioclient.lib - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_date_time.lib - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_random.lib - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libboost_system.lib - ${AWSGAMELIFTSERVERSDK_LIB_PATH}/libprotobuf$<$<CONFIG:Debug>:d>.lib -) - -set(AWSGAMELIFTSERVERSDK_COMPILE_DEFINITIONS - USE_IMPORT_EXPORT - AWS_CUSTOM_MEMORY_MANAGEMENT - PLATFORM_SUPPORTS_AWS_NATIVE_SDK - GAMELIFT_USE_STD -) - -if (NOT LY_MONOLITHIC_GAME) - - # Add 'USE_IMPORT_EXPORT' for external linkage - LIST(APPEND AWSGAMELIFTSERVERSDK_COMPILE_DEFINITIONS USE_IMPORT_EXPORT) - - # Import Lib - LIST(APPEND AWSGAMELIFTSERVERSDK_LIBS ${AWSGAMELIFTSERVERSDK_LIB_PATH}/aws-cpp-sdk-gamelift-server.lib) - - # Shared libs - set(AWSGAMELIFTSERVERSDK_SHARED_LIB_PATH ${BASE_PATH}/bin/windows/intel64/vs2017/$<IF:$<CONFIG:Debug>,Debug,Release>) - set(AWSGAMELIFTSERVERSDK_RUNTIME_DEPENDENCIES ${AWSGAMELIFTSERVERSDK_SHARED_LIB_PATH}/aws-cpp-sdk-gamelift-server.dll) - -endif() \ No newline at end of file diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 58050652c0..e8c1361b3f 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -11,11 +11,10 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME zlib-1.2.8-rev2-multiplatform TARGETS zlib PACKAGE_HASH e6f34b8ac16acf881e3d666ef9fd0c1aee94c3f69283fb6524d35d6f858eebbb) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev3-multiplatform TARGETS Lua PACKAGE_HASH 171dcdd60bd91fb325feaab0e53dd185c9d6e7b701d53e66fc6c2c6ee91d8bff) ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME hdf5-1.0.11-rev2-multiplatform TARGETS hdf5 PACKAGE_HASH 11d5e04df8a93f8c52a5684a4cacbf0d9003056360983ce34f8d7b601082c6bd) ly_associate_package(PACKAGE_NAME alembic-1.7.11-rev3-multiplatform TARGETS alembic PACKAGE_HASH ba7a7d4943dd752f5a662374f6c48b93493df1d8e2c5f6a8d101f3b50700dd25) -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev6-multiplatform TARGETS assimplib PACKAGE_HASH 47f1a6d05d101def036c030484c4a6e19d745aacd57037174715c7afe2b19b4c) +ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev7-multiplatform TARGETS assimplib PACKAGE_HASH def855c89d8210db3040f1cb6ec837141ab9b8e74c158eae7c03d50160fcf30b) ly_associate_package(PACKAGE_NAME squish-ccr-20150601-rev3-multiplatform TARGETS squish-ccr PACKAGE_HASH c878c6c0c705e78403c397d03f5aa7bc87e5978298710e14d09c9daf951a83b3) ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) @@ -37,14 +36,13 @@ ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) ly_associate_package(PACKAGE_NAME Blast-1.1.7-rev1-multiplatform TARGETS Blast PACKAGE_HASH 36b8f393bcd25d0f85cfc7a831ebbdac881e6054c4f0735649966aa6aa86e6f0) ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform TARGETS PVRTexTool PACKAGE_HASH d0d6da61c7557de0d2c71fc35ba56c3be49555b703f0e853d4c58225537acf1e) -ly_associate_package(PACKAGE_NAME NvCloth-1.1.6-rev1-multiplatform TARGETS NvCloth PACKAGE_HASH 05fc62634ca28644e7659a89e97f4520d791e6ddf4b66f010ac669e4e2ed4454) -ly_associate_package(PACKAGE_NAME poly2tri-0.3.3-rev2-multiplatform TARGETS poly2tri PACKAGE_HASH 04092d06716f59b936b61906eaf3647db23b685d81d8b66131eb53e0aeaa1a38) -ly_associate_package(PACKAGE_NAME v-hacd-2.0-rev1-multiplatform TARGETS v-hacd PACKAGE_HASH 5c71aef19cc9787d018d64eec076e9f51ea5a3e0dc6b6e22e57c898f6cc4afe3) # platform-specific: +ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-windows TARGETS AWSGameLiftServerSDK PACKAGE_HASH a0586b006e4def65cc25f388de17dc475e417dc1e6f9d96749777c88aa8271b0) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-windows TARGETS freetype PACKAGE_HASH 88dedc86ccb8c92f14c2c033e51ee7d828fa08eafd6475c6aa963938a99f4bf3) ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-windows TARGETS tiff PACKAGE_HASH ab60d1398e4e1e375ec0f1a00cdb1d812a07c0096d827db575ce52dd6d714207) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-windows TARGETS AWSNativeSDK PACKAGE_HASH 929873d4252c464620a9d288e41bd5d47c0bd22750aeb3a1caa68a3da8247c48) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-windows TARGETS Lua PACKAGE_HASH 136faccf1f73891e3fa3b95f908523187792e56f5b92c63c6a6d7e72d1158d40) ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-windows TARGETS PhysX PACKAGE_HASH 198bed89d1aae7caaf5dadba24cee56235fe41725d004b64040d4e50d0f3aa1a) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-windows TARGETS etc2comp PACKAGE_HASH fc9ae937b2ec0d42d5e7d0e9e8c80e5e4d257673fb33bc9b7d6db76002117123) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-windows TARGETS mikkelsen PACKAGE_HASH 872c4d245a1c86139aa929f2b465b63ea4ea55b04ced50309135dd4597457a4e) @@ -52,7 +50,10 @@ ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-windows TARGETS goo ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-windows TARGETS GoogleBenchmark PACKAGE_HASH 0c94ca69ae8e7e4aab8e90032b5c82c5964410429f3dd9dbb1f9bf4fe032b1d4) ly_associate_package(PACKAGE_NAME d3dx12-headers-rev1-windows TARGETS d3dx12 PACKAGE_HASH 088c637159fba4a3e4c0cf08fb4921906fd4cca498939bd239db7c54b5b2f804) ly_associate_package(PACKAGE_NAME pyside2-qt-5.15.1-rev2-windows TARGETS pyside2 PACKAGE_HASH c90f3efcc7c10e79b22a33467855ad861f9dbd2e909df27a5cba9db9fa3edd0f) -ly_associate_package(PACKAGE_NAME openimageio-2.1.16.0-rev1-windows TARGETS OpenImageIO PACKAGE_HASH b9f6d6df180ad240b9f17a68c1862c7d8f38234de0e692e83116254b0ee467e5) +ly_associate_package(PACKAGE_NAME openimageio-2.1.16.0-rev2-windows TARGETS OpenImageIO PACKAGE_HASH 85a2a6cf35cbc4c967c56ca8074babf0955c5b490c90c6e6fd23c78db99fc282) ly_associate_package(PACKAGE_NAME qt-5.15.2-windows TARGETS Qt PACKAGE_HASH edaf954c647c99727bfd313dab2959803d2df0873914bb96368c3d8286eed6d9) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-windows TARGETS libsamplerate PACKAGE_HASH dcf3c11a96f212a52e2c9241abde5c364ee90b0f32fe6eeb6dcdca01d491829f) -ly_associate_package(PACKAGE_NAME OpenMesh-8.1-rev1-windows TARGETS OpenMesh PACKAGE_HASH 1c1df639358526c368e790dfce40c45cbdfcfb1c9a041b9d7054a8949d88ee77) \ No newline at end of file +ly_associate_package(PACKAGE_NAME OpenMesh-8.1-rev1-windows TARGETS OpenMesh PACKAGE_HASH 1c1df639358526c368e790dfce40c45cbdfcfb1c9a041b9d7054a8949d88ee77) +ly_associate_package(PACKAGE_NAME civetweb-1.8-rev1-windows TARGETS civetweb PACKAGE_HASH 36d0e58a59bcdb4dd70493fb1b177aa0354c945b06c30416348fd326cf323dd4) +ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev2-windows TARGETS OpenSSL PACKAGE_HASH 9af1c50343f89146b4053101a7aeb20513319a3fe2f007e356d7ce25f9241040) +ly_associate_package(PACKAGE_NAME Crashpad-0.8.0-rev1-windows TARGETS Crashpad PACKAGE_HASH d162aa3070147bc0130a44caab02c5fe58606910252caf7f90472bd48d4e31e2) diff --git a/cmake/3rdParty/Platform/Windows/Clang_windows.cmake b/cmake/3rdParty/Platform/Windows/Clang_windows.cmake deleted file mode 100644 index 69a6b77119..0000000000 --- a/cmake/3rdParty/Platform/Windows/Clang_windows.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(CLANG_PLATFORM_LIB_PATH ${BASE_PATH}/vs2015/$<IF:$<CONFIG:Debug>,debug,release>/lib) - -set(CLANG_INCLUDE_DIRECTORIES - llvm/include - vs2015/$<IF:$<CONFIG:Debug>,debug,release>/include -) - -set(CLANG_LIBS - ${CLANG_PLATFORM_LIB_PATH}/clangFrontend.lib - ${CLANG_PLATFORM_LIB_PATH}/clangSerialization.lib - ${CLANG_PLATFORM_LIB_PATH}/clangDriver.lib - ${CLANG_PLATFORM_LIB_PATH}/clangTooling.lib - ${CLANG_PLATFORM_LIB_PATH}/clangParse.lib - ${CLANG_PLATFORM_LIB_PATH}/clangSema.lib - ${CLANG_PLATFORM_LIB_PATH}/clangAnalysis.lib - ${CLANG_PLATFORM_LIB_PATH}/clangRewriteFrontend.lib - ${CLANG_PLATFORM_LIB_PATH}/clangRewrite.lib - ${CLANG_PLATFORM_LIB_PATH}/clangEdit.lib - ${CLANG_PLATFORM_LIB_PATH}/clangAST.lib - ${CLANG_PLATFORM_LIB_PATH}/clangLex.lib - ${CLANG_PLATFORM_LIB_PATH}/clangBasic.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMBinaryFormat.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMDebugInfoDWARF.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMMC.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMOption.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMBitReader.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMMCParser.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMProfileData.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMTarget.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMCore.lib - ${CLANG_PLATFORM_LIB_PATH}/LLVMSupport.lib - Version.lib -) diff --git a/cmake/3rdParty/Platform/Windows/Crashpad_windows.cmake b/cmake/3rdParty/Platform/Windows/Crashpad_windows.cmake deleted file mode 100644 index ec1ce8db02..0000000000 --- a/cmake/3rdParty/Platform/Windows/Crashpad_windows.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(libpath ${BASE_PATH}/bin/windows/vs2019/$<IF:$<CONFIG:debug>,Debug,Release>_x64) - -set(CRASHPAD_LIBS - ${libpath}/base.lib - ${libpath}/crashpad_client.lib - ${libpath}/crashpad_context.lib - ${libpath}/crashpad_util.lib - winhttp - version - powrprof -) - -set(CRASHPAD_INCLUDE_DIRECTORIES - include/compat/win -) - -set(CRASHPAD_HANDLER_LIBS - ${libpath}/crashpad_tool_support.lib - ${libpath}/crashpad_compat.lib - ${libpath}/third_party/getopt.lib - ${libpath}/crashpad_minidump.lib - ${libpath}/crashpad_snapshot.lib - ${libpath}/crashpad_handler.lib - ${libpath}/third_party/zlib.lib -) diff --git a/cmake/3rdParty/Platform/Windows/DirectXShaderCompiler_windows.cmake b/cmake/3rdParty/Platform/Windows/DirectXShaderCompiler_windows.cmake deleted file mode 100644 index 2b50bc7f72..0000000000 --- a/cmake/3rdParty/Platform/Windows/DirectXShaderCompiler_windows.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(DIRECTXSHADERCOMPILER_BINARY_BASE_PATH "${BASE_PATH}/bin/win_x64/$<IF:$<CONFIG:Debug>,debug,release>/") - -set(DIRECTXSHADERCOMPILER_DXCGL_RUNTIME_DEPENDENCIES "${DIRECTXSHADERCOMPILER_BINARY_BASE_PATH}/dxcGL.exe\nCompiler/LLVMGL/$<IF:$<CONFIG:Debug>,debug,release>") - -set(DIRECTXSHADERCOMPILER_DXCMETAL_RUNTIME_DEPENDENCIES "${DIRECTXSHADERCOMPILER_BINARY_BASE_PATH}/dxcMetal.exe\nCompiler/LLVMMETAL/$<IF:$<CONFIG:Debug>,debug,release>") diff --git a/cmake/3rdParty/Platform/Windows/OpenSSL_windows.cmake b/cmake/3rdParty/Platform/Windows/OpenSSL_windows.cmake deleted file mode 100644 index 6f2c240b94..0000000000 --- a/cmake/3rdParty/Platform/Windows/OpenSSL_windows.cmake +++ /dev/null @@ -1,18 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(OPENSSL_LIBS - ${BASE_PATH}/lib/vc140_x64_$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.lib - ${BASE_PATH}/lib/vc140_x64_$<IF:$<CONFIG:Debug>,debug,release>/libssl.lib - crypt32.lib -) - -set(ENV{OPENSSL_HOME} ${BASE_PATH}) \ No newline at end of file diff --git a/cmake/3rdParty/Platform/Windows/civetweb_windows.cmake b/cmake/3rdParty/Platform/Windows/civetweb_windows.cmake deleted file mode 100644 index f987f76135..0000000000 --- a/cmake/3rdParty/Platform/Windows/civetweb_windows.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(CIVETWEB_LIBS ${BASE_PATH}/lib/Windows/$<IF:$<CONFIG:Debug>,debug,release>/civetweb.lib) - diff --git a/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake b/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake index 2c7890fcc4..57dc8ed604 100644 --- a/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake +++ b/cmake/3rdParty/Platform/Windows/cmake_windows_files.cmake @@ -10,14 +10,8 @@ # set(FILES - AWSGameLiftServerSDK_windows.cmake BuiltInPackages_windows.cmake - Clang_windows.cmake - Crashpad_windows.cmake - DirectXShaderCompiler_windows.cmake dyad_windows.cmake FbxSdk_windows.cmake - libav_windows.cmake - OpenSSL_windows.cmake Wwise_windows.cmake ) diff --git a/cmake/3rdParty/Platform/Windows/libav_windows.cmake b/cmake/3rdParty/Platform/Windows/libav_windows.cmake deleted file mode 100644 index f41cde4089..0000000000 --- a/cmake/3rdParty/Platform/Windows/libav_windows.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(LIBAV_LIB_PATH ${BASE_PATH}/usr/bin/) -set(LIBAV_LIBS - avcodec - avdevice - avfilter - avformat - avresample - avutil - swscale -) - -list(TRANSFORM LIBAV_LIBS PREPEND ${LIBAV_LIB_PATH}${CMAKE_STATIC_LIBRARY_PREFIX}) -list(TRANSFORM LIBAV_LIBS APPEND "${CMAKE_STATIC_LIBRARY_SUFFIX}") - - -set(LIBAV_SHARED - avcodec-56 - avdevice-55 - avfilter-5 - avformat-56 - avresample-2 - avutil-54 - libogg-0 - libopus-0 - libvo-aacenc-0 - libvorbis-0 - libvorbisenc-2 - swscale-3 - zlib1 -) - -list(TRANSFORM LIBAV_SHARED PREPEND ${LIBAV_LIB_PATH}${CMAKE_SHARED_LIBRARY_PREFIX}) -list(TRANSFORM LIBAV_SHARED APPEND "${CMAKE_SHARED_LIBRARY_SUFFIX}") -list(JOIN LIBAV_SHARED ";" LIBAV_SHARED_STRING) -set(LIBAV_RUNTIME_DEPENDENCIES ${LIBAV_SHARED_STRING}) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index d7b4dc650d..e742f0c463 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -11,7 +11,6 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME zlib-1.2.8-rev2-multiplatform TARGETS zlib PACKAGE_HASH e6f34b8ac16acf881e3d666ef9fd0c1aee94c3f69283fb6524d35d6f858eebbb) -ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev3-multiplatform TARGETS Lua PACKAGE_HASH 171dcdd60bd91fb325feaab0e53dd185c9d6e7b701d53e66fc6c2c6ee91d8bff) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-multiplatform TARGETS RapidJSON PACKAGE_HASH 18b0aef4e6e849389916ff6de6682ab9c591ebe15af6ea6017014453c1119ea1) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) @@ -26,8 +25,10 @@ ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-ios TARGETS AWSNativeSDK PACKAGE_HASH 1246219a213ccfff76b526011febf521586d44dbc1753e474f8fb5fd861654a4) -ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev1-ios TARGETS PhysX PACKAGE_HASH a2a48a09128337c72b9c2c1b8f43187c6c914e8509c9c6cd91810108748d7e09) +ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-ios TARGETS Lua PACKAGE_HASH c2d3c4e67046c293049292317a7d60fdb8f23effeea7136aefaef667163e5ffe) +ly_associate_package(PACKAGE_NAME PhysX-4.1.0.25992954-rev2-ios TARGETS PhysX PACKAGE_HASH 27e68bd90915dbd0bd5f26cae714e9a137f6b1aa8a8e0bf354a4a9176aa553d5) ly_associate_package(PACKAGE_NAME mikkelsen-1.0.0.4-ios TARGETS mikkelsen PACKAGE_HASH 976aaa3ccd8582346132a10af253822ccc5d5bcc9ea5ba44d27848f65ee88a8a) ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-ios TARGETS googletest PACKAGE_HASH 2f121ad9784c0ab73dfaa58e1fee05440a82a07cc556bec162eeb407688111a7) ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-ios TARGETS GoogleBenchmark PACKAGE_HASH c2ffaed2b658892b1bcf81dee4b44cd1cb09fc78d55584ef5cb8ab87f2d8d1ae) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-ios TARGETS libsamplerate PACKAGE_HASH 7656b961697f490d4f9c35d2e61559f6fc38c32102e542a33c212cd618fc2119) +ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-ios TARGETS OpenSSL PACKAGE_HASH cd0dfce3086a7172777c63dadbaf0ac3695b676119ecb6d0614b5fb1da03462f) diff --git a/cmake/3rdParty/Platform/iOS/OpenSSL_ios.cmake b/cmake/3rdParty/Platform/iOS/OpenSSL_ios.cmake deleted file mode 100644 index 7fc983d879..0000000000 --- a/cmake/3rdParty/Platform/iOS/OpenSSL_ios.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -set(OPENSSL_LIBS - ${BASE_PATH}/lib/ios_arm64_$<IF:$<CONFIG:Debug>,debug,release>/libcrypto.a - ${BASE_PATH}/lib/ios_arm64_$<IF:$<CONFIG:Debug>,debug,release>/libssl.a -) diff --git a/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake b/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake index e32a9f75bb..2a2a6737e5 100644 --- a/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake +++ b/cmake/3rdParty/Platform/iOS/cmake_ios_files.cmake @@ -11,7 +11,6 @@ set(FILES BuiltInPackages_ios.cmake - OpenSSL_ios.cmake RadTelemetry_ios.cmake Wwise_ios.cmake -) \ No newline at end of file +) diff --git a/cmake/3rdParty/cmake_files.cmake b/cmake/3rdParty/cmake_files.cmake index 46b612df42..a4737b7020 100644 --- a/cmake/3rdParty/cmake_files.cmake +++ b/cmake/3rdParty/cmake_files.cmake @@ -11,15 +11,10 @@ set(FILES BuiltInPackages.cmake - FindAWSGameLiftServerSDK.cmake - Findcivetweb.cmake FindClang.cmake - FindDirectXShaderCompiler.cmake Finddyad.cmake FindFbxSdk.cmake - Findlibav.cmake FindOpenGLInterface.cmake - FindOpenSSL.cmake FindRadTelemetry.cmake FindVkValidation.cmake FindWwise.cmake diff --git a/cmake/3rdPartyPackages.cmake b/cmake/3rdPartyPackages.cmake index 3984111996..b3545fd415 100644 --- a/cmake/3rdPartyPackages.cmake +++ b/cmake/3rdPartyPackages.cmake @@ -621,7 +621,6 @@ endfunction() # - this waill cause it to automatically download and activate this package if it finds a target that # depends on '3rdParty::zlib' in its runtime or its build time dependency list. # - note that '3rdParty' is implied, do not specify it in the TARGETS list. - function(ly_associate_package) set(_oneValueArgs PACKAGE_NAME PACKAGE_HASH) set(_multiValueArgs TARGETS) @@ -643,6 +642,9 @@ function(ly_associate_package) set_property(GLOBAL PROPERTY LY_PACKAGE_ASSOCIATION_${find_package_name} ${ly_associate_package_PACKAGE_NAME}) set_property(GLOBAL PROPERTY LY_PACKAGE_HASH_${ly_associate_package_PACKAGE_NAME} ${ly_associate_package_PACKAGE_HASH}) endforeach() + + set_property(GLOBAL APPEND PROPERTY LY_PACKAGE_NAMES ${ly_associate_package_PACKAGE_NAME}) + set_property(GLOBAL PROPERTY LY_PACKAGE_TARGETS_${ly_associate_package_PACKAGE_NAME} ${ly_associate_package_TARGETS}) endfunction() #! Given a package find_package name (eg, 'zlib' not the actual package name) diff --git a/cmake/CPack.cmake b/cmake/CPack.cmake new file mode 100644 index 0000000000..687021587b --- /dev/null +++ b/cmake/CPack.cmake @@ -0,0 +1,103 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +if(NOT PAL_TRAIT_BUILD_CPACK_SUPPORTED) + return() +endif() + +set(LY_QTIFW_PATH "" CACHE PATH "Path to the Qt Installer Framework install path") + +if(LY_QTIFW_PATH) + file(TO_CMAKE_PATH ${LY_QTIFW_PATH} CPACK_IFW_ROOT) +elseif(DEFINED ENV{QTIFWDIR}) + file(TO_CMAKE_PATH $ENV{QTIFWDIR} CPACK_IFW_ROOT) +endif() + +if(CPACK_IFW_ROOT) + if(NOT EXISTS ${CPACK_IFW_ROOT}) + message(FATAL_ERROR "Invalid path supplied for LY_QTIFW_PATH argument or QTIFWDIR environment variable") + endif() +else() + # early out as no path to QtIFW has been supplied effectively disabling support + return() +endif() + +set(CPACK_GENERATOR "IFW") + +set(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}") +set(CPACK_PACKAGE_VERSION "${LY_VERSION_STRING}") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Installation Tool") + +string(TOLOWER ${PROJECT_NAME} _project_name_lower) +set(CPACK_PACKAGE_FILE_NAME "${_project_name_lower}_installer") + +set(DEFAULT_LICENSE_NAME "Apache-2.0") +set(DEFAULT_LICENSE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt") + +set(CPACK_RESOURCE_FILE_LICENSE ${DEFAULT_LICENSE_FILE}) + +set(CPACK_IFW_PACKAGE_TITLE "${PROJECT_NAME} Installer") +set(CPACK_IFW_PACKAGE_PUBLISHER "${PROJECT_NAME}") + +set(CPACK_IFW_TARGET_DIRECTORY "@ApplicationsDir@/${PROJECT_NAME}/${LY_VERSION_STRING}") +set(CPACK_IFW_PACKAGE_START_MENU_DIRECTORY "${PROJECT_NAME}") + +# IMPORTANT: required to be included AFTER setting all property overrides +include(CPack REQUIRED) +include(CPackIFW REQUIRED) + +function(ly_configure_cpack_component ly_configure_cpack_component_NAME) + + set(options REQUIRED) + set(oneValueArgs DISPLAY_NAME DESCRIPTION LICENSE_NAME LICENSE_FILE) + set(multiValueArgs) + + cmake_parse_arguments(ly_configure_cpack_component "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # default to optional + set(component_type DISABLED) + set(ifw_component_type) + + if(ly_configure_cpack_component_REQUIRED) + set(component_type REQUIRED) + set(ifw_component_type FORCED_INSTALLATION) + endif() + + set(license_name ${DEFAULT_LICENSE_NAME}) + set(license_file ${DEFAULT_LICENSE_FILE}) + + if(ly_configure_cpack_component_LICENSE_NAME AND ly_configure_cpack_component_LICENSE_FILE) + set(license_name ${ly_configure_cpack_component_LICENSE_NAME}) + set(license_file ${ly_configure_cpack_component_LICENSE_FILE}) + elseif(ly_configure_cpack_component_LICENSE_NAME OR ly_configure_cpack_component_LICENSE_FILE) + message(FATAL_ERROR "Invalid argument configuration. Both LICENSE_NAME and LICENSE_FILE must be set for ly_configure_cpack_component") + endif() + + cpack_add_component( + ${ly_configure_cpack_component_NAME} ${component_type} + DISPLAY_NAME ${ly_configure_cpack_component_DISPLAY_NAME} + DESCRIPTION ${ly_configure_cpack_component_DESCRIPTION} + ) + + cpack_ifw_configure_component( + ${ly_configure_cpack_component_NAME} ${ifw_component_type} + LICENSES + ${license_name} + ${license_file} + ) +endfunction() + +# configure ALL components here +ly_configure_cpack_component( + ${LY_DEFAULT_INSTALL_COMPONENT} REQUIRED + DISPLAY_NAME "${PROJECT_NAME} Core" + DESCRIPTION "${PROJECT_NAME} Headers, Libraries and Tools" +) diff --git a/cmake/FindTarget.cmake.in b/cmake/FindTarget.cmake.in index 7d0129d05a..8ad9822dae 100644 --- a/cmake/FindTarget.cmake.in +++ b/cmake/FindTarget.cmake.in @@ -14,32 +14,21 @@ include(FindPackageHandleStandardArgs) ly_add_target( - -NAME @NAME_PLACEHOLDER@ UNKNOWN IMPORTED - -@NAMESPACE_PLACEHOLDER@ - -@INCLUDE_DIRECTORIES_PLACEHOLDER@ - -@BUILD_DEPENDENCIES_PLACEHOLDER@ - -@RUNTIME_DEPENDENCIES_PLACEHOLDER@ - + NAME @NAME_PLACEHOLDER@ UNKNOWN IMPORTED + @NAMESPACE_PLACEHOLDER@ + COMPILE_DEFINITIONS + INTERFACE @COMPILE_DEFINITIONS_PLACEHOLDER@ + INCLUDE_DIRECTORIES + INTERFACE +@INCLUDE_DIRECTORIES_PLACEHOLDER@ + BUILD_DEPENDENCIES + INTERFACE +@BUILD_DEPENDENCIES_PLACEHOLDER@ + RUNTIME_DEPENDENCIES +@RUNTIME_DEPENDENCIES_PLACEHOLDER@ ) -# The below if was generated from if (NOT HEADER_ONLY_PLACEHOLDER) -# HEADER_ONLY_PLACEHOLDER evaluates to TRUE or FALSE -if (NOT @HEADER_ONLY_PLACEHOLDER@) - # Load information for each installed configuration. - foreach(config @ALL_CONFIGS@) - set(@NAME_PLACEHOLDER@_${config}_FOUND FALSE) - include("${LY_ROOT_FOLDER}/cmake_autogen/@NAME_PLACEHOLDER@/@NAME_PLACEHOLDER@_${config}.cmake") - endforeach() - - find_package_handle_standard_args(@NAME_PLACEHOLDER@ - "Could not find package @NAME_PLACEHOLDER@" - @TARGET_CONFIG_FOUND_VARS_PLACEHOLDER@) -else() - set(@NAME_PLACEHOLDER@_FOUND TRUE) -endif() \ No newline at end of file +foreach(config @CMAKE_CONFIGURATION_TYPES@) + include("${LY_ROOT_FOLDER}/cmake_autogen/@NAME_PLACEHOLDER@/@NAME_PLACEHOLDER@_${config}.cmake" OPTIONAL) +endforeach() diff --git a/cmake/FindTargetTemplate.cmake b/cmake/FindTargetTemplate.cmake deleted file mode 100644 index 7d0129d05a..0000000000 --- a/cmake/FindTargetTemplate.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -# Generated by O3DE - -include(FindPackageHandleStandardArgs) - -ly_add_target( - -NAME @NAME_PLACEHOLDER@ UNKNOWN IMPORTED - -@NAMESPACE_PLACEHOLDER@ - -@INCLUDE_DIRECTORIES_PLACEHOLDER@ - -@BUILD_DEPENDENCIES_PLACEHOLDER@ - -@RUNTIME_DEPENDENCIES_PLACEHOLDER@ - -@COMPILE_DEFINITIONS_PLACEHOLDER@ -) - -# The below if was generated from if (NOT HEADER_ONLY_PLACEHOLDER) -# HEADER_ONLY_PLACEHOLDER evaluates to TRUE or FALSE -if (NOT @HEADER_ONLY_PLACEHOLDER@) - # Load information for each installed configuration. - foreach(config @ALL_CONFIGS@) - set(@NAME_PLACEHOLDER@_${config}_FOUND FALSE) - include("${LY_ROOT_FOLDER}/cmake_autogen/@NAME_PLACEHOLDER@/@NAME_PLACEHOLDER@_${config}.cmake") - endforeach() - - find_package_handle_standard_args(@NAME_PLACEHOLDER@ - "Could not find package @NAME_PLACEHOLDER@" - @TARGET_CONFIG_FOUND_VARS_PLACEHOLDER@) -else() - set(@NAME_PLACEHOLDER@_FOUND TRUE) -endif() \ No newline at end of file diff --git a/cmake/Findo3de.cmake.in b/cmake/Findo3de.cmake.in index 7ecb73e874..5a56de0851 100644 --- a/cmake/Findo3de.cmake.in +++ b/cmake/Findo3de.cmake.in @@ -15,7 +15,7 @@ include(FindPackageHandleStandardArgs) # This will be called from within the installed engine's CMakeLists.txt macro(ly_find_o3de_packages) - @FIND_PACKAGES_PLACEHOLDER@ +@FIND_PACKAGES_PLACEHOLDER@ find_package(LauncherGenerator) endmacro() diff --git a/cmake/Findo3deTemplate.cmake b/cmake/Findo3deTemplate.cmake deleted file mode 100644 index 0e904fd95d..0000000000 --- a/cmake/Findo3deTemplate.cmake +++ /dev/null @@ -1,35 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -# Generated by O3DE - -include(FindPackageHandleStandardArgs) - -# This will be called from within the installed engine's CMakeLists.txt -macro(ly_find_o3de_packages) - @FIND_PACKAGES_PLACEHOLDER@ - find_package(LauncherGenerator) -endmacro() - - -function(o3de_current_file_path path) - set(${path} ${CMAKE_CURRENT_FUNCTION_LIST_DIR} PARENT_SCOPE) -endfunction() - - -# We are using the engine's CMakeLists.txt to handle initialization/importing targets -# Since this is external to the project's source, we need to specify an output directory -# even though we don't build -macro(o3de_initialize) - set(LY_PROJECTS ${CMAKE_SOURCE_DIR}) - o3de_current_file_path(current_path) - add_subdirectory(${current_path}/.. o3de) -endmacro() \ No newline at end of file diff --git a/cmake/Initialize.cmake b/cmake/GeneralSettings.cmake similarity index 67% rename from cmake/Initialize.cmake rename to cmake/GeneralSettings.cmake index 474ea39dd6..a7e6849119 100644 --- a/cmake/Initialize.cmake +++ b/cmake/GeneralSettings.cmake @@ -9,20 +9,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -include(cmake/LySet.cmake) - # Turn on the ability to create folders to organize projects (.vcproj) # It creates "CMakePredefinedTargets" folder by default and adds CMake # defined projects like INSTALL.vcproj and ZERO_CHECK.vcproj set_property(GLOBAL PROPERTY USE_FOLDERS ON) ly_set(CMAKE_WARN_DEPRECATED ON) -# Set output directories -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Build directory for static libraries and import libraries") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build directory for shared libraries") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build directory for executables") -set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Installation prefix") - set(LY_EXTERNAL_SUBDIRS "" CACHE STRING "Additional list of subdirectory to recurse into via the cmake `add_subdirectory()` command. \ The subdirectories are included after the restricted platform folders have been visited by a call to `add_subdirectory(restricted/\${restricted_platform})`") diff --git a/cmake/LYPython.cmake b/cmake/LYPython.cmake index 14ea19a96a..ff5132097c 100644 --- a/cmake/LYPython.cmake +++ b/cmake/LYPython.cmake @@ -268,6 +268,7 @@ if (NOT CMAKE_SCRIPT_MODE_FILE) ly_pip_install_local_package_editable(${LY_ROOT_FOLDER}/Tools/LyTestTools ly-test-tools) ly_pip_install_local_package_editable(${LY_ROOT_FOLDER}/Tools/RemoteConsole/ly_remote_console ly-remote-console) + ly_pip_install_local_package_editable(${LY_ROOT_FOLDER}/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools editor-python-test-tools) endif() endif() diff --git a/cmake/LYTestWrappers.cmake b/cmake/LYTestWrappers.cmake index 73a212ee0b..6bd809ec41 100644 --- a/cmake/LYTestWrappers.cmake +++ b/cmake/LYTestWrappers.cmake @@ -337,22 +337,24 @@ function(ly_add_editor_python_test) message(FATAL_ERROR "Must supply a value for TEST_SUITE") endif() + file(REAL_PATH ${ly_add_editor_python_test_TEST_PROJECT} project_real_path BASE_DIRECTORY ${LY_ROOT_FOLDER}) + # Run test via the run_epbtest.cmake script. # Parameters used are explained in run_epbtest.cmake. ly_add_test( NAME ${ly_add_editor_python_test_NAME} TEST_REQUIRES ${ly_add_editor_python_test_TEST_REQUIRES} TEST_COMMAND ${CMAKE_COMMAND} - -DCMD_ARG_TEST_PROJECT=${ly_add_editor_python_test_TEST_PROJECT} + -DCMD_ARG_TEST_PROJECT=${project_real_path} -DCMD_ARG_EDITOR=$<TARGET_FILE:Legacy::Editor> -DCMD_ARG_PYTHON_SCRIPT=${ly_add_editor_python_test_PATH} -DPLATFORM=${PAL_PLATFORM_NAME} -P ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/run_epbtest.cmake RUNTIME_DEPENDENCIES - ${ly_add_editor_python_test_RUNTIME_DEPENDENCIES} - Gem::EditorPythonBindings.Editor - Legacy::CryRenderNULL - Legacy::Editor + ${ly_add_editor_python_test_RUNTIME_DEPENDENCIES} + Gem::EditorPythonBindings.Editor + Legacy::CryRenderNULL + Legacy::Editor TEST_SUITE ${ly_add_editor_python_test_TEST_SUITE} LABELS FRAMEWORK_pytest TEST_LIBRARY pytest_editor @@ -360,7 +362,7 @@ function(ly_add_editor_python_test) COMPONENT ${ly_add_editor_python_test_COMPONENT} ) - set_tests_properties(${LY_ADDED_TEST_NAME} PROPERTIES RUN_SERIAL "${ly_add_pytest_TEST_SERIAL}") + set_tests_properties(${LY_ADDED_TEST_NAME} PROPERTIES RUN_SERIAL "${ly_add_editor_python_test_TEST_SERIAL}") set_property(GLOBAL APPEND PROPERTY LY_ALL_TESTS_${LY_ADDED_TEST_NAME}_SCRIPT_PATH ${ly_add_editor_python_test_PATH}) endfunction() diff --git a/cmake/LYWrappers.cmake b/cmake/LYWrappers.cmake index bd904adaa3..a860bcfd20 100644 --- a/cmake/LYWrappers.cmake +++ b/cmake/LYWrappers.cmake @@ -37,7 +37,7 @@ define_property(TARGET PROPERTY GEM_MODULE # # Adds a target (static/dynamic library, executable) and convenient wrappers around most # common parameters that need to be set. -# This function also creates an interface to use for dependencies. The interface will be +# This function also creates an interface to use for dependencies. The interface will be # named as "NAMESPACE::NAME" # Some examples: # ly_add_target(NAME mystaticlib STATIC FILES_CMAKE somestatic_files.cmake) @@ -81,7 +81,7 @@ function(ly_add_target) set(multiValueArgs FILES_CMAKE GENERATED_FILES INCLUDE_DIRECTORIES COMPILE_DEFINITIONS BUILD_DEPENDENCIES RUNTIME_DEPENDENCIES PLATFORM_INCLUDE_FILES TARGET_PROPERTIES AUTOGEN_RULES) cmake_parse_arguments(ly_add_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - + # Validate input arguments if(NOT ly_add_target_NAME) message(FATAL_ERROR "You must provide a name for the target") @@ -189,7 +189,7 @@ function(ly_add_target) endif() if(ly_add_target_OUTPUT_NAME) - set_target_properties(${ly_add_target_NAME} PROPERTIES + set_target_properties(${ly_add_target_NAME} PROPERTIES OUTPUT_NAME ${ly_add_target_OUTPUT_NAME} ) endif() @@ -214,7 +214,7 @@ function(ly_add_target) ) endif() - # Parse the 3rdParty library dependencies + # Parse the 3rdParty library dependencies ly_parse_third_party_dependencies("${ly_add_target_BUILD_DEPENDENCIES}") ly_target_link_libraries(${ly_add_target_NAME} ${ly_add_target_BUILD_DEPENDENCIES} @@ -252,7 +252,7 @@ function(ly_add_target) ) endif() endif() - + # IDE organization ly_source_groups_from_folders("${ALLFILES}") source_group("Generated Files" REGULAR_EXPRESSION "(${CMAKE_BINARY_DIR})") # Any file coming from the output folder @@ -276,8 +276,8 @@ function(ly_add_target) # Handle Qt MOC, RCC, UIC # https://gitlab.kitware.com/cmake/cmake/issues/18749 - # AUTOMOC is supposed to always rebuild because it checks files that are not listed in the sources (like extra - # "_p.h" headers) and which may change outside the visibility of the generator. + # AUTOMOC is supposed to always rebuild because it checks files that are not listed in the sources (like extra + # "_p.h" headers) and which may change outside the visibility of the generator. # We are not using AUTOUIC because of: # https://gitlab.kitware.com/cmake/cmake/-/issues/18741 # To overcome this problem, we manually wrap all the ui files listed in the target with qt5_wrap_ui @@ -332,12 +332,16 @@ function(ly_add_target) ly_add_autogen( NAME ${ly_add_target_NAME} INCLUDE_DIRECTORIES ${ly_add_target_INCLUDE_DIRECTORIES} - AUTOGEN_RULES ${ly_add_target_AUTOGEN_RULES} + AUTOGEN_RULES ${ly_add_target_AUTOGEN_RULES} ALLFILES ${ALLFILES} ) endif() if(NOT ly_add_target_IMPORTED) + if(NOT ly_add_target_INSTALL_COMPONENT) + set(ly_add_target_INSTALL_COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT}) + endif() + ly_install_target( ${ly_add_target_NAME} NAMESPACE ${ly_add_target_NAMESPACE} @@ -345,15 +349,16 @@ function(ly_add_target) BUILD_DEPENDENCIES ${ly_add_target_BUILD_DEPENDENCIES} RUNTIME_DEPENDENCIES ${ly_add_target_RUNTIME_DEPENDENCIES} COMPILE_DEFINITIONS ${ly_add_target_COMPILE_DEFINITIONS} + COMPONENT ${ly_add_target_INSTALL_COMPONENT} ) endif() endfunction() #! ly_target_link_libraries: wraps target_link_libraries handling also MODULE linkage. -# MODULE libraries cannot be passed to target_link_libraries. MODULE libraries are shared libraries that we +# MODULE libraries cannot be passed to target_link_libraries. MODULE libraries are shared libraries that we # dont want to link against because they will be loaded dynamically. However, we want to include their public headers -# and transition their public dependencies. +# and transition their public dependencies. # To achieve this, we delay the target_link_libraries call to after all targets are declared (see ly_delayed_target_link_libraries) # # Signature is the same as target_link_libraries: @@ -364,26 +369,26 @@ function(ly_target_link_libraries TARGET) if(NOT TARGET) message(FATAL_ERROR "You must provide a target") endif() - + set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LINK_${TARGET} ${ARGN}) set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LINK_TARGETS ${TARGET}) # to walk them at the end endfunction() #! ly_delayed_target_link_libraries: internal function called by the root CMakeLists.txt after all targets -# have been declared to determine if they are regularly +# have been declared to determine if they are regularly # 1) If a MODULE is passed in the list of items, it will add the INTERFACE_INCLUDE_DIRECTORIES as include # directories of TARGET. It will also add the "INTERFACE_LINK_LIBRARIES" to TARGET. MODULEs cannot be # directly linked, but we can include the public headers and link against the things the MODULE expose # to link. # 2) If a target that has not yet been declared is passed, then it will defer it to after all targets are -# declared. This way we can do a check again. We could delay the link to when +# declared. This way we can do a check again. We could delay the link to when # target is declared. This is needed for (1) since we dont know the type of target. This also addresses # another issue with target_link_libraries where it will only validate that a MODULE is not being passed # if the target is already declared, if not, it will fail later at linking time. function(ly_delayed_target_link_libraries) - + set(visibilities PRIVATE PUBLIC INTERFACE) get_property(additional_module_paths GLOBAL PROPERTY LY_ADDITIONAL_MODULE_PATH) @@ -391,15 +396,15 @@ function(ly_delayed_target_link_libraries) get_property(delayed_targets GLOBAL PROPERTY LY_DELAYED_LINK_TARGETS) foreach(target ${delayed_targets}) - + get_property(delayed_link GLOBAL PROPERTY LY_DELAYED_LINK_${target}) if(delayed_link) - + cmake_parse_arguments(ly_delayed_target_link_libraries "" "" "${visibilities}" ${delayed_link}) foreach(visibility ${visibilities}) foreach(item ${ly_delayed_target_link_libraries_${visibility}}) - + if(TARGET ${item}) get_target_property(item_type ${item} TYPE) else() @@ -412,7 +417,7 @@ function(ly_delayed_target_link_libraries) target_compile_definitions(${target} ${visibility} $<TARGET_PROPERTY:${item},INTERFACE_COMPILE_DEFINITIONS>) target_compile_options(${target} ${visibility} $<TARGET_PROPERTY:${item},INTERFACE_COMPILE_OPTIONS>) # Add it also as a manual dependency so runtime_dependencies walks it through - ly_add_dependencies(${target} ${item}) + ly_add_dependencies(${target} ${item}) else() ly_parse_third_party_dependencies(${item}) target_link_libraries(${target} ${visibility} ${item}) @@ -484,7 +489,7 @@ function(detect_qt_dependency TARGET_NAME OUTPUT_VARIABLE) endfunction() #! ly_parse_third_party_dependencies: Validates any 3rdParty library dependencies through the find_package command -# +# # \arg:ly_THIRD_PARTY_LIBRARIES name of the target libraries to validate existance of through the find_package command. # function(ly_parse_third_party_dependencies ly_THIRD_PARTY_LIBRARIES) @@ -518,7 +523,7 @@ endfunction() # macro(ly_configure_target_platform_properties) foreach(platform_include_file ${ly_add_target_PLATFORM_INCLUDE_FILES}) - + set(LY_FILES_CMAKE) set(LY_FILES) set(LY_INCLUDE_DIRECTORIES) @@ -528,7 +533,7 @@ macro(ly_configure_target_platform_properties) set(LY_BUILD_DEPENDENCIES) set(LY_RUNTIME_DEPENDENCIES) set(LY_TARGET_PROPERTIES) - + include(${platform_include_file} RESULT_VARIABLE ly_platform_cmake_file) if(NOT ly_platform_cmake_file) message(FATAL_ERROR "The supplied PLATFORM_INCLUDE_FILE(${platform_include_file}) cannot be included.\ @@ -578,7 +583,7 @@ endmacro() # # \arg:TARGETS name of the targets that depends on this file # \arg:FILES files to copy -# \arg:OUTPUT_SUBDIRECTORY (OPTIONAL) where to place the files relative to TARGET_NAME's output dir. +# \arg:OUTPUT_SUBDIRECTORY (OPTIONAL) where to place the files relative to TARGET_NAME's output dir. # If not specified, they are located in the same folder as TARGET_NAME # function(ly_add_target_files) @@ -596,9 +601,9 @@ function(ly_add_target_files) if(NOT ly_add_target_files_FILES) message(FATAL_ERROR "You must provide at least a file to copy") endif() - + foreach(target ${ly_add_target_files_TARGETS}) - + foreach(file ${ly_add_target_files_FILES}) set_property(TARGET ${target} APPEND PROPERTY INTERFACE_LY_TARGET_FILES "${file}\n${ly_add_target_files_OUTPUT_SUBDIRECTORY}") endforeach() diff --git a/Code/Tools/CrySCompileServer/CMakeLists.txt b/cmake/OutputDirectory.cmake similarity index 53% rename from Code/Tools/CrySCompileServer/CMakeLists.txt rename to cmake/OutputDirectory.cmake index 84725a9d13..9055802d39 100644 --- a/Code/Tools/CrySCompileServer/CMakeLists.txt +++ b/cmake/OutputDirectory.cmake @@ -9,4 +9,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -add_subdirectory(CrySCompileServer) +# Set output directories +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Build directory for static libraries and import libraries") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build directory for shared libraries") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build directory for executables") +set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Installation prefix") diff --git a/cmake/PAL.cmake b/cmake/PAL.cmake index 734baad8a3..c7adb660f0 100644 --- a/cmake/PAL.cmake +++ b/cmake/PAL.cmake @@ -63,10 +63,12 @@ function(ly_get_absolute_pal_filename out_name in_name) set(full_name ${in_name}) if (NOT EXISTS ${full_name}) string(REGEX MATCH "${repo_dir}/(.*)/Platform/([^/]*)/?(.*)$" match ${full_name}) - if(${CMAKE_MATCH_2} IN_LIST PAL_RESTRICTED_PLATFORMS) - set(full_name ${repo_dir}/restricted/${CMAKE_MATCH_2}/${CMAKE_MATCH_1}) - if(NOT "${CMAKE_MATCH_3}" STREQUAL "") - string(APPEND full_name "/" ${CMAKE_MATCH_3}) + if(PAL_RESTRICTED_PLATFORMS) + if("${CMAKE_MATCH_2}" IN_LIST PAL_RESTRICTED_PLATFORMS) + set(full_name ${repo_dir}/restricted/${CMAKE_MATCH_2}/${CMAKE_MATCH_1}) + if(NOT "${CMAKE_MATCH_3}" STREQUAL "") + string(APPEND full_name "/" ${CMAKE_MATCH_3}) + endif() endif() endif() endif() @@ -85,3 +87,9 @@ ly_include_cmake_file_list(${pal_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_fi include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) include(${pal_dir}/Toolchain_${PAL_PLATFORM_NAME_LOWERCASE}.cmake OPTIONAL) + +set(LY_DISABLE_TEST_MODULES FALSE CACHE BOOL "Option to forcibly disable the inclusion of test targets in the build") + +if(LY_DISABLE_TEST_MODULES) + ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED FALSE) +endif() diff --git a/cmake/Platform/Android/PAL_android.cmake b/cmake/Platform/Android/PAL_android.cmake index 80739d4208..bd76076467 100644 --- a/cmake/Platform/Android/PAL_android.cmake +++ b/cmake/Platform/Android/PAL_android.cmake @@ -19,6 +19,7 @@ ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS) ly_set(PAL_TRAIT_BUILD_EXCLUDE_ALL_TEST_RUNS_FROM_IDE TRUE) +ly_set(PAL_TRAIT_BUILD_CPACK_SUPPORTED FALSE) # Test library support ly_set(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED FALSE) diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 7ac9a3afa8..b1a6da012b 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -9,12 +9,24 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +set(CMAKE_INSTALL_MESSAGE NEVER) # Simplify messages to reduce output noise + +ly_set(LY_DEFAULT_INSTALL_COMPONENT "Core") #! ly_install_target: registers the target to be installed by cmake install. # # \arg:NAME name of the target +# \arg:COMPONENT the grouping string of the target used for splitting up the install +# into smaller packages. +# All other parameters are forwarded to ly_generate_target_find_file function(ly_install_target ly_install_target_NAME) + set(options) + set(oneValueArgs NAMESPACE COMPONENT) + set(multiValueArgs INCLUDE_DIRECTORIES BUILD_DEPENDENCIES RUNTIME_DEPENDENCIES COMPILE_DEFINITIONS) + + cmake_parse_arguments(ly_install_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + # All include directories marked PUBLIC or INTERFACE will be installed set(include_location "include") get_target_property(include_directories ${ly_install_target_NAME} INTERFACE_INCLUDE_DIRECTORIES) @@ -28,36 +40,49 @@ function(ly_install_target ly_install_target_NAME) string(APPEND include_location "/${relative_path}") endif() + # Get the output folders, archive is always the same, but runtime/library can be in subfolders defined per target + file(RELATIVE_PATH archive_output_directory ${CMAKE_BINARY_DIR} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) + + get_target_property(target_runtime_output_directory ${ly_install_target_NAME} RUNTIME_OUTPUT_DIRECTORY) + if(target_runtime_output_directory) + file(RELATIVE_PATH target_runtime_output_subdirectory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${target_runtime_output_directory}) + endif() + file(RELATIVE_PATH runtime_output_directory ${CMAKE_BINARY_DIR} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + + get_target_property(target_library_output_directory ${ly_install_target_NAME} LIBRARY_OUTPUT_DIRECTORY) + if(target_library_output_directory) + file(RELATIVE_PATH target_library_output_subdirectory ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${target_library_output_directory}) + endif() + file(RELATIVE_PATH library_output_directory ${CMAKE_BINARY_DIR} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + + install( + TARGETS ${ly_install_target_NAME} + ARCHIVE + DESTINATION ${archive_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG> + COMPONENT ${ly_install_target_COMPONENT} + LIBRARY + DESTINATION ${library_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/${target_library_output_subdirectory} + COMPONENT ${ly_install_target_COMPONENT} + RUNTIME + DESTINATION ${runtime_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/${target_runtime_output_subdirectory} + COMPONENT ${ly_install_target_COMPONENT} + PUBLIC_HEADER + DESTINATION ${include_location} + COMPONENT ${ly_install_target_COMPONENT} + ) + ly_generate_target_find_file( NAME ${ly_install_target_NAME} ${ARGN} ) - - install( - TARGETS ${ly_install_target_NAME} - EXPORT ${ly_install_target_NAME}Targets - LIBRARY DESTINATION lib/$<CONFIG> - ARCHIVE DESTINATION lib/$<CONFIG> - RUNTIME DESTINATION bin/$<CONFIG> - PUBLIC_HEADER DESTINATION ${include_location} - ) - - install(EXPORT ${ly_install_target_NAME}Targets + ly_generate_target_config_file(${ly_install_target_NAME}) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${ly_install_target_NAME}_$<CONFIG>.cmake" DESTINATION cmake_autogen/${ly_install_target_NAME} + COMPONENT ${ly_install_target_COMPONENT} ) - - # Header only targets(i.e., INTERFACE) don't have outputs - get_target_property(target_type ${ly_install_target_NAME} TYPE) - if(NOT ${target_type} STREQUAL "INTERFACE_LIBRARY") - ly_generate_target_config_file(${ly_install_target_NAME}) - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${ly_install_target_NAME}_$<CONFIG>.cmake" - DESTINATION cmake_autogen/${ly_install_target_NAME} - ) - endif() - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Find${ly_install_target_NAME}.cmake" DESTINATION cmake + COMPONENT ${ly_install_target_COMPONENT} ) endfunction() @@ -66,75 +91,49 @@ endfunction() #! ly_generate_target_find_file: generates the Find${target}.cmake file which is used when importing installed packages. # # \arg:NAME name of the target -# \arg:INCLUDE_DIRECTORIES paths to the include directories # \arg:NAMESPACE namespace declaration for this target. It will be used for IDE and dependencies +# \arg:INCLUDE_DIRECTORIES paths to the include directories # \arg:BUILD_DEPENDENCIES list of interfaces this target depends on (could be a compilation dependency # if the dependency is only exposing an include path, or could be a linking # dependency is exposing a lib) # \arg:RUNTIME_DEPENDENCIES list of dependencies this target depends on at runtime # \arg:COMPILE_DEFINITIONS list of compilation definitions this target will use to compile function(ly_generate_target_find_file) - + set(options) set(oneValueArgs NAME NAMESPACE) - set(multiValueArgs COMPILE_DEFINITIONS BUILD_DEPENDENCIES RUNTIME_DEPENDENCIES INCLUDE_DIRECTORIES) + set(multiValueArgs INCLUDE_DIRECTORIES COMPILE_DEFINITIONS BUILD_DEPENDENCIES RUNTIME_DEPENDENCIES) cmake_parse_arguments(ly_generate_target_find_file "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - # These targets will be imported. So we strip PRIVATE properties. - # We can only set INTERFACE properties on imported targets - unset(build_dependencies_interface_props) - unset(compile_definitions_interface_props) - unset(include_directories_interface_props) - unset(installed_include_directories_interface_props) - ly_strip_non_interface_properties(build_dependencies_interface_props ${ly_generate_target_find_file_BUILD_DEPENDENCIES}) - ly_strip_non_interface_properties(compile_definitions_interface_props ${ly_generate_target_find_file_COMPILE_DEFINITIONS}) - ly_strip_non_interface_properties(include_directories_interface_props ${ly_generate_target_find_file_INCLUDE_DIRECTORIES}) - set(NAME_PLACEHOLDER ${ly_generate_target_find_file_NAME}) + unset(NAMESPACE_PLACEHOLDER) + unset(COMPILE_DEFINITIONS_PLACEHOLDER) + unset(include_directories_interface_props) + unset(INCLUDE_DIRECTORIES_PLACEHOLDER) + set(RUNTIME_DEPENDENCIES_PLACEHOLDER ${ly_generate_target_find_file_RUNTIME_DEPENDENCIES}) + + # These targets will be imported. We will expose PUBLIC and INTERFACE properties as INTERFACE properties since + # only INTERFACE properties can be exposed on imported targets + ly_strip_private_properties(COMPILE_DEFINITIONS_PLACEHOLDER ${ly_generate_target_find_file_COMPILE_DEFINITIONS}) + ly_strip_private_properties(include_directories_interface_props ${ly_generate_target_find_file_INCLUDE_DIRECTORIES}) + ly_strip_private_properties(BUILD_DEPENDENCIES_PLACEHOLDER ${ly_generate_target_find_file_BUILD_DEPENDENCIES}) + + if(ly_generate_target_find_file_NAMESPACE) + set(NAMESPACE_PLACEHOLDER "NAMESPACE ${ly_generate_target_find_file_NAMESPACE}") + endif() + + string(REPLACE ";" "\n" COMPILE_DEFINITIONS_PLACEHOLDER "${COMPILE_DEFINITIONS_PLACEHOLDER}") # Includes need additional processing to add the install root foreach(include ${include_directories_interface_props}) set(installed_include_prefix "\${LY_ROOT_FOLDER}/include/") file(RELATIVE_PATH relative_path ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${include}) - string(APPEND installed_include_prefix ${relative_path}) - list(APPEND installed_include_directories_interface_props ${installed_include_prefix}) + list(APPEND INCLUDE_DIRECTORIES_PLACEHOLDER "include/${relative_path}") endforeach() + string(REPLACE ";" "\n" INCLUDE_DIRECTORIES_PLACEHOLDER "${INCLUDE_DIRECTORIES_PLACEHOLDER}") - if(ly_generate_target_find_file_NAMESPACE) - set(NAMESPACE_PLACEHOLDER "NAMESPACE ${ly_generate_target_find_file_NAMESPACE}") - endif() - if(installed_include_directories_interface_props) - string(REPLACE ";" "\n" include_dirs "${installed_include_directories_interface_props}") - set(INCLUDE_DIRECTORIES_PLACEHOLDER "INCLUDE_DIRECTORIES\nINTERFACE\n${include_dirs}") - endif() - if(build_dependencies_interface_props) - string(REPLACE ";" "\n" build_deps "${build_dependencies_interface_props}") - set(BUILD_DEPENDENCIES_PLACEHOLDER "BUILD_DEPENDENCIES\nINTERFACE\n${build_deps}") - endif() - if(ly_generate_target_find_file_RUNTIME_DEPENDENCIES) - string(REPLACE ";" "\n" runtime_deps "${ly_generate_target_find_file_RUNTIME_DEPENDENCIES}") - set(RUNTIME_DEPENDENCIES_PLACEHOLDER "RUNTIME_DEPENDENCIES\n${runtime_deps}") - endif() - if(compile_definitions_interface_props) - string(REPLACE ";" "\n" compile_defs "${compile_definitions_interface_props}") - set(COMPILE_DEFINITIONS_PLACEHOLDER "COMPILE_DEFINITIONS\nINTERFACE\n${compile_defs}") - endif() - - string(REPLACE ";" " " ALL_CONFIGS "${CMAKE_CONFIGURATION_TYPES}") - - set(target_config_found_vars "") - foreach(config ${CMAKE_CONFIGURATION_TYPES}) - string(APPEND target_config_found_vars "\n${ly_generate_target_find_file_NAME}_${config}_FOUND") - endforeach() - set(TARGET_CONFIG_FOUND_VARS_PLACEHOLDER "${target_config_found_vars}") - - # Interface libs aren't built so they don't generate a library. These are our HEADER_ONLY targets. - get_target_property(target_type ${ly_generate_target_find_file_NAME} TYPE) - if(NOT ${target_type} STREQUAL "INTERFACE_LIBRARY") - set(HEADER_ONLY_PLACEHOLDER FALSE) - else() - set(HEADER_ONLY_PLACEHOLDER TRUE) - endif() + string(REPLACE ";" "\n" BUILD_DEPENDENCIES_PLACEHOLDER "${BUILD_DEPENDENCIES_PLACEHOLDER}") + string(REPLACE ";" "\n" RUNTIME_DEPENDENCIES_PLACEHOLDER "${RUNTIME_DEPENDENCIES_PLACEHOLDER}") configure_file(${LY_ROOT_FOLDER}/cmake/FindTarget.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/Find${ly_generate_target_find_file_NAME}.cmake @ONLY) @@ -147,38 +146,49 @@ endfunction() # These per config files will be included by the target's find file to set the location of the binary/ # \arg:NAME name of the target function(ly_generate_target_config_file NAME) - - # SHARED_LIBRARY is omitted from this list because we link to the implib on Windows - set(BINARY_DIR_OUTPUTS EXECUTABLE APPLICATION) - set(target_file_contents "") - if(${target_type} IN_LIST BINARY_DIR_OUTPUTS) - set(out_file_generator TARGET_FILE_NAME) - set(out_dir bin) - else() - set(out_file_generator TARGET_LINKER_FILE_NAME) - set(out_dir lib) - endif() - string(APPEND target_file_contents " -# Generated by O3DE + get_target_property(target_type ${NAME} TYPE) -set_target_properties(${NAME} PROPERTIES IMPORTED_LOCATION \"\${LY_ROOT_FOLDER}/${out_dir}/$<CONFIG>/$<${out_file_generator}:${NAME}>\") + set(target_file_contents "# Generated by O3DE install\n\n") + if(NOT target_type STREQUAL INTERFACE_LIBRARY) -if(EXISTS \"\${LY_ROOT_FOLDER}/${out_dir}/$<CONFIG>/$<${out_file_generator}:${NAME}>\") + unset(target_location) + set(runtime_types EXECUTABLE APPLICATION) + if(target_type IN_LIST runtime_types) + string(APPEND target_location "\"\${LY_ROOT_FOLDER}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/${target_runtime_output_subdirectory}/$<TARGET_FILE_NAME:${NAME}>\"") + elseif(target_type STREQUAL MODULE_LIBRARY) + string(APPEND target_location "\"\${LY_ROOT_FOLDER}/${library_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/${target_library_output_subdirectory}/$<TARGET_FILE_NAME:${NAME}>\"") + elseif(target_type STREQUAL SHARED_LIBRARY) + string(APPEND target_location "\"\${LY_ROOT_FOLDER}/${archive_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/$<TARGET_LINKER_FILE_NAME:${NAME}>\"") + string(APPEND target_file_contents "ly_add_dependencies(${NAME} \"\${LY_ROOT_FOLDER}/${library_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/${target_library_output_subdirectory}/$<TARGET_FILE_NAME:${NAME}>\")\n") + else() # STATIC_LIBRARY, OBJECT_LIBRARY, INTERFACE_LIBRARY + string(APPEND target_location "\"\${LY_ROOT_FOLDER}/${archive_output_directory}/${PAL_PLATFORM_NAME}/$<CONFIG>/$<TARGET_LINKER_FILE_NAME:${NAME}>\"") + endif() + + string(APPEND target_file_contents +"set(target_location ${target_location}) +set_target_properties(${NAME} + PROPERTIES + $<$<CONFIG:profile>:IMPORTED_LOCATION \"\${target_location}\"> + IMPORTED_LOCATION_$<UPPER_CASE:$<CONFIG>> \"\${target_location}\" +) +if(EXISTS \"\${target_location}\") set(${NAME}_$<CONFIG>_FOUND TRUE) else() set(${NAME}_$<CONFIG>_FOUND FALSE) -endif()") +endif() +") + endif() - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${NAME}_$<CONFIG>.cmake" CONTENT ${target_file_contents}) + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${NAME}_$<CONFIG>.cmake" CONTENT "${target_file_contents}") endfunction() -#! ly_strip_non_interface_properties: strips private properties since we're exporting an interface target +#! ly_strip_private_properties: strips private properties since we're exporting an interface target # # \arg:INTERFACE_PROPERTIES list of interface properties to be returned -function(ly_strip_non_interface_properties INTERFACE_PROPERTIES) +function(ly_strip_private_properties INTERFACE_PROPERTIES) set(reserved_keywords PRIVATE PUBLIC INTERFACE) unset(last_keyword) unset(stripped_props) @@ -196,69 +206,157 @@ function(ly_strip_non_interface_properties INTERFACE_PROPERTIES) endfunction() -#! ly_setup_o3de_install: generates the Findo3de.cmake file and setup install locations for scripts, tools, assets etc., +#! ly_setup_o3de_install: orchestrates the installation of the different parts. This is the entry point from the root CMakeLists.txt function(ly_setup_o3de_install) - - get_property(all_targets GLOBAL PROPERTY LY_ALL_TARGETS) - unset(find_package_list) - foreach(target IN LISTS all_targets) - list(APPEND find_package_list "find_package(${target})") - endforeach() - string(REPLACE ";" "\n" FIND_PACKAGES_PLACEHOLDER "${find_package_list}") + ly_setup_cmake_install() + ly_setup_target_generator() + ly_setup_others() - configure_file(${LY_ROOT_FOLDER}/cmake/Findo3de.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/Findo3de.cmake @ONLY) +endfunction() - ly_install_launcher_target_generator() +#! ly_setup_cmake_install: install the "cmake" folder +function(ly_setup_cmake_install) - ly_install_o3de_directories() - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Findo3de.cmake" - DESTINATION cmake + install(DIRECTORY "${CMAKE_SOURCE_DIR}/cmake" + DESTINATION . + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + REGEX "Findo3de.cmake" EXCLUDE + REGEX "Platform\/.*\/BuiltInPackages_.*\.cmake" EXCLUDE + ) + install( + FILES + "${CMAKE_SOURCE_DIR}/CMakeLists.txt" + "${CMAKE_SOURCE_DIR}/engine.json" + DESTINATION . + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) - install(FILES "${CMAKE_SOURCE_DIR}/CMakeLists.txt" - DESTINATION . + # Collect all Find files that were added with ly_add_external_target_path + unset(additional_find_files) + get_property(additional_module_paths GLOBAL PROPERTY LY_ADDITIONAL_MODULE_PATH) + foreach(additional_module_path ${additional_module_paths}) + unset(find_files) + file(GLOB find_files "${additional_module_path}/Find*.cmake") + list(APPEND additional_find_files "${find_files}") + endforeach() + install(FILES ${additional_find_files} + DESTINATION cmake/3rdParty + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + + # Findo3de.cmake file: we generate a different Findo3de.camke file than the one we have in cmake. This one is going to expose all + # targets that are pre-built + get_property(all_targets GLOBAL PROPERTY LY_ALL_TARGETS) + unset(FIND_PACKAGES_PLACEHOLDER) + foreach(target IN LISTS all_targets) + string(APPEND FIND_PACKAGES_PLACEHOLDER " find_package(${target})\n") + endforeach() + + configure_file(${LY_ROOT_FOLDER}/cmake/Findo3de.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/Findo3de.cmake @ONLY) + + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/Findo3de.cmake" + DESTINATION cmake + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + + # BuiltInPackage_<platform>.cmake: since associations could happen in any cmake file across the engine. We collect + # all the associations in ly_associate_package and then generate them into BuiltInPackages_<platform>.cmake. This + # will consolidate all associations in one file + get_property(all_package_names GLOBAL PROPERTY LY_PACKAGE_NAMES) + set(builtinpackages "# Generated by O3DE install\n\n") + foreach(package_name IN LISTS all_package_names) + get_property(package_hash GLOBAL PROPERTY LY_PACKAGE_HASH_${package_name}) + get_property(targets GLOBAL PROPERTY LY_PACKAGE_TARGETS_${package_name}) + string(APPEND builtinpackages "ly_associate_package(PACKAGE_NAME ${package_name} TARGETS ${targets} PACKAGE_HASH ${package_hash})\n") + endforeach() + + ly_get_absolute_pal_filename(pal_builtin_file ${CMAKE_CURRENT_BINARY_DIR}/cmake/3rdParty/Platform/${PAL_PLATFORM_NAME}/BuiltInPackages_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) + file(GENERATE OUTPUT ${pal_builtin_file} + CONTENT ${builtinpackages} + ) + install(FILES "${pal_builtin_file}" + DESTINATION cmake/3rdParty/Platform/${PAL_PLATFORM_NAME} + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) endfunction() - -#! ly_install_o3de_directories: install directories required by the engine -function(ly_install_o3de_directories) +#! ly_setup_others: install directories required by the engine +function(ly_setup_others) # List of directories we want to install relative to engine root - set(DIRECTORIES_TO_INSTALL Tools/LyTestTools Tools/RemoteConsole ctest_scripts scripts) + set(DIRECTORIES_TO_INSTALL Tools/LyTestTools Tools/RemoteConsole scripts) foreach(dir ${DIRECTORIES_TO_INSTALL}) - + get_filename_component(install_path ${dir} DIRECTORY) if (NOT install_path) set(install_path .) endif() - + install(DIRECTORY "${CMAKE_SOURCE_DIR}/${dir}" DESTINATION ${install_path} + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) endforeach() - # Directories which have excludes - install(DIRECTORY "${CMAKE_SOURCE_DIR}/cmake" - DESTINATION . - REGEX "Findo3de.cmake" EXCLUDE - ) - install(DIRECTORY "${CMAKE_SOURCE_DIR}/python" DESTINATION . + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} REGEX "downloaded_packages" EXCLUDE REGEX "runtime" EXCLUDE ) + # Registry + install(DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/bin/$<CONFIG>/Registry + DESTINATION ./bin/$<CONFIG> + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + install(DIRECTORY + # This one will change soon, Engine/Registry files will be relocated to Registry + ${CMAKE_SOURCE_DIR}/Engine/Registry + DESTINATION ./Engine + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + install(FILES + ${CMAKE_SOURCE_DIR}/AssetProcessorPlatformConfig.setreg + DESTINATION ./Registry + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + + # Qt Binaries + set(QT_BIN_DIRS bearer iconengines imageformats platforms styles translations) + foreach(qt_dir ${QT_BIN_DIRS}) + install(DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/bin/$<CONFIG>/${qt_dir} + DESTINATION ./bin/$<CONFIG> + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + endforeach() + + # Templates + install(DIRECTORY + ${CMAKE_SOURCE_DIR}/Templates + DESTINATION . + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + + # Misc + install(FILES + ${CMAKE_SOURCE_DIR}/ctest_pytest.ini + ${CMAKE_SOURCE_DIR}/LICENSE.txt + ${CMAKE_SOURCE_DIR}/README.md + DESTINATION . + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} + ) + endfunction() -#! ly_install_launcher_target_generator: install source files needed for project launcher generation -function(ly_install_launcher_target_generator) +#! ly_setup_target_generator: install source files needed for project launcher generation +function(ly_setup_target_generator) install(FILES ${CMAKE_SOURCE_DIR}/Code/LauncherUnified/launcher_generator.cmake @@ -266,12 +364,15 @@ function(ly_install_launcher_target_generator) ${CMAKE_SOURCE_DIR}/Code/LauncherUnified/LauncherProject.cpp ${CMAKE_SOURCE_DIR}/Code/LauncherUnified/StaticModules.in DESTINATION LauncherGenerator + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) install(DIRECTORY ${CMAKE_SOURCE_DIR}/Code/LauncherUnified/Platform DESTINATION LauncherGenerator + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) install(FILES ${CMAKE_SOURCE_DIR}/Code/LauncherUnified/FindLauncherGenerator.cmake DESTINATION cmake + COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT} ) -endfunction() \ No newline at end of file +endfunction() diff --git a/cmake/Platform/Linux/PAL_linux.cmake b/cmake/Platform/Linux/PAL_linux.cmake index ba2296bfb9..1d9f02a461 100644 --- a/cmake/Platform/Linux/PAL_linux.cmake +++ b/cmake/Platform/Linux/PAL_linux.cmake @@ -19,6 +19,7 @@ ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS) ly_set(PAL_TRAIT_BUILD_EXCLUDE_ALL_TEST_RUNS_FROM_IDE FALSE) +ly_set(PAL_TRAIT_BUILD_CPACK_SUPPORTED FALSE) # Test library support ly_set(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED TRUE) diff --git a/cmake/Platform/Mac/PAL_mac.cmake b/cmake/Platform/Mac/PAL_mac.cmake index daf3331795..10df4849dd 100644 --- a/cmake/Platform/Mac/PAL_mac.cmake +++ b/cmake/Platform/Mac/PAL_mac.cmake @@ -19,6 +19,7 @@ ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS ".mm") ly_set(PAL_TRAIT_BUILD_EXCLUDE_ALL_TEST_RUNS_FROM_IDE FALSE) +ly_set(PAL_TRAIT_BUILD_CPACK_SUPPORTED FALSE) # Test library support ly_set(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED TRUE) diff --git a/cmake/Platform/Windows/PAL_windows.cmake b/cmake/Platform/Windows/PAL_windows.cmake index 780f3354f7..7493a95bd6 100644 --- a/cmake/Platform/Windows/PAL_windows.cmake +++ b/cmake/Platform/Windows/PAL_windows.cmake @@ -19,6 +19,7 @@ ly_set(PAL_TRAIT_BUILD_SERVER_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS) ly_set(PAL_TRAIT_BUILD_EXCLUDE_ALL_TEST_RUNS_FROM_IDE FALSE) +ly_set(PAL_TRAIT_BUILD_CPACK_SUPPORTED TRUE) # Test library support ly_set(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED TRUE) diff --git a/cmake/Platform/iOS/PAL_ios.cmake b/cmake/Platform/iOS/PAL_ios.cmake index b084a1aac3..a910f6c1be 100644 --- a/cmake/Platform/iOS/PAL_ios.cmake +++ b/cmake/Platform/iOS/PAL_ios.cmake @@ -19,6 +19,7 @@ ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_SUPPORTED TRUE) ly_set(PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS ".mm") ly_set(PAL_TRAIT_BUILD_EXCLUDE_ALL_TEST_RUNS_FROM_IDE TRUE) +ly_set(PAL_TRAIT_BUILD_CPACK_SUPPORTED FALSE) # Test library support ly_set(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED FALSE) diff --git a/cmake/Tools/layout_tool.py b/cmake/Tools/layout_tool.py index f219ab0622..82d10f412f 100755 --- a/cmake/Tools/layout_tool.py +++ b/cmake/Tools/layout_tool.py @@ -312,14 +312,15 @@ def create_link(src:pathlib.Path, tgt:pathlib.Path, copy): tgt = pathlib.Path(tgt) if copy: # Remove the exist target - if tgt.is_symlink(): - tgt.unlink() - else: - def remove_readonly(func, path, _): - "Clear the readonly bit and reattempt the removal" - os.chmod(path, stat.S_IWRITE) - func(path) - shutil.rmtree(tgt, onerror=remove_readonly) + if tgt.exists(): + if tgt.is_symlink(): + tgt.unlink() + else: + def remove_readonly(func, path, _): + "Clear the readonly bit and reattempt the removal" + os.chmod(path, stat.S_IWRITE) + func(path) + shutil.rmtree(tgt, onerror=remove_readonly) logging.debug(f'Copying from {src} to {tgt}') shutil.copytree(str(src), str(tgt), symlinks=False) diff --git a/cmake/cmake_files.cmake b/cmake/cmake_files.cmake index 2b0f65ca99..5045a42cbe 100644 --- a/cmake/cmake_files.cmake +++ b/cmake/cmake_files.cmake @@ -14,6 +14,7 @@ set(FILES 3rdPartyPackages.cmake CommandExecution.cmake Configurations.cmake + CPack.cmake Dependencies.cmake Deployment.cmake EngineFinder.cmake @@ -29,6 +30,7 @@ set(FILES PAL.cmake PALTools.cmake Projects.cmake + run_epbtest.cmake RuntimeDependencies.cmake SettingsRegistry.cmake UnitTest.cmake diff --git a/revision.txt b/revision.txt deleted file mode 100644 index f14620ab23..0000000000 --- a/revision.txt +++ /dev/null @@ -1 +0,0 @@ -Revision Number will be automatically update here from the build promotion system diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 8413456ba2..d2843a9013 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -12,3 +12,4 @@ add_subdirectory(detect_file_changes) add_subdirectory(commit_validation) add_subdirectory(project_manager) +add_subdirectory(ctest) diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 297c406b7b..bb9bd4ff48 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -268,7 +268,7 @@ def CheckoutRepo(boolean disableSubmodules = false) { palRm('commitid') } -def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline, String branchName, String platform, String buildType, String workspace, boolean mount = true, boolean disableSubmodules = false) { +def PreBuildCommonSteps(Map pipelineConfig, String repositoryName, String projectName, String pipeline, String branchName, String platform, String buildType, String workspace, boolean mount = true, boolean disableSubmodules = false) { echo 'Starting pre-build common steps...' if (mount) { @@ -279,10 +279,10 @@ def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline, else pythonCmd = 'python -u ' if(env.RECREATE_VOLUME?.toBoolean()) { - palSh("${pythonCmd} ${INCREMENTAL_BUILD_SCRIPT_PATH} --action delete --project ${projectName} --pipeline ${pipeline} --branch ${branchName} --platform ${platform} --build_type ${buildType}", 'Deleting volume') + palSh("${pythonCmd} ${INCREMENTAL_BUILD_SCRIPT_PATH} --action delete --repository_name ${repositoryName} --project ${projectName} --pipeline ${pipeline} --branch ${branchName} --platform ${platform} --build_type ${buildType}", 'Deleting volume', winSlashReplacement=false) } timeout(5) { - palSh("${pythonCmd} ${INCREMENTAL_BUILD_SCRIPT_PATH} --action mount --project ${projectName} --pipeline ${pipeline} --branch ${branchName} --platform ${platform} --build_type ${buildType}", 'Mounting volume') + palSh("${pythonCmd} ${INCREMENTAL_BUILD_SCRIPT_PATH} --action mount --repository_name ${repositoryName} --project ${projectName} --pipeline ${pipeline} --branch ${branchName} --platform ${platform} --build_type ${buildType}", 'Mounting volume', winSlashReplacement=false) } if(env.IS_UNIX) { @@ -337,14 +337,16 @@ def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline, } def Build(Map options, String platform, String type, String workspace) { - def command = "${options.BUILD_ENTRY_POINT} --platform ${platform} --type ${type}" - dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { - if (env.IS_UNIX) { - sh label: "Running ${platform} ${type}", - script: "${options.PYTHON_DIR}/python.sh -u ${command}" - } else { - bat label: "Running ${platform} ${type}", - script: "${options.PYTHON_DIR}/python.cmd -u ${command}".replace('/','\\') + timeout(time: env.TIMEOUT, unit: 'MINUTES', activity: true) { + def command = "${options.BUILD_ENTRY_POINT} --platform ${platform} --type ${type}" + dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { + if (env.IS_UNIX) { + sh label: "Running ${platform} ${type}", + script: "${options.PYTHON_DIR}/python.sh -u ${command}" + } else { + bat label: "Running ${platform} ${type}", + script: "${options.PYTHON_DIR}/python.cmd -u ${command}".replace('/','\\') + } } } } @@ -360,7 +362,10 @@ def TestMetrics(Map options, String workspace, String branchName, String repoNam userRemoteConfigs: [[url: "${env.MARS_REPO}", name: 'mars', credentialsId: "${env.GITHUB_USER}"]] ] withCredentials([usernamePassword(credentialsId: "${env.SERVICE_USER}", passwordVariable: 'apitoken', usernameVariable: 'username')]) { - def command = "${options.PYTHON_DIR}/python.cmd -u mars/scripts/python/ctest_test_metric_scraper.py -e jenkins.creds.user ${username} -e jenkins.creds.pass ${apitoken} ${cmakeBuildDir} ${branchName} %BUILD_NUMBER% AR ${configuration} ${repoName} " + def command = "${options.PYTHON_DIR}/python.cmd -u mars/scripts/python/ctest_test_metric_scraper.py " + + '-e jenkins.creds.user %username% -e jenkins.creds.pass %apitoken% ' + + "-e jenkins.base_url ${env.JENKINS_URL} " + + "${cmakeBuildDir} ${branchName} %BUILD_NUMBER% AR ${configuration} ${repoName} " bat label: "Publishing ${buildJobName} Test Metrics", script: command } @@ -386,10 +391,10 @@ def PostBuildCommonSteps(String workspace, boolean mount = true) { } } -def CreateSetupStage(Map pipelineConfig, String projectName, String pipelineName, String branchName, String platformName, String jobName, Map environmentVars) { +def CreateSetupStage(Map pipelineConfig, String repositoryName, String projectName, String pipelineName, String branchName, String platformName, String jobName, Map environmentVars) { return { stage("Setup") { - PreBuildCommonSteps(pipelineConfig, projectName, pipelineName, branchName, platformName, jobName, environmentVars['WORKSPACE'], environmentVars['MOUNT_VOLUME']) + PreBuildCommonSteps(pipelineConfig, repositoryName, projectName, pipelineName, branchName, platformName, jobName, environmentVars['WORKSPACE'], environmentVars['MOUNT_VOLUME']) } } } @@ -433,6 +438,9 @@ try { } withEnv(envVarList) { timestamps { + repositoryUrl = scm.getUserRemoteConfigs()[0].getUrl() + // repositoryName is the full repository name + repositoryName = (repositoryUrl =~ /https:\/\/github.com\/(.*)\.git/)[0][1] (projectName, pipelineName) = GetRunningPipelineName(env.JOB_NAME) // env.JOB_NAME is the name of the job given by Jenkins if(env.BRANCH_NAME) { @@ -496,43 +504,41 @@ try { envVars['IS_UNIX'] = 1 } withEnv(GetEnvStringList(envVars)) { - timeout(time: envVars['TIMEOUT'], unit: 'MINUTES', activity: true) { - try { - def build_job_name = build_job.key + try { + def build_job_name = build_job.key - CreateSetupStage(pipelineConfig, projectName, pipelineName, branchName, platform.key, build_job.key, envVars).call() + CreateSetupStage(pipelineConfig, repositoryName, projectName, pipelineName, branchName, platform.key, build_job.key, envVars).call() - if(build_job.value.steps) { //this is a pipe with many steps so create all the build stages - build_job.value.steps.each { build_step -> - build_job_name = build_step - CreateBuildStage(pipelineConfig, platform.key, build_step, envVars).call() - } - } else { - CreateBuildStage(pipelineConfig, platform.key, build_job.key, envVars).call() + if(build_job.value.steps) { //this is a pipe with many steps so create all the build stages + build_job.value.steps.each { build_step -> + build_job_name = build_step + CreateBuildStage(pipelineConfig, platform.key, build_step, envVars).call() } + } else { + CreateBuildStage(pipelineConfig, platform.key, build_job.key, envVars).call() + } - if (env.MARS_REPO && platform.key == 'Windows' && build_job_name.startsWith('test')) { - def output_directory = platform.value.build_types[build_job_name].PARAMETERS.OUTPUT_DIRECTORY - def configuration = platform.value.build_types[build_job_name].PARAMETERS.CONFIGURATION - CreateTestMetricsStage(pipelineConfig, branchName, envVars, build_job_name, output_directory, configuration).call() - } + if (env.MARS_REPO && platform.value.build_types[build_job_name].PARAMETERS.containsKey('TEST_METRICS') && platform.value.build_types[build_job_name].PARAMETERS.TEST_METRICS == 'True') { + def output_directory = platform.value.build_types[build_job_name].PARAMETERS.OUTPUT_DIRECTORY + def configuration = platform.value.build_types[build_job_name].PARAMETERS.CONFIGURATION + CreateTestMetricsStage(pipelineConfig, branchName, envVars, build_job_name, output_directory, configuration).call() } - catch(Exception e) { - // https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Result.java - // {SUCCESS,UNSTABLE,FAILURE,NOT_BUILT,ABORTED} - def currentResult = envVars['ON_FAILURE_MARK'] ?: 'FAILURE' - if (currentResult == 'FAILURE') { - currentBuild.result = 'FAILURE' - error "FAILURE: ${e}" - } else if (currentResult == 'UNSTABLE') { - currentBuild.result = 'UNSTABLE' - unstable(message: "UNSTABLE: ${e}") - } - } - finally { - CreateTeardownStage(envVars).call() + } + catch(Exception e) { + // https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Result.java + // {SUCCESS,UNSTABLE,FAILURE,NOT_BUILT,ABORTED} + def currentResult = envVars['ON_FAILURE_MARK'] ?: 'FAILURE' + if (currentResult == 'FAILURE') { + currentBuild.result = 'FAILURE' + error "FAILURE: ${e}" + } else if (currentResult == 'UNSTABLE') { + currentBuild.result = 'UNSTABLE' + unstable(message: "UNSTABLE: ${e}") } } + finally { + CreateTeardownStage(envVars).call() + } } } } diff --git a/scripts/build/Platform/Android/build_config.json b/scripts/build/Platform/Android/build_config.json index 0fa4d9ade3..07dc363296 100644 --- a/scripts/build/Platform/Android/build_config.json +++ b/scripts/build/Platform/Android/build_config.json @@ -40,6 +40,16 @@ "CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!" } }, + "android_packaging_all": { + "TAGS": [ + "packaging" + ], + "COMMAND": "../Windows/python_windows.cmd", + "PARAMETERS": { + "SCRIPT_PATH": "scripts/build/package/package.py", + "SCRIPT_PARAMETERS": "--platform Android --type all" + } + }, "profile": { "TAGS":[ "weekly-build-metrics", diff --git a/scripts/build/Platform/Mac/asset_mac.sh b/scripts/build/Platform/Mac/asset_mac.sh index 577f7c9b83..5a45a3b0cb 100755 --- a/scripts/build/Platform/Mac/asset_mac.sh +++ b/scripts/build/Platform/Mac/asset_mac.sh @@ -29,4 +29,4 @@ do ${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$project --platforms=$ASSET_PROCESSOR_PLATFORMS done -popd \ No newline at end of file +popd diff --git a/scripts/build/Platform/Windows/build_config.json b/scripts/build/Platform/Windows/build_config.json index 666c0ab5e7..1eb0a73ee0 100644 --- a/scripts/build/Platform/Windows/build_config.json +++ b/scripts/build/Platform/Windows/build_config.json @@ -104,7 +104,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -LE \"(REQUIRES_gpu)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -LE \"(REQUIRES_gpu)\" -T Test", + "TEST_METRICS": "True" } }, "profile_vs2019": { @@ -151,7 +152,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -LE \"(REQUIRES_gpu)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_smoke|SUITE_main)\" -LE \"(REQUIRES_gpu)\" -T Test", + "TEST_METRICS": "True" } }, "test_gpu_profile_vs2019": { @@ -169,7 +171,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_smoke_REQUIRES_gpu|SUITE_main_REQUIRES_gpu)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_smoke_REQUIRES_gpu|SUITE_main_REQUIRES_gpu)\" -T Test", + "TEST_METRICS": "True" } }, "asset_profile_vs2019": { @@ -214,7 +217,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_periodic", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_periodic)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_periodic)\" -T Test", + "TEST_METRICS": "True" } }, "sandbox_test_profile_vs2019": { @@ -233,7 +237,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_sandbox", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_sandbox)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_sandbox)\" -T Test", + "TEST_METRICS": "True" } }, "benchmark_test_profile_vs2019": { @@ -249,7 +254,8 @@ "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "TEST_SUITE_benchmark", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", - "CTEST_OPTIONS": "-L \"(SUITE_benchmark)\" -T Test" + "CTEST_OPTIONS": "-L \"(SUITE_benchmark)\" -T Test", + "TEST_METRICS": "True" } }, "release_vs2019": { @@ -290,7 +296,7 @@ "PARAMETERS": { "CONFIGURATION": "profile", "OUTPUT_DIRECTORY": "build\\windows_vs2019", - "CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DCMAKE_INSTALL_PREFIX=build\\install", + "CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_DISABLE_TEST_MODULES=TRUE -DCMAKE_INSTALL_PREFIX=install", "CMAKE_LY_PROJECTS": "", "CMAKE_TARGET": "INSTALL", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo" diff --git a/scripts/build/bootstrap/incremental_build_util.py b/scripts/build/bootstrap/incremental_build_util.py index 40b4a5cb4f..28bb70955e 100755 --- a/scripts/build/bootstrap/incremental_build_util.py +++ b/scripts/build/bootstrap/incremental_build_util.py @@ -94,7 +94,8 @@ def error(message): def parse_args(): parser = argparse.ArgumentParser() parser.add_argument('-a', '--action', dest="action", help="Action (mount|unmount|delete)") - parser.add_argument('-proj', '--project', dest="project", help="Project") + parser.add_argument('-repository_name', '--repository_name', dest="repository_name", help="Repository name") + parser.add_argument('-project', '--project', dest="project", help="Project") parser.add_argument('-pipe', '--pipeline', dest="pipeline", help="Pipeline") parser.add_argument('-b', '--branch', dest="branch", help="Branch") parser.add_argument('-plat', '--platform', dest="platform", help="Platform") @@ -108,6 +109,8 @@ def parse_args(): error('No action specified') args.action = args.action.lower() if args.action != 'unmount': + if args.repository_name is None: + error('No repository specified') if args.project is None: error('No project specified') if args.pipeline is None: @@ -121,8 +124,8 @@ def parse_args(): return args -def get_mount_name(project, pipeline, branch, platform, build_type): - mount_name = "{}_{}_{}_{}_{}".format(project, pipeline, branch, platform, build_type) +def get_mount_name(repository_name, project, pipeline, branch, platform, build_type): + mount_name = "{}_{}_{}_{}_{}_{}".format(repository_name, project, pipeline, branch, platform, build_type) mount_name = mount_name.replace('/','_').replace('\\','_') return mount_name @@ -174,8 +177,8 @@ def delete_volume(ec2_client, volume_id): response = ec2_client.delete_volume(VolumeId=volume_id) print 'Volume {} deleted'.format(volume_id) -def find_snapshot_id(ec2_client, project, pipeline, platform, build_type, disk_size): - mount_name = get_mount_name(project, pipeline, 'main', platform, build_type) # we take snapshots out of main +def find_snapshot_id(ec2_client, repository_name, project, pipeline, platform, build_type, disk_size): + mount_name = get_mount_name(repository_name, project, pipeline, 'main', platform, build_type) # we take snapshots out of main response = ec2_client.describe_snapshots(Filters= [{ 'Name': 'tag:Name', 'Values': [mount_name] }]) @@ -191,9 +194,9 @@ def find_snapshot_id(ec2_client, project, pipeline, platform, build_type, disk_s snapshot_id = snapshot['SnapshotId'] return snapshot_id -def create_volume(ec2_client, availability_zone, project, pipeline, branch, platform, build_type, disk_size, disk_type): +def create_volume(ec2_client, availability_zone, repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type): # The actual EBS default calculation for IOps is a floating point number, the closest approxmiation is 4x of the disk size for simplicity - mount_name = get_mount_name(project, pipeline, branch, platform, build_type) + mount_name = get_mount_name(repository_name, project, pipeline, branch, platform, build_type) pipeline_and_branch = get_pipeline_and_branch(pipeline, branch) parameters = dict( AvailabilityZone = availability_zone, @@ -202,6 +205,7 @@ def create_volume(ec2_client, availability_zone, project, pipeline, branch, plat 'ResourceType': 'volume', 'Tags': [ { 'Key': 'Name', 'Value': mount_name }, + { 'Key': 'RepositoryName', 'Value': repository_name}, { 'Key': 'Project', 'Value': project }, { 'Key': 'Pipeline', 'Value': pipeline }, { 'Key': 'BranchName', 'Value': branch }, @@ -214,7 +218,7 @@ def create_volume(ec2_client, availability_zone, project, pipeline, branch, plat if 'io1' in disk_type.lower(): parameters['Iops'] = (4 * disk_size) - snapshot_id = find_snapshot_id(ec2_client, project, pipeline, platform, build_type, disk_size) + snapshot_id = find_snapshot_id(ec2_client, repository_name, project, pipeline, platform, build_type, disk_size) if snapshot_id: parameters['SnapshotId'] = snapshot_id created = False @@ -234,8 +238,8 @@ def create_volume(ec2_client, availability_zone, project, pipeline, branch, plat time.sleep(1) response = ec2_client.describe_volumes(VolumeIds=[volume_id, ]) - print("Volume {} created\n\tSnapshot: {}\n\tProject {}\n\tPipeline {}\n\tBranch {}\n\tPlatform: {}\n\tBuild type: {}" - .format(volume_id, snapshot_id, project, pipeline, branch, platform, build_type)) + print("Volume {} created\n\tSnapshot: {}\n\tRepository {}\n\tProject {}\n\tPipeline {}\n\tBranch {}\n\tPlatform: {}\n\tBuild type: {}" + .format(volume_id, snapshot_id, repository_name, project, pipeline, branch, platform, build_type)) return volume_id, created @@ -359,7 +363,7 @@ def attach_ebs_and_create_partition_with_retry(volume, volume_id, ec2_instance_i mount_volume(created) attempt += 1 -def mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_type): +def mount_ebs(repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type): session = boto3.session.Session() region = session.region_name if region is None: @@ -379,7 +383,7 @@ def mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_t unmount_volume() detach_volume(volume, ec2_instance_id, False) # Force unmounts should not be used, as that will cause the EBS block device driver to fail the remount - mount_name = get_mount_name(project, pipeline, branch, platform, build_type) + mount_name = get_mount_name(repository_name, project, pipeline, branch, platform, build_type) response = ec2_client.describe_volumes(Filters=[{ 'Name': 'tag:Name', 'Values': [mount_name] }]) @@ -388,7 +392,7 @@ def mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_t if 'Volumes' in response and not len(response['Volumes']): print 'Volume for {} doesn\'t exist creating it...'.format(mount_name) # volume doesn't exist, create it - volume_id, created = create_volume(ec2_client, ec2_availability_zone, project, pipeline, branch, platform, build_type, disk_size, disk_type) + volume_id, created = create_volume(ec2_client, ec2_availability_zone, repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type) else: volume = response['Volumes'][0] volume_id = volume['VolumeId'] @@ -396,7 +400,7 @@ def mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_t if (volume['Size'] != disk_size or volume['VolumeType'] != disk_type): print 'Override disk attributes does not match the existing volume, deleting {} and replacing the volume'.format(volume_id) delete_volume(ec2_client, volume_id) - volume_id, created = create_volume(ec2_client, ec2_availability_zone, project, pipeline, branch, platform, build_type, disk_size, disk_type) + volume_id, created = create_volume(ec2_client, ec2_availability_zone, repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type) if len(volume['Attachments']): # this is bad we shouldn't be attached, we should have detached at the end of a build attachment = volume['Attachments'][0] @@ -426,7 +430,7 @@ def mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_t print 'Error: EBS disk size reached to the allowed maximum disk size {}MB, please contact ly-infra@ and ly-build@ to investigate.'.format(MAX_EBS_DISK_SIZE) exit(1) print 'Recreating the EBS with disk size {}'.format(new_disk_size) - volume_id, created = create_volume(ec2_client, ec2_availability_zone, project, pipeline, branch, platform, build_type, new_disk_size, disk_type) + volume_id, created = create_volume(ec2_client, ec2_availability_zone, repository_name, project, pipeline, branch, platform, build_type, new_disk_size, disk_type) volume = ec2_resource.Volume(volume_id) attach_ebs_and_create_partition_with_retry(volume, volume_id, ec2_instance_id, created) @@ -458,7 +462,7 @@ def unmount_ebs(): unmount_volume() detach_volume(volume, ec2_instance_id, False) -def delete_ebs(project, pipeline, branch, platform, build_type): +def delete_ebs(repository_name, project, pipeline, branch, platform, build_type): unmount_ebs() session = boto3.session.Session() @@ -470,7 +474,7 @@ def delete_ebs(project, pipeline, branch, platform, build_type): ec2_resource = boto3.resource('ec2', region_name=region) ec2_instance = ec2_resource.Instance(ec2_instance_id) - mount_name = get_mount_name(project, pipeline, branch, platform, build_type) + mount_name = get_mount_name(repository_name, project, pipeline, branch, platform, build_type) response = ec2_client.describe_volumes(Filters=[ { 'Name': 'tag:Name', 'Values': [mount_name] } ]) @@ -481,15 +485,15 @@ def delete_ebs(project, pipeline, branch, platform, build_type): delete_volume(ec2_client, volume_id) -def main(action, project, pipeline, branch, platform, build_type, disk_size, disk_type): +def main(action, repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type): if action == 'mount': - mount_ebs(project, pipeline, branch, platform, build_type, disk_size, disk_type) + mount_ebs(repository_name, project, pipeline, branch, platform, build_type, disk_size, disk_type) elif action == 'unmount': unmount_ebs() elif action == 'delete': - delete_ebs(project, pipeline, branch, platform, build_type) + delete_ebs(repository_name, project, pipeline, branch, platform, build_type) if __name__ == "__main__": args = parse_args() - ret = main(args.action, args.project, args.pipeline, args.branch, args.platform, args.build_type, args.disk_size, args.disk_type) + ret = main(args.action, args.repository_name, args.project, args.pipeline, args.branch, args.platform, args.build_type, args.disk_size, args.disk_type) sys.exit(ret) \ No newline at end of file diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-awscli.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-awscli.sh old mode 100644 new mode 100755 diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh deleted file mode 100644 index 90786a675a..0000000000 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-libraries.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash - -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# This script must be run as root -if [[ $EUID -ne 0 ]] -then - echo "This script must be run as root (sudo)" - exit 1 -fi - -# -# Make sure we are installing on a supported ubuntu distro -# -lsb_release -c >/dev/null 2>&1 -if [ $? -ne 0 ] -then - echo This script is only supported on Ubuntu Distros - exit 1 -fi - -UBUNTU_DISTRO="`lsb_release -c | awk '{print $2}'`" -if [ "$UBUNTU_DISTRO" == "bionic" ] -then - echo "Setup for Ubuntu 18.04 LTS ($UBUNTU_DISTRO)" -elif [ "$UBUNTU_DISTRO" == "focal" ] -then - echo "Setup for Ubuntu 20.04 LTS ($UBUNTU_DISTRO)" -else - echo "Unsupported version of Ubuntu $UBUNTU_DISTRO" - exit 1 -fi - -# -# Install curl if its not installed -# -curl --version >/dev/null 2>&1 -if [ $? -ne 0 ] -then - echo "Installing curl" - apt-get install curl -y -fi - - -# -# If the linux distro is 20.04 (focal), we need libffi.so.6, which is not part of the focal distro. We -# will install it from the bionic distro manually into focal. This is needed since Ubuntu 20.04 supports -# python 3.8 out of the box, but we are using 3.7 -# -LIBFFI6_COUNT=`apt list --installed 2>/dev/null | grep libffi6 | wc -l` -if [ "$UBUNTU_DISTRO" == "focal" ] && [ $LIBFFI6_COUNT -eq 0 ] -then - echo "Installing libffi for Ubuntu 20.04" - - pushd /tmp >/dev/null - - LIBFFI_PACKAGE_NAME=libffi6_3.2.1-8_amd64.deb - LIBFFI_PACKAGE_URL=http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/ - - curl --location $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME -o $LIBFFI_PACKAGE_NAME - if [ $? -ne 0 ] - then - echo Unable to download $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME - popd - exit 1 - fi - - apt install ./$LIBFFI_PACKAGE_NAME -y - if [ $? -ne 0 ] - then - echo Unable to install $LIBFFI_PACKAGE_NAME - rm -f ./$LIBFFI_PACKAGE_NAME - popd - exit 1 - fi - - rm -f ./$LIBFFI_PACKAGE_NAME - popd - echo "libffi.so.6 installed" -fi - -# Install the required build packages -apt-get install clang-6.0 -y # For the compiler and its dependencies -apt-get install libglu1-mesa-dev -y # For Qt (GL dependency) - -# The following packages resolves a runtime error with Qt Plugins -apt-get install libxcb-xinerama0 -y # For Qt plugins at runtime -apt-get install libxcb-xinput0 -y # For Qt plugins at runtime - -apt-get install libcurl4-openssl-dev -y # For HttpRequestor -apt-get install libsdl2-dev -y # For WWise - -apt-get install libz-dev -y -apt-get install mesa-common-dev -y - -echo Build Libraries Setup Complete diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh old mode 100644 new mode 100755 index 36832bb9ac..fd7b59592a --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh @@ -39,36 +39,124 @@ else fi # -# Always install the latest version of cmake (from kitware) +# Install curl if its not installed # -echo Installing CMake package $CMAKE_DISTRO_VERSION - -# Remove any pre-existing version of cmake -apt purge --auto-remove cmake -y -wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null -CMAKE_DEB_REPO="'deb https://apt.kitware.com/ubuntu/ $UBUNTU_DISTRO main'" - -# Add the appropriate kitware repository to apt -if [ "$UBUNTU_DISTRO" == "bionic" ] +curl --version >/dev/null 2>&1 +if [ $? -ne 0 ] then - CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu20.04.1 - apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' -elif [ "$UBUNTU_DISTRO" == "focal" ] -then - CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu18.04.1 - apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' + echo "Installing curl" + apt-get install curl -y fi -apt-get update -# Install cmake -apt-get install cmake $CMAKE_DISTRO_VERSION -y +# +# If the linux distro is 20.04 (focal), we need libffi.so.6, which is not part of the focal distro. We +# will install it from the bionic distro manually into focal. This is needed since Ubuntu 20.04 supports +# python 3.8 out of the box, but we are using 3.7 +# +LIBFFI6_COUNT=`apt list --installed 2>/dev/null | grep libffi6 | wc -l` +if [ "$UBUNTU_DISTRO" == "focal" ] && [ $LIBFFI6_COUNT -eq 0 ] +then + echo "Installing libffi for Ubuntu 20.04" + + pushd /tmp >/dev/null + + LIBFFI_PACKAGE_NAME=libffi6_3.2.1-8_amd64.deb + LIBFFI_PACKAGE_URL=http://mirrors.kernel.org/ubuntu/pool/main/libf/libffi/ + + curl --location $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME -o $LIBFFI_PACKAGE_NAME + if [ $? -ne 0 ] + then + echo Unable to download $LIBFFI_PACKAGE_URL/$LIBFFI_PACKAGE_NAME + popd + exit 1 + fi + + apt install ./$LIBFFI_PACKAGE_NAME -y + if [ $? -ne 0 ] + then + echo Unable to install $LIBFFI_PACKAGE_NAME + rm -f ./$LIBFFI_PACKAGE_NAME + popd + exit 1 + fi + + rm -f ./$LIBFFI_PACKAGE_NAME + popd + echo "libffi.so.6 installed" +fi # -# Make sure that Ninja is installed +# Add the kitware repository for cmake if necessary # -echo Installing Ninja -apt-get install ninja-build -y + +KITWARE_REPO_COUNT=`cat /etc/apt/sources.list | grep ^deb | grep https://apt.kitware.com/ubuntu/ | wc -l` + +if [ $KITWARE_REPO_COUNT -eq 0 ] +then + echo Adding Kitware Repository for the cmake + + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null + CMAKE_DEB_REPO="'deb https://apt.kitware.com/ubuntu/ $UBUNTU_DISTRO main'" + + # Add the appropriate kitware repository to apt + if [ "$UBUNTU_DISTRO" == "bionic" ] + then + CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu18.04.1 + apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' + elif [ "$UBUNTU_DISTRO" == "focal" ] + then + CMAKE_DISTRO_VERSION=3.20.1-0kitware1ubuntu20.04.1 + apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' + fi + apt-get update +else + echo Kitware Repository repo already set +fi -echo Build Tools Setup Complete +# Read from the package list and process each package +PACKAGE_FILE_LIST=package-list.ubuntu-$UBUNTU_DISTRO.txt + +echo Reading package list $PACKAGE_FILE_LIST + +# Read each line (strip out comment tags) +for LINE in `cat $PACKAGE_FILE_LIST | sed 's/#.*$//g'` +do + PACKAGE=`echo $LINE | awk -F / '{print $1}'` + if [ "$PACKAGE" != "" ] # Skip blank lines + then + PACKAGE_VER=`echo $LINE | awk -F / '{print $2}'` + if [ "$PACKAGE_VER" == "" ] + then + # Process non-versioned packages + INSTALLED_COUNT=`apt list --installed 2>/dev/null | grep ^$PACKAGE/ | wc -l` + if [ $INSTALLED_COUNT -eq 0 ] + then + echo Installing $PACKAGE + apt-get install $PACKAGE -y + else + INSTALLED_VERSION=`apt list --installed 2>/dev/null | grep ^$PACKAGE/ | awk '{print $2}'` + echo $PACKAGE already installed \(version $INSTALLED_VERSION\) + fi + else + # Process versioned packages + INSTALLED_COUNT=`apt list --installed 2>/dev/null | grep ^$PACKAGE/ | wc -l` + if [ $INSTALLED_COUNT -eq 0 ] + then + echo Installing $PACKAGE \( $PACKAGE_VER \) + apt-get install $PACKAGE=$PACKAGE_VER -y + else + INSTALLED_VERSION=`apt list --installed 2>/dev/null | grep ^$PACKAGE/ | awk '{print $2}'` + if [ "$INSTALLED_VERSION" != "$PACKAGE_VER" ] + then + echo $PACKAGE already installed but with the wrong version. Purging the package + apt purge --auto-remove $PACKAGE -y + fi + echo $PACKAGE already installed \(version $INSTALLED_VERSION\) + fi + fi + fi + +done + diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-git.sh old mode 100644 new mode 100755 diff --git a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt new file mode 100644 index 0000000000..201e4e8424 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt @@ -0,0 +1,17 @@ +# Package list for Ubuntu 18.04 + +# Build Tools Packages +cmake/3.20.1-0kitware1ubuntu18.04.1 # For cmake +clang-6.0 # For Ninja Build System +ninja-build # For the compiler and its dependencies + +# Build Libraries +libglu1-mesa-dev # For Qt (GL dependency) +libxcb-xinerama0 # For Qt plugins at runtime +libxcb-xinput0 # For Qt plugins at runtime +libcurl4-openssl-dev # For HttpRequestor +libsdl2-dev # for WWise/Audio +zlib1g-dev +mesa-common-dev + + diff --git a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt new file mode 100644 index 0000000000..13b6376911 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt @@ -0,0 +1,17 @@ +# Package list for Ubuntu 20.04 + +# Build Tools Packages +cmake/3.20.1-0kitware1ubuntu20.04.1 # For cmake +clang-6.0 # For Ninja Build System +ninja-build # For the compiler and its dependencies + +# Build Libraries +libglu1-mesa-dev # For Qt (GL dependency) +libxcb-xinerama0 # For Qt plugins at runtime +libxcb-xinput0 # For Qt plugins at runtime +libcurl4-openssl-dev # For HttpRequestor +libsdl2-dev # for WWise/Audio +zlib1g-dev +mesa-common-dev + + diff --git a/scripts/build/lambda/auto_delete_ebs.py b/scripts/build/lambda/delete_branch_ebs.py old mode 100755 new mode 100644 similarity index 69% rename from scripts/build/lambda/auto_delete_ebs.py rename to scripts/build/lambda/delete_branch_ebs.py index a004c2a575..8b8100f04e --- a/scripts/build/lambda/auto_delete_ebs.py +++ b/scripts/build/lambda/delete_branch_ebs.py @@ -14,20 +14,31 @@ import time import logging TIMEOUT = 300 +log = logging.getLogger(__name__) +log.setLevel(logging.INFO) -def lambda_handler(event, context): - log = logging.getLogger(__name__) - log.setLevel(logging.INFO) - branch_name = event['detail']['referenceName'] +def delete_ebs_volumes(repository_name, branch_name): + """ + Delete all EBS volumes that are tagged with repository_name and branch_name + :param repository_name: Full repository name. + :param branch_name: Branch name that is deleted. + :return: Number of EBS volumes that are deleted successfully, number of EBS volumes that are not deleted. + """ + success = 0 + failure = 0 ec2_client = boto3.resource('ec2') response = ec2_client.volumes.filter(Filters=[ + { + 'Name': 'tag:RepositoryName', + 'Values': [repository_name] + }, { 'Name': 'tag:BranchName', 'Values': [branch_name] } ]) - log.info(f'Deleting EBS volumes for remote-branch {branch_name}.') + log.info(f'Deleting EBS volumes for remote-branch {branch_name} in repository {repository_name}.') for volume in response: if volume.attachments: ec2_instance_id = volume.attachments[0]['InstanceId'] @@ -49,9 +60,19 @@ def lambda_handler(event, context): try: log.info(f'Deleting volume {volume.volume_id}') volume.delete() + success += 1 except Exception as e: log.error(f'Failed to delete volume {volume.volume_id}.') log.error(e) + failure += 1 + return success, failure -lambda_handler(event, context) \ No newline at end of file +def lambda_handler(event, context): + repository_name = event['repository_name'] + branch_name = event['branch_name'] + (success, failure) = delete_ebs_volumes(repository_name, branch_name) + return { + 'success': success, + 'failure': failure + } diff --git a/scripts/build/lambda/delete_github_branch_ebs.py b/scripts/build/lambda/delete_github_branch_ebs.py new file mode 100644 index 0000000000..8163cee762 --- /dev/null +++ b/scripts/build/lambda/delete_github_branch_ebs.py @@ -0,0 +1,106 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import os +import boto3 +import json +import hmac +import hashlib + + +def delete_volumes(repository_name, branch_name): + """ + Trigger lambda function that deletes EBS volumes. + :param repository_name: Full repository name. + :param branch_name: Branch name that is deleted. + :return: Number of EBS volumes that are deleted successfully, number of EBS volumes that are not deleted. + """ + client = boto3.client('lambda') + payload = { + 'repository_name': repository_name, + 'branch_name': branch_name + } + response = client.invoke( + FunctionName='delete_branch_ebs', + Payload=json.dumps(payload), + ) + status = response['Payload'].read() + response_json = json.loads(status.decode()) + return response_json['success'], response_json['failure'] + + +def verify_signature(headers, payload): + """ + Validate POST request headers and payload to only receive the expected GitHub webhook requests. + :param headers: Headers from POST request. + :param payload: Payload from POST request. + :return: True if request is verified, otherwise, return False. + """ + # secret is stored in AWS Secret Manager + secret_name = os.environ.get('GITHUB_WEBHOOK_SECRET_NAME', '') + client = boto3.client(service_name='secretsmanager') + response = client.get_secret_value(SecretId=secret_name) + secret = response['SecretString'] + # Using X-Hub-Signature-256 is recommended by https://docs.github.com/en/developers/webhooks-and-events/securing-your-webhooks + signature = headers.get('X-Hub-Signature-256', '') + computed_hash = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() + computed_signature = f'sha256={computed_hash}' + return hmac.compare_digest(computed_signature.encode(), signature.encode()) + + +def create_response(status, success=0, failure=0, repository_name=None, branch_name=None): + """ + :param status: Status of EBS deletion request. + :param success: Number of EBS volumes that are deleted successfully. + :param failure: Number of EBS volumes that are not deleted. + :param repository_name: Full repository name. + :param branch_name: Branch name that is deleted. + :return: JSON response. + """ + response = { + 'success': { + 'statusCode': 200, + 'body': f'[SUCCESS] All {success + failure} EBS volumes are deleted for branch {branch_name} in repository {repository_name}', + 'isBase64Encoded': 'false' + }, + 'failure': { + 'statusCode': 500, + 'body': f'[FAILURE] Failed to delete {failure}/{success + failure} EBS volumes for branch {branch_name} in repository {repository_name}', + 'isBase64Encoded': 'false' + }, + 'unauthorized': { + 'statusCode': 401, + 'body': 'Unauthorized', + 'isBase64Encoded': 'false' + } + } + return response[status] + + +def lambda_handler(event, context): + # This function is triggered by AWS API Gateway, + if event.get('resource', '') == '/delete-github-branch-ebs': + headers = event['headers'] + payload = event['body'] + if headers['X-GitHub-Event'] == 'delete': + # Validate github webhook request here since request body cannot be passed to API Gateway lambda authorizer. + if verify_signature(headers, payload): + # Convert payload from string type to json to get repository name and branch name + payload = json.loads(payload) + repository_name = payload['repository']['full_name'] + branch_name = payload['ref'] + (success, failure) = delete_volumes(repository_name, branch_name) + if not failure: + return create_response('success', success, failure, repository_name, branch_name) + else: + return create_response('failure', success, failure, repository_name, branch_name) + else: + return create_response('unauthorized') diff --git a/scripts/build/package/Platform/3rdParty/package_filelists/3rdParty.json b/scripts/build/package/Platform/3rdParty/package_filelists/3rdParty.json index 26733303a6..a9ed45daca 100644 --- a/scripts/build/package/Platform/3rdParty/package_filelists/3rdParty.json +++ b/scripts/build/package/Platform/3rdParty/package_filelists/3rdParty.json @@ -2,8 +2,6 @@ "@3rdParty": { "3rdParty.txt": "#include", "AWS/AWSNativeSDK/1.7.167-az.2/**": "#include", - "AWS/GameLift/3.4.0/**": "#include", - "civetweb/civetweb-20160922-az.2/**": "#include", "CMake/3.19.1/**": "#include", "DirectXShaderCompiler/1.0.1-az.1/**": "#include", "DirectXShaderCompiler/2020.08.07/**": "#include", @@ -12,7 +10,6 @@ "etc2comp/2017_04_24-az.2/**": "#include", "expat/2.1.0-pkg.3/**": "#include", "FbxSdk/2016.1.2-az.1/**": "#include", - "libav/11.7/**": "#include", "OpenSSL/1.1.1b-noasm-az/**": "#include", "Qt/5.15.1.2-az/**": "#include", "RadTelemetry/3.5.0.17/**": "#include", diff --git a/scripts/build/package/Platform/Android/package_env.json b/scripts/build/package/Platform/Android/package_env.json new file mode 100644 index 0000000000..017937413a --- /dev/null +++ b/scripts/build/package/Platform/Android/package_env.json @@ -0,0 +1,25 @@ +{ + "local_env": { + "S3_PREFIX": "${BRANCH_NAME}/Android" + }, + "types":{ + "all":{ + "PACKAGE_TARGETS":[ + { + "FILE_LIST": "all.json", + "FILE_LIST_TYPE": "All", + "PACKAGE_NAME": "${PACKAGE_NAME_PATTERN}-android-all-${BUILD_NUMBER}.zip" + } + ], + "BOOTSTRAP_CFG_GAME_FOLDER":"AutomatedTesting", + "SKIP_BUILD": 0, + "BUILD_TARGETS":[ + { + "BUILD_CONFIG_FILENAME": "build_config.json", + "PLATFORM": "Android", + "TYPE": "profile" + } + ] + } + } +} diff --git a/scripts/build/package/Platform/Windows/package_filelists/3rdParty.json b/scripts/build/package/Platform/Windows/package_filelists/3rdParty.json index c43e11cdf1..d9e5d85090 100644 --- a/scripts/build/package/Platform/Windows/package_filelists/3rdParty.json +++ b/scripts/build/package/Platform/Windows/package_filelists/3rdParty.json @@ -17,18 +17,6 @@ "bin/linux/**":"#include", "lib/linux/**":"#include" }, - "AWS/GameLift/3.4.0":{ - "*":"#include", - "include/**":"#include", - "bin/windows/**":"#include", - "lib/linux/libstdcxx/**":"#include" - }, - "civetweb/civetweb-20160922-az.2":{ - "src/**":"#include", - "include/**":"#include", - "lib/Windows/**":"#include", - "*":"#include" - }, "DirectXShaderCompiler/1.0.1-az.1":{ "*":"#include", "src/**":"#include", diff --git a/scripts/build/package/Platform/Windows/package_filelists/atom.json b/scripts/build/package/Platform/Windows/package_filelists/atom.json index a416e0f0c6..885eff8504 100644 --- a/scripts/build/package/Platform/Windows/package_filelists/atom.json +++ b/scripts/build/package/Platform/Windows/package_filelists/atom.json @@ -151,7 +151,6 @@ "3dsmax/**": "#include", "7za.exe": "#include", "7za_legal_notice.txt": "#include", - "Crashpad/**": "#include", "CrySCompileServer/**": "#include", "PakShaders/**": "#include", "Python/**": "#include", diff --git a/scripts/build/package/package_filelists/symbols.json b/scripts/build/package/package_filelists/symbols.json index b5668db8c9..3f30f6ec1f 100644 --- a/scripts/build/package/package_filelists/symbols.json +++ b/scripts/build/package/package_filelists/symbols.json @@ -1,6 +1,5 @@ { "@lyengine": { - "**/*.pdb": "#include", - "Tools/Crashpad/**": "#exclude" + "**/*.pdb": "#include" } } \ No newline at end of file diff --git a/scripts/build/tools/sync_repo.py b/scripts/build/tools/sync_repo.py new file mode 100644 index 0000000000..0275cc6661 --- /dev/null +++ b/scripts/build/tools/sync_repo.py @@ -0,0 +1,153 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import argparse +import boto3 +import logging +import os +import subprocess +import sys + +from botocore.exceptions import ClientError +from urllib.parse import urlparse, urlunparse + +log = logging.getLogger(__name__) +log.setLevel(logging.INFO) + +DEFAULT_BRANCH = "main" +DEFAULT_WORKSPACE_ROOT = "." + + +class MergeError(Exception): + pass + + +class SyncRepo: + """A git repo with configured remotes to sync with GitHub. + + Used by the sync pipeline to push branches to GitHub and pull down latest from main. Changes flow from + the upstream remote down to origin. Remotes can be swapped to pull changes in the other direction. + + Attributes: + origin: URL for the origin repo. This is the target for the sync. + upstream: URL for the upstream repo. This is the source with the latest changes. + workspace_root: Path to the parent directory for the local workspace. + parameter: Name of the parameter used to store GitHub credentials. + + """ + + def __init__(self, origin, upstream, workspace_root, region=None, parameter=None): + self.workspace_root = workspace_root + self.parameter = parameter + self.region = region + + if self.parameter and self.region: + log.info(f"Adding credentials from {self.parameter} in {self.region}") + self.origin = self._add_credentials(origin) + self.upstream = self._add_credentials(upstream) + else: + self.origin = origin + self.upstream = upstream + + self.origin_name = self.origin.split("/")[-1] + self.upstream_name = self.upstream.split("/")[-1] + self.workspace = os.path.join(workspace_root, self.origin_name) + + def _add_credentials(self, url): + """Add credentials to a github repo URL from parameter store.""" + parsed_url = urlparse(url) + if parsed_url.netloc == "github.com": + try: + ssm = boto3.client("ssm", self.region) + credentials = ssm.get_parameter( + Name=self.parameter, + WithDecryption=True + )["Parameter"]["Value"] + url = urlunparse(parsed_url._replace(netloc=f"{credentials}@github.com")) + except ClientError as e: + log.error(f"Error retrieving credentials from parameter store: {e}") + return url + + def clone(self): + """Clones repo to the instance workspace. Refreshes remote configs for existing repos.""" + if not os.path.exists(self.workspace): + os.mkdir(self.workspace) + + if subprocess.run(["git", "rev-parse", "--is-inside-work-tree"], cwd=self.workspace).returncode != 0: + log.info(f"Cloning repo {self.origin} to {self.workspace}.") + subprocess.run(["git", "clone", self.origin, self.origin_name], cwd=self.workspace_root, check=True) + subprocess.run(["git", "remote", "add", "upstream", self.upstream], cwd=self.workspace) + else: + log.info("Update remote config for existing repos.") + subprocess.run(["git", "remote", "set-url", "origin", self.origin], cwd=self.workspace) + subprocess.run(["git", "remote", "set-url", "upstream", self.upstream], cwd=self.workspace) + + def sync(self, branch): + """Fetches latest from upstream and syncs changes to origin. + + Syncs are one-way and conflicts are not expected. Fast-forward merges are performed if possible. If a + fast-forward merge is not possible, a merge will not be attempted and will raise an exception. + + The checkout command will create a new branch from upstream/<branch> if it does not exist in origin. The + remote will be remapped to origin during the push. + + Args: + branch: Name of the upstream branch to sync with origin. + + Raises: + MergeError: An error occured when attempting to merge to the target branch. + + """ + subprocess.run(["git", "fetch", "origin"], cwd=self.workspace, check=True) + subprocess.run(["git", "fetch", "upstream"], cwd=self.workspace, check=True) + subprocess.run(["git", "checkout", branch], cwd=self.workspace, check=True) + + # If the branch exists in origin, merge from upstream. New branches do not require a merge. + if subprocess.run(["git", "ls-remote", "--exit-code", "-h", "origin", branch], cwd=self.workspace).returncode == 0: + subprocess.run(["git", "reset", "--hard", "HEAD"], cwd=self.workspace, check=True) + subprocess.run(["git", "pull"], cwd=self.workspace, check=True) + + if subprocess.run(["git", "merge", "--ff-only", f"upstream/{branch}"], cwd=self.workspace).returncode != 0: + raise MergeError(f"Unable to perform ff merge to target branch: {self.origin}/{branch} Intervention required.") + + subprocess.run(["git", "push", "-u", "origin", branch], cwd=self.workspace, check=True) + + +def process_args(): + """Process arguements. + + Example: + sync_repo.py <upstream> <origin> [Options] + + """ + parser = argparse.ArgumentParser() + parser.add_argument("upstream") + parser.add_argument("origin") + parser.add_argument("-b", "--branch", default=DEFAULT_BRANCH) + parser.add_argument("-w", "--workspace-root", default=DEFAULT_WORKSPACE_ROOT) + parser.add_argument("-r", "--region", default=None) + parser.add_argument("-p", "--parameter", default=None) + return parser.parse_args() + + +def main(): + args = process_args() + + repo = SyncRepo(args.origin, args.upstream, args.workspace_root, args.region, args.parameter) + repo.clone() + try: + repo.sync(args.branch) + except MergeError as e: + log.error(e) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/commit_validation/commit_validation/commit_validation.py b/scripts/commit_validation/commit_validation/commit_validation.py index f3706a0edc..95e75decae 100755 --- a/scripts/commit_validation/commit_validation/commit_validation.py +++ b/scripts/commit_validation/commit_validation/commit_validation.py @@ -186,7 +186,6 @@ EXCLUDED_VALIDATION_PATTERNS = [ 'python/runtime', 'restricted/*/Tools/*RemoteControl', 'Tools/3dsmax', - 'Tools/Crashpad', '*/user/Cache/*', '*/user/log/*', ] diff --git a/ctest_scripts/CMakeLists.txt b/scripts/ctest/CMakeLists.txt similarity index 85% rename from ctest_scripts/CMakeLists.txt rename to scripts/ctest/CMakeLists.txt index e1979dba6e..f9824889e3 100644 --- a/ctest_scripts/CMakeLists.txt +++ b/scripts/ctest/CMakeLists.txt @@ -64,6 +64,19 @@ foreach(suite_name ${LY_TEST_GLOBAL_KNOWN_SUITE_NAMES}) ) endforeach() +# EPB Sanity test is being registered here to validate that the ly_add_editor_python_test function works. +#if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedTesting IN_LIST LY_PROJECTS_TARGET_NAME) +# ly_add_editor_python_test( +# NAME epb_sanity_smoke_no_gpu +# TEST_PROJECT AutomatedTesting +# PATH ${CMAKE_CURRENT_LIST_DIR}/epb_sanity_test.py +# TEST_SUITE smoke +# TEST_SERIAL TRUE +# RUNTIME_DEPENDENCIES +# AutomatedTesting.Assets +# ) +#endif() + # add a custom test which makes sure that the test filtering works! ly_add_test( diff --git a/ctest_scripts/ctest_driver.py b/scripts/ctest/ctest_driver.py similarity index 100% rename from ctest_scripts/ctest_driver.py rename to scripts/ctest/ctest_driver.py diff --git a/ctest_scripts/ctest_driver_test.py b/scripts/ctest/ctest_driver_test.py similarity index 100% rename from ctest_scripts/ctest_driver_test.py rename to scripts/ctest/ctest_driver_test.py diff --git a/ctest_scripts/ctest_entrypoint.cmd b/scripts/ctest/ctest_entrypoint.cmd similarity index 97% rename from ctest_scripts/ctest_entrypoint.cmd rename to scripts/ctest/ctest_entrypoint.cmd index 585c1223f5..cbdbcc76ef 100644 --- a/ctest_scripts/ctest_entrypoint.cmd +++ b/scripts/ctest/ctest_entrypoint.cmd @@ -13,7 +13,7 @@ REM Continuous Integration CLI entrypoint script to start CTest, triggering post REM SETLOCAL -SET DEV_DIR=%~dp0\.. +SET DEV_DIR=%~dp0\..\.. SET PYTHON=%DEV_DIR%\python\python.cmd SET CTEST_SCRIPT=%~dp0\ctest_driver.py diff --git a/ctest_scripts/ctest_entrypoint.sh b/scripts/ctest/ctest_entrypoint.sh similarity index 100% rename from ctest_scripts/ctest_entrypoint.sh rename to scripts/ctest/ctest_entrypoint.sh diff --git a/ctest_scripts/epb_sanity_test.py b/scripts/ctest/epb_sanity_test.py similarity index 100% rename from ctest_scripts/epb_sanity_test.py rename to scripts/ctest/epb_sanity_test.py diff --git a/scripts/ctest/result_processing/__init__.py b/scripts/ctest/result_processing/__init__.py new file mode 100755 index 0000000000..79f8fa4422 --- /dev/null +++ b/scripts/ctest/result_processing/__init__.py @@ -0,0 +1,10 @@ +""" +All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +its licensors. + +For complete copyright and license terms please see the LICENSE at the root of this +distribution (the "License"). All use of this software is governed by the License, +or, if provided, by the license below or the license accompanying this file. Do not +remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +""" diff --git a/ctest_scripts/result_processing/result_processing.py b/scripts/ctest/result_processing/result_processing.py similarity index 100% rename from ctest_scripts/result_processing/result_processing.py rename to scripts/ctest/result_processing/result_processing.py diff --git a/ctest_scripts/sanity_test.py b/scripts/ctest/sanity_test.py similarity index 100% rename from ctest_scripts/sanity_test.py rename to scripts/ctest/sanity_test.py